Akinzou Napisano Luty 9, 2020 Udostępnij Napisano Luty 9, 2020 Python to język wysokopoziomowy, który ma bardzo szerokie zastosowanie. Można w nim napisać grę (PyGame) albo zrobić komunikację mikrokontrolera z programem na komputerze/laptopie (PySerial), aby na przykład wysyłać komendy. W tym kursie zajmiemy się tą drugą biblioteką. W starszych komputerach istnieją porty szeregowe RS-232. W nowszych komputerach portu tego raczej się nie uraczy. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. 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 RS-232(rys. 1) Prosta komunikacja pomiędzy uC (mikrokontrolerem) a PC (rys. 2) 1.Wysyłanie informacji z mikrokontrolera do komputera/laptopa. 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 prędkości transmisji 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ż 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 (rys. 3) rys. 3 Przygotowanie środowiska na komputerze/laptopie Tak jak już mówiłem, będziemy potrzebować biblioteki PySerial omówię jej instalację w środowisku PyCharm: Wchodzimy w terminal, następnie wpisujemy: "pip install pyserial" Naciskamy enter Powinniśmy zobaczyć coś takiego (rys. 4) rys. 4 teraz przejdzmy do Arduino. Przygotowywanie Arduino (oczywiście zadziała komunikacja zadziała wszędzie gdzie użyjemy UART'a, nie tylko Arduino) Na razie jedyne co napiszemy to: void setup() { Serial.begin(9600); // Ustawienie Baud Rate(prędkość transmisji) na 9600Hz } void loop() { Serial.println("Proba Komunikacji"); delay(1000); } Wgrywamy nasz program, uruchamiamy Monitor Portu Szeregowego gdzie powinno sie pojawić się (rys. 5) rys. 5 i tak co około sekundę (przy okazji widzimy, że funkcja delay nie jest taka dokładna (dlatego nie stosuje sie jej gdy robimy na przykład zegar)) 😁 Teraz można przejść do PyCharma import serial arduino = serial.Serial('COM5', 9600, timeout=0.1) while True: data = arduino.readline() if data: data = data.decode() print(data) Można powiedzieć, że właśnie zrobiliśmy monitor portu szeregowego z ArduinoIDE 😀 Omówienie kodu: Importujemy bibliotekę, Ustawiamy port do któego mamy podłączone Arduino oraz Baud Rate, Przypisujemy do zmiennej to co aktualnie jest przesyłane, Jeżeli zmienna nie jest pusta to ją dekodujemy i wyświetlamy na ekranie. ZAWSZE MUSIMY PAMIĘTAĆ O ZDEKODOWANIU (tylko na komputerze)!!! Wyłączamy monitor portu szeregowego (ten z ArduinoIDE), kompilujemy program i naszym oczom powinno ukazać się (rys. 6) rys. 6 2. Wysyłanie komend z komputera/laptopa do mikrokontrolera. Przejdźmy do PyCharma import serial import time arduino = serial.Serial('COM5', 9600, timeout=0.01) while True: arduino.write('wlacz'.encode()) time.sleep(1) arduino.write('wylacz'.encode()) time.sleep(1) Importujemy bibliotekę time (nie trzeba jej instalować) oraz wysyłamy "wiadomości": "wlacz" oraz "wylacz" To by było na tyle w PyCharmie, przejdźmy więc do ArduinoIDE rys. 7 Jako że robimy komunikację używając UART'a, który może wysyłać maksymalnie jeden znak, ponieważ (rys. 7) jeden znak to jeden bajt (bajt ma 8bitów) a my wysyłamy komendy: "wlacz" oraz "wylacz" to musimy zrobić taki mały myczek elektryczek 😀 i użyć zmiennej oraz pętli. Będzie wyglądać to tak: wysyłamy: w Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: l Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: a Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: c Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: z Arduino: "odbiera" i zapisuje do zmiennej nie wysyłamy nic Arduino: wychodzi z pętli oraz porównuje zawartość zmiennej z komendami które ma zapisane Arduino: wykonuje komendę Arduino: czyści zawartość zmiennej z komendą Takie wybrnięcie z sytuacji 😎 int i = 12; //pin do którego podłączymy diodę String komenda=""; void setup() { Serial.begin(9600); pinMode(i, OUTPUT); digitalWrite(i, HIGH); } void loop() { if(Serial.available() > 0) { while(Serial.available() > 0) { komenda += char(Serial.read()); } Serial.println(komenda); if(komenda == "wlacz") { digitalWrite(i, HIGH); } if(komenda == "wylacz") { digitalWrite(i, LOW); } komenda = ""; } delay(100); } Oczywiście można wysłać do komputera/laptopa "informację zwrotną" na przykład: Dioda jest wlaczona Dioda jest wylaczona Tylko musimy pamiętać aby użyć .decode(), ale tak jak mówiłem, tylko w programie na komputrzez/laptopie Jeżeli nasze komendy będą miały tylko 1 znak na przykład: a, A, 1, B, c, C ,4 (ogólnie to dowolny znak z tabeli ASCII) nie trzeba używać pętli tylko: if(Serial.read() == 's') oczywiście też w tym ifie: if(Serial.available() > 0) Jeżeli wstawilibyśmy tam więcej znaków dostalibyśmy taki komuniukat: warning: multi-character character constant [-Wmultichar]. 3. Podsumowanie Wysyłanie oraz odbieranie informacji jest bardzo przydatne, nie musi być to tylko pomiędzy uC, a komputerem. Może to być komunikacja pomiędzy dwoma uC na przykład: karta microSD ma w sobie procesor który komunikuje sie z uC używając SPI, termometr DS18B20 który komunikuje z uC używając protokołu komunikacji OneWire (rys. 8), czujnik podczerwieni, procesor w naszych komputerach z mostkiem, pamięcią i GPU, ładowarka z telefonem, aby ustalić jaki prąd i napięcie. Komunikacja jest wszędzie (można powiedzieć, że urządzenia są bardziej komunikatywne od nas 🤣). rys. 8 1 Cytuj Link do komentarza Share on other sites More sharing options...
Lukasz0310 Marzec 17, 2020 Udostępnij Marzec 17, 2020 (edytowany) Super, właśnie prawie nie ma materiałów na ten temat, może masz jakiś sposób na komunikację Arduino z serwomechnizmami w ten sposób.😀😀😀😀 Pozdrawiam Edytowano Marzec 17, 2020 przez Lukasz0310 1 Cytuj Link do komentarza Share on other sites More sharing options...
Akinzou Marzec 17, 2020 Autor tematu Udostępnij Marzec 17, 2020 @Lukasz0310 Hmmmm, można wysyłać takie dane jak przyśpieszenie, prędkość albo położenie. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 18, 2020 Udostępnij Marzec 18, 2020 Czy naprawdę nie ma innej możliwości, tylko sprawdzanie w jakimś menadżerze urządzeń i edycja źródła za każdym razem, gdy naszemu komputerowi zamami się zmiana np. COM5 na COM6 (bo COM5 będzie akurat zajęty czymś innym)? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Belferek Marzec 18, 2020 Udostępnij Marzec 18, 2020 (edytowany) Tytuł artykułu trochę na wyrost. Powinien on raczej brzmieć "Wysyłanie prostego tekstu z PC do Arduino". Szkoda, że praktycznie autor nie wspomniał o odbiorze danych z Arduino, a najlepiej o jednoczesnym NADAWANIU i ODBIORZE z Pythona za pomocą nieblokujących wątków. Edytowano Marzec 18, 2020 przez Belferek Cytuj Link do komentarza Share on other sites More sharing options...
Akinzou Marzec 19, 2020 Autor tematu Udostępnij Marzec 19, 2020 19 godzin temu, Belferek napisał: Tytuł artykułu trochę na wyrost. Powinien on raczej brzmieć "Wysyłanie prostego tekstu z PC do Arduino". Szkoda, że praktycznie autor nie wspomniał o odbiorze danych z Arduino, a najlepiej o jednoczesnym NADAWANIU i ODBIORZE z Pythona za pomocą nieblokujących wątków. To nie musi być prosty tekst, teraz robię projekt i dokładnie tym samym sposobem co opisałem w artykule wysyłam komendy z aplikacji okienkowej na kompie. 23 godziny temu, ethanak napisał: Czy naprawdę nie ma innej możliwości, tylko sprawdzanie w jakimś menadżerze urządzeń i edycja źródła za każdym razem, gdy naszemu komputerowi zamami się zmiana np. COM5 na COM6 (bo COM5 będzie akurat zajęty czymś innym)? Jest, można zrobić comboBoxa w PyQT który posiada w sobie wszystkie porty COM, aby to zrobić to wystarczy po prostu: import serial.tools.list_ports ports = list(serial.tools.list_ports.comports()) for p in ports: print p import serial.tools.list_ports ports = list(serial.tools.list_ports.comports()) for p in ports: print p Ten kod tylko printuje obecnie dostępne porty COM, do auto wykrywania Arduino wystarczy dodać: if "Arduino" in p[1]: print "This is an Arduino!" Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 19, 2020 Udostępnij Marzec 19, 2020 25 minut temu, Akinzou napisał: do auto wykrywania Arduino wystarczy dodać Rozumiem, że nie istnieją inne Arduino poza Uno i Mega? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Marzec 19, 2020 Udostępnij Marzec 19, 2020 @ethanak przypominam o polityce przyjaznego forum: "Daruj sobie sarkazmy i zbędne zaczepki" 🙂 Jeśli zauważyłeś błąd w rozwiązaniu autora to możesz go wskazać w bardziej przyjazny sposób, który przyczynić się do szybszego rozwiązania problemu. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 19, 2020 Udostępnij Marzec 19, 2020 Nie jest to żadna zbędna zaczepka - po prostu jeśli się pisze artykuł na jakiś temat warto wyrażać się ściśle, bez tego można odnieść wrażenie że autor czegoś nie wie. W tym przypadku: jeśli wspomina się o combo w Qt dotyczy to wyłącznie aplikacji okienkowych, o czym nie wspomniano (tzn. autor wspomniał, że pisze aplikację okienkową ale to nie to samo); można wspomnieć, że do wykrycia Uno i Mega wystarczy że w stringu będzie "Arduino", dla innych płytek string będzie inny; twierdzenie że tak się wykrywa Arduino jest po prostu błędne. przy okazji co prawda obiekt ListPortInfo da się indeksować ale tylko z uwagi na kompatybilność wsteczną, zamiast p[1] powinno być p.description zgodnie z https://pythonhosted.org/pyserial/tools.html#serial.tools.list_ports.ListPortInfo Pamiętajmy, że artykuły tego typu przeznaczone są dla początkujących i nie wolno tu zostawiać żadnych niedomówień. Inaczej się pisze podręcznik dla studentów informatyki - a inaczej elementarz. Cytuj Link do komentarza Share on other sites More sharing options...
Akinzou Marzec 19, 2020 Autor tematu Udostępnij Marzec 19, 2020 12 minut temu, ethanak napisał: Nie jest to żadna zbędna zaczepka - po prostu jeśli się pisze artykuł na jakiś temat warto wyrażać się ściśle, bez tego można odnieść wrażenie że autor czegoś nie wie. W tym przypadku: jeśli wspomina się o combo w Qt dotyczy to wyłącznie aplikacji okienkowych, o czym nie wspomniano (tzn. autor wspomniał, że pisze aplikację okienkową ale to nie to samo); można wspomnieć, że do wykrycia Uno i Mega wystarczy że w stringu będzie "Arduino", dla innych płytek string będzie inny; twierdzenie że tak się wykrywa Arduino jest po prostu błędne. przy okazji co prawda obiekt ListPortInfo da się indeksować ale tylko z uwagi na kompatybilność wsteczną, zamiast p[1] powinno być p.description zgodnie z https://pythonhosted.org/pyserial/tools.html#serial.tools.list_ports.ListPortInfo Pamiętajmy, że artykuły tego typu przeznaczone są dla początkujących i nie wolno tu zostawiać żadnych niedomówień. Inaczej się pisze podręcznik dla studentów informatyki - a inaczej elementarz. Jeżeli nie robi sie aplikacji okienkowej to można zrobić że port podaje sie podczas uruchamiania programu (tutaj już wszystko zależy od programisty). Otóż z .description jest taki problem: , a jaki widać na załączonym obrazku, ten sposób który podałem działa Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 19, 2020 Udostępnij Marzec 19, 2020 Jeśli description będzie niedostępne to będzie po prostu puste - obiekt zawsze będzie miał taką własność. W takim przypadku będzie również pusty element o indeksie 1 (ergo: nie będzie działać). Moja propozycja (w kolejności wykonania): dodanie choćby pobieżnych informacji o list_ports do artykułu bez wnikania w Qt, GTK i inne graficzne toolkity; dopisanie tego nieszczęsnego stringu "Arduino" z uwagą, że dotyczy to tylko określonych płytek, w innym przypadku najprościej będzie wypisać sobie informacje o wszystkich znalezionych portach i znaleźć odpowiedni string (co - jak trzeba zaznaczyć - nie zawsze jest możliwe); usunięcie zbędnych komentarzy do artykułu Cytuj Link do komentarza Share on other sites More sharing options...
Akinzou Marzec 19, 2020 Autor tematu Udostępnij Marzec 19, 2020 3 minuty temu, ethanak napisał: Jeśli description będzie niedostępne to będzie po prostu puste - obiekt zawsze będzie miał taką własność. W takim przypadku będzie również pusty element o indeksie 1 (ergo: nie będzie działać). Moja propozycja (w kolejności wykonania): dodanie choćby pobieżnych informacji o list_ports do artykułu bez wnikania w Qt, GTK i inne graficzne toolkity; dopisanie tego nieszczęsnego stringu "Arduino" z uwagą, że dotyczy to tylko określonych płytek, w innym przypadku najprościej będzie wypisać sobie informacje o wszystkich znalezionych portach i znaleźć odpowiedni string (co - jak trzeba zaznaczyć - nie zawsze jest możliwe); usunięcie zbędnych komentarzy do artykułu Też chciałem dodać informacje o list_ports, ale stwierdziłem że nie będę wszystkiego mieszał, gdy napiszę osoby artykuł to wstawię do niego linka. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 19, 2020 Udostępnij Marzec 19, 2020 Wiesz - to są dwa zdania na krzyż. A takie znajdowanie portów w menadżerze urządzeń może być dobre jeśli siedzisz przy Windowsie - jeśli podłączasz Arduino np. do RPi (do którego masz dostęp wyłącznie przez ssh) - dość ciężko takowy znaleźć 😉 list_ports jest rozwiązaniem uniwersalnym, niezależnym od systemu. Cytuj Link do komentarza Share on other sites More sharing options...
Akinzou Marzec 19, 2020 Autor tematu Udostępnij Marzec 19, 2020 7 minut temu, ethanak napisał: Wiesz - to są dwa zdania na krzyż. A takie znajdowanie portów w menadżerze urządzeń może być dobre jeśli siedzisz przy Windowsie - jeśli podłączasz Arduino np. do RPi (do którego masz dostęp wyłącznie przez ssh) - dość ciężko takowy znaleźć 😉 list_ports jest rozwiązaniem uniwersalnym, niezależnym od systemu. Na malince można użyć komendy: sudo dmesg Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Marzec 19, 2020 Udostępnij Marzec 19, 2020 ...która to komenda może pokazać bardzo ciekawe rzeczy ake niekoniecznie te, o które nam chodzi. Dlaczego do wypisania urządzeń podłączonych do usb chcesz zamuast polecenia które to robi (lsusb) użyć polecenia wyświetlającego logi systemu? A co z makiem? Nie kombinuj, wrzuć do artykułu informacje o list_ports (krótka wzmianka wystarczy z linkiem do dokumentacji i obietnicą że się tym jeszcze zajmiesz). Bo na razie ta część o znajdowaniu portów jest niekompletna, a wraz z nią cały artykuł. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!