Serial port – wprowadzenie w pigułce

Serial port – wprowadzenie w pigułce

Witam majsterkowiczów! Dzisiaj chciałbym przedstawić Wam pokrótce, co to jest i jak można wykorzystać port szeregowy,  i jego monitor w zastosowaniach z Arduino. W tym wpisie wyświetlimy na panelu LCD tekst wpisywany poprzez serial monitor. Artykuł kierowanny jest głównie dla osób raczkujących w temacie Arduino, całość opisana jest pod wersję UNO.

Co będzie potrzebne?

Co to właściwie jest ten serial port?

Określenie serial port pochodzi z j. angielskiego i tłumaczone jest jako port szeregowy. Służy on do przesyłania i odbierania informacji, z i do komputera. W jego nazwie „szeregowy” oznacza, to że dla transmisji danych w danym kierunku dostępny jest tylko 1 pin. Przesyłać dane można przez ten port z różną, wcześniej ustaloną prędkością – jest to konieczne aby transmisja przebiegła prawidłowo.

Zaczynamy! – begin();

Chęć korzystania w danym programie z portu szeregowego trzeba oczywiście zadeklarować :), do czego służy funkcja begin(). Parametry jakie przyjmuje to:

  • prędkość – wyrażona w bodach (ang. baud), czyli bitach na sekundę. Najczęściej stosowaną prędkością jest 9600 bitów na sekundę, w zależności od potrzeb może być ona większa lub mniejsza. Należy pamiętać, aby zadeklarowana prędkość na obu urządzeniach które mają się komunikować(w tym przypadku komputer i Arduino) była taka sama!
  • drugi argument funkcji jest opcjonalny i konfiguruje takie parametry jak bit stopu i bit kontroli parzystości, nie będziemy go dziś używać(przynajmniej nie innego, niż domyślny : ).

Teraz przejdziemy do pierwszego programu, jako że minimum teorii już mamy.

W tym miejscu omówię jeszcze komendę Serial.println() – drukuje ona całą linijkę. Jeśli chcemy aby kilka rzeczy zostało wypisanych w tym samym wierszu moża użyć Serial.print(). Zakończyć ten wiersz można poprzez wydrukowanie znaku nowej lini tj. Serial.print(„\n”);

Opublikuj swój projekt i odbierz 50% rabatu do wykorzystania w sklepie Nettigo.pl

Na posiadaczy Arduino LEONARDO czeka w tym miejscu mała pułapka. Kod raczej nie zadziała poprawnie z tego wzgledu, że płytka nie restartuje automatycznie programu po uruchomieniu serial monitora, tak więc kod powinien wyglądać tak:

Więcej na ten temat można przeczytać tutaj.

Czy da się podejrzeć dane które są wysyłane i odbierane poprzez port szeregowy?

Tak! W środowisko programistyczne Arduino, wbudowane jest takie narzędzie jak serial monitor. Służy ono do odczytywania i wysyłania danych poprzez dany port szeregowy. Jak odczytywać a nawet i zapisywać na komputerze dane wędrujące poprzez ten port zostało opisane już tutaj: zapis danych temperatury, dlatego dziś skupię się głównie na komunikacji w drugą stronę – wysyłanie danych z komputera do Arduino.

Po załadowaniu szkicu do Arduino, otwieramy serial monitor, można zrobić to na kilka sposobów:

serialmonitor

Naszym oczom powinno ukazać sie coś takiego:

serialmonitor2

Jeżeli prędkość została źle ustawiona, pokaże nam się to samo okienko, tyle że z innymi informacjami:

serialmonitor3

Po otworzeniu serial monitora prędkość można spokojnie zmienić, spowoduje to kolejne zrestartowanie programu.

Wypisywanie otrzymanych danych do serial monitora

W tym przykładzie po krótce omówię funkcje available() i spolszczony przykład kodu z manuala. Funkcja zwraca ilość bajtów które po przesłaniu poprzez port szeregowy czekają na odczytanie. Nie przyjmuje żadnych parametrów.  Na pokład Arduino ładujemy:

Po otwarciu serial monitora i wpisaniu przykładowych danych widzimy:

serialmonitor4

Zaraz, zaraz… Coś tu nie gra! Jestem pewny, że przesłałem literkę a! Tak… W podanym przykładzie zapisywaliśmy otrzymane dane do zmiennej liczbowej (int), tak więc otrzymane dane są wyświetlane jako liczba. Owa liczba, jest reprezentacją przesłanego znaku w tablicy ASCII. Przy wyświetleniu otrzymanych danych( Serial.println(przeslanyBajt, DEC); ), ustawilismy wyświetlanie w postaci liczb dziesiętnych (ang. decimal). Jest możliwość reprezentacji znaków w innych systemach liczbowych: dwójkowym(BIN, ang. binary ) lub szestastkowym(HEX, ang. hexadecimal).

 

Wypisywanie wiadomości na LCD za pomocą serial monitora

W tym przykładzie przesłane dane, wyświetlimy w formie takiej, jakiej je pierwotnie wysyłaliśmy, czyli tekst jako tekst i liczby jako liczby. Pod Arduino podłączamy LCD.

Schemat:

serialmonitor4

Połączenie LCD do Arduino w ten sposób zostało dokładnie opisane tutaj.

Po podłączeniu sprzętu, ładujemy na pokład następujący program:

Po załadowaniu programu, odpalamy serial monitor i wpisujemy dowolny tekst:

serialmonitor5

 

Przed kliknięciem entera bądź wyślij z menu rozwijanego obok prędkości ustawiamy „Nowa linia (NL)” – oznaczać to będzie, że każdorazowo wysłany tekst będzie zakonczony znakiem nowej linii – a jest to warunek konieczny do tego, by nasz napisany wcześniej program zadziałał. Jeśli parametr był wczesniej ustawiony na „No line ending”, a wysyłaliście jakieś wiadomości to czekają one na odbiór w buforze i zostaną odczytane z najbliższą wiadomością która będzie zakonczona znakiem nowej linii. Całość oczywiście wyświetli się na naszym podłączonym LCD:

serialmonitor7

Minusem takiego rozwiązania sprawy jest dziwny znak wyświetlony na końcu wiadomości na LCD – jest to znak nowej linii, który został dodany do zmiennej odczyt_serial podczas odczytywania danych z bufora. Można temu w prosty sposób zaradzić, wystarczy zmienić miejsce w którym do zmiennej łańcuchowej był dodawany kolejno znak, po znaku(linijka 39) na:

Powyższa instrukcja oznacza „jeśli znak odczytany z bufora nie jest znakiem nowej lini(\n), przypisz zmienną znak, do zmiennej odczyt_serial.

Dla bardziej zaawansowanych – jeśli nie znacie, polecam zapoznanie się z funkcją serialEvent().

Po tym mało praktycznym wstępie ciężko zauważyć użyteczność portu szeregowego, jednakże wysyłając odpowiednie komendy z arduino na port szeregowy i monitorując go programem napisanym w innym języku(polecam Pythona), można  zrobić na przykład systemSMS powiadamiania o wciśniętym przycisku na pilocie : ) z tym, że zamiast odbiornika podczerwieni podłączyć można np. czujnik temperatury, wilgotności itd…

 

 

Ocena: 4.57/5 (głosów: 56)
Nettigo - patron działu Elektronika

Podobne posty

21 komentarzy do “Serial port – wprowadzenie w pigułce

  • fajny artykuł. Przydałby się jeszcze artykuł opisujący połączyć „gołą” atmege8 tak aby móc korzystac z serial monitora (uzywam USBasp jako programatora).

    Odpowiedz
  • „prędkość – wyrażona w bodach (ang. baud), czyli bitach na sekundę. Najczęściej stosowaną prędkością jest 9600 bitów na sekundę”

    A w Wikipedii jak byk:

    „Uwaga: Bod nie powinien być mylony z prędkością transmisji danych (mierzoną w bitach na sekundę). Każda zmiana sygnału może nieść informację o jednym lub więcej bitach (przykładowo w modulacji 16-QAM 4 bity)”

    Odpowiedz
    • Dziękuje za uwagę – rozchodzi się tutaj nie o mój błąd, a o małą precyzję w tym, co napisałem. Dla tego konkretnego przypadku, czyli portu szeregowego, który ma 2 kanały (nadawanie i odbieranie sygnału), dane transmitowane są bit po bicie, czyli chcąc nie chcąc w tym przypaku wychodzi na bity na sekundę. Zagadnienie modulacji, które tutaj podałeś jest mi zupełnie nie znane.

      Odpowiedz
  • Paweł podlacz pod atmege rx,tx pin 0 i 1 max232 zrobilem sobie w ten sposob (klona arduino) i z arduino ide mozna zgrac sketch pod warunkiem ze masz usb->rs232 (max232 u mnie w elektronicznym to koszt kolo 5zl)

    Odpowiedz
  • Idzie podłączyc bez potencjometru LCD?:)

    Bo bez niego nic mi sie nie wyświetla.
    Jak podepnę pin 3 do masy (GND) to mam same kwadraciki jak ktoś wyżej pisał.

    Znalazłem jeszcze takie coś:
    http://forum.arduino.cc/index.php/topic,28486.0.html

    I tam jest wzmianka:
    As an alternative to the potentiometer you can connect the Vo pin of the LCD with any available PWM-output (e.g. pin 9) and add the following code in the setup() section:

    pinMode(9, OUTPUT);
    analogWrite(9, CONTRAST);

    replace CONTRAST with the value of your choice. Values around 10-20 give a nice bright output.

    Pytanie jak to w praktyce podpiac

    Odpowiedz
    • Musisz podpiac jakis pin pwn arduino(w tym przykladzie pin 9) do zlacza wyswietlacza oznaczonego Vo i w programie w void setup ustawic pin 9 jako wyjscie
      pinMode(9, OUTPUT) //pin 9 ustawiony jako wyjscie
      oraz ustawic wartosc wypelnienia pwn na tym pinie
      analogWrite(9, 20) //wartosc wypelnienia pwn dla pinu 9 wynosi 20

      jak napisano w cytowanym tekscie wartosc w przedziale 10-20 powinna dac optymalny kontrast

      Odpowiedz
    • Pin 3 wyświetlacza LCD(V0) służy do regulacji kontrastu. Zamiast potencjometru wolno Ci równierz podłączyć rezystor 4.7 kOhm do masy. Im większa rezystancja tym mniejszy kontrast. Co do rezystorów to one są tanie i kosztują maks 80 gr. Wylutowywanie ich ze starych sprzętów to by była wiocha :). 4.7 kohm paski:
      żółty | fioletowy | czerwony | złoty. Zamiast złotego może być inny kolor

      Odpowiedz
  • Witam, Zajmuję się Arduino Mega i udało mi się skomunikować Win8 i Megę, Komunikacja jest dość trudna do ogarnięcia ale mogę sterować Megą z poziomu programu napisanego w Pythonie. Odnośnie „dziwnych znaczków” w serial port monitorze to polecam poczytać dobrą książkę o kodowaniu znaków w C, C++.

    Odpowiedz
  • Mam taki może banalne pytanie a mianowicie :
    – jak odczytamy ilość odczytanych danych poleceniem Serial.available() i będzie to np. 3 to aby nic nie pozostało w buforze odczytu musimy trzykrotnie użyć polecenia Serial.read(); aby bufor się WYCZYŚCIŁ ?
    Czy może istnieje inne polecenie czyszczenia bufora odczytu?

    Odpowiedz

Odpowiedz

anuluj

Serial port - wprowadzenie w pigułce

Nie przegap nowych projektów!

Zapisując się na nasz Newsletter będziesz miał pewność, że nie przegapisz żadnego nowego projektu opublikowanego w Majsterkowie!

Od teraz nie przegapisz żadnego projektu!

Masz uwagi?