LED na wieczór

dyi elektronika esp8266 mqtt 2017-08-06, 18:08,

Co można zrobić przeglądając szufladę? Np. oświetlenie przestrzeni za biurkiem. Podczas szukania czegoś w szufladzie znalazłem stary moduł z ESP8266 na pokładzie. To jeden z tych pierwszych, które miały 512kB pamięci programu i łącznie 8 wyprowadzeń, z czego dwa - GPIO0 i GPIO2 użyteczne do jakichkolwiek działań.

Tak się też złożyło, że miałem też pod ręką metr programowalnej taśmy LED z 16 układami WS2811 (tej konkretnej taśmy nikomu nie polecę, ze względu na koszmarny odcień niebieskiego - prawie UV oraz gigantyczną dysproporcję jasności między poszczególnymi kolorami składowymi). Do szczęścia brakowało już tylko małego zasilacza 12V i kawałka płytki, żeby to wszystko połączyć.

Jak działa taka taśma?

Zarówno taśmy sprzedawane pod nazwą NeoPixel, jak i różne chińskie odpowiedniki z układami WS2811/WS2812 działają w bardzo podobny sposób. Na każdej taśmie znajdują się trzy wyprowadzenia: + zasilania, masa (GND) oraz linia sterująca (Data IN). W zależności od wersji zasilanie wynosi 5V, 12V lub 24V. W moim przypadku jest to listwa 12V.

W wersjach WS2812 układ sterujący wbudowany jest w diodę LED. W takich taśmach sterowanie odbywa się indywidualnie każdym pikselem, te najczęściej zasilane są z 5V. Wersje 2811 składają się z osobnego układu sterującego, tu zwykle segment składa się z kilku diód, w moim przypadku 3. Oznacza to, że na 1 metrze mam 16 układów sterujących czyli mogę sterować szesnastoma segmentami, po 3 diody (około 6 cm segment).

A teraz jak to działa? Układ WS2811/2812 ma dwa wyprowadzenia sterujące. Data IN oraz Data OUT. Wyprowadzenie Data OUT podłączone jest do Data IN następnego układu, i tak dalej do końca taśmy. Wysyłając sygnał sterujący, wysyłamy kolejno 24 bity (po 8 bitów na kolor). Gdy układ odbierze pierwszą paczkę, a transmisja trwa dalej to bierze dla siebie pierwsze 24 bity, a pozostałe wysyła dalej na Data OUT. Kolejny układ robi to samo i w ten sposób można sterować niemal dowolnie długą sekwencją. Gdy tylko na chwilę nastąpi przerwa w transmisji układ odbierze to jako reset i kolejne bity potraktuje jako istotne dla siebie. Dlatego niezmiernie istotne jest, by wysłanie sekwencji bardzo rygorystycznie przestrzegało odstępów czasowych podanych w specyfikacji i w miarę możliwości odbywało się przy wyłączonych przerwaniach (to w szczególności na AVRach - pisząc w kodzie maszynowym można spokojnie działać przy taśmach 800 kHz i AVR na 8 MHz Internal RC).

Taśmy występują w kilku kolejnościach kolorów. Nie zawsze jest to RGB, w mojej kolejność jest BGR. Druga to częstotliwość transmisji. Na WS2811 najczęściej jest to 400 kHz, na WS2812 działa i 400 i 800 kHz, ale rzadko coś pomiędzy.

Decydując się na wybór taśmy warto wziąć pod uwagę ilość segmentów (im więcej tym więcej pamięci potrzebne będzie na przechowywanie ich stanu) oraz maksymalny prąd, potrzebny do ich zasilania. Taśmy na 12V i 24V mają mniejsze prądy przy tej samej mocy i tym samym mniejsze przekroje przewodów. Na taśmach 5V, szczególnie gęsto upakowanych, grubość przewodów i jakość zasilacza ma szczególne znaczenie.

Montowanie układu

Układ jest banalnie prosty. Bierzemy zasilanie 12V, podłączamy do złącza ARK. Wstawiamy przetwornicę 3V3/500mA Pololu, bezpiecznik littleFuse, ESP8266 i dwa przyciski. Jeden podłączony jest pod gniazdo RESET, drugi pod GPIO0. Do tego kilka goldpinów, żeby wyprowadzić sobie GND/RX/TX do zewnętrznego programatora i już można bawić się w Arduino. Natomiast pod GPIO2 idzie przewód sterujący sygnałem LED.

Programowanie

Na początek warto po prostu uruchomić układ. Do tego przyda się konwerter USB/TTL dla protokołu RS-232. Uwaga: koniecznie w wersji 3V. ESP8266 nie toleruje napięcia 5V i zastosowanie takiego układu natychmiast uszkodzi wejścia mikrokontrolera. Ze swojego doświadczenia polecam konwerter na układzie FTDI z legalnego źródła, nie są tanie (około 40zł), ale oszczędzi to później wielu problemów z programowaniem i kompatybilnością (układ działa dobrze zarówno w Windows 10 jak i macOS Sierra).

Do stworzenia tego prostego programu użyłem Arduino 1.6.6, Adafruit ESP8266 1.0.0 oraz Adafruit Neopixel 1.0.6. Zapewne przed dalszym rozwojem podbiję wersję aplikacji, ale do testów najlepiej mieć jak najmniej zmiennych.

A zatem co potrzeba? Kilka linijek kodu w sekcji setup(), które ustawią port szeregowy (dziwna prędkość 74880 bps to prędkość, na której działa bootloader układu ESP - warto z niej skorzystać, by wiedzieć, że z układem wszystko OK). Kolejne kilka funkcji ESP. odpowiada za szybkie sprawdzenie jaki mamy układ. Nie są potrzebne, ale dzięki temu sprawdziłem czy wszystko mam tak jak chciałem.

Następnie strip.begin() i strip.show() inicjują pasek zgaszonymi diodami. Wewnątrz pętli loop() co dwie sekundy zmienia się kolor paska (gradient od minimalnej do maksymalnej jasności, czerwony, zielony, niebieski). Jeśli kolejność barw nie jest taka, jak w pętli to należy poprawić linijkę, w której definiowany jest pasek i zmienić NEO_BRG na taką sekwencję, jak w posiadanej taśmie.


#include <adafruit_neopixel.h>

#define PIN 2 #define PIXELS 16 Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS, PIN, NEO_BRG + NEO_KHZ400);

void setup() {
  Serial.begin(74880);
  Serial.println(ESP.getChipId(), HEX);
  Serial.println(ESP.getFlashChipId(), HEX);

  Serial.println(ESP.getFlashChipSize());
  Serial.println(ESP.getFlashChipSpeed());

  strip.begin();
  strip.show();
  
}

void loop() {
  Serial.println("TICK-R");
  for (int i = 0 ; i < PIXELS; i++) {
    strip.setPixelColor(i, (i+1)*15, 0, 0);
  }
  strip.show();
  delay(2000);
  Serial.println("TICK-G");
  for (int i = 0 ; i < PIXELS; i++) {
    strip.setPixelColor(i, 0, (i+1)*15, 0);
  }
  strip.show();
  delay(2000);
  Serial.println("TICK-B");
  for (int i = 0 ; i < PIXELS; i++) {
    strip.setPixelColor(i, 0, 0, (i+1)*15);
  }
  strip.show();
  delay(2000);
}

To wszystko, mamy gotowy pasek do dalszych eksperymentów. Czas zamontować go za biurkiem, a później podłączyć do WiFi i zrobić jakieś sterowanie.

Komentarze

Podobne wpisy