Controllo del moto di una smart car con Arduino

Sicuramente ciascuno di noi si è imbattuto almeno una volta in progetti smart finalizzati al monitoraggio e al controllo di sistemi più o meno complessi. Se il nostro sistema è una smart car, ecco che dinanzi a noi si apre uno spettro di possibilità. Che la nostra passione sia la robotica, la meccanica, l’elettronica o la meccatronica, il progetto che affronteremo in questo articolo abbraccia più ambiti e può essere implementato a partire da una struttura di modello semplice che diventa a mano a mano più complessa con l’aggiunta di componenti. In questo articolo capiremo come costruire un progetto sperimentale sfruttando le potenzialità della nota scheda Arduino implementandola a bordo della nostra smart car, unitamente a una serie di moduli sensori che espandono le funzionalità di controllo e monitoragio, e come effettuare un controllo di sistema anche da remoto. La nostra smart car diventa così un ponte tra l’ambiente fisico e quello elettrico digitale, sfruttando le interazioni tra input e output, tra sensori e attuatori. Vedremo come, utilizzando una scheda controller per motori, potremo pilotare due motori DC controllandone i parametri velocità e direzione.  

INTRODUZIONE

La scheda Arduino è una board elettronica programmabile che copre un grande numero di applicativi, per questo è molto utilizzata sia da programmatori esperti che da hobbisti, studenti, makers e progettisti elettronici. Il progetto Arduino, nato presso l’IDII (Istituto di Interaction Design di Ivrea) ha da subito aderito alla filosofia dell’Open Source, infatti sia l’ambiente di sviluppo, le librerie, i codici di base, che gli schemi elettrici delle board, sono totalmente open source. Siamo quindi nell’ambito dell’Open Source Hardware e dell’Open Source Software. Il prototipo che ci accingiamo a costruire viene arricchito di funzionalità attraverso la programmazione della scheda Arduino e l’implementazone di moduli di sensori che consentono di ottimizzare l’interazione dell’oggetto con l’ambiente circostante. In particolare, equipaggeremo la nostra smart car anche di un modulo bluetooth per il controllo da remoto degli spostamenti, sia in termini di monitoraggio di direzione e verso, che in termini di impostazione di funzioni avanzate, come il rilevamento di ostacoli e l’inseguimento di una linea. Vogliamo realizzare un progetto che sia il più possibile ricettivo nei confronti di stimoli sensoriali, il tutto in un ambiente altamente integrato grazie al fatto che in una board come Arduino, tutti i componenti sono integrati in un chip e con un bassissimo consumo di energia. Quest'ultimo è un aspetto essenziale che differenzia i microcontrollori dai potenti computer odierni.

LA SCHEDA ARDUINO

La scheda Arduino UNO e’ dotata di una memoria flash da 32 kbyte, 2 kbyte di sdram ed 1 kbyte di eeprom. Grazie alla memoria flash che mantiene il suo stato anche in assenza di alimentazione, una volta caricato il programma sulla scheda, questo resta memorizzato e disponibile sino a quando non ne viene caricato un altro. La scheda Arduino UNO è dotata di microcontrollore integrato ATmega328, un minicomputer che incorpora un microprocessore da 16 MHz, una memoria RAM da 2 kB, memoria programma di 32kB, i relativi bus, il software di boostrap, ovvero il bootloader che è il software di inizializzazione del microprocessore ed il programma di gestione della connessione usb che consente di collegare la scheda al computer per alimentarla e programmarla. I connettori collegano con l’esterno i pin del microcontrollore e l’alimentazione. I pin sono numerati, in particolare i pin digitali vanno da 0 a 13, mentre quelli analogici da AO ad A5. Tutti i pin funzionano a una tensione operativa di 5V e possono erogare una corrente massima di 40 mA.

Figura 1. La board Arduino Uno utilizzata nel progetto – top view

 

Figura 2. La board Arduino Uno utilizzata nel progetto – bottom view

Una volta caricato il programma all’interno della memoria del microcontrollore, il programma resterà caricato anche se viene tolta l’alimentazione. Prima di scrivere un programma, talvolta è necessario scaricare le librerie per installare le quali si può utilizzare il gestore librerie, al link https://www.arduino.cc/en/Reference/Libraries è possibile trovare le librerie maggiormente utilizzate.

MOTORI DC

Quando si progetta un sistema più o meno complesso bisogna avere chiaro quello che è lo schema cinematico che ci dà indicazioni sul flusso del moto, ad esempio da dove entra la potenza motrice e come questa viene trasmessa dall’albero motore alla ruota. Quindi dovremmo porci in sostanza queste domande: quanti motori sono necessari per realizzare il progetto? Come viene trasmesso il moto dal motore alle ruote? Il primo componente che esaminiamo è di importanza basilare perchè è la fonte del moto di un sistema. Si tratta del motore a corrente continua DC (Direct Current), tipicamente utilizzato in applicazioni prototipali e in ambito hobbistico dove i valori di tensione e corrente sono bassi. Un motore DC è dotato di due morsetti e viene alimentato da una batteria solitamente a 5V, infatti basta sottoporlo a una tensione per porlo in rotazione. All’interno di un motore DC è presente una coppia di magneti permanenti orientati con polarità opposta e situati sul corpo cilindrico. Sull’asse è presente un’elettrocalamita libera di ruotare e alimentata dalle spazzole. Quando viene applicata una tensione ai morsetti, l’elettrocalamita si magnetizza e tende a ruotare per allineare i suoi due poli con quelli opposti dei magneti permanenti. Ogni mezzo giro le spazzole invertono la polarità dell’elettrocalamita allineata con il magnete, per cui l’asse continua a ruotare finchè il motore riceve corrente. Nel nostro progetto utilizziamo due motori DC biassiali.

Figura 3. Motore DC utilizzato nel progetto

L298N DUAL H-BRIDGE MOTOR DRIVER

La scheda controllo motori che utilizziamo nel nostro prototipo è basata sul driver Dual H-Bridge L298N, trova applicazione per pilotare motori elettrici DC e motori passo passo bipolari. Costruttivamente il modulo è composto da due connettori laterali cui vengono collegati i motori, e da connettori frontali per collegare l’alimentazione e le connessioni logiche, ha dimensioni notevolmente piccole ed è estremamente compatto, misura infatti solo 43 x 43 x 28 mm e ha un peso di soli 25 grammi. Ciascun ponte può essere abilitato o disabilitato tramite il relativo piedino di enable per controllare e gestire due motori DC a spazzole o un motore passo passo a quattro fasi, direttamente da Arduino o altri microcontrollori. L’enA è il ponticello di abilitazione del motore A, mentre l'enB è il ponticello di abilitazione del motore B, le connessioni in1, in2, in3 e in4 servono per la gestione degli stati dei motoriduttori. Quindi i piedini di enable, rispettivamente enA ed enB, attivano/disattivano (HIGH/LOW) i motori A e B e, se connessi ad una porta PWM, ne controllano anche la velocità. Attraverso il modulo L298N è possibile ottenere un discreto livello di controllo sui numeri di giri agendo sul tempo di attivazione e attraverso le porte enA ed enB utilizzate con tecnica PWM (Pulse Width Modulation), è possibile controllare anche la tensione erogata a ciascuno dei due motori, compensando così eventuali differenze di efficienza. Si ottengono in questo modo performance simili su entrambi i motori e una riduzione del gap prestazionale.

Figura 4. La scheda Dual H-Bridge Motor Driver L298N

 

Figura 5. Layout dello schema delle connessioni del Dual H-Bridge Motor Driver con le dimensioni caratteristiche

I collegamenti laterali di enable (enA ed enB) e input logici (in1, in2, in3, in4) servono ad abilitare e gestire i motori. Dallo schema delle connessioni, gli output A e output B sono i collegamenti che permettono l’alimentazione dei due motoriduttori che forniscono il moto alla smart car. Invertendo il collegamento dei due morsetti nei rispettivi output, cambiano i versi di rotazione dei motori, infatti sia Arduino che il driver L298N determinano il senso di marcia dei motori. Inoltre sia la velocità che il senso di marcia possono essere modificati e regolati in base alle condizioni dettate dal codice. Il modulo può funzionare con tensioni comprese nel range tra i 5V e i 35V e ogni uscita fornisce 2A di corrente.

UN CASO APPLICATIVO: GESTIONE DEI MOTORI DC CON ARDUINO E IL MOTOR CONTROLLER L298N

Per passare al lato software, per prima cosa procediamo con l’installazione del programma, ovvero l’IDE di Arduino, dove andremo a scrivere e caricare il codice. L’IDE (Integrated Development Environment) di Arduino è un ambiente di sviluppo integrato totalmente open source e pensato per funzionare sui diversi sistemi operativi, Linux, Windows e Mac OS. Ad installazione completata si può collegare la scheda all’usb per terminare la configurazione dei driver. All’interno del microcontrollore è precaricato il bootloader, un software che ci permette di caricare i programmi. Possiamo utilizzare la scheda Arduino per controllare il motor driver L298N che a sua volta serve per controllare i due motoriduttori DC. E’ importante sottolineare a questo punto che proprio grazie agli shield la fase di progettazione viene resa più fluida perchè con delle schede accessorie si possono espandere le funzionalità della scheda Arduino, in questo caso specifico controllare e pilotare due motori in modo indipendente e che possono ruotare in entrambi i versi di rotazione senza la necessità di dover invertire la tensione di alimentazione. Abbiamo descritto precedentemente il funzionamento del driver del motore che è in grado di gestire due motori in corrente continua o un motore passo passo. Il driver L298N gestisce i due motori che chiameremo motore A e motore B e che andremo a collegare ai connettori posti a destra e a sinistra del Dual H-Bridge Motor Driver L298N. Dopo aver collegato il driver, la scheda Arduino e i due motori DC, arrivati a questo punto bisogna collegare la scheda Arduino al pc tramite il cavo USB e caricare lo sketch tramite l’IDE di Arduino, ovvero il file di codice, che avrà estensione .ino. Programmiamo ora la nostra car inizialmente in modo da consentirle di eseguire automaticamente e senza controllo remoto gli spostamenti programmati, siamo nella fase in cui

istruiamo e programmiamo Arduino per far compiere ai motori determinate operazioni non appena la macchina viene accesa. Procediamo quindi con l’inizializzazione dei pin:

// motor A

int enA = 10;

int in1 = 9;

int in2 = 8;

// motor B 

int in3 = 7;

int in4 = 6;

int enB = 5;

Nel blocco void setup () inseriamo le istruzioni di configurazione da fare all’accensione, dichiariamo quindi i pin inseriti sopra, come output:

void setup ()

{

  // set the motors as output

  pinMode(enA, OUTPUT);

  pinMode(enB, OUTPUT);

  pinMode(in1, OUTPUT);

  pinMode(in2, OUTPUT);

  pinMode(in3, OUTPUT);

  pinMode(in4, OUTPUT);

} 

A questo punto inizia il programma principale, nel loop andiamo a effettuare i test dei due motori alimentati dal driver:

void loop ()

{

  // starts the motor A

  digitalWrite(in1, HIGH);

  digitalWrite(in2, LOW);

  // set the speed to 150 (0~200)

  analogWrite(enA, 150);

 

  // starts the motor B

  digitalWrite(in3, HIGH);

  digitalWrite(in4, LOW);

  // set the speed to 150 (0~200)

  analogWrite(enB, 150);

 

  delay(3000);

 

Possiamo invertire il senso di rotazione dei motori:

 // change the direction of the motors

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);  

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH); 

 

   delay(3000);

 

Per spegnere i motori scriviamo questo blocco:

 // turn off all motors

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);  

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);

 

  delay(2000);

Se in1 è HIGH ed in2 è LOW, il motore A gira in senso orario, se in1 è LOW ed in2 è HIGH, il motore A gira in senso antiorario. Se in3 è HIGH ed in4 è LOW, il motore B gira in senso orario, se in3 è LOW ed in4 è HIGH, il motore B gira in senso antiorario. La fase di riaccensione dei motori è caratterizzata da un aumento graduale di potenza che possiamo ottenere mediante l’accelerazione:

 // rekindles motors

  digitalWrite(in1, LOW);

  digitalWrite(in2, HIGH);  

  digitalWrite(in3, LOW);

  digitalWrite(in4, HIGH); 

 

  // accelerates from 0 to 200 

  for (int i = 0; i < 201; i++)

  {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(30);

  } 

 

  // decelerates 

  for (int i = 200; i >= 0; --i)

  {

    analogWrite(enA, i);

    analogWrite(enB, i);

    delay(30);

  }

// turn off all motors

  digitalWrite(in1, LOW);

  digitalWrite(in2, LOW);  

  digitalWrite(in3, LOW);

  digitalWrite(in4, LOW);  

 

  delay(2000);

}

L'ultima parentesi graffa chiude il blocco del ciclo void loop. In questo listato possiamo subito notare due blocchi base: il blocco void setup () nel quale vengono scritte le istruzioni di configurazione da fare all’accensione e il blocco void loop () in cui si scrive il programma principale. Le funzioni void setup () e void loop () sono dei veri e propri blocchi di codice, la funzione setup contenente impostazioni e parametri iniziali viene eseguita all’inizio, a questa segue la funzione loop in cui è scritto il programma principale eseguito ciclicamente finchè non viene resettata la scheda tramite il pulsante di reset o tolta l’alimentazione. Come è facile notare, i blocchi di programma sono racchiusi in parentesi graffe. La funzione digitalWrite () consente la variazione dello stato di un pin tra HIGH e LOW, infatti digitalWrite è una funzione usata per trattare segnali digitali che possono assumere solo valori logici e quindi per comandare attuatori mediante una logica LOW/HIGH. Con la funzione delay imponiamo una pausa, ad esempio delay 1000 significa che abbiamo imposto una pausa di 1 secondo, dal momento che [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3529 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

9 Commenti

  1. Avatar photo Filippo Casella 21 Febbraio 2020
  2. Avatar photo Giordana Francesca Brescia 21 Febbraio 2020
    • Avatar photo Filippo Casella 24 Febbraio 2020
      • Avatar photo Giordana Francesca Brescia 24 Febbraio 2020
  3. Avatar photo KTechno 23 Febbraio 2020
  4. Avatar photo Adriano Gandolfo 23 Febbraio 2020
    • Avatar photo Giordana Francesca Brescia 24 Febbraio 2020
  5. Avatar photo Fabrizio Giani 24 Febbraio 2020
  6. Avatar photo Alfredo.Centinaro 28 Febbraio 2020

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend