Inhoudsopgave:

Gyroscoopplezier met Neopixel Ring - Ajarnpa
Gyroscoopplezier met Neopixel Ring - Ajarnpa

Video: Gyroscoopplezier met Neopixel Ring - Ajarnpa

Video: Gyroscoopplezier met Neopixel Ring - Ajarnpa
Video: New Products 7/8/2015 2024, November
Anonim
Image
Image

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

samenkomst
samenkomst

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

samenkomst
samenkomst

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)

Hoe het werkt (optioneel)
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: