Obsah:

Gyroscope Fun with Neopixel Ring: 4 Steps (with Pictures)
Gyroscope Fun with Neopixel Ring: 4 Steps (with Pictures)

Video: Gyroscope Fun with Neopixel Ring: 4 Steps (with Pictures)

Video: Gyroscope Fun with Neopixel Ring: 4 Steps (with Pictures)
Video: Gyroscope fun with Neopixel ring 2024, November
Anonim
Image
Image

V tomto tutoriáli použijeme gyroskop MPU6050, neopixelový prstenec a arduino na stavbu zariadenia, ktoré rozsvieti LED diódy zodpovedajúce uhlu sklonu.

Jedná sa o jednoduchý a zábavný projekt a bude zostavený na doske. Ak budete postupovať podľa týchto krokov, vytvoríte to, čo ste videli vo videu. Je to dobrý návod na učenie sa o gyroskope a neopixelovom kruhu.

Tento tutoriál staviam kvôli záujmu, ktorý som zaznamenal pri svojom prvom pokyne tu (Gyroscope Led Control With Arduino). V tomto návode som nahradil jednoduché LED diódy neopixelovým krúžkom. Prsteň je jednoduchšie používať v knižnici Adafruit a je rozhodne efektnejší.

Ak teda máte tieto súčiastky rozmiestnené okolo, je to skvelý spôsob, ako ich využiť, pokúsim sa vás krok za krokom previesť budovaním zariadenia a v poslednom kroku vám tiež vysvetlím, ako to funguje.

Krok 1: Potrebné veci

zhromaždenie
zhromaždenie

Časti

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

2. Breadboard

3. Gyroskop MPU6050 (eBay) 1,2 $

4. 24 neopixel led ring (Adafruit) 17 $

5. 4 x batéria AA so 4 batériami

6. Prepojovacie káble v tvare U (voliteľné). Použil som tieto prepojovacie káble, pretože vyzerajú lepšie na doske a LED diódy sú týmto spôsobom viditeľnejšie. Krabicu 140 nájdete na ebay za približne 4 doláre. Ak tieto káble nemáte, môžete ich nahradiť káblami dupont.

Náradie:

1. Adaptér USB na sériový FTDI FT232RL na programovanie arduino pro mini

2. Arduino IDE

Zručnosti: 1. Spájkovanie, prečítajte si tento návod

3. Základné programovanie arduina, tento návod by mohol byť užitočný

Krok 2: Zostavenie

zhromaždenie
zhromaždenie

Pripojil som schematickú schému vo formáte fzz a jej obrázok pre jednoduchú vizualizáciu prepojení

1. Na zadnú stranu prstenca neopixelu musíte spájkovať 3 samčie kolíky, ako je to znázornené na obrázku

- spájkovať kladný kolík

- spájkovať zem

- spájkovať kolík vstupu údajov

2. Potom by držiak 4x batérie mal mať spôsob pripojenia k doske, jednoduchým riešením je spájať dva samčie dupontové vodiče s jeho koncovkami.

3. Pripravte si dosku na chlieb.

- položte neopixelový krúžok, mikrokontrolér a gyroskop na dosku ako na obrázku

- umiestnite všetky záporné vodiče: do mikrokontroléra, neopixelového krúžku, gyroskopu

- umiestnite všetky kladné vodiče: k mikrokontroléru, neopixelovému krúžku, gyroskopu

- umiestnite všetky dátové vodiče:

* SDA a SCL od mikrokontroléra po gyroskop

* kolík D6 z mikrokontroléra k neopixelovému krúžku

- pred napájaním dvakrát skontrolujte všetky pripojenia

- voliteľne pomocou lepiacej pásky, prilepte batériový modul na zadnú časť bradboardu, aby držal na mieste a bol prenosnejší

Krok 3: Kód a kalibrácia

Najprv si musíte stiahnuť a nainštalovať dve knižnice:

1. Knižnica neopixelov Adafruit kontrolujúca neopixel

2. Knižnica MPU6050 pre gyroskop

3. Zdroj knižnice I2CDev

Sú to dve veľké knižnice, ktoré zvládnu ťažké bremená!

Viac podrobností o neopixeloch nájdete tu

Potom si stiahnite a nainštalujte moju knižnicu odtiaľto alebo ju skopírujte nižšie:

#include "I2Cdev.h"

#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 mpu; Pásik Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); nepodpísaný dlhý lastPrintTime = 0; inicializácia bool = false; // set true, ak bol DMP init úspešný uint8_t mpuIntStatus; // uchováva bajt skutočného stavu prerušenia z MPU uint8_t devStatus; // návrat stavu po každej operácii zariadenia (0 = úspech,! 0 = chyba) uint16_t packetSize; // očakávaná veľkosť paketu DMP (predvolená hodnota je 42 bajtov) uint16_t fifoCount; // počet všetkých bajtov aktuálne vo FIFO uint8_t fifoBuffer [64]; // Vyrovnávacia pamäť FIFO Quaternion q; // [w, x, y, z] kvartérny kontajner VectorFloat gravitácia; // [x, y, z] gravitačný vektor float ypr [3]; // [vybočenie, rozstup, zvinutie] vybočenie/rozstup/zvinutie kontajnera a vektor gravitácie volatile bool mpuInterrupt = false; // indikuje, či pin prerušenia MPU stúpol vysoko

neplatné nastavenie ()

{Serial.begin (9600); Serial.println ("Program spustený"); inicializácia = initializeGyroscope (); strip.begin (); } void loop () {if (! inicializácia) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); návrat; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= veľkosť balíka; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitácia, & 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 = obmedzenie (x, -1 * MAX_ANGLE, MAX_ANGLE); y = obmedzenie (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 a z 0 a z 0 a 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 = mapa (uhol, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, uhol); farba uint32_t; pre (int i = 0; i poloha + LED_OFFSET) {návratová poloha + LED_OFFSET; } pozícia návratu + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int uhol) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (uhol); 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 ("Pripojenie MPU6050 bolo úspešné"): F ("Pripojenie MPU6050 zlyhalo")); Serial.println (F ("Inicializácia 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 detekcia prerušenia (externé prerušenie Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP pripravený! Čakanie na prvé prerušenie … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} neplatné dmpDataReady () {mpuInterrupt = true;}

Nahrajte kód:

Pomocou adaptéra FTDI nahrajte kód do arduina.

Pripojte napájanie (batérie)

Kalibrácia:

Najdôležitejšou vecou, ktorú je tu potrebné kalibrovať, je konštanta „LED_OFFSET“. V mojom prípade je 12. Musíte to nastaviť od 0 do 23 tak, aby sa po zapnutí dosky LED dióda rozsvietila v smere, v akom ju nakloníte.

Ak sa chcete dozvedieť viac podrobností o tom, ako to funguje, pozrite sa na posledný krok

Krok 4: Ako to funguje (voliteľné)

Ako to funguje (voliteľné)
Ako to funguje (voliteľné)

Najprv malá informácia o gyroskope MPU6050. Jedná sa o gyroskop MEMS (MEMS znamená mikroelektromechanické systémy).

Každý typ gyroskopu MEM má nejakú formu oscilačnej zložky, z ktorej je možné detekovať akkleráciu, a teda zmenu smeru. Je to preto, že podľa zákona o pohybe vibrujúci predmet rád pokračuje v vibráciách v tej istej rovine a na odvodenie zmeny smeru je možné použiť akúkoľvek vibračnú odchýlku.

Gyroskop tiež obsahuje vlastný mikrokontrolér na výpočet nakláňania, nakláňania a vybočenia pomocou niekoľkých efektných matematík.

Surové údaje gyroskopu však trpia hlukom a driftom, a tak sme na vyrovnanie vecí a poskytnutie čistých použiteľných údajov použili externú knižnicu.

Neopixel sú RGB diódy jednotlivo adresovateľné a reťazené do pásov a krúžkov. Pracujú na 5 V a obsahujú vlastné obvody, takže stačí napájať neopixely a komunikovať s nimi pomocou dátového vedenia. Komunikácia prebieha pomocou jednej dátovej linky obsahujúcej hodiny a údaje (podrobnejšie informácie nájdete tu). Adafruit poskytuje čistú knižnicu na interakciu s neopixelovými krúžkami.

Kód

Vnútri funkcie l oop () sa nazýva knižnica MPU6050_6Axis_MotionApps20. Keď má knižnica nové údaje z gyroskopu, zavolá redrawLeds (x, y, z) s 3 argumentmi predstavujúcimi zatáčanie, rozstup a pohyb.

Vnútri redrawLeds ():

- zameriavame sa na dve osi: y, z

- obmedzujeme obe osi od -MAX_ANGLE do +MAX_ANGLE, definovali sme maximálny uhol na 45 a je možné ho zmeniť

- Rozdeľujeme 360 stupňov do 4 kvadrantov a pre každý z nich voláme funkcie lightLeds () takto:

* y negatívny, z pozitívny prvý kvadrant bude ovládať diódy LED od 0 do 5, uhol bude od 0 do 89

* y negatívne, z negatívne kontrolky druhého kvadrantu kontrolky od 6 do 12, uhol bude od 89 do 0

* …atď

- vo vnútri funkcie lightLeds

* vypočítam uhol na základe dvoch osí pomocou arktangentu (pozrite si priložený obrázok)

* Počítam, čo sa ukázalo, pomocou funkcie arduino mapy

* Obnovujem všetky LED diódy okrem dvoch LED, tej, ktorá zodpovedá pozícii LED, ktorú som vypočítal predtým, a pozícii LED pred (na zobrazenie efektu stmievania)

* Na zohľadnenie kalibrácie neopixelov používam funkciu nazývanú normalizeLedPosition (). Kalibrácia je užitočná, pretože prstenec neopixelu je možné otáčať podľa želania a mal by byť zarovnaný s gyroskopom

* Vytlačím aj os vleku, ktorá LED má svetlo a uhol

Matematika

Pripojil som obrázok s LED krúžkom a goniometrickou funkciou určenou na uhol.

Odporúča: