Obsah:
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-23 14:38
Nazdar hoši! V tomto projektu se pokusím vysvětlit své experimenty na sériové komunikaci PIC MCU a Python. Přes internet existuje mnoho návodů a videí, jak komunikovat s PIC MCU přes virtuální terminál, což je velmi užitečné. V mém hlavním projektu je však jedním z požadavků vytvořit sériovou komunikaci mezi PIC MCU a Pythonem, což se mi nepodařilo najít. Takže začneme:)
Krok 1: Co potřebujeme?
Nejprve se tedy podívejme, co potřebujeme. Co se týče hardwaru:
- Jistě, PIC MCU, což je v mém případě PIC16f877a (Tuto desku nepotřebujete. To je za účelem zjednodušení některých špinavých připojení)
- Převodník USB na TTL za účelem komunikace s PIC MCU přes USB port pomocí pinů TX a RX.
- Programátor MCU, což je v mém případě programátor K150, ale můžete použít PicKit 2, 3 nebo cokoli jiného.
- A konečně počítač:)
Pokud jde o software:
- IDE za účelem psaní kódu pythonu, což je v mém případě Pycharm, ale můžete použít i běžné IDE Pythonu.
- Prostředí pro programování MCU, což je v mém případě MPLAB X IDE s kompilátorem CCS C.
Krok 2: Hardwarová připojení
Na obrázku jsou připojena hardwarová připojení, která jsou mezi PIC MCU a USB TTL převodníkem, jak je uvedeno níže:
RC7 (RX) ------------- TXD
RC6 (TX) ------------- RXD
GND -------------- GND
Nepotřebujete připojit pin VCC převodníku USB TTL (Pokud však chcete, můžete to udělat). Tato 3 připojení jsou docela dost.
Krok 3: Software Python
Začněme psát software pro stranu Pythonu, který bude v našem případě vysílačem, protože odešle řetězec do MCU.
import serial #import serial librarydata = '24' #data that we will send data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #odešlete data
Nejprve je importována sériová knihovna, aby bylo možné využívat její budoucnost. Chceme poslat ukázková řetězcová data, abychom v kódu MCU potvrdili, že jsme je přijali. Zde chci poznamenat jednu věc. Proto jsme do řetězce přidali '\ 0'. Důvodem je, že na straně MCU není možné řetězec úplně přečíst. Čte se znak po znaku. Chceme tedy znát konec řetězce, abychom přestali číst. Takže přidáme '\ 0' do řetězce, který označuje konec řetězce. Poté se připojíme k portu, který je připojen k MCU. Tento port můžete určit vyhledáním ve „Správci zařízení“. Dávejte si tedy pozor, abyste byli na stejném portu. Koneckonců posíláme data do MCU. ".encode ()" by mělo být přidáno do řetězcových dat, aby bylo možné je odeslat do přijímače.
Krok 4: Software pro mikrokontrolér
Podívejme se tedy na náš kód pro MCU. Nejprve vám chci ukázat soubor „config.h“, který není nutný, ale udělal jsem to pro jednoduchost. Zde stačí změnit frekvenci vašeho MCU.
#ifndef CONFIG_H#definujte CONFIG_H
#zahrnout
#zařízení ADC = 16
#FUSES NOWDT // Časovač hlídacího psa
#FUSES NOBROWNOUT // Žádné resetování Brownout #FUSES NOLVP // Žádné nízkonapěťové prgming, B3 (PIC16) nebo B5 (PIC18) použité pro I/O
#zpoždění použití (krystal = 6000000)
Nyní se podívejme na hlavní kód:
#zahrnout
#zahrnout
#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, parity = N, stop = 1)
#define LED_RED PIN_D0
char inp; char cmp _ = "24"; char buffer [3];
#int_rda
neplatné serial_communication_interrupt () {disable_interrupts (int_rda); bez znaménka int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}
void main (void) {
set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}
Na začátek přidáme knihovnu řetězců, která nám bude nápomocna při řetězcových operacích, což je v našem případě operace porovnání řetězců (strcmp). Naším cílem v tomto kódu je tedy rozsvítit LED připojenou k pinu D0, pokud je přenášená hodnota stejná jako naše daná hodnota, která je "cmp_" se rovná "24".
Nejprve povolíme přerušení „rda“, které způsobí přerušení při přenosu dat.
Za druhé, podívejme se dovnitř ISR (rutina služby přerušení), která se nazývá „serial_communication_interrupt“. Uvnitř nejprve deaktivujeme příznak přerušení, abychom přečetli přijatou hodnotu a způsobili další přerušení. Poté čteme řetězec po znacích, dokud nedosáhneme '\ 0'. Při čtení uvnitř řetězce také zapisujeme každý znak do vyrovnávací paměti, abychom získali přijatý řetězec.
Nakonec jsme zase přišli dovnitř. Zde porovnáme náš řetězec vyrovnávací paměti, který je přijat řetězec, a řetězec cmp_, abychom zjistili, zda řetězec získáme správně. Pokud jsou stejné, zapnu LED, jinak vypnu.*
*V kódu jsem obrátil, protože moje deska převrací hodnoty pinů portu D. Ve svém kódu jej změňte na:
if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);
Nakonec jej zkompilujte a nahrajte do MCU a poté spusťte kód v Pythonu. Měli byste vidět zapnutí LED.
Krok 5: Závěr
Úspěšně jsme dokončili jeden úkol. Doufám, že to pro vás bude užitečné. Pokud máte nějaké dotazy, neváhejte se zeptat:) Do dalšího projektu.
Doporučuje:
Sériová komunikace Arduino: 5 kroků
Sériová komunikace Arduino: Mnoho projektů Arduino spoléhá na přenos dat mezi několika Arduiny. Ať už jste fanouškem stavění RC auta, RC letadla nebo navrhování meteorologické stanice se vzdáleným displejem, budete muset vědět, jak spolehlivě přenos seria
Sériová komunikace Arduino a Python - displej klávesnice: 4 kroky
Sériová komunikace Arduino a Python - zobrazení klávesnice: Tento projekt je určen pro uživatele počítačů Mac, ale lze jej také implementovat pro Linux a Windows, jediným krokem, který by se měl lišit, je instalace
Bezdrátová sériová komunikace pomocí Bluefruit: 4 kroky
Bezdrátová sériová komunikace pomocí Bluefruit: Zde je jednoduchý krok za krokem průvodce, jak vyměnit vaše vodiče za nízkoenergetické připojení bluetooth: Chvíli mi trvalo, než jsem na to přišel, protože neexistuje téměř žádná dokumentace, jak to udělat s moderními bluetooth nízkoenergetickými technologiemi, jako je jako Bluefrui
Sériová komunikace pomocí ARM Cortex-M4: 4 kroky
Sériová komunikace pomocí ARM Cortex-M4: Jedná se o projekt založený na breadboardu, který používá ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) pro sériovou komunikaci pomocí virtuálního terminálu. Výstup lze získat na obrazovce LCD 16x2 a vstup pro sériovou komunikaci lze zadat v Serial Mo
Přístupový bod - komunikace stanice mezi dvěma MCU ESP8266: 3 kroky
Přístupový bod - komunikace stanice mezi dvěma MCU ESP8266: Dobrý den, tvůrci! Ve svém předchozím pokynu jsem provedl WiFi komunikaci mezi dvěma MCU ESP8266 prostřednictvím domácího WiFi routeru. Jak jsem viděl z komentářů, existují výrobci, kteří by chtěli používat MCU ESP8266 daleko od dosahu routeru. Takže tady je bar