Comunicación usb serial con Python y Raspberry PI

Lectoras QR Honeywell, nuestro dispositivo USB serial a conectar.

Recientemente estoy trabajando en un proyecto en el que necesito conectar dos lectoras QR Honeywell modelos YJ HF600 a través de una comunicación usb serial a una Raspberry Pi y obtener de manera programada los valores que ellas regresan tras escanear un código QR.

Haré un primer ejercicio de lectura haciendo uso de Python por la facilidad y rapidez con la que podemos programar en este lenguaje para realizar pruebas y prototipos.

comunicación usb serial con Python y Raspberry PI

Lectoras QR Honeywell – Raspberry Pi

¿Cómo se comunican las lectoras QR Honeywell por usb?

Así como la mayoría de las lectoras de códigos de barra, las lectoras QR suelen emular un teclado y transmitir la información escaneada como si hubiese sido tecleada. Es decir, nuestros equipos a los que conectamos las lectoras suelen ver a estas como si fuesen un teclado teclado qwerty.

Hay lectoras que permiten configurarse para generar una comunicación usb serial que en el caso de las Honeywell basta con escanear su código de configuración que vienen en el manual y de manera automática quedan configuradas para generar una comunicación usb serial con el equipo al que las conectamos que en este caso es nuestra Raspberry Pi.

Detectando comunicación usb serial de nuestra Lectora QR en la Raspberry Pi

Ya que tenemos configurado y conectado nuestro dispositivo usb serial en la Raspberry Pi, ejecutamos el comando

dmesg | grep tty

En el caso de mi Raspberry Pi el comando dmsg | grep tty regresa una salida como esta

[    0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=1 bcm2708_fb.fbwidth=1360 bcm2708_fb.fbheight=768 bcm2708_fb.fbswap=1 smsc95xx.macaddr=B8:27:EB:F4:94:87 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000  console=tt1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
[    0.000297] console [tty1] enabled
[    0.824827] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 81, base_baud = 0) is a PL011 rev2
[    0.826467] 3f215040.serial: ttyS0 at MMIO 0x0 (irq = 53, base_baud = 31250000) is a 16550
[    2.936625] systemd[1]: Created slice system-getty.slice.
[    6.548674] cdc_acm 1-1.1.3:1.0: ttyACM0: USB ACM device
[47913.774867] cdc_acm 1-1.1.2:1.0: ttyACM1: USB ACM device

Hay dos posibles formas de detectar tu dispositivo, una es como ttyACM y la otra es como ttyUSB, en el caso de las lectoras QR Honeywell vemos que las detecta como ttyACM1 y ttyACM2

[ 6.548674] cdc_acm 1-1.1.3:1.0: ttyACM0: USB ACM device
[47913.774867] cdc_acm 1-1.1.2:1.0: ttyACM1: USB ACM device

Bien, ya que tenemos detectado como esta viendo la Raspberry Pi nuestras lectoras QR. Procedemos a hacer una prueba de lectura con ellas y sin programar una sola linea de código. Podremos realizar esta prueba únicamente ejecutando el siguiente comando

sudo cat /dev/ttyACM0

Cualquier código QR que pasemos por el escáner de nuestra lectora Honeywell nos mostrara su valor en la salida de este comando. Lo mismo sucede para la segunda lectora si en el comando variamos ttyACM0 por ttyACM1.

Programación en Python para la lectura de ambas lectoras QR Honeywell

Leer los valores retornados por un dispositivo que entable comunicación usb serial es realmente sencillo en Linux como lo pudimos ver en el anterior comando. En el caso de Python basta con analizar el buffer de nuestro /dev/ttyACM0 y /dev/ttyACM1 en hilos separados para obtener los códigos escaneados por nuestras lectoras QR Honeywell.

import os, sys
import serial
import time
import _thread

def readSerialOne(Thread):
   ser = serial.Serial('/dev/ttyACM0', 19200, timeout = 0)

   while True:
      line = ser.readline().decode()
      if len(line) > 0:
         print(line)

      time.sleep(0.1)

def readSerialTwo(Thread):
   ser = serial.Serial('/dev/ttyACM1', 19200, timeout = 0)

   while True:
      line = ser.readline().decode()
      if len(line) > 0:
         print(line)

      time.sleep(0.1)

try:
   _thread.start_new_thread( readSerialOne, ("QR-1", ) )
   _thread.start_new_thread( readSerialTwo, ("QR-2", ) )
except:
   print ("Error: unable to start thread")
while 1:
   pass

Para ejecutar el código anterior únicamente es requerida la instalación de la librería pyserial que podemos instalar con el siguiente comando

sudo apt-get install python3-pip
sudo pip3 install pyserial

finalmente ejecutamos nuestro código en Python

sudo python3 usb-serial-reader.py

Ahora cualquier código QR escaneemos en cualquiera de las dos lectoras QR Honeywell lo estaremos visualizando en nuestra terminal.

Liga a github con el código en Python aquí expuesto.

 
Clic here to found this entry post on english version.
 

 

 

Share: