EduRobot 4WD – Bluetooth

Alcuni lettori hanno notato nella lezione in cui ho condiviso i sorgenti per la stampa 3D del robot, che la scheda motori utilizzata è una Adafruit Motor Shield V01 e mi è stato fatto notare che esiste la V02 della scheda, quindi perché ho usato la versione precedente? La risposta non è tecnica ma economica, ho acquistato ad un prezzo interessante, su uno store cinese, una grande quantità di queste schede che poi ho usato per i miei corsi. Ovviamente nulla vieta che voi possiate utilizzare una qualsiasi altra scheda, la logica di programmazione è la medesima, ma certamente varieranno il nome delle istruzioni che controllano il motore, se avete necessità contattatemi.

Lista componenti

  • N. 1 Arduino UNO R3
  • N. 1 Adafruit Motor Shield V01
  • Modulo Bluetooth HC05
  • N. 4 Motori DC 6V
  • N. 4 Ruote

Di seguito trovate i collegamenti elettrici effettuati e il primo sketch di esempio con cui parto per svolgere le successive esercitazioni. Per gli allievi e i docenti che si iscriveranno ai miei corsi darò ulteriori esempi e spiegazioni.

Lo shield per il controllo motori può gestire fino a 4 motori DC in entrambe le direzioni, ciò vuol dire che possono essere azionati sia in avanti che all’indietro. La velocità può anche essere variata con incrementi dello 0,5% utilizzando PWM integrato sulla scheda, ciò permetterà un movimento uniforme e non brusca del robot.

Il ponte H presente sulla scheda può pilotare carichi NON superiori ai 0,6A o che hanno picchi di richiesta corrente NON superiori a 1,2A, quindi utilizzate questa scheda per piccoli motori, i classici motori gialli da 6V vanno più che bene.

Collegamento motori allo shield Arduino Motor Driver

Come indicato nell’immagine che segue è molto semplice:
– saldate due cavi al motorino (in commercio trovate motori con fili saldati)
– collegate i motori ai morsetti: M1, M2, M3 o M4.

Collegamento scheda Bluetooth HC-05 allo shield Arduino Motor Driver

Come sicuramente saprete, il modulo Bluetooth HC-05 permette di convertire una porta seriale UART in una porta Bluetooth e la utilizzeremo per inviare su seriale i caratteri selezionati da una specifica app Android, per comandare direzione e velocità dei motori del robot.

I collegamenti sono:

HC05 <-> Arduino Motor Driver
RX - Pin 1
TX - Pin 0
G - GND
V - +5V

Orientamento ruote.

Collegamento motori M1 e M2.

Collegamento motori M3 e M4.

Modulo Bluetooth HC-05.

Connessione dei pin RX e TX del modulo Bluetooth HC-05 alla seriale di Arduino (pin 0 e pin 1).

Alimentazione del modulo Bluetooth HC-05 attraverso lo shield.

Alimentazione dello shield.

Il principio di funzionamento dello sketch è descritto nei commenti del codice ed è basato sugli esempi di Adafruit.

I passi fondamentali da eseguire per l’utilizzo dello shield sono:

  1. includere la libreria AFMotor.h: #include
  2. creare l’oggetto AF_DCMotor: AF_DCMotor(motore#, frequenza) permette di controllare velocità e direzione del motore. L’oggetto è costituito da due argomenti, il primo è la porta (o canale) a cui il motore è collegato: 1, 2, 3 o 4, il secondo è la frequenza del PWM.

Le frequenze che possono essere impostate sono:

Frequenze canali 1 e 2:

  • MOTOR12_64KHZ
  • MOTOR12_8KHZ
  • MOTOR12_2KHZ
  • MOTOR12_1KHZ

Frequenze canali 3 e 4:

  • MOTOR34_64KHZ
  • MOTOR34_8KHZ
  • MOTOR34_1KHZ

Una frequenza alta come ad esempio 64KHz permetterà di non sentire il ronzio del motore, ma otterrete una coppia del motore inferiore, mentre una frequenza bassa, come ad esempio 1KHz, permetterà di consumare meno energia ed avere maggiore coppia.
Se non indicate la frequenza il valore di default assunto sarà di 1KHz.

Consiglio di impostare per tutti i motori una frequenza di 1KHZ.

  1. Impostare la velocità del motore usando l’istruzione setSpeed(velocità) dove la velocità varia da 0 (fermo) a 255 (velocità massima). Potete impostare la velocità quando volete.
  2. Per comandare il motore usare l’istruzione run(direzione) dove la direzione può assumere può essere:
  • FORWARD (avanti);
  • BACKWARD (indietro)
  • RELEASE (rilascio).

Il parametro RELEASE applicato sulla funzione run è equivalente a setSpeed(0).
Lo shield non implementa la frenata dinamica, quindi il motore potrebbe impiegare un po’ di tempo prima di fermarsi.

Ricordate che Arduino non ha nessun modo per capire se il motore sta effettivamente andando avanti o indietro, quindi se notate un comportamento opposto, non dovete fare altro che invertire la connessione dei fili del motore allo shield.

Una delle applicazioni più note per effettuare il controllo via Bluetooth di un robot è: “Bluetooth RC Controller”. Nell’applicazione selezionando “Settings” (icona ingranaggio), aprirà una finestra in cui trovate quali caratteri vengono inviati sulla seriale via Bluetooth agendo sull’interfaccia di controllo e noterete immediatamente che la funzione switch all’interno dello sketch non fa altro che intercettare i caratteri F, B, L, R, che identificano: Forward (avanti), Back (indietro), Left (sinistra), Right (destra).

1// Prof. Maffucci Michele
2// Controllo robot Arduino 4WD Bluetooth con scheda motore Adafruit Motor Schied V01
3// 01.09.23
4 
5//Per il funzionamento dello sketch è necessario installare la libreria
6//AFMotor che può essere prelevata al seguente link https://learn.adafruit.com/adafruit-motor-shield/library-install
7 
8// inclusione della libreria per utilizzare la scheda motore
9#include <AFMotor.h>
10 
11// definizione degli oggetti "motore" indicando il pin di
12// controllo a cui è connesso il motore
13 
14AF_DCMotor motore1(1, MOTOR12_1KHZ);
15AF_DCMotor motore2(2, MOTOR12_1KHZ);
16AF_DCMotor motore3(3, MOTOR34_1KHZ);
17AF_DCMotor motore4(4, MOTOR34_1KHZ);
18 
19// variabile in cui memorizzare il carattere letto sulla seriale
20// in funzione del carattere ricevuto potremo movimentare il robot
21 
22char commando;
23 
24void setup()
25{
26  // definizione della velocità della seriale Bluetooth
27  Serial.begin(9600);
28}
29 
30void loop(){
31  // Se presente un carattere sulla seriale
32  // il carattere viene memorizzato nella variabile "comando"
33  if(Serial.available() > 0){
34    commando = Serial.read();
35     
36    // appena viene letto un carattere
37    // il robot viene messo prima in stop
38    Stop();
39 
40    // l'istruzione switch seleziona l'azione da compiere in funzione
41    // del carattere letto sulla seriale
42    // La selezione della lettera letta sulla seriale dipende dall'applicazione per
43    // smartphone Android utilizzata per controllare il robot.
44 
45    switch(commando){
46    case 'F'
47      avanti();     // movimento in avanti
48      break;
49    case 'B'
50      indietro();  // movimento indietro del robot
51      break;
52    case 'L'
53      sinistra();  // rotazione a sinistra del robot
54      break;
55    case 'R':
56      destra();    // movimento a destra del robot
57      break;
58    }
59  }
60}
61 
62void avanti()
63{
64  motore1.setSpeed(255); // impostazione massima velocità del motore
65  motore1.run(FORWARD);  // rotazione del motore in senso orario
66  motore2.setSpeed(255); // impostazione massima velocità del motore
67  motore2.run(FORWARD);  // rotazione del motore in senso orario
68  motore3.setSpeed(255); // impostazione massima velocità del motore
69  motore3.run(FORWARD);  // rotazione del motore in senso orario
70  motore4.setSpeed(255); // impostazione massima velocità del motore
71  motore4.run(FORWARD);  // rotazione del motore in senso orario
72}
73 
74void indietro()
75{
76  motore1.setSpeed(255); // impostazione massima velocità del motore
77  motore1.run(BACKWARD); // rotazione del motore in senso antiorario
78  motore2.setSpeed(255); // impostazione massima velocità del motore
79  motore2.run(BACKWARD); // rotazione del motore in senso antiorario
80  motore3.setSpeed(255); // impostazione massima velocità del motore
81  motore3.run(BACKWARD); // rotazione del motore in senso antiorario
82  motore4.setSpeed(255); // impostazione massima velocità del motore
83  motore4.run(BACKWARD); // rotazione del motore in senso antiorario
84}
85 
86void sinistra()
87{
88  motore1.setSpeed(255); // impostazione massima velocità del motore
89  motore1.run(BACKWARD); // rotazione del motore in senso antiorario
90  motore2.setSpeed(255); // impostazione massima velocità del motore
91  motore2.run(BACKWARD); // rotazione del motore in senso antiorario
92  motore3.setSpeed(255); // impostazione massima velocità del motore
93  motore3.run(FORWARD);  // rotazione del motore in senso orario
94  motore4.setSpeed(255); // impostazione massima velocità del motore
95  motore4.run(FORWARD);  // rotazione del motore in senso orario
96}
97 
98void destra()
99{
100  motore1.setSpeed(255); // impostazione massima velocità del motore
101  motore1.run(FORWARD);  // rotazione del motore in senso orario
102  motore2.setSpeed(255); // impostazione massima velocità del motore
103  motore2.run(FORWARD);  // rotazione del motore in senso orario
104  motore3.setSpeed(255); // impostazione massima velocità del motore
105  motore3.run(BACKWARD); // rotazione del motore in senso antiorario
106  motore4.setSpeed(255); // impostazione massima velocità del motore
107  motore4.run(BACKWARD); // rotazione del motore in senso antiorario
108}
109 
110void Stop()
111{
112  motore1.setSpeed(0);   // impostazione della minima velocità del motore
113  motore1.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
114  motore2.setSpeed(0);   // impostazione della minima velocità del motore
115  motore2.run(RELEASE);  // rotazione del motore in senso orario
116  motore3.setSpeed(0);   // impostazione della minima velocità del motore
117  motore3.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
118  motore4.setSpeed(0);   // impostazione della minima velocità del motore
119  motore4.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
120}

Buon Making robotico a tutti 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.