Mündəricat:

Fancy LED Hat: 5 Addım (Şəkillərlə birlikdə)
Fancy LED Hat: 5 Addım (Şəkillərlə birlikdə)

Video: Fancy LED Hat: 5 Addım (Şəkillərlə birlikdə)

Video: Fancy LED Hat: 5 Addım (Şəkillərlə birlikdə)
Video: Kim nə başa düşdü ❓ 2024, Sentyabr
Anonim
Image
Image
Fantezi LED Şapka
Fantezi LED Şapka

Mən həmişə bir Arduino layihəsi etmək istəmişəm, amma ailəm şık bir şapka partiyasına dəvət olunana qədər heç vaxt belə bir fikir əldə etməmişəm. İki həftəlik bir müddətlə, həm həssas bir LED animasiya şapkasını planlaşdıra biləcəyimi və həm də icra edə biləcəyimi maraqlandım. Mən çıxardım! Yəqin ki, bir az aşdım, amma ümumi layihənin dəyəri 80 dollar civarındadır. Təcrübə və bəzi kodlaşdırma ilə bunu daha ucuza edə bilərsiniz.

Şapkalı qol aşağıdakı idi:

  1. Şapkanın mərkəz ön hissəsindən arxa tərəfə, hər tərəfdən bir işıq olan bir sıra işıqlar keçsin
  2. Şapkanın öndən arxaya əyilməsinin diktə etdiyi işığın hərəkət sürətini dəyişdirin
  3. Şapka bandı aşağı əyildikdə işıqların tərsinə icazə verin (yəni cazibə qüvvəsinin işıqlara təsirini təqlid edin)
  4. Şapkanın soldan sağa əyilməsinə əsaslanaraq rəngi dəyişdirin
  5. Şokları hiss edin və xüsusi bir təsir göstərin
  6. Sahibin fırlandığını hiss edin və xüsusi bir effekt göstərin
  7. Şapkada tamamilə var

Addım 1: Lazım olan hissələr

Ehtiyac duyulan hissələr
Ehtiyac duyulan hissələr
Ehtiyac duyulan hissələr
Ehtiyac duyulan hissələr
Ehtiyac duyulan hissələr
Ehtiyac duyulan hissələr

Aşağıdakı əsas komponentləri istifadə etdim (əlaqəli olmayan Amazon bağlantıları daxil olmaqla):

  • Teensy LC mikro nəzarətçisi - Kiçik ölçüsünə görə LED -lərimi idarə etmək üçün xüsusi bir əlaqəyə malik olduğu üçün güclü bir kitabxana və cəmiyyət dəstəyi olduğu üçün bunu adi bir Arduino üzərində seçdim.
  • Bosch BNO055 əsaslı mövqe sensoru - vicdanla sənədlər tapdığım ilklərdən biridir. Daha az bahalı variantlar var, ancaq Bosch -u anladıqdan sonra sizin üçün çox şey edir, əks halda kodda etməlisiniz.
  • WS2812 ünvanlı LED şeridi - Metrdə 144 LED olan 1 metr uzunluğunu seçdim. Bu sıxlığa malik olmaq, ayrı -ayrı elementlərin ardıcıllıqla işıqlandırılmasından çox, işığın hərəkətdə olduğu kimi görünməsinə kömək edir.

Və aşağıdakı kiçik komponentlər:

  • Şapka - papaqlı hər hansı bir şapka edəcək. Yerli bir mağazadan 6 dollarlıq papaqdır. Arxa tərəfində bir dikiş varsa, naqilləri keçmək daha asan olacaq. Şapka bandının yapışdırıldığına diqqət yetirin, çünki bu da əlavə çətinliklər yaradacaq. Bu yuxarı boyunca tikilir, ancaq alt asanlıqla çəkilir.
  • 4.7K ohm rezistorlar
  • 3x AAA batareya çantası - 3 AAA batareyadan istifadə etməklə elektronikanın istədiyi aralığa doğru gərginlik çıxarır ki, bu da işi asanlaşdırır. AAA, AA -dan daha asan bir şapkaya uyğundur və hələ də əla işləmə müddətinə malikdir.
  • Kiçik ölçü teli - Əvvəlki bir LED layihəsindən çəkdiyim möhkəm teldən istifadə etdim.
  • Lehimləmə dəmir və lehim
  • Şapka və ipin daxili rənginə uyğun olan bəzi spandeks

Təklif olunur, lakin isteğe bağlıdır:

  • Batareya telləri üçün sürətli bağlayıcılar
  • Köməkçi Əllər vasitəsi, bunlar çox kiçikdir və lehim etmək çətindir

Addım 2: Şapka dəyişdirin

Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin
Şapka dəyişdirin

Şapkada elektronikanı yerləşdirmək üçün bir yerə və batareya üçün bir yerə ehtiyacınız olacaq. Həyat yoldaşım geyimlə peşəkarlıqla məşğul olduğu üçün ondan məsləhət və kömək istədim. Spandex ilə iki cib yaratdıq. Ön tərəfdəki ilk kiçik cib, şapka kimi işarə olunur, belə ki, elektronika quraşdırıldıqda mövqe sensoru kifayət qədər yaxşı yerində tutulur, lakin lazım olduqda asanlıqla çıxarıla bilər. Arxa tərəfdəki ikinci cib batareya paketini yerində saxlamaqdır.

Ciblər şapka rənginə uyğun iplə əkilmişdi, hamısı tac xətti boyunca. Şapka və materialların üslubundan asılı olaraq bu texnika ilə YMMV -dən hazırlanır.

Şapka bandının bir tərəfə büküldüyünü də kəşf etdik və tamamilə həmin yerdəki şapkaya tikildi. LED -lərin bandın altında işləməsi üçün orijinal tikişi çıxarmalı olduq. Tikinti zamanı sancaqlar ilə yerində tutuldu və tamamlandıqdan sonra uyğun iplə tikildi.

Nəhayət, bantla örtülmüş olsaydı, şapkanın arxasındakı dikişi açdıq. LED -lərlə gələn tel kəmərini həmin tikişdən keçirtdik və zolağın ilk LED -ini dikişin üstündə yerləşdirdik. Sonra LED -ləri şapkanın ətrafına sardıq və zolağı kəsdik ki, sonuncu LED birincinin yanında olsun. LED şeridi yalnız şapka bandı ilə yerində tutula bilər, ancaq bantınızdan və materialınızdan asılı olaraq LEDləri tikmək və ya yapışdırmaqla sabitləməyiniz lazım ola bilər.

Addım 3: Bağlayın

Bağlayın
Bağlayın

Teensy lövhəsi və LEDlər güc üçün 3.3v -dən 5v -a qədər hər yerdə işləyəcək. Bu səbəbdən 3 AAA batareya istifadə etməyi seçdim, 4.5v çıxış gərginliyi bu diapazonda çox gözəldir və LED -lərin işləməsini proqramlaşdırmağım üçün çoxlu iş vaxtı var. 8 saatdan çox işləyə bilərsiniz.

Gücün çəkilməsi

Batareya qutusundan və LED -lərdən müsbət və mənfi telləri bir -birinə bağladım, sonra Teensy -yə uyğun yerlərdə lehim etdim. Batareyadan əldə edilən pozitivin diaqramdakı Teensy -nin sağ üst pininə (lövhədə Vin işarəsi ilə) bağlanması lazımdır və mənfi GND etiketli hər hansı bir pinlə bağlana bilər. Rahat olaraq lövhənin qarşı tərəfində və ya Vin pininin yanında var. Lövhə üçün tam pin diaqramı bu səhifənin altındadır. Və bəzi hallarda lövhəni sifariş edərkən kağız nüsxəsi daxil edilir.

Bir anda yalnız bir neçə LED -in yandırıldığı bir kod işləməyi planlaşdırırsınızsa, 3.3v çıxışı və GND istifadə edərək LED -ləri Teensy -nin özündən gücləndirə bilərsiniz, ancaq çox güc çəkməyə çalışırsınızsa lövhəyə zərər verin. Özünüzə ən çox seçim vermək üçün LEDləri birbaşa batareya mənbəyinə bağlamaq daha yaxşıdır.

LED -lərin çəkilməsi

Bu layihə üçün Teensy LC -ni seçdim, çünki ünvanlı LED -lərin bağlanmasını çox asanlaşdıran bir pin var. Lövhənin altındakı pin 17 nömrəli sol güzgülərdən ikinci, həm də üzərində 3.3v olan pin. Buna bir çəkmə deyilir və digər lövhələrdə bu gərginliyi təmin etmək üçün bir rezistora tel bağlamalı olacaqsınız. Teensy LC vəziyyətində, bu pindən birbaşa LED məlumat telinizə bağlaya bilərsiniz.

Vəziyyət sensörünün naqilləri

Mövcud BNO055 lövhələrindən bəziləri gərginliyə görə daha sərtdir və yalnız 3.3v tələb edir. Bu səbəbdən, BNO055 lövhəsindəki Vin'i Teensy -də ayrılmış 3.3v çıxışdan bağladım, bu da sağdakı 3 -cü pindir. Daha sonra BNO055 üzərindəki GND -ni Teensy -də hər hansı bir GND -yə bağlaya bilərsiniz.

BNO055 mövqe sensoru Teensy ilə danışmaq üçün I2c istifadə edir. I2c çəkmələr tələb edir, buna görə Teensy-də 3.3v çıxışı olan iki 4.7K ohm müqavimətçini 18 və 19-cu pinlərə bağladım. Sonra pin 19-u BNO055 lövhəsindəki SCL pininə və 18-ni SDA pininə bağladım.

Kablolama məsləhətləri/fəndləri

Bu layihəni yerinə yetirmək üçün qapalı deyil, möhkəm tel istifadə etdim. Qatı telin bir üstünlüyü, bu kimi prototip lövhələrə lehimləmədir. Bir az tel çıxarıb 90 dərəcəyə bükə və terminallardan birinin altına daxil edə bilərsiniz ki, telin kəsilmiş ucu lövhənizin üstünə yapışsın. Terminala tutmaq üçün az miqdarda lehimə ehtiyacınız var və artıqlığı asanlıqla kəsə bilərsiniz.

Bükülmüş telin işlənməsi daha çətin ola bilər, çünki əyildiyi kimi qalmaq istəyir. Ancaq bu layihə üçün bir üstünlük idi. Tellərimi düzəltmək və proqramlaşdırmaq üçün elektronikləri şapkadan taxıb çıxardığımda mövqe sensorunun istiqaməti uyğun olacaq şəkildə kəsdim və şəkilləndim.

Addım 4: Proqramlaşdırma

İndi hər şey yığıldıqdan sonra Arduino uyğun proqramlaşdırma vasitəsinə ehtiyacınız olacaq. Əsl Arduino IDE -dən istifadə etdim (Linux, Mac və PC ilə işləyir). Teensyduino lövhəsi ilə əlaqə qurmaq üçün Teensyduino proqramına da ehtiyacınız olacaq. Bu layihə LED -lərin rəng və mövqelərini proqramlaşdırmaq üçün FastLED kitabxanasından çox istifadə edir.

Kalibr edilir

Etmək istəyəcəyiniz ilk şey Kris Winerin BNO055 üçün əla GitHub deposuna getmək və onun BNO_055_Nano_Basic_AHRS_t3.ino eskizini yükləməkdir. Bu kodu Serial Monitor işləyərkən quraşdırın və BNO055 lövhəsinin düzgün bir şəkildə onlayn olaraq gəldiyini və öz testlərini keçdiyini sizə xəbər verəcəkdir. BNO055 -in kalibrlənməsi ilə də sizə yol göstərəcək, bu da daha sonra daha ardıcıl nəticələr verəcək.

Fancy LED eskizinə başlayın

Xüsusi olaraq Fancy LED şapka kodu GitHub depomda əlavə olunur. Kodda daha çox dəyişiklik etməyi planlaşdırıram və bunlar GitHub repo -da yerləşdiriləcək. Buradakı fayl, bu Təlimat dərc edildikdə kodu əks etdirir. Eskizi endirdikdən və açdıqdan sonra dəyişdirməli olduğunuz bir neçə şey var. Dəyişdirilməsi vacib olan dəyərlərin çoxu #define ifadəsi olaraq ən üst sıradadır:

Satır 24: #NUM_LEDS 89 təyin edin - bunu LED şeridinizdəki LEDlərin həqiqi sayına dəyişin

Satır 28: #SERIAL_DEBUG yalanını təyin edin - ehtimal ki, serial monitorda çıxışı görmək üçün bunu doğru etmək istəyəcəksiniz

Vəzifə aşkarlama kodu

Mövqe algılama və düzəlişlərinizin çoxu 742 -ci sətirdən başlayır və 802 -dən keçir. Mövqe sensorundan Pitch, Roll və Yaw məlumatlarını alırıq və dəyərləri təyin etmək üçün istifadə edirik. Elektronikanın necə quraşdırıldığından asılı olaraq bunları dəyişdirmək lazım ola bilər. Çip ilə mövqe sensörünü şapkanın yuxarı tərəfinə və lövhədə yazılmış X işarəsinin yanındakı şapkanın ön tərəfinə işarə etsəniz, aşağıdakıları görməlisiniz:

  • Pitch başınızı yelləyir
  • Roll başınızı əyərək, məsələn. qulağına çiyninə toxun
  • Yaw hansı istiqamətdədir. qarşınızdadır (Şimal, Qərb və s.).

Lövhəniz fərqli bir istiqamətdə quraşdırılıbsa, istədiyiniz kimi davranmaları üçün Pitch/Roll/Yaw -ı dəyişdirməlisiniz.

Roll parametrlərini tənzimləmək üçün aşağıdakı #define dəyərlərini dəyişə bilərsiniz:

  • ROLLOFFSET: şapkanız sabit və mümkün olduğu qədər mərkəzləşdirilmiş vəziyyətdə, rulon 0 deyilsə, fərqlə dəyişin. Yəni Şapkanız ortalandığında -20 -də Roll görürsünüzsə, bu 20 -ni düzəldin.
  • ROLLMAX: Roll ölçülməsi üçün istifadə ediləcək maksimum dəyər. Şapka taxaraq və sağ qulağınızı sağ çiyninizə doğru hərəkət etdirməklə tapmaq ən asandır. Serial monitordan istifadə edərkən bunu etmək üçün uzun bir USB kabelinə ehtiyacınız olacaq.
  • ROLLMIN: başınızı sola əyərkən, Roll ölçülməsi üçün istifadə ediləcək ən aşağı dəyər

Eynilə, Pitch üçün:

  • MAXPITCH - yuxarı baxanda maksimum dəyər
  • MINPITCH - aşağı baxanda minimum dəyər
  • PITCHCENTER - düz irəli baxdığınız zaman meydançanın dəyəri

Faylın yuxarısında SERIALDEBUG -u doğru olaraq təyin etsəniz, bu dəyərləri düzəltməyə kömək etmək üçün serial monitorda Roll/Pitch/Yaw çıxışının cari dəyərlərini görməlisiniz.

Dəyişdirmək istəyə biləcəyiniz digər parametrlər

  • MAX_LED_DELAY 35 - LED hissəciyinin hərəkət edə biləcəyi ən yavaş. Bu milisaniyələrdir. Sətirdə bir LED -dən digərinə keçməyin gecikməsidir.
  • MIN_LED_DELAY 10 - LED hissəciyinin hərəkət edə biləcəyi oruc. Yuxarıda göstərildiyi kimi milisaniyələrdir.

Nəticə

Bu yerə qədər getmisinizsə, tam işlək və əyləncəli LED şapkanız olmalıdır! Bununla daha çox iş görmək istəyirsinizsə, növbəti səhifədə parametrlərin dəyişdirilməsi və öz işlərinizlə bağlı bəzi qabaqcıl məlumatlar var. kodumun qalan hissəsinin nə etdiyinə dair bir izahat.

Addım 5: Ətraflı və İsteğe bağlı: Kodun daxilində

Zərbə və spin aşkarlanması

Zərbə/əyilmə aşkarlanması BNO055-in yüksək G sensor funksiyalarından istifadə etməklə aparılır. İnitBNO055 () -də aşağıdakı sətirlərlə həssaslığını dəyişə bilərsiniz:

  • Satır #316: BNO055_ACC_HG_DURATION - hadisənin nə qədər davam etməsi
  • Satır #317: BNO055_ACC_HG_THRESH - təsirin nə qədər çətin olması
  • Satır #319: BNO055_GYR_HR_Z_SET - fırlanma sürəti həddi
  • Satır #320: BNO055_GYR_DUR_Z - fırlanma nə qədər davam etməlidir

Hər iki dəyər 8 bit ikili, hazırda təsir B11000000 olaraq təyin olunur, bu da 255 -dən 192 -dir.

Bir təsir və ya fırlanma aşkar edildikdə, BNO055, kodun döngənin əvvəlində axtardığı bir dəyəri təyin edir:

// Tetiklenen hər hansı bir kəsilməni aşkar edin, yəni yüksək G bayt səbəbiylə intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {təsir (); } başqa if (intStatus> 0) {spin (); }

Çarpma davranışını dəyişdirmək üçün kodda yuxarıdakı boşluq təsirini () və ya dönmə davranışını dəyişdirmək üçün void spin () xəttini axtarın.

Köməkçilər

Bütün LED -ləri tez bir rəngə təyin etmək üçün sadə bir köməkçi funksiyası (void setAllLeds ()) yaratdım. Hamısı söndürmək üçün istifadə edin:

setAllLeds (CRGB:: Qara);

Və ya FastLED kitabxanası tərəfindən tanınan hər hansı bir rəng seçə bilərsiniz:

setAllLeds (CRGB:: Qırmızı);

Bütün LED -ləri 25%azaldacaq bir fadeAllLeds () funksiyası da var.

Partikül sinfi

Kablolama işini çox asanlaşdırmaq üçün tək bir LED xətti istifadə etmək istədim, amma onları birdən çox tel kimi aparmalarını istədim. Bu mənim ilk sınağım olduğu üçün mümkün qədər sadə saxlamaq istədim, buna görə də bir ipi iki kimi görürəm, ortada LED (lər) var idi. Ya cüt, ya da tək bir rəqəmə sahib ola biləcəyimiz üçün bunun hesabını çıxarmalıyıq. Bəzi qlobal dəyişənlərlə başlayıram:

/ * * Dəyişən və LEDlər üçün konteynerlər */ CRGB ledləri [NUM_LEDS]; statik işarəsiz int curLedDelay = MAX_LED_DELAY; statik int centerLed = NUM_LEDS / 2; statik int maxLedPos = NUM_LEDS / 2; statik bool oddLeds = 0; statik bool hissəciyiDir = 1; statik bool speedDir = 1; işarəsiz uzun dirCount; imzasız uzun hueCount;

Və setup () da bəzi kodlar:

əgər (NUM_LEDS % 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS/2; } başqa {oddLeds = 0; maxLedPos = NUM_LEDS/2 - 1; }

Tək ədədlərimiz varsa, 1/2 nöqtəni ortada istifadə etmək istəyirik, əks halda 1/2 nöqtəni istəyirik - 1. Bunu 10 və ya 11 LED ilə görmək asandır:

  • 11 LED: tam ədədləri olan 11/2 5 -ə qədər qiymətləndirilməlidir və kompüterlər 0 -dan sayılır. Yəni 0 - 4 bir yarıdır, 6 - 10 digər yarıdır və 5 onların arasındadır. Bu vəziyyətdə #5 -ə sanki hər ikisinin bir hissəsi kimi baxırıq, yəni hər iki LED -in virtual simləri üçün 1 -ci yerdədir.
  • 10 LED: 10/2 5 -dir. Amma kompüterlər 0 -dan saydığı üçün birini çıxarmalıyıq. Sonra bir yarıda 0 - 4, digərində 5 - 9 var. Birinci virtual sətir üçün #1 4, ikinci virtual sətir üçün isə #5 olacaq.

Sonra hissəcik kodumuzda ümumi mövqeyimizdən LED simindəki həqiqi mövqelərimizə qədər bir az saymaq məcburiyyətindəyik:

if (oddLeds) {Pos1 = centerLed + CurrPos; Pos2 = centerLed - CurrPos; } başqa {Pos1 = centerLed + CurrPos; Pos2 = (centerLed -1) - CurrPos; }

Kod ayrıca hissəciyin istiqamətləri dəyişə biləcəyi şərtlərə malikdir, buna görə də bunu nəzərə almalıyıq:

if (particleDir) {if ((CurrPos == NUM_LEDS/2) && oddLeds) {CurrPos = 0; } başqa halda ((CurrPos == NUM_LEDS/2 - 1) && (! oddLeds)) {CurrPos = 0; } başqa {CurrPos ++; }} başqa {əgər ((CurrPos == 0) && oddLeds) {CurrPos = centerLed; } başqa halda ((CurrPos == 0) && (! oddLeds)) {CurrPos = centerLed - 1; } başqa {CurrPos--; }}

Beləliklə, hansı LED -in yandırılmalı olduğunu hesablamaq üçün nəzərdə tutulan istiqaməti (particleDir) istifadə edirik, ancaq LED siminin həqiqi ucuna və ya mərkəz nöqtəsinə çatdığımızı da nəzərə almalıyıq. virtual simlərin hər biri.

Bütün bunları anladıqdan sonra, lazım olduqda növbəti işığı yandırırıq:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + CurrPos; Pos2 = centerLed - CurrPos; } başqa {Pos1 = centerLed + CurrPos; Pos2 = (centerLed -1) - CurrPos; }} başqa {əgər (oddLeds) {Pos1 = centerLed - CurrPos; Pos2 = centerLed + CurrPos; } başqa {Pos1 = centerLed - CurrPos; Pos2 = (centerLed -1) + CurrPos; }} led [Pos1] = CHSV (CurrHue, 255, 255); led [Pos2] = CHSV (CurrHue, 255, 255); FastLED.show ();}

Niyə bunu ümumiyyətlə bir sinif halına gətirirsən? Olduğu kimi, bu olduqca sadədir və bir sinifdə olmağa ehtiyac yoxdur. Bununla birlikdə, bir anda birdən çox hissəciyin meydana gəlməsini təmin etmək üçün kodu yeniləmək və bəziləri tərs işləyərkən bəziləri irəli gedərkən planlarım var. Düşünürəm ki, çoxlu hissəciklərdən istifadə edərək spin aşkarlanması üçün həqiqətən böyük imkanlar var.

Tövsiyə: