Агуулгын хүснэгт:
- Алхам 1: Шаардлагатай зүйл
- Алхам 2: угсрах
- Алхам 3: Код ба шалгалт тохируулга
- Алхам 4: Энэ нь хэрхэн ажилладаг (заавал биш)
Видео: Неопиксел бөгжтэй гироскоп хөгжилтэй: 4 алхам (зурагтай)
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:02
Энэхүү гарын авлагад бид MPU6050 гироскоп, неопикселийн цагираг, ардуино ашиглан налуу өнцөгт харгалзах гэрлийг асаах төхөөрөмжийг бүтээх болно.
Энэ бол энгийн бөгөөд хөгжилтэй төсөл бөгөөд үүнийг талхны самбар дээр угсрах болно. Хэрэв та алхамуудыг дагаж мөрдвөл видеон дээр харсан зүйлээ бүтээх болно. Энэ бол гироскоп ба неопикселийн бөгжний талаар сурахад тохиромжтой сайн хичээл юм.
Би энд анхны зааварчилгаагаа (Gyroscope Led Control With Arduino) сонирхож үзсэнийхээ ачаар энэхүү гарын авлагыг бүтээж байна. Энэхүү зааварчилгааны дагуу би энгийн ледүүдийг неопикселийн бөгжөөр сольсон. Бөгжийг Adafruit номын сангаар ашиглах нь илүү энгийн бөгөөд илүү гайхалтай.
Хэрэв танд эдгээр бүрэлдэхүүн хэсгүүд байгаа бол тэдгээрийг ашиглах гайхалтай арга бол би төхөөрөмжийг бүтээх ажлыг алхам алхамаар хийж, сүүлийн шатанд хэрхэн ажилладаг талаар тайлбарлахыг хичээх болно.
Алхам 1: Шаардлагатай зүйл
Эд анги
1. Arduino pro mini 328p (eBay) 2 $
2. Талхны самбар
3. MPU6050 гироскоп (eBay) 1.2 $
4. 24 неопикселийн LED бөгж (Adafruit) 17 $
5. 4 батерейтай 4 x АА батерейны багц
6. U хэлбэрийн холбогч кабель (заавал биш). Би эдгээр холбогч кабелийг талхны самбар дээр илүү сайн хардаг тул ледүүд ийм байдлаар илүү тод харагддаг тул ашигладаг байсан. Та 140 хайрцагийг ebay дээрээс ойролцоогоор 4 доллараар олох боломжтой. Хэрэв танд эдгээр кабель байхгүй бол тэдгээрийг дюпон утсаар сольж болно.
Хэрэгсэл:
1. Arduino pro mini -ийг програмчлах USB FTDI адаптер FT232RL
2. Arduino IDE
Ур чадвар: 1. Гагнах, энэ хичээлийг үзнэ үү
3. Үндсэн arduino програмчлал, энэ заавар нь ашигтай байж магадгүй юм
Алхам 2: угсрах
Холболтыг хялбархан дүрслэхийн тулд би frzzing схемийг fzz форматаар зурж хавсаргав
1. Зурган дээрх шиг неопикселийн бөгжний ард 3 эрэгтэй тээглүүр гагнах хэрэгтэй
- эерэг зүүг гагнах
- газар гагнах
- өгөгдөл оруулах зүүг гагнах
2. Дараа нь 4х батерейны эзэмшигч нь талхны самбартай холбогдох арга замтай байх ёстой, хялбар шийдэл бол хоёр эрэгтэй дюпон утсыг терминалдаа гагнах явдал юм.
3. Талхны хавтанг бэлтгэ.
- Зурган дээрх шиг неопикселийн цагираг, микроконтроллер, гироскопыг талхны тавцан дээр байрлуул
- бүх сөрөг утсыг байрлуул: микроконтроллер, неопиксел цагираг, гиро
- бүх эерэг утсыг байрлуул: микроконтроллер, неопиксел цагираг, гиро
- бүх өгөгдлийн утсыг байрлуул:
* SDA ба SCL нь микроконтроллероос гиро хүртэл
* D6 зүү микроконтроллероос неопикселийн цагираг руу
- Цахилгаан асаахаасаа өмнө бүх холболтыг дахин шалгана уу
- Нэмэлт байдлаар наалдамхай тууз ашиглан батерейны хайрцгийг туузан дээр байрлуулж, илүү зөөврийн болгоно.
Алхам 3: Код ба шалгалт тохируулга
Эхлээд та хоёр номын санг татаж аваад суулгах хэрэгтэй.
1. Adafruit неопикселийн номын сан неопикселийг хянадаг
2. Гироскопын MPU6050 номын сан
3. I2CDev номын сангийн эх сурвалж
Тэд хүнд ачаа өргөх хоёр гайхалтай номын сан юм!
Неопикселийн талаарх дэлгэрэнгүй мэдээллийг эндээс үзнэ үү
Дараа нь миний номын санг эндээс татаж суулгаарай эсвэл доороос хуулна уу.
#"I2Cdev.h" оруулах
#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #NEOPIXED_CONTROL_PIN 6 -ийг тодорхойлох #NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 мегапиксел; Adafruit_NeoPixel зурвас = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); гарын үсэг зураагүй long lastPrintTime = 0; bool эхлүүлэх = худал; // DMP init амжилттай болсон бол үнэн гэж тохируулах uint8_t mpuIntStatus; // MPU uint8_t devStatus -ийн бодит тасалдлын статусын байтыг агуулдаг; // төхөөрөмжийн үйлдэл бүрийн дараа статусыг буцаана (0 = амжилт,! 0 = алдаа) uint16_t packetSize; // хүлээгдэж буй DMP пакетийн хэмжээ (анхдагч нь 42 байт) uint16_t fifoCount; // одоо FIFO -д байгаа бүх байтын тоо uint8_t fifoBuffer [64]; // FIFO хадгалах буфер Quaternion q; // [w, x, y, z] quaternion контейнер VectorFloat таталцал; // [x, y, z] таталцлын вектор float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll контейнер ба хүндийн хүчний вектор дэгдэмхий bool mpuInterrupt = false; // нь MPU тасалдлын зүү өндөр болсон эсэхийг заана
хүчингүй тохиргоо ()
{Serial.begin (9600); Serial.println ("Хөтөлбөр эхэлсэн"); эхлүүлэх = эхлүүлэхGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = худал; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); if (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); буцах; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& таталцал, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} логик hasFifoOverflown (int mpuIntStatus, int fifoCount) {буцах mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = хязгаарлах (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } if if (y <0 and z 0 and z 0 and z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {давхар өнцөг = (атан ((давхар) abs (x) / (давхар) abs (y)) * 4068) / 71; int ledNr = газрын зураг (өнцөг, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, өнцөг); uint32_t өнгө; for (int i = 0; i байрлал + LED_OFFSET) {буцах байрлал + LED_OFFSET; } буцах байрлал + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {буцах; } Serial.print ("a ="); Serial.print (өнцөг); 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 холболт амжилттай"): F ("MPU6050 холболт амжилтгүй болсон")); Serial.println (F ("DMP -ийг эхлүүлж байна …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code"))); Serial.println (devStatus); false return;} mpu.setDMPEnabled (true); Serial.println (F ("Идэвхжүүлэх тасалдал илрүүлэх (Arduino гадаад тасалдал 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP бэлэн! Эхний тасалдлыг хүлээж байна … ")); packetSize = mpu.dmpGetFIFOPacketSize (); үнэнийг буцаах;} void dmpDataReady () {mpuInterrupt = үнэн;}
Кодыг байршуулах:
FTDI адаптерийг ашиглан кодыг arduino руу байршуулна уу.
Цахилгаан хангамжийг холбоно уу (батерей)
Тохируулгын:
Энд тохируулах хамгийн чухал зүйл бол "LED_OFFSET" тогтмол юм. Миний жишээнд бол 12. Та үүнийг 0 -ээс 23 болгож тохируулах хэрэгтэй бөгөөд ингэснээр самбарыг асаасны дараа самбар нь таны хазайлгах чиглэлд гэрэл асах болно.
Хэрэв та хэрхэн ажилладаг талаар илүү дэлгэрэнгүй мэдээлэл авахыг хүсвэл сүүлийн алхамыг үзээрэй
Алхам 4: Энэ нь хэрхэн ажилладаг (заавал биш)
Эхлээд MPU6050 гироскопын тухай багахан мэдээлэл. Энэ бол MEMS гироскоп (MEMS нь микроэлектромеханик системийг хэлдэг).
MEMs гироскопын төрөл бүр нь ямар нэг хэлбэрийн хэлбэлзэлтэй бүрэлдэхүүн хэсгүүдтэй байдаг тул тэндээс хавирга, улмаар чиглэл өөрчлөгдөхийг илрүүлдэг. Учир нь хөдөлгөөний хуулийг сахин хамгаалахын дагуу чичиргээт объект нэг хавтгайд үргэлжлүүлэн чичиргээ хийх дуртай байдаг бөгөөд чиглэлийг өөрчлөхийн тулд ямар ч чичиргээний хазайлтыг ашиглаж болно.
Гиро нь хэд хэдэн сонирхолтой математикуудаар өнхрөх, давирхай, эргэлтийг тооцоолох өөрийн микроконтроллерийг агуулдаг.
Гэхдээ гиро түүхий өгөгдөл нь чимээ шуугиан, дрифтээс болж зовж шаналж байдаг тул бид гадны номын санг ашиглан аливаа зүйлийг жигдрүүлж, бидэнд цэвэр өгөгдөл өгдөг.
Neopixel бол RGB LED -ийг тус тусад нь авч үзэх боломжтой бөгөөд хамтлаг, цагираг хэлбэрээр гинжлэгдсэн байдаг. Тэд 5V дээр ажилладаг бөгөөд тэдгээр нь өөрийн гэсэн хэлхээг агуулдаг тул та зөвхөн неопикселийг асааж, өгөгдлийн шугам ашиглан тэдэнтэй холбоо барих хэрэгтэй. Харилцаа нь цаг, өгөгдөл агуулсан нэг мэдээллийн шугамаар хийгддэг (дэлгэрэнгүй мэдээллийг эндээс үзнэ үү). Adafruit нь неопикселийн цагиргуудтай харьцах цэвэр номын сантай.
Код
L oop () функц дотор MPU6050_6Axis_MotionApps20 номын санг дууддаг. Номын санд gyroscpe -аас шинэ өгөгдөл ирэхэд redrawLeds (x, y, z) гэж нэрлэнэ.
Дотор нь redrawLeds ():
- Бид хоёр тэнхлэг дээр анхаарлаа төвлөрүүлж байна: y, z
- Бид хоёр тэнхлэгийг -MAX_ANGLE -аас +MAX_ANGLE хүртэл хязгаарлаж, хамгийн их өнцгийг 45 болгож тодорхойлсон бөгөөд үүнийг өөрчлөх боломжтой
- Бид 360 градусыг 4 квадрат болгон хувааж, lightLeds () функцүүдийг дараах байдлаар дууддаг.
* y сөрөг, z эерэг эхний квадрат нь LED -ийг 0 -ээс 5 хүртэл, өнцөг нь 0 -ээс 89 хүртэл байх болно
* y сөрөг, z сөрөг хоёр дахь квадрантын хяналт нь 6 -аас 12 хүртэл, өнцөг нь 89 -аас 0 хүртэл байх болно
* … гэх мэт
- lightLeds функц дотор
* Би хоёр тэнхлэгт тулгуурласан өнцгийг арктенгент ашиглан тооцоолж байна (хавсаргасан зургийг шалгана уу)
* Би arduino газрын зургийн функцийг ашиглан юу харуулсаныг тооцоолж байна
* Би хоёр зурвасаас бусад бүх л LED зурвасыг анхны байдалд нь оруулж байна.
* Би неопикселийн шалгалт тохируулгыг харгалзан үзэхийн тулд normalizeLedPosition () нэртэй функцийг ашиглаж байна. Калибровк хийх нь ашигтай, учир нь неопикселийн цагиргийг хүссэнээрээ эргүүлэх боломжтой бөгөөд гироскоптой зэрэгцүүлэх ёстой.
* Би бас чирэх тэнхлэгийг хэвлэж байна, ямар гэрэл нь гэрэл, өнцөгтэй байна
Математик
Би өнцгийг тодорхойлоход ашигладаг цагираг, тригонометрийн функц бүхий зургийг хавсаргав.
Зөвлөмж болгож буй:
Хөгжилтэй роботыг дахин хийх: 10 алхам (зурагтай)
Хөөрхөн хуучин роботыг дахин хий: Олон зан чанартай, хөгжилтэй робот Арлантай танилцана уу. Тэрээр 5 -р ангийн байгалийн ухааны ангид амьдардаг. Би түүнийг сургуулийн робот техникийн багийн сахиус болгож дахин бүтээсэн, тэр бас ангийн туслах юм. Хүүхдүүд технологийн үйл ажиллагааг харах дуртай бөгөөд Арлан алхаж байна
Неопиксел ашигладаг LED цаг: 4 алхам (зурагтай)
Неопиксел ашиглан LED цаг: LED цагийг 60 неопиксел ашиглан хэрхэн яаж хийх талаар миний зааварчилгаанд тавтай морилно уу. Та 3 PDF хавсаргасан нэгийг цагны сегментэд, нөгөөг нь сууринд, хамгийн сүүлд нэгийг нь наахад туслах загварыг олох болно. хэсгүүд хамтдаа. Тиймээс ком
Бөмбөлөгт сэрүүлэгтэй цаг нь сэрэхийг хөгжилтэй болгодог (7 алхам) (зурагтай)
Бөмбөлөг сэрүүлэгтэй цаг нь сэрэхийг хөгжилтэй болгодог (дуу чимээтэй) Би нар гарахаас өмнө сэрэх дургүй (эсвэл олон цаг гадаа байсан) хүмүүсийн нэг. Тиймээс орондоо хөөсөнцөр үдэшлэг хийхээс илүү сэрэх нь хөгжилтэй байх ямар сайн арга вэ! Arduino болон
OLED дэлгэц ба Arduino ашиглан хөгжилтэй: 12 алхам (зурагтай)
OLED Display болон Arduino -той хөгжилтэй: Та OLED дэлгэцийн технологийн талаар сонссон гэдэгт итгэлтэй байна. Энэ нь харьцангуй шинэ бөгөөд хуучин LCD технологиос илүү сайн чанарыг санал болгодог. Энэхүү гарын авлагад бид хамгийн нийтлэг ганц нэг компанийн өгөгдлийг харуулахад шаардлагатай алхмуудыг авч үзэхийг хүсч байна
Неопиксел ашигладаг хоёртын цаг: 6 алхам (зурагтай)
Неопиксел ашигладаг хоёртын цаг: Сайн байна уу хүмүүс ээ, би LED -тэй холбоотой бүх зүйлд дуртай бөгөөд тэдгээрийг өөр өөр хэлбэрээр ашиглах дуртай. Тиймээ, би хоёртын цагийг энд хэд хэдэн удаа хийснийг мэддэг бөгөөд тус бүр нь хэрхэн яаж хийхийг харуулсан гайхалтай жишээ юм. Өөрийнхөө цагийг бүтээгээрэй, би үнэхээр дуртай