Índice:

PIC MCU e comunicação serial Python: 5 etapas
PIC MCU e comunicação serial Python: 5 etapas

Vídeo: PIC MCU e comunicação serial Python: 5 etapas

Vídeo: PIC MCU e comunicação serial Python: 5 etapas
Vídeo: Serial Port Monitor Code Example - Python with Tkinter 2024, Novembro
Anonim
PIC MCU e comunicação serial Python
PIC MCU e comunicação serial Python
PIC MCU e comunicação serial Python
PIC MCU e comunicação serial Python

Ola pessoal! Neste projeto, tentarei explicar meus experimentos em PIC MCU e comunicação serial Python. Na Internet, existem muitos tutoriais e vídeos sobre como se comunicar com PIC MCU através de um terminal virtual que é muito útil. No entanto, em meu projeto principal, um dos requisitos é estabelecer comunicação serial entre PIC MCU e Python, o qual não consegui encontrar um bom tutorial. Então vamos começar:)

Etapa 1: O que precisamos?

O que nós precisamos?
O que nós precisamos?
O que nós precisamos?
O que nós precisamos?

Então, primeiro vamos ver o que precisamos. Em termos de hardware:

  • Certamente, PIC MCU que é no meu caso PIC16f877a (você não precisa dessa placa. Isso é para simplificar algumas conexões sujas)
  • Conversor de USB para TTL para se comunicar com PIC MCU pela porta USB usando pinos TX e RX.
  • Programador MCU, que no meu caso é o programador K150, mas você pode usar o PicKit 2, 3 ou qualquer outra coisa.
  • E finalmente um computador:)

Em termos de software:

  • Um IDE para escrever código Python, que no meu caso é o Pycharm, mas você também pode usar o IDE Python regular.
  • Um ambiente para programar o MCU que é no meu caso MPLAB X IDE com compilador CCS C.

Etapa 2: Conexões de Hardware

Conexões de Hardware
Conexões de Hardware

Na imagem anexada, as conexões de hardware são fornecidas entre o PIC MCU e o conversor USB TTL conforme abaixo:

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

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

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

Você não precisa conectar o pino VCC do conversor USB TTL (no entanto, se você quiser, pode fazer). Essas 3 conexões são suficientes.

Etapa 3: software Python

Vamos começar a escrever um software para o lado do Python que será o transmissor no nosso caso, pois enviará a string para o MCU.

import serial #import serial librarydata = '24' #data que enviaremos dados = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #conecte à porta ser.write (a.encode ()) #enviar os dados

Em primeiro lugar, a biblioteca serial é importada para usar seus futuros. Queremos enviar dados de string de exemplo para confirmar no código MCU que os aceitamos. Eu quero aqui observar uma coisa. É por isso que adicionamos '\ 0' à string. Isso ocorre porque, no lado do MCU, é impossível ler a string totalmente. É lido personagem por personagem. Então, queremos saber o final da string para parar de ler. Então, adicionamos '\ 0' à string que indica o final da string. Em seguida, conectamos à porta que está conectada ao MCU. Você pode determinar essa porta pesquisando em 'Gerenciador de Dispositivos'. Portanto, tome cuidado para que você esteja na mesma porta. Afinal, enviamos os dados para o MCU. ".encode ()" deve ser adicionado aos dados da string para poder enviá-los ao receptor.

Etapa 4: software de microcontrolador

Então, vamos ver nosso código para MCU. Em primeiro lugar, quero mostrar a você o arquivo "config.h" que não é obrigatório, mas fiz isso para simplificar. Aqui, basta alterar a frequência de seu MCU.

#ifndef CONFIG_H # define CONFIG_H

#incluir

#device ADC = 16

#FUSES NOWDT // Sem cronômetro de cão de guarda

#FUSES NOBROWNOUT // Sem redefinição de brownout #FUSES NOLVP // Sem programação de baixa tensão, B3 (PIC16) ou B5 (PIC18) usado para E / S

#use delay (cristal = 6000000)

Agora vamos ver o código principal:

#incluir

#incluir

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

#define LED_RED PIN_D0

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

#int_rda

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

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); enquanto (1) {permitir_interrupções (int_rda); if (strcmp (buffer, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

No início, incluímos a biblioteca de strings que será útil em operações de strings que, em nosso caso, é a operação de comparação de strings (strcmp). Assim, nosso propósito neste código é acender o led conectado ao pino D0 se o valor transmitido for igual ao nosso valor dado que é "cmp_" igual a "24".

Em primeiro lugar, habilitamos a interrupção "rda", que causará interrupção quando os dados forem transmitidos.

Em segundo lugar, vamos dar uma olhada dentro do ISR (interrupção do serviço de rotina), que é chamado de "serial_communication_interrupt". Internamente, nós primeiro desabilitamos o flag de interrupção para ler o valor recebido e causar interrupções adicionais. Depois disso, lemos a string caractere por caractere até chegar a '\ 0'. Enquanto lemos dentro da string, também escrevemos cada char no buffer para obter a string recebida.

No final, voltamos a entrar enquanto. Aqui, comparamos nossa string de buffer que é a string recebida e a string cmp_ para ver se obtemos a string corretamente. Se forem iguais, ligo o led, caso contrário, apago. *

* No código, fiz a reversão porque minha placa inverte os valores dos pinos da porta D. Em seu código, altere-o para:

if (strcmp (buffer, cmp_) == 0) output_high (LED_RED); senão output_low (LED_RED);

Por fim, compile-o e carregue-o em seu MCU e, em seguida, execute o código em Python. Você deverá ver o led acender.

Etapa 5: Conclusão

Concluímos uma tarefa com sucesso. Espero que seja útil para você. Se você tiver alguma dúvida, não hesite em perguntar:) Até o próximo projeto.

Recomendado: