Introduzione
Se stai cercando di controllare un servomotore SG90 tramite Bluetooth, l’ESP32 è una soluzione ideale. L’ESP32 è un microcontrollore molto potente che offre funzionalità Bluetooth integrate, che lo rendono perfetto per i progetti di controllo remoto. In questo articolo, ti guiderò passo-passo attraverso il processo di configurazione dell’ESP32 per controllare un servomotore SG90 tramite Bluetooth. Scoprirai come utilizzare l’applicazione Serial Bluetooth Terminal di Kai Morich per inviare comandi al tuo servomotore SG90, e vedrai come realizzare un progetto completo che ti consentirà di controllare il movimento del tuo servomotore da remoto. Con questa guida, sarai in grado di creare un sistema di controllo remoto personalizzato che ti permetterà di controllare i tuoi dispositivi da qualsiasi luogo.
Ma cos’è un servomotore?
Un servomotore è un tipo di motore elettrico che utilizza un segnale di controllo per posizionare un albero o un braccio in una posizione specifica e mantenere quella posizione stabile. È composto da un motore, un circuito di controllo e un dispositivo di feedback, come un potenziometro o un encoder, che misura la posizione dell’albero o del braccio e la invia al circuito di controllo. I servomotori sono comunemente utilizzati in applicazioni che richiedono un controllo preciso della posizione, come robotica, automazione industriale, aeromodellismo e controllo di dispositivi meccanici. Il servomotore SG90 che utilizzeremo qui ha 3 fili di collegamento: due per l’alimentazione a 5V e il terzo per il suo controllo. Essendo piccolo e poco potente è adatto per agire su carichi piccoli.
Di quali componenti abbiamo bisogno?
La lista dei componenti non è particolarmente lunga:
- una breadboard per connettere la NodeMCU ESP32 agli altri componenti
- alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
- un servomotore SG90
- e, ovviamente, una NodeMCU ESP32 !
Realizzazione del progetto
Lo schema elettrico
Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:
Mentre il servomotore si presenta così:
Da notare i colori inusuali utilizzati per i fili di collegamento. In particolare abbiamo:
- il filo marrone andrà alla massa
- il filo rosso andrà al pin 5V dell’ESP32
- il filo arancio è quello di controllo e lo collegheremo al GPIO 19 dell’ESP32
Ecco, nell’immagine seguente, lo schema di collegamento realizzato con Fritzing:
Come vedi il collegamento è abbastanza semplice. In realtà potresti anche fare a meno della breadboard, a meno che non voglia aggiungere qualche altro componente. L’unica cosa a cui fare attenzione è il fatto che il colore dei fili è particolare (con le convenzioni dette sopra).
Lo sketch
Creiamo il progetto PlatformIO
Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO.
Anche se si riferisce alla board ESP8266, la procedura è simile.
Semplicemente, nella scelta della piattaforma, dovrai scegliere la AZ-Delivery ESP-32 Dev Kit C V4.
Non installare le librerie indicate in quell’articolo perché non ci servono in questo progetto. Però devi, seguendo la procedura indicata nell’articolo, installare la libreria ServoESP32 by Jaroslav Paral:
Installa poi la libreria BluetoothSerial by Seeed come mostrato nell’immagine seguente:
Ora modifica il file platformio.ini per aggiungere queste due righe:
monitor_speed = 115200
upload_speed = 921600
in modo che il file abbia un aspetto del genere:
[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
monitor_speed = 115200
upload_speed = 921600
framework = arduino
lib_deps =
roboticsbrno/ServoESP32@^1.0.3
mbed-seeed/[email protected]+sha.f56002898ee8
Ovviamente puoi scaricare il progetto dal link seguente:
SG90 servo motor controlled by Bluetooth
Sostituisci il file main.cpp del progetto che hai creato con quello presente nel file zip.
Vediamo ora come funziona lo sketch.
Lo sketch inizia con l’inclusione delle librerie necessarie per la gestione del servomotore e del Bluetooth:
#include <Arduino.h>
#include "BluetoothSerial.h"
#include <Servo.h>
Vengono poi definiti l’oggetto myServo, il GPIO a cui è collegato e la variabile servoPosition che conserva il valore angolare della posizione del servomotore:
Servo myServo; // create servo object to control a servo
#define SERVO_GPIO 19
int servoPosition = 0; // variable to store the servo position
Viene poi definito l’oggetto SerialBT che gestirà il Bluetooth e la variabile BTData in cui transiteranno i dati attraverso la porta seriale:
BluetoothSerial SerialBT;
byte BTData;
A questo punto incontriamo la funzione setup che inizialmente setta la velocità della porta seriale:
Serial.begin(115200);
delay(2000);
Poi inizializza l’oggetto myServo collegandolo al GPIO 19:
myServo.attach(SERVO_GPIO); // attaches the servo on pin 19 to the servo object
Viene poi attivato il Bluetooth:
SerialBT.begin();
Serial.println("Bluetooth Started! Ready to pair...");
Se desideri assegnare un nome specifico al dispositivo Bluetooth ESP32 è necessario specificarlo come argomento della funzione SerialBT.begin(). Ad esempio, se vuoi chiamarlo myESP32BT, inserisci SerialBT.begin(“myESP32BT”).
Se lasci il comando senza un parametro, ad esempio SerialBT.begin(), verrà applicato il nome predefinito ESP32.
Incontriamo ora la funzione loop.
La prima parte legge il carattere inviato dall’applicazione sul cellulare (che vedremo in seguito) verso l’ESP32 e lo stampa sul Serial Monitor:
if(SerialBT.available())
{
BTData = SerialBT.read();
Serial.write(BTData);
}
Segue la decodifica dei comandi:
if(BTData == '0')
{
servoPosition = 20;
}
if(BTData == '+')
{
servoPosition++;
}
if(BTData == '-')
{
servoPosition--;
}
if(BTData == 'A')
{
servoPosition -= 10;
}
if(BTData == 'B')
{
servoPosition += 10;
}
if(BTData == 'C')
{
servoPosition = 180;
}
Vediamo ora come funzionano questi comandi:
- se il Bluetooth riceve 0 setta l’angolo a 20 gradi
- se il Bluetooth riceve + aumenta l’angolo di 1 grado
- se il Bluetooth riceve – diminuisce l’angolo di 1 grado
- se il Bluetooth riceve A diminuisce l’angolo di 10 gradi
- se il Bluetooth riceve B aumenta l’angolo di 10 gradi
- se il Bluetooth riceve C setta l’angolo a 180 gradi
Perché abbiamo imposto un limite minimo di 20 gradi invece di impostare 0 gradi? Perché abbiamo notato che tutti i servo SG90 a nostra disposizione cominciano a vibrare in maniera incontrollata quando l’angolo viene impostato a 20 gradi o a valori inferiori.
Dopo la decodifica dei comandi c’è la loro esecuzione:
if((servoPosition >= 20) && (servoPosition <= 180))
{
myServo.write(servoPosition);
delay(100);
}
Il blocco if controlla che il valore dell’angolo rientri nell’intervallo appropriato. In caso affermativo viene eseguita la scrittura dell’angolo sul servo (questo è il vero e proprio comando al servomotore) e si aspettano 100ms per dargli il tempo di eseguire il movimento
L’applicazione Serial Bluetooth Terminal
Per mandare i comandi Bluetooth verso l’ESP32 ho scelto di usare l’applicazione Serial Bluetooth Terminal di Kai Morich. Puoi scaricarla dal Play Store.
Ora attiva il Bluetooth nel tuo smartphone e cerca i dispositivi Bluetooth. Dovresti vedere un elenco di Dispositivi associati e Dispositivi disponibili. Vai su Dispositivi disponibili.
Seleziona ESP32 nel caso tu abbia lasciato nello sketch la riga SerialBT.begin() senza parametro, altrimenti scegli il dispositivo col nome che hai messo come parametro in quella riga. Il tuo cellulare ti chiederà se vuoi accoppiarlo con ESP32 (o col nome che gli hai impostato). A questo punto dai OK. Non c’è bisogno di password.
Apri l’applicazione Serial Bluetooth Terminal e clicca nel punto indicato nell’immagine seguente:
Seleziona la voce Devices come indicato nella figura sotto:
Si aprirà un altro menu dal quale dovrai selezionare il tuo dispositivo (per esempio ESP32):
Clicca ora nel punto indicato nell’immagine seguente per connettere l’applicazione al dispositivo selezionato:
Se tutto va bene dovrebbe stabilirsi la connessione:
A questo punto devi registrare i comandi da inviare al dispositivo con delle macro nell’applicazione. Tieni premuto il tasto M1. Si aprirà il menu per editarlo:
Al posto di M1, nel campo Name metti il carattere + e riempi il campo Value sempre con il carattere +, poi salva premendo nel punto indicato:
Ripetendo la stessa identica procedura esegui le seguenti associazioni:
- su M2 metti il carattere – nei campi Name e Value
- su M3 metti la scritta -10 nel campo Name e il carattere A nel campo Value
- su M4 metti la scritta +10 nel campo Name e il carattere B nel campo Value
- su M5 metti la scritta 0 nel campo Name e il carattere 0 nel campo Value
- su M6 metti la scritta 180 nel campo Name e il carattere C nel campo Value
Alla fine dovresti avere una schermata come questa:
Premendo i tasti + o – farai aumentare o diminuire di un grado la posizione dell’albero del servomotore. Premendo i tasti +10 o -10 farai aumentare o diminuire di 10 gradi la posizione dell’albero del servomotore. Premendo il tasto 0 porterai all’angolo iniziale (come già spiegato corrispondente a 20 gradi) l’alberino del servomotore, premendo il tasto 180 lo porterai all’angolo finale (corrispondente a 180 gradi).
Video dimostrativo del funzionamento del servomotore SG90
Ecco un breve video che mostra il controllo del servomotore SG90 tramite Bluetooth:
Newsletter
Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)
Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.