Skocz do zawartości

Pomocna odpowiedź

Ten wpis bierze udział w konkursie na najlepszy artykuł o elektronice lub programowaniu, którego partnerem jest firma PCBWay (popularny producent prototypów PCB). W puli nagród karty podarunkowe Allegro o wartości 2300 zł. Sprawdź więcej informacji na temat konkursu »

 

1.thumb.jpg.b3a176f6dd2c464e1e35566d27392aab.jpg   

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. 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)
7.thumb.png.5a441be2f2a030c8c014214646e581e0.png 

Prosta komunikacja pomiędzy uC (mikrokontrolerem) a PC (rys. 2)
6.thumb.jpg.27be175e4af21146196c10f47c258d95.jpg

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 8.thumb.PNG.36cd5ecf8fe9a0dfbe3ee91e0796ebac.PNG


Przygotowanie środowiska na komputerze/laptopie

Tak jak już mówiłem, będziemy potrzebować biblioteki PySerial omówię jej instalację w środowisku PyCharm:

  1. Wchodzimy w terminal, następnie wpisujemy: "pip install pyserial"
  2. Naciskamy enter

Powinniśmy zobaczyć coś takiego (rys. 4) 

rys. 42.thumb.PNG.4e8cea72d8ea8e46e8c57d42d7dded68.PNG

 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. 53.thumb.PNG.3b99c5b0ffe57859107f27fa769ec457.PNG

 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:  

  1. Importujemy bibliotekę,
  2. Ustawiamy port do któego mamy podłączone Arduino oraz Baud Rate,
  3. Przypisujemy do zmiennej to co aktualnie jest przesyłane,
  4. 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. 64.thumb.PNG.ad3dbe30e2612d6c69482ace61e45d7e.PNG

 

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 5.thumb.png.c2d40b051cfa84b9ba92751ba00c48ce.png

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 9.thumb.jpg.bdc574b21174a2cd1f070f758ab74d48.jpg

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...