Python - biblioteka pyserial i komunikacja z portem COM

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 16173 razy

W starszych komputerach istnieją porty szeregowe RS-232 w nowszych komputerach portu tego raczej się nie uraczy. Jest jednakże światełko w tym ciemnym tunelu, gdyż sterowniki niektórych urządzeń USB emulują port szeregowy COM umożliwiając tym samym proste komunikowanie się z takim urządzeniem na nowszych maszynach. Do takich urządzeń należą płytki rozwojowe Arduino, ja (tak szczęśliwie się składa) jestem szczęśliwym posiadaczem klona Arduino MEGA 2560, który działa tak samo i jest o niebo tańszy.

Instalacja pakietu pyserial

Domyślnie pakiet pyserial nie jest zainstalowany, ale spokojna twoja rozczochrana głowa albowiem tak się składa, że z łatwością można doinstalować tenże pakiet za pomocą instalatora pakietów PIP wpisując w konsoli polecenie:

> pip install pyserial

co spowoduje zainstalowanie tegoż pakietu.

Collecting pyserial
  Downloading https://files.pythonhosted.org/packages/0d/e4/2a744dd9e3be04a0c090
7414e2a01a7c88bb3915cbe3c8cc06e209f59c30/pyserial-3.4-py2.py3-none-any.whl (193k
B)
    100% |################################| 194kB 890kB/s
Installing collected packages: pyserial
Successfully installed pyserial-3.4

Konfiguracja połączenia z portem COM

Zanim zacznie się przygodę z komunikacją za pośrednictwem portu COM konieczne jest zapoznanie się z podstawami jego działania. Port ten przesyła dane dwukierunkowo za pomocą jednego pinu przesyłającego i jednego odczytującego dane. Dane przesyłane są zawsze z określoną prędkością mierzoną w bitach na sekundę. Standardowe ustawienie częstotliwości komunikacji z urządzeniem wynosi 9600 bitów na sekundę. Ważne aby wysyłać i odbierać dane z taką samą częstotliwością w przeciwnym przypadku dane nie będą odbierane przez urządzenie w sposób poprawny jak również komputer program nie będzie w stanie poprawnie odbierać danych.

Przy podstawowej konfiguracji konieczne jest również posiadanie wiedzy o nazwie portu. Pod Windowsem nazwy portów zaczynają się od COM i kończą liczbą określającą numer portu. Można sprawdzić w systemie, jakie porty COM są dostępne w Menadżerze urządzeń co też i widać na poniższym rysunku.

Windows - Menadżer urządzeń - wykryte porty COM
Rys. 1
Windows - Menadżer urządzeń - wykryte porty COM

Pod Linuksem sprawa jest nieco inna, albowiem każdy port w tym systemie jest plikiem i jako nazwę portu należy tutaj podać ścieżkę do tegoż pliku. Najłatwiej będzie uruchomić Arduino IDE z uprawnieniami administratora i w menu Narzędzia → Port powinna być dostępna lista portów związanych z Arduino, które są ścieżkami do plików je reprezentujących.

Na Ubuntu płytka Arduino powinna być wykryta jako plik /dev/ttyACM0.

Kolejna sprawa to określenie długości wysyłanych pakietów, transmisja danych wymaga aby pierwszy bit był zarezerwowany jako bit startu a następnie w zależności od ustawień może być przesłany ciąg bitów zazwyczaj od 7-miu do 9-ciu bitów. Następnie jest jeszcze bit zakończenia transmisji danych. Koniec końców pod Windowsem konfiguracja komunikacji z Arduino może wyglądać następująco:

ser=serial.Serial( port='COM3', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 )

Wysyłanie danych portem COM

Wysyłanie danych za pomocą portu COM jest bardzo proste i wygląda następująco:

import serial ser=serial.Serial( port='COM3', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) #time.sleep(1); if ser.isOpen(): print(ser.name + ' is open...') value = 1 while True:#value > -1 and value < 10: ser.write(str.encode(str(value))) value = int(input("Give me a number from 0 to 9: "))

Przykład zastosowania komunikacji z Arduino MEGA 2560

Komunikację za pomocą portu szeregowego można wykorzystać np. do stworzenia wyświetlacza poziomu głośności muzyki z wykorzystaniem płytki adresowalnych diod WS2812 LED 5050 RGB 8x8 64.

Strony powiązane
strony powiązane
  1. pyserial.readthedocs.io/en/latest/pyserial_api.html - dokumentacja omawianej biblioteki