Innehållsförteckning:
- Steg 1: Saker som krävs
- Steg 2: Montering
- Steg 3: Koden och kalibreringen
- Steg 4: Hur det fungerar (valfritt)
Video: Gyroskop kul med Neopixelring: 4 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:41
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
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
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)
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:
Överföringsinlärning med NVIDIA JetBot - kul med trafikkoner: 6 steg
Överföringsinlärning med NVIDIA JetBot-kul med trafikkoner: Lär din robot att hitta en väg i en labyrint av trafikkoner med hjälp av kameran och den senaste djupinlärningsmodellen
Kul med OLED -skärm och Arduino: 12 steg (med bilder)
Kul med OLED -skärm och Arduino: Jag är ganska säker på att du definitivt har hört talas om OLED -displayteknik. Det är relativt nytt och erbjuder en bättre kvalitet än gammal LCD -teknik. I den här självstudien vill vi granska stegen som krävs för att visa data på en av de vanligaste enskilda sam
Sexsidig PCB LED -tärning med WIFI och gyroskop - PIKOCUBE: 7 steg (med bilder)
Sexsidiga PCB LED -tärningar med WIFI och gyroskop - PIKOCUBE: Hej beslutsfattare, det är maker moekoe! Idag vill jag visa dig hur man bygger en riktig LED -tärning baserad på sex kretskort och 54 lysdioder totalt. Bredvid sin inre gyroskopiska sensor som kan upptäcka rörelser och tärningsläge, kommer kuben med en ESP8285-01F som är
Gyroskop LED -kontroll med Arduino: 5 steg
Gyroskop Led -styrning med Arduino: I det här projektet kommer jag att visa dig hur du bygger en enkel 4 -ledig lutningsdimmer med ett gyroskop och en arduino uno. Det finns 4 lysdioder arrangerade i en "+" formen och de kommer att lysa mer när du lutar brödbrädan. Detta kommer inte att innebära någon lödning
Arduino Nano och Visuino: Konvertera acceleration till vinkel från accelerometer och gyroskop MPU6050 I2C -sensor: 8 steg (med bilder)
Arduino Nano och Visuino: Konvertera acceleration till vinkel från accelerometer och gyroskop MPU6050 I2C -sensor: För ett tag sedan lade jag upp en handledning om hur du kan ansluta MPU9250 Accelerometer, Gyroscope och kompassensor till Arduino Nano och programmera den med Visuino för att skicka paketdata och visa den på ett omfång och visuella instrument. Accelerometern skickar X, Y,