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.
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
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.
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.
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
Deja un comentario