Turinys:

Giroskopo pramogos su neopikseliniu žiedu: 4 žingsniai (su nuotraukomis)
Giroskopo pramogos su neopikseliniu žiedu: 4 žingsniai (su nuotraukomis)

Video: Giroskopo pramogos su neopikseliniu žiedu: 4 žingsniai (su nuotraukomis)

Video: Giroskopo pramogos su neopikseliniu žiedu: 4 žingsniai (su nuotraukomis)
Video: КЛИП VIKI SHOW "КосмоЛайк" Смешарики 3+ / Вики Шоу 2024, Lapkritis
Anonim
Image
Image

Šioje pamokoje mes naudosime giroskopą MPU6050, neopikselio žiedą ir arduino, kad sukurtume prietaisą, kuris apšviečia šviesos diodus, atitinkančius nuolydžio kampą.

Tai paprastas ir įdomus projektas, kuris bus surinktas ant duonos lentos. Jei atliksite veiksmus, sukursite tai, ką matėte vaizdo įraše. Tai gera pamoka norint sužinoti apie giroskopą ir neopikselių žiedą.

Aš kuriu šią pamoką dėl susidomėjimo, kurį mačiau savo pirmuoju pamokymu čia („Gyroscope Led Control With Arduino“). Šioje instrukcijoje aš pakeičiau paprastus šviesos diodus neopikseliniu žiedu. Žiedą paprasčiau naudoti per „Adafruit“biblioteką ir jis tikrai įspūdingesnis.

Taigi, jei jūs turite šiuos komponentus, tai yra puikus būdas juos panaudoti, aš pabandysiu jus žingsnis po žingsnio sukurti įrenginį ir paaiškinti, kaip jis veikia paskutiniame etape.

1 žingsnis: reikalingi dalykai

Surinkimas
Surinkimas

Dalys

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

2. Duonos lenta

3. MPU6050 giroskopas („eBay“) 1,2 USD

4. 24 neopikselinis žiedas (Adafruit) 17 $

5. 4 x AA baterijų paketas su 4 baterijomis

6. U formos jungiamieji kabeliai (neprivaloma). Aš naudoju šiuos trumpiklius, nes jie geriau atrodo ant duonos lentos, o šviesos diodai yra labiau matomi. „Ebay“galite rasti 140 dėžutę apie 4 USD. Jei neturite šių kabelių, galite juos pakeisti dupontiniais laidais.

Įrankiai:

1. USB į nuoseklųjį FTDI adapterį FT232RL programuoti arduino pro mini

2. „Arduino IDE“

Įgūdžiai: 1. Litavimas, patikrinkite šią pamoką

3. Pagrindinis „arduino“programavimas, ši pamoka gali būti naudinga

2 žingsnis: Surinkimas

Surinkimas
Surinkimas

Pridedu „fzzzing“schemą fzz formatu ir jos paveikslėlį, kad būtų lengviau vizualizuoti ryšius

1. Neopikselio žiedo gale turite lituoti 3 kaiščius, kaip parodyta paveikslėlyje

- lituokite teigiamą kaištį

- lituoti žemę

- lituoti duomenų įvesties kaištį

2. Tada 4x akumuliatoriaus laikiklis turi būti prijungtas prie duonos lentos, paprastas sprendimas yra lituoti du vyriškus dupontinius laidus prie jo gnybtų.

3. Paruoškite duonos lentą.

- padėkite neopikselių žiedą, mikrovaldiklį ir giroskopą ant duonos lentos, kaip parodyta paveikslėlyje

- įdėkite visus neigiamus laidus: prie mikrovaldiklio, neopikselio žiedo, giroskopo

- įdėkite visus teigiamus laidus: prie mikrovaldiklio, neopikselio žiedo, giroskopo

- įdėkite visus duomenų laidus:

* SDA ir SCL nuo mikrovaldiklio iki giroskopo

* smeigtukas D6 nuo mikrovaldiklio iki neopikselio žiedo

- prieš maitinimą dar kartą patikrinkite visas jungtis

- pasirinktinai naudodami lipnią juostelę, užklijuokite akumuliatorių ant „Bradboard“užpakalinės dalies, kad jis laikytųsi vietoje ir būtų nešiojamas

3 žingsnis: kodas ir kalibravimas

Pirmiausia turite atsisiųsti ir įdiegti dvi bibliotekas:

1. Adafruit neopikselių bibliotekos eglė, kontroliuojanti neopikselį

2. MPU6050 biblioteka giroskopui

3. I2CDev bibliotekos šaltinis

Tai dvi puikios bibliotekos, kurios atliks sunkų kėlimą!

Daugiau informacijos apie neopikselius rasite čia

Tada atsisiųskite ir įdiekite mano biblioteką iš čia arba nukopijuokite ją iš apačios:

#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 = klaidinga; // nustatyti tiesa, jei DMP init buvo sėkmingas uint8_t mpuIntStatus; // turi faktinį pertraukimo būsenos baitą iš MPU uint8_t devStatus; // grąžinti būseną po kiekvienos įrenginio operacijos (0 = sėkmė,! 0 = klaida) uint16_t packetSize; // numatomas DMP paketo dydis (numatytasis yra 42 baitai) uint16_t fifoCount; // visų baitų skaičius šiuo metu FIFO uint8_t fifoBuffer [64]; // FIFO saugojimo buferis Quaternion q; // [w, x, y, z] kvaterniono konteineris VectorFloat gravity; // [x, y, z] gravitacijos vektoriaus plūdė ypr [3]; // [posūkis, žingsnis, ritinys] posūkis/žingsnis/ritininis konteineris ir gravitacijos vektorius nepastovus bool mpuInterrupt = false; // rodo, ar MPU pertraukimo kaištis pakilo aukštai

negaliojanti sąranka ()

{Serial.begin (9600); Serial.println („Programa paleista“); inicializacija = initializeGyroscope (); strip.begin (); } void loop () {if (! inicializacija) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); grįžti; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitacija, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} loginis hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = apriboti (x, -1 * MAX_ANGLE, MAX_ANGLE); y = apriboti (y, -1 * MAX_ANGLE, MAX_ANGLE); jei (y 0) {šviesos diodai (y, z, 0, 5, 0, 89); } else if (y <0 ir z 0 ir z 0 ir z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {dvigubas kampas = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = žemėlapis (kampas, nuoAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, kampas); uint32_t spalva; for (int i = 0; i position + LED_OFFSET) {return position + LED_OFFSET; } grįžimo pozicija + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int kampas) {if (millis () - lastPrintTime <500) {return; } Serijinis atspaudas ("a ="); Serijinis atspaudas (kampas); Serijinis atspaudas (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serijinis atspaudas ("y ="); Serijinis atspaudas (y); Serijos spausdinimas (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = milis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 ryšys sėkmingas"): F ("MPU6050 ryšys nepavyko")); Serial.println (F ("DMP inicijavimas …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP inicijavimas nepavyko (kodas))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F (" Įjungiama pertraukimo aptikimas („Arduino“išorinis pertraukimas 0)… "")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F („DMP paruoštas! Laukiama pirmo pertraukimo …“)); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Įkelkite kodą:

Naudodami FTDI adapterį įkelkite kodą į arduino.

Prijunkite maitinimo šaltinį (baterijas)

Kalibravimas:

Svarbiausia čia kalibruoti yra „LED_OFFSET“konstanta. Mano pavyzdyje yra 12. Jums reikia tai sureguliuoti nuo 0 iki 23, kad po maitinimo įjungimo plokštė šviestų ta kryptimi, kuria pakreipiate plokštę.

Jei norite sužinoti daugiau apie tai, kaip tai veikia, peržiūrėkite paskutinį veiksmą

4 veiksmas: kaip tai veikia (neprivaloma)

Kaip tai veikia (neprivaloma)
Kaip tai veikia (neprivaloma)

Pirmiausia šiek tiek informacijos apie giroskopą MPU6050. Tai MEMS giroskopas (MEMS reiškia mikroelektromechanines sistemas).

Kiekvienas MEMs giroskopo tipas turi tam tikrą svyruojantį komponentą, iš kurio galima aptikti kaupimąsi, taigi ir krypties pasikeitimą. Taip yra todėl, kad pagal judėjimo įstatymą vibruojantis objektas mėgsta toliau vibruoti toje pačioje plokštumoje, o bet koks vibracijos nuokrypis gali būti panaudotas krypties pokyčiui išvesti.

Giroskopas taip pat turi savo mikrokontrolerį, kuris apskaičiuoja ritinį, žingsnį ir posūkius per keletą išgalvotų matematikų.

Tačiau neapdoroti giroskopo duomenys kenčia nuo triukšmo ir dreifo, todėl mes panaudojome išorinę biblioteką, kad išlygintume ir suteiktume švarius tinkamus naudoti duomenis.

„Neopixel“yra RGB šviesos diodai, adresuojami individualiai ir susieti į juostas ir žiedus. Jie veikia su 5 V įtampa ir turi savo grandines, todėl jums reikia tik įjungti neopikselius ir bendrauti su jais naudojant duomenų liniją. Ryšys vyksta naudojant vieną duomenų liniją, kurioje yra laikrodis ir duomenys (daugiau informacijos rasite čia). „Adafruit“yra švari biblioteka, skirta bendrauti su neopikselių žiedais.

Kodas

Funkcijos l oop () viduje iškviečiama biblioteka MPU6050_6Axis_MotionApps20. Kai biblioteka turi naujų duomenų iš giroskopo, ji vadina „redrawLeds“(x, y, z) su 3 argumentais, atstovaujančiais posūkiui, žingsniui ir posūkiui

„RedrawLeds“() viduje:

- mes sutelkiame dėmesį į dvi ašis: y, z

- mes apribojame abi ašis nuo -MAX_ANGLE iki +MAX_ANGLE, nustatėme maksimalų kampą iki 45 ir jį galima keisti

- mes padalijame 360 laipsnių sluoksnius į 4 kvadrantus ir kiekvienam iškviečiame „lightLeds“() funkcijas taip:

* y neigiamas, z teigiamas pirmasis kvadrantas valdys šviesos diodus nuo 0 iki 5, kampas bus nuo 0 iki 89

* y neigiamas, z neigiamas antrojo kvadranto valdymas paskatino nuo 6 iki 12, kampas bus nuo 89 iki 0

*… Ir tt

- „lightLeds“funkcijos viduje

* Aš skaičiuoju kampą pagal dvi ašis, naudodami arktangentą (patikrinkite pridėtą paveikslėlį)

* Aš skaičiuoju, kas paskatino parodyti, naudojant arduino žemėlapio funkciją

* Aš iš naujo nustatysiu LED juostelę, išskyrus du, vieną, kuri atitinka prieš tai apskaičiuotą poziciją ir prieš tai (parodyti išblukimo efektą)

* Aš naudoju funkciją normalizeLedPosition (), kad galėčiau atsižvelgti į neopikselių kalibravimą. Kalibravimas yra naudingas, nes neopikselio žiedas gali būti pasuktas taip, kaip patinka, ir turi būti suderintas su giroskopu

* Aš taip pat spausdinu vilkimo ašį, kokia lemputė turi šviesą ir kampą

Matematika

Pridedu paveikslėlį su LED žiedu ir trigonometrine funkcija, naudojama kampui nustatyti.

Rekomenduojamas: