Përmbajtje:

Gyroskop Argëtues me Unazën Neopixel: 4 Hapa (me Fotografi)
Gyroskop Argëtues me Unazën Neopixel: 4 Hapa (me Fotografi)

Video: Gyroskop Argëtues me Unazën Neopixel: 4 Hapa (me Fotografi)

Video: Gyroskop Argëtues me Unazën Neopixel: 4 Hapa (me Fotografi)
Video: Follow Me | Kids Songs | Super Simple Songs 2024, Nëntor
Anonim
Image
Image

Në këtë tutorial ne do të përdorim xhiroskopin MPU6050, një unazë neopixel dhe një arduino për të ndërtuar një pajisje që ndriçon dritat që korrespondojnë me këndin e pjerrësisë.

Ky është një projekt i thjeshtë dhe argëtues dhe do të mblidhet në një dërrasë buke. Nëse ndiqni hapat do të ndërtoni atë që keni parë në video. Ashtë një mësim i mirë për të mësuar rreth xhiroskopit dhe unazës neopixel.

Po e ndërtoj këtë tutorial për shkak të interesit që pashë në mësimin tim të parë këtu (Kontrolli i udhëhequr nga Xhiroskopi me Arduino). Në këtë udhëzues unë kam zëvendësuar led të thjeshtë me një unazë neopixel. Unaza është më e thjeshtë për t'u përdorur përmes një biblioteke Adafruit dhe është padyshim më spektakolare.

Pra, nëse i keni këto përbërës të shtrirë përreth, kjo është një mënyrë e shkëlqyeshme për t'i përdorur ato, do të përpiqem t'ju çoj hap pas hapi duke ndërtuar pajisjen dhe gjithashtu do t'ju shpjegoj se si funksionon në hapin e fundit.

Hapi 1: Gjërat e kërkuara

Kuvendi
Kuvendi

Pjesët

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

2. Tabela e bukës

3. Xhiroskop MPU6050 (eBay) 1.2 $

4. Unazë led 24 neopixel (Adafruit) 17 $

5. Paketë baterie 4 x AA me 4 bateri

6. Kabllo kërcyese në formë U (opsionale). Unë i kam përdorur këto kabllo kërcyes sepse duken më mirë në tabelën e bukës, dhe llambat janë më të dukshme në këtë mënyrë. Mund të gjeni një kuti prej 140 në ebay me rreth 4 $. Nëse nuk i keni këto kabllo, mund t'i zëvendësoni me tela dupont.

Mjetet:

1. Përshtatës USB serik FTDI FT232RL për të programuar arduino pro mini

2. Arduino IDE

Aftësitë: 1. Bashkim, kontrolloni këtë udhëzues

3. Programimi bazë arduino, ky tutorial mund të jetë i dobishëm

Hapi 2: Montimi

Kuvendi
Kuvendi

Unë kam bashkangjitur skemën frituese në formatin fzz dhe një fotografi të tij për vizualizim të lehtë të lidhjeve

1. Ju duhet të lidhni 3 kunja mashkullore në anën e pasme të unazës neopixel siç tregohet në figurë

- lidhni kunjin pozitiv

- lidhni tokën

- lidhni pinin e futjes së të dhënave

2. Atëherë mbajtësi i baterisë 4x duhet të ketë një mënyrë për t'u lidhur me dërrasën e bukës, një zgjidhje e lehtë është të lidhni dy tela meshkuj dupont në terminalet e tij.

3. Përgatitni tabelën e bukës.

- vendosni unazën neopixel, mikrokontrolluesin dhe xhiroskopin në tabelën e bukës si në imazh

- vendosni të gjitha telat negative: te mikrokontrolluesi, unaza neopixel, xhiro

- vendosni të gjitha telat pozitivë: te mikrokontrolluesi, unaza neopixel, xhiro

- vendosni të gjitha telat e të dhënave:

* SDA dhe SCL nga mikrokontrolluesi te xhiro

* pin D6 nga mikrokontrolluesi në unazën neopixel

- kontrolloni dy herë të gjitha lidhjet para se të ndizni energjinë

- opsionalisht duke përdorur shirit ngjitës, ngjiteni paketën e baterisë në pjesën e pasme të dërrasës për ta mbajtur atë në vend dhe për ta bërë atë më të lëvizshëm

Hapi 3: Kodi dhe Kalibrimi

Së pari ju duhet të shkarkoni dhe instaloni dy biblioteka:

1. Bredhi i bibliotekës neopixel Adafruit që kontrollon neopixelin

2. Biblioteka MPU6050 për xhiroskopin

3. Burimi i bibliotekës I2CDev

Ato janë dy biblioteka të mëdha që do të bëjnë barrën e rëndë!

Më shumë detaje mbi neopixelët këtu

Pastaj shkarkoni dhe instaloni bibliotekën time nga këtu ose kopjoni atë nga poshtë:

#përfshi "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #cakto NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Rrip Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); kohë e pa firmosur lastPrintTime = 0; inicimi i bool = false; // vendoset e vërtetë nëse DMP init ishte i suksesshëm uint8_t mpuIntStatus; // mban bajt të statusit aktual të ndërprerjes nga MPU uint8_t devStatus; // kthe statusin pas çdo operacioni të pajisjes (0 = sukses,! 0 = gabim) uint16_t packetSize; // madhësia e pritshme e paketës DMP (parazgjedhja është 42 bajt) uint16_t fifoCount; // numërimi i të gjithë byteve aktualisht në FIFO uint8_t fifoBuffer [64]; // Tampon i ruajtjes FIFO Quaternion q; // [w, x, y, z] enë kuaternion VectorFloat graviteti; // [x, y, z] vektori i gravitetit noton ypr [3]; // [yaw, pitch, roll] yaw/katran/rrotull enë dhe vektori i gravitetit bool i paqëndrueshëm mpuInterrupt = false; // tregon nëse kunja e ndërprerjes MPU ka shkuar lartë

void setup ()

{Serial.fillo (9600); Serial.println ("Programi filloi"); inicimi = fillimiGyroskopi (); strip.filloj (); } void loop () {if (! inicimi) {return; } mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); kthim; } if (mpuIntStatus & 0x02) {ndërsa (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= PaketaSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetra graviteti (& graviteti, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & graviteti); 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 = kufizim (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kufizim (y, -1 * MAX_ANGLE, MAX_ANGLE); nëse (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 dhe z 0 dhe z 0 dhe z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = hartë (këndi, ngaAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, kënd); ngjyra uint32_t; për (int i = 0; pozicioni i + LED_OFFSET) {pozicioni i kthimit + LED_OFFSET; } pozicioni i kthimit + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } Serial.print ("a ="); Serial.print (kënd); 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 = milis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Lidhja MPU6050 e suksesshme"): F ("Lidhja MPU6050 dështoi")); Serial.println (F ("Fillimi i DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Inicimi i DMP dështoi (kodi")); Serial.println (devStatus); kthimi false;} mpu.setDMPEnabled (true); Serial.println (F ("Enabling zbulimi i ndërprerjes (Ndërprerja e jashtme Arduino 0) … ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP gati! Duke pritur ndërprerjen e parë … ")); pakoSize = mpu.dmpGetFIFOPacketSize (); kthehu true;} void dmpDataReady () {mpuInterrupt = true;}

Ngarko kodin:

Duke përdorur përshtatësin FTDI ngarkoni kodin në arduino.

Lidhni furnizimin me energji elektrike (bateritë)

Kalibrimi:

Gjëja më e rëndësishme për të kalibruar këtu është konstanta "LED_OFFSET". Në shembullin tim është 12. Ju duhet ta rregulloni këtë nga 0 në 23 në mënyrë që pas fuqizimit të bordit, led të ndizet në drejtimin që e anoni bordin.

Nëse doni të mësoni më shumë detaje se si funksionon, shikoni hapin e fundit

Hapi 4: Si funksionon (opsional)

Si funksionon (opsionale)
Si funksionon (opsionale)

Së pari pak informacion në lidhje me xhiroskopin MPU6050. Ky është një xhiroskop MEMS (MEMS qëndron për sistemet Mikroelektromekanike).

Çdo lloj xhiroskopi MEM ka një formë të komponentit lëkundës nga ku mund të zbulohet akullimi, dhe kështu ndryshimi i drejtimit. Kjo ndodh sepse, sipas ruajtjes së ligjit të lëvizjes, një objekti vibrues pëlqen të vazhdojë të dridhet në të njëjtin plan, dhe çdo devijim vibracional mund të përdoret për të nxjerrë një ndryshim në drejtim.

Xhiro gjithashtu përmban një mikrokontrollues të vetin për të llogaritur rrotullimin, ngritjen dhe devijimin në disa matematikë të zbukuruar.

Por të dhënat e papërpunuara xhiro vuajnë nga zhurma dhe zhvendosja, kështu që ne përdorëm një bibliotekë të jashtme për të zbutur gjërat dhe për të na dhënë të dhëna të pastra të përdorshme.

Neopixel -et janë të udhëhequr nga RGB individualisht të adresueshëm dhe të lidhur me zinxhirë në breza dhe unaza. Ata punojnë në 5V dhe ato përmbajnë qarkun e tyre, kështu që ju duhet vetëm të fuqizoni neopixelët dhe të komunikoni me ta duke përdorur linjën e të dhënave. Komunikimi bëhet me një linjë të vetme të të dhënave që përmban orën dhe të dhënat (më shumë detaje këtu). Adafruit siguron një bibliotekë të pastër për bashkëveprimin me unazat neopixel.

Kodi

Brenda funksionit l oop () quhet biblioteka MPU6050_6Axis_MotionApps20. Kur biblioteka ka të dhëna të reja nga xhirosku i quan redrawLeds (x, y, z) me 3 argumente që përfaqësojnë yaw, pitch and roll

Brenda redrawLeds ():

- ne jemi duke u përqëndruar në dy boshte: y, z

- ne po i kufizojmë të dy akset nga -MAX_ANGLE në +MAX_ANGLE, kemi përcaktuar këndin maksimal në 45 dhe është i ndryshueshëm

- ne po ndajmë 360 degreeds në 4 kuadrate dhe thërrasim funksione lightLeds () për secilën si më poshtë:

* y kuadranti i parë negativ, z pozitiv do të kontrollojë led -et nga 0 në 5, këndi do të jetë nga 0 në 89

* y negative, z negative kontrollet e kuadrantit të dytë led nga 6 në 12, këndi do të jetë nga 89 në 0

*… Etj

- brenda funksionit lightLeds

* Unë jam duke llogaritur një kënd të bazuar në dy boshte duke përdorur arktangent (kontrolloni figurën e bashkangjitur)

* Unë jam duke llogaritur atë që çoi në shfaqje duke përdorur funksionin e hartës arduino

* Unë po rivendos shiritin led të gjithë, përveç dy led, atë që korrespondon me pozicionin led që kam llogaritur më parë dhe një pozicion led më parë (për të treguar një efekt zbehje)

* Unë jam duke përdorur një funksion të quajtur normalizeLedPosition () për të marrë parasysh kalibrimin e neopixelit. Kalibrimi është i dobishëm sepse unaza neopixel mund të rrotullohet sipas dëshirës dhe duhet të rreshtohet me xhiroskopin

* Unë jam gjithashtu duke shtypur boshtin tërheqës, ajo që led ka dritë dhe kënd

Matematika

Unë kam bashkangjitur një fotografi me unazën led dhe funksionin trigonometrik të përdorur për të përcaktuar këndin.

Recommended: