Агуулгын хүснэгт:

Неопиксел бөгжтэй гироскоп хөгжилтэй: 4 алхам (зурагтай)
Неопиксел бөгжтэй гироскоп хөгжилтэй: 4 алхам (зурагтай)

Видео: Неопиксел бөгжтэй гироскоп хөгжилтэй: 4 алхам (зурагтай)

Видео: Неопиксел бөгжтэй гироскоп хөгжилтэй: 4 алхам (зурагтай)
Видео: #76 MPU6050 3-осевой гироскоп акселерометра — первый взгляд 2024, Арваннэгдүгээр
Anonim
Image
Image

Энэхүү гарын авлагад бид MPU6050 гироскоп, неопикселийн цагираг, ардуино ашиглан налуу өнцөгт харгалзах гэрлийг асаах төхөөрөмжийг бүтээх болно.

Энэ бол энгийн бөгөөд хөгжилтэй төсөл бөгөөд үүнийг талхны самбар дээр угсрах болно. Хэрэв та алхамуудыг дагаж мөрдвөл видеон дээр харсан зүйлээ бүтээх болно. Энэ бол гироскоп ба неопикселийн бөгжний талаар сурахад тохиромжтой сайн хичээл юм.

Би энд анхны зааварчилгаагаа (Gyroscope Led Control With Arduino) сонирхож үзсэнийхээ ачаар энэхүү гарын авлагыг бүтээж байна. Энэхүү зааварчилгааны дагуу би энгийн ледүүдийг неопикселийн бөгжөөр сольсон. Бөгжийг Adafruit номын сангаар ашиглах нь илүү энгийн бөгөөд илүү гайхалтай.

Хэрэв танд эдгээр бүрэлдэхүүн хэсгүүд байгаа бол тэдгээрийг ашиглах гайхалтай арга бол би төхөөрөмжийг бүтээх ажлыг алхам алхамаар хийж, сүүлийн шатанд хэрхэн ажилладаг талаар тайлбарлахыг хичээх болно.

Алхам 1: Шаардлагатай зүйл

Чуулган
Чуулган

Эд анги

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

2. Талхны самбар

3. MPU6050 гироскоп (eBay) 1.2 $

4. 24 неопикселийн LED бөгж (Adafruit) 17 $

5. 4 батерейтай 4 x АА батерейны багц

6. U хэлбэрийн холбогч кабель (заавал биш). Би эдгээр холбогч кабелийг талхны самбар дээр илүү сайн хардаг тул ледүүд ийм байдлаар илүү тод харагддаг тул ашигладаг байсан. Та 140 хайрцагийг ebay дээрээс ойролцоогоор 4 доллараар олох боломжтой. Хэрэв танд эдгээр кабель байхгүй бол тэдгээрийг дюпон утсаар сольж болно.

Хэрэгсэл:

1. Arduino pro mini -ийг програмчлах USB FTDI адаптер FT232RL

2. Arduino IDE

Ур чадвар: 1. Гагнах, энэ хичээлийг үзнэ үү

3. Үндсэн arduino програмчлал, энэ заавар нь ашигтай байж магадгүй юм

Алхам 2: угсрах

Чуулган
Чуулган

Холболтыг хялбархан дүрслэхийн тулд би frzzing схемийг fzz форматаар зурж хавсаргав

1. Зурган дээрх шиг неопикселийн бөгжний ард 3 эрэгтэй тээглүүр гагнах хэрэгтэй

- эерэг зүүг гагнах

- газар гагнах

- өгөгдөл оруулах зүүг гагнах

2. Дараа нь 4х батерейны эзэмшигч нь талхны самбартай холбогдох арга замтай байх ёстой, хялбар шийдэл бол хоёр эрэгтэй дюпон утсыг терминалдаа гагнах явдал юм.

3. Талхны хавтанг бэлтгэ.

- Зурган дээрх шиг неопикселийн цагираг, микроконтроллер, гироскопыг талхны тавцан дээр байрлуул

- бүх сөрөг утсыг байрлуул: микроконтроллер, неопиксел цагираг, гиро

- бүх эерэг утсыг байрлуул: микроконтроллер, неопиксел цагираг, гиро

- бүх өгөгдлийн утсыг байрлуул:

* SDA ба SCL нь микроконтроллероос гиро хүртэл

* D6 зүү микроконтроллероос неопикселийн цагираг руу

- Цахилгаан асаахаасаа өмнө бүх холболтыг дахин шалгана уу

- Нэмэлт байдлаар наалдамхай тууз ашиглан батерейны хайрцгийг туузан дээр байрлуулж, илүү зөөврийн болгоно.

Алхам 3: Код ба шалгалт тохируулга

Эхлээд та хоёр номын санг татаж аваад суулгах хэрэгтэй.

1. Adafruit неопикселийн номын сан неопикселийг хянадаг

2. Гироскопын MPU6050 номын сан

3. I2CDev номын сангийн эх сурвалж

Тэд хүнд ачаа өргөх хоёр гайхалтай номын сан юм!

Неопикселийн талаарх дэлгэрэнгүй мэдээллийг эндээс үзнэ үү

Дараа нь миний номын санг эндээс татаж суулгаарай эсвэл доороос хуулна уу.

#"I2Cdev.h" оруулах

#include #include "MPU6050_6Axis_MotionApps20.h" #include "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); гарын үсэг зураагүй long lastPrintTime = 0; bool эхлүүлэх = худал; // 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] quaternion контейнер VectorFloat таталцал; // [x, y, z] таталцлын вектор float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll контейнер ба хүндийн хүчний вектор дэгдэмхий bool mpuInterrupt = false; // нь MPU тасалдлын зүү өндөр болсон эсэхийг заана

