Гироскоп неопиксельді сақинамен көңілді: 4 қадам (суреттермен)
Гироскоп неопиксельді сақинамен көңілді: 4 қадам (суреттермен)
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 неопиксельді жетекші сақина (Adafruit) 17 $

5. 4 аккумуляторы бар 4 x AA батареялар жинағы

6. U-тәрізді секіргіш кабельдер (міндетті емес). Мен бұл өтпелі кабельдерді қолдандым, себебі олар тақтада жақсы көрінеді, ал светодиодтар осылайша көрінеді. Сіз eBay -де шамамен 140 доллар тұратын 140 қорапты таба аласыз. Егер сізде бұл кабельдер болмаса, оларды дюпондық сымдарға ауыстыруға болады.

Құралдар:

1. Arduino pro mini бағдарламалау үшін FT232RL сериялы FTDI адаптерінен USB

2. Arduino IDE

Дағдылар: 1. Дәнекерлеу, бұл оқулықты тексеріңіз

3. Негізгі arduino бағдарламалау, бұл оқулық пайдалы болуы мүмкін

2 -қадам: құрастыру

Ассамблея
Ассамблея

Мен қосылыстарды оңай визуализациялау үшін fzz форматындағы қатқыл схеманы және оның суретін тіркедім

1. Суретте көрсетілгендей неопиксель сақинасының артқы жағына 3 еркек түйреуішті дәнекерлеу қажет

- оң түйреуішті дәнекерлеңіз

- жерді дәнекерлеу

- деректерді енгізу түйреуішін дәнекерлеу

2. Содан кейін 4x батареялық ұстағышта нан тақтасына қосылу тәсілі болуы керек, оның шешімі - екі еркек дюпонды сымдарды оның терминалдарына дәнекерлеу.

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); белгісіз ұзақ lastPrintTime = 0; bool инициализациясы = жалған; // егер DMP init сәтті болса, true орнатыңыз 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 гравитациясы; // [x, y, z] гравитациялық вектор float ypr [3]; // [аю, қадам, орама] yaw/pitch/roll контейнері және гравитациялық векторлық тұрақсыз bool mpuInterrupt = false; // MPU үзу түйреуішінің жоғары көтерілгенін көрсетеді

жарамсыз орнату ()

{Serial.begin (9600); Serial.println («Бағдарлама басталды»); инициализация = initializeGyroscope (); strip.begin (); } void loop () {if (! инициализация) {қайтару; } 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) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = шектеу (x, -1 * MAX_ANGLE, MAX_ANGLE); y = шектеу (y, -1 * MAX_ANGLE, MAX_ANGLE); if (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) {қос бұрыш = (атан ((қос) абс (х) / (қос) абс (у)) * 4068) / 71; int ledNr = map (бұрыш, 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 бұрышы) {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 инициализациясы сәтсіз аяқталды (код»)); Serial.println (devStatus); жалған қайтару;} mpu.setDMPEnabled (шын); Serial.println (F («Қосу үзілісті анықтау (Arduino сыртқы үзілуі 0)… «)); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (» DMP дайын! Бірінші үзіліс күтілуде … «)); packetSize = 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 кітапханасы шақырылады. Кітапханада гироскоптан жаңа деректер болған кезде, ол yaw, pitch және roll -ды білдіретін 3 дәлелмен redrawLeds (x, y, z) деп атайды.

Ішінде redrawLeds ():

- біз екі оське назар аударамыз: y, z

- біз екі осьті -MAX_ANGLE -ден +MAX_ANGLE -ге шектейміз, біз максималды бұрышты 45 -ке дейін анықтадық және ол өзгереді

- біз 360 градусты 4 квадрантқа бөлеміз және әрқайсысы үшін lightLeds () функцияларын шақырамыз:

* y теріс, z оң бірінші квадрант 0 -ден 5 -ке дейінгі светодиодты басқарады, бұрыш 0 -ден 89 -ға дейін болады

* y теріс, z теріс екінші квадрантты басқару элементтері 6 -дан 12 -ге дейін, бұрышы 89 -дан 0 -ге дейін болады

*… Және т

- lightLeds функциясының ішінде

* Мен екі оське негізделген бұрышты аркантанс көмегімен есептеймін (қоса берілген суретті тексеріңіз)

* Мен arduino map функциясын қолдану арқылы нені көрсеткенін есептеймін

* Мен екі жолақты қоспағанда, алдыңғы жолақты қалпына келтіремін, ол мен есептеген жарықдиодты позицияға сәйкес келеді және алдыңғы жарық диодты позицияға сәйкес келеді (өшіру әсерін көрсету үшін)

* неопиксельді калибрлеуді ескеру үшін normalizeLedPosition () деп аталатын функцияны қолданамын. Калибрлеу пайдалы, себебі неопиксель сақинасын қалағандай бұруға болады және оны гироскоппен туралау керек.

* Мен сонымен қатар сүйреу осін басып шығарамын, оның светодиодында жарық пен бұрыш бар

Математика

Мен бұрышты анықтау үшін тригонометриялық функциясы бар жетекші сақинасы бар суретті тіркедім.

Ұсынылған: