Skynet - czyli jak opanować Arduino cz. 2

Witajcie!
Dzięki Bogu mamy już za sobą te całą wstępną biurokrację. Wiemy już jak programować i znamy podstawy pisania programów naszego maleństwa. Teraz w końcu można się zająć tym co tygryski lubią najbardziej. Wykorzystajmy więc to ustrojstwo do czegoś!
Komunikacja
W poprzednim odcinku nauczyliśmy się jak sprawić by wbudowana dioda świecąca sama mrugała. Teraz postaramy się by mrugała na nasze zawołanie.
Przepis będzie polegał na tym:
- 1) Ustaw pin 13 jako wyjście
- 2) Ustaw port szeregowy na 9600 bodów
- 3) Sprawdź czy port szeregowy coś odebrał
- 4) Jeśli odebrał i jest to "0" - ustaw stan niski na pinie 13 (Wyłącz diodę)
- 5) Potwierdź wyłączenie diody
- 6) Jeśli odebrał i jest to "1" - ustaw stan wysoki na pinie 13 (Włącz diodę)
- 7) Potwierdź włączenie diody
- 6) Wróć do punktu 3
Potrzebne nam składniki:
- znana z poprzedniego odcinka funkcja "pinMode" służąca do ustawienia kierunku sygnału na pinie
- metoda "Serial.begin", która służy ustawieniu parametrów złącza szeregowego w naszym Arduino
- metoda "Serial.read", za jej pomocą czytamy dane z portu szeregowego
- metoda "Serial.println", za jej pomocą wysyłamy dane przez port szeregowy
- metoda "Serial.available", mówi ona nam ile bajtów zostało odebranych przez port szeregowy
- funkcja "digitalWrite" służąca do ustawiania stanu na wybranym pinie
Ktoś mógłby zapytać, skoro mamy USB to czemu zachowujemy się jakbyśmy mieli starodawny RS-232 (COM). Otóż mikrokontroler zawarty w Arduino komunikuje się właśnie w ten sposób z "dużym" komputerem. Po drodze jednak stoi specjalny układ który konwertuje je na standard USB. W standardzie USB wymyślono klasy urządzeń, służące do uniwersalnego komunikowania się z pewnymi typami urządzeń. Dzięki temu wkładając pendrive'a komputer wie co ma z nim robić. Tak samo jest z układem w Arduino. On przedstawia się jako port szeregowy, dzięki czemu system operacyjny może go tak zaklasyfikować i przedstawić aplikacjom użytkownika. To zapewnia prostą komunikacje i kompatybilność.
Skoro już wiemy jak to działa - czas na część twórczą. Oto program, który spełnia nasze założenia:
int ledPin = 13; // nadanie etykiety dla pinu do ktorego podlaczona jest dioda
int serialData; // ta zmienna bedzie przechowywala dane z portu szeregowego
void setup()
{
Serial.begin(9600); // ustawnienie predkosci portu szeregowego na 9600 bodow
pinMode(ledPin, OUTPUT); // ustawienie pinu diody na wyjscie
}
void loop()
{
if (Serial.available() > 0) // sprawdzenie czy port szeregowy odebal dane
{
serialData = Serial.read(); // odczytanie danych z portu szeregowego
if (serialData == '0') // sprawdzenie czy odebrano "0"
{
digitalWrite(ledPin, LOW); // wylaczenie diody
Serial.println("Dioda wylaczona"); // wyslanie komunikatu o wylaczeniu diody
}
if (serialData == '1') // sprawdzenie czy odebrano "1"
{
digitalWrite(ledPin, HIGH); // wlaczenie diody
Serial.println("Dioda wlaczona"); // wyslanie komunikatu o wlaczeniu diody
}
}
}
Program jak zwykle nie był nadzwyczajnie trudny i każdy zaznajomiony z podstawami programowania w c/c++ powinien zrozumieć jego działanie.
Teraz możemy zaprogramować układ wciskając odpowiedni przycisk w Arduino IDE.
Komunikacja komputera z Arduino.
Jeśli jesteśmy posiadaczami Windows będziemy musieli użyć programu HyperTerminal. Tam wybierając odpowiedni port "COM" i ustawiając jego prędkość na 9600 powinniśmy połączyć się z urządzeniem.
Na Linuksie będziemy używali konsoli. Wpisując tam:
screen /dev/ttyUSB0 9600
powinniśmy połączyć się z Arduino. (W przypadku niepowodzenia należy wybrać plik urządzenia taki jaki wybraliśmy w Arduino IDE)
Gdy już jesteśmy połączeni, naciskając na klawiaturze 1 lub 0, powinniśmy włączać i wyłączać wbudowaną diodę świecącą otrzymując przy tym odpowiedni komunikat terminala.
Jeśli działa to wspaniale! Jeśli nie - proszę zostawić komentarz, postaram się pomóc.
Czy można zrobić coś więcej?
Oczywiście! Ponieważ uwielbiam Pythona przedstawię wam prosty sposób jak za jego pomocą sterować programem, który wczytaliśmy do Arduino. Potem można dołączyć ten kod do swoich dzieł i np. informować w ciekawy sposób o nadejściu e-maila, czy osiągnięciu dużego obciążenia procesora.
Jedyne co będzie nam potrzebne to dodatkowy moduł "python-serial". Należy go zainstalować z menadżera pakietów.
Otwieramy terminal i uruchamiamy tryb interaktywny pythona.
Po czym wpisujemy poniższe zaklęcia
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
>>> ser.write('1')
>>> ser.readline()
'Dioda wlaczona\r\n'
>>> ser.write('0')
>>> ser.readline()
'Dioda wylaczona\r\n'
Jak zwykle należy pamiętać o ustawieniu swojego portu.
Takie rozwiązanie aż korci by dopisać do niego dpecjalny moduł:
import serial
class ArduinoLED(object):
def __init__(self, port='/dev/ttyUSB0'):
self.serial = serial.Serial(port, 9600, timeout=1)
def on(self):
self.serial.write('1')
if self.serial.readline() == 'Dioda wlaczona\r\n':
return True
return False
def off(self):
self.serial.write('0')
if self.serial.readline() == 'Dioda wylaczona\r\n':
return True
return False
if __name__ == '__main__':
import time
led = ArduinoLED()
while True:
led.on()
time.sleep(1)
led.off()
time.sleep(1)
Doszliśmy do etapu w którym Arduino robi dokładne to co wczoraj, jednak dziś robi to na polecenie komputera.
Poniższy przykład pokazuje jak używać modułu we własnym programie
>>> import arduinoled
>>> a = arduinoled.ArduinoLED()
>>> a.on()
True
>>> a.off()
True
>>>
To by było dziś na tyle. Czuję się jednak w obowiązku przeprosić Państwa za nieprecyzyjne planowanie. Opis pinów i podłączanie elementów do płytki zostawiłem na jutro. Wydaje mi się, że dzisiejsza tematyka okazała sie trochę ważniejsza dla początkujących, gdyz umożliwi np. logowanie tego co w danej chwili nasz program zaszyty w AVR robi. Wszystko wynikło z tego, że dzisiejszą lekcje planowałem dwa dni temu, a jutrzejsza wczoraj ;-). Musicie mi wybaczyć.
Pliki:
undercontrol.pde - Plik źródłowy dla Arduino do zdalnego sterowania diodą
arduinoled.py - Plik modułu pythona do zdalnego sterowania diodą w Arduino
Pozdrawiam i życzę miłej nocy!
sprae
PS. Jeśli ktoś ma już Arduino i chce się przygotować na jutro, niech zdobędzie potencjometr 10 kOhm
Poleć wpis
RSS

24 lutego 2009 o 23:58:48
Jutro będzie trzeba coś lutować?
25 lutego 2009 o 13:01:17
Scout: To zależy od typu. Czasem są oczka na których można zawiązać przewód a czasem nie i trzeba przylutować. No ale lut jest zazwyczaj trwalszy.
18 kwietnia 2009 o 03:35:06
Nigdy bym nie pomyślał o wykorzystaniu do komunikacji screena. Ja z moją atmegą32 „rozmawiam” przez minicoma.
18 kwietnia 2009 o 14:27:19
JRK: Ja też nie znałem tej funkcji, jednak znalazłem ją przy okazji jakiegoś HOWTO i okazało się wygodne. Człowiek uczy się całe życie ;-).
27 lutego 2010 o 11:08:59
ja jestem całkowicie początkującym. Jeżeli chcę zapalić diodę wysyłając liczbę np. 12, to dlaczego dioda się nie zapala? W arduino ustawiłem 12 jako załączenie diody.
27 lutego 2010 o 13:39:57
W tym przykładzie Arduino reaguje tylko na znaki o pojedynczym bajcie (cyfra, litera).
Aby przerobić to na odczyt większej ilości bajtów (czyli napisów dłuższych niż jeden znak) proponuję zapoznać się z
http://arduino.cc/en/Serial/Available
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/
31 marca 2010 o 18:55:38
Właśnie zaczynam zabawę z ardruino, super
31 marca 2010 o 19:01:18
woody8: Fajnie, że piszesz. Jakbyś chciał o coś zapytać to nie krępuj się. Kontakty są z boku, ale możesz też pytać w "komciach". Powodzenia w rozpracowywaniu :-)
15 lipca 2010 o 14:20:39
Witam. Świetny blog:) Napisałeś "Jeśli jesteśmy posiadaczami Windows będziemy musieli użyć programu HyperTerminal", wystarczy chyba skorzystać z Serial Monitor zawartego w darmowym IDE do arduino.
15 lipca 2010 o 14:24:04
Witaj :-)
Dziękuję za uznanie i sprostowanie. Wtedy miałem 64b system i jakieś problemy z IDE dlatego wybrałem ostrożniejsze rozwiązanie, ale dziś już to działa.
Pozdrawiam i liczę na ujawnienie się z własnymi projektami.
06 stycznia 2011 o 22:03:50
Cześć, naprawdę świetny blog! Używam linuxa (xubuntu) i wszystko pięknie działa :). Mam jednak takie pytanie, a jeszcze nie wczytywałem się w dokumentację: jak wyjść z trybu screen, w który przełącza funkcja screen, tzn jak wrócić do zwykłej konsolki? Wiem, że screen przestaje działać, gdy odłączy się Arduina od usb, ale chyba powinien być jakiś inny sposób :). Sorry, za lenistwo i nie sprawdzenie dokumentacji ;-).
Pozdrawiam gorąco!
06 stycznia 2011 o 22:40:07
Dziękuję za miłe słowa. Można zamknąć okno "screena" wciskając ctrl+"a", a potem osobno "k".
Miłej zabawy :-)
07 stycznia 2011 o 12:34:24
Super, działa ;-). Mogę jeszcze dodać, że wbudowany w Arduino IDE Serial Monitor też bezproblemowo działa na Linuksie (na Windowsie też, tak jak napisał szary).