Arduino + IMU - Arduino... · 2015-03-02 · Arduino + IMU In questa lezione cercheremo di...

5
Arduino + IMU In questa lezione cercheremo di utilizzare un Arduino UNO e un IMU (giroscopi e accelerometri) per attivare dei motori a spazzole (brushed) a seconda dell'inclinazione dei sensori, in modo da simulare un mini multi-rotore. In particolare useremo dei sensori MPU6050 o compatibili. Le librerie per utilizzare questi sensori con Arduino sono scaricabili all'indirizzo: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino /MPU6050 Una volta installate le librerie nell'IDE Arduino, connettiamo l'IMU MPU6050 ad Arduino UNO seguendo il pinout che si legge sopra al sensore:

Transcript of Arduino + IMU - Arduino... · 2015-03-02 · Arduino + IMU In questa lezione cercheremo di...

Arduino + IMU

In questa lezione cercheremo di utilizzare un Arduino UNOe un IMU (giroscopi e accelerometri) per attivare dei motoria spazzole (brushed) a seconda dell'inclinazione deisensori, in modo da simulare un mini multi-rotore. Inparticolare useremo dei sensori MPU6050 o compatibili. Lelibrerie per utilizzare questi sensori con Arduino sonoscaricabili all'indirizzo:https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

Una volta installate le librerie nell'IDE Arduino,connettiamo l'IMU MPU6050 ad Arduino UNO seguendo ilpinout che si legge sopra al sensore:

Per alcuni tipi di MPU6050 sono necessarie solo 4connessioni ad Arduino, altre invece ne richiedono di più.In questo caso, come da foto, nel abbiamo 6:

cavo rosso - 5V: da connettere ai 5V di Arduino UNOcavo nero – GND: da connettere al GND (negativo)cavo arancione – 3.3V: da connettere ai 3.3vcavo verde – SCL: da connettere al pin A5cavo giallo – SDA: da connettere al pin A4cavo blu – INT: da connettere al pin 0 (non A0)

Le prime tre connessioni in elenco servono ovviamente peralimentare l'IMU in questione, questo particolare sensorerichiede sia i 5V che i 3.3V, altri solo uno dei due. Il GND,ovvero il negativo o massa è richiesto per tutti i sensori.L'SDA e SCL sono le connessioni che servono per farcomunicare Arduino UNO con i sensori e viceversa. E' untipo di connessione che si dice “a BUS” ed in particolarei2c. L'i2c è molto diffuso perché consente di usare solo 2cavi per più sensori messi in serie. Il Master (in questocaso Arduino) invia dei segnali di clock tramite il cavo SCLe identifica un sensore (Slave) che gli risponde inviando idati richiesti tramite cavo SDA. Per poter riconoscere piùsensori sullo stesso cavo ovviamente è necessario unindirizzo. Infatti ogni sensore ha il proprio che il Masterdovrà specificare nel momento della richiesta dei dati. Inquesto caso, il sensore MPU6050 che troviamo online puòavere 2 indirizzi diversi: 0x68 e 0x69. Se eseguendo ilcodice di esempio non riusciamo a comunicare o a riceveredati dal sensore molto probabilmente dovremmo cambiarel'indirizzo i2c al momento della creazione dell'oggettoMPU6050. Più facile a farsi che a dirsi.

Quindi dopo aver collegato tutto avremo qualcosa di simile:

Facciamo partire l'IDE Arduino ed apriamo il programma diesempio dalla libreria MPU6050 con nome MPU6050_DMP6tramite il menu File → Examples → MPU6050 → Examples→ MPU6050_DMP6.Non spaventatevi dalla quantità di codice scritto in questoesempio. E' ricco di commenti (scritte di colore grigio) inmodo da aiutare a comprendere ed utilizzare al meglio ilsensore IMU. Nelle prime righe di codice troveremo delleindicazioni su che tipo di OUTPUT vogliamo avere dalsensore. Per leggere i valori di YAW, PITCH e ROLL dalsensore dovremo de-commentare (levare le doppie slashprima della riga) la riga:

//#define OUTPUT_READABLE_YAWPITCHROLL

in modo che diventi:

#define OUTPUT_READABLE_YAWPITCHROLL

Connettendo ora Arduino al computer e inviando il codicecosì com'è, potremo leggere i valori dati dal sensoreaprendo la finestra del monitor Seriale tramite il menuTools e selezionando come velocità 115200 in basso adestra. Inserendo un qualsiasi carattere da tastiera edando invio nella finestra monitor seriale, inizieranno ascorrere i valori dei sensori che cambieranno al ruotare delsensore stesso. Siccome i valori di tale sensore sono salvatinella variabile array ypr[], possiamo semplicementeazionare un motore connesso ad esempio al pin 10 (pindigitale PWM) se una certa soglia di valore è superata.Ipotizzando di voler azionare il motore ed aumentarevelocità in base all'inclinazione sull'asse Y (quindi sull'assedel Pitch) dovremo solo mappare i valori letti dalla variabileypr[1] in valori da 0 a 255 ed inviarli al pin 10, sapendoche i valori che restituisce il sensore sull'asse delle Y sono180 e vanno da -90 a +90.

Quindi il codice che dovremo scrivere per il primo motoresarà:

analogWrite( 10, map( ypr[1], -90, 0, 255, 0 ) );

Ovviamente questo non è che un esempio che non utilizzail sistema PID per la stabilizzazione, diciamo che abbiamoridotto all'osso l'operazione che compie un flight controller,ma questo esercizio serve per capire cosa effettivamentesuccede all'interno di un flight controller.