Taula de continguts:
- Pas 1: coses necessàries
- Pas 2: Muntatge
- Pas 3: el codi i la calibració
- Pas 4: Com funciona (opcional)
Vídeo: Diversió amb giroscopi amb anell de Neopixel: 4 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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
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
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)
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:
Diversió amb pantalla OLED i Arduino: 12 passos (amb imatges)
Diversió amb la pantalla OLED i Arduino: estic segur que definitivament heu sentit a parlar de la tecnologia de pantalla OLED. És relativament nou i ofereix una millor qualitat que la tecnologia LCD antiga. En aquest tutorial volem revisar els passos necessaris per mostrar dades sobre una de les empreses més comunes
Daus de PCB LED de sis cares amb WIFI i giroscopi - PIKOCUBE: 7 passos (amb imatges)
Daus de LED de sis cares amb WIFI i giroscopi: PIKOCUBE: Hola, fabricants, és fabricant moekoe. Avui vull mostrar-vos com construir un dau LED real basat en sis PCB i 54 LED en total. Al costat del seu sensor giroscòpic intern que pot detectar el moviment i la posició dels daus, el cub ve amb un ESP8285-01F que és
Control d'un anell LED Neopixel amb un sensor de gest: 3 passos (amb imatges)
Control d’un anell de led Neopixel amb un sensor de gest: en aquest tutorial jugarem amb un sensor de gest (APDS-9960) i un anell de neopixel per aprendre a combinar-los amb un Arduino UNO. gestos esquerra - dreta animant el moviment del led cap a la dreta o cap a l'esquerra, i fins a
Caleidoscopi anell NeoPixel: 8 passos (amb imatges)
NeoPixel Ring Kaleidoscope: Em complau poder oferir instruccions i fitxers de material per fer un Caleidoscopi LightLogo. He estat pensant en fer-ho durant molts mesos i finalment he elaborat un disseny. Si teniu alguna millora en aquest disseny, compartiu-lo! No
Arduino Nano i Visuino: converteix l’acceleració en angle des de l’acceleròmetre i el giroscopi Sensor MPU6050 I2C: 8 passos (amb imatges)
Arduino Nano i Visuino: Converteix l’acceleració en angle des de l’acceleròmetre i el giroscopi Sensor MPU6050 I2C: Fa un temps vaig publicar un tutorial sobre com connectar l’acceleròmetre, el giroscopi i el sensor de brúixola MPU9250 a Arduino Nano i programar-lo amb Visuino per enviar dades de paquets i mostrar-los. en un àmbit d'aplicació i instruments visuals. L'acceleròmetre envia X, Y