İçindekiler:

ATtiny13 ve WS2812 ile 1$'lık LED Mood Lambası: 7 Adım
ATtiny13 ve WS2812 ile 1$'lık LED Mood Lambası: 7 Adım

Video: ATtiny13 ve WS2812 ile 1$'lık LED Mood Lambası: 7 Adım

Video: ATtiny13 ve WS2812 ile 1$'lık LED Mood Lambası: 7 Adım
Video: Плавное изменение цвета RGB светодиода от красного до фиолетового с помощью потенциометра и Ардуино 2024, Kasım
Anonim
ATtiny13 ve WS2812 ile 1 $ LED Mood Lambası
ATtiny13 ve WS2812 ile 1 $ LED Mood Lambası

Yazar arduinocelentanoTakip edinYazarın daha fazlası:

Tek Kartlı Bilgisayarda Kişisel CalDAV Sunucusu
Tek Kartlı Bilgisayarda Kişisel CalDAV Sunucusu
Tek Kartlı Bilgisayarda Kişisel CalDAV Sunucusu
Tek Kartlı Bilgisayarda Kişisel CalDAV Sunucusu
LCD İstilacılar: 16x2 LCD Karakter Ekranında Oyun Gibi Bir Uzay İstilacı
LCD İstilacılar: 16x2 LCD Karakter Ekranında Oyun Gibi Bir Uzay İstilacı
LCD İstilacılar: 16x2 LCD Karakter Ekranında Oyun Gibi Bir Uzay İstilacı
LCD İstilacılar: 16x2 LCD Karakter Ekranında Oyun Gibi Bir Uzay İstilacı
Octarine: WS2812 RGB LED'leri ile Renk Eşleştirme Oyunu
Octarine: WS2812 RGB LED'leri ile Renk Eşleştirme Oyunu
Octarine: WS2812 RGB LED'leri ile Renk Eşleştirme Oyunu
Octarine: WS2812 RGB LED'leri ile Renk Eşleştirme Oyunu

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

Yazılım Kurulumu
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ı

Mikrodenetleyicinin Programlanması
Mikrodenetleyicinin Programlanması
Mikrodenetleyicinin Programlanması
Mikrodenetleyicinin Programlanması
Mikrodenetleyicinin Programlanması
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: