Innholdsfortegnelse:

PIC MCU og Python seriell kommunikasjon: 5 trinn
PIC MCU og Python seriell kommunikasjon: 5 trinn

Video: PIC MCU og Python seriell kommunikasjon: 5 trinn

Video: PIC MCU og Python seriell kommunikasjon: 5 trinn
Video: Control Arduino with Python using Firmata / PyFirmata 2024, November
Anonim
PIC MCU og Python seriell kommunikasjon
PIC MCU og Python seriell kommunikasjon
PIC MCU og Python seriell kommunikasjon
PIC MCU og Python seriell kommunikasjon

Hei folkens! I dette prosjektet vil jeg prøve å forklare eksperimentene mine på PIC MCU og Python seriell kommunikasjon. Over internett er det mange opplæringsprogrammer og videoer om hvordan du kommuniserer med PIC MCU over virtuell terminal, noe som er veldig nyttig. Imidlertid er et av kravene i mitt hovedprosjekt å etablere seriell kommunikasjon mellom PIC MCU og Python, som jeg ikke kunne finne god opplæring. Så la oss komme i gang:)

Trinn 1: Hva trenger vi?

Hva trenger vi?
Hva trenger vi?
Hva trenger vi?
Hva trenger vi?

Så, først og fremst, la oss se hva vi trenger. Når det gjelder maskinvare:

  • Sikkert, PIC MCU som i mitt tilfelle PIC16f877a (Du trenger ikke det kortet. Dette er for å forenkle noen skitne tilkoblinger)
  • USB til TTL -omformer for å kommunisere med PIC MCU over USB -port ved bruk av TX- og RX -pinner.
  • MCU programmerer som i mitt tilfelle K150 programmerer, men du kan bruke PicKit 2, 3 eller noe annet.
  • Og til slutt en datamaskin:)

Når det gjelder programvare:

  • En IDE for å skrive python -kode, som i mitt tilfelle Pycharm, men du kan også bruke vanlig Python IDE.
  • Et miljø for programmering av MCU som i mitt tilfelle er MPLAB X IDE med CCS C -kompilator.

Trinn 2: Maskinvaretilkoblinger

Maskinvaretilkoblinger
Maskinvaretilkoblinger

På bildet er vedlagte maskinvaretilkoblinger gitt mellom PIC MCU og USB TTL -omformer som nedenfor:

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

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

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

Du trenger ikke å koble VCC -pinnen til USB TTL -omformeren (men du kan gjøre det hvis du vil). Disse 3 tilkoblingene er ganske nok.

Trinn 3: Python -programvare

La oss begynne å skrive programvare for Python -siden som vil være sender i vårt tilfelle, fordi den sender strengen til MCU.

import serial #import serial librarydata = '24' #data som vi vil sende data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect til porten ser.write (a.encode ()) #send dataene

Først og fremst importeres det serielle biblioteket for å kunne bruke fremtiden. Vi vil sende et eksempel på strengdata for å bekrefte i MCU -koden at vi godtok det. Jeg vil her notere en ting. Dette er grunnen til at vi la til '\ 0' i strengen. Dette er fordi det på MCU -siden er umulig å lese strengen totalt. Den leses karakter for karakter. Så vi vil vite slutten av strengen for å slutte å lese. Så vi legger til '\ 0' i strengen som angir slutten av strengen. Deretter kobler vi til porten som er koblet til MCU. Du kan bestemme den porten ved å søke i 'Enhetsbehandling'. Så vær forsiktig så du er på samme port. Tross alt sender vi dataene til MCU. ".encode ()" bør legges til strengdataene for å kunne sende dem til mottakeren.

Trinn 4: Programvare for mikrokontroller

Så la oss se koden vår for MCU. Først og fremst vil jeg vise deg "config.h" -filen som ikke er nødvendig, men jeg gjorde det for enkelhets skyld. Her er det bare å endre frekvensen på MCU -en din.

#ifndef CONFIG_H#definere CONFIG_H

#inkludere

#enhet ADC = 16

#FUSES NOWDT // No Watch Dog Timer

#FUSES NOBROWNOUT // No brownout reset #FUSES NOLVP // No low voltage prgming, B3 (PIC16) or B5 (PIC18) used for I/O

#bruk forsinkelse (krystall = 6000000)

La oss nå se hovedkoden:

#inkludere

#inkludere

#bruk rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, paritet = N, stopp = 1)

#define LED_RED PIN_D0

røye inp; char cmp _ = "24"; røyebuffer [3];

#int_rda

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

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); mens (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); annet output_high (LED_RED); }}

I begynnelsen inkluderer vi strengbibliotek, som vi vil være nyttige i strengoperasjoner, som i vårt tilfelle er streng sammenligningsoperasjon (strcmp). Så, vår hensikt med denne koden er å slå på LED -en som er koblet til pin D0 hvis den overførte verdien er den samme som vår oppgitte verdi som er "cmp_" tilsvarer "24".

Først av alt aktiverer vi interrupt "rda" som vil forårsake avbrudd når data overføres.

For det andre, la oss se på ISR (interrupt service routine) som kalles "serial_communication_interrupt". Inne deaktiverer vi først avbruddsflagget for å lese den mottatte verdien og forårsake avbrudd ytterligere. Etter det leser vi strengen tegn for tegn til vi når '\ 0'. Mens vi leser inne i strengen, skriver vi også hver røyke til bufferen for å få mottatt streng.

På slutten kommer vi igjen inne mens. Her sammenligner vi bufferstrengen vår som er mottatt streng og cmp_ streng for å se om vi får strengen riktig. Hvis de er like, slår jeg på led, ellers slår jeg av.*

*I koden reverserte jeg fordi kortet mitt inverterer D -portens pinverdier. Endre den i koden til:

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

Til slutt, kompiler den og last opp til MCU -en din og kjør deretter koden i Python. Du bør se LED slå på.

Trinn 5: Konklusjon

Vi har fullført en oppgave vellykket. Jeg håper at det vil være nyttig for deg. Hvis du har spørsmål, ikke nøl med å spørre:) Til neste prosjekt.

Anbefalt: