Teensy 3.1 – dzień III – wydajność

Dziś wielkie starcie. W prawym narożniku Arduino Leonardo. Zawodnik o wadze 16 MHz. W lewym Teensy 3.1. Jego zegar to 96 MHz.

Sprawdźmy ile razy bardziej wydajne jest Teensy 3.1 w porównaniu do jednej z najbardziej popularnych płytek Arduino Leonardo.

Dzielenie liczb liczb jest jedną z najbardziej czasochłonnych operacji dla procesora. Procesor ARM Cortex M4 w Teensy 3.1 ma specjalny rozkaz, dzięki któremu dzieli liczby sprzętowo.
Procesor AVR w Arduino Leonardo nie ma dzielenia sprzętowego i musi zastępować je kilkoma innymi operacjami.

To program który porówna wydajności w dzieleniu:

unsigned long sum;

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

void loop()
{
  Serial.println(F("Start"));
  unsigned long timeBegin = millis();
  for (int a=0; a<10000; a++)
  {
    for (int b=1; b<100; b++)
    {
      sum += a / b;
    }
  }
  
  unsigned long processTime = millis() - timeBegin;
  Serial.println(F("End"));
  Serial.print(F("Czas obliczen: "));
  Serial.println(processTime);
}

Program dzieli przez siebie milion liczb i mierzy czas tej operacji.

  • Arduino Leonardo zajęło to 14,978 s
  • Teensy 3.1 zajęło to 0,127 s

Czyli w dzieleniu Teensy okazało się 118 razy szybsze.

Kolejny test jest dość zabawny. Polega na uruchomieniu na obydwu płytkach tego samego emulatora procesora 6502. Na emulatorze uruchomiłem język EhBASIC. Cały kod pochodzi z wątku na forum Arduino, o którym niedawno pisałem.

Uznałem, że emulator to dobre środowisko by przetestować różnorodne operacje. W końcu to taki duży skomplikowany program, który robi dużo obliczeń, dużo komunikuje się z pamięcią Flash i RAM. Będzie dobrze odzwierciedlał ogólną wydajność procesora.

W języku BASIC napisałem prosty program zliczający od 0 do 10000.

Czas jego działania dla każdej płytki to:

  • Arduino Leonardo: 57,22 s
  • Teensy 3.1: 9,8 s

W tym teście Teensy nie ma już takiej ogromnej przewagi. Ale nadal jest prawie 6 razy szybsze.

Na koniec zostawiłem najmocniejszy test. Wziąłem algorytmy do obliczeń GPS ze starego projektu licznika rowerowego. Jest w nich dużo liczb zmiennoprzecinkowych (float) i masa różnych funkcji trygonometrycznych typu sin, cos, tan, atan2.

W oparciu o to, napisałem program, który oblicza trasę 36km z Płocka na zachód. Co 0.0001 stopień szerokości geograficznej.

float lat = 52.512204;
float lon = 19.675606;
float lonTo = 19.143456;

float oldLat = lat;
float oldLon = lon;

float angle;
float distance;

float getDistance(float latf, float lonf, float latt, float lont)
{
  float distance = acos(cos(latf)*cos(lonf)*cos(latt)*cos(lont)+cos(latf)*sin(lonf)*cos(latt)*sin(lont)+sin(latf)*sin(latt)) * 6378.137;
  return distance;
}

float lonTox(float lon)
{
  float x = (lon + PI) / (2 * PI) * 2.0;
  return x;
}

float latToy(float lat)
{
  float y = (1.0 - log(tan(lat) + (1 / cos(lat))) / PI);
  return y;
}

float getAngle(float latf, float lonf, float latt, float lont)
{
  float xf = lonTox(lonf);
  float yf = latToy(latf);
  float xt = lonTox(lont);
  float yt = latToy(latt);
  
  float x = xt - xf;
  float y = yt - yf;
  float angle = atan2(y, x);
  return angle;
}

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

void loop()
{
  Serial.println(F("Start"));
  unsigned long timeBegin = millis();
  for (float a=lon; a>lonTo; a-=0.0001)
  {
    distance += getDistance(oldLat, oldLon, lat, a);
    angle = getAngle(oldLat, oldLon, lat, a);
    oldLat = lat;
    oldLon = a;
  }
  
  unsigned long processTime = millis() - timeBegin;
  Serial.println(F("End"));
  Serial.print(F("Czas obliczen: "));
  Serial.println(processTime);
  
  Serial.print(F("Odleglosc: "));
  Serial.println(distance);
  Serial.print(F("Kat: "));
  Serial.println(angle);
  distance = 0.0;
  angle = 0.0;
}

Program pokazuje jak dobrze sprawdza się Teensy w autopilotach i innych podobnych systemach związanych z nawigacją, położeniem i obliczeniami z przecinkiem.

  • Arduino Leonardo policzyło trasę w 10,242 s
  • Teensy 3.1 policzyło trasę w 4,215 s

W takich obliczeniach Teensy okazało się 2,6 raza wydajniejsze od Arduino Leonardo.

BTW. Jeśli interesujecie się nawigacją to w tym teście macie gotowe funkcje do obsługi GPS.

Funkcja “getDistance” oblicza odległość między dwoma punktami geograficznymi. Argumenty to długość i szerokość geograficzna punktu początkowego i długość i szerokość geograficzna punktu końcowego. Argumenty podajemy w radianach, a nie stopniach – co mi się zapomniało ;-).

Funkcja “getAngle” oblicza kąt pod jakim jest punkt geograficzny od nas względem zachodu. Jej argumenty są takie same jak “getDistance”.

Funkcje “latToy” i “lonTox” zamieniają długość i szerokość geograficzną na współrzędne punktu  x, y na płaskiej mapie.

Teensy 3.1 siłą rzeczy jest wydajniejsze od Arduino Leonardo. Dzięki testom dowiedziałeś się jak bardzo i w jakich operacjach radzi sobie najlepiej.

Pozytywnie zaskoczyło mnie dziś to, że programy pod Teensy obsługują pamięć Flash tak jak w Arduino. Można używać F() do tekstów. Autor Teensy przeniósł nawet bibliotekę “/avr/pgmspace.h”, żeby biblioteki Arduino obsługujące Flash działały na Teensy bez modyfikacji.

sprae

Wyświetlacz Bąbelkowy w Nettigo

Kilka razy opisywałem na tym blogu niezwykłe malutkie urządzenia:

Wszystkie te projekty mają jedną wspólną cechę. Wykorzystują maleńki bąbelkowy wyświetlacz. Pojawił się on właśnie w ofercie Nettigo za 12 zł. Co najzabawniejsze jest to 666 produkt w katalogu. Obawiamy się o nasze dusze ;-).

To 7 segmentowy wyświetlacz, potrafiący wyświetlać liczbę składającą się z 4 cyfr. Jest bardzo mały. Jego wymiary to 15×6 mm. Wielkością przypomina układ scalony w obudowie DIP. Ma 12 nóżek, po 6 z każdej strony. Ich rozstaw to standardowe 2,54 mm. Dzięki temu idealnie pasuje do płytki stykowej i do płytek uniwersalnych.

Parametry elektryczne

Każda kreska w cyfrze to segment wyświetlacza. Świecenie wybranych segmentów układa się w cyfrę. Jest też dodatkowy element świecący symbolizujący przecinek w ułamkach. Segmenty to odpowiednio ułożone diody świecące. By się świeciły trzeba im zapewnić odpowiednie parametry:

  • napięcie zasilania 1.6 V;
  • prąd 5 mA.

Ponieważ płytki kontrolerów dają dużo wyższe napięcie, trzeba zastosować rezystor. Jego wartość obliczysz ze wzoru:

Rezystor = (Napięcie_zasilania – Napięcie_diody) / Prąd_diody

Dla kontrolerów z logiką w standardzie 5 V jak Arduino UNO, wartość rezystora wynosi:

Rezystor = (5 V – 1,6 V) / 0,005 A = 680 Ohm

Dla kontrolerów z logiką w standardzie 3,3 V jak Teensy 3.1 lub Raspberry PI, wartość rezystora wynosi:

Rezystor = (3,3 V – 1,6 V) / 0,005 A = 340 Ohm

W projektach, które opisywałem na blogu nie stosowano rezystorów. Działały one na kontrolerach z poziomem logicznym 3,3 V. Czyli teoretycznie powinno działać. Ale nie gwarantuje tego, jak długo taki wyświetlacz będzie działał i zalecam stosowanie rezystorów.

Ale jak sterować tym wyświetlaczem?

Połączenia diod w jego wnętrzu są następujące. Katody (GND) wszystkich segmentów w cyfrze są połączone razem. Wyprowadzone są osobno dla każdej cyfry przez wyprowadzenia d1, d2, d3, d4. Mówi się, że taki wyświetlacz ma “wspólną katodę”. Anody (zasilanie) sterują segmentami cyfr przez.wyprowadzenia A, B, C, D, E, F, G i kropka przecinka przez DP.

Anody wyświetlacza podłącza się przez rezystory. Po jednym na każdy segment.

Teraz gdy chcesz zapalić górną kreskę pierwszej cyfry, to podłączasz:

  • d1 do GND
  • A przez rezystor do zasilania 5 V lub 3,3 V.

Czyli katody “d1..4” wybierają cyfrę, a anody A..G i DP wybierają segment.

Gdy chcesz mieć na wyświetlaczu 7 jako czwartą cyfrę to łączysz:

  • d4 do GND
  • A przez rezystor do zasilania
  • B przez rezystor do zasilania
  • C przez rezystor do zasilania

Gdy podłączysz dodatkowo d2 do GND, to będziesz miał tą samą siódemkę w 2 miejscach na wyświetlaczu.

Kiedy kontroler steruje wyświetlaczem, to włącza katodę pierwszej cyfry, ustawia segmenty. Potem wyłącza segmenty, ustawia katodę drugiej cyfry i włącza dla niej odpowiednie segmenty i tak dalej.
Dzieje się to tak szybko, że my nie dostrzegamy sztuczki.

Wyświetlacz podłącza się do kontrolera bardzo łatwo. Potrzeba mu 12 pinów cyfrowych – 4 do podłączenia katod d1, d2, d3, d4 – 8 do podłączenia przez rezystory anod A, B, C, D, E, F, G, DP.

Ponieważ stan LOW to odpowiednik GND, a HIGH to odpowiednik zasilania. Program musi działać tak, że dla wybranej katody cyfry ustawia się LOW, a dla segmentów cyfry, które się mają zapalić ustawia HIGH.

Wszystkie piny ustawiasz jako wyjścia:

pinMode(numer_pinu, OUTPUT);

Stan HIGH pinu ustawia się przez:

digitalWrite(numer_pinu, HIGH);

Stan LOW pinu ustawia się analogicznie:

digitalWrite(numer_pinu, LOW);

Do łatwiejszej obsługi wyświetlacza powstała biblioteka SevSeg. Ma ona paskudny kod, ale jest wykorzystywana w wielu projektach.

To przykład jej użycia.
Mam Arduino UNO. wyjścia d1, d2, d3, d4 podłączyłem do pinów cyfrowych 2, 3, 4, 5. Wyjścia A, B, C, D, E, F, G, DP, podłączyłem przez 8 rezystorów 680 Ohm do pinów cyfrowych 6, 7, 8, 9, 10, 11, 12, 13.

Żeby program w takiej konfiguracji wyświetlił liczbę 1234 program musi wyglądać tak:

#include "SevSeg.h"

SevSeg wyswietlacz;

void setup()
{
  wyswietlacz.Begin(COMMON_CATHODE, 4, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
  wyswietlacz.SetBrightness(100);
}

void loop()
{
  wyswietlacz.DisplayString("1234", 0);
  delay(5);
}

W metodzie “wyświetlacz.Begin()” są następujące argumenty:

  • Typ wyświetlacza. Ten jest ze wspólną katodą, dlatego typ wybrałem COMMON_CATHODE.
  • Kolejny argument to liczba cyfr w wyświetlaczu, czyli 4.
  • Kolejne 4 argumenty to piny katod sterujących cyframi d1, d2, d3, d4
  • Kolejnych 8 argumentów to piny anod sterujących segmentami A, B, C, D, E, F, G, DP.

Metoda wyswietlacz.SetBrightness(100); ustawia jasność wyświetlacza. 100 to maksymalna jasność.

Metoda wyswietlacz.DisplayString(“1234”, 0); ustawia liczbę na wyświetlaczu.
Pierwszy argument to string z liczbą, adrugi to cyfra za którą ma się zaświećić przecinek. 0 – za żadną, 1 za pierwszą… 4 za czwartą.

Ta metoda musi być ciągle wywoływana w loop, bo odpowiada też za “wrzucanie” cyfr na wyświetlacz.

sprae

Teensy 3.1 – dzień II – uruchomienie i programowanie

Dziś o tym jaka jest filozofia programowania Teensy.

Do programowania Teensy potrzebujesz przewodu Micro USB

image

Po podłączeniu Teensy pierwszy raz do komputera, uaktywnia się domyślny program. Mruga wbudowaną diodą świecącą. Dzięki temu wiesz, że twoje Teensy działa.

image

By programować Teensy potrzebujesz Arduino IDE 1.0.5 i Teensyduino.
Teensyduino to program modyfikujący Arduino IDE, żeby współpracowało z Teensy.

Ściągasz je ze stron:

Najpierw instalujesz Arduino IDE w komputerze, a potem Teensyduino.

Do instalacji Teensyduino potrzebne są prawa Administratora. Dlatego na pliku instalatora musisz kliknąć prawym klawiszem myszy i wybrać w menu opcję “Uruchom jako Administrator”.

Na początku program instalatora wygląda tak:

image

Klikasz przycisk Next i instalator informuje, że nie ma zainstalowanych sterowników do obsługi komunikacji Serial. Dzięki nim możesz podglądać w Monitorze portu szeregowego to co program wysyła przez “Serial.print();”.

image

Kliknięcie w przycisk Next zainstaluje sterownik.
Kliknięcie na “Skip Driver Install” pominie instalację sterowników. Ponieważ są one potrzebne, naciśnij Next.

W następnym oknie wybierasz miejsce na dysku, gdzie zainstalowałeś Arduino IDE.

image

U mnie jest to D:programyArduino-1.0.5-r2

image

Naciskasz Next. W następnym oknie wybierasz biblioteki. Każda z nich odpowiada za obsługę jakiegoś urządzenia przez Teensy.

image

Ja wybrałem wszystkie, klikając w All.

Po kliknięciu w Next, instalator pyta się czy rozpocząć instalację plików.

image

Jeśli się na to zdecydowałeś, naciśnij Install

image

Po zainstalowaniu Teenstyduino pojawia się prosty samouczek.

image

Informuje on, by po pierwszym uruchomieniu przerobionego Arduino IDE z jakimś szkicem, nacisnąć przycisk Weryfikacji programu, a potem przycisk na płytce Teensy.

Jeśli instalacja przebiegła prawidłowo, to po uruchomieniu Arduino IDE w menu Narzędzia -> Board będziesz miał do wyboru płytki z rodziny Teensy.

image

Tu trzeba wybrać posiadany model, czyli Teensy 3.1.

W menu Narzędzia -> USB Type wybierasz jaką rolę będzie pełniło Teensy w twoim programie.

image

Serial – Teensy w takim przypadku emuluje port szeregowy COM: przez USB. Pozwala to na używanie obiektu Serial w programie i zwracanie różnych komunikatów przez Monitor portu szeregowego.

Keyboard + Mouse + Joystick – sprawia, że Teensy będzie udawało klawiaturę, mysz i joystick. Po użyciu odpowiedniej biblioteki możesz programem z płytki Teensy wysyłać skróty klawiaturowe, ruchy myszy i kliknięcia oraz emulować joystick. Czyli zrobić własny kontroler do gry lub programów.

Serial + Keyboard + Mouse + Joystick – to tryb w którym Teensy oprócz klawiatury, myszy i joysticka dodatkowo emuluje port szeregowy COM:. Można dzięki temu oprócz sterowania grą przez standardowe peryferia, komunikować się z płytką wysyłając do Teensy jakieś informacje.
Jest to przydatne, gdy robisz panel do gry i oprócz przycisków sterujących, chcesz mieć wyświetlacze prezentujące informacje z gry.
Jak w opisanych niedawno projektach paneli do KSP.
Taka konfiguracja może się też przydać cziterom farmiącym golda w Diablo 😉

MIDI – to tryb w którym Teensy udaje urządzenie muzyczne MIDI. Pozwala to sterować programami do tworzenia muzyki i udawać instrument.

Raw HID – to tryb w którym mamy dostęp do struktur interfejsu HID. Tryb ten pozwala na komunikację z aplikacjami Metro w Windows 8 i Windows Phone 8. Ponieważ w ich API zrezygnowano z interfejsu Serial.

Flight Sim Controls – ten tryb pozwala na komunikację z symulatorem lotu X-Plane. Dzięki niemu możesz z Teensy zrobić element kokpitu samolotu, którego przyciski będą reagowały na instrumenty pokładowe w symulatorze lotu.

W menu Narzędzia -> CPU Speed masz do wyboru częstotliwość z jaką będzie działał procesor.

image

Zakres zegara procesora można ustawić od 2 do 96 MHz w zależności od potrzeb. Im mniejsza częstotliwość, tym kontroler mniej zużywa prądu.
Częstotliwości poniżej 24 MHz nie obsługują komunikacji USB.
Częstotliwość 96 MHz to przetaktowanie procesora. Można jej użyć, gdy program zbyt wolno coś oblicza.

W menu Narzędzia->Keyboard Layout ustawiasz język klawiatury, którą emuluje Teensy. Ma to związek z przypisaniem liter do kodów klawiszy.

image

Dla naszego regionu najlepszym będzie standardowy US English albo US International.

Programy na Teensy pisze się tak samo jak na Arduino. Tu też zaczyna się od 2 funkcji “setup” i “loop”. Funkcja setup uruchamia się tylko raz na początku działania programu. Funkcja loop uruchamia się ciągle od nowa.

Na początek wpisałem pusty program. Chciałem zobaczyć ile taki zajmuje.
W ostatnim oknie instalatora Teensyduino, samouczek napisał by przy pierwszym programie wcisnąć przycisk “Weryfikuj”.

Po jego wciśnięciu pojawia się okno programowania Teesny. Pisze nam, żeby wcisnąć przycisk na płytce by zacząć programowanie.

Po jego wciśnięciu program załadował się w ułamku sekundy, a LED na płytce przestał mrugać. Stało się tak dlatego, bo nowy program niczego nie robi.

Pusty program zajmuje około 13 kB. Wielkość dlatego jest tak duża, bo doliczony jest do niej rozmiar programu rozruchowego. Zajmuje się on programowaniem płytki, ustawieniem USB i wszystkich interfejsów kontrolera.

Ten tajemniczy przycisk do programowania to nie jest Reset. Teensy działa tak, że po podłączeniu zasilania od razu włącza się program użytkownika. Przycisk wyłącza program użytkownika i przełącza płytkę w tryb programowania.

Ma to pewną praktyczną zaletę. Jeśli twój program źle działa i zablokuje port USB albo kontroler, to wciskasz przycisk i wszystko się odblokowuje, a ty możesz wgrać działający program.

W Arduino nie ma takiego trybu i zdarza się, że Arduino Leonardo może się zablokować w wyniku złego programu na tyle, że programator go nie pozna ;-).
W Teensy 3.1 nie ma tego problemu.

Dla porównania napisałem standardowy program mrugający wbudowaną diodą co 100 ms.

Ilość zajmowanej pamięci Flash zwiększyła się o 40 bajtów. Można przyjąć, że ten kawałek kodu właśnie tyle zajmuje.

Rzeczy które pozytywnie mnie zaskoczyły to szybkość programowania przez USB. Dzieje się to tak szybko, że nie zdążyłem odwrócić wzroku. Druga to przycisk do programowania, który chroni przed skutkami działania złego programu.

sprae

Teensy 3.1 – dzień I – Opis płytki

Witam w nowym serialu. W tym sezonie omówię ci płytkę Teensy 3.1.
Ogólnie rzecz ujmując jest to płytka o możliwościach Arduino DUE, za cenę mniejszą niż Arduino UNO.

Płytka jest bardzo małych rozmiarów (3.56 cm x 1.78 cm). Jest 2 razy krótsza niż mój palec wskazujący. Mimo małych rozmiarów rozstaw pinów jest standardowy i wynosi 2,54 mm. To taki sam rozstaw jak w płytce stykowej, popularnych układach scalonych typu DIP, albo jak piny w Arduino.

Sercem płytki jest kontroler MK20DX256VLH7 firmy Freescale. Jest to 32 bitowy kontroler oparty o rdzeń ARM Cortex M4. Ta wersja rdzenia ma takie funkcje jak szybkie dzielenie i mnożenie liczb oraz operacje obróbki sygnałów DSP (szybkie liczenie y=a*x+b). 

Kontroler pracuje z zegarem 72 MHz. Co daje mu 90 milionów operacji na sekundę. Jest ponad 5 razy szybszy niż ten w standardowym Arduino. Jeśli chcesz możesz podkręcić w nim zegar do 96 MHz uzyskując jeszcze większą wydajność.

Na program masz do dyspozycji 256 kB pamięci Flash. Dla zmiennych jest 64 kB pamięci RAM. Pamięci EEPROM jest 2 kB.
Mimo, że jest 8x więcej pamięci Flash niż w Arduino UNO, nie znaczy że zmieścisz tam 8x większy program. Programy na platformę ARM kompilują się do większych rozmiarów niż takie same dla AVR.

W zestawie z płytką otrzymasz ulotkę na której rozpisane jest znaczenie poszczególnych pinów Teensy.

Tu można przeżyć szok. Mimo rozmiarów płytki, jej twórcy dali nam do dyspozycji 34 piny cyfrowe. Działają one w standardzie 3,3 V. Jednak jako wejścia tolerują napięcie 5 V. Tak więc płytka może być kompatybilna ze starymi układami z logiką 5 V.

Wadą jest to, że część pinów od spodu płytki jest tylko w postaci pól lutowniczych, a nie otworów. 

Większość pinów cyfrowych pełni więcej niż jedną funkcję. Część z nich to wejścia analogowe, wyjścia PWM, szeregowe itp.

Na płytce jest 21 wejść analogowych. Mają one rozdzielczość 16 bitów, jednak autorzy wspominają, że użytecznych bitów jest 13. Daje to dokładność odczytu 8192 poziomów napięcia.

Do sterowania szybkością silników i jasnością LEDów jest 12 wyjśc PWM.

Dodatkowo jest jedno wyjście przetwornika cyfrowo-analogowego DAC. Dzięki niemu możesz mieć wyjście z płynną regulacją napięcia. Do takiego wyjścia możesz podłączyć wzmacniacz z głośnikiem i nadawać różne dźwięki, albo komunikaty głosowe.
Wyjście ma rozdzielczość 12 bitów. Co daje 4096 poziomów napięcia wyjściowego.

Ciekawostką są wejścia przycisków dotykowych. Jest ich 12. W kolejnych odcinkach omówię jak z nich korzystać.

Wśród interfejsów do przesyłania danych na płytce są:

  • 3 interfejsy typu Serial (asynchroniczne RS232 TTL)
  • 2 magistrale I2C/TWI
  • 1 interfejs SPI
  • 1 magistrala CAN (używana w samochodach i przemyśle)

Wyjście zasilania 3,3 V można obciążyć do 100 mA.

Kontroler posiada w sobie zegar czasu rzeczywistego RTC. Służy on do sprzętowego przechowywania i obliczania daty oraz czasu. Jego funkcję uaktywnia się poprzez wlutowanie standardowego kwarcu zegarkowego o częstotliwości 32,768 kHz. By godzina i data były liczone po odłączeniu zasilania, do pinu VBat trzeba podłączyć bateryjkę 3V. Taką jak na płycie głównej PC.

Oczywiście jest też interfejs USB zakończony wtyczką Micro USB. Standardowo służy do programowania płytki. Po użyciu odpowiednich bibliotek, może udawać dowolne urządzenie USB. Po wlutowaniu w odpowiednie miejsce kondensatora 150 uF, interfejs USB może pełnić rolę Host USB i sterować innymi urządzeniami USB takimi jak pendrive, aparat cyfrowy albo smartphone.


Rozpiska pinów Teensy 3.1 (zdjęcie pochodzi ze strony Pjrc)

Twórcy płytki oferują specjalne biblioteki do każdego z interfejsów. Ale o tym jak zacząć przygodę z programowaniem Teensy 3.1 dowiesz się w kolejnych odcinkach.

Jeśli masz jakieś pytania i chciałbyś, żebym sprawdził coś dokładniej. Napisz w komentarzu pod wpisem. Chętnie rozwieje twoje wątpliwości.

Udanych eksperymentów życzy
sprae

Nowe Raspberry Pi Model B+

Zespół odpowiedzialny za Raspberry Pi wymyślił nowy model maliny. Płytka ma oznaczenie B+.

image
Zdjęcie pochodzi z ze strony raspberrypi.org

Nowa płytka jest w tej samej cenie co poprzednia wersja $35. Różni się jednak kilkoma szczegółami.

Ma 4 porty USB Host. Teraz możesz podłączyć więcej peryferiów bez kupowania Huba USB.

Zmieniono sekcję zasilania. Stabilizatory liniowe zastąpiono przetwornicami, co znacznie zmniejszyło pobór prądu. Teraz płytka pobiera o 0,5 do 1 W (czyli 200 mA) prądu mniej. Co ma duże znaczenie przy zasilaniu z akumulatora.

Teraz wyjście Video i Audio znajdują się w jednej wtyczce Mini Jack (4 pins). W audio zmniejszono ilość szumów.

Inne jest też złącze na kartę pamięci SD. Teraz jest w standardzie Micro SD. Złącze jest typu push-push, czyli to klikające z zatrzaskiem.

Najważniejszą nowością dla nas majsterkowiczów jest nowe złącze GPIO.

image
Zdjęcie pochodzi ze strony raspberrypi.org (powiększenie)

Ma ono 40 pinów. Początkowe piny są zgodne z poprzednią wersją. W sumie masz teraz do dyspozycji 26 programowalnych pinów cyfrowych GPIO (o 9 więcej).

Dodano też 2 piny ID. Służą do podłączenia pamięci EEPROM. Informującą system jaki shield został podłączony do maliny. Ma to zapewnić automatyczną konfigurację podczas uruchamiania systemu.

sprae

W kolejnym odcinku…

W przyszłym tygodniu naszego serialu, spędzimy kilka dni z czymś co jest:

  • mniejsze niż palec;
  • ma kilkadziesiąt programowalnych pinów;
  • ma wydajność Arduino DUE;
  • jest ponad 2x tańsze niż Arduino DUE;
  • jest tańsze nawet niż Arduino UNO;
  • toleruje stany logiczne 5V.

Zobaczę, czy jest tak wygodne w programowaniu jak Arduino. Czy pasują do niego różne biblioteki. Czy to w ogóle ma sens?!

Jeśli masz pytania dotyczące tej płytki, zostaw je w komentarzu. Postaram się je rozwiązać w przyszłych wpisach.

sprae

Chmura dla mikrokontrolerów

Sparkfun znana firma dostarczająca części dla twórców DIY wprowadza nową usługę. Jest nią chmura dla mikrokontrolerów.

Projekt znajduje się pod adresem http://data.sparkfun.com i umożliwia wysyłanie tam danych z twojego urządzenia. W wersji ogólnodostępnej wszystkie wysłane dane są publiczne. Maksymalna ilość wysłanych danych to 50 MB. Po przekroczeniu limitu kasowane są najstarsze zapisy. Można wysyłać dane maksymalnie 100x na 15 minut.

Dane można potem odczytywać w formacie JSON lub CSV. Można je też zintegrować z własnym serwisem wizualizując np. za pomocą Google Charts.

Danych nie musisz trzymać w chmurze Sparkfun. Kod serwera danych jest otwarty jako projekt Phant. Jest napisany w Javie Script na platformie Node.js. Możesz go umieścić gdzie chcesz. Nawet na płytce typu Raspberry PI, Beagle Bone Black lub Arduino Yun.
Hostując Phant samodzielnie unikasz ograniczeń serwisu Sparkfun.

Przy rejestracji własnego strumienia danych w serwisie wpisujesz nazwy pól (fields). Są to etykiety zmiennych pod jakimi będziesz wysyłał dane do serwisu.

Po rejestracji otrzymasz adres do podglądu danych (public_key), klucz do usuwania danych (delete_key) i klucz do zapisu danych (private_key).

Szablon adresu wysyłania danych wygląda tak:

http://data.sparkfun.com/input/[publicKey]?private_key=[privateKey]&temp=[value]&time=[value]

W nawiasy kwadratowe wpisujesz swoje dane otrzymane z formularza rejestracji.
Wpisałem pola “temp” i “time” i takie mi się ukazały w szablonie. Jeśli wybrałeś inne pola, to dostaniesz dostosowany do nich szablon.

Jeśli jesteś adminem lub zagorzałym power-userem Linuksa, do wysyłania danych do serwisu możesz użyć polecenia curl. Wpisujesz za nim odpowiednio spreparowany adres www z wypełnionymi polami i dane zapisują się w serwisie.

Jeśli jesteś programistą, to napisałem gotowy przykład w języku Python 2.

import urllib

def sparkfunSend(temp, time):
	URL = 'https://data.sparkfun.com/input/***TU KLUCZ PUBLICZNY***'
	PRIVATE_KEY = '***TU KLUCZ PRYWATNY***'

	params = urllib.urlencode({
		"private_key" : PRIVATE_KEY,
		"temp" : temp,
		"time" : time
		})

	urllib.urlopen("%s?%s" % (URL, params))

Działa on dla moich pól temp i time. Jeśli masz inne pola, musisz odpowiednio przerobić program.

sprae

Emulacja 6502 na Arduino

W prehistorycznych latach ‘80 i ’90 ubiegłego wieku zagościły do naszych domów komputery. Legenda głosi, że kto wtedy z nimi zaznał kontaktu, ten już na zawsze pozostanie w ich władaniu. Może dlatego co jakiś czas ludzie włączają sobie ich emulatory i odpalają na nich stare gry.

Ci bardziej wkręceni kupują sobie od nowa stary sprzęt na aukcjach internetowych. Ale my tu o czymś innym.

Zawsze korciło mnie by zrobić emulacje starych komputerów na Arduino. Ewentualnie na kilku połączonych. Nie wymagałem od niej zbyt wiele, byle udawała jakiś prosty komputer jak ZX Spectrum.

6502 to legendarny procesor. W latach ’80 pracował w większości komputerów domowych. Z tych bardziej znanych to Apple 2, Atari XL/XE, Commodore C64. Jak na tamte lata był dość wydajny, ale nie szybki. Jego konstrukcja była tak prosta, że doprowadzała programistów do rwania włosów z głowy.

Osobnik miker00lz z forum Arduino postanowił napisać emulator 6502 na Arduino, by sprawdzić, czy uda mu się uruchomić jakąś prymitywną wersję języka BASIC na ten procesor. Udało mu się to znakomicie. EhBASIC, komunikuje się z nami przez USB i w Monitorze portu szeregowego można pisać program BASIC’a jak za dawnych czasów.
Ze względu na małe zasoby kontrolera, do dyspozycji jest jedynie 767 bajtów pamięci na program.

Zdjęcie pochodzi z forum Arduino

Pomysł został podchwycony i rozwojem emulatora zajęła się dalsza społeczność. janost podłączył do Arduino dodatkową pamięć przez magistralę I2C/TWI, uzyskując większą przestrzeń na program. Wada była taka, że pamięć szeregowa działa wolniej.
Janost wymyślił, że w lokalnej pamięci Arduino zrobi pamięć Cache jak w nowoczesnych procesorach. To taki bufor, by mała szybka pamięć przechowywała najczęściej używane dane wolnej pamięci.
Apetyt rośnie w miarę jedzenia. Kolejnym wyzwaniem było, by Arduino samo wyświetlało obraz konsoli BASIC-a. Problemem było to, że obsługa wyświetlacza spowalniała emulację. Procesor musiał wysyłać dane na ekran, co zajmowało sporo czasu.

Zdjęcie pochodzi z forum Arduino

Janost nie odpuszczał. Przerzucił program do Arduino DUE, które jest wyposażone w szybki procesor ARM M3. Zamiast prostego EhBASIC postanowił wykorzystać ROM z komputerów Commodore.
W międzyczasie oscarv wykorzystał emulator to zrobienia z Arduino starego komputerka edukacyjnego KIM-1. Na nim uruchomił program szachowy.

Tym czasem Janost uzyskał na wyświetlaczu to:


Zdjęcie pochodzi z forum Arduino

To jest ekran startowy języka BASIC z Commodore C64. Litery “A” to wynik prób emulowania klawiatury.

Ostateczny wynik wygląda tak:

Nie jest to pełny emulator C64. Oprócz procesora nie emuluje żadnych innych układów. To co jest na wyświetlaczu, to wyświetlanie pamięci graficznej C64. Jednak satysfakcja z osiągnięcia takiego stanu rzeczy jest ogromna.

Sam autor rozwiązania mówi, że jest niedoskonałe ale działa. Emulator procesora nie jest napisany optymalnie i żadna sprzętowa akceleracja z kontrolera nie była użyta.

Jeśli chcesz, przyłącz się do wątku, popraw to co uważasz za stosowne i zostań jednym z kolejnych bohaterów hackingu Arduino.

Jeśli nie masz jeszcze Arduino, a chciałbyś nauczyć się robić takie rzeczy – zapraszamy na zakupy do Nettigo.

sprae

PiGRRL – wydrukowany GameBoy

Niedawno pisałem o tym jak ktoś zdołał umieścić Raspberry PI w Gameboyu.

Osiągnięcie godne podziwu, ale niektórych z was mogło zaboleć, że do zrobienia jednej fajnej rzeczy, trzeba tyle poniszczyć.


Zdjęcie pochodzi ze strony Learn Adafruit

Z odpowiedzią przychodzi strona learn.adafruit.com, która proponuje by wydrukować sobie obudowę na drukarce 3d. Zostały udostępnione odpowiednie pliki i instrukcja montażu.

Obudowa jest na tyle duża, że mieści w sobie niezmodyfikowaną płytkę Raspberry PI, wyświetlacz TFT 2,8", akumulator LiPo i przetwornicę.

Jedyne co musisz zepsuć, by zbudować własne PiGRRL to pad od konsoli SNES. Trzeba pozyskać z niego przyciski z gumkami, krzyżak oraz płytkę drukowaną.

sprae

HummingBoard – ulepszony klon maliny


Zdjęcie pochodzi ze strony HummingBoard

HummingBoard to płytka w formacie podobnym do RaspberryPI. Jej unikatową cechą są wymienne moduły procesora i pamięci. Pozwala to dobrać wydajność i koszty do projektu.

  • HummingBoard-i1 to moduł z 1 rdzeniem procesora i 512 MB pamięci RAM za minimum $45
  • HummingBoard-i2 to moduł z 2 rdzeniowym procesorem i 1 GB pamięci RAM za minimum $75
  • HummingBoard-i2eX to moduł  2 rdzeniowym procesorem, 1 GB szybszej pamięci RAM, szybszym procesorem graficznym i dodatkowymi portami na płytce za minimum $100

Płytka posiada też trochę więcej interfejsów niż standardowa malina.

  • 26 pinowe złącze GPIO
  • Wyjście na ekran LVDS*
  • Slot na kartę MicroSD
  • Zasilanie przez Micro USB
  • Wyjście HDMI 1.4
  • Piny z sygnałami dodatkowych 2 porów USB*
  • Złącze mSATA do dysków twardych i SSD*
  • Złącze Ethernet 10/100/(1000*)
  • Wejście kamery CSI
  • 2 Gniazda USB
  • Odbiornik podczerwieni do sterowania pilotem
  • Wejście zasilania zegara systeowego*
  • Analogowe wejście/wyjście Audio*
  • Cyfrowe wyjście audio SPDIF
  • Złącze miniPCIe*

Elementy oznaczone gwiazdką działają tylko z najdroższym modułem.

sprae