Բովանդակություն:
- Քայլ 1: Պահանջվող բաներ
- Քայլ 2: Հավաքում
- Քայլ 3. Կոդ և չափագրում
- Քայլ 4: Ինչպես է այն աշխատում (ըստ ցանկության)
Video: Gyroscope Fun with Neopixel Ring: 4 քայլ (նկարներով)
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:46
Այս ձեռնարկում մենք կօգտագործենք 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- ն ունի լույս և անկյուն
Մաթեմատիկան
Ես կցել եմ նկար ՝ լուսադիոդային օղակով և եռանկյունաչափական ֆունկցիայով, որն օգտագործվում է անկյունը որոշելու համար:
Խորհուրդ ենք տալիս:
Gyroscope հարթակ/ Camera Gimbal: 5 քայլ (նկարներով)
Գիրոսկոպի հարթակ/ Տեսախցիկ Gimbal. Այս հրահանգը ստեղծվել է Հարավային Ֆլորիդայի համալսարանի Makecourse- ի նախագծի պահանջի կատարման համար (www.makecourse.com)
DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING) ՝ 12 քայլ
DIY MIDI CONTROLLER USB Plug & Play (UPGRADE NEOPIXEL RING). Կրքոտ MAO և էլեկտրոնային երաժշտություն, բայց նաև տեսնելով, որ հնարավոր է ստեղծել անհատականացված Midi ինտերֆեյս, որը պատրաստել եմ mine6 Potentiometers- ը և 12 կոճակը (միացնել / անջատելը), բայց տեղում ավելի դժվար դարձնել: որ արդեն ցանկանում էի ավելացնել տեսողական ցուցիչ
Iron Man Reactor for Fun (Digital Motion Processor Joystick). 7 քայլ (նկարներով)
Iron Man Reactor for Fun (Digital Motion Processor Joystick). Բարև սիրելիներ: Սա իմ առաջին հրահանգն է, այնպես որ հույս ունեցեք ձեր բարեհաճության և արձագանքի համար: Նախագիծը ինտերակտիվ հարթակ է տնային երեկույթների, մրցույթների, միջոցառումների համար `պարզապես հաճույքի համար: Սրանք շարժման երկու սենսորներ են, որոնք պատրաստված են երկաթե մարդու ռեակտորի նախագծում: The
NeoPixel Ring Kaleidoscope: 8 քայլ (նկարներով)
NeoPixel Ring Kaleidoscope. Ես ուրախ եմ առաջարկել LightLogo Kaleidoscope պատրաստելու հրահանգներ և նյութական ֆայլեր: Ես երկար ամիսներ մտածում էի դա անելու մասին և վերջապես դիզայն մշակեցի: Եթե որևէ բարելավում ունեք այս դիզայնի վերաբերյալ, խնդրում ենք կիսվել: Դուք
Faraday for Fun: Էլեկտրոնային մարտկոց առանց մարտկոցի. 12 քայլ (նկարներով)
Faraday for Fun: Electronic Batteryless Dice. Եղել է մեծ հետաքրքրություն մկաններով աշխատող էլեկտրոնային սարքերի նկատմամբ, ինչը մեծ մասամբ պայմանավորված է մշտական ջահի հաջողությամբ, որը հայտնի է նաև որպես մարտկոցի լիցքավորիչ ջահ: Մարտկոցի պակաս լապտերը բաղկացած է լարման գեներատորից ՝ LED- ները սնուցելու համար