Innholdsfortegnelse:

Gyroskop moro med Neopixel ring: 4 trinn (med bilder)
Gyroskop moro med Neopixel ring: 4 trinn (med bilder)

Video: Gyroskop moro med Neopixel ring: 4 trinn (med bilder)

Video: Gyroskop moro med Neopixel ring: 4 trinn (med bilder)
Video: ГИРОСКОП КИБЕРСПОРТСМЕНА😅! 2024, November
Anonim
Image
Image

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

montering
montering

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

montering
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)

Slik fungerer det (valgfritt)
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: