Բովանդակություն:

Gyroscope Fun with Neopixel Ring: 4 քայլ (նկարներով)
Gyroscope Fun with Neopixel Ring: 4 քայլ (նկարներով)

Video: Gyroscope Fun with Neopixel Ring: 4 քայլ (նկարներով)

Video: Gyroscope Fun with Neopixel Ring: 4 քայլ (նկարներով)
Video: Gyroscope fun with Neopixel ring 2024, Նոյեմբեր
Anonim
Image
Image

Այս ձեռնարկում մենք կօգտագործենք MPU6050 գիրոսկոպը, նեոպիքսելային մատանին և arduino- ն `սարքելու համար, որը լուսարձակում է լուսադիոդները` համապատասխան թեքության անկյունին:

Սա պարզ և զվարճալի նախագիծ է և այն հավաքվելու է հացահատիկի վրա: Եթե հետևեք քայլերին, կկառուցեք այն, ինչ տեսել եք տեսանյութում: Դա լավ ձեռնարկ է գիրոսկոպի և նեոպիքսել օղակի մասին սովորելու համար:

Ես կառուցում եմ այս ձեռնարկը այն հետաքրքրության պատճառով, որը տեսա այստեղ իմ առաջին հրահանգի ժամանակ (Gyroscope Led Control With Arduino): Այս ուսանելիում ես պարզ լուսադիոդները փոխարինել եմ նեոպիքսելային օղակով: Մատանին ավելի պարզ է օգտագործել Adafruit գրադարանի միջոցով և միանշանակ ավելի տպավորիչ է:

Այսպիսով, եթե դուք ունեք այս բաղադրիչները, դրանք օգտագործելու հիանալի միջոց է, ես կփորձեմ քայլ առ քայլ տանել ձեզ սարքը կառուցելու միջոցով և նաև բացատրել, թե ինչպես է այն աշխատում վերջին քայլին:

Քայլ 1: Պահանջվող բաներ

Ժողով
Ժողով

Մասեր

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

2. Հացաթուղթ

3. MPU6050 գիրոսկոպ (eBay) 1.2 $

4. 24 neopixel led մատանի (Adafruit) 17 $

5. 4 x AA մարտկոցի փաթեթ `4 մարտկոցով

6. U- ձևի jumper մալուխներ (ըստ ցանկության): Ես օգտագործել եմ այս թռիչքային մալուխները, քանի որ դրանք ավելի լավ տեսք ունեն տախտակի վրա, իսկ լուսարձակները այս կերպ ավելի տեսանելի են: Ebay- ում կարող եք գտնել 140 տուփ ՝ մոտ 4 դոլարով: Եթե դուք չունեք այս մալուխները, կարող եք դրանք փոխարինել dupont լարերով:

Գործիքներ:

1. USB սերիական FTDI ադապտեր FT232RL ՝ arduino pro mini ծրագրավորելու համար

2. Arduino IDE

Հմտություններ: 1. Sոդում, ստուգեք այս ձեռնարկը

3. Հիմնական arduino ծրագրավորում, այս ձեռնարկը կարող է օգտակար լինել

Քայլ 2: Հավաքում

Ժողով
Ժողով

Ես կցել եմ ցնցող սխեմա fzz ձևաչափով և դրա նկարը `կապերի հեշտ պատկերացման համար

1. Նեոպիքսելային օղակի հետևի մասում դուք պետք է զոդեք 3 արական կապում, ինչպես ցույց է տրված նկարում

- կպցրեք դրական քորոցը

- կպցնել գետնին

- կպցնել տվյալների մուտքագրման քորոցը

2. Այնուհետև 4x մարտկոցի կրիչը պետք է ունենա տախտակին միանալու միջոց: Հեշտ լուծում է երկու արական dupont լարերը միացնել դրա տերմինալներին:

3. Պատրաստել հացահատիկը:

- տեղադրեք նեոպիքսելային մատանին, միկրոկոնտրոլերը և գիրոսկոպը սեղանի վրա, ինչպես նկարում

- տեղադրեք բոլոր բացասական լարերը `միկրոկոնտրոլերին, նեոպիքսելային մատանին, գիրո

- տեղադրեք բոլոր դրական լարերը `միկրոկոնտրոլերին, նեոպիքսելային մատանին, գիրո

- տեղադրել բոլոր տվյալների լարերը.

* SDA և SCL ՝ միկրոկառավարիչից մինչև գիրո

* կապում D6 միկրոկառավարիչից մինչև նեոպիքսելային օղակ

- միացնելուց առաջ կրկնակի ստուգեք բոլոր միացումները

- ըստ ցանկության, կպչուն ժապավեն օգտագործելով, մարտկոցը կպցրեք գրատախտակի հետևի մասում ՝ այն տեղում պահելու և ավելի դյուրակիր դարձնելու համար:

Քայլ 3. Կոդ և չափագրում

Նախ անհրաժեշտ է ներբեռնել և տեղադրել երկու գրադարան.

1. Adafruit neopixel գրադարանի եղեւնի, որը վերահսկում է neopixel- ը

2. MPU6050 գրադարան գիրոսկոպի համար

3. I2CDev գրադարանի աղբյուր

Նրանք երկու հիանալի գրադարաններ են, որոնք կկատարեն ծանր բեռը:

Նեոպիքսելների մասին ավելի մանրամասն ՝ այստեղ

Այնուհետև ներբեռնեք և տեղադրեք իմ գրադարանը այստեղից կամ պատճենեք այն ներքևից.

#ներառել «I2Cdev.h»

#ներառել #ներառել "MPU6050_6Axis_MotionApps20.h" #ներառել "Wire.h" #սահմանել NEOPIXED_CONTROL_PIN 6 #սահմանել NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 մպ; Adafruit_NeoPixel շերտ = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); անստորագիր երկար lastPrintTime = 0; bool սկզբնականացում = կեղծ; // սահմանել true, եթե DMP init- ը հաջող էր uint8_t mpuIntStatus; // պահում է փաստացի ընդհատման կարգավիճակի բայթ MPU uint8_t devStatus- ից; // վերադարձնել կարգավիճակը սարքի յուրաքանչյուր գործողությունից հետո (0 = հաջողություն,! 0 = սխալ) uint16_t packetSize; // ակնկալվող DMP փաթեթի չափը (կանխադրվածը 42 բայթ է) uint16_t fifoCount; // FIFO uint8_t fifoBuffer- ում ներկա պահին բոլոր բայթերի հաշվարկը [64]; // FIFO պահեստավորման բուֆեր Quaternion q; // [w, x, y, z] քառորդ կոնտեյներ VectorFloat gravity; // [x, y, z] ինքնահոս վեկտորը float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll բեռնարկղ և ինքնահոս վեկտոր ցնդող բուլ mpuInterrupt = false; // ցույց է տալիս, թե արդյոք MPU ընդհատման քորոցը բարձրացել է

դատարկ կարգավորում ()

{Serial.begin (9600); Serial.println («startedրագիրը մեկնարկեց»); նախաստորագրում = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = կեղծ; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); եթե (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); վերադարձ; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& ինքնահոս, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & ինքնահոս); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} բուլյան hasFifoOverflown (int mpuIntStatus, int fifoCount) {վերադարձ mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = սահմանափակում (y, -1 * MAX_ANGLE, MAX_ANGLE); եթե (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 և z 0 և z 0 և 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 = քարտեզ (անկյուն, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, անկյուն); uint32_t գույն; համար (int i = 0; i դիրք + LED_OFFSET) {վերադարձի դիրքը + LED_OFFSET; } վերադարձի դիրքը + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int անկյուն) {if (millis () - lastPrintTime <500) {վերադարձ; } Serial.print ("a ="); Serial.print (անկյուն); 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 = միլիարդ (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 կապը հաջող է"). F ("MPU6050 կապը ձախողվեց")); Serial.println (F («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 ("Enabling ընդհատումների հայտնաբերում (Arduino արտաքին ընդհատում 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP պատրաստ է! = mpu.dmpGetFIFOPacketSize (); վերադարձնել ճշմարիտ;} void dmpDataReady () {mpuInterrupt = true;}

Վերբեռնեք ծածկագիրը

Օգտագործելով FTDI ադապտերը, վերբեռնեք կոդը arduino- ում:

Միացրեք սնուցման աղբյուրը (մարտկոցներ)

Կալիբրացում:

Այստեղ ճշգրտման ամենակարևորը «LED_OFFSET» հաստատունն է: Իմ օրինակում 12 -ն է: Դուք պետք է այն կարգավորեք 0 -ից 23 -ի, որպեսզի տախտակը միացնելուց հետո լուսարձակը լուսավորվի այն ուղղությամբ, որը դուք թեքում եք տախտակին:

Եթե ցանկանում եք ավելի շատ մանրամասներ իմանալ, թե ինչպես է այն աշխատում, ստուգեք վերջին քայլը

Քայլ 4: Ինչպես է այն աշխատում (ըստ ցանկության)

Ինչպես է այն աշխատում (ըստ ցանկության)
Ինչպես է այն աշխատում (ըստ ցանկության)

Նախ մի փոքր տեղեկություն MPU6050 գիրոսկոպի մասին: Սա MEMS գիրոսկոպ է (MEMS նշանակում է Միկրոէլեկտրամեխանիկական համակարգեր):

MEMs գիրոսկոպի յուրաքանչյուր տեսակ ունի տատանվող բաղադրիչի մի ձև, որտեղից կարելի է հայտնաբերել կուտակումը և, հետևաբար, ուղղության փոփոխությունը: Դա պայմանավորված է նրանով, որ շարժման օրենքի պահպանման համաձայն, թրթռացող առարկան սիրում է շարունակել թրթռալ նույն հարթությունում, և ցանկացած թրթռումային շեղում կարող է օգտագործվել ուղղության փոփոխություն առաջացնելու համար:

Գիրոսը նաև իր սեփական միկրոկառավարիչն է ՝ հաշվելու համար գլանափաթեթը, սկիպիդարը և հորանջելը որոշ շքեղ մաթեմատիկայի միջոցով:

Բայց գիրո հումքի տվյալները տառապում են աղմուկից և շեղումից, ուստի մենք արտաքին գրադարանից օգտվեցինք `հարթելու և մեզ օգտագործելի մաքուր տվյալներ տալու համար:

Neopixel- ը RGB լուսարձակներ են ՝ առանձին հասցեավորվող և շղթայված գոտիների և օղակների մեջ: Նրանք աշխատում են 5 Վ լարման վրա և պարունակում են իրենց սեփական սխեմաները, այնպես որ դուք միայն պետք է սնուցեք նորագոյն պիքսելները և նրանց հետ շփվեք տվյալների գծի միջոցով: Հաղորդակցությունը կատարվում է ժամացույց և տվյալներ պարունակող տվյալների մեկ տողով (ավելի մանրամասն այստեղ): Adafruit- ն ապահովում է մաքուր գրադարան ՝ նեոպիքսելային օղակների հետ փոխազդեցության համար:

Ծածկագիրը

L oop () ֆունկցիայի ներսում կոչվում է MPU6050_6Axis_MotionApps20 գրադարանը: Երբ գրադարանն ունի գիրոսկոպի նոր տվյալներ, այն կոչում է redrawLeds (x, y, z) `3 արգումենտ, որոնք ներկայացնում են yaw, pitch and roll

Inside redrawLeds ():

- մենք կենտրոնանում ենք երկու առանցքի վրա `y, z

- մենք սահմանափակում ենք երկու առանցքներն էլ -MAX_ANGLE- ից +MAX_ANGLE- ից, մենք սահմանել ենք առավելագույն անկյունը մինչև 45, և այն փոփոխելի է

- մենք 360 աստիճաններ բաժանում ենք 4 քառակուսիների և յուրաքանչյուրի համար կանչում ենք lightLeds () գործառույթներ հետևյալ կերպ.

* y բացասական, z դրական առաջին քառանկյունը կկարգավորի led- ները 0 -ից 5 -ը, անկյունը կլինի 0 -ից 89 -ը

* y բացասական, z բացասական երկրորդ քառանկյունի կառավարում է 6 -ից 12 -ը, անկյունը կլինի 89 -ից 0

*… Եվ այլն

- lightLeds գործառույթի ներսում

* Ես երկու առանցքի վրա հիմնված անկյուն եմ հաշվարկում arctangent- ի միջոցով (ստուգեք կից նկարը)

* Ես հաշվարկում եմ, թե ինչը հանգեցրեց ցուցադրման ՝ օգտագործելով arduino քարտեզի գործառույթը

* Ես վերականգնում եմ led ժապավենը բոլոր led- ներից բացի, մեկը, որը համապատասխանում է նախկինում հաշվարկած led դիրքին և նախկինում led դիրքին (մարելու էֆեկտ ցույց տալու համար)

* Ես օգտագործում եմ normalizeLedPosition () կոչվող գործառույթը ՝ հաշվի առնելու նեոպիքսելների չափաչափումը: Կալիբրացիան օգտակար է, քանի որ նեոպիքսելային օղակը կարող է պտտվել ըստ ցանկության և պետք է համընկնել գիրոսկոպի հետ

* Ես նաև տպում եմ քարշակ առանցքը, այն, ինչ led- ն ունի լույս և անկյուն

Մաթեմատիկան

Ես կցել եմ նկար ՝ լուսադիոդային օղակով և եռանկյունաչափական ֆունկցիայով, որն օգտագործվում է անկյունը որոշելու համար:

Խորհուրդ ենք տալիս: