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, Studeni
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 prstenu od neopiksela.

Ovaj tutorial gradim zbog interesa koji sam vidio na svom prvom uputstvu ovdje (Kontrola sa žiroskopom s 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 izgradnju uređaja, a u posljednjem koraku objasniti i kako to radi.

Korak 1: Potrebne stvari

Skupština
Skupština

Dijelovi

1. Arduino pro mini 328p (eBay) 2 USD

2. Oglasna ploča

3. Žiroskop MPU6050 (eBay) 1,2 $

4. 24 neopixel LED prsten (Adafruit) 17 $

5. 4 x AA baterije sa 4 baterije

6. Premosni kabeli 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, provjerite ovaj vodič

3. Osnovno arduino programiranje, ovaj bi vodič mogao biti koristan

Korak 2: Montaža

Skupština
Skupština

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 žice dupont 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 s mikrokontrolera na prsten od neopiksela

- prije uključivanja dvaput provjerite sve veze

- 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 kontrolira neopixel

2. Knjižnica MPU6050 za žiroskop

3. Izvor knjižnice I2CDev

To su dvije velike knjižnice koje će učiniti teške poslove!

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 traka = 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 = pogreška) uint16_t packetSize; // očekivana veličina paketa DMP (zadana vrijednost je 42 bajta) uint16_t fifoCount; // broj svih bajtova trenutno u FIFO uint8_t fifoBuffer [64]; // FIFO međuspremnik za pohranu Quaternion q; // [w, x, y, z] kvaterionski spremnik VectorFloat gravitacija; // [x, y, z] plovak gravitacijskog vektora ypr [3]; // [skretanje, nagib, kotrljanje] spremnik za skretanje/nagib/kotrljanje i vektor gravitacije hlapiva bool mpuInterrupt = false; // označava je li pin za prekid MPU -a otišao visoko

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 (); povratak; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, veličina paketa); 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) {double angle = (atan ((double) abs (x) / (double) abs (y)) * * 4068) / 71; int ledNr = karta (kut, odAngle, doAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, kut); boja uint32_t; for (int i = 0; i position + LED_OFFSET) {return position + 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 … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Učitajte kôd:

Pomoću FTDI adaptera prenesite kôd na arduino.

Priključite napajanje (baterije)

Kalibriranje:

Najvažnija stvar za kalibriranje ovdje 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 radi (izborno)
Kako to radi (izborno)

Prvo malo informacija o žiroskopu MPU6050. Ovo je MEMS žiroskop (MEMS označava mikroelektromehaničke sustave).

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 zakonu o očuvanju 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 upotrijebili vanjsku knjižnicu kako bismo izgladili stvari i dali nam čiste upotrebljive podatke.

Neopixel su RGB LED diode koje se pojedinačno mogu adresirati i povezane u trake i prstenove. Rade na 5V i sadrže vlastita kola pa trebate samo napajati neopiksele i komunicirati s njima putem podatkovne linije. Komunikacija se odvija s jednom podatkovnom linijom 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. Kad knjižnica ima nove podatke iz žiroskopa, poziva redrawLeds (x, y, z) s 3 argumenta koji predstavljaju skretanje, pomak i pomak

Unutar 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 stupnjeva 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 što je dovelo do prikaza pomoću funkcije arduino map

* Resetiram sve LED diode osim dva LED -a, jedan koji odgovara položaju LED -a koji sam već izračunao i LED položaj prije (za prikaz efekta blijeđenja)

* Koristim funkciju koja se zove normalizeLedPosition () kako bi uzela u obzir kalibraciju neopiksela. Kalibracija je korisna jer se neopikselni prsten može okretati prema želji i treba ga poravnati sa žiroskopom

* također ispisujem osi za vuču, ono što LED ima svjetlo i kut

Matematika

Priložio sam sliku sa LED prstenom i trigonometrijskom funkcijom za određivanje kuta.

Preporučeni: