Indholdsfortegnelse:
- Trin 1: Ting påkrævet
- Trin 2: Montering
- Trin 3: Koden og kalibreringen
- Trin 4: Sådan fungerer det (valgfrit)
Video: Gyroskop sjovt med neopixelring: 4 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:27
I denne vejledning vil vi bruge MPU6050 gyroskopet, en neopixelring og en arduino til at bygge en enhed, der lyser LED'er, der svarer til hældningsvinklen.
Dette er et enkelt og sjovt projekt, og det vil blive samlet på et brødbræt. Hvis du følger trinene, bygger du det, du så i videoen. Det er en god vejledning til at lære om gyroskop og neopixelringen.
Jeg bygger denne vejledning på grund af den interesse, jeg så på min første instruerbare her (Gyroscope Led Control With Arduino). I denne instruerbare har jeg erstattet simple LED'er med en neopixelring. Ringen er enklere at bruge gennem et Adafruit -bibliotek, og den er helt sikkert mere spektakulær.
Så hvis du har disse komponenter liggende, er dette en fantastisk måde at bruge dem på, jeg vil prøve at tage dig trin for trin gennem opbygningen af enheden og også forklare, hvordan det fungerer i det sidste trin.
Trin 1: Ting påkrævet
Dele
1. Arduino pro mini 328p (eBay) 2 $
2. Brødbræt
3. MPU6050 gyroskop (eBay) 1,2 $
4. 24 neopixel ledring (Adafruit) 17 $
5. 4 x AA batteripakke med 4 batterier
6. U-formede jumperkabler (ekstraudstyr). Jeg har brugt disse jumperkabler, fordi de ser bedre ud på brødbrættet, og lysdioderne er mere synlige på denne måde. Du kan finde en kasse med 140 på ebay til omkring 4 $. Hvis du ikke har disse kabler, kan du udskifte dem med dupont -ledninger.
Værktøjer:
1. USB til seriel FTDI -adapter FT232RL til programmering af arduino pro mini
2. Arduino IDE
Færdigheder: 1. Lodning, tjek denne vejledning
3. Grundlæggende arduino -programmering, denne vejledning kan være nyttig
Trin 2: Montering
Jeg har vedhæftet fritzing -skematikken i fzz -format og et billede af det for let visualisering af forbindelserne
1. Du skal lodde 3 hanstifter på bagsiden af neopixelringen som vist på billedet
- lod den positive pin
- lodde jorden
- lodde data input pin
2. Så skulle 4x batteriholderen have en måde at forbinde til brødbrættet, en let løsning er at lodde to han -dupont -ledninger til dens terminaler.
3. Forbered brødbrættet.
- placer neopixelringen, mikrokontrolleren og gyroskopet på brødbrættet som på billedet
- placer alle de negative ledninger: til mikrokontrolleren, neopixelring, gyro
- placer alle de positive ledninger: til mikrokontrolleren, neopixelring, gyro
- placer alle datatrådene:
* SDA og SCL fra til mikrokontrolleren til gyroen
* pin D6 fra mikrokontrolleren til neopixelringen
- dobbelttjek alle tilslutninger inden strømforsyning
- eventuelt ved hjælp af tape, tape batteripakken på bagsiden af bradboardet for at holde det på plads og gøre det mere bærbart
Trin 3: Koden og kalibreringen
Først skal du downloade og installere to biblioteker:
1. Adafruit neopixel bibliotek til kontrol af neopixel
2. MPU6050 bibliotek til gyroskopet
3. I2CDev bibliotekskilde
De er to store biblioteker, der vil klare de tunge løft!
Flere detaljer om neopixel her
Download og installer derefter mit bibliotek herfra, eller kopier det nedenunder:
#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; bool initialisering = falsk; // sæt sand, hvis DMP init var vellykket uint8_t mpuIntStatus; // holder den faktiske afbrydelsesstatusbyte fra MPU uint8_t devStatus; // returstatus efter hver enhedsoperation (0 = succes,! 0 = fejl) uint16_t packetSize; // forventet DMP -pakkestørrelse (standard er 42 bytes) uint16_t fifoCount; // tæller alle bytes i øjeblikket i FIFO uint8_t fifoBuffer [64]; // FIFO opbevaringsbuffer Quaternion q; // [w, x, y, z] quaternion container VectorFloat tyngdekraft; // [x, y, z] tyngdekraftsvektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container og tyngdekraftvektoren flygtig bool mpuInterrupt = false; // angiver, om MPU -afbrydelsesnålen er gået højt
ugyldig opsætning ()
{Serial.begin (9600); Serial.println ("Program startet"); initialisering = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = falsk; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); hvis (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); Vend tilbage; } 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, & tyngdekraft); 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 = begrænsning (x, -1 * MAX_ANGLE, MAX_ANGLE); y = begrænsning (y, -1 * MAX_ANGLE, MAX_ANGLE); hvis (y 0) {lightLeds (y, z, 0, 5, 0, 89); } ellers 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) {dobbelt vinkel = (atan ((dobbelt) abs (x) / (dobbelt) abs (y)) * 4068) / 71; int ledNr = map (vinkel, fraAngle, tilAngle, fraLedPosition, tilLedPosition); printDebug (x, y, ledNr, vinkel); uint32_t farve; for (int i = 0; i position + LED_OFFSET) {returposition + LED_OFFSET; } returposition + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int vinkel) {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 forbindelse lykkedes"): F ("MPU6050 forbindelse mislykkedes")); Serial.println (F ("Initialiserer DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); hvis (devStatus! = 0) {Serial.print (F ("DMP -initialisering mislykkedes (kode")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktivering afbrydelsesdetektering (Arduino ekstern afbrydelse 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP klar! Venter på første afbrydelse … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}
Upload koden:
Brug FTDI -adapteren til at uploade koden til arduinoen.
Tilslut strømforsyningen (batterier)
Kalibrering:
Det vigtigste at kalibrere her er "LED_OFFSET" konstant. I mit eksempel er 12. Du skal justere dette fra 0 til 23, så efter tænding af tavlen lyser LED'en i den retning, du vipper brættet.
Hvis du vil finde ud af flere detaljer om, hvordan det fungerer, kan du tjekke det sidste trin
Trin 4: Sådan fungerer det (valgfrit)
Først lidt information om MPU6050 gyroskopet. Dette er et MEMS -gyroskop (MEMS står for mikroelektromekaniske systemer).
Hver type MEM -gyroskop har en eller anden form for oscillerende komponent, hvorfra akkumuleringen og dermed retningsændring kan detekteres. Dette skyldes, at i henhold til bevarelsen af bevægelsesloven, kan et vibrerende objekt gerne fortsætte med at vibrere i det samme plan, og enhver vibrationsafvigelse kan bruges til at udlede en ændring i retning.
Gyroen indeholder også en egen mikrokontroller til at beregne rullen, pitch og gab gennem nogle flotte matematik.
Men gyro -rådataene lider af støj og drift, så vi brugte et eksternt bibliotek til at udjævne tingene og give os rene brugbare data.
Neopixel er RGB -leds individuelt adresserbare og lænket i bånd og ringe. De fungerer på 5V, og de indeholder deres eget kredsløb, så du behøver kun at drive neopixel og kommunikere med dem ved hjælp af datalinjen. Kommunikationen sker med en enkelt datalinje, der indeholder ur og data (flere detaljer her). Adafruit giver et rent bibliotek til interaktion med neopixelringene.
Koden
Inde i l oop () -funktionen kaldes MPU6050_6Axis_MotionApps20 biblioteket. Når biblioteket har nye data fra gyroscpe kalder det redrawLeds (x, y, z) med 3 argumenter, der repræsenterer yaw, pitch og roll
Inde i redrawLeds ():
- vi fokuserer på to akser: y, z
- vi begrænser begge akser fra -MAX_ANGLE til +MAX_ANGLE, vi definerede maksimal vinkel til 45, og den kan ændres
- vi opdeler 360 grader i 4 kvadranter og kalder lightLeds () -funktioner for hver som følger:
* y negativ, z positiv første kvadrant vil kontrollere lysdioder fra 0 til 5, vinklen vil være fra 0 til 89
* y negative, z negative anden kvadrant kontroller led fra 6 til 12, vinklen vil være fra 89 til 0
* …etc
- inde i lightLeds -funktionen
* jeg beregner en vinkel baseret på de to akser ved hjælp af arctangent (tjek det vedhæftede billede)
* Jeg beregner, hvad der førte til at vise ved hjælp af arduino -kortfunktionen
* jeg nulstiller LED -båndet alle undtagen to LED'er, den svarer til den LED -position, jeg har beregnet før og en LED -position før (for at vise en fade -effekt)
* Jeg bruger en funktion kaldet normalizeLedPosition () for at tage højde for neopixelkalibreringen. Kalibreringen er nyttig, fordi neopixelringen kan drejes som ønsket og bør justeres med gyroskopet
* jeg udskriver også trækaksen, hvad LED har lys og vinkel
Matematikken
Jeg har vedhæftet et billede med LED -ringen og den trigonometriske funktion, der bruges til at bestemme vinklen.
Anbefalede:
Gyroskop platform/ kamera Gimbal: 5 trin (med billeder)
Gyroskop platform/ kamera Gimbal: Denne instruerbare blev oprettet for at opfylde projektkravet i Makecourse ved University of South Florida (www.makecourse.com)
Sjovt med OLED -skærm og Arduino: 12 trin (med billeder)
Sjovt med OLED -skærm og Arduino: Jeg er ret sikker på, at du helt sikkert har hørt om OLED -skærmteknologi. Det er relativt nyt og tilbyder en bedre kvalitet end gammel LCD -teknologi. I denne vejledning vil vi gennemgå de trin, der kræves for at vise data om et af de mest almindelige enkelt co
Seks -sidet PCB LED -terning med WIFI og gyroskop - PIKOCUBE: 7 trin (med billeder)
Seks -sidet PCB LED -terning med WIFI og gyroskop - PIKOCUBE: Hej beslutningstagere, det er maker moekoe! I dag vil jeg vise dig, hvordan du bygger en rigtig LED -terning baseret på seks PCB'er og 54 LED'er i alt. Ved siden af sin indre gyroskopiske sensor, der kan registrere bevægelse og terningens position, kommer terningen med en ESP8285-01F, som er
Arduino Nano og Visuino: Konverter acceleration til vinkel fra accelerometer og gyroskop MPU6050 I2C -sensor: 8 trin (med billeder)
Arduino Nano og Visuino: Konverter acceleration til vinkel fra accelerometer og gyroskop MPU6050 I2C -sensor: For et stykke tid siden lagde jeg en tutorial op om, hvordan du kan forbinde MPU9250 Accelerometer, Gyroscope og Compass Sensor til Arduino Nano og programmere den med Visuino til at sende pakkedata og vise det på et omfang og visuelle instrumenter. Accelerometeret sender X, Y
Solcelledrevet laser (pointer) - Et "hobbystørrelses" panel kører det! - Enkel DIY - Sjovt eksperiment !: 6 trin (med billeder)
Solcelledrevet laser (pointer) - Et "hobbystørrelses" panel kører det! - Enkel DIY - Sjovt eksperiment !: denne instruktive viser, hvordan du driver en laserpeger med et solpanel. god introduktion til solenergi og et sjovt eksperiment