Lezione precedentePagina principale del tutorialLezione successiva

Link di acquisto

Acquista da OSOYOO Acquista negli USA

Indice


1Obiettivo

Questo tutorial si concentra sul miglioramento delle capacità autonome della macchina robot OSOYOO V3 utilizzando il modulo MPU6050 (IMU) per mantenere la direzione desiderata. Il MPU6050, un sensore di movimento a 3 assi, fornisce dati di velocità angolare (giroscopio) e accelerazione lineare (accelerometro), consentendo al robot di correggere attivamente la propria rotta. Questa lezione tratta le tecniche di fusione dei sensori e gli algoritmi di controllo PID per una marcia in linea retta stabile.Macchina robot OSOYOO V3 per Arduino con giroscopio MPU6050

2Componenti necessari

Per questa lezione, hai bisogno del seguente componente. Assicurati di averlo a disposizione prima di iniziare.

N. Immagine Dispositivo Qtà Accessori Link
1 Modulo giroscopio MPU6050 a 3 assi Giroscopio MPU6050 a 3 assi 1 Clicca qui per acquistare

3MPU6050: Principi di funzionamento

Il MPU6050 integra un giroscopio a 3 assi e un accelerometro a 3 assi. Il giroscopio misura la velocità angolare, fornendo informazioni sulla velocità di rotazione del robot attorno ai suoi assi X, Y e Z. L’integrazione di questi dati nel tempo fornisce lo spostamento angolare (ad esempio, l’angolo di imbardata). Tuttavia, i dati grezzi del giroscopio sono soggetti a deriva, accumulando piccoli errori nel tempo. L’accelerometro misura l’accelerazione lineare, utile per determinare l’orientamento del dispositivo rispetto alla forza di gravità. Sebbene stabili sul lungo periodo, gli accelerometri sono molto sensibili alle vibrazioni e ai bruschi movimenti, rendendo i loro dati di orientamento grezzi rumorosi.
Modulo giroscopio MPU6050 montato sulla macchina robot OSOYOO V3

4Installazione hardware

Passo 1: Esegui il montaggio hardware di base come descritto nella lezione 1 della macchina robot. Se hai già completato la lezione 1, lascia tutto com’è.

Assemblaggio del telaio base della macchina robot OSOYOO V3

Passo 2: Fissa saldamente il modulo MPU6050 sul telaio del robot come mostrato di seguito. (Il MPU6050 comunica con Arduino tramite il protocollo I2C, che richiede solo due linee dati: SDA (Serial Data) e SCL (Serial Clock), oltre all’alimentazione (VCC) e alla massa (GND).)

Schema di collegamento del MPU6050 per la macchina robot OSOYOO V3 Arduino

 

5Installazione software

Software Arduino
open-source (IDE)
Logo Arduino IDE Scarica il software qui:
https://www.arduino.cc/en/Main/Software?setlang=en
7-Zip è un programma gratuito
per estrarre file ZIP
Logo 7-Zip Scarica 7-Zip gratuitamente:
https://www.7-zip.org/

1. Configurazione dell’Arduino IDE: Scarica e installa l’ultima versione dell’Arduino IDE da https://www.arduino.cc/en/Main/Software?setlang=en.

Installazione dell'Arduino IDE
2. Download del codice di esempio: Scarica il codice di esempio per la lezione 2 da qui. Estrai il contenuto e troverai un file chiamato v3car-lesson2.ino nella cartella v3car-lesson2. Apri v3car-lesson2.ino nell’Arduino IDE.

Apertura del codice di esempio nell'Arduino IDE

3. Installazione delle librerie
Prima di tutto, scarica i file ZIP delle librerie dai link seguenti:
https://osoyoo.com/driver/2wd/MPU6050_light.zip
https://osoyoo.com/driver/2wd/PID.zip
Non estrarre i file ZIP. Apri l’Arduino IDE -> Sketch -> Includi libreria -> Aggiungi libreria .ZIP. Aggiungi i file ZIP all’Arduino IDE uno alla volta.

Aggiunta di una libreria ZIP nell'Arduino IDE

4. Selezione della scheda e della porta: Collega la OSOYOO Basic Board (compatibile con Arduino UNO) al computer tramite un cavo USB (Importante: assicurati che l’interruttore della macchina robot sia spento e la batteria sia scollegata prima di collegare la scheda al PC). Avvia l’Arduino IDE. Vai su Strumenti > Scheda e seleziona Arduino Uno. Poi vai su Strumenti > Porta e seleziona la porta seriale corretta. Se non sei sicuro, controlla il Gestione dispositivi del tuo sistema operativo.

Selezione della scheda e della porta nell'Arduino IDE

5. Caricamento del codice: Fai clic sul pulsante “Carica” (icona freccia verso destra) per compilare e caricare lo sketch sulla OSOYOO Basic Board.

Caricamento del codice sulla scheda Arduino

6. Verificare se Arduino rileva il MPU6050

Apri il Monitor seriale (in alto a destra nell’Arduino IDE), imposta la velocità di trasmissione su 9600 e dovresti vedere MPU6050 Found! come mostrato di seguito. Congratulazioni! Arduino sta rilevando il MPU6050 — sei pronto per testare la macchina.

Monitor seriale Arduino che mostra MPU6050 Found

Nota: Se vedi “Failed to find MPU6050 chip“, c’è un problema di cablaggio. Assicurati che:
1) I pin VCC/GND/SDA/SCL del MPU6050 siano correttamente collegati allo shield OSOLINK Wi-Fi/BLE I/O come indicato nelle nostre istruzioni
2) I pin A4/A5 e i pin SDA/SCL di Arduino non abbiano altri cavi collegati (nei progetti di line tracking, A4/A5 potrebbero essere già occupati dal sensore di tracking)

6Testare la macchina


Posiziona la macchina sul pavimento e accendi l’alimentazione. La macchina si fermerà brevemente mentre Arduino inizializza il giroscopio. Poi avanzerà in linea retta. Se la spingi con il piede per farla deviare, si correggerà automaticamente tornando alla direzione originale.

7Breve spiegazione dei principi e del codice

1) Come la funzione Move() controlla il movimento e la direzione della macchina?
La macchina robot OSOYOO utilizza lo sterzo differenziale. La funzione move(speedL, speedR) accetta due parametri, speedL e speedR, che rappresentano rispettivamente la velocità di rotazione delle ruote sinistra e destra. Il valore di velocità va da -255 a +255, dove un valore positivo indica rotazione in avanti e un valore negativo rotazione all’indietro. Ad esempio, move(-50, 100) significa che la ruota sinistra ruota all’indietro a velocità 50 mentre la ruota destra ruota in avanti a velocità 100, producendo una svolta netta a sinistra.
2) Introduzione alla programmazione del MPU6050
Dopo l’inizializzazione, il giroscopio MPU6050 traccia costantemente l’orientamento del robot rispetto alla direzione di partenza. Quando la macchina robot devia da questa direzione iniziale, il MPU6050 segnala la deviazione ad Arduino.
Nel nostro codice, la variabile Direction rappresenta l’orientamento della macchina nel momento in cui viene posizionata sul pavimento (si assume che sia rivolta in avanti, quindi si imposta Direction a 0).
Dopo i calcoli nelle prime righe della funzione loop(), otteniamo l’orientamento attuale della macchina nella variabile currentAngle alla riga 129.

3) Introduzione al PID e al codice:

a) L’idea di base: cos’è il PID?
Immagina di guidare un’auto con l’obiettivo di rimanere perfettamente al centro della tua corsia. È esattamente quello che chiediamo al nostro robot: restare sulla linea “diritto avanti”.
Il PID è un algoritmo di controllo che si comporta come un guidatore attento. Pone continuamente tre domande per decidere come sterzare:
  1. P (Proporzionale): Quanto sono lontano dal centro della corsia in questo momento?
  2. I (Integrale): Sono stato costantemente fuori centro negli ultimi istanti?
  3. D (Derivativo): Sto sterzando troppo velocemente verso o lontano dal centro?

Combinando le risposte a queste tre domande, il controllore PID effettua una correzione di traiettoria fluida ed efficiente.

b) Come funziona la funzione PID nel nostro codice
Colleghiamo questa teoria direttamente alla libreria PID_v1.h e al tuo codice.
1. Inizializzazione (in setup()):
// We tell the PID controller what to watch and what to control.
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

Direction = 0; // Our TARGET is to have an angle of 0 degrees.
myPID.SetMode(AUTOMATIC); // Turn on the controller.
  • &Input: Un puntatore alla nostra lettura del sensore. Nel nostro codice, Input è currentAngle. Il controllore PID legge questo valore continuamente.
  • &Output: Un puntatore al nostro risultato. Il controllore PID scrive il valore di correzione calcolato nella variabile Output.
  • &Direction: Un puntatore al nostro obiettivo. Vogliamo andare dritti, quindi lo impostiamo a 0.
2. Il ciclo principale (in loop()):
// 1. We get the sensor reading and put it into the Input variable.
Input = currentAngle; 

// 2. We call the compute function. This is where the PID magic happens!
myPID.Compute(); 

// 3. We use the result to control the motors.
int speedL = baseSpeed - Output;
int speedR = baseSpeed + Output;
move(speedL, speedR);
La funzione myPID.Compute() svolge tutto il lavoro internamente. Ogni volta che viene chiamata (la libreria gestisce il timing in base a SetSampleTime), esegue le seguenti operazioni:
  1. Legge il valore dalla variabile Input (currentAngle).
  2. Calcola l’errore: error = Direction - Input.
  3. Calcola il termine Proporzionale (Kp * error).
  4. Calcola e aggiunge il termine Integrale (Ki * accumulated_error).
  5. Calcola e aggiunge il termine Derivativo (Kd * rate_of_error_change).
  6. Li somma tutti per ottenere il valore di correzione finale.
  7. Scrive questo valore finale nella variabile Output.
Quindi, se Output è +15, significa che il robot ha bisogno di una correzione di 15 unità. La applichiamo rallentando un motore (baseSpeed - 15) e accelerando l’altro (baseSpeed + 15), facendo girare il robot e riducendo il suo errore. Se il robot va perfettamente dritto, Input sarà 0, l’errore sarà 0 e Output sarà 0, quindi entrambi i motori girano a baseSpeed.

4) Come regolare Kp, Ki e Kd per un movimento stabile

  1. Per iniziare: Imposta Ki = 0.0 e Kd = 0.0 nel tuo codice.
  2. Trova un valore di Kp stabile che non oscilli (o quasi). Sarà probabilmente inferiore a 1,5.
  3. (Opzionale ma consigliato) Aggiungi una banda morta di circa 0,5 gradi al tuo loop per ignorare il rumore del sensore.
  4. Una volta che Kp è stabile, aumenta lentamente Kd per ridurre qualsiasi sovraelongazione residua.
  5. Infine, aumenta lentamente Ki per eliminare la deriva a lungo termine.

 

8Considerazioni avanzate e risoluzione dei problemi

Seguendo queste linee guida e comprendendo i principi sottostanti, puoi trasformare la macchina robot OSOYOO V3 in una piattaforma capace di navigazione autonoma, gettando le basi per progetti robotici più avanzati.

Lezione precedentePagina principale del tutorialLezione successiva