Orodha ya maudhui:

Furaha ya Gyroscope na Gonga ya Neopikseli: Hatua 4 (na Picha)
Furaha ya Gyroscope na Gonga ya Neopikseli: Hatua 4 (na Picha)

Video: Furaha ya Gyroscope na Gonga ya Neopikseli: Hatua 4 (na Picha)

Video: Furaha ya Gyroscope na Gonga ya Neopikseli: Hatua 4 (na Picha)
Video: Собаку бросили в лесу с коробкой макарон. История собаки по имени Ринго. 2024, Novemba
Anonim
Image
Image

Katika mafunzo haya tutatumia gyroscope ya MPU6050, pete ya neopixel na arduino kujenga kifaa ambacho taa ziliongoza zinazoendana na pembe ya mwelekeo.

Huu ni mradi rahisi na wa kufurahisha na utakusanywa kwenye ubao wa mkate. Ikiwa utafuata hatua utaunda kile ulichoona kwenye video. Ni mafunzo mazuri ya kujifunza kuhusu gyroscope na pete ya neopixel.

Ninaunda mafunzo haya kwa sababu ya maslahi niliyoyaona kwenye mafunzo yangu ya kwanza hapa (Gyroscope Led Control With Arduino). Katika hii inayoweza kufundishwa nimebadilisha iliyoongozwa rahisi na pete ya neopixel. Pete ni rahisi kutumia kupitia maktaba ya Adafruit na ni ya kushangaza zaidi.

Kwa hivyo ikiwa una vifaa hivi vimelala hapa ni njia nzuri ya kuzitumia, nitajaribu kukuchukua hatua kwa hatua kupitia kujenga kifaa na pia kuelezea jinsi inavyofanya kazi katika hatua ya mwisho.

Hatua ya 1: Vitu vinahitajika

Mkutano
Mkutano

Sehemu

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

2. Bodi ya mkate

3. MPU6050 gyroscope (eBay) 1.2 $

4. pete 24 iliyoongozwa na neopixel (Adafruit) 17 $

5. 4 x AA pakiti ya betri na betri 4

6. Kamba za jumper za umbo la U (hiari). Nimetumia nyaya hizi za kuruka kwa sababu zinaonekana vizuri kwenye ubao wa mkate, na viongo vinaonekana zaidi kwa njia hii. Unaweza kupata sanduku la 140 kwenye ebay karibu $ 4. Ikiwa hauna nyaya hizi unaweza kuzibadilisha na waya za dupont.

Zana:

1. USB kwa adapta ya serial FTDI FT232RL kusanidi mini ya arduino pro

2. Arduino IDE

Ujuzi: 1. Kuunganisha, angalia mafunzo haya

3. Programu ya msingi ya arduino, mafunzo haya yanaweza kuwa muhimu

Hatua ya 2: Mkutano

Mkutano
Mkutano

Nimeambatanisha muundo wa fritzing katika muundo wa fzz na picha yake kwa taswira rahisi ya unganisho

1. Unahitaji kutia pini 3 za kiume nyuma ya pete ya neopixel kama inavyoonekana kwenye picha

- solder pini nzuri

- solder chini

- solder pini ya kuingiza data

2. Kisha mmiliki wa betri 4x anapaswa kuwa na njia ya kuunganisha kwenye ubao wa mkate, suluhisho rahisi ni kuziunganisha waya mbili za dupont kwa vituo vyake.

3. Andaa ubao wa mkate.

- weka pete ya neopixel, microcontroller na gyroscope kwenye ubao wa mkate kama kwenye picha

- weka waya zote hasi: kwa microcontroller, neopixel pete, gyro

- weka waya zote chanya: kwa microcontroller, pete ya neopixel, gyro

- weka waya zote za data:

* SDA na SCL kutoka kwa hadi kwa mdhibiti mdogo hadi gyro

* piga D6 kutoka kwa mdhibiti mdogo hadi kwenye pete ya neopixel

- angalia maunganisho yote kabla ya kuwezesha

- kwa hiari kutumia mkanda wa bomba, weka pakiti ya betri nyuma ya bradboard ili kuishikilia na kuifanya iweze kusonga

Hatua ya 3: Kanuni na Upimaji

Kwanza unahitaji kupakua na kusanikisha maktaba mbili:

1. Fir ya maktaba ya neopixel inayodhibiti neopixel

2. Maktaba ya MPU6050 kwa gyroscope

3. Chanzo cha maktaba ya I2CDev

Ni maktaba mbili kubwa ambazo zitafanya kuinua nzito!

Maelezo zaidi juu ya neopixels hapa

Kisha pakua na usakinishe maktaba yangu kutoka hapa au unakili kutoka hapa chini:

# pamoja na "I2Cdev.h"

# pamoja # # pamoja na "MPU6050_6Mhimili_MotionApps20.h" # pamoja na "Wire.h" #fafanua NEOPIXED_CONTROL_PIN 6 #fafanua NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Ukanda wa Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned longPrintTime ndefu = 0; uanzishaji wa bool = uwongo; // weka kweli ikiwa init ya DMP ilifanikiwa uint8_t mpuIntStatus; // inashikilia hali halisi ya usumbufu kutoka kwa MPU uint8_t devStatus; // hali ya kurudi baada ya kila operesheni ya kifaa (0 = mafanikio,! 0 = kosa) uint16_t packetSize; // ukubwa wa pakiti ya DMP inayotarajiwa (chaguo-msingi ni ka 42) uint16_t fifoCount; // hesabu ya ka zote zilizo katika FIFO uint8_t fifoBuffer [64]; // bafa ya kuhifadhi FIFO Quaternion q; // [w, x, y, z] chombo cha quaternion mvuto wa VectorFloat; // [x, y, z] vector ya mvuto kuelea ypr [3]; // [yaw, lami, roll] yaw / lami / chombo na roll ya mvuto bool tete boat mpuInterrupt = uongo; // inaonyesha ikiwa pini ya kukatiza ya MPU imepanda juu

kuanzisha batili ()

{Serial.begin (9600); Serial.println ("Programu imeanza"); kuanzisha = kuanzishaGyroscope (); strip. kuanza (); } kitanzi batili () {if (! initialization) {return; } mpuInterrupt = uongo; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); ikiwa (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); kurudi; } ikiwa (mpuIntStatus & 0x02) {wakati (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, pakitiSize); fifoCount - = pakitiSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpPata Uzito (& mvuto, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & mvuto); redrawLeds (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }} boolean hasFifoOverflown (int mpuIntStatus, int fifoCount) {kurudi mpuIntStatus & 0x10 || fifoCount == 1024; } batili redrawLeds (int x, int y, int z) {x = kubana (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kubana (y, -1 * MAX_ANGLE, MAX_ANGLE); ikiwa (y 0) {taa nyepesi (y, z, 0, 5, 0, 89); } vingine ikiwa (y <0 na z 0 na z 0 na z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} taa nyepesi za taa (int x, int y, int kutokaLedPosition, int toLedPosition, int kutokaAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = ramani (angle, fromAngle, toAngle, fromLedPosition, toLedPosition); kuchapisha Suluhisho (x, y, ledNr, angle); rangi ya uint32_t; kwa (int i = 0; i nafasi + LED_OFFSET) {nafasi ya kurudi + LED_OFFSET; } nafasi ya kurudi + LED_OFFSET - NUM_LEDS; } uchapishaji batiliDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (angle); 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 (";"); mwishoPrintTime = millis (); } bool anzishaGyroscope () {Wire.begin (); TWBR = 24; mpu kuanzisha (); Serial.println (mpu.testConnection () F? Serial.println (F ("Inazindua DMP…")); devStatus = mpu.dmp Anzisha (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); ikiwa (devStatus! = 0) {Serial.print (F ("Uanzishaji wa DMP umeshindwa (msimbo")); Serial.println (devStatus); kurudi uwongo;} mpu.setDMPEnabled (kweli); kukatiza kugundua (Arduino nje kukatiza 0)… ")); ambatanishaInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP iko tayari! Inangojea usumbufu wa kwanza… ")); pakitiSize = mpu.dmpGetFIFOPacketSize (); kurudi kweli;} batili dmpDataReady () {mpuInterrupt = true;}

Pakia nambari:

Kutumia adapta ya FTDI pakia nambari kwa arduino.

Unganisha usambazaji wa umeme (betri)

Upimaji:

