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.
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.
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.
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.
Tutte le parti sono commerciali, ma il telaio su cui monto tutte le parti lo è? Oppure è stato sviluppato ad-hoc per questo prototipo? Mi piacerebbe in ogni caso che fosse messo a disposizione di chi come me potrebbe voler realizzarlo, magari montandolo con il figlio 🙂
Grazie
Ciao Filippo, è un kit completo per smart car, non ci sono saldature da dover effettuare, il telaio è customizzato per questa applicazione specifica.
Ok mi aveva ingannato il titolo del paragrafo “Prototipo” , alla fine è la costruzione di un kit, in cui l’unica cosa customizzabile è il SW.. Lo si può comprare completo su qualche sito? Ho visto che ci sono tante varianti sul web, se uno cerca Smart Car 2WD..
Grazie
Si, cercando sul web si trovano diverse soluzioni, anche con 4 ruote. Questo modello, chiamato Quimat smart car, si può trovare anche su Amazon. Ti segnalo anche il sito robotstore.it, ci sono kit di robotica educativa molto carini.
Articolo interessante, proprio quello che sto trattando io:
modelli in scala per analisi comportamentale sia durante il montaggio ma soprattutto durante la guida con appositi devices e sensori.
Il sistema elettronico basato su una rete di board Arduino e Esp8266 serve allo sviluppo di metodi per chi ha problemi cognitivi e disabilità fisiche.
L’estensione è di trasferire poi devices e sensori nel mondo reale.
Ottimo articolo, completo che permetterà anche chi è digiuno di robotica di avvicinarsi a questa materia. Il modulo motore L 298, era tra l’altro citato in un precedente articolo/filmati https://it.emcelettronica.com/motori-e-arduino-come-pilotarli-e-gestirli
La presenza di esempi di codice dovrebbe essere sufficiente per permettere di creare il proprio programma. Per quanto riguarda l’assemblaggio, come ha scritto dall’autrice non presenta problemi, è possibile usare i normali cavi già dotati di intestazioni cavetti.
Grazie Adriano 🙂 Il progetto è molto interessante anche perché rivolto non solo a hobbisti e makers ma anche alla sfera della robotica ed elettronica educativa.
Trovo molto utile questo tipo di progetti per chi è alle prime armi con l’elettronica e la programmazione di una scheda. Arduino è una board molto versatile e adatta a più scopi.
Complimenti per l’articolo.
Quello dell’auto è il progettino che i miei alunni preferiscono. Oltre a provarla a realizzare con un kit arduino con i miei alunni più grandi, spesso uso i veicoli con micro:bit programmati con un linguaggio a blocchi grafici simil Scratch. Ottimo sia per fare coding che per appassionare i più giovani al mondo della programmazione.