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

Regulator PID na arduino.

Regulator PID na arduino.

Witam wszystkich majsterkowiczów! Chciałbym przedstawić wam moje nagranie dotyczące realizacji regulatora PID przy użyciu arduino.Regulatory…

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?