Apple MacBook kontra Arduino

Wczoraj premierę miał MacBook – nowy komputer firmy Apple. Jedną z jego cech jest pozbycie się większości gniazdek. Pozostawiono jedynie maleńkie USB typ C. Tak jak w przypadku tabletów i telefonów służy ono głównie do ładowania.

Trend ten nie jest odosobniony. Firma Intel – producent najważniejszych podzespołów do PC również ma wizję, by w przyszłych laptopach wyzbyć się większości złącz – nawet tych od ładowania, stawiając na fale radiowe i indukcję magnetyczną. 
Dotyka to też internetowych komputerów typu ChromeBook od Google.

Komputery profesjonalistów i entuzjastów PC pewnie długo pozostaną tradycyjnymi. Lecz jak mawiał Adam Savage – nasze wynalazki tworzymy głównie z myślą o innych, bo patrzenie jak komuś się przydają daje większą satysfakcję niż samo ich stworzenie. Może się zdarzyć, że inni będą mieli jeden z tych nowoczesnych, wygodnych komputerów. Ba, już dziś możemy trafić na kogoś, kto posługuje się wyłącznie tabletem lub smartphone’m.

Co zrobić?

Na szczęście wymyślono już kilka płytek kontrolerów, które dobrze sobie radzą w takich sytuacjach.

Arduino Yun

Jest to płytka oparta na znanych i lubianych kontrolerach Arduino. Od tradycyjnych modeli różni się tym, że wyposażono ją w moduł komunikacji sieciowej. Zarówno Wi-Fi, jak i Ethernet.

Oprócz programów do sterowania urządzeniami podłączonymi do pinów, możemy w tym modelu dodać do nich strony WWW przez które można sterować przez sieć urządzeniem. To wygodny sposób dla użytkowników wszelkiej maści nowoczesnych urządzeń.

Arduino Yun programuje się za pomocą standardowego Arduino IDE tylko, że bezprzewodowo przez sieć Wi-Fi. Więc można do tego użyć nawet nowego MacBooka.

Płytka kontrolera Arduino Yun w sklepie Nettigo.

Raspberry PI

Raspberry Pi to mała płytka w której mieści się praktycznie cały komputer. Można ją podłączyć do sieci przez złącze Ethernet. Jeśli potrzebujesz Wi-Fi możesz użyć tanich dongli USB. Płytka ma też wyjście do podłączenia telewizora HDMI, wejście kamery i wyjście wyświetlacza.

Raspberry Pi działa na systemie operacyjnym Linux. Wszystko co możesz za jej pomocą zrobić, ogranicza się do twojej znajomości Linuksa. Większość rzeczy programuje się za pomocą języka Python. Duża społeczność stworzyła też wiele rozwiązań dla innych języków programowania i dużo bibliotek do różnych podzespołów.

Raspberry można programować podłączając do płytki mysz, klawiaturę i telewizor lub przez sieć za pomocą protokołów SSH i SFTP.

Płytka kontrolera Raspberry PI w sklepie Nettigo

Netduino

Jest to płytka dla wielbicieli rozwiązań firmy Microsoft, gdyż programuje się ją w języku C#. Urządzenie ma wyprowadzenia zgodne ze standardem Arduino i przygotowana jest głównie do urządzeń sterowanych przez sieć Internet. Wyposażona jest w gniazdo Ethernet. Programowanie przeprowadza się za pomocą środowiska Visual Studio.

Najnowszy model Netduino znajdziesz w sklepie Nettigo

Arietta G25

Arietta to skromna płytka kontrolera z systemem operacyjnym Linux oraz dużą ilością różnych wyjść. Płytka sama z siebie nie potrafi się połączyć z internetem w żaden sposób, jednak ma dostępne dodatkowe, tanie moduły Wi-Fi.

Ciekawostką jest to, że port USB przez który programujesz płytkę działa jako urządzenie sieciowe, dzięki któremu masz dostęp do SSH i SFTP.

Płytka Artietta w sklepie Nettigo

sprae

Arduino Yun OpenWRT 1.5

Pojawiła się nowa wersja softu dla Arduino YUN. Jeśli jeszcze nie wiesz, w tej małej płytce wielkości Arduino zmieścili dodatkowy pełnoprawny komputerek z dystrybucją Linuksa.

Aktualizacja jest prosta.

  • Ściągasz plik zip OpenWRT YUN 1.5.0
  • Rozpakowujesz na kartę SD
  • Włączasz Arduino
  • Logujesz się do jego panelu przez przeglądarkę
  • Klikasz w przycisk aktualizuj i po kilku minutach cieszysz się nową wersją.

W nowej wersji znajdziesz:

  • Regulację opóźnienia dla REST API w pliku /etc/config/arduino
  • Do pakietów dodano kompilator yun-gcc
  • Poprawiono menadżer pakietów opkg
  • Interpreter node js automagicznie wykrywa czy jest włączony swap i ustawia sobie odpowiedni profil wykorzystania pamięci

W tym tygodniu przyjrzę się tym zmianom i opiszę co tak na serio dają.

sprae

Nowe OpenWRT dla Arduino Yun

OpenWRT to dystrybucja Linuksa działająca na płytce Arduino Yun. W nowej wersji (1.4.2) niewiele się zmieniło. Poprawiono kilka błędów i dodano repozytorium pakietów obsługujących alljoyn – “korpo-protokół” dla urządzeń Internet Of Things.

Aktualizuje się cały obraz systemu. Zatem po nim tracisz wszystkie ustawienia, doinstalowane pakiety i dane w pamięci płytki. Jeśli rozszerzałeś pamięć płytki na kartę SD, to też tracisz.TL;DR – Po aktualizacji wszystko konfigurujesz od nowa.

Zwykle aktualizacja polega na tym, że ściągasz plik zip ze strony Arduino:

OpenWRT dla Arduio Yun 1.4.2

Rozpakowujesz i wrzucasz do katalogu głównego karty microSD, której używasz w Yun.

Po uruchomieniu Yun na jego stronie głównej otrzymasz informację, że odnaleziono obraz nowego systemu i jak klikniesz przycisk to zostanie zaktualizowany. I tyle.

Aktualizacja trwa jakieś 3 minuty i w tym czasie mruga dioda WLAN na płytce.

Ja miałem pod górkę, bo nie mam pod ręką czytnika microSD. Mamy do czynienia z Linuksem. Wszystko można rozwiązać na 10 sposobów.

Zalogowałem się przez ssh do płytki. Użytkownik: root, hasło takie jakie nadałeś płytce na stronie głównej.

W w konsoli będą potrzebne polecenia wget i unzip. Jeśli ich nie masz to doinstalowujesz za pomocą opkg.

opkg update
opkg install wget
opkg install unzip

Następnie przechodzisz do katalogu karty SD.

cd /mnt/sd

I ściągasz tam zip obrazu systemu

wget -c http://downloads.arduino.cc/openwrtyun/1/YunSysupgradeImage_v1.4.2.zip

Po ściągnięciu obraz trzeba rozpakować

unzip YunSysupgradeImage_v1.4.2.zip

I usunąć plik zip. Bo nie będzie już potrzebny

rm YunSysupgradeImage_v1.4.2.zip

Po wejściu na strone główną twojego Arduino Yun, zobaczysz że obraz jest gotowy do instalacji.

Tu moje logi.

root@Arduino:/mnt/sda1# wget -c http://downloads.arduino.cc/openwrtyun/1/YunSysu
pgradeImage_v1.4.2.zip
--2014-09-05 14:41:13--  http://downloads.arduino.cc/openwrtyun/1/YunSysupgradeImage_v1.4.2.zip
Resolving downloads.arduino.cc... 2607:f298:4:143:acce:55:0:1, 64.90.32.4
Connecting to downloads.arduino.cc|2607:f298:4:143:acce:55:0:1|:80... failed: Address family not supported by protocol.
Connecting to downloads.arduino.cc|64.90.32.4|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8867590 (8.5M) [application/zip]
Saving to: `YunSysupgradeImage_v1.4.2.zip'

100%[======================================>] 8,867,590   37.0K/s   in 3m 47s

2014-09-05 14:45:01 (38.2 KB/s) - `YunSysupgradeImage_v1.4.2.zip' saved [8867590/8867590]


root@Arduino:/mnt/sda1# opkg update
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/attitude_adjustment.
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/Packages.sig.
Signature check passed.
root@Arduino:/mnt/sda1# opkg install unzip
Installing unzip (5.52-1) to root...
Downloading http://downloads.arduino.cc/openwrtyun/1/packages/unzip_5.52-1_ar71xx.ipk.
Configuring unzip.
root@Arduino:/mnt/sda1# unzip YunSysupgradeImage_v1.4.2.zip
Archive:  YunSysupgradeImage_v1.4.2.zip
  inflating: openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin
root@Arduino:/mnt/sda1# rm YunSysupgradeImage_v1.4.2.zip

sprae

Tajemnice wejść analogowych Arduino Leonardo i Yun

W Arduino Leonardo i Arduino Yun zastosowano inny kontroler niż w tradycyjnych płytkach. Jest nim ATmega32u4. Ma on kilka zalet w porównaniu z poprzednikami – sprzętowe USB, więcej wyjść PWM i więcej wejść analogowych.

Wejścia analogowe oprócz tradycyjnych cech opisanych w poprzednim wpisie mają też nowe możliwości.

long readADC(byte ref, byte input)
{
  ADMUX = (input & 31) | ((ref & 3) << 6);
  bitWrite(ADCSRB, 5, ((input & 32) >> 6));
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  long result = ADCL;
  result |= ADCH<<8;
  
  return result;
}

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

void loop() 
{
  Serial.println(readADC(3, 39));
  delay(1000);
}

Użyta w programie funkcja readADC pozwala je odkryć.

word value = readADC(ref, input);

  • value – wartość odczytana z wejścia analogowego (0 – 1023)
  • ref – numer źródła napięcia referencyjnego
  • input – numer wejścia analogowego.

Argument “ref” może przyjąć następujące wartości:

  • 0 – napięcie referencyjne to napięcie zasilania
  • 1 – napięcie referencyjne pochodzi z pinu AREF
  • 3 – napięcie referencyjne pochodzi z dokładnego źródła 2,56 V

Jeśli czytałeś poprzedni wpis to zadanie i możliwości napięcia referencyjnego są ci znane.

Dużo ciekawiej jest z drugim argumentem “input”. Zacznę od standardowych możliwości.

Wprowadzając tam jedną z tych wartości odczytujesz standardowe wejścia analogowe:

  • 0    A5
  • 1    A4
  • 4    A3
  • 5    A2
  • 6    A1
  • 7    A0
  • 32    D4/A6
  • 33    D12/A7
  • 34    D6/A8
  • 35    D8/A9
  • 36    D9/A10
  • 37    D10/A11

Do tej pory nuuuda. Wszystko prawie jak bibliotekach Arduino, tylko bardziej zagmatwane ;-). Jednak mamy do dyspozycji więcej liczb w tym argumencie, które kryją dodatkowe możliwości.

Następna grupa to:

  • 30    1.1 V
  • 31    0 V
  • 39    Temperatura

Wartość 30 argumentu podaje na wejście przetwornika dokładne napięcie 1,1 V. Pozwala to skalibrować wynik podawany przez wejście i napięcie odniesienia. Tak jak w poprzednim wpisie.

Wartość 31 podaje na wejście analogowe 0 V. To taka wartość testowa, czy przetwornik zwróci wynik 0.

Wartośc 39 odczytuje temperaturę panującą w środku kontrolera. Pomiar nie jest zbyt precyzyjny. Ma dokładność +/-10 stopni Celsjusza. Służy głównie do tego by kalibrować wewnętrzne elementy wrażliwe na temperaturę (jak generator RC). Trudno nim zmierzyć temperaturę w pokoju, bo przecież kontroler też się nagrzewa podczas pracy.

Kolejne wartości dotyczą wejść symetrycznych.

Standardowo wejścia analogowe Arduino mierzą napięcie między pinami GND i wybranym wejściem analogowym.

W wejściach symetrycznych dostajesz do dyspozycji 2 wejścia analogowe. Jedno z biegunem dodatnim “+”, a drugie z biegunem ujemnym “-”. Napięcie jest mierzone między tymi biegunami.

Wejścia symetryczne ułatwiają wiele obwodów w których nie chcesz do pomiarów używać GND. Jak np. w pomiarze prądu za pomocą rezystora o małej wartości, albo przy czujnikach wagi w układzie mostka.

Wartości wejść symetrycznych to:

  • 16    +A5    -A4
  • 20    +A3    -A4
  • 21    +A2    -A4
  • 22    +A1    -A4
  • 23    +A0    -A4

Czyli biegun dodatni takiego wejścia jest w wybranym pinie A0, A1, A2, A3, A5, a biegun ujemny jest w pinie A4.

Wejścia symetryczne mają jeszcze jedną opcję. Pozwalają przepuścić wejście przez wzmacniacz i wzmocnić sygnał od 10 do 200 razy.

Kombinacja wejść symetrycznych i siła wzmocnienia przypisana jest do następujących wartości:

  • 9    +A4    -A5    x10
  • 11    +A4    -A5    x200
  • 38    +A4    -A5    x40
  • 40    +A3    -A5    x10
  • 41    +A2    -A5    x10
  • 42    +A1    -A5    x10
  • 43    +A0    -A5    x10
  • 44    +A3    -A4    x10
  • 45    +A2    -A4    x10
  • 46    +A1    -A4    x10
  • 47    +A0    -A4    x10
  • 48    +A3    -A5    x40
  • 49    +A2    -A4    x40
  • 50    +A1    -A5    x40
  • 51    +A0    -A5    x40
  • 52    +A3    -A4    x40
  • 53    +A2    -A4    x40
  • 54    +A1    -A4    x40
  • 55    +A0    -A4    x40
  • 56    +A3    -A5    x200
  • 57    +A2    -A5    x200
  • 58    +A1    -A5    x200
  • 59    +A0    -A5    x200
  • 60    +A3    -A4    x200
  • 61    +A2    -A4    x200
  • 62    +A1    -A4    x200
  • 63    +A0    -A4    x200

Wzmocnienie 200 razy przy napięciu odniesienia 2,56 V pozwoli zmierzyć napięcia nawet do 12,5 mikrowolta.

sprae

Dokładniejsze wejścia analogowe w Arduino Yun i Leonardo

Każde Arduino ma wejścia analogowe w sekcji ANALOG IN (od A0 do A5). Pozwalają one dokładnie mierzyć napięcie.
Arduino Yun i Leonardo mają więcej wejść analogowych. Są one ukryte w pinach sekcji DIGITAL.

  • Pin cyfrowy 4 to wejście analogowe A6
  • Pin cyfrowy 6 to wejście analogowe A8
  • Pin cyfrowy 8 to wejście analogowe A9
  • Pin cyfrowy 9 to wejście analogowe A10
  • Pin cyfrowy 10 to wejście analogowe A11
  • Pin cyfrowy 12 to wejście analogowe A7

Napięcie na wejściach analogowych mierzysz za pomocą funkcji “analogRead”

word value = analogRead(numer_wejścia);

Gdzie:

  • value – zmienna przechowująca wynik pomiaru od 0 do 1023. Gdzie 0 to 0 V, a 1023 to domyślnie 5 V.
  • numer_wejścia – numer wejścia analogowego zależnie od pinu w Yun to wartości do 0 dla pinu A0 do 11 dla pinu A11.

Dokładność pomiaru wejść analogowych zależy od napięcia odniesienia.

Napięcie odniesienia to wzorcowe napięcie, przy którym przetwornik wejścia analogowego wskazuje wartość maksymalną (1023).

Napięcie odniesienia ustawiasz za pomocą funkcji “analogReference”.

analogReference(reference);

reference – rodzaj napięcia odniesienia.
Rodzaj wybieramy za pomocą stałych, gdzie:

  • DEFAULT – napięciem odniesienia jest napięcie zasilania około 5 V
  • INTERNAL – napięciem odniesienia jest dokładne napięcie 2,56 V
  • EXTERNAL – napięciem odniesienia jest napięcie podłączone do pinu AREF

W zależności od tego jaki zakres wyjść ma czujnik podłączony do wejścia analogowego, wartość napięcia odniesienia powinna być większa lub równa z jego zakresem.

Najbardziej dokładny jest rodzaj INTERNAL, ale nadaje się od tylko do urządzeń z wyjściem od 0 do 2,5 V (np pojedyncze ogniwa baterii).

Najmniej dokładny jest rodzaj DEFAULT, bo napięcie zasilania nie ma idealnie 5 V. Zmienia się pod wpływem różnych warunków np. obciążenia, albo zakłóceń.

Można poprawić dokładność pomiaru z referencją DEFAULT. W tym celu przerobiłem mały programik, który zwróci dokładne napięcie odniesienia.

long readVcc()
{
  ADMUX = _BV(REFS0) | _BV(MUX1) | _BV(MUX2) | _BV(MUX3) | _BV(MUX4);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  long result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

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

void loop() 
{
  Serial.println(readVcc());
  delay(1000);
}

Funkcja “readVcc” zwraca dokładną wartość napięcia zasilania w mili voltach. Właśnie dla takiego napięcia przetwornik będzie zwracał wartość 1023.

Ciekawe, że Arduino Yun zwróciło mi wartość zasilania 4200 mV.

sprae

5 Dni z przekaźnikiem Nettigo – Dzień 4 – Arduino Yun

Arduino YUN to płytka oparta na standardzie Arduino UNO. Zatem cały schemat połączeń przekaźnika jest identyczny z tym zaprezentowanym w dniu 2.

Arduino YUN to więcej niż zwykłe Arduino, dlatego postanowiłem poświecić mu jeden z dni z przekaźnikiem.

YUN, oprócz standardowego kontrolera AVR, ma w sobie dodatkowy komputer z Linuksem na bazie procesora MIPS. Komputer ten może łączyć się z internetem poprzez port Wi-Fi lub złącze Ethernet. Za pośrednictwem specjalnych bibliotek, mały kontroler Arduino łączy się z Linuksem i odbiera różne dane.

Najpopularniejszym sposobem odbierania danych jest protokół REST. Chodzi w nim o to, że komunikujesz się z Arduino za pomocą adresów WWW, a on odsyła informacje do przeglądarki.

Służy do tego biblioteka YunServer i YunClient. Elementy tej biblioteki czytają fragment linku wysłanego do Arduino i wysyłają to co ma się pojawić w przeglądarce.

Wykorzystując te biblioteki napisałem program, który steruje przekaźnikami podłączonymi do YUN do pinów cyfrowych 2, 3, za pośrednictwem linków.

#include <YunServer.h>
#include <YunClient.h>

YunServer server;

// Piny do których podłaczone są przekaźniki 2 i 3
byte relayPins[] = {2, 3};

void setup()
{
  server.listenOnLocalhost();
  server.begin();

  // Ustawianie pinów przekaźników jako wyjście
  for (byte i=0; i<sizeof(relayPins); i++)
  {
    pinMode(relayPins[i], OUTPUT);
  }
}

void loop()
{
  YunClient client = server.accept();
  if (client)
  {
    // Jeśli ktoś wywołał adres to włącza funkcje obsługi przekażnika
    relayHandle(client);

    client.stop();
  }

  delay(50);
}

void relayHandle(YunClient client)
{
  // Odczytywaie numeru przekanika
  byte index = client.parseInt();
  byte mode;
  
  // Reakcja na błędny numer przekaźnika
  if (index == 0 || index >= (sizeof(relayPins)))
  {
    client.println(F("Error!"));
  }

  // Sprawdzanie czy chcesz odczytać stan czy zapisać
  if (client.read() == '/')
  {
    // Zapis stanu
    byte mode = client.parseInt();
    digitalWrite(relayPins[index-1], mode);
  }

  else
  {
    // Odczyt stanu
    mode = digitalRead(relayPins[index-1]);
  }

  // Wyłanie wyników pracy przekaźników
  client.print(F("Relay: "));
  client.print(index);
  if (mode == 0)
  {
    client.println(F(" Off"));
  }

  else
  {
    client.println(F(" On"));
  }
}

Program działa tak, że wpisując do przeglądarki:

http://myArduinoYun.local/arduino/1/1

Zostanie włączony pierwszy przekaźnik podłączony do pinu 2. W przeglądarce pojawi się napis:

Relay: 1 On

Wpisując:

http://myArduinoYun.local/arduino/1/0

Ten przekaźnik zostanie wyłączony, a w przeglądarce pojawi się napis:

Relay: 1 Off

Zapewne już zauważyłeś, że pierwsza cyfra adresu odpowiada za numer przekaźnika, a druga za jego stan – 0 wyłączony, 1 włączony.

Idąc za ciosem, gdy wpiszesz:

http://myArduinoYun.local/arduino/2/1

włączysz drugi przekanik, podłączony do pinu 3.

W programie jest zmienna globalna

// Piny do których podłaczone są przekaźniki 2 i 3
byte relayPins[] = {2, 3};

do której nawiasów klamrowych {} możesz dopisać numery kolejnych pinów do których są podłączone przekaźniki, rozdzielając je przecinkiem.

Program działa dość prosto. W funkcji loop, sprawdzane jest czy program odebrał link. Jeśli tak to obiekt client jest czymś podobnym do obiektu Serial. To co się z niego odbiera to tekst adresu, który odebrało Arduino (cały napis znajdujący się za “http://myArduinoYun.local/arduino/”). U nas odbieramy “{numer}/{numer}”.

To co się wysyła do obiektu client, zostanie odebrane przez przeglądarkę i wyświetlone przez nią. Wysyłać można standardowo np. poprzez client.println(“Napis”);.

Metoda client.stop(); kończy połączenie z przeglądarką.

W programie jest jeszcze jedna opcja. Wpisując adres:

http://myArduinoYun.local/arduino/1

Otrzymasz tylko informację czy przekaźnik nr 1 jest włączony czy nie.

Dzięki Arduino Yun i modułowi przekaźnika Nettigo możesz sterować urządzeniami za pomocą przeglądarki WWW. Tradycyjnie używając linków na stronie, albo wykorzystując Ajax w JavaScript.

sprae