arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Comunicación Serial

Fernanda Ochoa

GitHub Campus Expert

av_timer 4 Min. de lectura

remove_red_eye 37906 visitas

calendar_today 17 Junio 2020

Comunicación Serial

La comunicación serial es un protocolo estandarizado que permite el intercambio de información en forma de bits entre dos o más dispositivos.

Existen 2 formas de realizar esta comunicación entre un Microordenador y un Microcontrolador.

  • Usando los puertos USB de cada uno.
  • Conectando directamente los pines de comunicación serial entre ellos.

Conexión vía USB

Es la conexión más sencilla y lo único que necesitarás es el cable usb de tus dispositivos.

  • Conectaremos nuestro Microcontrolador a la computadora, cargaremos el programa del Microcontrolador
  • Cargamos el programa del Microordenador, igual como cualquier programa python.
  • Finalmente conectamos vía usb el microcontrolador al microordenador, como se ve en la imagen

raspberrypi_arduino_uno_serial_usb

Conexión vía pines de comunicación serial

Sin duda es la forma más compleja, ya que los pines de comunicación serial (tx y rx) varían dependiendo del modelo y marca del microcontrolador, por lo que deberás investigar el diagrama pinout del microcontrolador que quieres utilizar para ubicar la posición de los pines. Dependiendo del microcontrolador que utilices podrías necesitar un nivelador de voltaje de 5v a 3.3v, lo encuentras en internet como level shifter de 5v a 3.3v. También debes asegurarte de tener instalados los drivers correspondientes ya que de lo contrario no podrás hacerlo. Además deberás tener a la mano algunos jumpers o cables, los cables usb de tus dispositivos y el programa de cada uno.

Ahora sí, primero debemos conectar nuestros dispositivos. Cómo puedes ver utilizo un level shifter por seguridad de mis tarjetas.

raspberrypi_arduino_serial_gpio

A nuestro Microcontrolador no debemos hacerle ningún cambio simplemente cargar el programa previo a conectarlo con el Microordenador. Para el Microordenador debemos hacer lo siguiente:

  • Conectarnos via ssh o con los periféricos de entrada (Mouse, monitor, teclado)
  • Conectar nuestro microcontrolador y encontrarlo como /dev/ttyACM0 para ello basta con escribir en la terminal * ls /dev/tty* * Si no sabes cual es tu dispositivo, desconecta el cable usb del Microordenador y ejecuta nuevamente ls /dev/tty*
  • Ahora debemos darle permisos para que pueda comunicarse vía serial
    • Ejecutamos el comando utilizando el usuario de rpi sudo adduser tu_nombre_de_usuario dialout
    • Con eso evitamos el error: serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: ‘/dev/ttyACM0’
  • Ya tenemos los permisos, por lo que debemos reiniciar nuestro Microordenador
  • Una vez que reiniciamos, debemos instalar la biblioteca que nos permita comunicarnos vía serial en Python
    • Ejecutamos el comando python3 -m pip install pyserial
    • Si por casualidad te da este error: /usr/bin/python3: No module named pip es por que no tienes instalado pip, se instala con el comando sudo apt install python3-pip

Listo, con esta configuración ya podemos comunicarnos vía serial nuestros dispositivos. En cualquier caso es necesario realizar un programa para el Microcontrolador y otro para el Microordenador.

Programación del Microcontrolador.

Dirigete a la interfaz de desarrollo para tu microcontrolador

  • Define una etiqueta para hacer referencia al led en el resto del programa. Para este caso utilizaremos el led que viene integrado en la tarjeta de desarrollo.
  • Crea una variable para controlar el estado del led mediante la instrucción que se reciba del Microordenador.
  • Dentro de la función void setup() utiliza la instruccion pinMode(), para definir el pin del led que se conecto como salida.
  • Configura la comunicación serial a 9600 baudios.
  • Dentro de la función void loop utiliza la instrucción if para verificar si se tiene información en el bus serial.
    • Si es así, dicha información se almacenará en la variable que se creo al inicio.
    • Verifica con otra instrucción if si la información recibida es una letra H.
      • Si es así se encenderá el led.
    • Si es una letra L
      • El led se apagará Carga el programa en el Microcontrolador y dirigete a la interfaz de programación del Microcontrolador.

Código Microcontrolador

#define led 13

char estadoLed = 0;
void setup(){
    pinMode(led,OUTPUT);
    Serial.begin(9600);
}

void loop(){
    if(Serial.available() > 0){
        estadoLed = Serial.read();
        if(estadoLed == 'H')
            digitalWrite(led,HIGH);
        else if (estadoLed == 'L')
            digitalWrite(led, LOW);
     }
}

Programación Microordenador

Crea un nuevo archivo en la interfaz de programación.

  • Importa la clase sleep de la biblioteca time
  • Importa la biblioteca serial
  • Crea un objeto de tipo serial llamado microcontrolador pasando como parámetros la ruta en la cúal se conectará el microcontrolador y la velocidad de transmisión que se configuró en él.
  • Crea un ciclo while que se repita indefinidamente.
    • Dentro de él utiliza una variable para almacenar el valor qu se introduzca por el teclado al solicitar al usuario un comando por medio de la función input.
    • Una vez recibida la instrucción envíala al microcontrolador con la instrucción write.
    • Verifica cuál fue el comando enviado por el usuario
      • En caso de que el usuario introduzca una letra H se mostrará el texto Led encendido.
      • En caso contrario será Led apagado.
    • Cierra la comunicación serial con la instrucción close.

Finalmente conecta el Microordenador con el microcontrolador y verifica su funcionamiento. Observa como se enciende el Led del microcontrolador al enviar una letra H y como se apaga al enviar una letra L.

Código Microordenador

from time import sleep
import serial

microcontrolador = serial.Serial('/dev/ttyACM0',9600)

while True:
    comando = input("Introduce un comando")
    microcontrolador.write(comando.encode())
    if comando == 'H'
        print("Led Encendido")
    else comando == 'L'
        print("Led Apagado")

microcontrolador.close()