Fantezi LED Şapka: 5 Adım (Resimlerle)
Fantezi LED Şapka: 5 Adım (Resimlerle)
Anonim
Image
Image
Fantezi LED Şapka
Fantezi LED Şapka

Her zaman bir Arduino projesi yapmak istemişimdir, ancak ailem süslü bir şapka partisine davet edilene kadar hiçbir zaman harika fikirlerim olmadı. İki haftalık teslim süresiyle, harekete duyarlı bir LED animasyon şapkasını hem planlayıp hem de uygulayabilir miyim diye merak ediyordum. Yapabileceğim ortaya çıktı! Muhtemelen biraz aşırıya kaçtım, ancak toplam proje maliyeti 80 dolar civarında. Deney ve biraz kodlama ile bunu daha ucuza yapabilirsiniz.

Şapkalı gol şuydu:

  1. Şapkanın ön ortasından arkaya doğru bir dizi ışık hareket ettirin, her iki tarafta bir ışık
  2. Şapkanın öne arkaya eğilmesiyle belirlenen ışığın hareket hızını değiştirin
  3. Şapka bandı aşağı doğru eğildiğinde ışıkların tersine dönmesine izin verin (yani, yerçekiminin ışıklar üzerindeki etkisini taklit edin)
  4. Şapkanın soldan sağa eğimine göre rengi değiştirin
  5. Şokları hissedin ve özel bir efekt gösterin
  6. Kullanıcının döndüğünü hissedin ve özel bir efekt sergileyin
  7. Tamamen şapkanın içinde olsun

Adım 1: Gerekli Parçalar

Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar
Gerekli Parçalar

Aşağıdaki ana bileşenleri kullandım (bağlı olmayan Amazon bağlantıları dahil):

  • Teensy LC mikrodenetleyici - Küçük boyutu ve LED'lerimi kontrol etmek için özel bir bağlantısının yanı sıra güçlü kütüphane ve topluluk desteği nedeniyle normal bir Arduino yerine bunu seçtim.
  • Bosch BNO055 tabanlı konumsal sensör - dürüst olmak gerekirse, belgeleri bulduğum ilklerden biri. Çok daha ucuz seçenekler var, ancak Bosch'u bir kez anladığınızda, sizin için aksi takdirde kodda yapmanız gereken çok şey var.
  • WS2812 adreslenebilir LED şerit - Metre başına 144 LED ile 1 metrelik bir uzunluk seçtim. Bu yoğunluğa sahip olmak, ışığın tek tek öğelerin sırayla yanmasından ziyade hareket ediyormuş gibi görünmesine yardımcı olur.

Ve aşağıdaki küçük bileşenler:

  • Bir şapka - şapka bandı olan herhangi bir şapka yapacaktır. Bu yerel bir mağazadan 6 dolarlık bir şapka. Arkasında bir dikiş varsa, kabloları geçirmek daha kolay olacaktır. Şapka bandının yapıştırılıp yapıştırılmadığına dikkat edin, bu da ekstra zorluklara neden olacaktır. Bu, üst kısım boyunca dikilir, ancak alt kısım kolayca yukarı çekilir.
  • 4.7K ohm dirençler
  • 3x AAA pil kutusu - 3 adet AAA pil kullanmak, voltajı tam olarak elektroniklerin istediği aralıkta verir, bu da işleri kolaylaştırır. AAA, bir şapkaya AA'dan daha kolay sığar ve yine de harika bir çalışma süresine sahiptir.
  • Küçük ölçü teli - Daha önceki bir LED projesinden aldığım sağlam bir tel kullandım.
  • Havya ve lehim
  • Şapkanın iç rengine uyan bir miktar spandeks ve iplik

Önerilen, ancak isteğe bağlı:

  • Akü kabloları için hızlı konektörler
  • Yardımcı Eller aracı, bu şeyler çok küçük ve lehimlenmesi zor

Adım 2: Şapkayı Değiştirin

Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir
Şapkayı Değiştir

Elektroniği monte etmek için şapkada bir yere ve pil için bir yere ihtiyacınız olacak. Karım profesyonel olarak giyimle çalışıyor, bu yüzden ondan tavsiye ve yardım istedim. Spandex ile iki cep oluşturduk. Öne doğru ilk küçük cep, şapkanın kendisi gibi işaret edilmiştir, böylece elektronikler takıldığında konum sensörü oldukça iyi tutulur, ancak gerekirse kolayca çıkarılabilir. Arkaya doğru ikinci cep, pil takımını yerinde tutmak içindir.

Cepler, şapkanın rengine uygun iplikle dikildi, hepsi taç çizgisi boyunca. Şapkanın modeline ve malzemesine bağlı olarak bu teknikle YMMV'den yapılır.

Ayrıca şapka bandının bir tarafta kendi içine kapandığını ve o konumda şapkaya tamamen dikildiğini keşfettik. Bandın altındaki LED'leri çalıştırmak için orijinal dikişi çıkarmak zorunda kaldık. Yapım sırasında pimlerle yerinde tutuldu ve tamamlandığında uygun iplikle dikildi.

Sonunda bantla kaplı olan şapkanın arkasındaki dikişi açtık. LED'lerle birlikte gelen kablo demetini bu dikişe soktuk ve şeritteki ilk LED'i dikişin tam üzerine gelecek şekilde sıraladık. Daha sonra LED'leri şapkanın etrafına sardık ve şeridi kestik, böylece son LED ilkinin hemen yanında olacaktı. LED şerit sadece şapka bandı ile yerinde tutulabilir, ancak bandınıza ve malzemenize bağlı olarak LED'leri dikerek veya yapıştırarak sabitlemeniz gerekebilir.

Adım 3: Bağlayın

Bağla
Bağla

Teensy kartı ve LED'ler, güç için 3.3v ila 5v arasında herhangi bir yerde çalışacaktır. Bu yüzden 3 adet AAA pil kullanmayı seçtim, 4.5v çıkış voltajı güzel bir şekilde bu aralıkta ve LED'leri programladığım şekilde çalışacak şekilde çok fazla çalışma süresine sahipler. 8 saatten fazla çalışma süresi elde edebilmelisiniz.

Gücü kablolamak

Pil kutusundan ve LED'lerden gelen pozitif ve negatif uçları birbirine bağladım, ardından Teensy'ye uygun yerlere lehimledim. Pilden gelen artı, şemada Teensy'nin sağ üst pimine (tahtada Vin etiketli) bağlanmalıdır ve negatif, GND etiketli herhangi bir pime bağlanabilir. Elverişli bir şekilde, doğrudan kartın karşı tarafında veya Vin pininin hemen yanında bir tane bulunur. Kart için tam pinout şeması bu sayfanın altında bulunabilir. Ve bazı durumlarda, tahtayı sipariş ettiğinizde bir kağıt kopyası dahil edilir.

Tek seferde yalnızca birkaç LED'i açık olan bir kod çalıştırmayı planlıyorsanız, LED'leri 3.3v çıkış ve GND kullanarak Teensy'nin kendisinden çalıştırabilirsiniz, ancak çok fazla güç çekmeye çalışırsanız yapabilirsiniz. tahtaya zarar verir. Bu nedenle, kendinize en fazla seçeneği sunmak için LED'leri doğrudan pil kaynağınıza bağlamak en iyisidir.

LED'lerin kablolanması

Adreslenebilir LED'leri bağlamayı çok daha kolay hale getiren bir pimi olduğu için bu proje için Teensy LC'yi seçtim. Kartın alt kısmında, soldan ikinci olan pin, Pin #17'yi yansıtır, fakat aynı zamanda üzerinde 3.3v vardır. Buna pull-up denir ve diğer kartlarda bu voltajı sağlamak için bir direnç bağlamanız gerekir. Teensy LC durumunda, bu pimden doğrudan LED'lerinizin veri kablosuna kablo bağlayabilirsiniz.

Konum sensörünü kablolama

Mevcut BNO055 kartlarından bazıları voltaj konusunda çok daha katıdır ve sadece 3.3v ister. Bu nedenle, sağdaki 3. pin olan Teensy'deki özel 3.3v çıkışından BNO055 kartındaki Vin'i bağladım. Daha sonra BNO055'teki GND'yi Teensy'deki herhangi bir GND'ye bağlayabilirsiniz.

BNO055 konum sensörü, Teensy ile konuşmak için I2c'yi kullanır. I2c pull-up gerektiriyor, bu yüzden Teensy'deki 3.3v çıkıştan iki adet 4.7K ohm'luk direnci 18 ve 19 numaralı pinlere bağladım. Daha sonra pin 19'u BNO055 kartındaki SCL pinine ve 18'i de SDA pinine bağladım.

Kablolama ipuçları/püf noktaları

Bu projeyi yapmak için çok telli yerine sağlam tel kullandım. Katı telin bir avantajı, bunun gibi prototip panolara lehimleme yapmaktır. Bir miktar kabloyu soyabilir, 90 derece bükebilir ve terminallerden birinin altından geçirebilirsiniz, böylece kablonun kesik ucu tahtanızın üzerine yapışır. Daha sonra terminale tutturmak için sadece az miktarda lehime ihtiyacınız var ve fazlalığı kolayca kesebilirsiniz.

Katı tel, büküldüğü gibi kalmak isteme eğiliminde olduğu için çalışmak daha zor olabilir. Ancak bu proje için bu bir avantajdı. Tellerimi, ince ayar ve programlama için elektronik aksamları şapkaya takıp çıkarırken konum sensörünün oryantasyonu tutarlı olacak şekilde kestim ve şekillendirdim.

Adım 4: Programlama

Artık her şey monte edildiğine göre, Arduino uyumlu bir programlama aracına ihtiyacınız olacak. Gerçek Arduino IDE'yi kullandım (Linux, Mac ve PC ile çalışır). Teensy kartı ile arayüz oluşturmak için Teensyduino yazılımına da ihtiyacınız olacak. Bu proje, LED'lerin renk ve konum programlamasını yapmak için FastLED kitaplığını yoğun olarak kullanıyor.

kalibrasyon

Yapmak isteyeceğiniz ilk şey, Kris Winer'ın BNO055 için mükemmel GitHub deposuna gitmek ve onun BNO_055_Nano_Basic_AHRS_t3.ino taslağını indirmek. Bu kodu Seri Monitör çalışırken yükleyin ve size BNO055 kartının düzgün bir şekilde çevrimiçi olup olmadığını ve kendi testlerini geçip geçmediğini söyleyecektir. Ayrıca, daha sonra size daha tutarlı sonuçlar verecek olan BNO055'in kalibrasyonunda size yol gösterecektir.

Süslü LED çizimine başlarken

Fantezi LED şapkasının kodu özel olarak ekli ve ayrıca GitHub depomda. Kodda daha fazla değişiklik yapmayı planlıyorum ve bunlar GitHub deposunda yayınlanacak. Buradaki dosya, bu Eğitilebilir Tablo yayınlandığındaki kodu yansıtır. Krokiyi indirip açtıktan sonra, değiştirmeniz gereken birkaç şey var. Değiştirilecek önemli değerlerin çoğu, #define ifadeleri olarak en üsttedir:

Satır 24: #define NUM_LEDS 89 - bunu LED şeridinizdeki gerçek LED sayısıyla değiştirin

Satır 28: #define SERIAL_DEBUG false - seri monitörde çıktıyı görebilmek için muhtemelen bunu doğru yapmak isteyeceksiniz

Konum algılama kodu

Konum algılama ve ince ayarlarınızın çoğu 742 satırından başlar ve 802'den geçer. Konum sensöründen Pitch, Roll ve Yaw verilerini alır ve değerleri ayarlamak için kullanırız. Elektroniklerinizin nasıl monte edildiğine bağlı olarak bunları değiştirmeniz gerekebilir. Konum sensörünü çip şapkanın üst kısmına bakacak şekilde takarsanız ve tahtada yazılı olan X'in yanındaki ok şapkanın ön tarafını gösterecek şekilde takarsanız, aşağıdakileri görmelisiniz:

  • Pitch başını sallıyor
  • Rulo başınızı eğiyor, örn. kulağını omzuna dokun
  • Yaw, hangi yöndür. (Kuzey, Batı, vb.)

Tahtanız farklı bir yönde monte edilmişse, istediğiniz gibi davranmaları için Pitch/Roll/Yaw'ı değiştirmeniz gerekecektir.

Rulo ayarlarını düzenlemek için aşağıdaki #define değerlerini değiştirebilirsiniz:

  • ROLLOFFSET: Şapkanız sabit ve olabildiğince ortalanmış durumdayken, Rulo 0 değilse, bunu farkla değiştirin. yani Şapkanız ortalandığında -20'de Yuvarlanma görüyorsanız, bunu 20 yapın.
  • ROLLMAX: Rulo ölçümü için kullanılacak maksimum değer. Şapkayı takarak ve sağ kulağınızı sağ omzunuza doğru hareket ettirerek bulmak en kolayı. Seri monitörü kullanırken bunu yapmak için uzun bir USB kablosuna ihtiyacınız olacak.
  • ROLLMIN: Başınızı sola eğdiğinizde, Yuvarlanma ölçümü için kullanılacak en düşük değer

Benzer şekilde, Pitch için:

  • MAXPITCH - ararken maksimum değer
  • MINPITCH - aşağı baktığınızda minimum değer
  • PITCHCENTER - dümdüz ileriye baktığınızda perde değeri

Dosyanın en üstünde SERIALDEBUG'u true olarak ayarlarsanız, bu değerlerin ayarlanmasına yardımcı olmak için seri monitöre Roll/Pitch/Yaw çıkışı için geçerli değerleri görmelisiniz.

Değiştirmek isteyebileceğiniz diğer parametreler

  • MAX_LED_DELAY 35 - LED parçacığının hareket edebileceği en yavaş. Bu milisaniye cinsindendir. Dizedeki bir LED'den diğerine geçme gecikmesidir.
  • MIN_LED_DELAY 10 - LED parçacığının hareket edebildiği oruç. Yukarıdaki gibi milisaniye cinsindendir.

Çözüm

Bu kadar ileri gittiyseniz, tamamen işlevsel ve eğlenceli bir LED şapkanız olmalı! Bununla daha fazlasını yapmak istiyorsanız, sonraki sayfada ayarları değiştirme ve kendi işlerinizi yapma konusunda bazı gelişmiş bilgiler bulunmaktadır. yanı sıra kodumun geri kalanının ne yaptığına dair bir açıklama.

Adım 5: Gelişmiş ve İsteğe Bağlı: Kodun İçinde

Darbe ve dönüş algılama

Darbe/dönüş algılama, BNO055'in yüksek G sensör işlevleri kullanılarak yapılır. initBNO055() içinde aşağıdaki satırlarla hassasiyetini ayarlayabilirsiniz:

  • Satır #316: BNO055_ACC_HG_DURATION - etkinliğin ne kadar sürmesi gerekiyor
  • Satır #317: BNO055_ACC_HG_THRESH - etkinin ne kadar sert olması gerektiği
  • Satır #319: BNO055_GYR_HR_Z_SET - dönüş hızı eşiği
  • Satır #320: BNO055_GYR_DUR_Z - rotasyonun ne kadar sürmesi gerektiği

Her iki değer de 8 bit ikili, şu anda etki, 255 üzerinden 192 olan B11000000 olarak ayarlanmıştır.

Bir darbe veya dönüş algılandığında BNO055, kodun Döngünün hemen başında aradığı bir değeri ayarlar:

// Yüksek G bayt nedeniyle tetiklenen kesmeleri algıla intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { etki(); } else if(intStatus > 0) { spin(); }

Çarpma davranışını değiştirmek için kodda yukarıdaki void effect() satırını veya dönüş davranışını değiştirmek için void spin() satırını arayın.

yardımcılar

Tüm LED'leri hızlı bir şekilde tek bir renge ayarlamak için basit bir yardımcı işlev (void setAllLeds()) oluşturdum. Biri hepsini kapatmak için kullanın:

setAllLeds(CRGB::Siyah);

Veya FastLED kitaplığı tarafından tanınan herhangi bir rengi seçebilirsiniz:

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

Ayrıca tüm LED'leri %25 oranında karartan bir fadeAllLeds() işlevi vardır.

Parçacık sınıfı

