Diody RGB z interfejsem szeregowym

W Nettigo pojawił się nowy wynalazek. Diody RGB z interfejsem szeregowym.

image

Mają one 5 mm średnicy, a ich największą zaletą jest to, że do uzyskania każdej barwy wystarczy jeden pin. To nie wszystko. Tym samym jednym pinem można sterować większą ilością diod.

Diody podłącza się w taki sposób:

image

Od strony płaskiego ścięcia obudowy piny mają następujące znaczenie:

  • Data Out – Wyjście danych. Podłączasz do Data In kolejnych diod, którymi chcesz sterować.
  • Ground – Masa. Podłączasz do GND w Arduino.
  • +5V – Zasilanie. Podłączasz do 5V w Arduino.
  • Data In – Wejście danych. Tu podłączasz dowolny pin cyfrowy Arduino.

Dla każdej barwy RGB (Czerwony, Zielony, Niebieski) dioda ma 256 poziomów jasności. Co daje możliwość uzyskania 16,8 mln barw.

Bibliotekę do sterowania diodami napisali pracownicy Adafruit. Jest ona łątwa w użyciu. Do działania wymaga kontrolera opartego na AVR (Arduino UNO, Leonardo, YUN, Mini Pro, Teensy 2.0, ATtiny) i Arduio IDE.

#include <Adafruit_NeoPixel.h>

#define PIN 2

Adafruit_NeoPixel lamp = Adafruit_NeoPixel(1, PIN, NEO_RGB + NEO_KHZ800);

void setup() {
  lamp.begin();
  lamp.show();
}

void loop() {
  lamp.setPixelColor(0, 0, 0, 0);
  lamp.show();
  delay(1000);
  lamp.setPixelColor(0, 255, 0, 0);
  lamp.show();
  delay(1000);
  lamp.setPixelColor(0, 0, 255, 0);
  lamp.show();
  delay(1000);
  lamp.setPixelColor(0, 0, 0, 255);
  lamp.show();
  delay(1000);
}

Wejście danych “Data In” diody podłączyłem do pinu 2 Arduino.
Program co sekundę świeci innym kolorem diody (Czerwonym, Zielonym i Niebieskim).

Adafruit_NeoPixel lamp = Adafruit_NeoPixel(1, PIN, NEO_RGB + NEO_KHZ800);

Tworzy obiekt “lamp” do sterowania diodami.
Pierwszym argumentem jest ilość diod podłączonych w szereg do sterowania. U mnie jest jedna dioda, więc jest tam wartość 1.

Drugim argumentem jest pin, którym sterujesz diodami. W moim przypadku jest to pin nr 2.

Trzecim argumentem jest konfiguracja podłączonych diod.

lamp.begin();

Ta metoda aktywuje działanie obiektu lamp.

lamp.setPixelColor(0, 0, 0, 0);

Ustawia kolor wybranej diody.
Pierwszym argumentem jest numer diody, której chcesz ustawić kolor. 0 to pierwsza dioda.

Argumenty 2, 3, 4 to jasność składowych kolorów R, G, B. Przjmują one wartości od 0 do 255.

lamp.show();

Ta metoda wysyła dane o ustawionych kolorach do diod.

W Nettigo diody sprzedajemy w zestawach po 5 sztuk. Są one w 2 wersjach. Z przeźroczystą obudową (świecą promieniem do przodu) i dyfuzyjne z obudową w kolorze mlecznym, która się rozświetla.

sprae

Licznik na przerwaniach

Wczoraj zamieściłem wpis “Najszybszy projekt na świecie”, w którym opisałem jak zbudować licznik do orbitreka. Michał poprosił w komentarzach, bym w celach edukacyjnych pokazał jak napisać taki licznik na przerwaniach.

Przerwanie – sygnał z urządzenia peryferyjnego, który powoduje zatrzymanie programu głównego i uruchomienie funkcji obsługującej przerwanie.

W Arduino wejścia przerwań są w pinach cyfrowych 2 i 3. W UNO przerwanie 0 jest w pinie 2, a przerwanie 1 w pinie 3. W Leonardo jest odwrotnie :-.

Do obsługi przerwań służy funkcja “attachInterrupt”

attachInterrupt(int, func, mode);

  • int – numer przerwania 0 lub 1 w zależności od pinu
  • func – nazwa fukcji obsługującej przerwanie
  • mode – ustala kiedy przerwanie ma być wywołane:
    LOW – kiedy na pinie jest stan niski;
    CHANGE – kiedy zmienia się stan;
    RISING – kiedy zmienia się stan z LOW na HIGH;
    FALLING – kiedy zmienia się stan z HIGH na LOW.

Program licznika z użyciem przerwania będzie wyglądał tak:

word steps;

void setup()
{
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, onStep, FALLING);
}

void loop()
{
}

void onStep()
{
  static unsigned long lastTime;
  unsigned long timeNow = millis();
  if (timeNow - lastTime < 50)
    return;
    
  steps++;
  Serial.println(steps);
  lastTime = timeNow;
}

Ustawiłem przerwanie nr 0 (pin 2 w UNO). Ma ono wywoływać funkcję “onStep”. Wywołanie nastąpi gdy stan na pinie zmieni się z HIGH na LOW.

Funkcja “onStep” zaczyna się od fragmentu eliminującego drgania styków.
Gdy włącznik (u nas kontaktron) zwiera styki, to przez ułamek sekundy one drgają. Te drgania mogą spowodować, że wywoła się kilka przerwań i funkcja zaliczy kilka kroków.
Dlatego początek sprawia, że pierwsze przerwanie będzie zaliczone, a każde kolejne przez 50 ms zostanie zignorowane jako drgania styków i nie zaliczy kroku.

Liczba kroków przechowywana jest jak poprzednio w zmiennej globalnej “steps”.

W funkcji “loop” możesz napisać dowolny fragment programu. Gdy pojawi się impuls na pinie 2, program w “loop” zostanie przerwany i wykonana zostanie funkcja “onStep”. Po jej zakończeniu program w “loop” zacznie pracę tam gdzie skończył.

Fragment eliminujący drgania styków działa tak:

Zmienna typu static przechowuje wartość nawet po wyjściu z funkcji. Na początku ma wartość 0. Po ponownym uruchomieniu funkcji będzie miała wartość taką, jaka była w niej ostatnio zapisana.
W tej zmiennej (“lastTime”) zapisany jest czas ostatniego wywołania przerwania.

W zmiennej “timeNow” zapisany jest aktualny czas,

Po odjęciu timeNow od lastTime uzyskujemy czas jaki upłynął w milisekundach od ostatniego przerwania.
Jeśli jest on mniejszy niż 50 ms, to wychodzimy z funkcji (return).

Jeśli czas jest większy niż 50 ms, zaliczany jest krok, wysyłany do Monitora portu szeregowego i zapisywany jest nowy czas ostatniego przerwania w zmiennej “lastTime”.

sprae

Adapter do programowania kontrolerów AVR

Jest bardzo tani (24 zł) programator kontrolerów AVR onazwie USBASP. Służy on do bezpośredniego programowania kontrolerów ATTiny i ATmega oraz naprawiania bootloadera Arduino.

Z jednej strony podłączasz go do komputera przez USB, a z drugiej przez specjalne złącze do kontrolera. To specjalne złącze sprawia wielu z was kłopot, ponieważ jest dość nietypowe. Nie jest jak ICSP w Arduino, ani wygodne jak gniazda goldpin z opisem.

Programatora nie zaprojektujemy od nowa bo raczej taniej nie wyjdzie, ale jest coś co ułatwi korzystanie z obecnego USBASP.

Jest to płytka adaprtera AVR ICSP. Z jednej strony ma miejsce na kłopotliwe gniazdo programatora. Z drugiej wychodzi standardowe złącze ICSP do którego można podłączyć bezpośrednio Arduino.

Wygodnym dodatkiem jest boczne złącze z opisanymi sygnałami. Pozwala łatwo podłączyć się bezpośrednio do programowanego kontrolera.

Do płytki trzeba wlutować wtyki goldpin do złącz ICSP i programatora.
W boczne złącze możesz wlutować wtyk goldpin i wpinać adapter bezpośrednio do płytki stykowej. Możesz też wlutować gniazdo goldpin i wpinać przewody bezpośrednio do adaptera.

sprae