Tabla de contenido:

Comunicación serial PIC MCU y Python: 5 pasos
Comunicación serial PIC MCU y Python: 5 pasos

Video: Comunicación serial PIC MCU y Python: 5 pasos

Video: Comunicación serial PIC MCU y Python: 5 pasos
Video: Comunicacion Serial (parte 1) 💻 Programación de PIC en CCS C (PIC C) # 030 2024, Noviembre
Anonim
Comunicación serial PIC MCU y Python
Comunicación serial PIC MCU y Python
Comunicación serial PIC MCU y Python
Comunicación serial PIC MCU y Python

¡Hola chicos! En este proyecto intentaré explicar mis experimentos sobre comunicación serial PIC MCU y Python. En Internet, hay muchos tutoriales y videos sobre cómo comunicarse con PIC MCU a través de un terminal virtual, lo cual es muy útil. Sin embargo, en mi proyecto principal, uno de los requisitos es establecer una comunicación en serie entre PIC MCU y Python, que no pude encontrar un buen tutorial. Entonces empecemos:)

Paso 1: ¿Qué necesitamos?

¿Qué necesitamos?
¿Qué necesitamos?
¿Qué necesitamos?
¿Qué necesitamos?

Entonces, primero que nada, veamos qué necesitamos. En términos de hardware:

  • Seguramente, PIC MCU que es en mi caso PIC16f877a (No necesitas esa placa. Esto es para simplificar algunas conexiones sucias)
  • Convertidor de USB a TTL para comunicarse con PIC MCU a través del puerto USB utilizando pines TX y RX.
  • Programador MCU que es en mi caso programador K150, pero puedes usar PicKit 2, 3 o cualquier otra cosa.
  • Y finalmente una computadora:)

En términos de software:

  • Un IDE para escribir código Python, que en mi caso es Pycharm, pero también puedes usar el IDE normal de Python.
  • Un entorno para programar la MCU que es en mi caso MPLAB X IDE con compilador CCS C.

Paso 2: Conexiones de hardware

Conexiones de hardware
Conexiones de hardware

En la imagen se dan las conexiones de hardware adjuntas que se encuentran entre PIC MCU y convertidor TTL USB como se muestra a continuación:

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

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

TIERRA -------------- TIERRA

No necesita conectar el pin VCC del convertidor TTL USB (sin embargo, si lo desea, puede hacerlo). Estas 3 conexiones son suficientes.

Paso 3: software Python

Comencemos a escribir software para el lado de Python que será transmisor en nuestro caso, porque enviará la cadena a la MCU.

import serial #import serial librarydata = '24' #data que enviaremos data = a + '\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #conectar al puerto ser.write (a.encode ()) # enviar los datos

En primer lugar, se importa la biblioteca en serie para utilizar su futuro. Queremos enviar una cadena de datos de ejemplo para confirmar en el código MCU que la aceptamos. Quiero aquí señalar una cosa. Es por eso que agregamos '\ 0' a la cadena. Esto se debe a que, en el lado de la MCU, es imposible leer la cadena por completo. Se lee carácter a carácter. Entonces, queremos saber el final de la cadena para dejar de leer. Entonces, agregamos '\ 0' a la cadena que indica el final de la cadena. Luego nos conectamos al puerto que está conectado a la MCU. Puede determinar ese puerto buscando en 'Administrador de dispositivos'. Por lo tanto, tenga cuidado de estar en el mismo puerto. Después de todo, enviamos los datos a la MCU. Se debe agregar ".encode ()" a los datos de la cadena para poder enviarlos al receptor.

Paso 4: software del microcontrolador

Entonces, veamos nuestro código para MCU. En primer lugar, quiero mostrarles el archivo "config.h" que no es obligatorio, pero lo hice por simplicidad. Aquí solo cambia la frecuencia de tu MCU.

#ifndef CONFIG_H # define CONFIG_H

#incluir

#dispositivo ADC = 16

#FUSES NOWDT // Sin temporizador de perro guardián

#FUSES NOBROWNOUT // Sin reinicio por caída de tensión #FUSES NOLVP // Sin programación de baja tensión, B3 (PIC16) o B5 (PIC18) utilizado para E / S

#use delay (crystal = 6000000)

Ahora veamos el código principal:

#incluir

#incluir

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

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; tampón de carbón [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 (vacío) {

set_tris_d (0x00); salida_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (buffer, cmp_) == 0) salida_bajo (LED_RED); más salida_alta (LED_RED); }}

Al principio incluimos la biblioteca de cadenas que será útil en las operaciones de cadenas, que en nuestro caso es la operación de comparación de cadenas (strcmp). Entonces, nuestro propósito en este código es encender el led conectado al pin D0 si el valor transmitido es el mismo que nuestro valor dado que es "cmp_" igual a "24".

En primer lugar, habilitamos la interrupción "rda" que provocará una interrupción cuando se transmitan los datos.

En segundo lugar, veamos dentro de ISR (rutina de servicio de interrupción) que se llama "serial_communication_interrupt". En el interior, en primer lugar, deshabilitamos la bandera de interrupción para leer el valor recibido y causar más interrupciones. Después de eso leemos la cadena carácter a carácter hasta llegar a '\ 0'. Mientras leemos dentro de la cadena, también escribimos cada carácter en el búfer para obtener la cadena recibida.

Al final, volvemos a entrar mientras. Aquí comparamos nuestra cadena de búfer que es cadena recibida y cmp_ cadena para ver si obtenemos la cadena correctamente. Si son iguales, enciendo el led, de lo contrario, lo apago. *

* En el código, lo hice al revés porque mi placa invierte los valores de los pines del puerto D. En su código, cámbielo a:

if (strcmp (buffer, cmp_) == 0) salida_alta (LED_RED); si no salida_bajo (LED_RED);

Finalmente, compílelo y cárguelo en su MCU y luego ejecute el código en Python. Debería ver el led encenderse.

Paso 5: Conclusión

Hemos terminado una tarea con éxito. Espero que te sea de utilidad. Si tiene alguna pregunta, no dude en preguntar:) Hasta el próximo proyecto.

Recomendado: