Mundarija:
2025 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2025-01-13 06:58
Mototsikl haydovchisi sifatida menga yo'lda ko'rinmasdek munosabatda bo'lish juda yaxshi tanish. Men doimo velosipedimga qo'shadigan narsa - bu odatda o'rnatilgan chiroq bo'lgan yuqori quti. Yaqinda men yangi velosipedga o'tdim va Givi V56 Monokey qutisini sotib oldim, chunki unda narsalar uchun joy ko'p edi. Bu qutida har bir tomon uchun ikkita chiziqli LEDlardan tashkil topgan zavod chiroqlari uchun joy bor. Muammo shundaki, bu to'plam taxminan 70 dollar turadi va faqat tormoz beradi. Keyingi sotuvlar to'plami bor, u shunga o'xshash ishlarni qiladi va o'rnatish biroz osonroq bo'lishi mumkin, lekin sizning narxingiz 150 dollargacha ko'tariladi. Aqlli odam bo'lganimdan va LED yoritgichli chiziqlarni sinab ko'rish uchun bahona izlayotganda, men nafaqat tormoz chiroqlari, balki ishlaydigan chiroqlar (har harakatlanayotganda), burilish signallari va xavfli chiroqlarni birlashtiradigan tizim yaratishga qaror qildim. Gap shundaki, men hatto ishga tushirish ketma -ketligini qo'shdim. chunki men qila olardim. E'tibor bering, bu juda ko'p ishni talab qildi, lekin menda ko'p narsalarni tushunishim kerak edi. Ishga qaramay, bu qanday amalga oshganidan juda mamnunman. Umid qilamanki, bu boshqa birov uchun foydali bo'ladi.
Bu tizim qanday ishlashining asosiy usuli - bu Arduino qurilmasi pimdagi signallarni qidiradi: tormoz chirog'i, chap burilish nuri va o'ng burilish nuri. Mototsikldan 12 voltli signalni o'qish uchun men optoisolatorlardan foydalanib, 12V signalni Arduino o'qiy oladigan 5V signalga aylantirdim. Keyin kod bu signallardan birini kutadi va FastLED kutubxonasi yordamida LED chizig'iga buyruqlar beradi. Bu asoslar, endi tafsilotlarga kirish.
Ta'minotlar
Bu men ishlatgan narsalar, chunki ko'pincha men ularni yotgan edim. Shubhasiz, ular kerak bo'lganda almashtirilishi mumkin:
- Arduino - Men o'lchamlarni hisobga olish uchun nanodan foydalandim, lekin sizda beshta pim bor ekan, siz xohlagan narsani ishlatishingiz mumkin.
- 5V regulyator - men L7805CV ishlatardim, u 1,5 amperga ega edi. Ushbu loyihada LEDlar uchun 0,72 amper va nano quvvat ishlatiladi, shuning uchun 1,5 bu loyiha uchun juda yaxshi ishlaydi.
- Kondansatkichlar - kuchlanish regulyatorining to'g'ri ishlashi uchun sizga 0,33 uF va bitta 0,1 uF kerak bo'ladi.
- 3x optoizolyatorlar - signalni 12V dan 5V gacha o'zgartirish. Men PC817X turini ishlatardim, u faqat to'rtta pinli, bu bizga kerak.
- Rezistorlar - sizga har xil turdagi ikkita tur kerak bo'ladi. Birinchisi, optoizolyator IR LED orqali tokni kamaytirish uchun etarli bo'lishi kerak. Sizga kamida 600 ohm kerak bo'ladi, lekin mototsikldagi o'zgaruvchan voltajni 700 bilan boshqarish yaxshiroq bo'lar edi. Optiozolyatorning boshqa tomonida tez signal berish uchun boshqasi 10k dan 20k gacha bo'lishi kerak.
- Prototiplar taxtasi - menda kichik o'lchamlari bor edi, ular kichik hajmdagi kichik loyiha qutisiga sig'adigan edi.
- Loyiha qutisi - tarkibiy qismlarga mos keladigan darajada katta, lekin oson joylashadigan darajada kichik.
- Tel - men Cat 6 chekilgan simini ishlatardim, chunki uning ko'p qismi atrofida o'tirardi. Bu sakkizta simli, har xil rangda kodlangan, bu har xil ulanishlarga yordam berdi va joriy tortishishlarni boshqarish uchun etarlicha katta o'lchagich edi.
- Pluglar - xohlagan joyingizda, tizim osongina olinadigan bo'lsin. Men suv o'tkazmaydigan vilkasidan foydalanib, yuqori qutini olib tashlashga va yomg'ir yoki suvga tushgan suvga bardosh berishga ruxsat berdim. Menga LED chiziqlar uchun kichikroq vilkalar kerak edi, shuning uchun katta teshiklarni burishim shart emas edi.
- Hamma narsani joyida ushlab turish uchun fermuar va bog'ich yopishtiruvchi biriktirgichlar.
- Ulanishlarni tartibga solish uchun o'rashni qisqartiring.
1 -qadam: O'chirish tizimini yaratish
Shubhasiz, agar siz mening tuzilishimni kuzatayotgan bo'lsangiz, men qilgan sinovlardan o'tishingiz shart emas. Men qilgan birinchi narsa, mening kodim ishlaganiga ishonch hosil qilish va men optoizolyatorlardan to'g'ri signal olishim, shuningdek LED chiziqlarini to'g'ri boshqarishim edi. Izolyatorlarga signal pimlarini qanday ulash yaxshiroq ekanini aniqlash uchun bir oz vaqt ketdi, lekin sinov va xato orqali men to'g'ri yo'nalishni topdim. Men faqat standart prototipli taxtadan foydalandim, chunki men faqat bitta qurayotgan edim va iz naqshini aniqlaganimdan ko'ra ko'proq vaqt kerak bo'lardi. Elektron plataning yuqori qismi ajoyib ko'rinadi, lekin pastki qismi biroz chalkashlikka o'xshaydi, lekin hech bo'lmaganda u funktsionaldir.
Asosiy dizayn 12V quvvatni ulangan manbadan kiritishdan boshlanadi (faqat mototsikl yoqilgan sim). Ulanish sxemasi, albatta, bu simni topishga yordam beradi. Bu voltaj regulyatorining bir tomoniga uzatiladi. 0,33 uF kondansatör bu kirishni voltaj regulyatoridagi erga bog'laydi, so'ngra mototsiklda erga qaytadi. Voltaj regulyatorining chiqishida erga ulangan 0,1uF kondansatör bo'ladi. Ushbu kondansatörler regulyatordan kuchlanishni yumshatishga yordam beradi. Agar siz ularni elektron karta rasmida topa olmasangiz, ular voltaj regulyatori ostida. U erdan 5V liniyasi Arduino -dagi Vin -ga, LED -lentalarni oziqlantiruvchi quvvat piniga, va ikkita -optoisolatorning manba tomoniga, kerakli 5V -signalni ta'minlaydigan Arduino -pinlarga o'tadi.
Optoizolyatorlarga kelsak, ikkita tomon bor: biri IQ LEDli, ikkinchisi tranzistorli va IQ detektori. Biz 12V signalini o'lchash uchun IQ LED tomondan foydalanmoqchimiz. LEDning oldinga kuchlanish 1,2V bo'lganligi uchun bizga ketma -ket oqim cheklovchi qarshilik kerak. 12V - 1.2V = 10.8V va LEDni 18 mA da ishlatish uchun (men har doim 20 mA dan kam ishlashni yaxshi ko'raman), sizga R = 10.8V/0.018A = 600 ohmli rezistor kerak bo'ladi. Avtotransportdagi kuchlanish ham 14Vgacha yuqori bo'lishi mumkin, shuning uchun taxminan 710 ohmni rejalashtirish yaxshidir, garchi 700 oqilona bo'lsa. Keyin LED tomonining chiqishi erga qaytadi. Optoizolyatorning chiqish tomoni uchun kirish regulyatorning 5V signalidan foydalanadi, keyin erga chiqishdan oldin chiqish boshqa qarshilikka ulanadi. Bu qarshilik faqat 10k - 20k ohm atrofida bo'lishi kerak, hech bo'lmaganda mening ma'lumotlar jadvalimda ko'rsatilgandek. Bu signalni tez o'lchash imkonini beradi, chunki biz shovqinli muhit bilan shug'ullanmaymiz. Arduino pinining chiqishi rezistor bilan optoizolyatorning chiqishi o'rtasida bo'ladi, shuning uchun signal o'chirilganda pin past bo'ladi va pin ustida signal baland bo'ladi.
LED chiziqli chiroqlar uchta sim bilan bog'liq: quvvat, er va ma'lumotlar. Quvvat 5 V bo'lishi kerak. Ushbu loyihada jami 12 LED ishlatiladi (menda chiziqlar ko'proq LED bo'lsa -da, lekin men har uchinchi LEDni ishlataman) va oq yorug'lik to'liq nashrida ishlatilganda har biri 60mA oladi. Bu jami 720 mA ni beradi. Biz voltaj regulyatorining chiqish quvvati ichida bo'lamiz, shuning uchun biz yaxshi. Quvvatni boshqarish uchun sim etarlicha katta o'lchagich ekanligiga ishonch hosil qiling, men 24 o'lchovli Cat 6 chekilgan simini ishlatardim. Ethernet simlari men o'tirgan narsa edi va uning 8 ta rangli kodli simlari bor edi, shuning uchun bu loyiha uchun yaxshi ishladi. Topbox -ga o'tishi kerak bo'lgan yagona sim - bu kuch va tuproq (ikkalasi ham chiziqlar orasiga bo'linadi) va ikkita ma'lumot uzatish liniyasi (har bir chiziq uchun bitta).
Qolgan simlar arduino pimlariga ulanadi va quvvat beradi. Ushbu loyiha uchun ishlatilgan pinlar quyidagilar edi:
- Vin - 5V ga ulangan
- Gnd - erga ulangan
- Pin2 - Chap chiziqli ma'lumotlar liniyasiga ulangan
- Pin3 - O'ng chiziqli ma'lumotlar liniyasiga ulangan
- Pin4 - optoizolyatordan tormoz signaliga ulangan
- Pin5 - optoisolatordan chapga burilish signaliga ulangan
- Pin6 - optoisolatordan o'ngga burilish signaliga ulangan
2 -qadam: simlarni o'rnatish va o'rnatish
Zanjir qurilgandan so'ng, uni joyiga o'rnatish vaqti keldi. Velosipedni ulash sxemasidan foydalanib, siz quyidagilarni topishingiz kerak bo'ladi.
- Kommutatsiya qilingan quvvat manbai
- Zamin
- Tormoz signali kirdi
- Chapga burilish signali
- O'ng burilish signali
Men uchun bularning barchasida bitta vilka bor edi, shuning uchun men uni ishlatardim. Vaqt o'tishi bilan, men bir xil vilka uslubini topib, faqat modulni ulashim mumkin edi, lekin men topolmadim, shuning uchun izolyatsiyani joyidan olib tashladim va unga yangi simni lehimladim. Men kelajakda kerak bo'lganda qolganlarini olib tashlashim uchun ulangan ulanishlar uchun vilkalarni ishlatardim. U erdan men muhrlangan loyiha qutisiga joylashtirilgan Arduino -ni o'rindiq ostiga qo'ydim. Chiqish kabeli shkafning ramkasi bo'ylab suv o'tkazmaydigan vilkaga o'tadi, so'ng qutiga kiradi va orqa tomondan qopqoq tomon o'tadi, u erda u har tomonga bo'linadi. Simlar qopqoqning ichki qismi bo'ylab LEDlar uchun ulanish joyiga o'tadi. Tel, yopishtiruvchi taglik bilan, tashqi makon uchun fermuarli rishtalarga mahkamlangan rishtalar yordamida yordam beradi. Siz ularni uy jihozlari do'konidagi kabelni o'rnatish bo'limida topishingiz mumkin
Men LED chiziqlaridagi ikkita mini -JST vilkasidan foydalanardim, chunki minimal diametrli teshikdan o'tish uchun etarlicha kichik vilka kerak edi va men joriy talablarga javob beradigan sim borligiga ishonch hosil qilmoqchi edim. Shunga qaramay, bu haddan tashqari ko'p bo'lishi mumkin va menda uchta simli kichik vilkalar yo'q edi. Yorug'lik chizig'i simlari o'tadigan qutidagi teshik suv o'tkazmasligi uchun muhrlangan. LED chiziqlarini joylashtirishga kelsak, chunki oraliqda ozgina nomuvofiqlik bor (reflektor va LEDlarning teshiklari orasidagi masofada taxminan 1 - 1,5 mm farq bor edi), men ularni LED va LED orasidagi farqni bo'ladigan qilib joylashtirdim. iloji boricha teshik. Keyin men ularni joyiga yopishtirish uchun issiq elim va joyni to'liq yopish uchun mastik ishlatardim. LED chiziqlarining o'zi suv o'tkazmaydigan, shuning uchun ular ho'l bo'lib qolsa, muammo bo'lmaydi. O'rnatish juda qiyin bo'lib tuyulsa -da, bu kelajakda tizimni olib tashlashni osonlashtiradi yoki uning qismlarini almashtirish kerak bo'ladi, chunki bu sodir bo'lishi mumkin.
3 -qadam: Kod
Mening manba kodim ushbu ko'rsatmaning boshida bo'lishi kerak. Men har doim o'z kodimni sharhlab beraman, shuning uchun keyinroq tushunish osonroq. Ogohlantirish: Men professional kod yozuvchi emasman. Kod birinchi usulda yozilgan va ba'zi yaxshilanishlar qilingan, lekin bilaman, uni yanada takomillashtirish mumkin. Vaqt uchun ideal bo'lmagan kechiktirish () funktsiyasidan ham foydalanaman. Biroq, qurilma qabul qilayotgan signallar nisbatan tez signal emas, shuning uchun men ularni millis () kabi bir narsadan foydalanishni davom ettirishni oqladim. Men ham juda band bo'lgan ota va erman, shuning uchun funktsiyani o'zgartirmaydigan narsalarni yaxshilash uchun vaqt sarflayman, bu ro'yxatda yuqori emas.
Ushbu loyiha uchun FastLED kutubxonasi bo'lgan bitta kutubxona kerak. Bu WS2811/WS2812B tipidagi LED chiziqlarini boshqarish uchun barcha kodlarga ega. U erdan men asosiy funktsiyalarni ko'rib chiqaman.
Standart ta'riflardan birinchisi, ikkita chiziqni e'lon qilishdir. Har bir chiziq uchun siz quyidagi kodni ishlatasiz:
FastLED.addLeds (leds [0], NUM_LEDS);
Bu kod qatori 2 -pinni o'rnatadi, bu chiziqni NUM_LEDS doimiy belgilangan LEDlar soni bilan 0 -chiziq sifatida belgilaydi, bu men uchun 16 -ga o'rnatiladi. Ikkinchi chiziqni aniqlash uchun 2 -raqam 3 bo'ladi (pin3 uchun) va Ip 1 -yorliq bilan belgilanadi.
Keyingi muhim rang - rang ta'rifi.
leds [0] [1] = Rang_yuqori CRGB (r, g, b);
Ushbu kod qatori har xil ko'rinishda ishlatiladi (ko'pchiligim doimiy). Asosan, bu kod har bir LED kanaliga (qizil, yashil, ko'k) har bir yorqinlikni belgilaydigan qiymat yuboradi. Yorqinlik qiymati 0 - 255 raqami bilan aniqlanishi mumkin. Har bir kanal uchun yorqinlik darajasini o'zgartirib, siz turli xil ranglarni belgilashingiz mumkin. Ushbu loyiha uchun men oq rangni yorug'likni iloji boricha yorqinroq saqlashini xohlayman. Men qiladigan yagona o'zgarish - barcha uchta kanalda yorqinlik darajasini bir xil o'rnatish.
Keyingi kodlar har bir chiroqni alohida yoritish uchun ishlatiladi. E'tibor bering, har bir chiziq uchun har bir LED 0 dan boshlanadi, bu ma'lumotlar uzatish liniyasiga eng yaqin bo'lgan manzil uchun 0 dan boshlanadi, sizda minus 1 eng yuqori raqamli LEDgacha. Masalan, bu 16 LED tasmasi, shuning uchun eng balandi 16 - 1 = 15. Buning sababi shundaki, birinchi LED 0 deb belgilanadi.
for (int i = NUM_LEDS -1; i> -1; i = i -3) {// Bu oxirgi uchdan birinchisiga o'tadigan har uchinchi LEDning yorug'ligini o'zgartiradi. leds [0] = Color_low; // 0 LED tasmasini tanlangan rangga o'rnating. leds [1] = Color_low; // 1 -LED tasmasini tanlangan rangga o'rnating. FastLED.show (); // Belgilangan ranglarni ko'rsatish. leds [0] = CRGB:: Qora; // Keyingi rangga tayyorgarlik paytida belgilangan rangni o'chiring. leds [1] = CRGB:: Qora; kechikish (150); } FastLED.show (); // Belgilangan ranglarni ko'rsatish.
Bu kodning ishlash usuli shundan iboratki, o'zgaruvchi (i) ford ichida LED manzili sifatida ishlatiladi, keyinchalik LEDlarning to'liq soniga (NUM_LEDS) havola qilinadi. Buning sababi shundaki, men chiroqlar boshidan emas, balki chiziqning oxiridan boshlanishini xohlayman. Sozlama ikkala chiziqqa (leds [0] va leds [1]) chiqariladi, so'ng o'zgarishlarni ko'rsatadigan buyruq beriladi. Shundan so'ng, bu chiroq o'chadi (CRGB:: Qora) va keyingi chiroq yonadi. Qora mos yozuvlar FastLED kutubxonasidagi o'ziga xos rangdir, shuning uchun men har bir kanal uchun 0, 0, 0 chiqarishga hojat yo'q, lekin ular xuddi shunday qilishadi. For loop bir vaqtning o'zida 3 ta LEDni (i = i-3) oldinga siljitadi, chunki men faqat boshqa har bir LEDni ishlataman. Ushbu tsiklning oxiriga kelib, yorug'lik ketma -ketligi bitta LEDdan ikkinchisiga o'tadi, bunda bitta chiziq yonadi, bu esa Knight Rider effekti. Agar siz har bir nurni yondirib turishni xohlasangiz, bar qurilishi uchun siz dasturning keyingi kodlar to'plamida sodir bo'ladigan LEDlarni o'chiradigan satrlarni olib tashlaysiz.
for (int i = 0; i <dim; i ++) {// Chiroqlar tezda yorug'lik darajasiga tushadi. rt = rt + 1; gt = gt + 1; bt = bt + 1; for (int i = 9; i <NUM_LEDS; i = i +3) {// Bu holat nuri uchun oxirgi uchta chiroqni yondiradi. leds [0] = CRGB (rt, gt, bt); // 0 LED tasmasini tanlangan rangga o'rnating. leds [1] = CRGB (rt, gt, bt); // 1 -LED tasmasini tanlangan rangga o'rnating. } FastLED.show (); kechikish (3); }
Men LEDlar uchun ishlatadigan kodning oxirgi misoli - bu pastadir. Bu erda men har bir kanalning yorqinligi uchun vaqtinchalik uyalardan foydalanaman (rt, gt, bt) va men xohlagan ko'rinishga erishish uchun har bir ko'rsatuv orasidagi kechikish bilan ularni 1 ga oshiraman. Shuni ham unutmangki, bu kod faqat oxirgi uchta LEDni o'zgartiradi, chunki u chiroqlar o'chadi, shuning uchun men 0 emas, 9dan boshlayman.
LED kodining qolgan qismi bularning takrorlanishi. Qolgan hamma narsa uch xil simda signal izlashga qaratilgan. Kodning Loop () maydoni tormoz chiroqlarini qidiradi, ular yonib turguncha bir marta yonadi (agar xohlasangiz, bu sozlanishi) yoki burilish signallarini qidiradi. Bu kod uchun, men chap va o'ng burilish chiroqlari xavflar uchun bir vaqtning o'zida yonadi deb o'ylay olmaganim uchun, men kodni birinchi navbatda qidiraman, keyin biroz kechiktirgandan so'ng, ikkalasi ham ko'rsatayotganligini tekshiraman. xavfli chiroqlar yonadi. Menda ayyor signallar bor edi, chunki yorug'lik bir muncha vaqt o'chadi, shuning uchun signal hali ham yoqilgan, lekin o'chirilgan va bekor qilingan signal o'rtasidagi farqni qanday aytishim mumkin? Men o'ylab topganim, signal chaqnashlari orasidagi kechikishdan ko'ra ko'proq davom etadigan kechikish davrini amalga oshirish edi. Agar burilish signali hali ham yoqilgan bo'lsa, signal uzilishi davom etadi. Agar signal kechikish tugagandan keyin qaytmasa, u pastadir boshlanishiga qaytadi (). Kechiktirish uzunligini sozlash uchun doimiy yorug'lik sonini o'zgartiring Kechikish har 1 yorug'lik uchun eslab qoling Kechikish 100 msga o'zgaradi.
while (digitalRead (leftTurn) == LOW) {for (int i = 0; i <lightDelay; i ++) {leftTurnCheck (); if (digitalRead (leftTurn) == HIGH) {leftTurnLight (); } kechikish (100); } uchun (int i = 0; i <NUM_LEDS; i = i +3) {// Bu oxirgi uchdan birinchisiga o'tadigan har uchinchi LEDning yorug'ligini o'zgartiradi. leds [0] = CRGB (0, 0, 0); // 0 LED tasmasini tanlangan rangga o'rnating. } uchun (int i = 9; i <NUM_LEDS; i = i +3) {// Bu faqat oxirgi uchtasini ishlatadigan chiroqlar o'rnatadi. leds [0] = Color_low; // 0 LED tasmasini tanlangan rangga o'rnating. } FastLED.show (); // Chiqish parametrlarini qaytarish; // Qaytish signali yoqilmagach, aylanaga qayting. }
Umid qilamanki, kodning qolgan qismi o'z -o'zidan tushunarli. Bu signallarni tekshirish va harakat qilishning takrorlanadigan to'plami.
4 -qadam: Natijalar
Ajablanarlisi shundaki, bu tizim birinchi marta velosipedga ulanganimda ishlagan. Adolat uchun, men bundan oldin uni skameykada sinab ko'rdim, lekin men hali ham muammo yoki tuzatish kutardim. Ma'lum bo'lishicha, menga kodni va ulanishlarni o'zgartirish kerak emas edi. Videodan ko'rinib turibdiki, tizim ishga tushirish ketma -ketligi bilan o'tadi (sizda yo'q), keyin standart chiroqlar yonadi. Shundan so'ng, u tormozlarni qidiradi, bu holda u barcha LED -larni to'liq yoritadi va tormoz bo'shatilgunga qadar bir marta yonadi. Qaytish signali ishlatilganda, men burilish ko'rsatiladigan tomonga aylantiruvchi effekt qildim, boshqa tomon esa yonib turgan chiroq yoki tormoz chirog'i yonadi. Xavfli chiroqlar vaqt o'tishi bilan boshqa chiroqlar bilan yonadi.
Umid qilamanki, bu qo'shimcha chiroqlar bilan men boshqa odamlarga ko'proq ko'rinaman. Hech bo'lmaganda, kommunal xizmat ko'rsatishda mening qutimni boshqalarga qaraganda bir oz ko'proq ajratish yaxshi qo'shimchadir. Umid qilamanki, bu loyiha boshqa birov uchun ham foydali bo'ladi, garchi ular mototsikl yoritgichi bilan ishlamasa ham. Rahmat!