INHOUDSOPGAWE:

Gyroscooppret met Neopixel -ring: 4 stappe (met foto's)
Gyroscooppret met Neopixel -ring: 4 stappe (met foto's)

Video: Gyroscooppret met Neopixel -ring: 4 stappe (met foto's)

Video: Gyroscooppret met Neopixel -ring: 4 stappe (met foto's)
Video: Lesson 31: Measure Temperature and Humidity Over Wi-Fi using DHT11 and ESP01 SunFounder Kit 2024, November
Anonim
Image
Image

In hierdie handleiding gaan ons die MPU6050 -gyroscoop, 'n neopixelring en 'n arduino gebruik om 'n toestel te bou wat LED's aansteek wat ooreenstem met die hellingshoek.

Dit is 'n eenvoudige en prettige projek wat op 'n broodbord aangebring sal word. As u die stappe volg, bou u wat u in die video gesien het. Dit is 'n goeie handleiding om te leer oor die gyroscoop en die neopixelring.

Ek bou hierdie tutoriaal vanweë die belangstelling wat ek op my eerste instruksies hier (Gyroscope Led Control With Arduino) gesien het. In hierdie instruksies het ek eenvoudige LED's vervang met 'n neopixelring. Die ring is eenvoudiger om te gebruik deur 'n Adafruit -biblioteek en dit is beslis meer skouspelagtig.

As u dus hierdie komponente het, is dit 'n goeie manier om dit te gebruik, ek sal u stap vir stap probeer om die toestel te bou en ook te verduidelik hoe dit in die laaste stap werk.

Stap 1: Vereiste dinge

Vergadering
Vergadering

Dele

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

2. Broodbord

3. MPU6050 gyroscoop (eBay) 1.2 $

4. 24 neopixel led ring (Adafruit) 17 $

5. 4 x AA battery pack met 4 batterye

6. U-vormige trukkabels (opsioneel). Ek het hierdie springkabels gebruik omdat dit beter lyk op die broodbord, en die leds is meer sigbaar op hierdie manier. U kan 'n boks van 140 op eBay vind teen ongeveer $ 4. As u nie hierdie kabels het nie, kan u dit vervang met dupont -drade.

Gereedskap:

1. USB na seriële FTDI -adapter FT232RL om die arduino pro mini te programmeer

2. Arduino IDE

Vaardighede: 1. Soldeer, kyk na hierdie handleiding

3. Basiese arduino -programmering, hierdie handleiding kan nuttig wees

Stap 2: Montering

Vergadering
Vergadering

Ek het die fritzing -skematika in fzz -formaat aangeheg en 'n foto daarvan om die verbindings maklik te visualiseer

1. U moet 3 penne aan die agterkant van die neopixelring soldeer, soos op die foto getoon

- soldeer die positiewe pen

- soldeer die grond

- soldeer die data -invoerpen

2. Dan moet die 4x batteryhouer 'n verbinding met die broodbord hê; 'n maklike oplossing is om twee manlike dupontdrade aan sy terminale te soldeer.

3. Berei die broodbord voor.

- plaas die neopixelring, mikrobeheerder en gyroscoop op die broodbord soos op die foto

- plaas al die negatiewe drade: na die mikrobeheerder, neopixelring, gyro

- plaas al die positiewe drade: na die mikrobeheerder, neopixelring, gyro

- plaas al die data drade:

* SDA en SCL van die na die mikrobeheerder na die gyro

* pen D6 van die mikrobeheerder na die neopixelring

- Kontroleer alle aansluitings voordat u aanskakel

- plak die battery op die agterkant van die bradbord vas om dit op sy plek te hou en dit draagbaarder te maak.

Stap 3: Die kode en kalibrasie

Eerstens moet u twee biblioteke aflaai en installeer:

1. Adafruit neopixel biblioteek vir die beheer van die neopixel

2. MPU6050 biblioteek vir die gyroscoop

3. I2CDev biblioteek bron

Dit is twee groot biblioteke wat die swaar werk sal doen!

Meer besonderhede oor die neopixels hier

Laai dan my biblioteek hier af en installeer dit, of kopieer dit van onder af:

#sluit "I2Cdev.h" in

#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); ongetekende lang lastPrintTime = 0; bool inisialisering = vals; // stel waar as DMP init suksesvol was uint8_t mpuIntStatus; // hou die werklike onderbrekingsstatusbyte van MPU uint8_t devStatus; // terugkeerstatus na elke apparaatbewerking (0 = sukses,! 0 = fout) uint16_t packetSize; // verwagte DMP -pakkiegrootte (standaard is 42 grepe) uint16_t fifoCount; // telling van alle grepe wat tans in FIFO uint8_t fifoBuffer [64] is; // FIFO -stoorbuffer Quaternion q; // [w, x, y, z] quaternion houer VectorFloat swaartekrag; // [x, y, z] swaartekragvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container en gravitasie vektor vlugtige bool mpuInterrupt = false; // dui aan of die MPU -onderbrekingspen hoog is

leemte opstelling ()

{Serial.begin (9600); Serial.println ("Program begin"); inisialisering = initializeGyroscope (); strip.begin (); } leemte -lus () {if (! initialization) {return; } mpuInterrupt = vals; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); as (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); terugkeer; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& swaartekrag, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitasie); 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 = beperking (x, -1 * MAX_ANGLE, MAX_ANGLE); y = beperking (y, -1 * MAX_ANGLE, MAX_ANGLE); as (y 0) {lightLeds (y, z, 0, 5, 0, 89); } anders as (y <0 en z 0 en z 0 en 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 = kaart (hoek, vanAngle, naAngle, vanLedPosition, toLedPosition); printDebug (x, y, ledNr, hoek); uint32_t kleur; vir (int i = 0; i posisie + LED_OFFSET) {terugkeer posisie + LED_OFFSET; } terugkeer posisie + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (hoek); 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 ("MPU6050 verbinding suksesvol"): F ("MPU6050 verbinding misluk")); Serial.println (F ("Initialiseer DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktiveer interrupt -opsporing (Arduino eksterne onderbreking 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gereed! Wag vir eerste onderbreking … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Laai die kode op:

Laai die kode na die arduino met die FTDI -adapter.

Koppel die kragtoevoer (batterye) aan

Kalibrasie:

Die belangrikste ding om hier te kalibreer, is die "LED_OFFSET" -konstante. In my voorbeeld is 12. U moet dit van 0 tot 23 aanpas sodat die led na die aanstuur van die bord sal brand in die rigting waarin u die bord kantel.

As u meer inligting wil kry oor hoe dit werk, kyk dan na die laaste stap

Stap 4: Hoe dit werk (opsioneel)

Hoe dit werk (opsioneel)
Hoe dit werk (opsioneel)

Eerstens 'n bietjie inligting oor die MPU6050 -gyroscoop. Dit is 'n MEMS -gyroscoop (MEMS staan vir mikro -elektromeganiese stelsels).

Elke tipe MEM -gyroscoop het 'n vorm van ossillerende komponent waarvandaan die versnelling, en dus rigtingverandering, opgespoor kan word. Dit is omdat 'n trillende voorwerp, volgens die behoud van bewegingswet, daarvan hou om in dieselfde vlak voort te gaan, en enige vibrasie -afwyking kan gebruik word om 'n rigtingverandering af te lei.

Die gyro bevat ook 'n eie mikrobeheerder vir die berekening van die rol, toonhoogte en gaai deur 'n paar fyn wiskunde.

Maar die gyro rou data ly aan geraas en wegdrywing, so ons het 'n eksterne biblioteek gebruik om dinge glad te maak en ons bruikbare data te gee.

Die Neopixel is RGB -leds wat individueel aangespreek kan word en in bande en ringe vasgeketting word. Hulle werk op 5V en bevat hul eie stroombane, dus u hoef slegs die neopixels aan te dryf en met hulle te kommunikeer via die datalyn. Die kommunikasie geskied met 'n enkele data lyn wat klok en data bevat (meer besonderhede hier). Adafruit bied 'n skoon biblioteek vir interaksie met die neopixelringe.

Die kode

Binne die l oop () -funksie word die MPU6050_6Axis_MotionApps20 -biblioteek genoem. As die biblioteek nuwe data van die gyroscpe het, noem dit redrawLeds (x, y, z) met 3 argumente wat yaw, pitch en roll voorstel

Binne redrawLeds ():

- ons fokus op twee as: y, z

- ons beperk albei aksies van -MAX_ANGLE tot +MAX_ANGLE, ons definieer maksimum hoek tot 45 en dit kan verander word

- ons verdeel 360 grade in 4 kwadrante en noem lightLeds () funksies vir elkeen soos volg:

* y negatief, z positief eerste kwadrant sal LED's van 0 na 5 beheer, die hoek is van 0 tot 89

* y negatief, z negatief tweede kwadrant kontroles led's van 6 tot 12, die hoek sal van 89 tot 0 wees

* … ens

- binne die lightLeds -funksie

* ek bereken 'n hoek op grond van die twee as met behulp van arctangent (kyk die aangehegte prentjie)

* Ek bereken wat deur die arduino -kaartfunksie aan die lig gekom het

* ek stel die LED -strook op alles behalwe twee LED's, die een wat ooreenstem met die LED -posisie wat ek voorheen bereken het en 'n LED -posisie voorheen (om 'n vervaag -effek aan te toon)

* Ek gebruik 'n funksie genaamd normalizeLedPosition () om die neopixel -kalibrasie in ag te neem. Die kalibrasie is handig omdat die neopixelring na wens gedraai kan word en in lyn gebring moet word met die gyroscoop

* ek druk ook die sleepas, die led het lig en die hoek

Die wiskunde

Ek het 'n prentjie aangeheg met die ring en die trigonometriese funksie wat gebruik word om die hoek te bepaal.

Aanbeveel: