Tartalomjegyzék:

Giroszkóp szórakozás neopixel gyűrűvel: 4 lépés (képekkel)
Giroszkóp szórakozás neopixel gyűrűvel: 4 lépés (képekkel)

Videó: Giroszkóp szórakozás neopixel gyűrűvel: 4 lépés (képekkel)

Videó: Giroszkóp szórakozás neopixel gyűrűvel: 4 lépés (képekkel)
Videó: Гироскоп у совы 2024, November
Anonim
Image
Image

Ebben az oktatóanyagban az MPU6050 giroszkópot, egy neopixelgyűrűt és egy arduino -t fogunk használni egy olyan eszköz felépítéséhez, amely a dőlésszögnek megfelelő LED -eket világít.

Ez egy egyszerű és szórakoztató projekt, és egy kenyértáblára lesz szerelve. Ha követi a lépéseket, felépítheti a videóban látottakat. Ez egy jó oktatóanyag a giroszkóp és a neopixelgyűrű megismeréséhez.

Ezt az oktatóanyagot azért építem, mert érdeklődtem az első itt olvasható (Gyroscope Led Control With Arduino) iránt. Ebben az utasításban az egyszerű LED -eket lecseréltem egy neopixel gyűrűre. A gyűrűt egyszerűbb használni az Adafruit könyvtáron keresztül, és határozottan látványosabb.

Tehát ha ezeket az alkatrészeket körülveszi, ez nagyszerű módja annak, hogy kihasználja őket, megpróbálom lépésről lépésre végigvezetni Önt az eszköz építésén, és elmagyarázni, hogyan működik az utolsó lépésben.

1. lépés: Szükséges dolgok

Összeszerelés
Összeszerelés

Alkatrészek

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

2. Kenyeretábla

3. MPU6050 giroszkóp (eBay) 1,2 $

4. 24 neopixel led gyűrű (Adafruit) 17 $

5. 4 x AA elemcsomag 4 elemmel

6. U alakú áthidaló kábelek (opcionális). Azért használtam ezeket az áthidaló kábeleket, mert jobban néznek ki a kenyértáblán, és a LED -ek így jobban láthatók. 140 dobozban találsz az ebay -en, körülbelül 4 dollárért. Ha nincsenek ezek a kábelek, kicserélheti őket dupont vezetékekre.

Eszközök:

1. USB -soros FTDI adapter FT232RL az arduino pro mini programozásához

2. Arduino IDE

Képességek: 1. Forrasztás, nézze meg ezt az oktatóanyagot

3. Alapvető arduino programozás, ez az oktatóanyag hasznos lehet

2. lépés: Összeszerelés

Összeszerelés
Összeszerelés

Csatoltam a frizázó vázlatot fzz formátumban és egy képet róla, hogy könnyen látható legyen a kapcsolatok

1. A neopixel gyűrű hátoldalán 3 db tűt kell forrasztani, ahogy az a képen látható

- forrasztja a pozitív csapot

- forrasztani a talajt

- forrasztani az adatbeviteli tűt

2. Ezután a 4x -es elemtartónak csatlakoznia kell a kenyérlaphoz, egyszerű megoldás az, ha két dugaszos dugaszt csatlakoztat a csatlakozókhoz.

3. Készítse elő a panelt.

- helyezze a neopixelgyűrűt, a mikrokontrollert és a giroszkópot a kenyérsütő táblára, mint a képen

- helyezze el az összes negatív vezetéket: a mikrokontrollerhez, a neopixelgyűrűhöz, a giroszkóphoz

- helyezze el az összes pozitív vezetéket: a mikrokontrollerhez, a neopixelgyűrűhöz, a giroszkóphoz

- helyezze el az összes adatvezetéket:

* SDA és SCL a mikrokontrollertől a giroszkópig

* D6 tű a mikrokontrollerről a neopixelgyűrűre

- áramellátás előtt ellenőrizze az összes csatlakozást

- opcionálisan ragasztószalag használatával ragasztja be az akkumulátort a bradboard hátoldalára, hogy a helyén tartsa és hordozhatóbbá tegye

3. lépés: A kód és a kalibrálás

Először le kell töltenie és telepítenie kell két könyvtárat:

1. Adafruit neopixel könyvtár fenyő, amely a neopixelt vezérli

2. MPU6050 könyvtár a giroszkóphoz

3. I2CDev könyvtár forrás

Két nagy könyvtárról van szó, amelyek elvégzik a nehéz feladatokat!

További részletek a neopixelekről itt

Ezután töltse le és telepítse a könyvtáramat innen, vagy másolja le alulról:

#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 csík = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; bool inicializálás = hamis; // igazítsa be, ha a DMP init sikeres volt uint8_t mpuIntStatus; // tényleges megszakítási állapot bájtot tartalmaz az MPU -ból uint8_t devStatus; // visszatérési állapot minden eszközművelet után (0 = siker,! 0 = hiba) uint16_t packetSize; // várható DMP csomagméret (alapértelmezett 42 bájt) uint16_t fifoCount; // az összes bájt száma a FIFO -ban uint8_t fifoBuffer [64]; // FIFO tárolópuffer Quaternion q; // [w, x, y, z] kvaternion konténer VectorFloat gravity; // [x, y, z] gravitációs vektor float ypr [3]; // [rázkódás, dőlésszög, tekerés] rázkódás/dőlés/tekercstartály és gravitációs vektor illékony bool mpuInterrupt = false; // jelzi, hogy az MPU megszakító csapja magasra emelkedett -e

üres beállítás ()

{Serial.begin (9600); Serial.println ("A program elindult"); inicializálás = inicializálásGyroscope (); strip.begin (); } void loop () {if (! inicializálás) {return; } mpuInterrupt = hamis; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); Visszatérés; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitáció, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitáció); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} logikai hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kényszerít (y, -1 * MAX_ANGLE, MAX_ANGLE); ha (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 és z 0 és z 0 és 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 = térkép (szög, tólAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, szög); uint32_t szín; for (int i = 0; i pozíció + LED_OFFSET) {visszatérési pozíció + LED_OFFSET; } visszatérési pozíció + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int szög) {if (millis () - lastPrintTime <500) {return; } Soros.nyomtatás ("a ="); Soros.nyomat (szög); Soros.nyomtatás (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Soros.nyomtatás ("y ="); Soros.nyomtatás (y); Soros.nyomtatás (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = millis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Az MPU6050 kapcsolat sikeres"): F ("Az MPU6050 kapcsolat sikertelen")); Serial.println (F ("DMP inicializálása …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("A DMP inicializálása nem sikerült (kód"))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Engedélyezés megszakítás észlelése (Arduino külső megszakítás 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP kész! Várakozás az első megszakításra … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Töltse fel a kódot:

Az FTDI adapter segítségével töltse fel a kódot az arduino -ba.

Csatlakoztassa a tápegységet (elemek)

Kalibráció:

A legfontosabb dolog a kalibráláshoz a "LED_OFFSET" állandó. Példámban a 12. Ezt 0 -ról 23 -ra kell állítania, hogy a tápfeszültség bekapcsolása után a led a tábla döntési irányába világítson.

Ha további részleteket szeretne megtudni a működéséről, nézze meg az utolsó lépést

4. lépés: Hogyan működik (opcionális)

Hogyan működik (opcionális)
Hogyan működik (opcionális)

Először egy kis információ az MPU6050 giroszkópról. Ez egy MEMS giroszkóp (a MEMS a mikroelektromechanikus rendszereket jelenti).

A MEMs giroszkóp minden típusa rendelkezik valamilyen rezgő komponenssel, ahonnan kimutatható a felhalmozódás és ezáltal az irányváltozás. Ennek oka az, hogy a mozgástörvény szerint a rezgő objektum szeret ugyanabban a síkban rezegni, és bármilyen rezgéseltérés felhasználható az irányváltozás levezetésére.

A giroszkóp tartalmaz egy saját mikrokontrollert is, amely kiszámítja a dobást, a hangmagasságot és az elfordulást néhány divatos matematika segítségével.

De a giroszkóp nyers adatok zajtól és sodródástól szenvednek, ezért külső könyvtárat használtunk a dolgok elsimítására és tiszta használható adatok megadására.

A Neopixel RGB LED -ek egyedileg címezhetők, sávokba és gyűrűkbe láncolva. 5 V -on működnek, és saját áramkört tartalmaznak, így csak a neopixelek tápellátására van szükség, és az adatvezeték használatával kommunikálni kell velük. A kommunikáció egyetlen adatvonallal történik, amely órát és adatokat tartalmaz (további részletek itt). Az Adafruit tiszta könyvtárat biztosít a neopixelgyűrűkkel való interakcióhoz.

A kód

A l oop () függvényben az MPU6050_6Axis_MotionApps20 könyvtárat hívják meg. Ha a könyvtár új adatokkal rendelkezik a gyroscpe -ből, akkor redrawLeds -nek (x, y, z) hívja, 3 argumentummal, amelyek az elfordulást, a hangmagasságot és a görgetést jelzik

Inside redrawLeds ():

- két tengelyre fókuszálunk: y, z

- mindkét tengelyt -MAX_ANGLE -ról +MAX_ANGLE -ra korlátozzuk, a maximális szöget 45 -re határoztuk meg, és ez megváltoztatható

- 360 fokos rétegeket négy negyedre osztunk, és mindegyikhez meghívjuk a lightLeds () függvényeket:

* y negatív, z pozitív első kvadráns 0 és 5 között vezérli a ledeket, a szög 0 és 89 között lesz

* y negatív, z negatív második kvadráns vezérlő 6 -tól 12 -ig vezetett, a szög 89 és 0 között lesz

*… Stb

- a lightLeds funkció belsejében

* A szöget a két tengely alapján számolom arctangent segítségével (ellenőrizze a mellékelt képet)

* Az arduino térkép funkció segítségével kiszámítom, hogy mi mutatkozott

* visszaállítom a led szalagot két kivételével, az egyik megfelel a korábban számított led pozíciónak és az előtte lévő led pozíciónak (hogy elhalványuljon a hatás)

* a normalizeLedPosition () nevű függvényt használom a neopixel kalibrálás figyelembevételéhez. A kalibrálás azért hasznos, mert a neopixelgyűrű tetszés szerint elforgatható, és a giroszkóphoz kell igazítani

* A vonótengelyt is kinyomtatom, a lednek van fénye és szöge

A matek

Csatoltam egy képet a led gyűrűvel és a szög meghatározásához használt trigonometrikus függvénnyel.

Ajánlott: