“Vicenza Thunders”: robot omnidirezionali che giocano a calcio!

Il team "Vicenza Thunders" nasce nel 2010 come un progetto avviato in ambito scolastico, indirizzato ad avvicinare i ragazzi al mondo della robotica: la RoboCup, competizione a livello nazionale ed internazionale di robotica. Grazie alla loro creatività e alla loro passione per l’elettronica, Riccardo Ertolupi e Daniele Spreggiaro fondano il team con l'intenzione di partecipare a queste gare ottenendo, nel 2011 e nel 2012, il primo ed il secondo posto nelle competizioni di Riva Del Garda e di Catania nella categoria "Soccer Lightweight" con due squadre di robot diverse. In queste gare si affrontano due robot per squadra che giocano a calcio con una speciale pallina con degli emettitori infrarossi al suo interno, lo scopo è lo stesso del calcio: fare goal nella porta degli avversari.

Nel 2012 un'altra importante occasione si presenta ai Vicenza Thunders: l'opportunità di partecipare alla RomeCup, manifestazione annuale che si tiene a Roma, valida per la qualificazione ai mondiali nella categoria "Soccer Open League". Per questa occasione costruiscono altri due robot e ottengono il pass per partecipare ai campionati mondiali; riuscendoci soprattutto grazie ad un’accurata e minuziosa fase di progettazione e realizzazione di due robot, questa volta, basati sulla board Arduino ed al generoso supporto economico del padre del microprocessore: Federico Faggin. Per andare ai mondiali il team decise di puntare in alto riprogettando completamente i robot, ma nel frattempo giunse la cattiva notizia che, nonostante la pressione fatta sui vertici scolastici, ai "Vicenza Thunders" non era stata concessa l’opportunità di partecipare alla competizione mondiale in Messico a causa della contemporaneità con gli esami di stato. Tuttavia il team non si é per niente scoraggiato e ha rielaborato il progetto dei nuovi robot, puntando molto sull'estetica, oltre che sulla potenza, e ha presentato alla fiera "Makers Italy" il nuovo modello,  i Vicenza Thunders 2.0, come si può vedere in questo video dimostrativo girato proprio in fiera a Milano.

VISIONE GENERALE DEL SISTEMA:

Passando ad aspetti più tecnici, gli ultimi due robot costruiti sono uguali tra loro perchè nei “Vicenza Thunders” non ci sono un attaccante e un difensore fissi, ma i robot si scambiano i ruoli in modo dinamico, a seconda di come si evolve la partita. Per fare ciò e per scambiarsi dati riguardanti la posizione e la distanza dalla pallina, i due robot usano dei moduli bluetooth di classe 2, questa è una cosa che li distingue dalla maggior parte dei robot avversari e che rappresenta il punto di forza del team Vicenza Thunders, oltre alla loro impressionante velocità nei movimenti.

Premettiamo che la speciale pallina usata nelle competizioni è provvista di venti led infrarossi distribuiti in modo uniforme su tutta la sua superficie, così da irradiare in tutte le direzioni, in particolare, essa emette luce infrarossa modulata a 38 kHz in modo che i robot possano distinguerla dalla luce ambientale. Per individuare questa pallina i “Thunders” dispongono di 24 ricevitori infrarossi posti lungo il perimetro del robot e che gli garantiscono di avere una visone a 360° dello spazio circostante.

Per orientarsi nel campo di gioco, invece, ogni robot  monta un magnetometro che permette di vedere l'angolo di rotazione rispetto al nord magnetico della terra e quindi di poter calcolare anche l’angolo di rotazione rispetto al campo di gioco con una precisione relativamente buona. Questo sensore, però, permette ai robot di sapere solo la direzione in cui muoversi e non l'effettiva posizione in campo, infatti, per fare ciò ogni robot ha quattro sensori ad ultrasuoni posti 90° l’uno dall’altro per misurare la distanza dai muretti che delimitano il campo, per poi calcolare la posizione in campo con un margine di errore accettabile.

Inoltre, per permettere all’utente di interfacciarsi con il sistema in modo semplice ed intuitivo, i robot sono provvisti di un ampio display grafico LCD 128x64 con retroilluminazione a led RGB e di una tastiera da venti tasti. Questo permette di scegliere le varie funzioni da far fare al robot, di tarare i sensori e di leggere i valori provenienti da essi.

Per quanto riguarda i movimenti dei “Thunders”, essi sfruttano quattro motori DC totalmente indipendenti tra loro e posizionati su due assi perpendicolari tra loro. I motori usati sono piuttosto potenti e veloci, fanno 500 RPM e con una coppia di 5 kg-cm, perciò richiedono molta energia e quindi per controllarli sono stati usati quattro potenti ponti ad H integrati che permettono di controllare la velocità e il senso di rotazione dei motori mediante segnali PWM generati da un microcontrollore. Questi vanno ad agire su quattro ruote omnidirezionali progettate e realizzate dai membri del team con la collaborazione di aziende del settore. Queste ruote particolari conferiscono all’automa la capacità di spostarsi in ogni direzione del piano semplicemente coordinando la velocità di rotazione di ciascuna ruota.

Per l’alimentazione dei robot viene usata una batteria LiPo da tre celle e 2000mAh perché è un ottimo compromesso tra peso, dimensioni e la potenza erogabile.

I nuovi “Thunders” sono controllati ciascuno da un Arduino MEGA2560 e da tre ATmega328 (per intenderci sono i microcontrollori che sono usati nell’Arduino UNO) e quindi, è come se ogni robot montasse in totale quattro Arduino, tutti intercomunicanti fra loro via seriale. L’Arduino Mega2560 ha il compito di gestire tutto il sistema in generale, quindi i motori, il display, la tastiera, la connessione bluetooth con l'altro robot e la comunicazione con gli altri microcontrollori. Contemporaneamente due dei tre ATmega328 montati sul robot vengono utilizzati per leggere i dati relativi ai ricevitori infrarossi; mentre l’altro ATmega ha la funzione di individuare la posizione nello spazio del robot tramite la lettura dei quattro sensori di distanza ad ultrasuoni e del sensore di bussola. La motivazione della scelta di un sistema formato da più microcontrollori è semplice e intuitiva: i sensori che vengono gestiti dagli ATmega328 hanno bisogno di letture continue per ridurre al minimo gli errori, e inoltre questo permette anche di avere un sistema multitask e quindi in grado di velocizzare tutte le operazioni.

COME MUOVERSI CON LE RUOTE OMNIDIREZIONALI?

Dopo un checkout generale della sensoristica, degli attuatori e di tutti i vari dispositivi utilizzati, ci soffermiamo in particolare sul sistema che permette al robot di muoversi in ogni direzione del piano. Cerchiamo, dunque, di capire come si comportano le ruote omnidirezionali e come è possibile sfruttare le loro caratteristiche, perché per fare muovere il robot in una direzione bisogna tener conto della somma dei momenti prodotti da tutte le quattro ruote.

In questo caso sono state utilizzate quattro ruote sfasate tra loro di 90° (qui si può vedere come è fisicamente la base di un robot). Le ruote omnidirezionali progettate dal team sono fatte come delle normali ruote ma, in aggiunta, hanno delle rotelline che ruotano liberamente aventi asse perpendicolare rispetto a quello della ruota e queste permettono alla ruota di scorrere anche in altre direzioni. Queste particolari ruote sono fissate ai motori citati in precedenza che, accoppiati con queste ruote dal diametro di circa 8 cm, permettono ai “Thunders” di essere molto veloci.

Nello schema qui affianco sono spiegate le combinazioni per ottenere i movimenti basilari e i più facilmente intuibili. Dalle figure si nota chiaramente come c'è la necessità di poter controllare il verso di rotazione e la velocità di ogni ruota e quindi di ogni singolo motore. Di conseguenza ogni motore avere il suo circuito di controllo composto da dei driver che nel caso dei "Thunders 2.0" sono quattro VNH2SP30, che sono dei ponti ad H integrati prodotti dalla STMicroelectronics e che hanno la particolarità di essere SMD e di poter erogare fino a 30A sul carico senza surriscaldarsi grazie alle adeguate zone di dissipazione del calore che gli sono state progettate nelle schede. 

CIRCUITO ELETTRICO PER GESTIRE I QUATTRO MOTORI:

Nello schema sottostante si può vedere il circuito dedicato a ciascuno di questi integrati, per comodità consideriamo solo un VNH2SP30 poiché il circuito relativo agli altri driver è identico, cambiano solo i pin di comando provenienti dall'Arduino. Si nota che dal microcontrollore arrivano solo due linee di comando, una che va a finire sul pin denominato "PWM" e che serve per gestire con la velocità di rotazione del motore e che è appunto un segnale PWM che può avere una frequenza massima di 20kHz. Mentre l'altro pin dell'Arduino serve per controllare il senso di rotazione del motore: questa linea va diretta all'ingresso A dell'integrato, mentre arriva all'ingresso B attraverso una porta NOT, così che i due ingressi del ponte ad H abbiano sempre livelli logici opposti e questo è molto comodo perchè permette di risparmiare un'uscita del microcontrollore.

Passando al circuito specifico dell'integrato si notano i pin di alimentazione di GND e di VCC, che in questo integrato può essere al massimo di 41 V; poi c'è il pin di Current Sensing (CS) che fornisce un'uscita analogica proporzionale alla corrente che sta assorbendo il carico, nel caso dei “Thunders” è stato lasciato libero perchè non c'era interesse particolare per questo dato. Ci sono inoltre due pin un po' particolari che si chiamano "enable/diagnostic" e hanno due funzioni: normalmente sono degli input che abilitano o meno il funzionamento dei semi ponti ad H relativi agli ingressi e alle uscite A e B (funzione enable); mentre se ci sono dei problemi sull'integrato fungono da segnalatori del guasto (funzione diagnostic). In questo circuito sono stati usati solo come enable collegandoli ad una resistenza di pull-up, visto che l'applicazione è piuttosto semplice e nel caso ci fossero problemi sarebbero comunque facilmente individuabili.

Arriviamo dunque alla parte finale di questa spiegazione sull'uso del VNH2SP30: il collegamento delle uscite, con i motori. Infatti, c'è da prestare molta attenzione a quei diodi che vanno a VCC e a GND, a prima vista magari potrebbero sembrare inutili, ma in realtà sono fondamentali per evitare grossi problemi. Premettiamo che i motori hanno una componente induttiva e che quindi ad ogni variazione di corrente cui sono sottoposti prodocono delle tensioni inverse che possono danneggiare il resto dei componenti elettronici presenti nel circuito. Quei diodi servono dunque a "tagliare" questi picchi di tensione così da evitare danni al driver e agli altri integrati; in genere per svolgere questa funzione vengono usati diodi ultra fast che si polarizzano in tempi più brevi. In commercio si trovano anche altri tipi di driver motori nei quali questi diodi di ricircolo sono già integrati nel chip e in quel caso, quindi, non occorre porsi questo problema.

SOFTWARE PER GESTIRE I QUATTRO MOTORI:

Vediamo ora il software usato per la gestione dei movimenti base del robot, consideriamo tutti gli ingressi PWM dei driver collegati assieme al pin 2 dell'Arduino così da poter gestire tutte le velocità dei motori con un singolo pin; invece i quattro ingressi dei ponti ad H che controllano il verso di rotazione dei quattro motori sono collegati rispettivamente ai pin 3, 4, 5 e 6. Per capirci, nella figura dei movimenti presente sopra, denominiamo il motore numero 1 quello in alto a destra, il motore 2 quello in basso a destra, il 3 quello in basso a sinistra e il motore 4 quello in alto a sinistra. Si nota che per alcuni movimenti è necessaria che alcune ruote stiano ferme e con il circuito sopra illustrato non c'è altro modo che applicare un segnale PWM con duty cycle al 50% sui pin d’ingresso dei driver relativi ai motori che si desidera bloccare. Così facendo la ruota continua ad andare avanti e indietro molto velocemente e quindi sta ferma immobile. Qui sotto è riportato il codice riguardante la singola funzione per scegliere i movimenti da far fare al robot, si vede che è un metodo void e quindi non ritorna alcun dato, e si nota anche che riceve due parametri in ingresso: "direction", che viene usato per scegliere la direzione in cui spostarsi, e "speed" che regola il duty cycle del segnale PWM che va ai motori. Nel programma che segue è predisposto per i dieci movimenti più semplici, è chiaramente intuibile che per fermare il robot è sufficiente porre la variabile speed uguale a zero.
/*
 La variabile speed può assumere valori da 0 a 255 è va a regolare
 la velocità di rotazione di tutti i motori. 

 La variabile direction può assumere i seguenti valori:
 - 0 per far muovere il robot in avanti rispetto all'asse 0;
 - 1 per far muovere il robot in avanti rispetto all'asse a 45°;
 - 2 per far muovere il robot in avanti rispetto all'asse a 90°;
 - 3 per far muovere il robot in avanti rispetto all'asse a 135°;
 - 4 per far muovere il robot indietro rispetto all'asse 0;
 - 5 per far muovere il robot indietro rispetto all'asse a 45°;
 - 6 per far muovere il robot indietro rispetto all'asse a 90°;
 - 7 per far muovere il robot indietro rispetto all'asse a 135°;
 - 8 per fare ruotare il robot su se stesso in senso orario;
 - 9 per fare ruotare il robot su se stesso in senso antiorario.
*/
 
void basicMovoment(byte speed, byte direction)
{
 // cambia il duty cycle del segnale PWM che regola la velocità
 analogWrite(2,speed);
 
 //sceglie in movimento da fare con la funzione switch
 switch(direction)
 {
  // direzione 0 -> i motori 1 e 2 girano in avanti 
  // e i motori 3 e 4 all'indietro
  case 0:
  {
   analogWrite(3,255);
   analogWrite(4,255);
   analogWrite(5,0);
   analogWrite(6,0);
  }
  break;
 
  // direzione 1 -> i motori 1 e 3 stanno fermi, 
  // il motore 2 gira in avanti e il 4 all'indietro
  case 1:
  {
   analogWrite(3,127);
   analogWrite(4,255);
   analogWrite(5,127);
   analogWrite(6,0);
  }
  break;
 
  // direzione 2 -> i motori 2 e 3 girano in avanti 
  // e i motori 1 e 4 all'indietro
  case 2:
  {
   analogWrite(3,0);
   analogWrite(4,255);
   analogWrite(5,255);
   analogWrite(6,0);
  }
  break;
 
  // direzione 3 -> i motori 2 e 4 stanno fermi, 
  // il motore 3 gira in avanti e l'1 all'indietro
  case 3:
  {
   analogWrite(3,0);
   analogWrite(4,127);
   analogWrite(5,255);
   analogWrite(6,127);
  }
  break;
 
  // direzione 4 -> i motori 3 e 4 girano in avanti 
  // e i motori 1 e 2 all'indietro
  case 4:
  {
   analogWrite(3,0);
   analogWrite(4,0);
   analogWrite(5,255);
   analogWrite(6,255);
  }
  break;
 
  // direzione 5 -> i motori 1 e 3 stanno fermi, 
  // il motore 4 gira in avanti e il 2 all'indietro
  case 5:
  {
   analogWrite(3,127);
   analogWrite(4,0);
   analogWrite(5,127);
   analogWrite(6,255);
  }
  break;
 
  // direzione 6 -> i motori 1 e 4 girano in avanti
  // e i motori 2 e 3 all'indietro
  case 6:
  {
   analogWrite(3,255);
   analogWrite(4,0);
   analogWrite(5,0);
   analogWrite(6,255);
  }
  break;
 
  // direzione 7 -> i motori 2 e 4 stanno fermi, 
  // il motore 1 gira in avanti e il 3 all'indietro
  case 7:
  {
   analogWrite(3,255);
   analogWrite(4,127);
   analogWrite(5,0);
   analogWrite(6,127);
  }
  break;
 
  // direzione 8 -> tutti i motori girano all'indietro
  case 8:
  {
   analogWrite(3,0);
   analogWrite(4,0);
   analogWrite(5,0);
   analogWrite(6,0);
  }
  break;
  
  // direzione 9 -> tutti i motori girano in avanti
  case 9:
  {
   analogWrite(3,255);
   analogWrite(4,255);
   analogWrite(5,255);
   analogWrite(6,255);
  }
  break;
  
  // se viene inserito un valore errato nella variabile 
  // direction, la funzione non fa niente
  default: return;
 }
}

Ora i ragazzi del "Vicenza Thunders” team stanno portando avanti molti nuovi progetti, occupandosi anche di progettare e sviluppare sistemi elettronici e robotici personalizzati, principalmente basati su Arduino e altri microcontrollori che sfruttano core simili. Per vedere altre immagini o avere più informazioni riguardo i "Vicenza Thunders", i loro robot e i loro progetti si può visitare la loro pagina facebook.

 

Scarica subito una copia gratis
Tags:

4 Commenti

  1. Avatar photo Antonello 18 Febbraio 2013
  2. Avatar photo Vicenza Thunders 18 Febbraio 2013
  3. Avatar photo Vicenza Thunders 18 Febbraio 2013
  4. Avatar photo Vicenza Thunders 27 Febbraio 2014

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend