Un poco mas de conexión por puerto serial, usando bash y python para leer información del microcontrolador como manufactura y otros datos…

Todos los dispositivos que se conectan por USB tienen una información descriptiva del dispositivo que se esta conectando. En este curso siempre daremos ejemplos para GNU-Linux.

 

Que es un puerto USB

El Bus Universal en Serie, más conocido por la sigla USB, es un bus de comunicaciones que sigue un estándar que define los cables, conectores y protocolos usados en un bus para conectar, comunicar y proveer de alimentación eléctrica entre computadoras, periféricos y dispositivos electrónicos.​

Existe un comando para ver la información de los periféricos conectados por puerto USB, básicamente lo que hace es listar lo que esta conectado en los puertos..

También es importante conocer como es el funcionamiento del puerto usb.

ee20c391a352cdbcbed38a54c9470746_1024x1024

pin1 es vcc o alimentación de 5 voltios, color rojo.
pin2 es Data – , por este pin llegan datos, de color blanco.
pin3 es Data +, por donde se van los datos, color verde.
pin4 es GND, también conocido como tierra, el voltaje es 0, es el punto común, color negro.

 

Comunicación Serie

La comunicación serie o comunicación secuencial, en telecomunicaciones e informática, es el proceso de envío de datos de un bit a la vez, de forma secuencial, sobre un canal de comunicación o un bus.

 

Comunicación Paralela

En telecomunicaciones e informática, la comunicación paralela es un método para transmitir muchos packs de múltiples dígitos en binarios (bits) de manera simultánea. A diferencia con la comunicación serie, la cual solo transmite un bit cada vez; esta es una de las características básicas que distinguen a los tipos de comunicaciones.

 

Comunicación Serial por puerto USB

Últimamente, debido a que el protocolo de comunicación serie es libre y necesitamos de drivers, muchas placas electrónicas se comunican en serie. Por ejemplo la placa arduino se conecta al computador de forma serial. No por el puerto serial, sino que la comunicación es serial, básicamente lo que hace es virtualizar el puerto serial para manejarlo con un puerto usb.

 

Si queremos usar los dispositivos desde el mismo puerto usb, podremos usar una librería que se llama libusb, disponible en GNU – Linux.

 

Que es bash

Bash es un programa informático, cuya función consiste en interpretar órdenes, y un lenguaje de consola. Es una shell de Unix compatible con POSIX y el intérprete de comandos por defecto en la mayoría de las distribuciones GNU/Linux, además de macOS. También se ha llevado a otros sistemas como Windows y Android

 

Usando el comando lsusb

Vamos a trabajar con la calculadora HP 50g. Abrimos una terminal y tipeamos lsusb. Este comando se traduce en  «listar puertos usb», hace una lista de los dispositivos que están conectados. En la lista muestra varias cosas, como la empresa manufacturera, el nombre del dispositivo, un ID, numero de bus.

 

 lsusb 

 

Al tipiar el comando podemos observar que nos muestra el nombre del dispositivo y la empresa manufacturera. El dispositivo es una calculadora Hp y la empresa Hp inc

Screenshot_20191015_111810
salida del comando lsusb

 

 

Como saber el nombre del puerto en el que esta conectado la Hp

Para saber el nombre debemos tipear el siguiente comando

 

 dmesg | grep tty 

 

Esto nos listara los dispositivos donde podremos hacer comunicación serial. Por ejemplo el mouse, teclado no aparecen, solo aparece la calculadora. Esto quiere decir que el mouse y el teclado no se comunican por serial.

Screenshot_20191015_122045
salida del comando dmesg | grep tty

Aquí vemos que el puerto en que esta conectado es ttyUSB0, esto es una forma de conseguir el puerto en el que esta conectado.

 

Udevadm

una herramienta para controlar el funcionamiento de udev. Entre sus usos útiles, podemos destacar udevadm monitor –kernel que muestra los eventos detectados por el kernel.

 

Este comando bash, es muy poderoso para todas estas cosas que estamos trabajando, por ejemplo si queremos ver toda la informacion del dispositivo, con este comando lo podremos hacer. Obviamente debemos colocar el nombre del puerto donde esta conectado el dispositivo.

 udevadm info /dev/ttyUSB0  

 

podemos ver, que el puerto en el que esta conectado es el  /dev/ttyUSB0. esto cambia, seguramente nunca va ser el mismo puerto. La salida del comando es la siguiente

 

~  udevadm info /dev/ttyUSB0
P: /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.2/1-1.5.2:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
L: 0
S: serial/by-id/usb-HP_Company_HPx9G+_Device-if00-port0
S: serial/by-path/pci-0000:00:1a.0-usb-0:1.5.2:1.0-port0
E: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.2/1-1.5.2:1.0/ttyUSB0/tty/ttyUSB0
E: DEVNAME=/dev/ttyUSB0
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: USEC_INITIALIZED=19243362136
E: ID_BUS=usb
E: ID_VENDOR_ID=03f0
E: ID_MODEL_ID=0121
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=EHCI
E: ID_VENDOR_FROM_DATABASE=HP, Inc
E: ID_MODEL_FROM_DATABASE=HP 39g+ [F2224A], 39gs [F2223A], 40gs [F2225A], 48gII [F2226A], 49g+ [F2228A], 50g [F2229A, NW240AA]
E: ID_VENDOR=HP_Company
E: ID_VENDOR_ENC=HP\x20Company
E: ID_MODEL=HPx9G+_Device
E: ID_MODEL_ENC=HPx9G+\x20Device
E: ID_REVISION=0100
E: ID_SERIAL=HP_Company_HPx9G+_Device
E: ID_TYPE=generic
E: ID_USB_INTERFACES=:ff0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb_serial_simple
E: ID_USB_CLASS_FROM_DATABASE=Vendor Specific Class
E: ID_PATH=pci-0000:00:1a.0-usb-0:1.5.2:1.0
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_5_2_1_0
E: ID_MM_CANDIDATE=1
E: DEVLINKS=/dev/serial/by-id/usb-HP_Company_HPx9G+_Device-if00-port0 /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.5.2:1.0-port0
E: TAGS=:systemd:

 

En esta lista podemos ver la cantidad de cosas que se puede saber de un dispositvo conectado. Por ahora no lo vamos a usar, pero si deseamos extraer esa informacion, lo podremos hacer con python tambien.

 

Herramientas de python para dispositivos electronicos conectados al pc

Aqui veremos  herramientas de python, que son alternativas a los comandos bash, basicamente son un conjunto de librerias que podremos manipular para obtener un mismo resultado.

 

Usaremos la libreria comports, sino la tenemos instalada, la instalamos usando el instalador pip. Con el codigo que pongo de ejemplo podremos listar todos los puertos donde hay dispositivos conectados

from serial.tools.list_ports import comports
puerto=sorted( x[0] for x in comports() )
print (puerto)

 

 

Mucha teoría y ahora si vamos a la practica, en este tutorial vamos hacer transferencia de datos entre la calculadora hp y la calculadora. Como describí antes podremos enviar y recibir datos por puerto usb si tenemos el driver, pero sino tenemos el driver debemos hacer comunicación serial mediante el puerto físico USB.

 

Primero conectamos la calculadora al computador. La encendemos tecleamos la tecla APS 2 enter 5 enter, para asi llegar a este menu.

Screenshot_20191015_162927
I/O functions  >> transfer >>

 

Aquí seleccionamos el puerto usb, las demás opciones es para comunicación entre 2 calculadoras. No he indagado mucho sobre la comunicación por puerto usb, sin embargo pude ver que si hizo efectivamente la comunicación y cuando interrumpía la comunicación me salia un mensaje a la terminal.

 

El siguiente script tiene la intención de hacer comunicación con la calculadora Hp, básicamente esta esperando que llegue un dato.

 

#!/usr/bin/python
#Importamos las librerias
import time
import serial
arduino = serial.Serial('/dev/ttyUSB0', baudrate=115000, timeout=2)
time.sleep(1)
arduino.flushInput()
while True:
try:
line = arduino.readline()
print(line.decode('ascii', errors='replace'), end='')
dato_arduino= line.decode('ascii', errors='replace').strip()
print(dato_arduino)
#arduino.write(b'2')
except ValueError:
warnings.warn("Line {} didn't parse, skipping".format(line))
except KeyboardInterrupt:
print("Exiting")
break

 

Si bueno, los resultados no fueron del todo bueno, la intención era enviar una variable desde la calculadora al computador. En la calculadora le di un valor a la variable «V» y la trate de enviar al computador, quizá no estoy decodificando bien, pero llega caracteres extraños.

 

Como conseguir el nombre de la empresa de manufactura o vendor

El nombre del manufacturero es la empresa que fabrica el producto. aqui quiero compartir un codigo que he depurado, para conseguir el puerto y el nombre del fabricante.

 

#Importamos las librerias
from serial.tools.list_ports import comports
import subprocess
#Aqui vemos la direccion /dev/tty****
puerto=sorted( x[0] for x in comports() )
puerto= ».join(puerto)
#limpiamos para que no hallan mensajes montadas
puerto= puerto + » »
#Buscamos la ide
ruta_id=sorted( x[2] for x in comports() )
#Convertimos de list a string
ruta_id= ».join(ruta_id)

#Validamos si hay algo conectado
status_conect=sorted( x[0] for x in comports() )
if (status_conect == []):
conexion= int(0)
puerto= «Dispositivo desconectado»
print(puerto)

else:
conexion= int(1)
#Buscamos el numero ID del puerto
id1=ruta_id.rindex(«:»)
id2=id1 + 1
id3= id1 + 5
id_puerto=ruta_id[id2:id3]
#Buscamos el nombre de la empresa manufacturera a partir del ID
ruta_name_port= subprocess.check_output( «lsusb», stderr=subprocess.STDOUT, shell=True)
#Convertimos de bytes a string
ruta_de_port= ruta_name_port.decode(«utf-8»)
#Buscamos el ID del puerto
ruta_name_port1=ruta_de_port.index(id_puerto)
ruta_name_port2=ruta_name_port1 + 4
#Extraemos el nombre de manufactura
name_port=ruta_de_port[ruta_name_port1:ruta_name_port2]
ruta_name_port2=ruta_name_port1 + 5
ruta_name_port3=ruta_name_port1 + 60
name_board=ruta_de_port[ruta_name_port2:ruta_name_port3]
#Buscamos el salto de linea que esta luego de la linea deseada
name_board1=name_board.index(«Bus»)
#Guardamos en board la posicion cero hasta antes de la palabra Bus
board= name_board[0:name_board1] + » »
print(board)
print(puerto)

[/code ]

En esta rutina que he escrito, no hay falla, asi tengas muchos dispositivos conectados vas a conocer el nombre del fabricante, ya que estoy usando el ID.

 

Resumen

Posiblemente en este tutorial hay mucha teoria y poca practica. Pero hay una referencia de electronica buena. estos cursos estan enfocados a ingenieros electronicos basicamente. Tampoco me detuve a explicar detalladamente ciertos comandos, porque ya fueron explicados en tutoriales anteriores.

 

Curso de python: Tutorial#0 Tutorial#1  Tutorial#3

 

Fuentes

https://es.wikipedia.org/wiki/Universal_Serial_Bus

http://www.sase.com.ar/2013/files/2013/09/SASE2013-USB-P-Gomez.pdf