İçindekiler:
Video: ATtiny13 ve WS2812 ile 1$'lık LED Mood Lambası: 7 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:16
Yazar arduinocelentanoTakip edinYazarın daha fazlası:
Bu, dört modu olan düşük maliyetli bir ruh hali lambasıdır.
1. Gökkuşağı kıvılcımı. Bir ışık kıvılcımı zaman zaman yukarı doğru hareket eder ve yavaş yavaş rengi değiştirir.
2. Gökkuşağı parıltısı. Rengi kademeli olarak değiştiren sabit bir parıltı.
3. Mum ateşi simülasyonu.
4. Kapalı.
Üstteki bir dokunmatik düğmeye dokunarak modlar arasında geçiş yapabilirsiniz. Geçerli mod, kapatıldıktan sonra EEPROM belleğine kaydedilir.
ATtiny13 ne kadar küçük?
Fikir, bu küçük mikro denetleyicinin ucuna yakın bir proje olan otomatik anahtar veya termometreden daha karmaşık bir şey olan minimum donanımdan maksimum özellikleri elde etmekti. Ne de olsa kısıtlamalar yaratıcı düşünmenizi sağlıyor, değil mi? Eh, başlangıçta öyle görünüyordu.
Bu projedeki en zorlu şey, tüm kodu ATtiny13'e aktarmaktı. Mikrodenetleyicide 1K bayt flash ve sadece 64 bayt RAM bulunur. Evet, bayt derken sekiz bitten oluşanları kastediyorum. Tüm yerel değişkenleriniz ve çağrı yığınınız için 64 bayt. Açıklığa kavuşturmak için 8 RGB LED'i kontrol etmemiz gerektiğini düşünün. Her biri 3 bayt ile tanımlanır (sırasıyla kırmızı, yeşil ve mavi kanal için). Bu nedenle, sadece 8 LED'in durumunu saklamak için, her biri 3 baytlık 8 yapıdan oluşan bir dizi uygulamamız gerekecek ve bu dizinin başlangıcına bir işaretçi bir bayt daha alacaktır. Böylece 64 bayttan 25'i bitti. Az önce RAM'in %39'unu kullandık ve henüz başlamadık. Ek olarak, yedi temel gökkuşağı rengini saklamak için 7×3 = 21 bayta ihtiyacınız olacak, yani RAM'in %72'si bitmiş. Temel renklere gelince, abartıyorum: RAM'de hepsine aynı anda ihtiyacımız yok ve asla değişmezler, bu nedenle RAM yerine flash'ta saklanacak sabit bir dizi olarak uygulanabilirler. Her neyse, kullanılmış donanım hakkında genel bir izlenim veriyor.
Knuth'un erken optimizasyon hakkındaki ifadesini hatırlayarak, ne olduğunu görmek için üç lamba modunu ayrı ayrı prototiplemeye başladım. Düzgün çalıştıklarından ve her birinin mikro denetleyicime uyduğundan emin olmak için bunları ayrı ayrı test ettim. Bunu başarmak birkaç akşam sürdü ve her şey yolunda gitti… ta ki onları switch deyiminde bir araya getirmeye çalışana kadar. avr-size yardımcı programı 1,5 Kb metin bölümü boyutu bildirdi (avr-gcc'nin -s bayrağıyla). O anda asıl niyetim 2Kb flash ile biraz ATtiny25 almaktı ve bu hikayenin mutlu sonu olabilirdi.
Ama bir şekilde, önemli bir optimizasyondan sonra bu berbat kodu 1Kb'ye küçültmeyi başarabileceğimi hissettim. Ancak, bunun imkansız olduğunu anlaması bir hafta daha aldı ve bunu başarmak bir hafta daha aldı. Bir gökkuşağını beş temel renge kesmem gerekiyordu (önemli bir görsel fark olmadan). Vaka ifadelerinden kurtuldum ve ikili kod boyutunu azaltmak için bir if-then-if zinciri kullandım. Yangın animasyonu, oldukça hantal olan bir sözde rasgele sayı üretecine ihtiyaç duyuyor, bu yüzden sabit başlangıç değerine sahip basitleştirilmiş bir LFSR sürümü uyguladım. PRNG'nin tam döngü uzunluğunu umursamıyorum ve sadece kod boyutu ile “gerçekçi ateş animasyonu” arasında bir iniş dengesi arıyorum. Ayrıca şu anda hatırlayamadığım birçok küçük optimizasyonu da uyguladım ve hatta ateş dışındaki tüm modları çipe flaş etmeyi başardım. Fikirlerim bittiğinde, toplam kodum yaklaşık 1200 bayttı.
Zaman aşımına uğradım ve AVR kod optimizasyonu hakkında çok şey okudum. Montaj dilinde her şeyi bırakıp yeniden yazmaya yakındım ama ona son şansı verdim. Son optimizasyon acelesi sırasında, bir gökkuşağını üç temel renge böldüm ve diğerlerinin anında hesaplanmasını sağladım, her şeyi inceledim ve AVR optimizasyon önerilerini takip ettim ve nihayet…
avrdude: flaş yazma (1004 bayt):
Yazma | ################################################# | %100 0.90s
Mevcut modu depolamak için neredeyse tüm RAM'i ve sadece bir bayt EEPROM kullandığımı söylemeye gerek yok. Bunun ideal ve nihai bir uygulama olduğunu ima etmiyorum. Sadece çalışır ve mikrodenetleyiciye uyar. Eminim, daha iyisini yapabilirsin. Ben gerçekten. Ben sadece başlangıçta neredeyse imkansız olduğunu düşündüğünüz, görünüşte pratik olmayan bir problemi çözmenin eğlencesini paylaşmak istiyorum. “Dolayısıyla, bilgisayar korsanlığı, mümkün olanın sınırlarını keşfetmek anlamına gelir…” --Richard Stallman.
Gereçler:
1x ATtiny13 MCU (0,28 ABD doları = SOP-8 paketindeki MCU için 0,24 ABD doları ve DIP8 Adaptörü için 0,04 ABD doları)
8x WS2812 RGB LED'ler (Bir tahta veya bir parça LED şerit öneririm) (0,42 $)
1x TTP223 Dokunmatik düğme (0,10 $)
1x Mikro USB - DIP Adaptörü (0,14 $)
1x 10kΩ direnç (<0.01$)
1x 100nF seramik kapasitör (<0.01$)
1x 10-47µF elektrolitik kapasitör (<0.01$)
Toplam <0,97$
Adım 1: Yazılım Kurulumu
Kaynak kodunu derlemek için avr-gcc araç zincirine ve mikro denetleyicinin ROM'unu yüklemek için avrdude yardımcı programına ihtiyacınız olacak. Yükleme işlemi oldukça basit ve anlaşılırdır, ancak işletim sisteminize bağlıdır. Bir tür GNU/Linux kullanıyorsanız, muhtemelen depo ağacınızda uygun paketlere zaten sahipsinizdir. Bu projenin kaynak kodu buradan indirilebilir:
github.com/arduinocelentano/t13_ws2812_lamp
Ayrıca bir light_ws2812 kitaplığına da ihtiyacınız olacak:
github.com/cpldcpu/light_ws2812
avr-gcc araç zincirine ve proje kaynaklarına sahip olduğunuzda, terminalinizi çalıştırın ve aşağıdaki kodu yazın:
cd yolu/projesi/projesi
Yapmak
Adım 2: Mikrodenetleyicinin Programlanması
Bir çeşit USBASP programlayıcınız varsa, pin çıkışına göre Attiny'ye bağlamanız yeterlidir. Genellikle böyle görünür ama gerçek pinout'unuzu kontrol etmenizi şiddetle tavsiye ederim!
Alternatif olarak, bir Arduino kartını programcı olarak kullanabilirsiniz. Arduino IDE'yi açın ve “Dosya→Örnekler” menüsünde Arduino ISP örneğini bulun. Krokiyi yükledikten sonra Arduino kartınız bir programcı görevi görür. Çizim kodundaki yorumlar, size pinout için bir ipucu verecektir.
Şimdi koş
flaş yapmak
MCU'yu flaş etmek ve
sigorta yapmak
sigorta bitlerini ayarlamak için.
3. Adım: Şemalar
Önerilen:
14 $'lık Sofistike Kahve Öğütücü Zamanlayıcı: 6 Adım
14 Dolarlık Sofistike Kahve Öğütücü Zamanlayıcısı: Bu proje, birkaç yıl önce yayınladığım 7 Dolarlık Kahve Öğütücü Zamanlayıcı Ders Kitabımın bir ilerlemesidir. Zaman geçtikçe daha sofistike bir kahve değirmeni ihtiyacı da artıyor. Son Eğitilebilirlik'te belirttiğime benzer şekilde, bunun amacı
Ios ve Android için 15 $'lık Uzaktan Kumandalı ESP8266 Robot Uşak / Araba / Tank Yapın: 4 Adım
Ios ve Android için 15 $'lık Uzaktan Kumandalı ESP8266 Robot Uşak / Araba / Tank Yapın: Atıştırmalık almak için mutfağa yürümekten nefret ediyor musunuz? Ya da yeni bir içki almak için? Bunların hepsi bu basit 15 dolarlık uzaktan kumandalı uşak ile düzeltilebilir. Daha ileri gitmeden önce şu anda ses kontrollü bir RGB led şerit için bir Kickstarter projesi yürütüyorum
M5stick-C ile Neopixel Ws2812 Gökkuşağı LED Glow - Rainbow'u Arduino IDE Kullanarak M5stack M5stick C Kullanarak Neopixel Ws2812 Üzerinde Çalıştırmak: 5 Adım
M5stick-C ile Neopixel Ws2812 Gökkuşağı LED Glow | Rainbow'u Neopixel Ws2812'de M5stack M5stick C Kullanarak Arduino IDE Kullanarak Çalıştırmak: Merhaba arkadaşlar bu talimatta Arduino IDE ile neopixel ws2812 LED'lerini veya led şerit veya led matrisi veya led halkayı m5stack ile m5stick-C geliştirme kartını nasıl kullanacağımızı öğreneceğiz ve bunu yapacağız. onunla bir gökkuşağı deseni
Video ve Fotoğraflar için 2$'lık LED Kamera Işığı: 11 Adım
Video ve Fotoğraflar için 2$'lık LED Kamera Işığı: GÜNCELLEME: 180 lümenli yeni ve geliştirilmiş bir sürümüm var Dijital kameralar iyi video çektiğinden beri DV video kameramı taşımayı bıraktım ve bunun yerine birkaç dakika sürecek dijital kameramı kullan ve çek MOV veya MPG videosu burada ve t
Mini LED Başucu Gece Lambası / Lambası: 5 Adım
Mini LED Başucu Gece Lambası / Lamba: Öncelikle, bunun Sunbanks'ın Mini ayaklı LED lambasından ilham aldığını söylemeliyim. Led'i masadan uzak tutmak için bir kalem kullanmak yerine, ışığı tabandan yansıtmak için biraz şeffaf perspeks kullandım. Bu küçük proje bir prototip