ESP32 Tutorial 30/55 - Control Servo Over the web using MQTT using Adafruit IO Service | SunFounder's ESP32 IoT Leaning kit

ESP32 Tutorial 30/55 - Control Servo Over the web using MQTT using Adafruit IO Service | SunFounder's ESP32 IoT Leaning kit

In this tutorial, we will learn how to control the position of a servo motor using the ESP32 microcontroller and MQTT protocol over the web. By leveraging the Adafruit IO service, you will be able to position the servo at various angles such as 0°, 90°, or 180° remotely. This project demonstrates the capabilities of the ESP32, which includes built-in Wi-Fi and Bluetooth, making it a powerful tool for IoT applications.

ESP32-30_MQTT_diagram-0

In this project, we will set up an MQTT broker using Adafruit IO, create a dashboard to control the servo, and connect the ESP32 to it. The servo position will be adjustable via a slider on the dashboard, allowing for real-time control from any internet-enabled device (in video at 5:30).

Hardware Explained

The primary components of this project include the ESP32 microcontroller and the servo motor. The ESP32 is a versatile microcontroller with integrated Wi-Fi and Bluetooth capabilities, making it ideal for IoT applications. It communicates with the Adafruit IO service using the MQTT protocol, which is lightweight and efficient for transmitting messages over the internet.

The servo motor is a rotary actuator that allows for precise control of angular position. It operates by receiving a pulse-width modulation (PWM) signal that dictates its position. In this project, we will connect the servo to one of the digital pins on the ESP32, allowing us to control its angle remotely.

Datasheet Details

Manufacturer Parallax
Part number SG90
Logic/IO voltage 3.3 V - 5 V
Supply voltage 4.8 V - 6.0 V
Output current (per channel) 1 A max
PWM frequency guidance 50 Hz
Input logic thresholds 0.3 V - 0.7 V
Voltage drop / RDS(on) / saturation 0.2 V max
Thermal limits Operating temperature: -10°C to 60°C
Package Plastic case
Notes / variants Mini servo, 180° rotation

 

  • Ensure proper voltage supply to the servo (4.8 V - 6.0 V).
  • Use a common ground between the ESP32 and servo.
  • Monitor the PWM signal to avoid exceeding the servo's limits.
  • Securely connect the servo to avoid disconnections during operation.
  • Update the Adafruit MQTT library to ensure compatibility.

MQTT Diagrams

ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram
ESP32-28_dht_temperature-sensor-main

Wiring Instructions

ESP32-17-Sevo_motor-wiring

To wire the servo motor to the ESP32, start by connecting the ground wire of the servo to the ground pin on the ESP32. Next, connect the power wire (usually red) of the servo to the 5V pin on the ESP32. Finally, connect the signal wire (often yellow or white) to digital pin 25 on the ESP32. Ensure that the connections are secure to prevent any disconnections during operation.

If you are using a battery to power the ESP32, make sure that the battery voltage is within the acceptable range for both the ESP32 and the servo. Additionally, double-check that the wiring matches the pin definitions used in your code to avoid any issues (in video at 12:45).

Code Examples & Walkthrough

In the provided code, we first include the necessary libraries for the ESP32 and MQTT. We define the servo object and specify the pin it is connected to with const int servoPin = 25;. The default angle is also set with const int defaultServoAngle = 90;, which will be the initial position when the ESP32 boots up.


Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;

This snippet initializes the servo on pin 25 and sets its default angle to 90°. The variable servoAngle will be updated based on the messages received from the MQTT broker.

In the setup() function, we connect to Wi-Fi and set up the MQTT client. The credentials for Adafruit IO are defined here, including the username and key:


#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"

This section establishes the connection to the Adafruit IO service. Make sure to replace these values with your own Adafruit IO credentials when implementing the code.

Finally, the main loop ensures that the connection to the MQTT server remains active and processes incoming messages. The servo position is updated based on the received angle:


mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);

This code maps the servo angle to the corresponding pulse width and sends it to the servo motor. The processPackets() function allows the ESP32 to handle incoming MQTT messages, ensuring the servo reacts to commands sent via the Adafruit IO dashboard.

Demonstration / What to Expect

Once everything is set up, you should be able to control the servo from the Adafruit IO dashboard using the slider you created. As you move the slider, the servo will adjust its angle in real-time. Ensure that your ESP32 is connected to Wi-Fi, and the MQTT connection is stable. If the servo does not respond, check the wiring and the power supply to the servo (in video at 20:15).

Be aware of the range limits for the servo; sending a value outside of 0° to 180° may cause it to behave unexpectedly. The code includes checks to prevent such occurrences by clamping the angle within this range.

Video Timestamps

  • 00:00 Start
  • 1:54 Project introduction
  • 2:52 Introduction to MQTT
  • 6:50 Adafruit IO setup
  • 9:54 Wiring of servo
  • 11:07 Code explained
  • 18:59 Selecting ESP32 board and COM port
  • 22:10 Project demonstration

Images

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32-28_dht_temperature-sensor-main
ESP32-28_dht_temperature-sensor-main
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram-2
831-ESP32 Tutorial 30/55- ESP32 to control Servo motor using MQTT service of Adafruit
Language: C++
Copied!

Things you might need

Resources & references

Files📁

Other files