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, Srpanj
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

Bok dečki! 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 što nisam mogao pronaći dobar vodič. Pa krenimo:)

Korak 1: Što nam treba?

Što trebamo?
Što trebamo?
Što trebamo?
Što trebamo?

Dakle, prije svega da vidimo što 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 u 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 računalo:)

Š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 u 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 se knjižnica uvozi kako bi se koristila njezina budućnost. Želimo poslati primjer niza podataka kako bismo potvrdili u MCU kodu da smo ih prihvatili. Ovdje želim napomenuti jednu stvar. Zbog toga smo nizu dodali '\ 0'. To je zato što je sa MCU strane nemoguće čitati niz u potpunosti. Čita se lik po lik. Dakle, želimo znati kraj niza kako bismo prestali čitati. Dakle, nizu dodajemo '\ 0' koji označava kraj niza. Zatim se povezujemo na priključak 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 se moglo 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

#uključi

#uređaj ADC = 16

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

#FUSES NOBROWNOUT // Nema resetiranja 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:

#uključi

#uključi

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

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; me uspremnik [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); nepotpisani int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {međuspremnik = 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 (međuspremnik, 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 nizovnim operacijama, što je u našem slučaju operacija usporedbe nizova (strcmp). Dakle, naša svrha u ovom kodu je uključiti LED diodu povezanu na pin D0 ako je prenesena vrijednost ista kao naša zadana vrijednost koja je "cmp_" jednaka "24".

Prije svega, omogućujemo prekid "rda" koji će uzrokovati prekid pri prijenosu podataka.

Drugo, pogledajmo unutar ISR -a (rutinske usluge prekida) koji se naziva "serial_communication_interrupt". Unutra prvo onemogućujemo zastavicu prekida kako bismo pročitali primljenu vrijednost i dodatno uzrokovali prekid. Nakon toga čitamo niz po znak sve do '\ 0'. Tijekom čitanja unutar niza također zapisujemo svaki char u međuspremnik 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, tada 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 (međuspremnik, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);

Konačno, sastavite ga i prenesite na svoj MCU, a zatim pokrenite kôd u Pythonu. Trebali biste vidjeti da se LED dioda uključuje.

Korak 5: Zaključak

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

Preporučeni: