Taula de continguts:

Diversió amb giroscopi amb anell de Neopixel: 4 passos (amb imatges)
Diversió amb giroscopi amb anell de Neopixel: 4 passos (amb imatges)

Vídeo: Diversió amb giroscopi amb anell de Neopixel: 4 passos (amb imatges)

Vídeo: Diversió amb giroscopi amb anell de Neopixel: 4 passos (amb imatges)
Vídeo: La Sotana 155, amb Ricard Torquemada 2024, Desembre
Anonim
Image
Image

En aquest tutorial utilitzarem el giroscopi MPU6050, un anell de neopixel i un arduino per construir un dispositiu que il·lumini els leds corresponents a l’angle d’inclinació.

Es tracta d’un projecte senzill i divertit que es muntarà en una taula de treball. Si seguiu els passos, construireu el que heu vist al vídeo. És un bon tutorial per aprendre sobre el giroscopi i l’anell de neopíxels.

Estic construint aquest tutorial per l'interès que vaig veure pel meu primer instructable aquí (Gyroscope Led Control With Arduino). En aquest instructiu he substituït els leds simples per un anell de neopíxels. L’anell és més senzill d’utilitzar a través d’una biblioteca Adafruit i sens dubte és més espectacular.

Per tant, si teniu aquests components al voltant, és una manera excel·lent de fer-ne ús, intentaré anar pas a pas construint el dispositiu i també explicar-vos com funciona a l’últim pas.

Pas 1: coses necessàries

muntatge
muntatge

Parts

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

2. Taula de pa

3. Giroscopi MPU6050 (eBay) 1,2 $

4. 24 anells led neopixels (Adafruit) 17 $

5. Paquet de 4 piles AA amb 4 piles

6. Cables de pont en forma d’U (opcional). He utilitzat aquests cables jumper perquè es veuen millor a la placa de configuració i els leds són més visibles d’aquesta manera. Podeu trobar una caixa de 140 a ebay a uns 4 $ aproximadament. Si no teniu aquests cables, podeu substituir-los per cables dupont.

Eines:

1. Adaptador USB a sèrie FTDI FT232RL per programar l'arduino pro mini

2. ID Arduino

Habilitats: 1. Soldant, consulteu aquest tutorial

3. Programació bàsica arduino, aquest tutorial pot ser útil

Pas 2: Muntatge

muntatge
muntatge

He adjuntat l’esquema fritzing en format fzz i una imatge per facilitar la visualització de les connexions

1. Cal soldar 3 pins masculins a la part posterior de l’anell de neopixel com es mostra a la imatge

- soldar el pin positiu

- soldar el terra

- Soldeu el pin d'entrada de dades

2. Aleshores, el suport de la bateria 4x hauria de tenir una forma de connectar-se a la placa, una solució fàcil és soldar dos cables dupont mascle als seus terminals.

3. Prepareu la pissarra.

- col·loqueu l’anell de neopíxel, el microcontrolador i el giroscopi a la placa de configuració com a la imatge

- col·loqueu tots els cables negatius: al microcontrolador, anell de neopixel, giroscopi

- col·loqueu tots els cables positius: al microcontrolador, anell de neopixel, giroscopi

- col·loqueu tots els cables de dades:

* SDA i SCL des del microcontrolador fins al giroscopi

* pin D6 del microcontrolador a l'anell de neopixel

- Reviseu totes les connexions abans d’engegar-les

opcionalment amb cinta adhesiva, enganxeu el paquet de bateries a la part posterior del tauler per mantenir-lo al seu lloc i fer-lo més portàtil

Pas 3: el codi i la calibració

Primer heu de descarregar i instal·lar dues llibreries:

1. Avet de la biblioteca Adafruit neopixel que controla el neopixel

2. Biblioteca MPU6050 per al giroscopi

3. Font de la biblioteca I2CDev

Són dues grans biblioteques que faran tot el possible.

Més detalls sobre els neopíxels aquí

A continuació, descarregueu i instal·leu la meva biblioteca des d’aquí o copieu-la des de baix:

#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; Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; inicialització bool = falsa; // defineix true si DMP init va tenir èxit uint8_t mpuIntStatus; // manté el byte d'estat de la interrupció real de la MPU uint8_t devStatus; // torna l'estat després de cada operació del dispositiu (0 = èxit,! 0 = error) uint16_t paquetSize; // mida prevista del paquet DMP (per defecte és de 42 bytes) uint16_t fifoCount; // recompte de tots els bytes actualment a FIFO uint8_t fifoBuffer [64]; // Buffer d'emmagatzematge FIFO Quaternion q; // [w, x, y, z] contenidor de quaternió Gravetat VectorFloat; // [x, y, z] vector de gravetat flotant ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container i gravity vector volatile bool mpuInterrupt = false; // indica si el pin d'interrupció de la MPU ha augmentat

configuració nul·la ()

{Serial.begin (9600); Serial.println ("S'ha iniciat el programa"); inicialització = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); tornar; } if (mpuIntStatus & 0x02) {while (fifoCount <packageetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = mida del paquet; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravetat, & 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 = restringir (x, -1 * MAX_ANGLE, MAX_ANGLE); y = restringir (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 i z 0 i z 0 i z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {angle doble = (atan ((doble) abs (x) / (doble) abs (y)) * 4068) / 71; int ledNr = mapa (angle, deAngle, aAngle, deLedPosition, aLedPosition); printDebug (x, y, ledNr, angle); uint32_t color; for (int i = 0; i position + LED_OFFSET) {return position + LED_OFFSET; } posició de retorn + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (angle); 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 ("connexió MPU6050 correcta"): F ("connexió MPU6050 fallida")); Serial.println (F ("Inicialització de 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 ("Activant detecció d'interrupcions (interrupció externa Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP llest! Esperant la primera interrupció … ")); = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Pengeu el codi:

Amb l’adaptador FTDI pengeu el codi a l’arduino.

Connecteu la font d'alimentació (bateries)

Calibratge:

El més important que cal calibrar aquí és la constant "LED_OFFSET". En el meu exemple, és 12. Heu d’ajustar-lo de 0 a 23 perquè, després d’encendre la placa, el led s’encengui en la direcció d’inclinació de la placa.

Si voleu obtenir més informació sobre com funciona, consulteu l'últim pas

Pas 4: Com funciona (opcional)

Com funciona (opcional)
Com funciona (opcional)

Primer una mica d'informació sobre el giroscopi MPU6050. Es tracta d’un giroscopi MEMS (MEMS significa sistemes microelectromecànics).

Cada tipus de giroscopi MEM té alguna forma de component oscil·lant des d’on es pot detectar l’acceleració i, per tant, el canvi de direcció. Això es deu al fet que, segons la llei de conservació del moviment, a un objecte vibrant li agrada continuar vibrant en el mateix pla i es pot utilitzar qualsevol desviació vibracional per obtenir un canvi de direcció.

El giroscopi també conté un microcontrolador propi per calcular el rotllo, el to i el desviament a través d’algunes matemàtiques elegants.

Però les dades brutes giroscòpiques pateixen soroll i deriva, de manera que hem utilitzat una biblioteca externa per suavitzar les coses i oferir-nos dades útils i netes.

Els Neopixel són leds RGB adreçables individualment i encadenats en bandes i anells. Funcionen en 5V i contenen circuits propis, de manera que només cal alimentar els neopíxels i comunicar-se amb ells mitjançant la línia de dades. La comunicació es fa amb una única línia de dades que conté rellotge i dades (més detalls aquí). Adafruit proporciona una biblioteca neta per interactuar amb els anells de neopíxels.

El codi

Dins de la funció l oop () es diu la biblioteca MPU6050_6Axis_MotionApps20. Quan la biblioteca té dades noves del giroscopi, crida a redrawLeds (x, y, z) amb 3 arguments que representen el desig, el pitch and roll

Dins redrawLeds ():

- ens centrem en dos eixos: y, z

- restringim els dos eixos de -MAX_ANGLE a + MAX_ANGLE, hem definit l'angle màxim a 45 i es pot canviar

- Estem dividint 360 graus en 4 quadrants i cridem a les funcions lightLeds () per a cadascuna de les maneres següents:

* y negatiu, el primer quadrant z positiu controlarà els leds de 0 a 5, l'angle serà de 0 a 89

* y negatiu, z negatiu del segon quadrant controla els leds de 6 a 12, l'angle serà de 89 a 0

* … etc.

- dins de la funció lightLeds

* Estic calculant un angle basat en els dos eixos mitjançant arctangent (consulteu la imatge adjunta)

* Estic calculant el que va portar a mostrar mitjançant la funció de mapa arduino

* Estic restablint la tira de leds excepte dos leds, el corresponent a la posició de led que he calculat abans i una posició de led abans (per mostrar un efecte de fade)

* Estic fent servir una funció anomenada normalizeLedPosition () per tenir en compte el calibratge del neopixel. El calibratge és útil perquè l’anell de neopíxels es pot girar segons vulgui i s’ha d’alignar amb el giroscopi

* També estic imprimint l'eix de remolc, el led té llum i l'angle

Les matemàtiques

He adjuntat una imatge amb l’anell led i la funció trigonomètrica que s’utilitza per determinar l’angle.

Recomanat: