Sadržaj:

PIC MCU i Python serijska komunikacija: 5 koraka
PIC MCU i Python serijska komunikacija: 5 koraka

Video: PIC MCU i Python serijska komunikacija: 5 koraka

Video: PIC MCU i Python serijska komunikacija: 5 koraka
Video: Serial Port Monitor Code Example - Python with Tkinter 2024, Juli
Anonim
PIC MCU i Python serijska komunikacija
PIC MCU i Python serijska komunikacija
PIC MCU i Python serijska komunikacija
PIC MCU i Python serijska komunikacija

Zdravo momci! U ovom projektu pokušat ću objasniti svoje eksperimente na PIC MCU i Python serijskoj komunikaciji. Preko interneta postoji mnogo vodiča i video zapisa o tome kako komunicirati s PIC MCU -om preko virtualnog terminala što je vrlo korisno. Međutim, u mom glavnom projektu jedan od zahtjeva je uspostaviti serijsku komunikaciju između PIC MCU -a i Pythona za koju nisam mogao pronaći dobar vodič. Pa krenimo:)

Korak 1: Šta nam treba?

Šta nam treba?
Šta nam treba?
Šta nam treba?
Šta nam treba?

Dakle, prije svega da vidimo šta nam treba. Što se tiče hardvera:

  • Naravno, PIC MCU koji je u mom slučaju PIC16f877a (Ta vam ploča nije potrebna. Ovo je radi pojednostavljenja nekih prljavih veza)
  • USB na TTL pretvarač za komunikaciju s PIC MCU preko USB priključka pomoću TX i RX pinova.
  • MCU programer koji je u mom slučaju K150 programer, ali možete koristiti PicKit 2, 3 ili bilo što drugo.
  • I na kraju kompjuter:)

Što se tiče softvera:

  • IDE za pisanje python koda koji je u mom slučaju Pycharm, ali možete koristiti i običan Python IDE.
  • Okruženje za programiranje MCU -a koje je u mom slučaju MPLAB X IDE sa CCS C kompajlerom.

Korak 2: Hardverske veze

Hardverske veze
Hardverske veze

Na slici su priložene hardverske veze koje se nalaze između PIC MCU -a i USB TTL pretvarača, kao što je dolje:

RC7 (RX) ------------- TXD

RC6 (TX) ------------- RXD

GND -------------- GND

Ne morate spojiti VCC pin USB TTL pretvarača (međutim, ako želite, možete to učiniti). Ove 3 veze su sasvim dovoljne.

Korak 3: Python softver

Počnimo pisati softver za Python stranu koji će u našem slučaju biti odašiljač, jer će poslati niz na MCU.

import serial #import serial librarydata = '24' #data koje ćemo poslati podacima = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #pošaljite podatke

Prije svega, serijska biblioteka se uvozi kako bi se koristila njena budućnost. Želimo poslati primjer nizova podataka kako bismo potvrdili u MCU kodu da smo ih prihvatili. Želim ovdje primijetiti jednu stvar. Zbog toga smo nizu dodali '\ 0'. To je zato što je sa MCU strane nemoguće čitati niz u potpunosti. Čita se znak po znak. Dakle, želimo znati kraj niza kako bismo prestali čitati. Dakle, dodajemo '\ 0' nizu koji označava kraj niza. Zatim se povezujemo na port koji je spojen na MCU. Taj port možete odrediti pretraživanjem u 'Upravitelju uređaja'. Zato pazite da se nalazite na istoj luci. Uostalom, podatke šaljemo MCU -u. ".encode ()" treba dodati podacima niza kako bi ih mogli poslati primatelju.

Korak 4: Softver za mikrokontroler

Dakle, pogledajmo naš kod za MCU. Prije svega želim vam pokazati datoteku "config.h" koja nije potrebna, ali to sam učinio radi jednostavnosti. Ovdje samo promijenite frekvenciju vašeg MCU -a.

#ifndef CONFIG_H#definirajte CONFIG_H

#include

#uređaj ADC = 16

#FUSES NOWDT // Nema mjerača vremena za pse

#FUSES NOBROWNOUT // Nema poništavanja smeđe boje #FUSES NOLVP // Nema niskonaponskih prgminga, B3 (PIC16) ili B5 (PIC18) koji se koriste za I/O

#kašnjenje upotrebe (kristal = 6000000)

Pogledajmo sada glavni kod:

#include

#include

#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, paritet = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; char buffer [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); nepotpisani int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {bafer = 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 (bafer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Na početku uključujemo biblioteku nizova koja će nam biti od pomoći u niz operacijama, što je u našem slučaju operacija usporedbe niza (strcmp). Dakle, naša svrha u ovom kodu je uključiti LED diodu povezanu na pin D0 ako je prenesena vrijednost ista kao i naša zadana vrijednost koja je "cmp_" jednaka "24".

Prije svega, omogućujemo prekid "rda" koji će uzrokovati prekid prilikom prijenosa podataka.

Drugo, pogledajmo unutar ISR -a (rutinska usluga prekida) koja se naziva "serial_communication_interrupt". Unutra prvo onemogućujemo zastavicu prekida kako bismo pročitali primljenu vrijednost i dalje uzrokovali prekid. Nakon toga čitamo niz po znak sve do '\ 0'. Dok čitamo unutar niza, također zapisujemo svaki char u bafer kako bismo dobili primljeni niz.

Na kraju opet ulazimo unutra. Ovdje uspoređujemo naš niz me uspremnika koji je primljeni niz i cmp_ niz kako bismo vidjeli jesmo li pravilno dobili niz. Ako su jednaki, palim LED, u suprotnom isključujem.*

*U kodu sam napravio obrnuto jer moja ploča obrće vrijednosti pina D porta. U svom kodu promijenite ga u:

if (strcmp (bafer, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);

Na kraju, kompajlirajte ga i otpremite na svoj MCU, a zatim pokrenite kôd u Pythonu. Trebali biste vidjeti da se LED dioda uključuje.

Korak 5: Zaključak

Jedan zadatak smo uspješno završili. Nadam se da će vam biti od koristi. Ako imate bilo kakvih pitanja, ne ustručavajte se pitati:) Do sljedećeg projekta.

Preporučuje se: