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).

// Prof. Maffucci Michele
// Controllo robot Arduino 4WD Bluetooth con scheda motore Adafruit Motor Schied V01
// 01.09.23

//Per il funzionamento dello sketch è necessario installare la libreria 
//AFMotor che può essere prelevata al seguente link https://learn.adafruit.com/adafruit-motor-shield/library-install 

// inclusione della libreria per utilizzare la scheda motore
#include <AFMotor.h>

// definizione degli oggetti "motore" indicando il pin di
// controllo a cui è connesso il motore

AF_DCMotor motore1(1, MOTOR12_1KHZ); 
AF_DCMotor motore2(2, MOTOR12_1KHZ); 
AF_DCMotor motore3(3, MOTOR34_1KHZ);
AF_DCMotor motore4(4, MOTOR34_1KHZ);

// variabile in cui memorizzare il carattere letto sulla seriale
// in funzione del carattere ricevuto potremo movimentare il robot

char commando; 

void setup() 
{ 
  // definizione della velocità della seriale Bluetooth
  Serial.begin(9600);
}

void loop(){
  // Se presente un carattere sulla seriale
  // il carattere viene memorizzato nella variabile "comando"
  if(Serial.available() > 0){ 
    commando = Serial.read(); 
    
    // appena viene letto un carattere
    // il robot viene messo prima in stop
    Stop();

    // l'istruzione switch seleziona l'azione da compiere in funzione
    // del carattere letto sulla seriale
    // La selezione della lettera letta sulla seriale dipende dall'applicazione per 
    // smartphone Android utilizzata per controllare il robot.

    switch(commando){
    case 'F':  
      avanti();     // movimento in avanti
      break;
    case 'B':  
      indietro();  // movimento indietro del robot
      break;
    case 'L':  
      sinistra();  // rotazione a sinistra del robot
      break;
    case 'R':
      destra();    // movimento a destra del robot
      break;
    }
  } 
}

void avanti()
{
  motore1.setSpeed(255); // impostazione massima velocità del motore
  motore1.run(FORWARD);  // rotazione del motore in senso orario
  motore2.setSpeed(255); // impostazione massima velocità del motore
  motore2.run(FORWARD);  // rotazione del motore in senso orario
  motore3.setSpeed(255); // impostazione massima velocità del motore
  motore3.run(FORWARD);  // rotazione del motore in senso orario
  motore4.setSpeed(255); // impostazione massima velocità del motore
  motore4.run(FORWARD);  // rotazione del motore in senso orario
}

void indietro()
{
  motore1.setSpeed(255); // impostazione massima velocità del motore
  motore1.run(BACKWARD); // rotazione del motore in senso antiorario
  motore2.setSpeed(255); // impostazione massima velocità del motore
  motore2.run(BACKWARD); // rotazione del motore in senso antiorario
  motore3.setSpeed(255); // impostazione massima velocità del motore
  motore3.run(BACKWARD); // rotazione del motore in senso antiorario
  motore4.setSpeed(255); // impostazione massima velocità del motore
  motore4.run(BACKWARD); // rotazione del motore in senso antiorario
}

void sinistra()
{
  motore1.setSpeed(255); // impostazione massima velocità del motore
  motore1.run(BACKWARD); // rotazione del motore in senso antiorario
  motore2.setSpeed(255); // impostazione massima velocità del motore
  motore2.run(BACKWARD); // rotazione del motore in senso antiorario
  motore3.setSpeed(255); // impostazione massima velocità del motore
  motore3.run(FORWARD);  // rotazione del motore in senso orario
  motore4.setSpeed(255); // impostazione massima velocità del motore
  motore4.run(FORWARD);  // rotazione del motore in senso orario
}

void destra()
{
  motore1.setSpeed(255); // impostazione massima velocità del motore
  motore1.run(FORWARD);  // rotazione del motore in senso orario
  motore2.setSpeed(255); // impostazione massima velocità del motore
  motore2.run(FORWARD);  // rotazione del motore in senso orario
  motore3.setSpeed(255); // impostazione massima velocità del motore
  motore3.run(BACKWARD); // rotazione del motore in senso antiorario
  motore4.setSpeed(255); // impostazione massima velocità del motore
  motore4.run(BACKWARD); // rotazione del motore in senso antiorario
} 

void Stop()
{
  motore1.setSpeed(0);   // impostazione della minima velocità del motore
  motore1.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
  motore2.setSpeed(0);   // impostazione della minima velocità del motore
  motore2.run(RELEASE);  // rotazione del motore in senso orario
  motore3.setSpeed(0);   // impostazione della minima velocità del motore
  motore3.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
  motore4.setSpeed(0);   // impostazione della minima velocità del motore
  motore4.run(RELEASE);  // stop del motore quando si rilascia il pulsante (sull'applicazione dello smartphone)
}

Buon Making robotico a tutti 🙂

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.