Sadržaj:

Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)
Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)

Video: Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)

Video: Žiroskop zabava s neopikselnim prstenom: 4 koraka (sa slikama)
Video: Аудиокнига «Зазеркалье» Льюиса Кэрролла 2024, Novembar
Anonim
Image
Image

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

Montaža
Montaža

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

Montaža
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)

Kako to funkcionira (izborno)
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: