Satura rādītājs:

Žiroskopa izklaide ar neopikselu gredzenu: 4 soļi (ar attēliem)
Žiroskopa izklaide ar neopikselu gredzenu: 4 soļi (ar attēliem)

Video: Žiroskopa izklaide ar neopikselu gredzenu: 4 soļi (ar attēliem)

Video: Žiroskopa izklaide ar neopikselu gredzenu: 4 soļi (ar attēliem)
Video: Гироскоп у совы 2024, Novembris
Anonim
Image
Image

Šajā apmācībā mēs izmantosim žiroskopu MPU6050, neopikselu gredzenu un arduino, lai izveidotu ierīci, kas apgaismo gaismas diodes atbilstoši slīpuma leņķim.

Šis ir vienkāršs un jautrs projekts, un tas tiks salikts uz maizes dēļa. Ja izpildīsit norādītās darbības, izveidosiet to, ko redzējāt videoklipā. Tā ir laba apmācība, lai uzzinātu par žiroskopu un neopikselu gredzenu.

Es veidoju šo apmācību intereses dēļ, ko es redzēju par savu pirmo pamācību šeit (žiroskopa LED vadība ar Arduino). Šajā pamācībā es vienkāršos gaismas diodes esmu aizstājis ar neopikselu gredzenu. Gredzenu ir vieglāk izmantot, izmantojot Adafruit bibliotēku, un tas noteikti ir iespaidīgāks.

Tātad, ja jums ir šīs sastāvdaļas, tas ir lielisks veids, kā tos izmantot, es mēģināšu jums soli pa solim izveidot ierīci, kā arī izskaidrot, kā tā darbojas pēdējā solī.

1. darbība. Nepieciešamās lietas

Montāža
Montāža

Daļas

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

2. Maizes dēlis

3. MPU6050 žiroskops (eBay) 1,2 $

4. 24 neopikseļu gredzens (Adafruit) 17 $

5. 4 x AA bateriju komplekts ar 4 baterijām

6. U formas džempera kabeļi (pēc izvēles). Esmu izmantojis šos savienojuma kabeļus, jo tie labāk izskatās uz maizes dēļa, un gaismas diodes ir labāk redzamas šādā veidā. Jūs varat atrast 140 kastīti ebay par aptuveni 4 USD. Ja jums nav šo kabeļu, varat tos nomainīt ar dupont vadiem.

Rīki:

1. USB uz sērijas FTDI adapteri FT232RL arduino pro mini programmēšanai

2. Arduino IDE

Prasmes: 1. Lodēšana, pārbaudiet šo apmācību

3. Pamata arduino programmēšana, šī apmācība varētu būt noderīga

2. solis: montāža

Montāža
Montāža

Es pievienoju fritzing shēmu fzz formātā un tās attēlu, lai viegli vizualizētu savienojumus

1. Neopikselveida gredzena aizmugurē jums jāpielodē 3 vīriešu tapas, kā parādīts attēlā

- lodējiet pozitīvo tapu

- lodēt zemi

- lodēt datu ievades tapu

2. Tad 4x akumulatora turētājam ir jābūt savienojamam ar maizes dēli, vienkāršs risinājums ir pielodēt divus tērauda dupont vadus pie tā spailēm.

3. Sagatavojiet maizes dēli.

- novietojiet neopikseļu gredzenu, mikrokontrolleru un žiroskopu uz maizes dēļa tāpat kā attēlā

- ievietojiet visus negatīvos vadus: mikrokontrolleram, neopikselu gredzenam, žiroskopam

- ievietojiet visus pozitīvos vadus: mikrokontrolleram, neopikselu gredzenam, žiroskopam

- novietojiet visus datu vadus:

* SDA un SCL no mikrokontrollera līdz žiroskopam

* tapa D6 no mikrokontrollera līdz neopikselu gredzenam

- pirms barošanas vēlreiz pārbaudiet visus savienojumus

- pēc izvēles, izmantojot līmlenti, uzlīmējiet akumulatora bloku bradboard aizmugurē, lai tas turētos vietā un padarītu to pārnēsājamu

3. darbība: kods un kalibrēšana

Vispirms jums ir jālejupielādē un jāinstalē divas bibliotēkas:

1. Adafruit neopikselu bibliotēkas egle, kas kontrolē neopikselu

2. MPU6050 bibliotēka žiroskopam

3. I2CDev bibliotēkas avots

Tās ir divas lieliskas bibliotēkas, kas veiks smago celšanu!

Sīkāka informācija par neopikseliem šeit

Pēc tam lejupielādējiet un instalējiet manu bibliotēku no šejienes vai nokopējiet to no apakšas:

#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); neparakstīts garš lastPrintTime = 0; bool inicializācija = nepatiesa; // iestatīt patiesu, ja DMP init bija veiksmīgs uint8_t mpuIntStatus; // satur faktisko pārtraukšanas statusa baitu no MPU uint8_t devStatus; // atgriešanās statuss pēc katras ierīces darbības (0 = veiksme,! 0 = kļūda) uint16_t packetSize; // paredzamais DMP paketes izmērs (noklusējums ir 42 baiti) uint16_t fifoCount; // visu baitu skaits, kas pašlaik atrodas FIFO uint8_t fifoBuffer [64]; // FIFO krātuves buferis Quaternion q; // [w, x, y, z] kvaterniona konteiners VectorFloat gravity; // [x, y, z] gravitācijas vektora pludiņš ypr [3]; // [pagrieziens, slīpums, rullis] satricinājums/slīpuma/ruļļa konteiners un gravitācijas vektors gaistošs bools mpuInterrupt = false; // norāda, vai MPU pārtraukšanas tapa ir paaugstinājusies

anulēts iestatījums ()

{Sērijas sākums (9600); Serial.println ("Programma sākta"); inicializācija = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = nepatiess; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); atgriešanās; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitācija, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} Būla hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = ierobežot (x, -1 * MAX_ANGLE, MAX_ANGLE); y = ierobežot (y, -1 * MAX_ANGLE, MAX_ANGLE); ja (y 0) {lightLeds (y, z, 0, 5, 0, 89); } cits if (y <0 un z 0 un z 0 un 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 = karte (leņķis, noAngle, uzAngle, noLedPosition, toLedPosition); printDebug (x, y, ledNr, leņķis); uint32_t krāsa; par (int i = 0; i pozīcija + LED_OFFSET) {atgriešanās pozīcija + LED_OFFSET; } atgriešanās pozīcija + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int leņķis) {if (millis () - lastPrintTime <500) {return; } Sērijas nospiedums ("a ="); Sērijas nospiedums (leņķis); Sērijas nospiedums (";"); 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 = milis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 savienojums izdevies"): F ("MPU6050 savienojums neizdevās")); Serial.println (F ("DMP inicializēšana …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP inicializācija neizdevās (kods))); Serial.println (devStatus); atgriezt nepatiesu;} mpu.setDMPEnabled (true); Serial.println (F (" Iespējo pārtraukuma noteikšana (Arduino ārējais pārtraukums 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gatavs! Gaida pirmo pārtraukumu … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Augšupielādējiet kodu:

Izmantojot FTDI adapteri, augšupielādējiet kodu arduino.

Pievienojiet barošanas avotu (baterijas)

Kalibrēšana:

Vissvarīgākais šeit kalibrēt ir "LED_OFFSET" konstante. Manā piemērā ir 12. Jums tas jāpielāgo no 0 līdz 23, lai pēc plātnes barošanas LED iedegtos virzienā, kurā jūs noliecat dēli.

Ja vēlaties uzzināt vairāk par to, kā tas darbojas, pārbaudiet pēdējo darbību

4. darbība. Kā tas darbojas (pēc izvēles)

Kā tas darbojas (pēc izvēles)
Kā tas darbojas (pēc izvēles)

Vispirms nedaudz informācijas par žiroskopu MPU6050. Šis ir MEMS žiroskops (MEMS apzīmē mikroelektromehāniskās sistēmas).

Katram MEMs žiroskopa tipam ir kāda veida svārstīga sastāvdaļa, no kuras var noteikt uzkrāšanos un līdz ar to arī virziena maiņu. Tas ir tāpēc, ka saskaņā ar kustības likumu vibrējošam objektam patīk turpināt vibrēt tajā pašā plaknē, un jebkuras vibrācijas novirzes var izmantot, lai iegūtu virziena izmaiņas.

Žiroskopā ir arī savs mikrokontrolleris, lai aprēķinātu rullīti, piķi un pagriešanos, izmantojot dažas izdomātas matemātikas.

Bet žiroskopu neapstrādātie dati cieš no trokšņa un novirzes, tāpēc mēs izmantojām ārēju bibliotēku, lai izlīdzinātu lietas un sniegtu mums tīrus izmantojamos datus.

Neopikseli ir RGB gaismas diodes, kas individuāli adresējamas un sasaistītas joslās un gredzenos. Tie darbojas ar 5 V spriegumu, un tiem ir savas shēmas, tāpēc jums ir nepieciešams tikai barot neopikseļus un sazināties ar tiem, izmantojot datu līniju. Saziņa notiek ar vienu datu līniju, kas satur pulksteni un datus (sīkāka informācija šeit). Adafruit nodrošina tīru bibliotēku mijiedarbībai ar neopikselu gredzeniem.

Kods

Funkcijas l oop () iekšpusē tiek izsaukta bibliotēka MPU6050_6Axis_MotionApps20. Kad bibliotēkai ir jauni dati no žiroskopas, tā izsauc redrawLeds (x, y, z) ar 3 argumentiem, kas apzīmē pagriezienu, soli un pagriezienu

Inside redrawLeds ():

- mēs koncentrējamies uz divām asīm: y, z

- mēs ierobežojam abas asis no -MAX_ANGLE līdz +MAX_ANGLE, mēs definējām maksimālo leņķi līdz 45 un tas ir maināms

- mēs sadalām 360 grādus 4 kvadrantos un izsaucam lightLeds () funkcijas katram šādi:

* y negatīvs, z pozitīvs pirmais kvadrants kontrolēs gaismas diodes no 0 līdz 5, leņķis būs no 0 līdz 89

* y negatīvs, z negatīvs otrā kvadranta vadība noveda no 6 līdz 12, leņķis būs no 89 līdz 0

*… Utt

- LightLeds funkcijas iekšpusē

* Es aprēķinu leņķi, pamatojoties uz divām asīm, izmantojot arktangentu (pārbaudiet pievienoto attēlu)

* Es aprēķinu, kas noveda pie parādīšanās, izmantojot arduino kartes funkciju

* Es atiestatīju visas gaismas diodes, izņemot divas, vienu, kas atbilst iepriekš aprēķinātajai un iepriekšējai pozīcijai (lai parādītu izbalēšanas efektu)

* Es izmantoju funkciju normalizeLedPosition (), lai ņemtu vērā neopikselu kalibrēšanu. Kalibrēšana ir noderīga, jo neopikseļu gredzenu var pagriezt pēc vēlēšanās un tas ir jāsaskaņo ar žiroskopu

* Es arī drukāju vilkšanas asi, kam ir gaisma un leņķis

Matemātika

Esmu pievienojis attēlu ar LED gredzenu un trigonometrisko funkciju, ko izmanto leņķa noteikšanai.

Ieteicams: