Inhoudsopgave:
- Stap 1: Dingen die nodig zijn
- Stap 2: Montage
- Stap 3: De code en kalibratie
- Stap 4: Hoe het werkt (optioneel)
Video: Gyroscoopplezier met Neopixel Ring - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
In deze tutorial gaan we de MPU6050-gyroscoop, een neopixel-ring en een arduino gebruiken om een apparaat te bouwen dat led's verlicht die overeenkomen met de hellingshoek.
Dit is een eenvoudig en leuk project en het zal op een breadboard worden gemonteerd. Als je de stappen volgt, bouw je wat je in de video hebt gezien. Het is een goede tutorial om meer te weten te komen over gyroscoop en de neopixelring.
Ik bouw deze tutorial vanwege de interesse die ik zag op mijn eerste instructable hier (Gyroscope Led Control With Arduino). In deze instructable heb ik eenvoudige led's vervangen door een neopixelring. De ring is eenvoudiger te gebruiken via een Adafruit-bibliotheek en is zeker spectaculairder.
Dus als je deze componenten rondslingert, is dit een geweldige manier om er gebruik van te maken, ik zal proberen je stap voor stap te begeleiden bij het bouwen van het apparaat en ook uitleggen hoe het werkt in de laatste stap.
Stap 1: Dingen die nodig zijn
Onderdelen
1. Arduino pro mini 328p (eBay) 2 $
2. Broodplank
3. MPU6050-gyroscoop (eBay) 1,2 $
4. 24 neopixel led-ring (Adafruit) 17 $
5. 4 x AA-batterijpakket met 4 batterijen
6. U-vormige startkabels (optioneel). Ik heb deze startkabels gebruikt omdat ze er beter uitzien op het breadboard en de leds op deze manier beter zichtbaar zijn. Je kunt een doos van 140 op ebay vinden voor ongeveer 4 $. Als je deze kabels niet hebt, kun je ze vervangen door dupont-draden.
Gereedschap:
1. USB naar seriële FTDI-adapter FT232RL om de arduino pro mini te programmeren
2. Arduino-IDE
Vaardigheden:1. Solderen, bekijk deze tutorial
3. Basis Arduino-programmering, deze tutorial kan nuttig zijn
Stap 2: Montage
Ik heb het fritzing-schema in fzz-formaat bijgevoegd en een foto ervan voor eenvoudige visualisatie van de verbindingen
1. U moet 3 mannelijke pinnen op de achterkant van de neopixel-ring solderen, zoals op de afbeelding wordt weergegeven
- soldeer de positieve pin
- soldeer de grond
- soldeer de data-invoerpin
2. Dan moet de 4x batterijhouder een manier hebben om verbinding te maken met het breadboard, een gemakkelijke oplossing is om twee mannelijke dupont-draden aan de terminals te solderen.
3. Bereid het breadboard voor.
- plaats de neopixelring, microcontroller en gyroscoop op het breadboard zoals in de afbeelding
- plaats alle negatieve draden: naar de microcontroller, neopixelring, gyro
- plaats alle positieve draden: naar de microcontroller, neopixelring, gyro
- plaats alle datadraden:
* SDA en SCL van de naar de microcontroller naar de gyro
* pin D6 van de microcontroller naar de neopixelring
- controleer alle verbindingen nogmaals voordat u de voeding inschakelt
- gebruik eventueel ducttape om het batterijpakket op de achterkant van het bradboard te plakken om het op zijn plaats te houden en het draagbaarder te maken
Stap 3: De code en kalibratie
Eerst moet je twee bibliotheken downloaden en installeren:
1. Adafruit neopixel-bibliotheek die de neopixel bestuurt
2. MPU6050-bibliotheek voor de gyroscoop
3. I2CDev bibliotheekbron
Het zijn twee geweldige bibliotheken die het zware werk zullen doen!
Meer details over de neopixels hier
Download en installeer dan mijn bibliotheek vanaf hier of kopieer het van onderaf:
#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; MPU6050mpu; Adafruit_NeoPixel-strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); unsigned long lastPrintTime = 0; bool initialisatie = false; // stel waar in als DMP init succesvol was uint8_t mpuIntStatus; // bevat actuele interruptstatusbyte van MPU uint8_t devStatus; // retourstatus na elke apparaatbewerking (0 = geslaagd, !0 = fout) uint16_t packetSize; // verwachte DMP-pakketgrootte (standaard is 42 bytes) uint16_t fifoCount; // telling van alle bytes die momenteel in FIFO zijn uint8_t fifoBuffer [64]; // FIFO-opslagbuffer Quaternion q; // [w, x, y, z] quaternioncontainer VectorFloat-zwaartekracht; // [x, y, z] zwaartekracht vector float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container en zwaartekracht vector vluchtige bool mpuInterrupt = false; // geeft aan of de MPU-interrupt-pin hoog is geworden
ongeldige setup()
{ Serieel.begin (9600); Serial.println("Programma gestart"); initialisatie = initialiserenGyroscope(); strip.begin(); } void loop() { if (!initialisatie) { return; } mpuInterrupt = onwaar; mpuIntStatus = mpu.getIntStatus(); fifoCount = mpu.getFIFOCount(); if (hasFifoOverflown(mpuIntStatus, fifoCount)) { mpu.resetFIFO(); opbrengst; } if (mpuIntStatus & 0x02) { while (fifoCount < packetSize) { fifoCount = mpu.getFIFOCount(); } mpu.getFIFOBytes(fifoBuffer, pakketgrootte); fifoCount -= pakketgrootte; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &zwaartekracht); 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 = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = beperking (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) { lightLeds(y, z, 0, 5, 0, 89); } else if (y < 0 en z 0 en z 0 en z > 0) { lightLeds(y, z, 20, 24, 89, 0); } } void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) { dubbele hoek = (atan ((dubbel) abs (x) / (dubbel) abs (y)) * 4068) / 71; int ledNr = map (hoek, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug(x, y, ledNr, hoek); uint32_t kleur; for (int i=0; i position + LED_OFFSET) {return position + LED_OFFSET; } terugkeerpositie + LED_OFFSET - NUM_LEDS; } void printDebug(int y, int z, int lightLed, int hoek) {if (millis() - lastPrintTime <500) { return; } Serial.print("a=");Serial.print(hoek);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.initialiseren(); Serial.println(mpu.testConnection() ? F("MPU6050 verbinding succesvol"): F("MPU6050 verbinding mislukt")); Serial.println(F("Initialiseren van DMP…")); devStatus = mpu.dmpInitialize(); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset (1788); if (devStatus != 0) { Serial.print(F("DMP-initialisatie mislukt (code"));Serial.println(devStatus); return false;} mpu.setDMPEnabled(true); Serial.println(F("Inschakelen interruptdetectie (Arduino externe interrupt 0)…")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); Serial.println(F("DMP gereed! Wachten op eerste onderbreking…")); packetSize = mpu.dmpGetFIFOPacketSize(); return true;} void dmpDataReady() {mpuInterrupt = true;}
Upload de code:
Gebruik de FTDI-adapter om de code naar de Arduino te uploaden.
Sluit de voeding (batterijen) aan
Kalibratie:
Het belangrijkste om hier te kalibreren is de constante "LED_OFFSET". In mijn voorbeeld is dit 12. Je moet dit aanpassen van 0 tot 23 zodat na het aanzetten van het bord de led oplicht in de richting waarin je het bord kantelt.
Als je meer wilt weten over hoe het werkt, bekijk dan de laatste stap
Stap 4: Hoe het werkt (optioneel)
Eerst wat informatie over de MPU6050 gyroscoop. Dit is een MEMS-gyroscoop (MEMS staat voor Microelectromechanical systems).
Elk type MEM-gyroscoop heeft een of andere vorm van oscillerende component van waaruit de versnelling, en dus richtingsverandering, kan worden gedetecteerd. Dit komt omdat, volgens de wet van behoud van beweging, een trillend object graag in hetzelfde vlak blijft trillen, en elke trillingsafwijking kan worden gebruikt om een richtingsverandering af te leiden.
De gyro bevat ook een eigen microcontroller om het rollen, stampen en gieren te berekenen door middel van wat mooie wiskunde.
Maar de onbewerkte gyro-gegevens hebben last van ruis en drift, dus hebben we een externe bibliotheek gebruikt om dingen glad te strijken en ons schone bruikbare gegevens te geven.
De Neopixel zijn RGB-leds die individueel adresseerbaar zijn en in banden en ringen zijn geketend. Ze werken op 5V en bevatten hun eigen circuits, dus je hoeft alleen de neopixels van stroom te voorzien en met hen te communiceren via de datalijn. De communicatie gebeurt met een enkele datalijn met klok en data (meer details hier). Adafruit biedt een schone bibliotheek voor interactie met de neopixelringen.
De code
Binnen de functie l oop() wordt de bibliotheek MPU6050_6Axis_MotionApps20 aangeroepen. Wanneer de bibliotheek nieuwe gegevens van de gyroscpe heeft, roept het redrawLeds(x, y, z) aan met 3 argumenten die yaw, pitch en roll vertegenwoordigen
Binnen hertekenLeds ():
- we concentreren ons op twee assen: y, z
- we beperken beide assen van -MAX_ANGLE tot +MAX_ANGLE, we hebben de maximale hoek gedefinieerd tot 45 en het is aanpasbaar
- we splitsen 360 graden op in 4 kwadranten en roepen de lightLeds()-functies voor elk als volgt aan:
* y negatief, z positief eerste kwadrant regelt led's van 0 tot 5, de hoek is van 0 tot 89
* y negatief, z negatief tweede kwadrant bedient led's van 6 tot 12, de hoek is van 89 tot 0
* …enzovoort
- binnen de lightLeds-functie
* ik bereken een hoek op basis van de twee assen met behulp van arctangens (bekijk de bijgevoegde afbeelding)
* ik bereken wat er werd weergegeven met behulp van de arduino-kaartfunctie
* ik reset de ledstrip op twee na alle led's, degene die overeenkomt met de led-positie die ik eerder heb berekend en een led-positie ervoor (om een fade-effect te tonen)
* ik gebruik een functie genaamd normalizeLedPosition() om rekening te houden met de neopixelkalibratie. De kalibratie is handig omdat de neopixelring naar wens kan worden gedraaid en moet worden uitgelijnd met de gyroscoop
* ik druk ook de sleepas af, welke led heeft licht en de hoek
De wiskunde
Ik heb een foto bijgevoegd met de led-ring en de trigonometrische functie die wordt gebruikt om de hoek te bepalen.
Aanbevolen:
Antistatische ring: 5 stappen (met afbeeldingen)
Antistatische ring: met deze ring kunt u uzelf ontladen van statische elektriciteit zonder een onaangename elektrische schok te voelen. Volgens Wikipedia is een van de oorzaken van ESD-gebeurtenissen statische elektriciteit. Statische elektriciteit wordt vaak opgewekt door middel van tribo-opladen
Doe-het-zelf draagbare ring-LED: 4 stappen
DIY Wearable Ring LED: Hallo, een paar maanden geleden heb ik mijn eerste SMD-printplaat gebouwd, dus ik wil graag mijn ervaring met je delen. We gaan een ronde printplaat ontwerpen met 4 RODE LED's, dit bord kan worden gebruikt als indicator of gewoon als decoratie voor Halloween :). Controleer de magie
Ring Solar Sign Teardown: ik deed het verkeerd, zodat u het niet hoeft te doen: 11 stappen
Ring Solar Sign Teardown: ik deed het verkeerd, zodat je het niet hoeft te doen: ik heb een Ring Doorbell, wat best geweldig is. Yay voor Ring. Toen kreeg ik een Ring Stick-up-camera toen alle online Thanksgiving-verkopen aan de gang waren. $ 50 korting, en ze stuurden me dit handige Ring-zonnebord GRATIS (slechts een waarde van $ 49!). Ik weet zeker d
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
LED-ring: 6 stappen
LED Ring: dit is een kleine, kleine SMD LED Ring en ook handig