Sisällysluettelo:

Gyroskooppi hauskaa neopikselirenkaalla: 4 vaihetta (kuvilla)
Gyroskooppi hauskaa neopikselirenkaalla: 4 vaihetta (kuvilla)

Video: Gyroskooppi hauskaa neopikselirenkaalla: 4 vaihetta (kuvilla)

Video: Gyroskooppi hauskaa neopikselirenkaalla: 4 vaihetta (kuvilla)
Video: Ratsutage koolis hoverboardil! Koolis on päev vastupidine! Tagasi kooli. naljakas lastele 2024, Marraskuu
Anonim
Image
Image

Tässä opetusohjelmassa aiomme käyttää MPU6050 -gyroskooppia, neopikselirengasta ja arduinoa rakentaaksesi laitteen, joka sytyttää ledit kaltevuuskulman mukaisesti.

Tämä on yksinkertainen ja hauska projekti, ja se kootaan leipälaudalle. Jos noudatat ohjeita, rakennat videossa näkemäsi. Se on hyvä opetusohjelma gyroskoopin ja neopikselirenkaan oppimiseen.

Rakennan tätä opetusohjelmaa kiinnostukseni vuoksi, jota näin ensimmäisessä opetusohjelmassani (Gyroscope Led Control With Arduino). Tässä ohjeessa olen korvannut yksinkertaiset ledit neopikselirenkaalla. Rengas on yksinkertaisempi käyttää Adafruit -kirjaston kautta ja se on ehdottomasti näyttävämpi.

Joten jos sinulla on näitä komponentteja, tämä on loistava tapa käyttää niitä, yritän opastaa sinua askel askeleelta laitteen rakentamisen läpi ja selittää myös, miten se toimii viimeisessä vaiheessa.

Vaihe 1: Tarvittavat asiat

Kokoonpano
Kokoonpano

Osat

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

2. Leipälauta

3. MPU6050 gyroskooppi (eBay) 1,2 dollaria

4. 24 neopixel led -rengas (Adafruit) 17 $

5. 4 x AA -paristo 4 paristolla

6. U-muotoiset hyppyjohdot (valinnainen). Olen käyttänyt näitä hyppyjohtoja, koska ne näyttävät paremmilta leipälaudalla ja ledit näkyvät paremmin tällä tavalla. Löydät 140 laatikon ebaystä noin 4 dollaria. Jos sinulla ei ole näitä kaapeleita, voit korvata ne dupont -johdoilla.

Työkalut:

1. USB -sarja FTDI -sovitin FT232RL arduino pro minin ohjelmointiin

2. Arduino IDE

Taidot: 1. Juotos, tarkista tämä opetusohjelma

3. Perus arduino -ohjelmointi, tämä opetusohjelma voi olla hyödyllinen

Vaihe 2: Kokoonpano

Kokoonpano
Kokoonpano

Olen liittänyt fritzing -kaavion fzz -muodossa ja kuvan siitä yhteyksien visualisoimiseksi

1. Sinun on juotettava 3 urospistettä neopikselirenkaan takaosaan kuten kuvassa

- juota positiivinen tappi

- juottaa maata

- juota tietojen syöttötappi

2. Tällöin 4x -paristopidikkeellä pitäisi olla tapa liittää leipälevyyn, helppo ratkaisu on juottaa kaksi urospuolista dupont -johtoa sen liittimiin.

3. Valmistele leipälauta.

- aseta neopikselirengas, mikrokontrolleri ja gyroskooppi leipälevylle kuten kuvassa

- aseta kaikki negatiiviset johdot: mikrokontrolleriin, neopikselirenkaaseen, gyroon

- aseta kaikki positiiviset johdot: mikrokontrolleriin, neopikselirenkaaseen, gyroon

- aseta kaikki datajohdot:

* SDA ja SCL mikrokontrollerista gyroskooppiin

* nasta D6 mikrokontrollerista neopikselirenkaaseen

- tarkista kaikki liitännät ennen virran kytkemistä

- vaihtoehtoisesti käyttämällä teippiä, teippaa akku bradboardin takaosaan, jotta se pysyy paikallaan ja tekee siitä kannettavamman

Vaihe 3: Koodi ja kalibrointi

Ensin sinun on ladattava ja asennettava kaksi kirjastoa:

1. Adafruit -neopikselikirjasto, joka hallitsee neopikseliä

2. MPU6050 -kirjasto gyroskoopille

3. I2CDev -kirjaston lähde

Ne ovat kaksi suurta kirjastoa, jotka tekevät raskaan nostamisen!

Lisätietoja neopikseleistä täällä

Lataa ja asenna sitten kirjasto täältä tai kopioi se alta:

#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); allekirjoittamaton pitkä lastPrintTime = 0; boolin alustus = false; // aseta tosi, jos DMP -aloitus onnistui uint8_t mpuIntStatus; // omistaa todellisen keskeytystilan tavun MPU: sta uint8_t devStatus; // palautustila jokaisen laitteen käytön jälkeen (0 = onnistunut,! 0 = virhe) uint16_t packetSize; // odotettu DMP -paketin koko (oletus on 42 tavua) uint16_t fifoCount; // kaikkien tällä hetkellä FIFO: ssa olevien tavujen määrä uint8_t fifoBuffer [64]; // FIFO -tallennuspuskuri Quaternion q; // [w, x, y, z] kvaternionisäiliö VectorFloat gravity; // [x, y, z] painovoimavektori float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll säiliö ja painovoimavektori haihtuva bool mpuInterrupt = false; // osoittaa, onko MPU -keskeytystappi korkea

mitätön asennus ()

{Serial.begin (9600); Serial.println ("Ohjelma käynnistyi"); alustus = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); palata; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& painovoima, & q); mpu.dmpGetYawPitchRoll (ypr, & q ja & 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 = rajoita (x, -1 * MAX_ANGLE, MAX_ANGLE); y = rajoittaa (y, -1 * MAX_ANGLE, MAX_ANGLE); jos (y 0) {lightLeds (y, z, 0, 5, 0, 89); } muu jos (y <0 ja z 0 ja z 0 ja z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} tyhjä valoLed (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 = kartta (kulma, kulmasta, kulmasta, kulmaan, kulmastaLedPosition, toLedPosition); printDebug (x, y, ledNr, kulma); uint32_t väri; for (int i = 0; i position + LED_OFFSET) {return position + LED_OFFSET; } paluupaikka + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int kulma) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (kulma); 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 -yhteys onnistui"): F ("MPU6050 -yhteys epäonnistui")); Serial.println (F ("DMP: n alustaminen…")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -alustus epäonnistui (koodi))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F (" Käytössä keskeytyksen tunnistus (Arduino ulkoinen keskeytys 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP valmis! Odotetaan ensimmäistä keskeytystä … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Lataa koodi:

Lataa koodi FDDI -sovittimella arduinoon.

Liitä virtalähde (paristot)

Kalibrointi:

Tärkein kalibroitava asia tässä on "LED_OFFSET" -vakio. Esimerkkini on 12. Sinun on säädettävä tämä 0: sta 23: een, jotta LED -valo syttyy levyn virran kytkemisen jälkeen siihen suuntaan, johon lautaa kallistetaan.

Jos haluat lisätietoja sen toiminnasta, tutustu viimeiseen vaiheeseen

Vaihe 4: Kuinka se toimii (valinnainen)

Kuinka se toimii (valinnainen)
Kuinka se toimii (valinnainen)

Ensin vähän tietoa MPU6050 -gyroskoopista. Tämä on MEMS -gyroskooppi (MEMS tarkoittaa mikroelektromekaanisia järjestelmiä).

Jokaisessa MEMs -gyroskoopin tyypissä on jonkinlainen värähtelevä komponentti, josta kertyminen ja siten suunnanmuutos voidaan havaita. Tämä johtuu siitä, että liikelainsäädännön mukaan värisevä esine haluaa jatkaa värähtelyä samassa tasossa, ja mitä tahansa värähtelypoikkeamaa voidaan käyttää suunnanmuutoksen johtamiseen.

Gyrossa on myös oma mikrokontrolleri, joka laskee heiton, sävelkorkeuden ja kääntymisen hienojen matematiikan avulla.

Mutta gyro -raakatiedot kärsivät melusta ja ajelehtimisesta, joten käytimme ulkoista kirjastoa tasoittaaksemme asiat ja saadaksemme puhtaita käyttökelpoisia tietoja.

Neopixelit ovat RGB -ledit, jotka voidaan yksilöidä erikseen ja ketjuttaa nauhoiksi ja renkaiksi. Ne toimivat 5 V: n jännitteellä ja sisältävät oman piirinsä, joten sinun tarvitsee vain syöttää virtaa neopikseleille ja kommunikoida niiden kanssa tietolinjan avulla. Tiedonsiirto tapahtuu yhdellä datalinjalla, joka sisältää kellon ja tiedot (lisätietoja täältä). Adafruit tarjoaa puhtaan kirjaston vuorovaikutukseen neopikselirenkaiden kanssa.

Koodi

L oop () -funktion sisällä kutsutaan MPU6050_6Axis_MotionApps20 -kirjastoa. Kun kirjastolla on uusia tietoja gyroscpeista, se kutsuu redrawLeds (x, y, z), jossa on 3 argumenttia, jotka edustavat kääntymistä, nousua ja heilumista

Sisällä redrawLeds ():

- keskitymme kahteen akseliin: y, z

- rajoitamme molempia akseleita arvosta -MAX_ANGLE arvoon +MAX_ANGLE, määritimme maksimikulman 45 ja se on vaihdettavissa

- jaamme 360 astetta neljään neljännekseen ja kutsumme lightLeds () -funktiot kullekin seuraavasti:

* y negatiivinen, z positiivinen ensimmäinen kvadrantti ohjaa ledit 0: sta 5: een, kulma on 0 - 89

* y negatiivinen, z negatiivinen toisen neljänneksen ohjaimet johtivat 6: sta 12: een, kulma on 89 - 0

* …jne

- LightLeds -toiminnon sisällä

* Lasken kulman kahden akselin perusteella arktangentin avulla (tarkista oheinen kuva)

* Lasken arduino -karttatoiminnon avulla, mikä johti näyttämiseen

* Nollaan led -nauhan kaikki kaksi lukuun ottamatta lediä, joka vastaa aiemmin laskemaani led -asentoa ja led -asentoa ennen (häivytysvaikutuksen näyttämiseksi)

* Käytän funktiota normalizeLedPosition () ottaakseni huomioon neopikselin kalibroinnin. Kalibrointi on hyödyllistä, koska neopikselirengasta voidaan kääntää miellyttävästi ja se tulee kohdistaa gyroskoopin kanssa

* tulostan myös hinausakselia, missä ledissä on valo ja kulma

Matematiikka

Olen liittänyt kuvan, jossa on led -rengas ja kulman määrittämiseen käytetty trigonometrinen funktio.

Suositeltava: