Kazalo:

Zabava z žiroskopom z obročem Neopixel: 4 koraki (s slikami)
Zabava z žiroskopom z obročem Neopixel: 4 koraki (s slikami)

Video: Zabava z žiroskopom z obročem Neopixel: 4 koraki (s slikami)

Video: Zabava z žiroskopom z obročem Neopixel: 4 koraki (s slikami)
Video: Anja Herc ~ Colorful neon z'ibra ~ Hoopday'22 - Križevci 2024, November
Anonim
Image
Image

V tej vadnici bomo uporabili žiroskop MPU6050, obroč iz neopiksela in arduino za izdelavo naprave, ki prižge luči, ki ustrezajo naklonskemu kotu.

To je preprost in zabaven projekt, sestavljen pa bo na podlagi. Če sledite korakom, boste zgradili tisto, kar ste videli v videoposnetku. To je dobra vadnica za spoznavanje žiroskopa in obroča neopikselov.

To vadnico gradim zaradi zanimanja, ki sem ga videl pri prvem poučevanju tukaj (Gyroscope Led Control With Arduino). V tem navodilu sem preproste LED diode zamenjal z obročem iz neopiksela. Prstan je enostavnejši za uporabo v knjižnici Adafruit in je vsekakor bolj spektakularen.

Če imate na razpolago te komponente, je to odličen način, da jih uporabite, poskušal vas bom korak za korakom voditi skozi izdelavo naprave in v zadnjem koraku razložiti, kako deluje.

1. korak: Potrebne stvari

Montaža
Montaža

Deli

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

2. Ogledna plošča

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

4. 24 neopixel LED obroček (Adafruit) 17 $

5. 4 x AA baterija s 4 baterijami

6. Mostični kabli v obliki črke U (neobvezno). Uporabil sem te mostične kable, ker izgledajo bolje na plošči, LED diode pa so tako bolj vidne. Na ebayu lahko najdete škatlo 140 za približno 4 USD. Če teh kablov nimate, jih lahko zamenjate z dupont žicami.

Orodja:

1. USB na serijski adapter FTDI FT232RL za programiranje arduino pro mini

2. Arduino IDE

Spretnosti: 1. Spajkanje, preverite to vadnico

3. Osnovno programiranje arduino, ta vadnica je lahko koristna

2. korak: Montaža

Montaža
Montaža

Priložil sem shemo fritovanja v formatu fzz in njeno sliko za lažjo vizualizacijo povezav

1. Na hrbtni strani neopixel obroča morate spajkati 3 moške zatiče, kot je prikazano na sliki

- spajkajte pozitivni zatič

- spajkajte zemljo

- spajkajte vhodni zatič podatkov

2. Potem bi moralo držalo za 4 -kratno baterijo imeti možnost povezave z matično ploščo, enostavna rešitev je, da dve spoji moških žic dupont spajkate na njegove sponke.

3. Pripravite ploščo.

- prstan neopiksela, mikrokrmilnik in žiroskop postavite na ploščo, kot je na sliki

- postavite vse negativne žice: na mikrokrmilnik, neopixel obroč, žiroskop

- postavite vse pozitivne žice: na mikrokrmilnik, neopixel obroč, žiroskop

- postavite vse podatkovne žice:

* SDA in SCL od mikrokontrolerja do žiroskopa

* pin D6 od mikrokrmilnika do obroča neopixel

- pred vklopom dvakrat preverite vse povezave

- po želji z lepilnim trakom prilepite baterijo na zadnjo stran plošče, da jo držite na mestu in jo naredite bolj prenosljivo

3. korak: Koda in kalibracija

Najprej morate prenesti in namestiti dve knjižnici:

1. Knjižnica Adapruit neopixel, ki nadzoruje neopixel

2. Knjižnica MPU6050 za žiroskop

3. Vir knjižnice I2CDev

To sta dve odlični knjižnici, ki bosta opravili težko delo!

Več podrobnosti o neopixelih tukaj

Nato prenesite in namestite mojo knjižnico od tukaj ali jo kopirajte od spodaj:

#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 inicializacija = false; // nastavimo na true, če je bil init DMP uspešen uint8_t mpuIntStatus; // vsebuje dejanski bajt stanja prekinitve iz MPU uint8_t devStatus; // vrne stanje po vsaki operaciji naprave (0 = uspeh,! 0 = napaka) uint16_t packetSize; // pričakovana velikost paketa DMP (privzeto je 42 bajtov) uint16_t fifoCount; // štetje vseh bajtov, ki so trenutno v FIFO uint8_t fifoBuffer [64]; // pomnilnik za shranjevanje FIFO Quaternion q; // [w, x, y, z] kvaterionski vsebnik VectorFloat gravitacija; // [x, y, z] plovec gravitacijskega vektorja ypr [3]; // [nihanje, nagib, zvitek] nihanje/smola/zvitek vsebnika in vektor gravitacije hlapna bool mpuInterrupt = false; // označuje, ali je prekinitveni pin MPU previsok

void setup ()

{Serial.begin (9600); Serial.println ("Program se je začel"); initialization = initializeGyroscope (); strip.begin (); } void loop () {if (! inicializacija) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); vrnitev; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= velikost paketa; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & 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 = omeji (x, -1 * MAX_ANGLE, MAX_ANGLE); y = omeji (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } drugače, če (y <0 in z 0 in z 0 in z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {dvojni kot = (atan ((dvojni) abs (x) / (dvojni) abs (y)) * * 4068) / 71; int ledNr = zemljevid (kot, odAngle, doAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, kot); barva uint32_t; for (int i = 0; i position + LED_OFFSET) {return position + LED_OFFSET; } povratni položaj + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int kot) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (kot); 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 ("Povezava MPU6050 uspešna"): F ("Povezava MPU6050 ni uspela")); Serial.println (F ("Inicializiranje 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 ("Omogočanje zaznavanje prekinitev (Arduino zunanji prekinitev 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP pripravljen! Čakanje na prvo prekinitev … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Naloži kodo:

Z vmesnikom FTDI naložite kodo v arduino.

Priključite napajalnik (baterije)

Praznovanje:

Najpomembnejša stvar za umerjanje je konstanta "LED_OFFSET". V mojem primeru je 12. To morate prilagoditi od 0 do 23, tako da bo LED po vklopu plošče zasvetil v smeri, na katero nagnete ploščo.

Če želite izvedeti več podrobnosti o tem, kako deluje, si oglejte zadnji korak

4. korak: Kako deluje (neobvezno)

Kako deluje (neobvezno)
Kako deluje (neobvezno)

Najprej nekaj informacij o žiroskopu MPU6050. To je žiroskop MEMS (MEMS pomeni mikroelektromehanski sistemi).

Vsaka vrsta žiroskopa MEM ima neko obliko nihajoče komponente, od koder je mogoče zaznati akkrelacijo in s tem spremembo smeri. To je zato, ker v skladu z ohranitvijo zakona gibanja vibrirajoči predmet rad še naprej vibrira v isti ravnini, zato je za spremembo smeri mogoče uporabiti vsako vibracijsko odstopanje.

Žiroskop vsebuje tudi lasten mikrokrmilnik za izračun zvitka, koraka in nihanja skozi nekaj domišljijske matematike.

Toda surovi žiroskopski podatki trpijo zaradi hrupa in premikanja, zato smo z zunanjo knjižnico poenostavili stvari in nam dali čiste uporabne podatke.

Neopixel so LED diode RGB, ki so individualno naslovljive in vezane v pasove in obroče. Delujejo na 5V in vsebujejo lastno vezje, zato morate napajati neopiksele in komunicirati z njimi prek podatkovne linije. Komunikacija poteka z eno samo podatkovno vrstico, ki vsebuje uro in podatke (več podrobnosti tukaj). Adafruit ponuja čisto knjižnico za interakcijo z obroči neopikselov.

Koda

Znotraj funkcije l oop () se pokliče knjižnica MPU6050_6Axis_MotionApps20. Ko ima knjižnica nove podatke iz žiroskopa, pokliče redrawLeds (x, y, z) s 3 argumenti, ki predstavljajo nihanje, višino in višino

Znotraj redrawLeds ():

- osredotočamo se na dve osi: y, z

- omejujemo obe osi od -MAX_ANGLE do +MAX_ANGLE, določili smo največji kot na 45 in ga je mogoče spremeniti

- 360 stopinj razdelimo na 4 kvadrante in za vsakega pokličemo funkcije lightLeds ():

* y negativno, z pozitivno prvi kvadrant bo nadzoroval LED od 0 do 5, kot bo od 0 do 89

* y negativno, z negativno v drugem kvadrantu vodi LED od 6 do 12, kot bo od 89 do 0

*… Itd

- znotraj funkcije lightLeds

* z arctangentom izračunam kot na podlagi dveh osi (preverite priloženo sliko)

* z uporabo funkcije zemljevida arduino izračunavam, kaj se je pokazalo

* ponastavim vse LED diode, razen dveh, ena ustreza položaju LED, ki sem ga že izračunal, in položaj LED pred tem (za prikaz učinka zbledelosti)

* Uporabljam funkcijo, imenovano normalizeLedPosition (), da upoštevam kalibracijo neopiksela. Umerjanje je uporabno, ker je neopixel obroč mogoče poljubno zavrteti in ga poravnati z žiroskopom

* Tiskam tudi vlečno os, kaj ima LED svetlobo in kot

Matematika

Priložil sem sliko z LED obročem in trigonometrično funkcijo za določanje kota.

Priporočena: