Talaan ng mga Nilalaman:

Gyroscope Fun With Neopixel Ring: 4 Hakbang (na may Mga Larawan)
Gyroscope Fun With Neopixel Ring: 4 Hakbang (na may Mga Larawan)

Video: Gyroscope Fun With Neopixel Ring: 4 Hakbang (na may Mga Larawan)

Video: Gyroscope Fun With Neopixel Ring: 4 Hakbang (na may Mga Larawan)
Video: Arduino MASTERCLASS | Full Programming Workshop in 90 Minutes! 2024, Nobyembre
Anonim
Image
Image

Sa tutorial na ito ay gagamitin namin ang MPU6050 gyroscope, isang neopixel ring at isang arduino upang makabuo ng isang aparato na ang mga led led ay naaayon sa anggulo ng pagkahilig.

Ito ay isang simple at kasiya-siyang proyekto at ito ay tipunin sa isang breadboard. Kung susundin mo ang mga hakbang ay mabubuo mo ang nakita mo sa video. Ito ay isang mahusay na tutorial para sa pag-aaral tungkol sa gyroscope at ang neopixel ring.

Binubuo ko ang tutorial na ito dahil sa interes na nakita ko sa aking unang itinuro dito (Gyroscope Led Control With Arduino). Sa itinuturo na ito pinalitan ko ang simpleng led's na may isang neopixel ring. Ang singsing ay mas simple nitong gamitin sa pamamagitan ng isang Adafruit library at tiyak na mas kamangha-manghang ito.

Kaya't kung mayroon kang mga sangkap na nakahiga sa paligid na ito ay isang mahusay na paraan upang magamit ang mga ito, susubukan kitang hakbangin sa pamamagitan ng pagbuo ng aparato at ipaliwanag din kung paano ito gumagana sa huling hakbang.

Hakbang 1: Kinakailangan ang Mga Bagay

Assembly
Assembly

Mga Bahagi

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

2. Breadboard

3. MPU6050 gyroscope (eBay) 1.2 $

4. 24 neopixel led ring (Adafruit) 17 $

5. 4 x AA na baterya pack na may 4 na baterya

6. U-hugis na mga jumper cable (opsyonal). Ginamit ko ang mga jumper cables na ito dahil mas maganda ang hitsura nila sa breadboard, at ang mga leds ay mas nakikita sa ganitong paraan. Maaari kang makahanap ng isang kahon ng 140 sa ebay sa halos 4 $. Kung wala kang mga kable na ito maaari mong palitan ang mga ito ng mga dupont wires.

Mga tool:

1. USB sa serial FTDI adapter FT232RL upang mai-program ang arduino pro mini

2. Arduino IDE

Kasanayan: 1. Paghihinang, suriin ang tutorial na ito

3. Pangunahing programa ng arduino, maaaring maging kapaki-pakinabang ang tutorial na ito

Hakbang 2: Assembly

Assembly
Assembly

Ikinabit ko ang nakakagulat na eskematiko sa format na fzz at isang larawan nito para sa madaling visualization ng mga koneksyon

1. Kailangan mong maghinang ng 3 male pin sa likod ng neopixel ring tulad ng ipinakita sa larawan

- paghihinang ang positibong pin

- maghinang sa lupa

- solder ang data input pin

2. Pagkatapos ang may hawak ng baterya na 4x ay dapat magkaroon ng isang paraan ng isang pagkonekta sa breadboard, isang madaling solusyon ay upang maghinang ng dalawang lalaking dupont wires sa mga terminal nito.

3. Ihanda ang pisara.

- ilagay ang neopixel ring, microcontroller at gyroscope sa breadboard tulad ng imahe

- ilagay ang lahat ng mga negatibong wires: sa microcontroller, neopixel ring, gyro

- ilagay ang lahat ng positibong mga wire: sa microcontroller, neopixel ring, gyro

- ilagay ang lahat ng mga wire sa data:

* SDA at SCL mula sa papunta sa microcontroller hanggang sa gyro

* i-pin ang D6 mula sa microcontroller sa singsing na neopixel

- I-double check ang lahat ng mga koneksyon bago i-powering

- Opsyonal na gamit ang duct tape, i-tape ang baterya pack sa likod ng bradboard upang i-hold ito sa lugar at gawin itong mas portable

Hakbang 3: Ang Code at Pagkakalibrate

Una kailangan mong mag-download at mag-install ng dalawang aklatan:

1. Adafruit neopixel library fir pagkontrol sa neopixel

2. MPU6050 library para sa gyroscope

3. Pinagmulan ng I2CDev library

Ang mga ito ay dalawang mahusay na mga aklatan na gawin ang mabibigat na pag-aangat!

Higit pang mga detalye sa mga neopixel dito

Pagkatapos i-download at i-install ang aking library mula dito o kopyahin ito mula sa ibaba:

# isama ang "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 # tukuyin ang 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; pagpapasimula ng bool = false; // set true kung matagumpay ang DMP init uint8_t mpuIntStatus; // humahawak ng aktwal na byte ng pagkaantala ng katayuan mula sa MPU uint8_t devStatus; // status ng pagbabalik pagkatapos ng bawat pagpapatakbo ng aparato (0 = tagumpay,! 0 = error) uint16_t packetSize; // inaasahang laki ng packet ng DMP (ang default ay 42 bytes) uint16_t fifoCount; // count ng lahat ng byte na kasalukuyang nasa FIFO uint8_t fifoBuffer [64]; // FIFO storage buffer Quaternion q; // [w, x, y, z] lalagyan ng quaternion na VectorFloat gravity; // [x, y, z] gravity vector float ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container at gravity vector pabagu-bago ng loob bool mpuInterrupt = false; // nagpapahiwatig kung ang MPU makagambala pin ay naging mataas

walang bisa ang pag-setup ()

{Serial.begin (9600); Serial.println ("Nagsimula ang programa"); pagsisimula = initializeGyroscope (); strip.begin (); } void loop () {kung (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); kung (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); bumalik; } kung (mpuIntStatus & 0x02) {habang (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }} boolean hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = pipigilan (x, -1 * MAX_ANGLE, MAX_ANGLE); y = pipigilan (y, -1 * MAX_ANGLE, MAX_ANGLE); kung (y 0) {lightLeds (y, z, 0, 5, 0, 89); } iba pa kung (y <0 at z 0 at z 0 at z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {doble angulo = (atan ((doble) abs (x) / (doble) abs (y)) * 4068) / 71; int ledNr = mapa (anggulo, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, anggulo); uint32_t kulay; para sa (int i = 0; i posisyon + LED_OFFSET) {posisyon sa pagbalik + LED_OFFSET; } posisyon sa pagbalik + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int anggulo) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (anggulo); 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 = millis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Matagumpay ang koneksyon sa MPU6050"): F ("Nabigo ang koneksyon sa MPU6050")); Serial.println (F ("Initializing DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); kung (devStatus! = 0) {Serial.print (F ("Nabigo ang Initialization ng DMP (code")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Enabling makagambala na pagtuklas (Arduino panlabas na makagambala 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP handa na! Naghihintay para sa unang makagambala … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

I-upload ang code:

Gamit ang FTDI adapter i-upload ang code sa arduino.

Ikonekta ang power supply (mga baterya)

Pagkakalibrate:

Ang pinakamahalagang bagay upang i-calibrate dito ay pare-pareho ang "LED_OFFSET". Sa aking halimbawa ay 12. Kailangan mong ayusin ito mula 0 hanggang 23 nang sa gayon pagkatapos ng pag-power ng board ay sindihan ang led sa direksyon na ikiling mo ang board.

Kung nais mong malaman ang higit pang mga detalye tungkol sa kung paano ito gumagana tingnan ang huling hakbang

Hakbang 4: Paano Ito Gumagana (opsyonal)

Paano Ito Gumagana (opsyonal)
Paano Ito Gumagana (opsyonal)

Una ang isang maliit na impormasyon tungkol sa MPU6050 gyroscope. Ito ay isang MEMS gyroscope (ang MEMS ay nangangahulugang mga system ng Microelectromekanical).

Ang bawat uri ng MEMs gyroscope ay may ilang anyo ng oscillating na bahagi mula sa kung saan makikita ang acccleration, at samakatuwid ay nagbago ng direksyon. Ito ay dahil, ayon sa pag-iingat ng batas sa paggalaw, ang isang nanginginig na bagay ay nais na magpatuloy sa pag-vibrate sa parehong eroplano, at ang anumang panginginig na paglihis ay maaaring magamit upang makakuha ng pagbabago sa direksyon.

Naglalaman din ang gyro ng isang microcontroller na pagmamay-ari nito upang makalkula ang roll, pitch at yaw sa pamamagitan ng ilang mga magarbong matematika.

Ngunit ang gyro raw data ay naghihirap mula sa ingay at naaanod, kaya gumamit kami ng isang panlabas na silid-aklatan upang makinis ang mga bagay at bigyan kami ng malinis na magagamit na data.

Ang Neopixel ay mga RGB leds na isa-isang matutugunan at nakakadena sa mga banda at singsing. Gumagana ang mga ito sa 5V at naglalaman ang mga ito ng pagmamay-ari nila circuitry kaya kailangan mo lamang i-power ang mga neopixel at makipag-usap sa kanila gamit ang linya ng data. Ang komunikasyon ay tapos na sa isang solong linya ng data na naglalaman ng orasan at data (higit pang mga detalye dito). Nagbibigay ang Adafruit ng isang malinis na silid-aklatan para sa pakikipag-ugnay sa mga singsing na neopixel.

Ang code

Sa loob ng l oop () pagpapaandar ang MPU6050_6Axis_MotionApps20 library ay tinawag. Kapag ang library ay may bagong data mula sa gyroscpe tumatawag ito sa redrawLeds (x, y, z) na may 3 mga argumento na kumakatawan sa yaw, pitch at roll

Sa loob ng redrawLeds ():

- nakatuon kami sa dalawang axis: y, z

- Pinipigilan namin ang parehong mga axys mula sa -MAX_ANGLE hanggang + MAX_ANGLE, tinukoy namin ang max na anggulo sa 45 at nababago ito

- Hinahati namin ang 360 na mga degreed sa 4 na quadrants at tinawag ang mga lightLeds () na pag-andar para sa bawat isa tulad ng sumusunod:

* y negatibo, z positibo unang quadrant ay makokontrol ang led's mula 0 hanggang 5, ang anggulo ay magiging 0 hanggang 89

* y negatibo, z negatibong pangalawang quadrant control na humantong mula 6 hanggang 12, ang anggulo ay mula 89 hanggang 0

*… Atbp

- sa loob ng pag-andar ng lightLeds

* Kinakalkula ko ang isang anggulo batay sa dalawang axis gamit ang arctangent (suriin ang nakalakip na larawan)

* Kinakalkula ko kung ano ang humantong sa pagpapakita gamit ang pag-andar ng arduino map

* Inaayos ko ang led strip lahat ngunit dalawang led's, ang naaayon sa led na posisyon na kinakalkula ko dati at isang led na posisyon bago (upang ipakita ang isang fade effect)

* Gumagamit ako ng isang pagpapaandar na tinatawag na normalizeLedPosition () upang isaalang-alang ang neopixel calibration. Ang pagkakalibrate ay kapaki-pakinabang dahil ang singsing na neopixel ay maaaring paikutin ayon sa nalulugod, at dapat na nakahanay sa gyroscope

* Nagpi-print din ako ng tow axis, kung ano ang humantong ay may ilaw at angulo

Ang matematika

Nag-attach ako ng isang larawan gamit ang led ring at ang trigonometric function na ginamit upang matukoy ang anggulo.

Inirerekumendang: