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: Arduino NeoPixel LED Tutorial for Beginners 2024, Listopad
Anonim
Image
Image

V tomto tutoriálu použijeme gyroskop MPU6050, neopixelový prstenec a arduino k vytvoření zařízení, které rozsvítí LED diody odpovídající úhlu sklonu.

Jedná se o jednoduchý a zábavný projekt a bude sestaven na prkénku. Pokud budete postupovat podle těchto kroků, vytvoříte to, co jste viděli ve videu. Je to dobrý návod, jak se naučit gyroskop a neopixelový prsten.

Tento tutoriál stavím kvůli zájmu, který jsem viděl na svém prvním instruktážním zde (Gyroscope Led Control With Arduino). V tomto pokynu jsem nahradil jednoduché LED diody neopixelovým kroužkem. Prsten je jednodušší použít prostřednictvím knihovny Adafruit a je rozhodně efektnější.

Pokud tedy máte tyto komponenty kolem, je to skvělý způsob, jak je využít, pokusím se vás krok za krokem provést sestavením zařízení a také vysvětlit, jak to funguje v posledním kroku.

Krok 1: Požadované věci

Shromáždění
Shromáždění

Díly

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

2. Breadboard

3. Gyroskop MPU6050 (eBay) 1,2 $

4. 24 neopixel led led ring (Adafruit) 17 $

5. Sada baterií 4 x AA se 4 bateriemi

6. Propojovací kabely ve tvaru U (volitelně). Použil jsem tyto propojovací kabely, protože na prkénku vypadají lépe a LED diody jsou tímto způsobem viditelnější. Krabici 140 najdete na ebay přibližně za 4 $. Pokud tyto kabely nemáte, můžete je nahradit dupontními vodiči.

Nástroje:

1. Adaptér FTDI USB na sériový FT232RL pro programování arduino pro mini

2. Arduino IDE

Dovednosti: 1. Pájení, podívejte se na tento návod

3. Základní arduino programování, tento návod může být užitečný

Krok 2: Sestavení

Shromáždění
Shromáždění

Připojil jsem fritzující schéma ve formátu fzz a jeho obrázek pro snadnou vizualizaci připojení

1. Na zadní část neopixelového prstence musíte připájet 3 samčí kolíky, jak je znázorněno na obrázku

- pájet kladný kolík

- pájet zem

- pájet kolík vstupu dat

2. Potom by měl mít 4x držák baterie způsob připojení k prkénku, snadné řešení je pájet dva samčí dupontové vodiče na jeho svorky.

3. Připravte prkénko.

- umístěte neopixelový prstenec, mikrokontrolér a gyroskop na prkénko jako na obrázku

- umístěte všechny záporné vodiče: do mikrokontroléru, neopixelového prstence, gyroskopu

- umístěte všechny kladné vodiče: do mikrokontroléru, neopixelového prstence, gyroskopu

- umístěte všechny datové vodiče:

* SDA a SCL od mikrokontroléru po gyroskop

* kolík D6 od mikrokontroléru k neopixelovému prstenci

- před napájením znovu zkontrolujte všechna připojení

- volitelně pomocí lepicí pásky přilepte bateriový blok na zadní stranu bradboardu, aby držel na místě a byl přenosnější

Krok 3: Kód a kalibrace

Nejprve musíte stáhnout a nainstalovat dvě knihovny:

1. Knihovna neopafelů Adafruit jedle ovládající neopixel

2. Knihovna MPU6050 pro gyroskop

3. Zdroj knihovny I2CDev

Jsou to dvě skvělé knihovny, které zvládnou zvedání těžkých břemen!

Více podrobností o neopixelech zde

Potom si stáhněte a nainstalujte moji knihovnu odtud nebo ji zkopírujte níže:

#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; Proužek Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; inicializace bool = false; // set true, pokud byl DMP init úspěšný uint8_t mpuIntStatus; // uchovává skutečný stavový byte přerušení z MPU uint8_t devStatus; // návrat stavu po každé operaci zařízení (0 = úspěch,! 0 = chyba) uint16_t packetSize; // očekávaná velikost paketu DMP (výchozí hodnota je 42 bajtů) uint16_t fifoCount; // počet všech bytů aktuálně ve FIFO uint8_t fifoBuffer [64]; // vyrovnávací paměť FIFO Quaternion q; // [w, x, y, z] čtveřičný kontejner VectorFloat gravitace; // [x, y, z] gravitační vektor float ypr [3]; // [stáčení, stoupání, otáčení] vybočování/stoupání/převíjení kontejneru a gravitační vektor volatile bool mpuInterrupt = false; // indikuje, zda pin přerušení MPU dosáhl vysoké hodnoty

neplatné nastavení ()

{Serial.begin (9600); Serial.println ("Program spuštěn"); inicializace = initializeGyroscope (); strip.begin (); } void loop () {if (! inicializace) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); vrátit se; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitace, & 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 = omezení (x, -1 * MAX_ANGLE, MAX_ANGLE); y = omezení (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 (úhel, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, úhel); barva uint32_t; pro (int i = 0; i poloha + LED_OFFSET) {návratová poloha + LED_OFFSET; } pozice návratu + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (úhel); 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 ("Připojení MPU6050 úspěšné"): F ("Připojení MPU6050 se nezdařilo")); Serial.println (F ("Inicializace 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 detekce přerušení (externí přerušení Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP připraven! Čekání na první přerušení … ")); = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Nahrajte kód:

Pomocí adaptéru FTDI nahrajte kód do arduina.

Připojte napájecí zdroj (baterie)

Kalibrace:

Nejdůležitější věcí, kterou je zde třeba kalibrovat, je konstanta „LED_OFFSET“. V mém příkladu je 12. Musíte to nastavit od 0 do 23, aby se po zapnutí desky LED dioda rozsvítila ve směru, ve kterém desku nakloníte.

Pokud se chcete dozvědět více podrobností o tom, jak to funguje, podívejte se na poslední krok

Krok 4: Jak to funguje (volitelně)

Jak to funguje (volitelně)
Jak to funguje (volitelně)

Nejprve malá informace o gyroskopu MPU6050. Jedná se o gyroskop MEMS (MEMS znamená mikroelektromechanické systémy).

Každý typ gyroskopu MEM má nějakou formu oscilační složky, ze které lze detekovat akkleraci, a tedy i změnu směru. Důvodem je, že podle zákona o zachování pohybu vibrující předmět rád pokračuje ve vibraci ve stejné rovině a pro odvození změny směru lze použít jakoukoli vibrační odchylku.

Gyroskop také obsahuje vlastní mikrokontrolér pro výpočet náklonu, rozteče a zatáčení pomocí nějaké fantastické matematiky.

Ale gyroskopická surová data trpí hlukem a driftem, takže jsme použili externí knihovnu, abychom věci vyhladili a poskytli nám čistá použitelná data.

Neopixel jsou RGB LED diody jednotlivě adresovatelné a zřetězené do pásem a prstenů. Pracují na 5 V a obsahují vlastní obvody, takže potřebujete pouze napájet neopixely a komunikovat s nimi pomocí datové linky. Komunikace probíhá pomocí jediné datové linky obsahující hodiny a data (více zde). Adafruit poskytuje čistou knihovnu pro interakci s neopixelovými prstenci.

Kód

Uvnitř funkce l oop () se nazývá knihovna MPU6050_6Axis_MotionApps20. Když má knihovna nová data z gyroskopu, volá redrawLeds (x, y, z) se 3 argumenty představujícími zatáčení, stoupání a otáčení

Uvnitř redrawLeds ():

- zaměřujeme se na dvě osy: y, z

- omezujeme obě osy od -MAX_ANGLE do +MAX_ANGLE, definovali jsme maximální úhel na 45 a je to měnitelné

- rozdělujeme 360 stupňů do 4 kvadrantů a pro každý z nich voláme funkce lightLeds () následovně:

* y negativní, z pozitivní první kvadrant bude kontrolovat LED od 0 do 5, úhel bude od 0 do 89

* y negativní, z negativní druhý kvadrant kontrolky LED od 6 do 12, úhel bude od 89 do 0

* …atd

- uvnitř funkce lightLeds

* počítám úhel na základě dvou os pomocí arktangentu (podívejte se na přiložený obrázek)

* Vypočítávám, co vedlo k zobrazení pomocí funkce mapy arduino

* Obnovuji všechny LED diody kromě dvou LED, té, která odpovídá pozici LED, kterou jsem vypočítal dříve, a pozici LED před (pro zobrazení efektu slábnutí)

* Používám funkci nazývanou normalizeLedPosition (), abych zohlednil kalibraci neopixelů. Kalibrace je užitečná, protože neopixelový prstenec lze libovolně otáčet a měl by být zarovnán s gyroskopem

* Také tisknu osu vleku, co vedlo má světlo a úhel

Matematika

Připojil jsem obrázek s LED kroužkem a goniometrickou funkcí použitou k určení úhlu.

Doporučuje: