Мазмуну:
- 1 -кадам: Керектүү нерселер
- 2 -кадам: Ассамблея
- 3 -кадам: Код жана калибрлөө
- 4 -кадам: Бул кантип иштейт (милдеттүү эмес)
Video: Гироскоп Неопиксель шакеги менен көңүлдүү: 4 кадам (сүрөттөр менен)
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:39
Бул үйрөткүчтө биз MPU6050 гироскопун, неопикселдүү шакекти жана ардуинону ийилүү бурчуна туура келген LEDлерди күйгүзүүчү түзмөктү куруу үчүн колдонобуз.
Бул жөнөкөй жана кызыктуу долбоор жана ал нан тактасына чогултулат. Эгер кадамдарды аткарсаңыз, видеодо көргөнүңүздү курасыз. Бул гироскопту жана неопикселдик шакекти үйрөнүү үчүн жакшы окуу куралы.
Мен бул окуу куралын бул жерде биринчи көрсөтмөмө болгон кызыгуумдан улам куруп жатам (Gyroscope Led Control with Arduino). Бул көрсөтмөдө мен жөнөкөй ледтерди неопикселдүү шакек менен алмаштырдым. Шакекти Adafruit китепканасы аркылуу колдонуу оңой жана ал укмуштуудай.
Демек, эгерде сизде бул компоненттер бар болсо, анда аларды колдонуунун эң сонун жолу, мен сизди аппаратты куруу аркылуу этап -этабы менен алып барууга жана анын акыркы этапта кантип иштээрин түшүндүрүүгө аракет кылам.
1 -кадам: Керектүү нерселер
Бөлүктөр
1. Arduino pro mini 328p (eBay) 2 $
2. Breadboard
3. MPU6050 гироскопу (eBay) 1.2 $
4. 24 неопикселдүү шакек (Adafruit) 17 $
5. 4 батарейка менен 4 х АА батарейка
6. U формасындагы секирүүчү кабелдер (милдеттүү эмес). Мен бул секирүүчү кабелдерди колдондум, анткени алар нан тактасында жакшыраак көрүнөт, жана леддер ушундай көрүнөт. Сиз ebayден 140 кутучаны 4 долларга жакын таба аласыз. Эгерде сизде бул кабелдер жок болсо, анда аларды дюпонт зымдарга алмаштырсаңыз болот.
Куралдар:
1. USB сериялык FTDI адаптерине FT232RL arduino pro mini программасы үчүн
2. Arduino IDE
Көндүмдөр: 1. Soldering, бул окуу куралын текшериңиз
3. Негизги arduino программалоо, бул окуу куралы пайдалуу болушу мүмкүн
2 -кадам: Ассамблея
Мен байланыштарды оңой көрүү үчүн 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" #define NEOPIXED_CONTROL_PIN 6 #define 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); unsigned long lastPrintTime = 0; bool initialization = false; // эгер 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] төрттүк контейнери VectorFloat гравитациясы; // [x, y, z] гравитациялык вектор float ypr [3]; // [yaw, pitch, roll] yaw/pitch/roll контейнери жана тартылуу вектору туруксуз бол mpuInterrupt = false; // MPU үзгүлтүк пининин жогору болгонун көрсөтөт
жараксыз орнотуу ()
{Serial.begin (9600); Serial.println ("Программа башталды"); инициализация = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = false; 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) {return mpuIntStatus & 0x10 || fifoCount == 1024; } void redrawLeds (int x, int y, int z) {x = чектөө (x, -1 * MAX_ANGLE, MAX_ANGLE); y = чектөө (y, -1 * MAX_ANGLE, MAX_ANGLE); if (y 0) {lightLeds (y, z, 0, 5, 0, 89); } else if (y <0 жана z 0 жана z 0 жана z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} void lightLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {кош бурч = (атан ((кош) абс (x) / (кош) абс (у)) * 4068) / 71; int ledNr = карта (бурч, FromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, бурч); uint32_t түсү; үчүн (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) {return; } 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 = миллис (); } 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 false;} 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 = true;}
Кодду жүктөө:
FTDI адаптерин колдонуп кодду arduinoго жүктөңүз.
Электр энергиясын туташтыруу (батареялар)
Калибрлөө:
Бул жерде эң маанилүү нерсе - "LED_OFFSET" константасы. Менин мисалымда 12. Сиз муну 0дөн 23кө чейин тууралашыңыз керек, андыктан бортту күйгүзгөндөн кийин, дисктин багытын кыйшайтып күйгүзүңүз.
Эгер сиз анын кантип иштээри жөнүндө көбүрөөк билгиңиз келсе, акыркы кадамды карап көрүңүз
4 -кадам: Бул кантип иштейт (милдеттүү эмес)
Биринчиден, MPU6050 гироскопу жөнүндө бир аз маалымат. Бул MEMS гироскопу (MEMS микроэлектромеханикалык системаларды билдирет).
MEMs гироскопунун ар бир түрү термелүүчү компоненттин кандайдыр бир түрүнө ээ, бул жерден акклерацияны, демек, багытынын өзгөрүүсүн аныктоого болот. Себеби, кыймыл мыйзамынын сакталышына ылайык, дирилдеген объект ошол эле тегиздикте термелүүнү улантууну жакшы көрөт жана кандайдыр бир вибрациялык четтөө багытты өзгөртүү үчүн колдонулушу мүмкүн.
Гиродо ошондой эле кээ бир фантастикалык математика аркылуу түрмөктү, кадамды жана ийүүнү эсептөөчү микроконтроллер бар.
Бирок гиро чийки маалыматтар ызы -чуудан жана дрейфтен жапа чегет, ошондуктан биз тышкы китепкананы колдонуп, нерселерди жөнгө салдык жана бизге таза маалыматтарды бердик.
Neopixel - бул RGB диоддору, алар даректерге жана шакектерге байланган. Алар 5Vде иштешет жана аларда схемалар бар, андыктан неопикселдерди иштетүү жана алар менен маалымат линиясын колдонуу менен байланышуу керек. Байланыш саат жана маалыматтарды камтыган бирдиктүү маалымат линиясы менен жүргүзүлөт (кененирээк маалымат бул жерде). Adafruit неопикселдүү шакектер менен иштөө үчүн таза китепкананы камсыз кылат.
Коду
L oop () функциясынын ичинде MPU6050_6Axis_MotionApps20 китепканасы деп аталат. Китепкана gyroscpeден жаңы маалыматтарды алганда, yraw, pitch жана roll түрүндөгү 3 аргумент менен redrawLeds (x, y, z) деп аталат.
RedrawLeds ичинде ():
- Биз эки огуна басым жасайбыз: y, z
- Биз эки axysди -MAX_ANGLEден +MAX_ANGLEге чектеп жатабыз, биз максималдуу бурчту 45ке чейин аныктадык жана ал өзгөрөт
- биз 360 градусту 4 квадрантка бөлүп жатабыз жана ар бири үчүн lightLeds () функцияларын төмөнкүчө чакырабыз:
* y терс, z позитивдүү биринчи квадрант 0дон 5ке чейин LEDлерди башкарат, бурчу 0дөн 89га чейин болот
* y терс, z терс экинчи квадрант көзөмөлү 6дан 12ге чейин, бурчу 89дан 0гө чейин болот
* …жана башкалар
- lightLeds функциясынын ичинде
* Мен эки окко негизделген бурчту эсептеп жатам (тиркелген сүрөттү караңыз)
* Мен arduino карта функциясын колдонуу менен эмнени көрсөткөнүн эсептеп жатам
* Мен эки тилкени кошпогондо, башка тилкелерди баштапкы абалга келтирип жатам, мен мурун эсептеген жана мурунку позицияга туура келген (өчүрүү эффектин көрсөтүү үчүн)
* неопиксел калибрлөөсүн эске алуу үчүн normalizeLedPosition () деп аталган функцияны колдонуп жатам. Калибрлөө пайдалуу, анткени неопикселдик шакекти каалагандай бурууга болот жана аны гироскоп менен тегиздөө керек
* Мен ошондой эле сүйрөө огун басып жатам, эмне LED жарык жана бурчка ээ
Математика
Мен бурчту аныктоо үчүн колдонулган тригонометриялык функциясы жана жетектелген шакеги бар сүрөттү тиркеп койгом.
Сунушталууда:
Оттун шакеги [REMIX]: 12 кадам (Сүрөттөр менен)
Оттун шакеги [REMIX]: Алардын айрымдарын кургандан кийин: https: //www.instructables.com/id/Matrix-LED-Light/i шамды башка деңгээлге көтөрүүнү чечтим. Биринчиси жакшы көрүнгөнү менен, оригиналга бир аз окшош. Биринчи дизайнга каршы эч нерсе жок
Кайра иштетилген велосипед алкагынан LED шакеги: 9 кадам (сүрөттөр менен)
Кайра иштетилген велосипед алкагынан LED шакеги: Loek Vellkoopтун көрсөтмөсүнөн шыктангандыктан, мен жакында эле велосипедди сындырып, кайра колдоно турган бардык материалдарды көрдүм. Мени чындап урган элементтердин бири - мен бардык спикерлерди алып салгандан кийин дөңгөлөктүн алкагы. Бекем
Бир жолу колдонулуучу камера шакеги: 9 кадам (сүрөттөр менен)
Бир жолу колдонулуучу Камера Ринг Флеши: Бир жолу колдонулуучу камера шакеги жарыгын жасаңыз. Фильм алынгандан кийин бир жолу колдонулуучу камералар жараксыз болуп калат. Фото лабораторияларда көбүнчө кайра кутулууну күтүп, эсептегичтин астында кутучалары бар. Эгер сиз жакшылап сурасаңыз, көбүнчө тажрыйбадан ашык ала аласыз
Күн энергиясы менен иштеген лазер (көрсөткүч) - Бир "хоббинин көлөмү" панели аны иштетет! - Жөнөкөй DIY - Көңүлдүү эксперимент!: 6 кадам (Сүрөттөр менен)
Күн энергиясы менен иштеген лазер (көрсөткүч) - Бир "хоббинин көлөмү" панели аны иштетет! - Жөнөкөй DIY - Көңүлдүү Эксперимент!: Бул көрсөтмө лазердик көрсөткүчтү күн панели менен кантип иштетүү керектигин көрсөтөт. күн энергиясына жакшы киришүү жана кызыктуу эксперимент
Чекит жана атуу шакеги Flash диффузор: 6 кадам (сүрөттөр менен)
Point-and-Shoot Ring Flash Diffuser: Арзан санарип камераңызга үйдүн тегерегиндеги нерселерден шакек флеш диффузор түзүп, адатта жогорку деңгээлдеги фотография үчүн сакталган сонун жаңыртууну бериңиз! анда, балким, сиз 300 долларлык шакекчеге ээ боло албайсыз