LABORATORIO: Laboratorio de Transmisión serial Asincrónica usando Arduino y Python

Sitio: Facultad de Ingeniería U.Na.M.
Curso: REDES I - IC412
Libro: LABORATORIO: Laboratorio de Transmisión serial Asincrónica usando Arduino y Python
Imprimido por: Invitado
Día: miércoles, 4 de diciembre de 2024, 23:28

1. Objetivos

  • Conocer los estandares existentes para la conexion serial de dispositivos
  • Conocer e interpretar las configuraciones que se necesitan en una transmision serial
  • Familializarse con los software/librerias y utilidades disponibles

2. Introduccion

En el presente laboratorio se realizará una comunicación de dos dispositivos mediante transmisión serial, el alumno utilizará hardware compatible y realizará envío/recepción de datos simples a travez del puerto serial. Como las computadoras más actuales no poseen puerto de comunicación serial, se empleará para ello un adaptador USB/Serial para poder realizar la misma.

Como vimos el Arduino es basicamente una placa con un microncontrolador programable. Para poder cargar el programa en el chip, el mismo es cargado a la placa vía puerto serie (bootloader). Por ello la mayoria de las placas Arduino, así como otras similares (NodeEsp32, etc), incorporan un chip adicional (cp2102) que se encarga de la conversion USB/serial para que podamos mandar el còdigo.

Como vemos en la siguiente imagen, tenemos el puerto 0 del Arduino conectado directamente al chip usb/serial. y otros puertos que se manejan especificamente via el microncontrolador. Este puerto 0 podemos utilizarlo como adaptador sin necesidad de tener un programa en la placa. Si tenemos alguna programa cargado en el microcontrolador y no queremos que interfiera debemos poner el chip en modo reset, poniendo a masa el pin reset para que no se inicie.


si quisiéramos emplear un puerto más y la placa no posee, por ejemplo podemos crear una rutina de software para poder utilizar pines digitales como puerto serial, con limitaciones en velocidad y funcionalidad.

Nota:

  • Niveles TTL ( que tiene una PC o NB) : 0V y 5V.
  • Niveles norma RS232 : -13V ("1") y 13V("0").

Si nos quisiéramos conectar a un dispositivo RS232 como se ha visto en la teoría de la materia el protocolo RS232 maneja diferentes niveles de tensiones en sus lineas de comunicación. Por lo que para conectarnos en este caso, necesitamos emplear un conversor de niveles TTL/RS232, estos poseen circuitos integrados tales como el MAX232, FT232, etc. o directamente un cable o adaptador USB/RS232, en el mercado encontramos chips como el PL2303 o el FT232R que hacen ese trabajo directamente.




3. Materiales

  • Placa Arduino MEGA + cable usb
  • PC con arduino IDE y software para comuniacion serial CuteCom/Putty
  • Cables de interconexion macho-macho

4. Monitores serie

Un monitor es un software el cual nos permite ver y analizar el trafico entrante/saliente que tenemos en determinado puerto de comunicacion. Como todo software tendremos una gran variedad con diferentes funciones y prestaciones. Aqui veremos los mas conocidos tanto en Windows , como en Linux y el monitor serie de la IDE de arduino que es muy simple de utilizar

4.1. Windows

Terminal bray++

Es un proyecto gratis. La ventaja de esta terminal es que podemos facilmente alternar el formato en que se muestran los datos recibidos en el puerto y podemos crear mensajes predeterminados para mandar, muy util si hacemos por ejemplo una comunicación con algun dispositivo serie como modem gps/gprs etc. también podemos crear macros como por ejemplo mandar un mensaje cada determinado tiempo.

Putty

Es software gratis también. La interfaz de usuario no esta muy desarrollada pero ademas de realizar conexiones por el puerto serial, nos permite realizar sesiones SSH. convirtiendolo en un software para tener siempre a disposición.

4.2. Linux

CuteCom

4.3. Arduino


Primero debemos instalar la IDE, para ello la podemos descargar desde https://www.arduino.cc/en/software o algún administrador de paquetes

Para ejecutar el monitor serie de la IDE de arduino, nos dirigimos a Herramientas->Monitor serie.

Primeramente debemos seleccionar el puerto en Herramientas-> Puerto. Podemos utilizarlo tanto en un puerto serie de una placa arduino, como en un puerto de un adaptador.

Como vemos este monitor serie es simple. no tiene configuraciones avanzadas en cuanto el puerto ni nos deja mostrar las tramas en otros formatos para así estudiarla.

5. Retroalimentación

Si queremos comprobar que nuestro nuestro código sea funcional, es decir que recibe el dato, podemos "puentear" los pines TX y RX, es decir unirlos.

como vimos TX0 y el RX0 están conectados al ordenador mediante el adaptador usb/serie. de manera que lo que ingresemos por teclado desde el monitor se estará mandando por el pin TX. Esto nos puede ser útil también para descartar el simulador de balanza y mandar este datos por el monitor serie (PC).

En este caso para enviar los datos por teclado tenga en cuenta el formato empleado, según el monitor serie que empleemos debemos tener en cuenta de incorporar o configurar la transmisión del CR al final


6. Consigna 1

Programando el Arduino

Como primera instancia, vamos a escribir un programa simple en la IDE y luego lo volcaremos al arduino.

El programa en cuestion debe enviar cada 3 segundos la palabra "Hola" por el puerto serial a una velocidad de 9600 baudios

Para ello tenga en cuenta que primero debe iniciar la libreria serial (al inicializar la misma libreria configura lo pines como digitales entrada/salida, no es necesario realizar configuraciones adicionales). y luego mandar el dato en loop.

Para enviar se pueden utilizar las funcione write(), print() y println(), tenga en cuenta que todas trabajan de manera diferente. Para más informacion: https://www.arduino.cc/en/reference/serial


Importante para programar:

Tenga en cuenta que la placa arduino se programa por el puerto serial 0, asi que si tenemos abierto el monitor serie en ese puerto, primero debemos terminar la sesión, sino al intentar programar nos va a salir un mensaje de error al querer acceder al puerto.

Siempre que abrimos una terminal serial o un programa que lee el puerto el mismo crea una sesion para mandar/recibir datos, como se vio en la teoría, la analogía perfecta es un llamado telefónico.

Si necesitamos leer por ejemplo el puerto por mas de un software, podemos aguardar hasta que el puerto este disponible, luego establecer la sesión, leer/mandar el dato, y luego cerrar la sesión para dejarla disponible.


Arduino monitor serial

Cuando conectamos el Arduino a un ordenador mediante un cable USB, el ordenador instala un puerto serie virtual (COM/tty) desde el cual podemos acceder al puerto serie de Arduino. Por este motivo es necesario instalar en el ordenador los drivers de interfaz USB de los microcontroladores de Atmel, esto se hace automáticamente al instalar el IDE de Arduino.

Una vez conectada la placa arduino, para acceder al monitor serie (ver lo que se envia/recibe por el puerto) para abrir el mismo nos dirijos a: Herramientas -> Monitor serie

Si estamos en Linux debemos dar permiso al puerto sudo chmod 777 /dev/ttyACM0 o en el que figure en la IDE

En esta instancia ya deberiamos estar viendo en el monitor la palabra Hola


7. Consigna 2

Ahora utilizando uno de los puertos serie del arduino Mega. simularemos un cabezal de balanza electronica. la misma envia el dato del peso cada ciertos segundos.

Si vamos al manual del cabezal, tenemos la trama que la misma transmite.

Primeramente realice entonces un codigo que transmita esta trama por el puerto serial 0, de manera que podamos visualizarla en el monitor.

Verifique que la trama enviada tenga ese formato. para ello es de ayuda mostrar los datos en formato HEX.

debería ver algo como lo siguiente:

44 30 30 30 35 36 0D

44: status

30 30 30 30 35 36: 000056 peso

0D: Retorno de carro

8. Tx Rx con Python

Python posee una poderosa libreria para manejar comunicaciones seriales la cual se muestra a continuación.

La liberaria tiene el nombre de pySerial, mientras que su modulo se llama serial

1. Instalación

Para poder utilizar la libreria primero se debe realizar la instalación.
 Linux, original, logo Free Icon - Icon-Icons.com Podemos utilizar pip para la instalación:
          pip install pyserial
 windows, computer, desktop, technology, screen, microsoft, os icon | Social  Media & Logos I Filled Line icon sets | Icon Ninja Se puede instalar mediante pip, o se debe descargar los sources de
         https://github.com/pyserial/pyserial/releasesy luego correr el instalador que trae el paquete
  
python setup.py install

instalar pip:
https://www.geeksforgeeks.org/how-to-install-pip-on-windows/

2. Inicializacion

Como primer punto es necesario importar la libreria al codigo:

import serial

Para iniciar el puerto creamos un objeto y llamamos la función:

ser = serial.Serial(port, baudrate, xxx,....)

Algunos de los parámetros básicos de configuración son los siguientes:

  • port : Nombre del puerto, en windows tenemos  COMx, mientras que en linux puede ser /dev/ttyUSBx, /dev/ttyACMx, /dev/ttySx, etc dependiendo del tipo de dispositivo.
  • baudrate: velocidad de transmision, por defecto 9600
  • timeout: tiempo de espera para recepción, por defecto sin timeout.
  • stopbits: bits de stop a enviar, por defecto 1
  • bytesize: tamaño de dato, por defecto 8
  • parity: paridad serial.PARITY_NONE, N, serial.PARITY_EVEN, E, serial.PARITY_ODD, O. por defecto Sin paridad

Ejemplo:

ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1, stopbits=1,bytesize=8,parity=serial.PARITY_NONE)

3. lectura y escritura

 

write(data)
Escribe un dato del tipo byte a la salida del puerto, se puede utilizar bytearray para poder mandar cadenas codificadas
write(b'\x0D\x0A')                       //escribe CR+LF ingresado en Hex
write(bytearray('Hola\r\n','latin1')) //escribe "Hola" + CR+LF
write(b"Hello World") //escribe "Hello world"
write(chr(27)) //escribe caracter 'ESC'

 

read(size)
Lee un determinado numero de bytes del puerto serial.

 read(10) //Lee 10 bytes del buffer de entrada.

importante: Las funciones de lectura de puerto pueden verse afectadas por el paràmetro timeout en la configuracion del puerto


9. Consigna 3

Una vez que la trama del cabezal sea correcta. Intentaremos leer la trama utilizando ahora python. Depende el hardware que contamos podemos hacer lo siguiente:

  • Enviar trama simulada por puerto serie 1. y leer desde el puerto serie 0. Conectando un cable de TX1 a RX0
  • Utilizar una placa para mandar el dato y otra placa para recibir.

Una vez que podamos leer el peso, vamos a enviarlo por la consola para corroborar que el dato recibido sea correcto. de la forma:

           Peso Recibido: 200 Kg



Tenga en cuenta que para acceder al puerto serial 1 utilice el objeto Serial1. ejemplo:
Serial1.begin(9600);


Utilice print() para poder mandar los datos con un formato establecido




10. Preguntas

  • ¿Qué pasa si no configuramos bien los parámetros para la comunicación?
  • ¿Qué factores influyen en la velocidad de transmisión que podemos alcanzar vía serial?
  • ¿Qué pasa si no son leídos los datos recibidos en el puerto, es posible recuperarlos?
  • ¿En el laboratorio solamente unimos un par de pines TX-RX, que pasa con el otro?
  • ¿Por qué utilizamos un adaptador para mandar datos, si el bus USB (universal serial bus) ya es del tipo serie?
  • ¿En la práctica se utiliza poco el control de flujo, porqué cree que pasa esto, y como se soluciona?