Sisukord:
- Samm: vajalikud asjad
- 2. samm: kokkupanek
- 3. samm: kood ja kalibreerimine
- 4. toiming: kuidas see toimib (valikuline)
Video: Güroskoobi lõbus koos neopikselrõngaga: 4 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:47
Selles õpetuses kasutame MPU6050 güroskoopi, neopikselrõngast ja arduinot, et ehitada seade, mis süttib ledidele vastavalt kaldenurgale.
See on lihtne ja lõbus projekt ning see pannakse kokku leivalauale. Kui järgite juhiseid, loote videost nähtava. See on hea õpetus güroskoobi ja neopikselrõnga tundmaõppimiseks.
Ma koostan seda õpetust huvi pärast, mida nägin oma esimese juhendatava siin (güroskoop LED -juhtimine koos Arduinoga). Selles juhendis olen asendanud lihtsad LED -id neopikselrõngaga. Sõrmust on lihtsam kasutada Adafruit'i raamatukogu kaudu ja see on kindlasti suurejoonelisem.
Nii et kui teil on need komponendid ümberringi, on see suurepärane võimalus neid kasutada, proovin teid samm -sammult seadme ehitamisel läbi viia ja selgitan ka selle toimimist.
Samm: vajalikud asjad
Osad
1. Arduino pro mini 328p (eBay) 2 dollarit
2. Leivalaud
3. MPU6050 güroskoop (eBay) 1,2 $
4. 24 neopixel led ring (Adafruit) 17 $
5. 4 x AA patareipakk 4 patareiga
6. U-kujulised hüppajakaablid (valikuline). Olen kasutanud neid hüppajakaableid, sest need näevad leivaplaadil paremad välja ja ledid on sel viisil paremini nähtavad. Karbi 140 leiate eBayst hinnaga umbes 4 dollarit. Kui teil neid kaableid pole, saate need asendada dupontjuhtmetega.
Tööriistad:
1. USB -seeria FTDI -adapter FT232RL arduino pro mini programmeerimiseks
2. Arduino IDE
Oskused: 1. Jootmine, vaadake seda õpetust
3. Põhiline arduino programmeerimine, see õpetus võib olla kasulik
2. samm: kokkupanek
Ühenduste hõlpsaks visualiseerimiseks olen lisanud frizzing -skeemi fzz -vormingus ja selle pildi
1. Neopikselrõnga tagaküljel peate jootma 3 isast tihvti, nagu pildil näidatud
- jootke positiivne tihvt
- maapinda jootma
- jootma andmete sisestamise tihvti
2. Siis peaks 4x patareipesa olema ühendatud leivaplaadiga. Lihtne lahendus on joota kaks isast dupontjuhet selle klemmide külge.
3. Valmistage leivaplaat ette.
- asetage neopikselrõngas, mikrokontroller ja güroskoop leivaplaadile nagu pildil
- asetage kõik negatiivsed juhtmed: mikrokontrollerile, neopikselrõngale, güroskoopile
- asetage kõik positiivsed juhtmed: mikrokontrollerile, neopikselrõngale, güroskoopile
- asetage kõik andmekaablid:
* SDA ja SCL mikrokontrollerist güroskoopini
* tihvt D6 mikrokontrollerist neopikselrõngani
- kontrollige enne ühendamist kõik ühendused üle
- valikuliselt kleeplindi abil kleepige aku bradboardi tagaküljele, et see paigal püsiks ja oleks kaasaskantavam
3. samm: kood ja kalibreerimine
Kõigepealt peate alla laadima ja installima kaks raamatukogu:
1. Adafruit neopikselite raamatukogu kuusk, mis kontrollib neopikseli
2. MPU6050 raamatukogu güroskoobi jaoks
3. I2CDevi raamatukogu allikas
Need on kaks suurepärast raamatukogu, mis teevad raskusi!
Lisateavet neopikslite kohta leiate siit
Seejärel laadige alla ja installige minu kogu siit või kopeerige see altpoolt:
#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; MPU6050 mpu; Adafruit_NeoPixel riba = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); allkirjastamata pikk lastPrintTime = 0; booli initsialiseerimine = vale; // seada tõeseks, kui DMP init õnnestus uint8_t mpuIntStatus; // omab tegelikku katkestuse oleku baiti MPU -st uint8_t devStatus; // tagastab oleku pärast iga seadme toimingut (0 = õnnestumine,! 0 = viga) uint16_t packetSize; // eeldatav DMP paketi suurus (vaikimisi on 42 baiti) uint16_t fifoCount; // kõigi baitide arv praegu FIFO -s uint8_t fifoBuffer [64]; // FIFO salvestuspuhver Quaternion q; // [w, x, y, z] kvaternionikonteiner VectorFloat gravity; // [x, y, z] gravitatsioonivektori ujuk ypr [3]; // [kaldumine, kaldenurk, veeremine] yaw/pitch/roll konteiner ja gravitatsioonivektor lenduv bool mpuInterrupt = false; // näitab, kas MPU katkestusnõel on kõrgele tõusnud
tühine seadistus ()
{Serial.begin (9600); Serial.println ("Programm käivitati"); initsialiseerimine = initializeGyroscope (); riba.algus (); } void loop () {if (! initialization) {return; } mpuInterrupt = vale; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); tagasipöördumine; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravitatsioon, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravitatsioon); 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 = piirata (x, -1 * MAX_ANGLE, MAX_ANGLE); y = piirata (y, -1 * MAX_ANGLE, MAX_ANGLE); kui (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 ja z 0 ning z 0 ja 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 = kaart (nurk, nurgast, nurgast, nurgani, alatesLedPosition, toLedPosition); printDebug (x, y, ledNr, nurk); uint32_t värv; jaoks (int i = 0; i asend + LED_OFFSET) {tagasipöördumisasend + LED_OFFSET; } tagasipöördumisasend + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int nurk) {if (millis () - lastPrintTime <500) {return; } Seeria.print ("a ="); Serial.print (nurk); 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 ühendus õnnestus"): F ("MPU6050 ühendus nurjus")); Serial.println (F ("DMP initsialiseerimine …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP initsialiseerimine ebaõnnestus (kood))); Serial.println (devStatus); return false;} mpu.setDMPEnabled (true); Serial.println (F (" Lubamine katkestuse tuvastamine (Arduino väline katkestus 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP valmis! Ootab esimest katkestust … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} void dmpDataReady () {mpuInterrupt = true;}
Laadige kood üles:
FTDI -adapteri abil laadige kood üles arduino.
Ühendage toide (patareid)
Kalibreerimine:
Siin on kõige olulisem kalibreerida konstant "LED_OFFSET". Minu näites on 12. Peate seda reguleerima vahemikus 0 kuni 23, nii et pärast plaadi sisselülitamist süttib LED selles suunas, kuhu te plaati kallutate.
Kui soovite selle toimimise kohta rohkem teada saada, vaadake viimast sammu
4. toiming: kuidas see toimib (valikuline)
Kõigepealt natuke teavet güroskoobi MPU6050 kohta. See on MEMS -güroskoop (MEMS tähistab mikroelektromehaanilisi süsteeme).
Igat tüüpi MEM -güroskoopidel on mingisugune võnkuv komponent, kust saab tuvastada kogunemist ja seega ka suunamuutust. Seda seetõttu, et liikumisseaduse kohaselt meeldib vibreerivale objektile vibreerida samal tasapinnal ja suvalise vibratsiooni kõrvalekaldeid saab kasutada suuna muutmiseks.
Güroskoop sisaldab ka oma mikrokontrollerit, et arvutada rull, samm ja nihkumine mõne väljamõeldud matemaatika abil.
Kuid güroskoopi algandmed kannatavad müra ja triivi tõttu, nii et me kasutasime välist raamatukogu, et asju tasandada ja anda meile puhtaid kasutatavaid andmeid.
Neopixelid on RGB -valgusdioodid, mis on individuaalselt adresseeritavad ja lintideks ja rõngasteks aheldatud. Nad töötavad 5 V toitel ja sisaldavad oma vooluringi, nii et teil on vaja ainult neopiksleid toita ja nendega andmeliinil suhelda. Suhtlemine toimub ühe andmeliini abil, mis sisaldab kella ja andmeid (täpsemalt siit). Adafruit pakub puhast raamatukogu neopikseli rõngastega suhtlemiseks.
Kood
Funktsiooni l oop () sees kutsutakse teek MPU6050_6Axis_MotionApps20. Kui teegil on güroskoopilt uusi andmeid, kutsub ta redrawLeds (x, y, z) koos kolme argumendiga, mis tähistavad pöördumist, sammu ja pööret
RedsideLeds () sees:
- keskendume kahele teljele: y, z
- piirame mõlemat telge vahemikust -MAX_ANGLE kuni +MAX_ANGLE, määrasime maksimaalse nurga 45 -ni ja seda saab muuta
- jagame 360 astet neljaks kvadrandiks ja kutsume kummagi funktsiooni LightLeds () järgmiselt:
* y negatiivne, z positiivne esimene kvadrant juhib LED -e 0 kuni 5, nurk on 0 kuni 89
* y negatiivne, z negatiivne teise kvadrandi juhtimine viis 6 -lt 12 -le, nurk on 89 kuni 0
* …jne
- funktsiooni lightLeds sees
* arvutan nurga kahe telje alusel, kasutades arktangenti (kontrollige lisatud pilti)
* Arvutan arduino kaardifunktsiooni abil, mis näitas
* lähtestan LED -riba kõik, välja arvatud kaks, üks, mis vastab juhitud positsioonile, mille olen varem arvutanud, ja juhtpositsioon enne (tuhmumise efekti näitamiseks)
* kasutan neopikseli kalibreerimise arvestamiseks funktsiooni normalizeLedPosition (). Kalibreerimine on kasulik, kuna neopikselrõngast saab meelepäraselt pöörata ja see tuleks joondada güroskoobiga
* prindin ka pukseerimistelge, mis ledil on valgus ja nurk
Matemaatika
Lisasin pildi LED -rõnga ja nurga määramiseks kasutatud trigonomeetrilise funktsiooniga.
Soovitan:
Güroskoobi platvorm/ kaamera kimp: 5 sammu (koos piltidega)
Güroskoobi platvorm/ kaamera Gimbal: see juhend on loodud Lõuna -Florida ülikooli Makecourse'i projektinõude täitmiseks (www.makecourse.com)
Lõbus mikro: natuke robot - lihtne ja odav !: 17 sammu (koos piltidega)
Fun Micro: bit Robot - LIHTNE ja odav !: BBC micro: bitid on suurepärased! Neid on lihtne programmeerida, need on täis selliseid funktsioone nagu Bluetooth ja kiirendusmõõtur ning need on odavad. Kas poleks tore, kui saaksime ehitada robotauto, mis maksab MITTE MIDAGI? See projekt on inspireeritud
Arduino Nano ja Visuino: teisendage kiirendus kiirendusmõõturi ja güroskoobi MPU6050 I2C anduri nurgaks: 8 sammu (piltidega)
Arduino Nano ja Visuino: teisendage kiirendus kiirendusnurgaks kiirendusmõõturilt ja güroskoobilt MPU6050 I2C andur: mõni aeg tagasi postitasin õpetuse selle kohta, kuidas saate MPU9250 kiirendusmõõturi, güroskoobi ja kompassianduri ühendada Arduino Nanoga ja programmeerida selle Visuinoga, et saata pakettandmeid ja kuvada see ulatus ja visuaalsed instrumendid. Kiirendusmõõtur saadab X, Y
Arduino Nano: kiirendusmõõturi güroskoobi kompass MPU9250 I2C andur koos Visuinoga: 11 sammu
Arduino Nano: kiirendusmõõturi güroskoobi kompass MPU9250 I2C sensor Visuinoga: MPU9250 on üks kõige arenenumaid kombineeritud kiirendusmõõturi, güroskoobi ja kompassi andureid, mis praegu saadaval on. Neil on palju täiustatud funktsioone, sealhulgas madalpääsfiltreerimine, liikumistuvastus ja isegi programmeeritav spetsialiseeritud protsessor
Lõbus koos partii CMD -ga !!: 3 sammu
Lõbutsege partii CMD -ga !!: Selles juhendis õpetan teile algajatele (kui te pole professionaal, kes ei peaks selleks aega raiskama) midagi partii ja lihtsate käskude kohta, mis võivad teie arvutis natuke aega veeta parem kui raisata seda mõnele asjale