Cerca codice

Tutorial ESP32 30/55 - Controllare il Servo tramite il web utilizzando MQTT con il servizio Adafruit IO | Kit di apprendimento IoT ESP32 di SunFounder

Tutorial ESP32 30/55 - Controllare il Servo tramite il web utilizzando MQTT con il servizio Adafruit IO | Kit di apprendimento IoT ESP32 di SunFounder

In questo tutorial, impareremo come controllare la posizione di un servomotore utilizzando il microcontrollore ESP32 e il protocollo MQTT tramite web. Sfruttando il servizio Adafruit IO, sarai in grado di posizionare il servomotore in vari angoli come 0°, 90° o 180° da remoto. Questo progetto dimostra le capacità dell'ESP32, che include Wi-Fi e Bluetooth integrati, rendendolo uno strumento potente per le applicazioni IoT.

ESP32-30_MQTT_diagram-0

In questo progetto, configureremo un broker MQTT utilizzando Adafruit IO, creeremo un dashboard per controllare il servo e collegheremo l'ESP32 ad esso. La posizione del servo sarà regolabile tramite uno slider sul dashboard, consentendo un controllo in tempo reale da qualsiasi dispositivo abilitato a internet (nel video alle 5:30).

Hardware Spiegato

I componenti principali di questo progetto includono il microcontrollore ESP32 e il servomotore. L'ESP32 è un microcontrollore versatile con capacità Wi-Fi e Bluetooth integrate, rendendolo ideale per applicazioni IoT. Comunica con il servizio Adafruit IO utilizzando il protocollo MQTT, che è leggero ed efficiente per trasmettere messaggi su Internet.

Il servomotore è un attuatore rotativo che consente un controllo preciso della posizione angolare. Funziona ricevendo un segnale di modulazione di ampiezza dell'impulso (PWM) che determina la sua posizione. In questo progetto, collegheremo il servomotore a uno dei pin digitali sull'ESP32, consentendoci di controllare il suo angolo da remoto.

Dettagli della scheda tecnica

Produttore Parallasse
Numero di parte SG90
Tensione di logica/ingresso e uscita 3,3 V - 5 V
Tensione di alimentazione 4,8 V - 6,0 V
Corrente di uscita (per canale) 1 A max
Linee guida sulla frequenza PWM 50 Hz
Soglie logiche di ingresso 0,3 V - 0,7 V
Caduta di tensione / RDS(on)/ saturazione 0,2 V max
Limiti termici Temperatura di funzionamento: -10°C a 60°C
Pacchetto Custodia in plastica
Note / varianti Mini servo, rotazione 180°

  • Assicurati di fornire la giusta tensione al servo (4,8 V - 6,0 V).
  • Usa un comune riferimento tra l'ESP32 e il servo.
  • Monitora il segnale PWM per evitare di superare i limiti del servocomando.
  • Collegare saldamente il servocomando per evitare disconnessioni durante il funzionamento.
  • Aggiorna la libreria Adafruit MQTT per garantire la compatibilità.

Diagrammi MQTT

ESP32-30_MQTT_schema-2
ESP32-30_MQTT_diagram
ESP32-28_sensore-di-temperatura-dht-principale

Istruzioni di cablaggio

ESP32-17-Sevo_motor-wiring

Per collegare il servo motore all'ESP32, inizia collegando il filo di massa del servo al pin di massa dell'ESP32. Successivamente, collega il filo di alimentazione (di solito rosso) del servo al pin 5V dell'ESP32. Infine, collega il filo del segnale (spesso giallo o bianco) al pin digitale 25 dell'ESP32. Assicurati che i collegamenti siano sicuri per evitare disconnessioni durante il funzionamento.

Se stai utilizzando una batteria per alimentare l'ESP32, assicurati che la tensione della batteria sia entro l'intervallo accettabile sia per l'ESP32 che per il servo. Inoltre, controlla di nuovo che il cablaggio corrisponda alle definizioni dei pin utilizzate nel tuo codice per evitare problemi (nel video alle 12:45).

Esempi di codice e guida passo passo

Nel codice fornito, prima includiamo le librerie necessarie per l'ESP32 e MQTT. Definiamo l'oggetto servo e specificiamo il pin a cui è collegato conconst int servoPin = 25;. L'angolo predefinito è impostato anche conconst int defaultServoAngle = 90;, che sarà la posizione iniziale quando l'ESP32 si avvia.


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

Questo frammento inizializza il servocomando sul pin 25 e imposta il suo angolo predefinito a 90°. La variabileservoAngleverrà aggiornato in base ai messaggi ricevuti dal broker MQTT.

Nellasetup()funzione, ci connettiamo al Wi-Fi e configuriamo il client MQTT. Le credenziali per Adafruit IO sono definite qui, inclusi il nome utente e la chiave:


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

Questa sezione stabilisce la connessione al servizio Adafruit IO. Assicurati di sostituire questi valori con le tue credenziali Adafruit IO personali quando implementi il codice.

Infine, il ciclo principale garantisce che la connessione al server MQTT rimanga attiva e elabora i messaggi in arrivo. La posizione del servo viene aggiornata in base all'angolo ricevuto:


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

Questo codice mappa l'angolo del servomotore alla corrispondente larghezza dell'impulso e lo invia al servomotore. IlprocessPackets()La funzione consente all'ESP32 di gestire i messaggi MQTT in arrivo, garantendo che il servo reagisca ai comandi inviati tramite il pannello di controllo Adafruit IO.

Dimostrazione / Cosa Aspettarsi

Una volta che tutto è configurato, dovresti essere in grado di controllare il servo dal dashboard di Adafruit IO utilizzando il cursore che hai creato. Man mano che muovi il cursore, il servo regolerà il suo angolo in tempo reale. Assicurati che il tuo ESP32 sia connesso al Wi-Fi e che la connessione MQTT sia stabile. Se il servo non risponde, controlla il cablaggio e l'alimentazione del servo (nel video alle 20:15).

Fai attenzione ai limiti di gamma per il servo; inviare un valore al di fuori di 0° a 180° potrebbe causare un comportamento imprevisto. Il codice include controlli per prevenire tali situazioni limitando l'angolo all'interno di questo intervallo.

Timestamp video

  • 00:00 Inizio
  • 1:54 Introduzione al progetto
  • 2:52 Introduzione a MQTT
  • 6:50 Configurazione di Adafruit IO
  • 9:54 Cablaggio del servo
  • 11:07 Codice spiegato
  • 18:59 Selezionare la scheda ESP32 e la porta COM
  • 22:10 Dimostrazione del progetto

Immagini

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
Lingua: C++
/***********************************************************************
 This is Arduino sketch for ESP32 to control Servo motor using MQTT service of Adafruit
 www.Robojax.com
 Written By Ahamd Shamshiri
 on Feb 2nd, 2024
Watch video instruction for this code on YouTube https://youtu.be/T4DhWNg2Rb8
  Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
  this code can be downloaded from  https://robojax.com/RJT671

  

/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
#include <ESP32Servo.h>

// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle =defaultServoAngle;

// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms




#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/************************* WiFi Access Point *********************************/


#define WLAN_SSID "Barqasaa"
#define WLAN_PASS "wan9&Jang~5"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER "io.adafruit.com"

// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883

// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY      "YOUR_ADAFRUIT_IO_KEY"

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

/************ Global State (you don't need to change this!) ******************/

// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);


// io.adafruit.com root CA
const char* adafruitio_root_ca = \
      "-----BEGIN CERTIFICATE-----\n"
      "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
      "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
      "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
      "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
      "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
      "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
      "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
      "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
      "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
      "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
      "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
      "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
      "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
      "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
      "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
      "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
      "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
      "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
      "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
      "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
      "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
      "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
      "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
      "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
      "7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
      "-----END CERTIFICATE-----\n";

/****************************** Feeds ***************************************/

// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe SERVO = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/servo-angle-1");


/*************************** Sketch Code ************************************/


void setup() {
    // Attach the servo to the specified pin and set its pulse width range
  myServo.attach(servoPin, minPulseWidth, maxPulseWidth);

  // Set the PWM frequency for the servo
  myServo.setPeriodHertz(50); // Standard 50Hz servo

  Serial.begin(115200);
  delay(10);

  Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));

  // Connect to WiFi access point.
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  delay(1000);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  delay(2000);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Set Adafruit IO's root CA
  client.setCACert(adafruitio_root_ca);

  // register callback for feed
  SERVO.setCallback(servoCallback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&SERVO);


}

// uint32_t x=0;


void loop() {

  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();

  Serial.print("Angle: ");
  Serial.println(servoAngle);

  // wait 0.5 seconds for subscription messages
  mqtt.processPackets(500);

  //from lesson 17
  int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
  myServo.writeMicroseconds(pulseWidth);
  delay(15);
  // wait a couple seconds to avoid rate limit
  //delay(2000);
}

void servoCallback(char* message, uint16_t len) {
  char messageBuffer[40];
  snprintf(messageBuffer, sizeof(messageBuffer), "Servo status is :: %s, len :: %u", message, len);
  Serial.println(messageBuffer);
  Serial.println(message);
  String inString = message;//sotre the message to String
 
  servoAngle  =  inString.toInt();//convert the message to Integer
  if(servoAngle >180 || servoAngle < 0)
  {
    servoAngle =0;
  }

}




// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;
  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {  // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1)
        ;
    }
  }
  Serial.println("MQTT Connected!");
}

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Altri file