Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Gyroscoopplezier met NeoPixel Ring

Componenten en benodigdheden

SparkFun Arduino Pro Mini 328 - 5V/16MHz
× 1
Adafruit NeoPixel Ring:WS2812 5050 RGB LED
× 1
SparkFun IMU Breakout - MPU-9250
× 1
Broodplank (algemeen)
× 1
Mannelijke/Mannelijke doorverbindingsdraden
× 1
Mannelijke/Vrouwelijke doorverbindingsdraden
× 1
4 AA-batterijhouder + batterij
× 1

Over dit project

In deze zelfstudie gebruiken we de MPU6050 gyroscoop, een NeoPixel Ring en een Arduino 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 NeoPixel Ring.

Ik bouw deze tutorial vanwege de interesse die ik zag in een andere tutorial van min. In deze tutorial heb ik simpele led's vervangen door een NeoPixel Ring. De ring is eenvoudiger te gebruiken via een Adafruit-bibliotheek en is zeker spectaculairder.

Dus als je deze componenten hebt liggen, 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

2. Breadboard

3. MPU6050-gyroscoop

4. 24 NeoPixel LED-ring

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.

Hulpprogramma's:

1. USB naar seriële FTDI-adapter FT232RL om de arduino pro mini te programmeren

2. Arduino IDE

Vaardigheden:

1. Solderen

3. Basis Arduino-programmering

Stap 2:Montage

Ik heb het fritzing-schema in fzz-formaat en een afbeelding ervan bijgevoegd voor een gemakkelijke 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

Eerste je moet twee bibliotheken downloaden en installeren:

1. Adafruit neopixel-bibliotheek die de neopixel bestuurt

2. MPU6050-bibliotheek voor de gyroscoop

Het zijn twee geweldige bibliotheken die het zware werk zullen doen!

Meer details over de neopixels hier

Dan download en installeer 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 int int MAX_ANGLE =45 MAX_ANGLE 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] quaternion-container 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

void setup() { Serial.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 0) { lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 en z <0) { lightLeds(y, z, 6, 12, 89, 0); } else if (y> 0 en z <0) { lightLeds(y, z, 13, 19, 0, 89); } else if (y> 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 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 interrupt..." )); 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 inschakelen 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 volgende stap

Stap 4:Hoe het werkt (optioneel)

Eerste een beetje 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 ingewikkelde 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 afzonderlijk kunnen worden geadresseerd 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 loop() functie wordt de bibliotheek MPU6050_6Axis_MotionApps20 aangeroepen. Wanneer de bibliotheek nieuwe gegevens van de gyroscpe heeft, roept deze redrawLeds(x, y, z) aan met 3 argumenten die gieren, stampen en rollen voorstellen

Binnen rerawLeds ():

- 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

* ...enz.

- in de lightLeds functie

* ik bereken een hoek op basis van de twee assen met behulp van arctangens (bekijk de bijgevoegde afbeelding)

* ik ben aan het berekenen wat er werd getoond met behulp van de arduino-kaartfunctie

* ik reset de ledstrip op twee na, de led 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.

Code

De Arduino-code
https://github.com/danionescu0/arduino/tree/master/projects/neopixel_ring_gyroscope

Schema's

sketch_gMlSrk3rCX.fzz

Productieproces

  1. Arduino-gyroscoopspel met MPU-6050
  2. Eenvoudige wandklok met Adafruit 1/4 60 Ring Neopixel
  3. CO2-monitoring met K30-sensor
  4. Doofblinde communicatie met 1Sheeld/Arduino
  5. Arduino-gamecontroller
  6. Bedien muntvangers met Arduino
  7. Pixie:een op Arduino gebaseerd NeoPixel-polshorloge
  8. Arduino met Bluetooth om een ​​LED te bedienen!
  9. Capacitieve vingerafdruksensor met een Arduino of ESP8266
  10. Spraakherkenning en synthese met Arduino
  11. Zonnestraling meten met Arduino