хүчингүй тохиргоо ()

{Serial.begin (9600); Serial.println ("Хөтөлбөр эхэлсэн"); эхлүүлэх = эхлүүлэхGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = худал; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (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, & gravity); 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); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } if if (y <0 and z 0 and z 0 and z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {давхар өнцөг = (атан ((давхар) abs (x) / (давхар) abs (y)) * 4068) / 71; int ledNr = газрын зураг (өнцөг, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, өнцөг); uint32_t өнгө; for (int i = 0; i байрлал + LED_OFFSET) {буцах байрлал + LED_OFFSET; } буцах байрлал + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {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 = millis (); } 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); false return;} mpu.setDMPEnabled (true); Serial.println (F ("Идэвхжүүлэх тасалдал илрүүлэх (Arduino гадаад тасалдал 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP бэлэн! Эхний тасалдлыг хүлээж байна … ")); packetSize = mpu.dmpGetFIFOPacketSize (); үнэнийг буцаах;} void dmpDataReady () {mpuInterrupt = үнэн;}

Кодыг байршуулах:

FTDI адаптерийг ашиглан кодыг arduino руу байршуулна уу.

Цахилгаан хангамжийг холбоно уу (батерей)

Тохируулгын:

Энд тохируулах хамгийн чухал зүйл бол "LED_OFFSET" тогтмол юм. Миний жишээнд бол 12. Та үүнийг 0 -ээс 23 болгож тохируулах хэрэгтэй бөгөөд ингэснээр самбарыг асаасны дараа самбар нь таны хазайлгах чиглэлд гэрэл асах болно.

Хэрэв та хэрхэн ажилладаг талаар илүү дэлгэрэнгүй мэдээлэл авахыг хүсвэл сүүлийн алхамыг үзээрэй

Алхам 4: Энэ нь хэрхэн ажилладаг (заавал биш)

Энэ нь хэрхэн ажилладаг (заавал биш)
Энэ нь хэрхэн ажилладаг (заавал биш)

Эхлээд MPU6050 гироскопын тухай багахан мэдээлэл. Энэ бол MEMS гироскоп (MEMS нь микроэлектромеханик системийг хэлдэг).

MEMs гироскопын төрөл бүр нь ямар нэг хэлбэрийн хэлбэлзэлтэй бүрэлдэхүүн хэсгүүдтэй байдаг тул тэндээс хавирга, улмаар чиглэл өөрчлөгдөхийг илрүүлдэг. Учир нь хөдөлгөөний хуулийг сахин хамгаалахын дагуу чичиргээт объект нэг хавтгайд үргэлжлүүлэн чичиргээ хийх дуртай байдаг бөгөөд чиглэлийг өөрчлөхийн тулд ямар ч чичиргээний хазайлтыг ашиглаж болно.

Гиро нь хэд хэдэн сонирхолтой математикуудаар өнхрөх, давирхай, эргэлтийг тооцоолох өөрийн микроконтроллерийг агуулдаг.

Гэхдээ гиро түүхий өгөгдөл нь чимээ шуугиан, дрифтээс болж зовж шаналж байдаг тул бид гадны номын санг ашиглан аливаа зүйлийг жигдрүүлж, бидэнд цэвэр өгөгдөл өгдөг.

Neopixel бол RGB LED -ийг тус тусад нь авч үзэх боломжтой бөгөөд хамтлаг, цагираг хэлбэрээр гинжлэгдсэн байдаг. Тэд 5V дээр ажилладаг бөгөөд тэдгээр нь өөрийн гэсэн хэлхээг агуулдаг тул та зөвхөн неопикселийг асааж, өгөгдлийн шугам ашиглан тэдэнтэй холбоо барих хэрэгтэй. Харилцаа нь цаг, өгөгдөл агуулсан нэг мэдээллийн шугамаар хийгддэг (дэлгэрэнгүй мэдээллийг эндээс үзнэ үү). Adafruit нь неопикселийн цагиргуудтай харьцах цэвэр номын сантай.

Код

L oop () функц дотор MPU6050_6Axis_MotionApps20 номын санг дууддаг. Номын санд gyroscpe -аас шинэ өгөгдөл ирэхэд redrawLeds (x, y, z) гэж нэрлэнэ.

Дотор нь 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 функц дотор

* Би хоёр тэнхлэгт тулгуурласан өнцгийг арктенгент ашиглан тооцоолж байна (хавсаргасан зургийг шалгана уу)

* Би arduino газрын зургийн функцийг ашиглан юу харуулсаныг тооцоолж байна

* Би хоёр зурвасаас бусад бүх л LED зурвасыг анхны байдалд нь оруулж байна.

* Би неопикселийн шалгалт тохируулгыг харгалзан үзэхийн тулд normalizeLedPosition () нэртэй функцийг ашиглаж байна. Калибровк хийх нь ашигтай, учир нь неопикселийн цагиргийг хүссэнээрээ эргүүлэх боломжтой бөгөөд гироскоптой зэрэгцүүлэх ёстой.

* Би бас чирэх тэнхлэгийг хэвлэж байна, ямар гэрэл нь гэрэл, өнцөгтэй байна

Математик

Би өнцгийг тодорхойлоход ашигладаг цагираг, тригонометрийн функц бүхий зургийг хавсаргав.

Зөвлөмж болгож буй: