Spisu treści:
- Krok 1: Czego potrzebujemy?
- Krok 2: Połączenia sprzętowe
- Krok 3: Oprogramowanie Python
- Krok 4: Oprogramowanie mikrokontrolera
- Krok 5: Wniosek
Wideo: Komunikacja szeregowa PIC MCU i Python: 5 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:30
Cześć chłopaki! W tym projekcie postaram się wyjaśnić moje eksperymenty dotyczące komunikacji szeregowej PIC MCU i Pythona. W Internecie dostępnych jest wiele samouczków i filmów wideo na temat komunikacji z PIC MCU przez wirtualny terminal, co jest bardzo przydatne. Jednak w moim głównym projekcie jednym z wymagań jest nawiązanie komunikacji szeregowej między PIC MCU a Pythonem, co nie znalazłem dobrego samouczka. Więc zacznijmy:)
Krok 1: Czego potrzebujemy?
Przede wszystkim zobaczmy, czego potrzebujemy. Pod względem sprzętowym:
- Na pewno PIC MCU, który w moim przypadku jest PIC16f877a (ta płytka nie jest potrzebna. Ma to na celu uproszczenie niektórych brudnych połączeń)
- Konwerter USB na TTL w celu komunikacji z PIC MCU przez port USB za pomocą pinów TX i RX.
- Programator MCU czyli w moim przypadku programator K150, ale możesz użyć PicKit 2, 3 lub cokolwiek innego.
- I wreszcie komputer:)
W zakresie oprogramowania:
- IDE do pisania kodu w Pythonie, którym jest w moim przypadku Pycharm, ale możesz również użyć zwykłego IDE Pythona.
- Środowisko do programowania MCU jakim jest w moim przypadku MPLAB X IDE z kompilatorem CCS C.
Krok 2: Połączenia sprzętowe
Na zdjęciu załączone połączenia sprzętowe, które znajdują się pomiędzy PIC MCU a konwerterem USB TTL jak poniżej:
RC7 (RX) ------------- TXD
RC6 (TX) ------------- RXD
GND -------------- GND
Nie musisz podłączać pinu VCC konwertera USB TTL (jednak jeśli chcesz, możesz to zrobić). Te 3 połączenia w zupełności wystarczą.
Krok 3: Oprogramowanie Python
Zacznijmy pisać oprogramowanie dla strony Pythona, które będzie w naszym przypadku transmiterem, ponieważ wyśle string do MCU.
import serial #import serial librarydata = '24' #dane które wyślemy data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #połącz się z portem ser.write(a.encode()) #wyślij dane
Przede wszystkim importowana jest biblioteka szeregowa w celu wykorzystania jej przyszłości. Chcemy wysłać przykładowe dane ciągu w celu potwierdzenia w kodzie MCU, że je zaakceptowaliśmy. Chcę tutaj zwrócić uwagę na jedną rzecz. Dlatego dodaliśmy '\0' do łańcucha. Dzieje się tak, ponieważ po stronie MCU nie można całkowicie odczytać ciągu. Jest odczytywany znak po znaku. Więc chcemy znać koniec ciągu, aby przestać czytać. Tak więc dodajemy '\0' do ciągu, który wskazuje na koniec ciągu. Następnie łączymy się z portem, który jest podłączony do MCU. Możesz określić ten port, wyszukując w „Menedżerze urządzeń”. Uważaj więc, że jesteś na tym samym porcie. W końcu wysyłamy dane do MCU. ".encode()" należy dodać do danych ciągu, aby móc wysłać go do odbiorcy.
Krok 4: Oprogramowanie mikrokontrolera
Zobaczmy więc nasz kod dla MCU. Przede wszystkim chcę pokazać zawartość pliku "config.h", który nie jest wymagany, ale zrobiłem to dla uproszczenia. Tutaj po prostu zmień częstotliwość swojego MCU.
#ifndef CONFIG_H#define CONFIG_H
#włączać
#urządzenie ADC=16
#BEZPIECZNIKI NOWDT //Brak Zegara Watch Dog
#FUSES NOBROWNOUT //Brak resetu brownout #FUSES NOLVP //Brak prgming niskiego napięcia, B3(PIC16) lub B5(PIC18) używane dla I/O
#użyj opóźnienia(kryształ=6000000)
Zobaczmy teraz główny kod:
#włączać
#włączać
#użyj rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parzystość=N, stop=1)
#define LED_RED PIN_D0
wejście znaku; char cmp_="24"; bufor znaków [3];
#int_rda
void serial_communication_interrupt() { disable_interrupts(int_rda); unsigned int i = 0; inp = getc(); putc(inp); while(inp != '\0') { bufor = inp; inp = getc(); putc(inp); i++; } }
nieważne główne (nieważne) {
set_tris_d (0x00); wyjście_d(0xFF); enable_interrupts (GLOBALNE); while(1) { enable_interrupts(int_rda); if(strcmp(bufor, cmp_) == 0) output_low(LED_RED); w przeciwnym razie output_high(LED_RED); } }
Na początek dołączamy bibliotekę stringów, która będzie pomocna w operacjach na stringach, którymi w naszym przypadku jest operacja porównywania stringów (strcmp). Czyli naszym celem w tym kodzie jest włączenie diody podłączonej do pinu D0 jeśli przekazywana wartość jest taka sama jak nasza podana wartość czyli "cmp_" równa się "24".
Przede wszystkim włączamy przerwanie "rda", które spowoduje przerwanie podczas transmisji danych.
Po drugie, zajrzyjmy do ISR (procedury obsługi przerwań), która nazywa się "serial_communication_interrupt". Wewnątrz najpierw wyłączamy flagę przerwania, aby odczytać odebraną wartość i spowodować dalsze przerwanie. Następnie odczytujemy łańcuch znak po znaku, aż do osiągnięcia '\0'. Podczas czytania wewnątrz łańcucha zapisujemy również każdy znak do bufora w celu uzyskania odebranego łańcucha.
Na koniec ponownie wchodzimy do środka. Tutaj porównujemy nasz łańcuch bufora, który jest otrzymany łańcuch i cmp_ string, aby zobaczyć, czy otrzymaliśmy łańcuch poprawnie. Jeśli są równe to włączam led, w przeciwnym razie wyłączam.*
*W kodzie zrobiłem odwrócenie, ponieważ moja płyta odwraca wartości pinów portu D. W swoim kodzie zmień go na:
if(strcmp(buffer, cmp_) == 0) output_high(LED_RED);else output_low(LED_RED);
Na koniec skompiluj go i prześlij do swojego MCU, a następnie uruchom kod w Pythonie. Powinieneś zobaczyć zapaloną diodę.
Krok 5: Wniosek
Zakończyliśmy pomyślnie jedno zadanie. Mam nadzieję, że ci się przyda. Jeśli masz jakieś pytania, nie wahaj się zapytać:) Do następnego projektu.
Zalecana:
Raspberry PI 3 - Włącz komunikację szeregową z TtyAMA0 do BCM GPIO 14 i GPIO 15: 9 kroków
Raspberry PI 3 - Włącz komunikację szeregową z TtyAMA0 do BCM GPIO 14 i GPIO 15: Ostatnio interesowałem się włączeniem UART0 na moim Raspberry Pi (3b), aby móc podłączyć go bezpośrednio do urządzenia poziomu sygnału RS-232 za pomocą standardowego 9 -pinowe złącze d-sub bez konieczności przechodzenia przez przejściówkę USB na RS-232. Część mojego zainteresowania
Komunikacja szeregowa Arduino: 5 kroków
Komunikacja szeregowa Arduino: Wiele projektów Arduino polega na przesyłaniu danych między kilkoma Arduino. Niezależnie od tego, czy jesteś hobbystą, który buduje samochód RC, samolot RC, czy projektuje stację pogodową ze zdalnym wyświetlaczem, musisz wiedzieć, jak niezawodnie seria transferu
Komunikacja szeregowa Arduino i Python - wyświetlanie klawiatury: 4 kroki
Komunikacja szeregowa Arduino i Python - wyświetlacz klawiatury: ten projekt jest przeznaczony dla użytkowników komputerów Mac, ale można go również zaimplementować w systemach Linux i Windows, jedynym krokiem, który powinien być inny, jest instalacja
Bezprzewodowa komunikacja szeregowa za pomocą Bluefruit: 4 kroki
Bezprzewodowa komunikacja szeregowa przy użyciu Bluefruit: Oto prosty przewodnik krok po kroku, jak wymienić przewody na połączenie Bluetooth o niskim zużyciu energii: zajęło mi trochę czasu, aby to zrozumieć, ponieważ nie ma prawie żadnej dokumentacji na ten temat za pomocą nowoczesnej technologii Bluetooth o niskim zużyciu energii. jak Bluefrui
Komunikacja szeregowa przy użyciu ARM Cortex-M4: 4 kroki
Komunikacja szeregowa przy użyciu ARM Cortex-M4: Jest to projekt oparty na płytce prototypowej, który wykorzystuje ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) do komunikacji szeregowej przy użyciu wirtualnego terminala. Wyjście można uzyskać na ekranie LCD 16x2, a wejście do komunikacji szeregowej można podać w