Mundarija:

Gyroskop Neopixel uzuk bilan qiziqarli: 4 qadam (rasmlar bilan)
Gyroskop Neopixel uzuk bilan qiziqarli: 4 qadam (rasmlar bilan)

Video: Gyroskop Neopixel uzuk bilan qiziqarli: 4 qadam (rasmlar bilan)

Video: Gyroskop Neopixel uzuk bilan qiziqarli: 4 qadam (rasmlar bilan)
Video: Led spinning ring in progress. (fusion 360) 2024, Noyabr
Anonim
Image
Image

Ushbu qo'llanmada biz MPU6050 gyroskopi, neopixel uzuk va arduino yordamida moyillik burchagiga mos keladigan LEDlarni yoqadigan qurilmani quramiz.

Bu oddiy va qiziqarli loyiha bo'lib, u non taxtasida yig'iladi. Agar siz qadamlarni bajarsangiz, siz videoda ko'rganingizni qurasiz. Bu giroskop va neopixel uzukni o'rganish uchun yaxshi qo'llanma.

Men bu darslikni birinchi o'qituvchimga qiziqish tufayli qurmoqdaman (Arduino bilan Led Control Gyroscope). Bu yo'riqnomada men oddiy LEDlarni neopikselli halqa bilan almashtirdim. Bu uzukni Adafruit kutubxonasi orqali ishlatish osonroq va u yanada ajoyib.

Agar sizda bu komponentlar bo'lsa, ulardan foydalanishning ajoyib usuli, men sizni qurilmani bosqichma -bosqich qurishga va oxirgi bosqichda qanday ishlashini tushuntirishga harakat qilaman.

1 -qadam: Kerakli narsalar

O'rnatish
O'rnatish

Qismlar

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

2. Non paneli

3. MPU6050 giroskopi (eBay) 1,2 $

4. 24 ta neopixelli halqa (Adafruit) 17 $

5. 4 ta batareyali 4 ta AA batareya to'plami

6. U shaklidagi o'tish kabellari (ixtiyoriy). Men bu o'tish kabelidan foydalandim, chunki ular non panelida yaxshiroq ko'rinadi va svetodiodlar shu tarzda ko'rinadi. Taxminan 4 dollardan ebaydan 140 qutini topishingiz mumkin. Agar sizda bunday kabellar bo'lmasa, ularni dupontli simlarga almashtirishingiz mumkin.

Asboblar:

1. Arduino pro mini -ni dasturlash uchun USB -ning ketma -ket FTDI adapteri FT232RL

2. Arduino IDE

Ko'nikmalar: 1. Lehimlash, ushbu qo'llanmani tekshiring

3. Asosiy arduino dasturlash, bu qo'llanma foydali bo'lishi mumkin

2 -qadam: yig'ish

O'rnatish
O'rnatish

Men ulanishlarni oson ko'rish uchun fzz formatidagi sxemani va uning rasmini biriktirdim

1. Rasmda ko'rsatilgandek, neopikselli halqaning orqasida 3 ta erkak pinni lehimlashingiz kerak

- musbat pinni lehimlang

- erni lehimlang

- ma'lumotlarni kiritish pinini lehimlang

2. Keyin 4x akkumulyator ushlagichi non paneliga ulanish usuliga ega bo'lishi kerak, oson echim - ikkita erkak dupontli simni uning terminallariga lehimlash.

3. Non taxtasini tayyorlang.

- rasmdagi kabi neopixel uzuk, mikrokontroller va giroskopni taxtaga joylashtiring

- barcha salbiy simlarni joylashtiring: mikrokontrolderga, neopikselli halqaga, girroga

- barcha musbat simlarni joylashtiring: mikrokontrollerga, neopikselli halqaga, girroga

- barcha ma'lumot simlarini joylashtiring:

* SDA va SCL mikrokontrollerdan girrogacha

* D6 pinini mikrokontrolderdan neopikselli halqaga

- Quvvat olishdan oldin barcha ulanishlarni ikki marta tekshiring

- ixtiyoriy ravishda yopishqoq lentani ishlatib, batareykani bradboard orqasiga mahkamlang va uni portativ qilib qo'ying.

3 -qadam: Kod va kalibrlash

Avval siz ikkita kutubxonani yuklab olishingiz va o'rnatishingiz kerak:

1. Adafruit neopixel kutubxonasi, neopixelni boshqaradi

2. Giroskop uchun MPU6050 kutubxonasi

3. I2CDev kutubxonasi manbai

Ular og'ir yuklarni ko'taradigan ikkita ajoyib kutubxona!

Bu erda neopiksellar haqida batafsil ma'lumot

Keyin kutubxonamni bu erdan yuklab oling va o'rnating yoki pastdan nusxa oling:

#"I2Cdev.h" ni qo'shing

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 MPa; Adafruit_NeoPixel tasmasi = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); imzosiz uzoq lastPrintTime = 0; bool boshlang'ich = noto'g'ri; // agar DMP boshlang'ichi muvaffaqiyatli bo'lsa, rostni belgilang uint8_t mpuIntStatus; // MPU uint8_t devStatus -dan haqiqiy uzilish holati baytiga ega; // har bir qurilma ishidan keyin holatni qaytarish (0 = muvaffaqiyat,! 0 = xato) uint16_t packetSize; // kutilgan DMP paket hajmi (standart 42 bayt) uint16_t fifoCount; // hozirda FIFOda mavjud bo'lgan barcha baytlar soni uint8_t fifoBuffer [64]; // FIFO saqlash buferi Quaternion q; // [w, x, y, z] quaternionli konteyner VectorFloat gravitatsiyasi; // [x, y, z] tortishish vektori float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll konteyner va tortishish vektori o'zgaruvchan bool mpuInterrupt = false; // MPU uzilish pimi yuqori ko'tarilganligini ko'rsatadi

bo'sh o'rnatish ()

{Serial.begin (9600); Serial.println ("Dastur boshlandi"); ishga tushirish = ishga tushirishGiroskop (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = noto'g'ri; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); agar (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); qaytish; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& tortish kuchi, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & tortishish); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} mantiqiy hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = cheklash (x, -1 * MAX_ANGLE, MAX_ANGLE); y = cheklash (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } if if (y <0 va z 0 va z 0 va z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {juft burchak = (atan ((er -xotin) abs (x) / (juft) abs (y)) * 4068) / 71; int ledNr = xarita (burchak, danAngle, toAngle, danLedPosition, toLedPosition); printDebug (x, y, ledNr, burchak); uint32_t rangi; uchun (int i = 0; i pozitsiyasi + LED_OFFSET) {qaytish pozitsiyasi + LED_OFFSET; } qaytish pozitsiyasi + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int burchagi) {if (millis () - lastPrintTime <500) {qaytish; } Serial.print ("a ="); Serial.print (burchak); 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 ulanishi muvaffaqiyatli"): F ("MPU6050 ulanishi bajarilmadi")); Serial.println (F ("DMP boshlanmoqda …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP boshlang'ichi muvaffaqiyatsiz tugadi (kod")); Serial.println (devStatus); noto'g'ri qaytish;} mpu.setDMPEnabled (rost); Serial.println (F ("Yoqish) uzilishlarni aniqlash (Arduino tashqi uzilish 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP tayyor! Birinchi uzilishni kutish … ")); packetSize = mpu.dmpGetFIFOPacketSize (); rostini qaytarish;} void dmpDataReady () {mpuInterrupt = rost;}

Kodni yuklang:

FTDI adapteridan foydalanib, kodni arduino -ga yuklang.

Quvvat manbasini ulang (batareyalar)

Kalibrlash:

Bu erda kalibrlash uchun eng muhim narsa "LED_OFFSET" doimiyidir. Mening misolimda - 12. Siz buni 0 dan 23 gacha sozlashingiz kerak, shunda taxtani quvvatlantirgandan so'ng, siz taxtani qiyshiq tomon yo'naltirasiz.

Agar siz uning qanday ishlashi haqida batafsil ma'lumotga ega bo'lishni istasangiz, oxirgi qadamni ko'rib chiqing

4 -qadam: u qanday ishlaydi (ixtiyoriy)

Qanday ishlaydi (ixtiyoriy)
Qanday ishlaydi (ixtiyoriy)

Birinchidan, MPU6050 giroskopi haqida bir oz ma'lumot. Bu MEMS gyroskopi (MEMS mikroelektromekanik tizimlarni anglatadi).

Har bir turdagi giroskop MEMsda qandaydir tebranuvchi komponent mavjud bo'lib, u erdan akkleratsiyani aniqlash mumkin va shu sababli yo'nalish o'zgarishi mumkin. Buning sababi shundaki, harakat qonunining saqlanishiga ko'ra, tebranuvchi ob'ekt bir tekislikda tebranishni davom ettirishni yaxshi ko'radi va yo'nalishni o'zgartirish uchun har qanday tebranish burilishidan foydalanish mumkin.

Gyro shuningdek, rulonni hisoblash, balandligi va yawini hisoblash uchun o'ziga xos mikrokontrolerni ham o'z ichiga oladi.

Gyro xom ma'lumotlari shovqin va siljishdan aziyat chekadi, shuning uchun biz tashqi kutubxonadan foydalanib, muammolarni yumshatdik va bizga toza ma'lumotlarni berdik.

Neopixel - bu RGB -diodli yoritgichlar bo'lib, ular alohida -alohida joylashtiriladi va bantlar va halqalarga bog'langan. Ular 5V da ishlaydi va ular o'z elektron sxemalarini o'z ichiga oladi, shuning uchun siz faqat neopiksellarni quvvatlantirishingiz va ular bilan ma'lumotlar uzatish liniyasi orqali bog'lanishingiz kerak. Aloqa soat va ma'lumotlarni o'z ichiga olgan bitta ma'lumot liniyasi orqali amalga oshiriladi (batafsil ma'lumot bu erda). Adafruit neopixel halqalari bilan ishlash uchun toza kutubxonani taqdim etadi.

Kod

L oop () funktsiyasi ichida MPU6050_6Axis_MotionApps20 kutubxonasi chaqiriladi. Kutubxonada gyroscpe -dan yangi ma'lumotlar mavjud bo'lganda, u redrawLeds (x, y, z) deb ataladi, yaw, pitch va rollni ifodalovchi 3 ta dalil.

RedrawLeds ichida ():

- biz ikkita o'qga e'tibor qaratamiz: y, z

- biz ikkala o'qni -MAX_ANGLE dan +MAX_ANGLE gacha cheklaymiz, biz maksimal burchakni 45 ga aniqladik va u o'zgarishi mumkin

- biz 360 gradusni 4 kvadrantga ajratamiz va har biri uchun lightLeds () funksiyalarini quyidagicha chaqiramiz:

* y salbiy, z musbat birinchi kvadrant 0 dan 5 gacha, 0 dan 89 gacha burchakni boshqaradi

* y salbiy, z manfiy ikkinchi kvadrant boshqaruvlari 6 dan 12 gacha, burchak 89 dan 0 gacha bo'ladi

* …va boshqalar

- LightLeds funktsiyasi ichida

* Men arktangens yordamida ikkita o'qga asoslangan burchakni hisoblayman (biriktirilgan rasmga qarang)

* Men arduino xaritasi funksiyasi yordamida nimani ko'rsatganini hisoblayman

* Men ikkita chiziqdan tashqari hamma chiziqni tiklayman, bu men hisoblagan oldingi holatga va oldingi holatiga to'g'ri keladi (o'chish effektini ko'rsatish uchun)

* Neopixel kalibrini hisobga olish uchun normalizeLedPosition () deb nomlangan funktsiyadan foydalanayapman. Kalibrlash foydalidir, chunki neopikselli halqani xohlaganingizcha aylantirish mumkin va uni giroskopga moslashtirish kerak.

* Men shuningdek, tortishish o'qini bosib chiqaraman, qaysi LED yorug'lik va burchakka ega

Matematika

Men burchakni aniqlash uchun ishlatiladigan halqa va trigonometrik funktsiyali rasmni biriktirdim.

Tavsiya: