Malina w klawiaturze

Mechaniczne klawiatury starych komputerów przeżywają swój renesans. Są solidne, wygodne, delikatne w nacisku i fajnie pstrykają, dając satysfakcję szybkiego pisania.
Zjawisko to ma na tyle dużą skalę, że dzisiejsi producenci wznawiają produkcję mechanicznych klawiatur w nowej, dość pokracznej formie dla graczy lub minimalistycznej dla programistów. Ich użytkownicy jak za dawnych czasów licytują się na to, które mikroprzełaczniki klawiszy są najlepsze.

Stare klawiatury mają często nietypowe złącza do podłączenia komputera. Ten problem można łatwo rozwiązać korzystając z płytek kontrolerów. Najlepsze do tego celu będą Arduino Pro Micro, Arduino Leonardo lub Teensy. Wszystko to dlatego, ponieważ te płytki mają w swoich kontrolerach sprzętową obsługę standardu USB. Ta obsługa zapewnia im możliwość udawania różnych urządzeń w tym i klawiatury.

Jeśli jesteś wielbicielem 8 bitowych komputerów, ich klawiatury możesz też w podobny sposób podłączyć do współczesnego komputera. Ba, nawet zmieścić cały nowoczesny komputer w ich obudowie.
Teensy pozwala też na łatwą emulację przez USB urządzeń typu HID. W ich skład wchodzą różnego rodzaju kontrolery gier. Dzięki tej właściwości możesz podłączyć do komputera stary Joystick typu Atari lub pady od NES zwanego u nas “Pegazusem”. Dzięki emulatorom można z takim urządzeniem zagrać w stare gry jak dawniej.

Ezra Hilyer – właściciel bloga StrayPoetry.com postanowił połączyć te wszystkie pomysły w jeden. Umieścił Raspberry Pi w przestronnej obudowie starej klawiatury Apple. Jej nietypowe sygnały zamienił na standard USB za pomocą Arduino Pro Micro. Od teraz klawiatura ta pełni rolę komputera, który wystarczy podłączyć do monitora oraz internetu i cieszyć się wygodnym pisaniem.

Cały przebieg prac nad zamianą klawiatury w komputer przeczytacie na blogu autora:

Jeśli chodzi o przerabianie starych klawiatur, to najtrudniejszą sprawą jest rozgryzienie ich wtyczki oraz protokołu komunikacyjnego. Pewnie o większości można łatwo znaleźć coś w internecie lub na postawie sygnałów samemu dojść rozwiązania.

Od strony emulacji klawiatury USB przez Arduino i Teensy sprawa jest prosta. Mamy globalny obiekt Keyboard, w którym wywołujemy metody “press” [wciśnięcie klawisza] i “release” [puszczenie klawisza] :

// Wysłanie naciśnięcia klawisza lewej strzałki

Keyboard.press(KEY_LEFT_ARROW);

// Puszczenie klawisza lewej strzałki

Keyboard.release(KEY_LEFT_ARROW);

Spis kodów klawiszy sterujących znajduje się na stronie Arduino:

Tradycyjne znaki – litery, cyfry i inne znaki wysyła się jako typ char:

// Wysłanie wciśnięcia klawisza “n”

Keyboard.press(‘n’);

// Wysłanie puszczenia klawisza “n”

Keyboard.release(‘n’);

Opis biblioteki klawiatury znajdziesz na stronie Arduino:

Tym samym sposobem możesz za pomocą Arduino wysyłać kody klawiszy do gier lub programów w reakcji na jakieś zdarzenie. Możesz zbudować wirtualny pulpit samolotu z przyciskami podłączonymi do pinów Arduino, które zamieni ich wciśnięcia na wciśnięcia kombinacji klawiszy.

Opis biblioteki emulacji kontrolerów gier znajdziesz na stronie Teensy:

Klon Arduino Pro Micro, Arduino Leonardo i Teensy możesz kupić w Nettigo:

sprae

light_ws2812 – Nowa biblioteka do obsługi sterowanych szeregowo LED-ów

W Nettigo mamy dostępne LED-y RGB sterowane interfejsem szeregowym. Można za pomocą jednego cyfrowego pinu kontrolera sterować całym szeregiem takich diod i ustawiać każdej niezależnie kolor z 24 bitowej palety (17 mln barw).

image

Mamy też całą taśmę takich lampek LED. W jednym metrze mieści się ich 60. Taśma jest w osłonie wodoodpornej.

image

Myślę, że to fajny element zestawu majsterkowicza DIY do przyozdobienia domu lub choinki na święta z własnym niepowtarzalnym schematem świecenia.

Piszę o nich ponownie, gdyż pojawiła się nowa lepsza biblioteka do sterowania tymi lampkami. Nazywa się “light_ws2812” i dostępna jest w serwisie Github.

Biblioteka obsługuje procesory ARM, ATtiny oraz platformę Arduino.

Oto przykład jej zastosowania na platformie Arduino:

#include <WS2812.h>

WS2812 LED(1);
	
cRGB color;

void setup() {
  LED.setOutput(9);
}

void loop() {
  color.r = 255;
  color.g = 0;
  color.b = 0;
  LED.set_crgb_at(0, color);
  LED.sync();
  delay(500);
  
  color.r = 0;
  color.g = 255;
  color.b = 0;
  LED.set_crgb_at(0, color);
  LED.sync();
  delay(500);
  
  color.r = 0;
  color.g = 0;
  color.b = 255;
  LED.set_crgb_at(0, color);
  LED.sync();
  delay(500);
}

Na początku trzeba ustawić bibliotekę sterującą światełkami poprzez dyrektywę include:

#include <WS2812.h>

Potem tworzę obiekt o nazwie LED odpowiedzialny za sterowanie diodami:

WS2812 LED(1);

Jego pierwszy argument określa ilość LED-ów podłączonych w szeregu do wybranego pinu. Nadałem mu wartość 1 bo podłączyłem jedną diodę. 

Następnie tworzę zmienną o nazwie color typu cRGB:

cRGB color;

Służy ona do przechowywania wartości koloru składającej się z 3 barw podstawowych R – Red [czerwony], G – Green [zielony] i B- Blue [niebieski].

W funkcji setup za pomocą metody “setOutput” [ustaw wyjście] ustawiam pin do którego podłączyłem diody.

LED.setOutput(9);

Wybrałem pin cyfrowy 9.

W funkcji loop określiłem animację świecenia lampki. Polega ona na tym, że co pół sekundy zmienia się kolor pierwszej lampki na jeden z 3 podstawowych kolorów w pełnej jasności.

Najpierw ustawiam jasności poszczególnych składowych kolorów w zmiennej color:

color.r = 0;
color.g = 255;
color.b = 0;

W tym przypadku ustawiłem wartość g na 255, co daje maksymalną jasność dla koloru zielonego, natomiast inne składowe otrzymały najniższą wartość czyli 0. Możesz stosować dowolne kombinacje kolorów ustawiając odpowiednie wartości składowych jako liczby od 0 do 255.

Potem przypisuje ustawiony kolor do wybranej diody za pomocą metody “set_crgb_at”.

LED.set_crgb_at(0, color);

Jego pierwszy argument to numer diody w szeregu, której chcesz ustawić kolor. Drugim argumentem jest wartość koloru przechowywana w zmiennej color.

By wysłać dane o kolorze do lampki, trzeba użyć metody “sync”.

LED.sync();

I to tyle. Możesz teraz tworzyć własne unikalne animacje świetlne w prosty sposób.

O tym jak podłączyć diody do Arduino dowiesz się ze starszego wpisu:

Bibliotekę możesz ściągnąć z serwisu Github:

Diody w dwóch wersjach jak i wodoodporną taśmę kupisz w Nettigo.

sprae

Duże ilości na raz LED-ów

Niemiecka grupa Hackerspace FFM opublikowała ciekawy wpis o tym jak zasilać duże ilości lampek LED połączonych szeregowo.
Potrzebne im to było do podświetlania świątecznego wzorku wygrawerowanego w akrylu.

Wzorek podświetla 10 LED-ów połączonych szeregowo. By je zasilać potrzebne było napięcie około 30 V. Takie napięcie nie jest dziś łatwo dostępne.

Twórcy postanowili stworzyć od podstaw przetwornicę sterowaną za pomocą kontrolera ATtiny85.

imagePrzetwornica zasilająca 10 lampek LED – Zdjęcie pochodzi ze strony www.hackerspace-ffm.de

Przetwornice działają na zasadzie indukcji cewki. Zasilając cewkę w chwili odłączania zasilania oddaje ona część prądu o dużym napięciu.
Można tego doświadczyć podczas zabaw z przekaźnikiem lub transformatorem. Gdy odłączasz baterię od cewki i dotykasz jej wyprowadzeń, może cię kopnąć prąd o dużym napięciu.

To samo dzieje się tutaj. Tranzystor sterowany kontrolerem podłącza i odłącza zasilanie cewki wywołując indukcję, wynikiem której jest duże napięcie zasilające LED-y.
Kontroler steruje tranzystorem przez wyjście PWM, pozwalające na regulację parametrów pracy przetwornicy.
W ten sposób z napięcia zasilania 5 V powstaje 30 V do zasilania LED.

Kontroler cały czas mierzy prąd przepływający przez diody by ich nie przeciążyć prądem większym niż 20 mA.
Układ pomiarowy składa się z 2 rezystorów 10 Ohm i 1 kOhm oraz kondensatora filtrującego 100 uF, jego wyjście podłaczone jest do wejścia analogowego w nodze 2 kontrolera.

Wejście analogowe w nodze 3 wykorzystywane jest do podłączenia potencjometru sterującego jasnością świecenia.

Najfajniejsze jest to, że cały program został napisany w Arduino IDE, przez co łatwo go można modyfikować i dostosować do swoich potrzeb.

sprae

Assert4a – assert dla Arduino IDE – szybkie libki

Ta biblioteka jest zajefajna i powstała dziś rano.

Pisanie programów to fajne zajęcie. Jednak od czasu do czasu zdarzają się chwile, że program nie chce działać tak jak tego oczekuję. Im dłużej to trwa tym bardziej projekt demotywuje.

Jednym z ciekawszych podejść do tego problemu jest pisanie programów opartych na testach. Najpierw pisze się program, który sprawdzi czy nasz program lub jego elementy działają dobrze. Potem pisze się właściwy program tak długo, aż ten testujący zakończy wszystkie testy jako prawidłowe.

W takich chwilach zwykle uruchamia się profesjonalne narzędzia typu debugger, którym analizuje działanie programu krok po kroku i sprawdzam jakie dane znajdują się w zmiennych. Jak znajdują się złe to zastawiam się czemu ;-).

Niestety w Arduino IDE nie ma debuggera. Trzeba sobie radzić amatorsko.
Najbardziej prymitywnym sposobem jest świecenie wbudowaną diodą L13, gdy następuje jakieś ważne/dziwne wydarzenie w programie.

int zmienna;

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  zmienna++;
  if (zmienna < 0)
  {
    digitalWrite(13, HIGH);
  }
}

Tu program sprawdza czy zmienna jest mniejsza niż zero. Jeśli tak to świeci lampką L na płytce drukowanej Arduino.

Innym sposobem jest testowanie programu przez wysyłanie komunikatów do Monitora Portu Szeregowego w Arduino.

int zmienna;

void setup() {
  while (!Serial);
  Serial.begin(9600);
}

void loop() {
  zmienna++;
  if (zmienna < 0)
  {
    Serial.println(zmienna);
    delay(1000);
  }
}

Gdy zmienna jest poniżej zera program wyśle jej wartość do komputera.

Fachowo takie sprawdzanie programu nazywane jest >>debug za pomocą print “dupa”<< 😉 i jest często powodem drwin profesjonalnych programistów.

Takie testowanie programu może być kłopotliwe przy bardziej rozbudowanych kodach. Upychasz coraz więcej print w różnych zakamarkach programu i na końcu Monitor Portu Szeregowego zaczyna wyświetlać tyle komunikatów, że przypomina to monitorowanie z filmu Matrix.

W wielu językach programowania wymyślono już ciekawe rozwiązania pomagające w takim testowaniu programu. Najpopularniejsze nazywa się “assert” [twierdzić/dowodzić czegoś].

Jego użycie w programie wygląda jak użycie normalnej funkcji. Z tym, że zamiast argumentu podajesz warunek. Warunek to określenie przy jakich parametrach program będzie działał prawidłowo. W przypadku naszego programu zapiszę to jako:

assert(zmienna >= 0);

Ponieważ zakładam twierdzenie, że funkcja będzie działała dobrze tylko wtedy, kiedy zmienna będzie większa lub równa zeru.

Jeśli wydarzy się coś w programie i warunek nie będzie spełniony (zmienna będzie miała wartość mniejszą niż zero) to dostaniemy komunikat informujący w którym pliku programu, w jakiej linii i jakiej funkcji warunek nie został spełniony. Program zostanie dla bezpieczeństwa zatrzymany.
Taka prosta funkcja funkcja, a zwraca wszystkie niezbędne informacje.

Standardowa biblioteka assert.h z języka C++ nie działa dobrze w Arduino IDE. Postanowiłem napisać bibliotekę poprawiającą jej działanie. Nazwałem ją Assert4a.h.

#include <Assert4a.h>

int zmienna;

void setup() {
  while (!Serial);
  Serial.begin(9600);
}

void loop() {
  zmienna++;
  assert(zmienna >= 0);
}

W funkcji loop za pomocą assert, zakładam że program będzie dobrze działał, jeśli zmienna będzie miała wartość większą lub równą 0.
Gdy program nie spełni tego warunku, w Monitorze Portu Szeregowego otrzymam komunikat:

Assertion: ‘zmienna >= 0’ failed
   File ‘sketch_dec09a.ino’, at line 12, in function ‘loop’

Mówi on, że twierdzenie “zmienna >= 0” okazało się nieprawdziwe. Nieprawidłowość wystąpiła w pliku programu “sketch_dec09a.ino”, w linii 12, w funkcji “loop”.

Możesz obstawić dużą część programu takimi twierdzeniami i jak coś złego się stanie to będziesz miał informację gdzie i dlaczego.

Gdy przetestujesz już cały program nie musisz usuwać assert-ów żeby je wyłączyć. Wystarczy, że nad include z biblioteką napiszesz #define NDEBUG

#define NDEBUG
#include <Assert4a.h>

int zmienna;

void setup() {
  while (!Serial);
  Serial.begin(9600);
}

void loop() {
  zmienna++;
  assert(zmienna > 0);
}

Gdy zajdzie potrzeba ponownego testowania, usuniesz define i bedziesz mógł dostawać komunikaty o błędnym działaniu.

By zainstalować bibliotekę, wystarczy pobrać plik zip, a potem w Arduino IDE wybrać menu Szkic -> Importuj bibliotekę… -> Dodaj bibliotekę…

PS. Zadanie domowe z gwiazdką – kto wytłumaczy w komentarzach czemu w pierwszym programie lampka L13 zaświeciła się?

sprae

Arduino Zero vs Teensy 3.1

Na stronie Arduino pojawiła się oficjalna specyfikacja Arduino Zero.

image
Arduino Zero – Zdjęcie pochodzi ze strony Arduino.cc

Sama płytka nie jest jeszcze dostępna. Twórcy oznaczyli ją opisem “Comming soon” [wkrótce]. Biorąc pod uwagę to, że Arduino Tre ma takie oznaczenie już chyba z pół roku, nie potrafię przewidzieć kiedy nastąpi oficjalna premiera.

Płytka ma być następczynią popularnych i znanych modeli UNO i Leonardo, obsługując ten sam format płytki.

Parametry techniczne przedstawiają się następująco:

  • Procesor: ATSAMD21G18 – 32 bitowy ARM M0+
  • Zegar: 48 MHz
  • Pamięć FLASH (programu): 256 kB
  • Pamięć SRAM (danych): 32 kB
  • Pamięć EEPROM (konfiguracji): 16 kB (udawana we FLASH)
  • Poziomy logiczne o napięciu 3,3 V
  • 14 wejść/wyjść cyfrowych
  • 12 wyjść PWM
  • 6 wejść analogowych o rozdzielczości 12 bitów
  • wyjście analogowe o rozdzielczości 10 bitów
  • maksymalne obciążenie wyjść cyfrowych 7 mA
  • cena: nieznana

Chyba największą zaleta płytki jest złącze debug, pozwalające na podgląd działania programu w kontrolerze w celu łatwiejszego wykrywania błędów. Oczywiście to tylko teoria, bo nie wiadomo jak to będzie działać. Może się okazać, że trzeba wykupić jakieś oprogramowanie, albo używać dziwnych skomplikowanych narzędzi.

Z drugiej strony mamy dostępną płytkę Teensy 3.1 stworzoną przez Paula z pjrc.com

image
Teensy 3.1 – Zdjęcie pochodzi ze strony pjrc.com

Mimo innego wyglądu płytka jest zbliżona funkcjonalnie do Arduino Zero. Programuje się ją za pomocą Arduino IDE z obsługą jego bibliotek. Paul dużo pracował ze społecznością nad zapewnieniem kompatybilności bibliotek.

Prametry techniczne Teensy 3.1:

  • Procesor: MK20DX256 – 32 bitowy ARM M4
  • Zegar: 72 MHz (możliwość przełączenia na 96 MHz)
  • Pamięć FLASH (Programu): 256 kB
  • Pamięć SRAM (Danych): 64 kB
  • Pamięć EEPROM (konfiguracji): 2 kB
  • Poziomy logiczne o napięciu 3,3 V, Toleruje napięcie 5 V
  • 34 wejścia/wyjścia cyfrowe
  • 12 wyjśc PWM
  • 21 wejść analogowych
  • 12 wejść dotykowych
  • 3x Serial, 2x i2c, 1x SPI
  • cena: 84 zł

Płytki Teensy dostępne w Nettigo.pl

sprae

Automatyczne nagrywanie lecących samolotów

Na świecie mamy wiele ciekawych hobby. Należą też do nich miłośnicy rozmaitych środków transportu. Kolekcjonują nagrania swoich ulubionych pojazdów, dowiadują się dużo o ich działaniu i historii. Niektórzy tworzą na tej podstawie symulatory lub modyfikacje oddające idealnie wrażenia z kierowania pojazdem.

Wcześniej dokumentowanie pojazdu wymagało szczęścia lub znajomości w dyspozytorni. Dziś dzięki GPS i ogólnie dostępnym informacjom można nasze łowy zautomatyzować.

Simon Aubury wykonał takie urządzenie, do automatycznego namierzania i nagrywania okolicznych samolotów pasażerskich.

Urządzenie składa się z Raspberry PI, kamery, serwomechanizmów, wyświetlacza oraz odbiornika DVB-T na chipsecie RTL2832U.

Zasada działania jest teoretycznie prosta. Samoloty pasażerskie mają specjalne urządzenie, które nadaje ich położenie oraz znak rozpoznawczy dla ośrodków kontroli lotów. Dane te są otwarte i każdy może je odbierać mając odpowiedni odbiornik.

Właśnie taki odbiornik można sobie zbudować taniego dongla USB DVB-T z układem RTL2832U. Układ ten to SDR – Software Defined Radio. Jest to odbiornik radiowy, którego zasada działania nie opiera się na cewkach, kondensatorach i rezystorach, ale na programowym dekodowaniu sygnału radiowego. Dzięki temu można przeprogramować radio, by zamiast odbierać naziemną telewizję cyfrową, odbierał różne komunikaty w dość szerokim zakresie częstotliwości.

Simon oprócz odbierania danych z samolotu postanowił je wykorzystać do stworzenia urządzenia automatycznie kierującego ruchem kamery nagrywającej przelatujące w okolicy samoloty.

Części do projektu możesz kupić w naszym sklepie Nettigo.pl

sprae