sprae :: przygody z programowaniem


Skynet - czyli jak opanować Arduino cz. 2

Wpis na 0. poziomie, wysłany 24 lutego 2009 o 23:09:49

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. 1) Ustaw pin 13 jako wyjście
  2. 2) Ustaw port szeregowy na 9600 bodów
  3. 3) Sprawdź czy port szeregowy coś odebrał
  4. 4) Jeśli odebrał i jest to "0" - ustaw stan niski na pinie 13 (Wyłącz diodę)
  5. 5) Potwierdź wyłączenie diody
  6. 6) Jeśli odebrał i jest to "1" - ustaw stan wysoki na pinie 13 (Włącz diodę)
  7. 7) Potwierdź włączenie diody
  8. 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


Komentarze do notki Skynet - czyli jak opanować Arduino cz. 2

  1. 24 lutego 2009 o 23:58:48

    Jutro będzie trzeba coś lutować?

  2. 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.

  3. 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.

  4. sprae

    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 ;-).

  5. rd

    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.

  6. 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/

  7. woody8

    31 marca 2010 o 18:55:38

    Właśnie zaczynam zabawę z ardruino, super

  8. 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 :-)

  9. szary

    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.

  10. 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.

  11. Robert

    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!

  12. 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 :-)

  13. Robert

    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).

Dodaj komentarz: