Cuprins:

PIC MCU și Python Serial Communication: 5 pași
PIC MCU și Python Serial Communication: 5 pași

Video: PIC MCU și Python Serial Communication: 5 pași

Video: PIC MCU și Python Serial Communication: 5 pași
Video: Configure Serial Raspberry Pi 4B - UART - GPIO 14 and 15 2024, Noiembrie
Anonim
PIC MCU și Python Serial Communication
PIC MCU și Python Serial Communication
PIC MCU și Python Serial Communication
PIC MCU și Python Serial Communication

Buna baieti! În acest proiect, voi încerca să explic experimentele mele pe PIC MCU și comunicare serială Python. Pe internet, există multe tutoriale și videoclipuri despre cum să comunicați cu PIC MCU prin terminal virtual, ceea ce este foarte util. Cu toate acestea, în proiectul meu principal una dintre cerințe este să stabilesc o comunicare serială între PIC MCU și Python, pe care nu am putut să o găsesc. Deci sa începem:)

Pasul 1: De ce avem nevoie?

De ce avem nevoie?
De ce avem nevoie?
De ce avem nevoie?
De ce avem nevoie?

Deci, în primul rând să vedem de ce avem nevoie. În ceea ce privește hardware-ul:

  • Sigur, PIC MCU care este în cazul meu PIC16f877a (Nu aveți nevoie de placa respectivă. Acest lucru este pentru a simplifica unele conexiuni murdare)
  • Convertor USB la TTL pentru a comunica cu PIC MCU prin port USB utilizând pinii TX și RX.
  • Programator MCU, care este în cazul meu programator K150, dar puteți folosi PicKit 2, 3 sau orice altceva.
  • Și în cele din urmă un computer:)

În ceea ce privește software-ul:

  • Un IDE pentru a scrie codul Python, care este în cazul meu Pycharm, dar puteți utiliza și IDE Python obișnuit.
  • Un mediu pentru programarea MCU, care este în cazul meu MPLAB X IDE cu compilator CCS C.

Pasul 2: Conexiuni hardware

Conexiuni hardware
Conexiuni hardware

În imagine sunt prezentate conexiunile hardware atașate, care sunt între PIC MCU și convertorul USB TTL după cum urmează:

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

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

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

Nu este nevoie să conectați pinul VCC al convertorului USB TTL (cu toate acestea, dacă doriți, puteți face). Aceste 3 conexiuni sunt destul de suficiente.

Pasul 3: Software Python

Să începem să scriem software pentru partea Python care va fi transmițător în cazul nostru, deoarece va trimite șirul către MCU.

import serial #import serial librarydata = '24' #data pe care le vom trimite date = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect to the port ser.write (a.encode ()) #transmite datele

În primul rând biblioteca importată este importată pentru a-și folosi viitorul. Vrem să trimitem un exemplu de șir de date pentru a confirma în codul MCU că le-am acceptat. Vreau să remarc aici un lucru. Acesta este motivul pentru care am adăugat „\ 0” la șir. Acest lucru se datorează faptului că, pe partea MCU, este imposibil să citiți șirul în totalitate. Se citește caracter cu caracter. Deci, vrem să cunoaștem sfârșitul șirului pentru a nu mai citi. Deci, adăugăm „\ 0” la șirul care indică sfârșitul șirului. Apoi ne conectăm la portul care este conectat la MCU. Puteți determina acel port căutând în „Device Manager”. Deci, aveți grijă să vă aflați pe același port. La urma urmei, trimitem datele către MCU. „.encode ()” ar trebui adăugat la datele șirului pentru a putea fi trimise către receptor.

Pasul 4: Software-ul microcontrolerului

Deci, să vedem codul nostru pentru MCU. În primul rând vreau să vă arăt fișierul „config.h” din interior, care nu este obligatoriu, dar l-am făcut pentru simplitate. Aici trebuie doar să schimbați frecvența MCU-ului dvs.

#ifndef CONFIG_H # definește CONFIG_H

#include

#device ADC = 16

#FUSES NOWDT // Fără cronometru pentru câini de supraveghere

# FUSES NOBROWNOUT // Nu se resetează defecțiunea # FUSES NOLVP // Fără programare de joasă tensiune, B3 (PIC16) sau B5 (PIC18) utilizate pentru I / O

# întârziere de utilizare (cristal = 6000000)

Acum să vedem codul principal:

#include

#include

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

#define LED_RED PIN_D0

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

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); unsigned int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (nul) {

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); }}

La început includem biblioteca de șiruri, care ne va fi de ajutor în operațiile de șiruri, care în cazul nostru este operația de comparare a șirurilor (strcmp). Deci, scopul nostru în acest cod este să pornim ledul conectat la pinul D0 dacă valoarea transmisă este aceeași cu valoarea dată, care este "cmp_" egală cu "24".

În primul rând, activăm întreruperea „rda”, care va provoca întreruperea la transmiterea datelor.

În al doilea rând, să ne uităm în interiorul ISR (rutină de serviciu de întrerupere) care se numește „serial_communication_interrupt”. În interior dezactivăm mai întâi semnalul de întrerupere pentru a citi valoarea primită și pentru a provoca întreruperea în continuare. După aceea, citim șirul caracter cu caracter până când ajungem la „\ 0”. În timp ce citim șirul din interior, scriem și fiecare caracter în buffer pentru a obține șirul primit.

La sfârșit, intrăm din nou înăuntru. Aici comparăm șirul tampon care este primit șir și șir cmp_ pentru a vedea dacă obținem șirul corect. Dacă sunt egale, atunci pornesc ledul, altfel opresc. *

* În cod am făcut inversare, deoarece placa mea inversează valorile pinului portului D. În codul dvs. schimbați-l în:

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

În cele din urmă, compilați-l și încărcați-l pe MCU și apoi rulați codul în Python. Ar trebui să vedeți ledul pornit.

Pasul 5: Concluzie

Am terminat cu succes o sarcină. Sper că vă va fi de folos. Dacă aveți vreo întrebare, vă rugăm să nu ezitați să întrebați:) Până la următorul proiect.

Recomandat: