Innehållsförteckning:

Gyroskop kul med Neopixelring: 4 steg (med bilder)
Gyroskop kul med Neopixelring: 4 steg (med bilder)

Video: Gyroskop kul med Neopixelring: 4 steg (med bilder)

Video: Gyroskop kul med Neopixelring: 4 steg (med bilder)
Video: С ума сойти 😳🤯 Вы должны это ВИДЕТЬ 2024, November
Anonim
Image
Image

I den här handledningen kommer vi att använda MPU6050 -gyroskopet, en neopixelring och en arduino för att bygga en enhet som tänder lysdioder som motsvarar lutningsvinkeln.

Detta är ett enkelt och roligt projekt och det kommer att monteras på en bräda. Om du följer stegen bygger du det du såg i videon. Det är en bra handledning för att lära sig om gyroskop och neopixelringen.

Jag bygger denna handledning på grund av intresset jag såg på min första instruerbara här (Gyroscope Led Control With Arduino). I denna instruerbara har jag bytt ut enkla lysdioder med en neopixelring. Ringen är enklare att använda genom ett Adafruit -bibliotek och den är definitivt mer spektakulär.

Så om du har dessa komponenter liggande är det ett bra sätt att använda dem, jag ska försöka ta dig steg för steg genom att bygga enheten och också förklara hur det fungerar i det sista steget.

Steg 1: Saker som krävs

hopsättning
hopsättning

Delar

1. Arduino pro mini 328p (eBay) 2 $

2. Brödbräda

3. MPU6050 gyroskop (eBay) 1,2 $

4. 24 neopixel ledring (Adafruit) 17 $

5. 4 x AA -batteripaket med 4 batterier

6. U-formade bygelkablar (tillval). Jag har använt dessa bygelkablar eftersom de ser bättre ut på brödbrädan, och lysdioderna är mer synliga på detta sätt. Du kan hitta en låda med 140 på ebay till cirka 4 $. Om du inte har dessa kablar kan du ersätta dem med dupont -ledningar.

Verktyg:

1. USB till seriell FTDI -adapter FT232RL för att programmera arduino pro mini

2. Arduino IDE

Färdigheter: 1. Lödning, kolla denna handledning

3. Grundläggande arduino -programmering, denna handledning kan vara användbar

Steg 2: Montering

hopsättning
hopsättning

Jag har bifogat fritzing -schemat i fzz -format och en bild av det för enkel visualisering av anslutningarna

1. Du måste löda 3 stift på baksidan av neopixelringen som visas på bilden

- löd den positiva stiftet

- löd marken

- löd datainmatningsstiftet

2. Då bör 4x batterihållaren ha ett sätt att ansluta till brödbrädet, en enkel lösning är att lödda två manliga duponttrådar till dess terminaler.

3. Förbered brödbrädan.

- placera neopixelringen, mikrokontrollen och gyroskopet på brödbrädan som på bilden

- placera alla negativa ledningar: till mikrokontroller, neopixelring, gyro

- placera alla positiva ledningar: till mikrokontroller, neopixelring, gyro

- placera alla datakablar:

* SDA och SCL från till mikrokontroller till gyro

* stift D6 från mikrokontrollern till neopixelringen

- kontrollera alla anslutningar innan du sätter på strömmen

- valfritt med tejp, tejpa batteripaketet på baksidan av bradboard för att hålla det på plats och göra det mer bärbart

Steg 3: Koden och kalibreringen

Först måste du ladda ner och installera två bibliotek:

1. Adafruit neopixel bibliotek för att styra neopixeln

2. MPU6050 -bibliotek för gyroskopet

3. I2CDev -bibliotekskälla

De är två fantastiska bibliotek som kommer att klara det tunga!

Mer information om neopixlarna här

Ladda sedan ner och installera mitt bibliotek härifrån eller kopiera det nedanifrån:

#inkludera "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); osignerad lång lastPrintTime = 0; bool initialisering = falsk; // set true om DMP init lyckades uint8_t mpuIntStatus; // håller den faktiska avbrottsstatusbyte från MPU uint8_t devStatus; // returstatus efter varje enhetsåtgärd (0 = framgång,! 0 = fel) uint16_t packetSize; // förväntad DMP -paketstorlek (standard är 42 byte) uint16_t fifoCount; // räkna alla byte som för närvarande finns i FIFO uint8_t fifoBuffer [64]; // FIFO lagringsbuffert Quaternion q; // [w, x, y, z] quaternion container VectorFloat gravitation; // [x, y, z] gravitation vektor float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll container och gravitation vector volatile bool mpuInterrupt = false; // anger om MPU -avbrottstappen har gått högt

void setup ()

{Serial.begin (9600); Serial.println ("Program startat"); initialisering = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = falskt; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); lämna tillbaka; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitation, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitation); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} booleskt 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); om (y 0) {lightLeds (y, z, 0, 5, 0, 89); } annars if (y <0 och z 0 och z 0 och z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {dubbel vinkel = (atan ((dubbel) abs (x) / (dubbel) abs (y)) * 4068) / 71; int ledNr = map (vinkel, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, vinkel); uint32_t färg; för (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 -anslutningen lyckades"): F ("MPU6050 -anslutningen misslyckades")); Serial.println (F ("Initierar DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP -initialisering misslyckades (kod")); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F ("Aktiverar avbrottsdetektering (Arduino externt avbrott 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP redo! Väntar på första avbrott … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}

Ladda upp koden:

Ladda upp koden till arduino med hjälp av FTDI -adaptern.

Anslut strömförsörjningen (batterier)

Kalibrering:

Det viktigaste att kalibrera här är "LED_OFFSET" konstant. I mitt exempel är 12. Du måste justera detta från 0 till 23 så att lysdioden tänds i den riktning som du lutar brädet efter att ha drivit kortet.

Om du vill veta mer om hur det fungerar, kolla in det sista steget

Steg 4: Hur det fungerar (valfritt)

Hur det fungerar (valfritt)
Hur det fungerar (valfritt)

Först lite information om gyroskopet MPU6050. Detta är ett MEMS -gyroskop (MEMS står för mikroelektromekaniska system).

Varje typ av MEM -gyroskop har någon form av oscillerande komponent varifrån ackumuleringen, och därmed riktningsändring, kan detekteras. Detta beror på att, enligt bevarandet av rörelselagen, ett vibrerande objekt gillar att fortsätta vibrera i samma plan, och alla vibrationsavvikelser kan användas för att härleda en riktningsändring.

Gyro innehåller också en egen mikrokontroller för att beräkna rullen, pitcha och gäspa genom några fina matematik.

Men gyro -rådata lider av buller och drift, så vi använde ett externt bibliotek för att jämna ut saker och ge oss ren användbar data.

Neopixel är RGB -lysdioder som är individuellt adresserbara och kedjade i band och ringar. De fungerar på 5V och de innehåller sina egna kretsar så du behöver bara driva neopixlarna och kommunicera med dem med hjälp av datalinjen. Kommunikationen sker med en enda datalinje som innehåller klocka och data (mer information här). Adafruit tillhandahåller ett rent bibliotek för att interagera med neopixelringarna.

Koden

Inne i l oop () -funktionen kallas biblioteket MPU6050_6Axis_MotionApps20. När biblioteket har ny data från gyroscpe kallar det redrawLeds (x, y, z) med 3 argument som representerar yaw, pitch och roll

Inside redrawLeds ():

- vi fokuserar på två axlar: y, z

- vi begränsar båda axlarna från -MAX_ANGLE till +MAX_ANGLE, vi definierade maxvinkel till 45 och det kan ändras

- vi delar upp 360 grader i 4 kvadranter och kallar lightLeds () -funktioner för varje enligt följande:

* y negativ, z positiv första kvadrant kommer att styra lysdioder från 0 till 5, vinkeln kommer att vara från 0 till 89

* y negativ, z negativ andra kvadrant kontroller led från 6 till 12, vinkeln kommer att vara från 89 till 0

* …etc

- inuti funktionen lightLeds

* Jag beräknar en vinkel baserad på tvåaxlarna med hjälp av arctangent (kolla bifogad bild)

* Jag räknar ut vad som ledde till att visa med hjälp av arduino -kartfunktionen

* Jag återställer LED -remsan alla utom två LED: er, den som motsvarar den LED -position som jag har beräknat tidigare och en LED -position tidigare (för att visa en blekningseffekt)

* Jag använder en funktion som heter normalizeLedPosition () för att ta hänsyn till neopixelkalibreringen. Kalibreringen är användbar eftersom neopixelringen kan roteras som den vill och bör anpassas till gyroskopet

* Jag skriver också ut dragaxeln, det led som har ljus och vinkeln

Matten

Jag har bifogat en bild med ledringen och den trigonometriska funktionen som används för att bestämma vinkeln.

Rekommenderad: