Sommario:

PIC MCU e comunicazione seriale Python: 5 passaggi
PIC MCU e comunicazione seriale Python: 5 passaggi

Video: PIC MCU e comunicazione seriale Python: 5 passaggi

Video: PIC MCU e comunicazione seriale Python: 5 passaggi
Video: Python serial port communication using PySerial #iot 2024, Dicembre
Anonim
PIC MCU e comunicazione seriale Python
PIC MCU e comunicazione seriale Python
PIC MCU e comunicazione seriale Python
PIC MCU e comunicazione seriale Python

Ciao ragazzi! In questo progetto cercherò di spiegare i miei esperimenti su PIC MCU e comunicazione seriale Python. Su Internet, ci sono molti tutorial e video su come comunicare con PIC MCU tramite terminale virtuale, il che è molto utile. Tuttavia, nel mio progetto principale uno dei requisiti è stabilire una comunicazione seriale tra PIC MCU e Python che non sono riuscito a trovare un buon tutorial. Quindi iniziamo:)

Passaggio 1: di cosa abbiamo bisogno?

Cosa ci serve?
Cosa ci serve?
Cosa ci serve?
Cosa ci serve?

Quindi, prima di tutto vediamo di cosa abbiamo bisogno. In termini di hardware:

  • Sicuramente, PIC MCU che è nel mio caso PIC16f877a (non hai bisogno di quella scheda. Questo è per semplificare alcune connessioni sporche)
  • Convertitore da USB a TTL per comunicare con PIC MCU tramite porta USB utilizzando i pin TX e RX.
  • Programmatore MCU che nel mio caso è il programmatore K150, ma puoi usare PicKit 2, 3 o qualsiasi altra cosa.
  • E infine un computer:)

In termini di software:

  • Un IDE per scrivere codice Python che è nel mio caso Pycharm, ma puoi anche usare un normale IDE Python.
  • Un ambiente per la programmazione dell'MCU che è nel mio caso MPLAB X IDE con compilatore CCS C.

Passaggio 2: connessioni hardware

Connessioni hardware
Connessioni hardware

Nell'immagine sono fornite le connessioni hardware allegate che si trovano tra PIC MCU e convertitore USB TTL come di seguito:

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

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

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

Non è necessario collegare il pin VCC del convertitore USB TTL (tuttavia, se vuoi puoi farlo). Queste 3 connessioni sono abbastanza.

Passaggio 3: software Python

Iniziamo a scrivere software per Python lato che sarà il trasmettitore nel nostro caso, perché invierà la stringa all'MCU.

import serial #import serial librarydata = '24' #data che invieremo data = a+'\0' ser = serial. Serial('COM17', baudrate=9600, timeout=1) #connect to the port ser.write(a.encode()) #invia i dati

Prima di tutto viene importata la libreria seriale per poter utilizzare i suoi futures. Vogliamo inviare una stringa di dati di esempio per confermare nel codice MCU che l'abbiamo accettata. Voglio qui notare una cosa. Questo è il motivo per cui abbiamo aggiunto '\0' alla stringa. Questo perché, lato MCU, è impossibile leggere totalmente la stringa. Si legge carattere per carattere. Quindi, vogliamo conoscere la fine della stringa per interrompere la lettura. Quindi, aggiungiamo '\0' alla stringa che indica la fine della stringa. Quindi ci colleghiamo alla porta che è collegata all'MCU. Puoi determinare quella porta cercando in "Gestione periferiche". Quindi, fai attenzione che sei sulla stessa porta. Dopotutto, inviamo i dati all'MCU. ".encode()" dovrebbe essere aggiunto ai dati della stringa per poterlo inviare al destinatario.

Passaggio 4: software del microcontrollore

Quindi, vediamo il nostro codice per MCU. Prima di tutto voglio mostrarvi il file "config.h" all'interno del quale non è richiesto, ma l'ho fatto per semplicità. Qui cambia solo la frequenza del tuo MCU.

#ifndef CONFIG_H#define CONFIG_H

#includere

#dispositivo ADC=16

#FUSES NOWDT //Nessun timer di sorveglianza

#FUSES NOBROWNOUT //Nessun ripristino del brownout #FUSES NOLVP //Nessuna programmazione a bassa tensione, B3(PIC16) o B5(PIC18) utilizzato per I/O

#use delay(crystal=6000000)

Vediamo ora il codice principale:

#includere

#includere

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

#define LED_RED PIN_D0

carattere inp; char cmp_="24"; buffer di caratteri[3];

#int_rda

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

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); altrimenti output_high(LED_RED); } }

All'inizio includiamo la libreria di stringhe che sarà utile nelle operazioni sulle stringhe che nel nostro caso è l'operazione di confronto delle stringhe (strcmp). Quindi, il nostro scopo in questo codice è accendere il led collegato al pin D0 se il valore trasmesso è lo stesso del nostro valore dato che è "cmp_" uguale a "24".

Prima di tutto abilitiamo l'interruzione "rda" che causerà l'interruzione quando i dati vengono trasmessi.

In secondo luogo, diamo un'occhiata all'interno dell'ISR (routine di servizio di interruzione) che si chiama "interruzione_di_comunicazione_seriale". All'interno disattiviamo prima il flag di interruzione per leggere il valore ricevuto e causare ulteriori interruzioni. Successivamente leggiamo la stringa carattere per carattere fino a raggiungere '\0'. Durante la lettura della stringa, scriviamo anche ogni carattere nel buffer per ottenere la stringa ricevuta.

Alla fine, veniamo di nuovo dentro mentre. Qui confrontiamo la nostra stringa del buffer che viene ricevuta stringa e cmp_ stringa per vedere se otteniamo la stringa correttamente. Se sono uguali accendo il led, altrimenti spengo.*

*Nel codice ho fatto l'inversione perché la mia scheda inverte i valori del pin della porta D. Nel tuo codice cambialo in:

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

Infine, compilalo e caricalo sul tuo MCU, quindi esegui il codice in Python. Dovresti vedere il led accendersi.

Passaggio 5: conclusione

Abbiamo completato con successo un compito. Spero che ti sarà utile. Se hai qualche domanda, non esitare a chiedere:) Fino al prossimo progetto.

Consigliato: