Innholdsfortegnelse:
- Trinn 1: Ting som kreves
- Trinn 2: Montering
- Trinn 3: Koden og kalibreringen
- Trinn 4: Slik fungerer det (valgfritt)
Video: Gyroskop moro med Neopixel ring: 4 trinn (med bilder)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:22
I denne opplæringen skal vi bruke MPU6050 gyroskopet, en neopikselring og en arduino for å bygge en enhet som lyser lysdioder som tilsvarer hellingsvinkelen.
Dette er et enkelt og morsomt prosjekt, og det skal settes sammen på et brødbrett. Hvis du følger trinnene, bygger du det du så i videoen. Det er en god opplæring for å lære om gyroskop og neopikselringen.
Jeg bygger denne opplæringen på grunn av interessen jeg så på min første instruerbare her (Gyroscope Led Control With Arduino). I denne instruerbare har jeg byttet ut enkle LED -er med en neopikselring. Ringen er enklere å bruke gjennom et Adafruit -bibliotek, og den er definitivt mer spektakulær.
Så hvis du har disse komponentene liggende, er dette en fin måte å bruke dem på, jeg skal prøve å ta deg trinnvis gjennom å bygge enheten og også forklare hvordan det fungerer i det siste trinnet.
Trinn 1: Ting som kreves
Deler
1. Arduino pro mini 328p (eBay) 2 $
2. Brødbrett
3. MPU6050 gyroskop (eBay) 1,2 $
4. 24 neopiksel ledring (Adafruit) 17 $
5. 4 x AA -batteripakke med 4 batterier
6. U-formede startkabler (valgfritt). Jeg har brukt disse hopperkablene fordi de ser bedre ut på brødbrettet, og lysdiodene er mer synlige på denne måten. Du kan finne en eske med 140 på ebay til omtrent 4 $. Hvis du ikke har disse kablene, kan du erstatte dem med dupont -ledninger.
Verktøy:
1. USB til seriell FTDI -adapter FT232RL for å programmere arduino pro mini
2. Arduino IDE
Ferdigheter: 1. Lodding, sjekk denne opplæringen
3. Grunnleggende arduino -programmering, denne opplæringen kan være nyttig
Trinn 2: Montering
Jeg har lagt ved fritzingskjemaet i fzz -format og et bilde av det for enkel visualisering av tilkoblingene
1. Du må lodde 3 hannpinner på baksiden av neopikselringen som vist på bildet
- lodd den positive pinnen
- lodde bakken
- lodde datainnmatingsnålen
2. Da bør 4x batteriholderen ha en måte å koble til brødbrettet på. En enkel løsning er å lodde to mannlige dupont -ledninger til terminalene.
3. Forbered brødbrettet.
- plasser neopikselringen, mikrokontrolleren og gyroskopet på brødbrettet som på bildet
- plasser alle negative ledninger: til mikrokontrolleren, neopikselringen, gyro
- plasser alle de positive ledningene: til mikrokontrolleren, neopikselringen, gyro
- plasser alle datatrådene:
* SDA og SCL fra til mikrokontrolleren til gyroen
* pin D6 fra mikrokontrolleren til neopikselringen
- dobbeltsjekk alle tilkoblinger før du slår på strømmen
- eventuelt bruk av tape, teip batteripakken på baksiden av bradboardet for å holde det på plass og gjøre det mer bærbart
Trinn 3: Koden og kalibreringen
Først må du laste ned og installere to biblioteker:
1. Adafruit neopikselbibliotek for å kontrollere neopikselen
2. MPU6050 bibliotek for gyroskopet
3. I2CDev bibliotekskilde
De er to flotte biblioteker som vil gjøre de tunge løftene!
Flere detaljer om neopikslene her
Last ned og installer biblioteket mitt herfra eller kopier det nedenfra:
#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); usignert lang lastPrintTime = 0; bool initialisering = false; // satt true hvis DMP init var vellykket uint8_t mpuIntStatus; // holder faktisk avbruddsstatusbyte fra MPU uint8_t devStatus; // returstatus etter hver enhetsoperasjon (0 = suksess,! 0 = feil) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 byte) uint16_t fifoCount; // telling av alle byte som for øyeblikket er i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffer Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravity; // [x, y, z] tyngdekraftvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektoren flyktig bool mpuInterrupt = false; // angir om MPU -avbruddsnålen har gått høyt
ugyldig oppsett ()
{Serial.begin (9600); Serial.println ("Programmet startet"); initialisering = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); komme tilbake; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& tyngdekraft, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} boolsk hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = begrensning (x, -1 * MAX_ANGLE, MAX_ANGLE); y = begrensning (y, -1 * MAX_ANGLE, MAX_ANGLE); hvis (y 0) {lightLeds (y, z, 0, 5, 0, 89); } annet hvis (y <0 og z 0 og z 0 og 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 = map (vinkel, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, vinkel); uint32_t farge; for (int i = 0; i posisjon + LED_OFFSET) {returposisjon + LED_OFFSET; } returposisjon + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (vinkel); 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 ("MPU6050 tilkobling vellykket"): F ("MPU6050 tilkobling mislyktes")); Serial.println (F ("Initialiserer 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 ("Aktivering avbruddsdeteksjon (Arduino ekstern avbrudd 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP klar! Venter på første avbrudd … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}
Last opp koden:
Last opp koden til arduinoen ved å bruke FTDI -adapteren.
Koble til strømforsyningen (batterier)
Kalibrering:
Det viktigste å kalibrere her er "LED_OFFSET" konstant. I mitt eksempel er 12. Du må justere dette fra 0 til 23 slik at etter at du har slått på brettet, vil lysdioden lyse i den retningen du tipper brettet.
Hvis du vil finne ut mer informasjon om hvordan det fungerer, sjekk det siste trinnet
Trinn 4: Slik fungerer det (valgfritt)
Først litt informasjon om gyroskopet MPU6050. Dette er et MEMS -gyroskop (MEMS står for mikroelektromekaniske systemer).
Hver type MEM -gyroskop har en eller annen form for oscillerende komponent hvorfra akkumulasjonen, og dermed retningsendring, kan detekteres. Dette er fordi, i henhold til bevarelsen av bevegelsesloven, liker et vibrerende objekt å fortsette å vibrere i samme plan, og ethvert vibrasjonsavvik kan brukes til å utlede en endring i retning.
Gyroen inneholder også en egen mikrokontroller for å beregne rull, tonehøyde og gjeving gjennom noen fancy matematikk.
Men gyro -rådataene lider av støy og drift, så vi brukte et eksternt bibliotek for å jevne ut ting og gi oss rene brukbare data.
Neopixel er RGB -lysdioder individuelt adresserbare og lenket i bånd og ringer. De fungerer på 5V, og de inneholder sine egne kretser, så du trenger bare å drive neopikslene og kommunisere med dem ved hjelp av datalinjen. Kommunikasjonen utføres med en enkelt datalinje som inneholder klokke og data (flere detaljer her). Adafruit gir et rent bibliotek for samhandling med neopikselringene.
Koden
Inne i l oop () -funksjonen kalles MPU6050_6Axis_MotionApps20 -biblioteket. Når biblioteket har nye data fra gyroscpe kaller det redrawLeds (x, y, z) med 3 argumenter som representerer yaw, pitch og roll
Inside redrawLeds ():
- vi fokuserer på to akser: y, z
- vi begrenser begge aksene fra -MAX_ANGLE til +MAX_ANGLE, vi definerte maksimal vinkel til 45, og den kan endres
- vi deler 360 grader i 4 kvadranter og kaller lightLeds () -funksjoner for hver som følger:
* y negativ, z positiv første kvadrant vil kontrollere lysdioder fra 0 til 5, vinkelen vil være fra 0 til 89
* y negative, z negative andre kvadrant kontroller led fra 6 til 12, vinkelen vil være fra 89 til 0
* …etc
- inne i lightLeds -funksjonen
* jeg beregner en vinkel basert på toaksen ved hjelp av arctangent (sjekk vedlagte bilde)
* Jeg regner ut hva som førte til å vise ved hjelp av arduino -kartfunksjonen
* jeg tilbakestiller LED -stripen alle unntatt to LED -er, den som tilsvarer LED -posisjonen jeg har beregnet før og en LED -posisjon før (for å vise en fade -effekt)
* Jeg bruker en funksjon som heter normalizeLedPosition () for å ta hensyn til neopikselkalibreringen. Kalibreringen er nyttig fordi neopikselringen kan roteres som ønsket, og bør justeres med gyroskopet
* jeg skriver også ut slepeaksen, det ledet har lys og vinkelen
Matten
Jeg har lagt ved et bilde med LED -ringen og den trigonometriske funksjonen som brukes til å bestemme vinkelen.
Anbefalt:
Overføringslæring med NVIDIA JetBot - moro med trafikkjegler: 6 trinn
Overføringslæring med NVIDIA JetBot-Moro med trafikkjegler: Lær roboten din å finne en bane i en labyrint av trafikkjegler ved hjelp av kameraet og den toppmoderne dype læringsmodellen
Moro med OLED -skjerm og Arduino: 12 trinn (med bilder)
Moro med OLED -skjerm og Arduino: Jeg er ganske sikker på at du definitivt har hørt om OLED -skjermteknologi. Det er relativt nytt og tilbyr en bedre kvalitet enn gammel LCD -teknologi. I denne opplæringen ønsker vi å gjennomgå trinnene som kreves for å vise data på en av de vanligste enkeltkomponentene
Sekssidig PCB LED -terning med WIFI og gyroskop - PIKOCUBE: 7 trinn (med bilder)
Seks -sidet PCB LED -terning med WIFI og gyroskop - PIKOCUBE: Hei beslutningstakere, det er maker moekoe! I dag vil jeg vise deg hvordan du bygger en ekte LED -terning basert på seks PCB -er og 54 LED -er totalt. Ved siden av den indre gyroskopiske sensoren som kan registrere bevegelse og terningsposisjon, kommer kuben med en ESP8285-01F som er
Arduino Nano og Visuino: Konverter akselerasjon til vinkel fra akselerometer og gyroskop MPU6050 I2C -sensor: 8 trinn (med bilder)
Arduino Nano og Visuino: Konverter akselerasjon til vinkel fra akselerometer og gyroskop MPU6050 I2C -sensor: For en stund siden la jeg ut en opplæring om hvordan du kan koble MPU9250 akselerometer, gyroskop og kompasssensor til Arduino Nano og programmere den med Visuino for å sende pakkedata og vise det på et omfang og visuelle instrumenter. Akselerometeret sender X, Y
Faraday for moro: en elektronisk batteriløs terning: 12 trinn (med bilder)
Faraday for Fun: en elektronisk batteriløs terning: Det har vært stor interesse for muskeldrevne elektroniske enheter, hovedsakelig på grunn av suksessen til Perpetual Torch Perpetual Torch, også kjent som batteriløs LED-lommelykt. Den batteriløse fakkelen består av en spenningsgenerator for å drive lysdiodene