Capire la mobilità del futuro con le auto robot, parte 3
Benvenuto alla terza puntata della nostra serie di blog sulle auto robot. Nella prima parte abbiamo appreso le basi del veicolo di base. Nella seconda parte abbiamo sviluppato un sistema di codici universali per definire le fasi di guida dell'auto robot e abbiamo realizzato un semplice controllo a distanza con un telecomando a infrarossi. A causa dei limiti fisici di questo telecomando, in questa puntata vorrei mostrare la trasmissione delle istruzioni di guida con il Bluetooth, ad esempio da uno smartphone al ricevitore BT HC-05. Il Bluetooth è un segnale radio a 2,4 GHz con una portata ridotta. È sicuro fino a circa 10 metri e non subisce interferenze alla luce del sole.
Il modulo Bluetooth HC-05 è in realtà un ricetrasmettitore = trasmettitore+ricevitore. Tuttavia, noi lo utilizziamo solo come ricevitore, mentre per inviare le istruzioni di guida utilizziamo un'APP Bluetooth su uno smartphone Android (a causa del modo particolare in cui Apple utilizza il Bluetooth, non funziona con un iPhone). In linea di principio, è anche possibile costruire un telecomando Bluetooth con l'HC-05; tuttavia, ciò richiede un secondo HC-05, un altro microcontrollore e un dispositivo di input (controller joystick).
Dei sei pin del modulo HC-05, solo quattro sono necessari: VCC (5V) e GND per l'alimentazione del modulo e RXD e TXD per il collegamento ai due pin del microcontrollore in cui è impostato il SoftwareSerial. Tuttavia, non puoi ignorare la scritta LEVEL: 3.3V per non danneggiare il modulo. Sul nostro microcontrollore con logica a 5V, abbiamo bisogno di un partitore di tensione da 5V a 3,3V almeno per il pin RXD, ad esempio resistenze da 1 kOhm e 2,2 kOhm.
Lo schema del circuito: Modulo HC-05 sul microcontrollore
I comandi AT del modulo HC-05 per i microcontrollori Arduino
A sinistra del connettore contrassegnato dalla dicitura Key si trova un piccolo pulsante importante per la configurazione. Se questo pulsante viene premuto quando il modulo è acceso, entriamo nella modalità di comando AT (il LED lampeggia lentamente con un ritmo di 2s), in cui effettuiamo le impostazioni con i cosiddetti comandi AT (per Attenzione, Achtung). A questo scopo utilizziamo un programma di esempio modificato, in cui la solita interfaccia seriale è collegata al Serial Monitor dell'IDE Arduino e all'HC-05 tramite SoftwareSerial.
/*
Test seriale multiplo del software
Riceve dalla seriale hardware, invia alla seriale software.
Riceve dalla seriale software, invia alla seriale hardware.
Il circuito:
* RX è il pin digitale 10 (collegato al TX di un altro dispositivo)
* TX è il pin digitale 11 (collegato all'RX di un altro dispositivo) // divisore di tensione!
creato nella notte dei tempi
modificato il 25 maggio 2012
da Tom Igoe
basato sull'esempio di Mikal Hart
Questo esempio di codice è di pubblico dominio.
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX, TX // mySerial è stato cambiato in BTSerial
char c=' '; // Dichiarazione della variabile per la trasmissione
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600); // Baud rate changed to 9600
Serial.println("Serial started!");
// set the data rate for the SoftwareSerial port
BTSerial.begin(38400); // Baud rate for BT 38400
Serial.println("BTSerial started!");
}
void loop() { // Esegui ripetutamente
se (BTSerial.available()) {
c=BTSerial.read();
Serial.write(c);
}
if(Serial.available()) {
c=Serial.read();
BTSerial.write(c);
Serial.write(c); // re-transmission of input in Serial Monitor
}
}
Nella figura seguente vengono utilizzati i comandi AT essenziali. La stazione remota, l'HC-05, invia una risposta se necessario e conferma con OK.
A noi interessano soprattutto il nome e l'indirizzo HEX per poter identificare in modo univoco il modulo in seguito sullo smartphone. I comandi AT vengono inseriti nel monitor seriale del microcontrollore. Nell'immagine seguente puoi vedere il monitor seriale dell'IDE Arduino.
Se vuoi, puoi cambiare la password predefinita 1234 con"AT+PSWD=xxxx", dove x sta per una cifra da 0 a 9. Poi controlla con"AT+PSWD?" se l'inserimento è andato a buon fine.
Dopo aver completato gli inserimenti, il modulo viene brevemente scollegato dall'alimentazione. Dopo la riaccensione senza premere alcun pulsante, il modulo HC-05 si trova in modalità standard. Il LED lampeggia rapidamente (circa 5 volte/s).
Modifiche all'auto RC: un diverso scudo motore
Passiamo ora all'auto robot. Dopo aver utilizzato la volta scorsa il controller del motore V2, che necessita solo dei due connettori I2C SDA=A4 e SCL=A5 per i segnali di controllo, questa volta voglio introdurre il più vecchio controller del motore V1, che blocca molti pin digitali, ma che spesso può essere acquistato a un prezzo vantaggioso.
Ho anche modificato un po' questo motorshield per ottenere l'accesso ai sensori e ai ricevitori radio. Sul lato dei pin digitali, c'è solo un pin a cui si può accedere utilizzando un connettore angolato: Pin 2. Questo è utile per chi vuole collegare il ricevitore IR in questo punto. Ci sono più possibilità di estensione sull'altro lato, dove puoi accedere a tutti gli ingressi analogici e all'alimentazione con l'aiuto di connettori femmina (chiamati anche connettori a presa).
Poiché tutti gli ingressi analogici possono essere utilizzati anche come ingressi o uscite digitali, abbiamo la possibilità di collegare qui i nostri ricevitori radio. Questo funziona benissimo con il ricetrasmettitore a 433 MHz HC-12 (vedi la prossima puntata), ma per il ricevitore BT HC-05 ci sono solo delle restrizioni. In primo luogo, non possiamo collegare direttamente il pin RXD, abbiamo bisogno del partitore di tensione, e in secondo luogo, i pin non forniscono una corrente sufficiente per alimentare il modulo su questi pin.
L'immagine seguente mostra un piccolo adattatore che abbiamo realizzato noi stessi, che alimenta l'HC-05 con 5 V e la massa dai pin appropriati, collega TXD direttamente a RX dell'interfaccia SoftwareSerial A1 =D15 e RXD a A2 = D16 tramite il partitore di tensione.
Lo schema di cablaggio: Modulo HC-05 con Motorshield L293D sul microcontrollore Arduino
Naturalmente il circuito può essere realizzato anche su una mini breadboard con dei cavi di collegamento.
Come l'ultima volta, il codice per le istruzioni di guida viene aumentato o diminuito con la semplice pressione di un pulsante; questa volta, però, non con il telecomando IR, ma con la funzione touch dell'APP dello smartphone e l'interrogazione Bluetooth tramite SoftwareSerial.
Accoppiamento del modulo Bluetooth HC-05 con un'applicazione Android (APP)
Prima che l'APP possa connettersi alla Robot Car, dobbiamo accoppiarla con il modulo Bluetooth nelle impostazioni. Dovrebbe essere abbastanza facile, visto che in precedenza abbiamo utilizzato i comandi AT per interrogare il nome e l'indirizzo HEX dell'HC-05.
Una volta che l'accoppiamento ha funzionato e che è stata installata un'app BT adatta, è possibile avviare e configurare il sistema. Toccando la lente di ingrandimento nell'immagine a sinistra, vengono visualizzati i dispositivi adatti. Toccando l'HC-05, viene visualizzato il messaggio "connesso". L'applicazione che utilizzo offre diverse interfacce per il funzionamento (immagine centrale). Ho deciso di utilizzare il controller di gioco. In alto a destra dell'immagine centrale, ci sono due frecce che formano un piccolo cerchio. Tocca qui se la connessione è stata persa.
L'immagine di destra mostra i pulsanti di un controller di gioco. Prima di utilizzarli per la prima volta, è necessario assegnare ai pulsanti i valori numerici che devono essere trasmessi quando si toccano.
Ai pulsanti del cursore ho assegnato i valori numerici da 1 a 4 in senso orario. Ho assegnato il valore numerico 5 agli altri pulsanti. Questi valori vengono passati nello sketch alla variabile blueToothVal e portano neipuntatori if della funzione loop() alla determinazione del codice per il livello di guida.
I cambiamenti da infrarossi a Bluetooth e da controller motore V2 a V1 comportano alcune modifiche nella parte principale dello sketch. D'altra parte, non cambia quasi nulla nella funzione motor(). Solo nella notazione, la funzione motor1->setSpeed() diventa motor1.setSpeed() a causa delle diverse librerie del programma (librerie).
Il codice del programma: Costruire un'auto RC per Arduino
* Codice di esempio per auto robot con Motor Shield V1 e ricevitore BT HC-05, al 20220515
* basato sulla libreria Adafruit Motor shield V2, copyright Adafruit Industries LLC
* questo codice è di pubblico dominio, divertiti!
* modificato per Funduino
* Pin
* BT VCC a Arduino 5Vout.
* BT GND a GND
* Arduino A1=15 (SS RX) - BT TX non ha bisogno di un partitore di tensione
* Arduino A2=16 (SS TX) - BT RX attraverso un partitore di tensione(da 5va 3,3v)
*/
#includere <AFMotor.h>
Motore AF_DCMotor motor1(2);
AF_DCMotor motor2(3);
#include <SoftwareSerial.h>
// Inizializza HC-05
SoftwareSerial BTSerial(15, 16); // RX, TX incrociati con TX, RX (divisore di tensione)
char blueToothVal;
int x = 0;
int y = 0;
int left = 0;
int right = 0;
int codice = 5555;
int speedL = 0;
float factor = 1.8; // Correzione per speedLevel 255/100 * 6V/VBatt
void setup() {
Serial.begin(9600); // set up Serial Monitor at 9600 bps
Serial.println("Motor test!");
BTSerial.begin(9600); // set up transmission speed for HC-12
Serial.println("SoftwareSerial initialized!");
} // fine setup
void loop() {
if(BTSerial.available()) //se i dati vengono ricevuti ...
Serial.print("disponibile");
{
blueToothVal=BTSerial.read();//..sollen diese ausgelesen werden
Serial.println(blueToothVal);
}
if (blueToothVal=='1') //se il modulo Bluetooth riceve un "1"....
{
if (code<9000) code = code + 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='2') //se il modulo Bluetooth riceve un "2"....
{
if ((code-1000*int(code/1000))<900) code = code + 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='3') //se il modulo Bluetooth riceve un "3"....
{
if (code>2000) code = code - 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='4') //se il modulo Bluetooth riceve un "4"....
{
if (code-1000*int(code/1000) > 200) code = code - 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='5') //se il modulo Bluetooth riceve un "5"...
{
code = 5555;
Serial.print("Code = ");
Serial.println(code);
}
delay(200); /piccolo ritardo per una migliore comunicazione seriale e per evitare rimbalzi
motor();
} // termina il ciclo
void motor(){
int speedLevel[9]={-100,-80,-60,-40,0,40,60,80,100};
y = int(codice / 1000);
x = int((codice - 1000*y) / 100);
speedL = speedLevel[y-1];
Serial.print("codice = ");
Serial.print(codice);
Serial.print(" y =");
Serial.print(y);
Serial.print(" x =");
Serial.print(x);
Serial.print(" velocitàL =");
Serial.println(speedL);
//Correzione dei passi di velocità per le curve
se (x==1){
right = speedL+20;
left = speedL-20;
}
altrimenti se (x==2){
right = speedL+15;
left = speedL-15;
}
se (x==3) {
right = speedL+10;
left = speedL-10;
}
se (x==4) {
right = speedL+5;
left = speedL-5;
}
se (x==6) {
right = speedL -5;
left = speedL+5;
}
se (x==7) {
right = speedL-10;
left = speedL+10;
}
se (x==8) {
right = speedL-15;
left = speedL+15;
}
se (x==9) {
right = speedL-20;
left = speedL+20;
}
altrimenti {
right = speedL;
left = speedL;
}
//Input dei passi di guida per "sinistra" e "destra
Serial.print("sinistra = ");
Serial.print(left);
Serial.print(" destra = ");
Serial.println(right);
se (left < 40 & left > -40) {
motor1.run(RELEASE);
}
se (destra < 40 & destra > -40) {
motor2.run(RELEASE);
}
se (sinistra>=40) {
if (left>100) left=100;
motor1.run(FORWARD);
motor1.setSpeed(left * factor);
}
se (destra>=40) {
if (right>100) right=100;
motor2.run(FORWARD);
motor2.setSpeed(right * factor);
}
se (sinistra<= -40) {
if (left<-100) left=-100;
motor1.run(BACKWARD);
left = -left;
motor1.setSpeed(left * factor);
}
se (destra<= -40) {
if (right<-100) right=-100;
motor2.run(BACKWARD);
right = -right;
motor2.setSpeed(right * factor);
}
} // fine motore
Questo è quanto per la seconda soluzione più economica per un'auto robot con telecomando (supponendo che tu abbia uno smartphone Android). La prossima volta ti mostrerò come è facile integrare un ricetrasmettitore HC-12 a 433 MHz. In questo modo si possono raggiungere anche diverse centinaia di metri di portata. Tuttavia, i costi aumentano perché ora sono necessari due ricetrasmettitori e un altro microcontrollore. Ci vediamo allora.