Robot Beginner Kit con Arduino – il primo sketch

Ora che il tuo Robot Beginner non è più solo un Kit puoi passare alla sua programmazione, su questo argomento potrai divertirti per molto tempo sperimentando nuovi sketck e altri ne troverai in futuro su questo blog.

connessioni elettriche finite

Da subito ti do un consiglio che ho appreso dopo alcune prove e un po’ di sketch caricati a vuoto su arduino che si comportavano in modo inatteso: utilizza solo batterie alcaline da 1,5v tipo AA, ho provato batterie tipo AAA e ricaricabili di tipo AA ottenendo comportamenti del tutto inattesi con lo sketch proposto.

In particolare con le batterie ricaricabili ( 4,8v ) la tensione non è sufficiente ad alimentare arduino ed i motori per cui non si muove, mentre con le batterie di tipo AAA la corrente erogata è esigua e il robot continuava a girare su se stesso non riuscendo a rilevare correttamente il segnale fornito dal sensore SHARP GP2Y0A21YK.

Prima di caricare lo sketch ricordati di togliere l’alimentazione alla scheda arduino e di scollegare anche il pin Vin tra arduino e il driver motori, con la prima operazione ti metti in sicurezza da eventuali problemi elettrici o conflitti di tensione che possano generarsi tra l’usb di arduino ed il computer evitando di danneggiare l’uno o l’altro; la seconda operazione ti evita che il robot appena ricevuto lo sketch inizia a muoversi sul tavolo rischiando di cadere.

Passiamo allo sketch:

#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

#define SENSIBILITA 200

int SHIR = A5;

void setup()
{
  pinMode( STBY,OUTPUT );
  pinMode( PWMA,OUTPUT );
  pinMode( PWMB,OUTPUT );
  pinMode( AIN1,OUTPUT );
  pinMode( AIN2,OUTPUT );
  pinMode( BIN1,OUTPUT );
  pinMode( BIN2,OUTPUT );

  pinMode( SHIR,INPUT );

  digitalWrite( STBY,HIGH );
}

void loop()
{
  int dist = analogRead(SHIR);
  if ( dist > SENSIBILITA ) { gira(); }
  else                      { avanti(); }
}

void avanti()
{
    digitalWrite( AIN1,HIGH );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,HIGH );
    digitalWrite( BIN2,LOW );

    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}

void indietro()
{
    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,HIGH );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,HIGH );

    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
}

void alt()
{
    analogWrite( PWMA,50 );
    analogWrite( PWMB,50 );

    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,LOW );
}

void gira()
{
  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // INDIETRO x 1/2 secondo
  indietro();
  delay( 500 );

  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // Gira
  digitalWrite( AIN1,LOW );
  digitalWrite( AIN2,HIGH );
  digitalWrite( BIN1,HIGH );
  digitalWrite( BIN2,LOW );

  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );

  delay( 200 );
}

Già nelle prime linee trovi la definizione dei pin di arduino:

linee 01-07: definisci i pin a cui hai collegato il driver per i motori TB6612FNG, se dopo aver uplodado lo sketch il robot gira solo su se stesso, va al contrario o fa cose inattese puoi invertire i pin AIN1 con AIN2 o BIN1 con BIN2 sulla scheda senza dover ricaricare lo sketch;

linea 09: definisci il valore di distanza che il sensore deve rilevare per scansare l’ostacolo, nel precedente articolo hai trovato uno sketch per rilevare questo valore prima di caricare questo sketch;

linea 11: definisci il pin analogico a cui hai collegato il pin di segnale del sensore SHARP GP2Y0A21YK;

linee 15-21: definisci di utilizzare i pin definiti alle linee 01-07 come OUTPUT per inviare segnali al driver motori;

linea 23: definisci di utilizzare il pin A5 come INPUT, pin a cui è collegato il sensore;

linea 25:  il pin STBY deve essere  portato a livello HIGH per consentire alla scheda motori di lavorare;

linea 30: definisci una variabile di tipo integer a cui assegni  il valore letto con il comando analogRead( pin ) dove pin in questo sketch è A5;

linee 31-32:  confronta il vaore letto dal sensore, attraverso il pin A5, e il valore impostato alla linea 09, quando il valore letto dal sensore è maggiore di quello impostato vuol dire che il tuo ostacolo è entrato nel campo visuale del robot, quello che definisci al verificarsi di questa condizione dipende da cosa vuoi che il robot esegua, ad esempio nel mio caso il robot esegue una manovra per girare, ma potresti decidere che il robot è un’ariete e che alla rilevazione dell’obiettivo ci si avventi contro o essere un cagnolino che ti segue per cui intercettare l’ostacolo ( tu ) vuol dire seguimi. In caso contrario ossia se il sensore rileva valori inferiori al 200 vuol dire che l’ostacolo è fuori dal campo visivo ed il suo scopo, nel mio esempio, è avanza fino al prossimo ostacolo;

linee 35-44: definisci la funzione avanti() invocata alla linea 32, lo scopo della funzione è far avanzare il robot;

linee 37 e 38 pongono i pin AIN1 e 2 rispettivamente a 1 e 0 logici ( HIGH e LOW ) questo consente al robot di impostare un verso di rotazione ai motori, analogamente le linee 39 e 40 impostano il verso di rotazione per il secondo motore. Assumi che i motori sia connessi in modo corretto e che il pin di tipo IN1 ( A e B  ) portati a livello logico HIGH impostino il verso di rotazione uguale per entrambi i motori in questa situazione il robot avanza o indietreggia secondo il verso in cui i rispettivi pin sono collegati al driver motori, se il robot non si comporta come desiderato inverti le connessioni sui motori fino ad ottenere quello che desideri.

linee 42-43: imposta per ciascun mootre una velocità di rotazione, i valori possibili sono da 0 a 255 per cui ho impostato un valore un po’ più basso di quello medio (125 media, 100 valore impostato ) questo è il risultato di qualche prova in cui il robot aumentando questo valore correva a tal punto da non far in tempo a fermarsi dopo la rilevazione dell’ostacolo, o in alcuni casi alla frenata scivolava contro l’ostacolo 🙂

linee 46-55: definisci la funzione indietro() questa differisce dalla precedente solo per l’impostazione dei pin di tipo IN1 e IN2 sia A sia B, infatti invertendo il segnale logico su questi il risultato è che i motori invertono la loro rotazione ed il robot va indietro.

linee 57-66: definisci la funzione alt() che ferma il robot, per farlo puoi agire sia sulla velocità dei motori che sull’impostazione dei pin IN1 e IN2, la funzione che ho scritto fa entrambe le cose, porta il segnale PWM sui motori a 0 e il livello logico a LOW per tutti i pin, avrei potuto anche agire sul pin STBY portandolo a LOW, tuttavia non ho seguito questa strada perché nelle funzioni avanti() e indietro() o nella loop() non ho inserito un comando che riportasse a HIGH tale pin per ridare vita ai motori;

linee 68-92: definisci la funzione gira() invocata alla line 31 quando il robot rileva un ostacolo nel suo raggio d’azione, analizzala nel dettaglio:

linee 71-72: all’interno della funzione gira() la prima operazione che esegue è fermare i motori, per farlo invoca la funzione alt() ed attendi un tempo di 500 millisecondi per consentire al robot una corretta frenata;

linee 75-76: inverti la rotta del robot, chiama la funzione indietro() ed attendi 500 millisecondi, un tempo adeguato a far indietreggiare il robot di qualche centimetro, utile sopratutto se l’ostacolo è molto vicino o se non è un ostacolo lineare come un muro ma presenta qualche sporgenza che il robot non può rilevare;

linee 79-80: identiche alle linee 71-72;

linee 83-86: imposta la rotazione dei motori inversa l’uno rispetto all’altro, in modo da ottenere una rotazione verso destra o sinistra, dipende da come hai collegato i motori;

linee 88-89: imposta la velocità dei motori a 100, in questo modo la rotazione sarà simmetrica;

linea 91: attendi un tempo di 200 millisecondi, tempo necessario ad eseguire la manovra di rotazione, il controllo dopo tale tempo ritorna alla funzione loop() che valuta la distanza dell’oggetto e decide se applicare una nuova rotazione o procedere in avanti().

Prima di lasciarti al video demo girato dopo aver caricato lo sketch su arduino voglio darti una dritta o quasi dritta 🙂 a causa della rotazione dei motori e della geometria delle ruote non proprio identica il tuo esemplare potrebbe non andare in linea retta quando va avanti, potresti divertirti a variare le velocità di rotazione dei motori per compensare questa differenza ed in futuro applicare le due rondelle dentellate

Beginner Robot Motori

e degli encoder per correggere via codice le differenze di rotazione 🙂

Buon divertimento.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/robot-beginner-kit-con-arduino-il-primo-sketch.html

162 pings

Skip to comment form

  1. […] di oggi è dedicato ad Anto che ha realizzato il Robot Beginner Kit seguendo i miei articoli ed ha fatto evolvere il […]

  2. […] parte dello sketch è quello che puoi trovare nell’articolo Robot Beginner Kit – il primo sketch a cui è stata aggiunta una funzione melodia() e alcune variabili che lo sketch utilizza per […]

Lascia un commento

Your email address will not be published.

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