- Ce este un accelerometru și un senzor giroscopic?
- Accelerometru MPU6050 și modul senzor giroscopic
- Componente necesare
- Diagrama circuitului
- Explicație de programare
MPU6050 este un IC 3 axe accelerometru și un giroscop cu 3 axe combinate într - o singură unitate. De asemenea, găzduiește un senzor de temperatură și un DCM pentru a efectua o sarcină complexă. MPU6050 este utilizat în mod obișnuit în construcția de drone și alți roboți la distanță, cum ar fi un robot auto-echilibrat. În acest proiect vom construi un Protractor digital folosind MPU6050 și Arduino. Aici se utilizează un servomotor pentru a afișa unghiul pe o imagine a raportorului. Arborele servomotor este atașat cu un ac care se va roti pe imaginea raportorului pentru a indica unghiul care este afișat și pe un afișaj 16xLCD. Înainte de a intra în detalii, să aflăm despre senzorul giroscopului.
Ce este un accelerometru și un senzor giroscopic?
Un accelerometru este folosit pentru a măsura accelerația. De fapt, simte atât accelerația statică, cât și cea dinamică. De exemplu, telefoanele mobile folosesc senzorul accelerometrului pentru a simți că mobilul este în modul peisaj sau în modul portret. Am folosit anterior Accelerometer cu Arduino pentru a construi multe proiecte precum:
Un giroscop este folosit pentru a măsura viteza unghiulară care utilizează gravitația pământului pentru a determina orientarea obiectului în mișcare. Viteza unghiulară este rata de schimbare a poziției unghiulare a unui corp rotativ.
De exemplu, telefoanele mobile de astăzi folosesc senzori giroscopici pentru a juca jocuri mobile în funcție de orientarea telefonului mobil. De asemenea, setul cu cască VR folosește senzorul giroscopului pentru a avea vizualizări în orientare 360
Deci, în timp ce accelerometrul poate măsura accelerația liniară, giroscopul poate ajuta la găsirea accelerației de rotație. Atunci când utilizați ambii senzori ca module separate, devine dificil să găsiți orientarea, poziția și viteza. Dar prin combinarea celor doi senzori funcționează ca o unitate de măsurare inerțială (IMU). Deci, în modulul MPU6050, accelerometrul și giroscopul sunt prezente pe un singur PCB pentru a găsi orientarea, poziția și viteza.
Aplicații:
- Folosit în Dronuri pentru controlul direcției
- Roboți auto-echilibrați
- Controlul brațului robotizat
- Senzor de înclinare
- Utilizat în telefoane mobile, console de jocuri video
- Roboți umanoizi
- Utilizat în aeronave, automobile etc.
Accelerometru MPU6050 și modul senzor giroscopic
MPU6050 este un sistem microelectro -mecanic (MEMS) care constă dintr-un accelerometru pe 3 axe și un giroscop pe 3 axe în interiorul acestuia. Are și senzor de temperatură.
Poate măsura:
- Accelerare
- Viteză
- Orientare
- Deplasare
- Temperatura
Acest modul are, de asemenea, un procesor de mișcare digitală (DMP) în interiorul său, care este suficient de puternic pentru a efectua calcule complexe și astfel elibera munca pentru microcontroler.
Modulul are, de asemenea, doi pini auxiliari care pot fi folosiți pentru interfața modulelor IIC externe, precum un magnetometru. Deoarece adresa IIC a modulului este configurabilă, mai mult de un senzor MPU6050 poate fi interfațat la un microcontroler folosind pinul AD0.
Caracteristici și specificații:
- Sursa de alimentare: 3-5V
- Comunicare: protocol I2C
- ADC încorporat pe 16 biți oferă o precizie ridicată
- DMP încorporat oferă o putere de calcul ridicată
- Poate fi folosit pentru interfața cu alte dispozitive IIC, cum ar fi magnetometrul
- Adresă IIC configurabilă
- Senzor de temperatură încorporat
Pinout MPU6050:
Numarul pin | Nume PIN | Utilizare |
1 | Vcc | Oferă energie pentru modul, poate fi de la + 3V la + 5V. De obicei se folosește + 5V |
2 | Sol | Conectat la masă al sistemului |
3 | Ceas serial (SCL) | Folosit pentru furnizarea impulsului de ceas pentru comunicarea I2C |
4 | Date seriale (SDA) | Folosit pentru transferul de date prin comunicare I2C |
5 | Date seriale auxiliare (XDA) | Poate fi utilizat pentru interfața altor module I2C cu MPU6050. Este opțional |
6 | Ceas serial auxiliar (XCL) | Poate fi utilizat pentru interfața altor module I2C cu MPU6050. Este opțional |
7 | AD0 | Dacă se utilizează mai mult de un MPU6050 un singur MCU, atunci acest pin poate fi utilizat pentru a varia adresa |
8 | Întrerupe (INT) | Pinul de întrerupere pentru a indica faptul că datele sunt disponibile pentru citirea MCU. |
Am folosit anterior MPU6050 cu Arduino pentru a construi un robot de echilibrare și un inclinometru.
Componente necesare
- Arduino UNO
- Modul giroscop MPU6050
- Afișaj LCD 16x2
- Potențiometru 10k
- Servomotor SG90
- Imagine cu raportor
Diagrama circuitului
Diagrama circuitului pentru acest transportor Arduino DIY este prezentată mai jos:
Conexiuni de circuit între Arduino UNO și MPU6050:
MPU6050 |
Arduino UNO |
VCC |
+ 5V |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Conexiuni de circuit între Arduino UNO și servomotor:
Servo motor |
Arduino UNO |
ROȘU (VCC) |
+ 5V |
ORANGE (PWM) |
9 |
MARO (GND) |
GND |
Conexiuni de circuit între Arduino UNO și LCD 16x2:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
La codul PIN al centrului potențiometrului Pentru controlul contrastului ecranului LCD |
RS |
2 |
RW |
GND |
E |
3 |
D4 |
4 |
D5 |
5 |
D6 |
6 |
D7 |
7 |
A |
+ 5V |
K |
GND |
Explicație de programare
Ca de obicei, programul complet cu un videoclip demonstrativ este oferit la sfârșitul acestui tutorial.
Aici servomotorul este conectat cu Arduino și arborele său este proiectat pe imaginea raportorului care indică unghiul MPU6050 înclinat. Programarea pentru acest tutorial este simplă. Să o vedem în detaliu.
Mai întâi includeți toate bibliotecile necesare - biblioteca Servo Motor pentru utilizarea Servo, biblioteca LCD pentru utilizarea LCD și biblioteca Wire pentru utilizarea comunicației I2C.
MPU6050 utilizează comunicația I2C și, prin urmare, trebuie conectat numai la pinii I2C ai Arduino. Deci, biblioteca Wire.h este utilizată pentru a stabili comunicarea între Arduino UNO și MPU6050. Am interfațat anterior MPU6050 cu Arduino și am afișat valorile coordonatelor x, y, z pe ecranul LCD 16x2.
#include
Apoi definiți pinii LCD RS, E, D4, D5, D6, D7 care sunt conectați cu Arduino UNO.
LiquidCrystal lcd (2,3,4,5,6,7);
Apoi este definită adresa I2C a MPU6050.
const int MPU_addr = 0x68;
Apoi inițializați obiectul myservo pentru utilizarea clasei Servo și trei variabile pentru a stoca valorile axelor X, Y și Z.
Servo miservo; int16_t axis_X, axis_Y, axis_Z;
Următoarele valori minime și maxime sunt setate ca 265 și 402 pentru măsurarea unghiului de la 0 la 360.
int minVal = 265; int maxVal = 402;
configurare nulă ():
În funcția de configurare nulă , prima comunicare I2C este pornită și transmisia a început cu MPU6050 cu adresa 0x68.
Wire.begin (); Wire.beginTransmission (MPU_addr);
Puneți MPU6050 în modul Repaus scriind 0x6B și apoi treziți-l scriind 0
Wire.write (0x6B); Wire.write (0);
După ce activați MPU6050, opriți transmisia
Wire.endTransmission (adevărat);
Aici pinul PWM al motorului servo este conectat cu pinul 9 Arduino UNO.
myservo.attach (9);
De îndată ce pornim circuitul, LCD-ul afișează un mesaj de întâmpinare și îl șterge după 3 secunde
lcd.inceput (16,2); // Setează ecranul LCD în mod 16X2 lcd.print ("CIRCUIT DIGEST"); întârziere (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("MPU6050"); întârziere (3000); lcd.clear ();
bucla nulă ():
Din nou, comunicarea I2C începe cu MPU6050.
Wire.beginTransmission (MPU_addr);
Apoi începeți cu înregistrarea 0x3B (ACCEL_XOUT_H)
Wire.write (0x3B);
Acum procesul este repornit de transmiterea setată ca fiind falsă, dar conexiunea este activă.
Wire.endTransmission (fals);
După aceea, solicitați acum datele din cele 14 registre.
Wire.requestFrom (MPU_addr, 14, adevărat);
Acum, valorile înregistrate ale axelor respectate (x, y, z) sunt obținute și stocate în variabilele axis_X, axis_Y, axis_Z.
axis_X = Wire.read () << 8-Wire.read (); axis_Y = Wire.read () << 8-Wire.read (); axis_Z = Wire.read () << 8-Wire.read ();
Apoi, mapați acele valori de la 265 la 402 ca -90 la 90. Acest lucru se face pentru toate cele trei axe.
int xAng = map (axis_X, minVal, maxVal, -90,90); int yAng = hartă (axis_Y, minVal, maxVal, -90,90); int zAng = hartă (ax_Z, minVal, maxVal, -90,90);
Formula pentru a calcula valoarea x în grade (0 la 360) este dată mai jos. Aici convertim doar x deoarece rotația servomotorului se bazează pe mișcarea valorii x.
x = RAD_TO_DEG * (atan2 (-yAng, -zAng) + PI);
Valoarea unghiului X, de la 0 la 360 grade, este convertită în 0 la 180.
int pos = hartă (x, 0,180,0,180);
Apoi scrieți valoarea unghiului pentru a roti servo pe imaginea raportorului și tipăriți acele valori pe afișajul LCD de 16x2.
myservo.write (pos); lcd.setCursor (0,0); lcd.print („Unghiul”); lcd.setCursor (0,1); lcd.print (x); întârziere (500); lcd.clear ();
Deci, astfel se poate utiliza MPU6050 cu Arduino pentru a măsura unghiul. Codul complet și videoclipul pentru acest proiect sunt prezentate mai jos.