Sadržaj:
- Korak 1: Potrebne stvari
- Korak 2: Montaža
- Korak 3: Kôd i kalibracija
- Korak 4: Kako to funkcionira (izborno)
Video: Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:05
U ovom ćemo vodiču koristiti žiroskop MPU6050, prsten od neopiksela i arduino za izradu uređaja koji svijetli LED diode prema kutu nagiba.
Ovo je jednostavan i zabavan projekt i bit će sastavljen na ploči. Ako slijedite korake, izgradit ćete ono što ste vidjeli u videu. To je dobar vodič za učenje o žiroskopu i neopikselnom prstenu.
Ovaj tutorijal pravim zbog interesa koji sam vidio na svom prvom uputstvu ovdje (Kontrola sa žiroskopom sa Arduinom). U ovom uputstvu zamijenio sam jednostavne LED diode prstenom od neopiksela. Prsten je jednostavniji za korištenje putem biblioteke Adafruit i definitivno je spektakularniji.
Dakle, ako imate ove komponente oko sebe, ovo je sjajan način da ih iskoristite, pokušat ću vas provesti korak po korak kroz izradu uređaja i objasniti kako to funkcionira u posljednjem koraku.
Korak 1: Potrebne stvari
Delovi
1. Arduino pro mini 328p (eBay) 2 USD
2. Oglasna ploča
3. Žiroskop MPU6050 (eBay) 1,2 USD
4. 24 neopikselni LED prsten (Adafruit) 17 USD
5. 4 x AA baterije sa 4 baterije
6. Premosni kablovi u obliku slova U (opcionalno). Koristio sam ove kratkospojne kabele jer izgledaju bolje na ploči, a LED diode su tako vidljivije. Na ebayu možete pronaći kutiju od 140 po cijeni od 4 USD. Ako nemate ove kabele, možete ih zamijeniti dupont žicama.
Alati:
1. USB na serijski FTDI adapter FT232RL za programiranje arduino pro mini
2. Arduino IDE
Vještine: 1. Lemljenje, pogledajte ovaj vodič
3. Osnovno arduino programiranje, ovaj bi vodič mogao biti koristan
Korak 2: Montaža
Priložio sam shemu fritzinga u fzz formatu i njenu sliku radi lakše vizualizacije veza
1. Morate lemiti 3 muška igla na stražnjoj strani neopikselnog prstena kao što je prikazano na slici
- lemite pozitivni pin
- zalemiti tlo
- zalemite pin za unos podataka
2. Tada bi držač baterije za 4x trebao imati mogućnost povezivanja na matičnu ploču, jednostavno rješenje je lemljenje dvije muške dupont žice na njegove priključke.
3. Pripremite matičnu ploču.
- postavite neopikselni prsten, mikrokontroler i žiroskop na ploču kao na slici
- postavite sve negativne žice: na mikrokontroler, prsten od neopiksela, žiroskop
- postavite sve pozitivne žice: na mikrokontroler, prsten od neopiksela, žiroskop
- postavite sve podatkovne žice:
* SDA i SCL od mikrokontrolera do žiroskopa
* pin D6 sa mikrokontrolera na prsten od neopiksela
- dvaput provjerite sve veze prije uključivanja
- po želji ljepljivom trakom zalijepite bateriju na stražnju stranu ploče kako biste je držali na mjestu i učinili prenosivijom
Korak 3: Kôd i kalibracija
Prvo morate preuzeti i instalirati dvije biblioteke:
1. Adafruit neopixel biblioteka koja kontroliše neopixel
2. Biblioteka MPU6050 za žiroskop
3. Izvor biblioteke I2CDev
To su dvije odlične biblioteke koje će učiniti težak posao!
Više detalja o neopikselima ovdje
Zatim preuzmite i instalirajte moju biblioteku odavde ili je kopirajte odozdo:
#include "I2Cdev.h"
#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; bool inicijalizacija = false; // postavljanje true ako je DMP init bio uspješan uint8_t mpuIntStatus; // sadrži stvarni bajt statusa prekida iz MPU -a uint8_t devStatus; // vraća status nakon svake operacije uređaja (0 = uspjeh,! 0 = greška) uint16_t packetSize; // očekivana veličina DMP paketa (zadano je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO memorijski bafer Quaternion q; // [w, x, y, z] kvaterionski kontejner VectorFloat gravity; // [x, y, z] plovak gravitacije vektora ypr [3]; // [skretanje, nagib, kotrljanje] kontejner za skretanje/nagib/kotrljanje i vektor gravitacije volatile bool mpuInterrupt = false; // označava da li je pin prekida MPU previsoko
void setup ()
{Serial.begin (9600); Serial.println ("Program je pokrenut"); initialization = initializeGyroscope (); strip.begin (); } void loop () {if (! inicijalizacija) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); return; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= veličina paketa; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitacija, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} boolean hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = ograničenje (x, -1 * MAX_ANGLE, MAX_ANGLE); y = ograničiti (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } inače ako (y <0 i z 0 i z 0 i z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {dvostruki ugao = (atan ((dvostruki) abs (x) / (dvostruki) abs (y))) * 4068) / 71; int ledNr = mapa (ugao, odAngle, doAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, ugao); uint32_t boja; for (int i = 0; i položaj + LED_OFFSET) {povratna pozicija + LED_OFFSET; } povratna pozicija + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (angle); Serial.print (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = millis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Veza MPU6050 uspješna"): F ("Veza MPU6050 nije uspjela")); Serial.println (F ("Inicijalizacija DMP -a …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP inicijalizacija nije uspjela (kôd")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Omogućavanje detekcija prekida (Arduino vanjski prekid 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP spreman! Čekanje prvog prekida … ")); = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}
Otpremite kôd:
Pomoću FTDI adaptera prenesite kôd na arduino.
Priključite napajanje (baterije)
Kalibracija:
Najvažnija stvar za kalibraciju je konstanta "LED_OFFSET". U mom primjeru je 12. Morate to podesiti od 0 do 23 tako da će nakon uključivanja ploče LED dioda svijetliti u smjeru u kojem naginjete ploču.
Ako želite saznati više detalja o tome kako funkcionira, pogledajte zadnji korak
Korak 4: Kako to funkcionira (izborno)
Prvo malo informacija o žiroskopu MPU6050. Ovo je MEMS žiroskop (MEMS označava mikroelektromehaničke sisteme).
Svaka vrsta žiroskopa MEM ima neki oblik oscilirajuće komponente odakle se može otkriti akkrelacija, a time i promjena smjera. To je zato što, prema očuvanju zakona kretanja, vibrirajući objekt voli nastaviti vibrirati u istoj ravnini, a bilo koje vibracijsko odstupanje može se koristiti za izvođenje promjene smjera.
Žiroskop također sadrži vlastiti mikrokontroler za izračunavanje rolanja, koraka i zakretanja kroz neke fantastične matematike.
No, sirovi žiroskopski podaci pate od buke i zanošenja, pa smo koristili vanjsku biblioteku kako bismo izgladili stvari i dali nam čiste upotrebljive podatke.
Neopixel su RGB LED diode koje se pojedinačno mogu adresirati i povezane su u trake i prstenove. Rade na 5V i sadrže vlastita kola pa je potrebno samo napajati neopiksele i komunicirati s njima putem podatkovne linije. Komunikacija se vrši s jednom linijom podataka koja sadrži sat i podatke (više detalja ovdje). Adafruit pruža čistu biblioteku za interakciju s neopikselnim prstenovima.
Kod
Unutar funkcije l oop () poziva se biblioteka MPU6050_6Axis_MotionApps20. Kada biblioteka ima nove podatke iz žiroskopa, poziva redrawLeds (x, y, z) sa 3 argumenta koji predstavljaju zakretanje, korak i pomak
Unutra redrawLeds ():
- fokusiramo se na dvije osi: y, z
- ograničavamo obje osi od -MAX_ANGLE do +MAX_ANGLE, definirali smo maksimalni kut na 45 i može se mijenjati
- dijelimo 360 stepeni u 4 kvadranta i pozivamo lightLeds () funkcije za svaki na sljedeći način:
* y negativan, z pozitivan prvi kvadrant će kontrolirati LED diode od 0 do 5, kut će biti od 0 do 89
* y negativno, z negativno u drugom kvadrantu kontrolira LED diode od 6 do 12, kut će biti od 89 do 0
*… Itd
- unutar funkcije lightLeds
* Računam kut na temelju dvije osi pomoću arctangente (pogledajte priloženu sliku)
* Računam šta je dovelo do prikaza pomoću funkcije arduino map
* Ponovno postavljam LED traku sve osim dva LED -a, jedan koji odgovara položaju LED -a koji sam ranije izračunao i LED položaj prije (za prikaz efekta blijeđenja)
* Koristim funkciju koja se zove normalizeLedPosition () da uzme u obzir kalibraciju neopiksela. Kalibracija je korisna jer se neopikselni prsten može rotirati po želji i treba ga poravnati sa žiroskopom
* Takođe štampam osovinu za vuču, koja LED dioda ima svjetlost i kut
Matematika
Priložio sam sliku sa LED prstenom i trigonometrijskom funkcijom koja se koristi za određivanje ugla.
Preporučuje se:
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): 5 koraka
Žiroskop MPU 6050, komunikacija akcelerometra s Arduinom (Atmega328p): MPU6050 IMU ima troosni akcelerometar i troosni žiroskop integriran na jednom čipu. Žiroskop mjeri brzinu rotacije ili brzinu promjene kutnog položaja tijekom vremena, duž Osi X, Y i Z. Izlazi žiroskopa su
Zabava s OLED zaslonom i Arduinom: 12 koraka (sa slikama)
Zabava s OLED zaslonom i Arduinom: Prilično sam siguran da ste definitivno čuli za OLED tehnologiju prikaza. Relativno je nov i nudi bolju kvalitetu od stare LCD tehnologije. U ovom vodiču želimo pregledati korake potrebne za prikaz podataka na jednoj od najčešćih pojedinačnih ko
Arduino žiroskop Sat: 7 koraka
Arduino žiro sat Prije svega, želim odati priznanje originalnom autoru: elektronika za svakoga. Originalni dizajn koji je napravio nalazi se ovdje. On
Pomodoro mjerač vremena sa LED prstenom: 5 koraka
Pomodoro mjerač vremena sa LED prstenom: Za svaki ITTT-projekt unesite različite varijacije Pomodoro tajmera. De Pomodoro " tehnika " je een tijdmanagementmethode die gebruikers can can help om grote projecten in kleine stappen te verdelen en regelmatig pauze te houden. Hierbij
Upravljanje neopikselnim prstenom sa senzorom pokreta: 3 koraka (sa slikama)
Upravljanje neopikselnim prstenom s senzorom gesta: U ovom vodiču igrat ćemo se sa senzorom gesta (APDS-9960) i prstenom od neopiksela kako bismo naučili kako ih kombinirati pomoću Arduino UNO-a. Krajnji proizvod će reagirati na pokreti lijevo - desno animirajući kretanje LED desno ili lijevo, a na