Kablolamayı büyük ölçüde basitleştirmek için tek bir LED dizisi kullanmak istedim, ancak birden çok dizi gibi davranmalarını istedim. Bu benim ilk denemem olduğu için mümkün olduğunca basit tutmak istedim, bu yüzden bir dizeyi iki olarak ele aldım, ortadaki LED(ler) oradayken bölünme olurdu. Çift veya tek sayı olabileceğinden, bunu hesaba katmamız gerekiyor. Bazı global değişkenlerle başlıyorum:

/* * LED'ler için değişken ve kaplar */ CRGB led'leri[NUM_LEDS]; statik imzasız int curLedDelay = MAX_LED_DELAY; statik int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2;static bool tek LED'ler = 0; statik bool parçacıkDir = 1; static bool speedDir = 1;unsigned long dirCount; imzasız uzun hueCount;

Ve setup() içindeki bazı kodlar:

if(NUM_LEDS % 2 == 1) { tek LED'ler = 1; maxLedPos = NUM_LEDS/2; } else { tek LED'ler = 0; maxLedPos = NUM_LEDS/2 - 1; }

Tek sayılarımız varsa, 1/2 noktayı orta olarak kullanmak istiyoruz, aksi takdirde 1/2 nokta - 1'i istiyoruz. Bunu 10 veya 11 LED ile görmek kolaydır:

  • 11 LED: 11/2 tamsayılı 5 olarak değerlendirilmelidir ve bilgisayarlar 0'dan sayar. Yani 0 - 4 bir yarım, 6 - 10 diğer yarım ve 5 bunların arasındadır. Bu durumda #5'e her ikisinin de parçasıymış gibi davranırız, yani her iki sanal LED dizisi için # 1'dir.
  • 10 LED: 10/2 5. Ama bilgisayarlar 0'dan sayıldığı için birini çıkarmamız gerekiyor. O zaman bir yarı için 0 - 4 ve diğeri için 5 - 9 var. İlk sanal dize için #1, 4 olacak ve ikinci sanal dize için #1, #5 olacaktır.

Ardından parçacık kodumuzda, genel konumumuzdan LED dizisindeki gerçek konumlara kadar bir miktar sayma yapmak zorundayız:

if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; }

Kod ayrıca parçacığın yön değiştirebileceği koşullara sahiptir, bu yüzden bunu da hesaba katmalıyız:

if(particleDir) { if((currPos == NUM_LEDS/2) && oddLeds){ currPos = 0; } else if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){ currPos = 0; } başka { currPos++; } } else { if((currPos == 0) && oddLeds){ currPos = centerLed; } else if((currPos == 0) && (!oddLeds)){ currPos = centerLed - 1; } başka { currPos--; } }

Bu nedenle, daha sonra hangi LED'in yakılması gerektiğini hesaplamak için amaçlanan yönü (particleDir) kullanırız, ancak LED dizisinin gerçek ucuna mı yoksa aynı zamanda bir son olarak işlev gören merkez noktamıza mı ulaştığımızı da düşünmeliyiz. sanal dizelerin her biri.

Bunların hepsini çözdükten sonra, bir sonraki ışığı gerektiği gibi yakarız:

if(particleDir) { if(oddLeds) { Pos1 = centerLed + currPos; Pos2 = centerLed - currPos; } else { Pos1 = centerLed + currPos; Pos2 = (centerLed -1) - currPos; } } else { if(oddLeds) { Pos1 = centerLed - currPos; Pos2 = centerLed + currPos; } else { Pos1 = centerLed - currPos; Pos2 = (centerLed -1) + currPos; } } ledler[Pos1] = CHSV(currHue, 255, 255); led'ler[Pos2] = CHSV(currHue, 255, 255); FastLED.göster();}

Neden bunu bir sınıf haline getiriyorsun? Olduğu gibi, bu oldukça basittir ve gerçekten bir sınıfta olması gerekmez. Bununla birlikte, aynı anda birden fazla parçacığın oluşmasına izin vermek için kodu güncellemek ve diğerleri ilerlerken bazılarının tersine çalışmasını sağlamak için gelecekteki planlarım var. Birden fazla parçacık kullanarak spin tespiti için gerçekten harika olasılıklar olduğunu düşünüyorum.