Jambo muhimu zaidi la kupima hapa ni "LED_OFFSET" mara kwa mara. Katika mfano wangu ni miaka 12. Unahitaji kurekebisha hii kutoka 0 hadi 23 ili baada ya kuwekea bodi bodi iliyoongozwa itawaka kwa mwelekeo unaoweka bodi.

Ikiwa unataka kujua maelezo zaidi juu ya jinsi inavyofanya kazi angalia hatua ya mwisho

Hatua ya 4: Jinsi Inavyofanya kazi (hiari)

Jinsi Inavyofanya kazi (hiari)
Jinsi Inavyofanya kazi (hiari)

Kwanza habari kidogo juu ya gyroscope ya MPU6050. Hii ni gyroscope ya MEMS (MEMS inasimama kwa mifumo ya Microelectromechanical).

Kila aina ya gyroscope ya MEMs ina aina fulani ya sehemu inayosababisha kutoka mahali ambapo kuongeza kasi, na kwa hivyo mabadiliko ya mwelekeo, inaweza kugunduliwa. Hii ni kwa sababu, kulingana na uhifadhi wa sheria ya mwendo, kitu kinachotetemeka kinapenda kuendelea kutetemeka katika ndege ile ile, na kupotoka kwa kutetemeka kunaweza kutumiwa kupata mabadiliko katika mwelekeo.

Gyro pia ina microcontroller yake ni yake mwenyewe kuhesabu roll, lami na yaw kupitia hesabu kadhaa za kupendeza.

Lakini data ghafi ya gyro inakabiliwa na kelele na kuteleza, kwa hivyo tulitumia maktaba ya nje kulainisha vitu na kutupa data safi inayoweza kutumika.

Neopixel inaongozwa na RGB mmoja mmoja kushughulikiwa na kufungwa kwa bendi na pete. Wanafanya kazi kwenye 5V na zina mzunguko wao kwa hivyo unahitaji tu kuwezesha neopixels na kuwasiliana nao kwa kutumia laini ya data. Mawasiliano hufanywa na laini moja ya data iliyo na saa na data (maelezo zaidi hapa). Adafruit hutoa maktaba safi ya kuingiliana na pete za neopixel.

Nambari

Ndani ya kazi ya l oop () MPU6050_6Axis_MotionApps20 maktaba inaitwa. Wakati maktaba ina data mpya kutoka kwa gyroscpe inaita redrawLeds (x, y, z) na hoja 3 zinazowakilisha yaw, lami na roll

Ndani ya redrawLeds ():

- tunazingatia mhimili mbili: y, z

- tunazuia mihimili yote kutoka -MAX_ANGLE hadi + MAX_ANGLE, tulielezea angle kubwa hadi 45 na inaweza kubadilika

- tunagawanya digrii 360 ndani ya quadrants 4 na kupiga simu lightLeds () kwa kila mmoja kama ifuatavyo:

* y hasi, z chanya kwanza roboduara ya kwanza itadhibiti kuongozwa kutoka 0 hadi 5, pembe itakuwa kutoka 0 hadi 89

* y hasi, z hasi udhibiti wa roboduara ya pili iliyoongozwa kutoka 6 hadi 12, pembe itakuwa kutoka 89 hadi 0

* …na kadhalika

- ndani ya kazi ya LightLeds

* Ninahesabu pembe kulingana na mhimili mbili kwa kutumia arctangent (angalia picha iliyoambatishwa)

* Ninahesabu kile kilichosababisha kuonyesha kutumia kazi ya ramani ya arduino

* Ninaweka upya kamba iliyoongozwa yote isipokuwa mbili zilizoongozwa, ile inayolingana na nafasi iliyoongozwa nimehesabu hapo awali na nafasi iliyoongozwa hapo awali (kuonyesha athari ya kufifia)

* Ninatumia kazi inayoitwa normalizeLedPosition () kuzingatia usanifu wa neopixel. Ulinganishaji ni muhimu kwa sababu pete ya neopixel inaweza kuzungushwa kama inavyopendeza, na inapaswa kuoanishwa na gyroscope

* Ninachapisha pia mhimili wa kukokota, kile kilichoongoza kina mwanga na pembe

Hesabu

Nimeambatanisha picha na pete iliyoongozwa na kazi ya trigonometri inayotumiwa kuamua pembe.

Ilipendekeza: