bclose

Arduino y los Periféricos USB

Añadiendo dispositivos USB a nuestros proyectos con MAX3421E

Objetivos

 

 

  • Arduino y los periféricos USB
  • MAX3421E y la gestión del USB
  • Un ejemplo de como leer un teclado desde el M5STACK.
 

 

Material requerido.

 

 Tienda EspañaTienda Mexico
MOdelo basico    M5Stack
USB MASTERModulo USB HID Master

 

Integrando un teclado USB con Arduino

 

Andaba yo estos días con un proyecto de Arduino, en el que tenia que leer la salida de un teclado USB con un Arduino y subirlo a una base de datos vía Ethernet. En realidad, no era un teclado era algo parecido a esos lectores de código de barras o lectores RFID que se comportan como un teclado USB normal y corriente y leen el código de barras, o la tarjeta RFID y escriben en el USB el texto que corresponde a su identificación.

Son de lo más fáciles de usar porque no tienes que romperte la cabeza para intégralos. En un PC simplemente los enganchas a un USB y cualquier aplicación que este esperando una entrada de teclado recibe el código y listo.  Hay muchas soluciones de este estilo ya que nos permite manejar cosa complicadas de un modo muy sencillo (Que s como me gustan las cosas) y además permiten otra cosa fundamental, simplificar el diseño abaratar el coste porque la venta es masiva

Leyendo RFID
Lector codigo barras a USB keyboard

El problema parecía sencillo.  Conectar el dispositivo de lectura al USB de mi Arduino y ver como lo leemos. Una rápida búsqueda por internet, me bajo el entusiasmo enseguida: Ningún Arduino puede manejar un teclado USB, con excepción del Arduino DUE (del que no disponía ninguna unidad en ese momento) puede, porque por lo visto, una cosa es usar el puerto USB como puerta de comunicaciones serie, y otra distinta adentrarse en las procelosas aguas del mundo USB, sus Hosts y todo el lio de comunicaciones que se establece entre cliente y anfitrión. El resumen, de leer el teclado USB nada de nada.

Vale, pensé yo, alguien habrá hecho una librería que permitirá, que se yo, hacer un apañito que justo lea lo que yo quiero sin complicarme más la vida y… pues tampoco. Por lo visto hay un chip (Por lo menos) que se encarga de gestionar todo este lio sin molestar al procesador principal y que todos los fabricantes montan en sus periféricos para gestionar el tema del USB, que parece es mucho menos inocente de lo que a primera vista podrías pensar. Ese chip es el MAX3421E, y para los que tengáis interés, aquí va la Datasheet del integrado:

Gestor de protocolo USB

Básicamente es un integrado que incluye toda la electrónica precisa para gestionar la comunicación entre el host principal y los dispositivos clientes que se presentan, la velocidad de comunicación y demás zarandajas propias del USB, y de paso descarga al procesador principal de toda esta carga de trabajo, comunicándose con él vía SPI.  También se le llama dispositivo de interface humano para el USB o HID (Human Interface Device)

O sea, es relativamente fácil de montar y soportar en un circuito y además tenemos el software oficial necesario aquí: https://www.arduino.cc/reference/en/libraries/usb-host-shield-library-2.0/

Pero vas a necesitar hardware para ello, así que aflojé la billetera y tras una búsqueda rápida encontré esto, ya que estaba usando un M5Stack para el proyecto (La foto de abajo a la izquierda):

USB MASTER

Como el M5STACK viene con unos ejemplos de código para el teclado (Mira por donde), me puse manos a la obra y rápidamente tenia a mi flamante M5STACK leyendo el teclado sin mas líos.

Como me imagino que no seré el único con este problema me ha parecido que podía ser interesante documentarlo para los amigos de Prometec, por que incluir teclados, ratones, joysticks y cualquier otra variedad de dispositivo de entrada salida que se os ocurra con USB, puede añadir un bonito plus adicional de proyectos al alcance de nuestros Arduinos.

Y de eso va este tutorial, veremos como usar el módulo USB de M5Stack con MAX3421E para leer un teclado directamente, usando los programas de ejemplo que le acompañan.

He pedido un par de Arduinos DUE y un shield Arduino que incluye el MAX3421E para futuras sesiones, de modo que ya os iré contando, porque la posibilidad de manejar periféricos USB de forma sencilla es algo que me encanta, y hay muchos de estos periféricos por ahí, a nuestra disposición, lo que abre una nueva categoría de proyectos que podemos hacer integrando cualquier chisme USB. Ya te digo, iré probando y os contaré.

 

Programando el USB Host con MAX3421E

 

Lo primero es que vamos a necesitar instalar algunas librerías antes de empezar:

hidboot.h            Puedes descargarla aquí.
usbhub.h            Puedes descargarla aquí.

Una vez bajada puedes instalar las librerías como siempre Vamos con el programa, necesitaras invocar las librerías pertinentes:

#include <M5Stack.h>
#include <hidboot.h>
#include <usbhub.h>
#include <SPI.h>

En el ejemplo viene después el programa de unas clases para manejar todo el asunto, que como es lógico, voy a ignorar elegantemente, para no meterme donde no me llaman y hacer como que se, o me preocupa lo que hacen y pasaremos directamente al programa que lee el teclado tirando de estos programas. Lo lógico habría sido que esta parte del manejo básico del USB estuviese en forma de librería para instalarla sin más, pero parece que los chicos de M5Stack están muy ocupados con sus muchas obligaciones y no ha podido ser (No es una queja, lo están haciendo genial. Pero recuera que si tendrás que incluirlo en tu programa igual que en el ejemplo)

Puedes encontrar la documentación del modulo USB HID en la pagina de M5stack con ejemplos USB HID.  Vamos a la parte de cómo usarla:

USB     Usb;
USBHub  Hub(&Usb);
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);
KbdRptParser Prs;

La primera línea, crea una instancia USB de la clase USB sin más. La segunda crea un HUB USB, me imagino que para poder conectar mas de un periférico al M5 y la última línea define que se vamos a usar un teclado conectado al USB. La última línea invoca al keyboard parser, sabe dios porque, pero yo soy muy obediente así que a copiar y callar.

void setup()
{ M5.begin();
  M5.Lcd.fillScreen(TFT_NAVY);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE);
  M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE);
  M5.Lcd.println("USB Keyboard");
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(0, 31);
  M5.Lcd.println("Button A clears");
  M5.Lcd.setTextColor(TFT_YELLOW);

Para los que hayáis jugado previamente con el M5STACK, ninguna novedad hasta aquí. Inicializamos con Begin y luego borramos la pantalla con color azul Navy. Fijamos el color del texto y sacamos un mensaje en pantalla.

Después, elegimos tamaño de Font y la posición del cursor y un mensaje que nos avisa de que podemos borrar la pantalla con el botón A.

  Serial.begin( 115200 );

  if (Usb.Init() == -1)
      Serial.println("OSC did not start.");
  delay( 200 );
  HidKeyboard.SetReportParser(0, &Prs);

Preparamos el Serial y comprobamos que se inicia correctamente el servicio USB y si es así, la última líea activa el parser de teclado. Ya podemos pasar al loop:

void loop()
{   Usb.Task();
    M5.update();
    if (M5.BtnA.wasReleased()) 
     {  // Clear screen
        M5.Lcd.clear(TFT_NAVY);
        M5.Lcd.setCursor(0, 0);
        M5.Lcd.setTextSize(2);
        M5.Lcd.setTextColor(TFT_YELLOW);
     }
}

El manejo del teclado es de los mas simple, activamos la tarea del USB con la primera línea, y entramos en un ciclo que lee el mensaje del teclado y vamos escribiéndolo en pantalla. La propia clase, se encarga de imprimir el mensaje por lo que en algún momento querrás interceptar lo que lee el parser, entrando a modificar el método correspondiente:

void KbdRptParser::OnKeyPressed(uint8_t key)
{  char c = (char)key;
   Serial.print("ASCII: ");
   Serial.println(c);
   if (c == '\n' || c == '\r')
       M5.Lcd.println();
   else
       M5.Lcd.print(c);
};

Y eso es todo. Como veis es francamente sencillo de usar en la practica si pasas de la mayor complicación del engranaje interno, pero como buena librería te aísla muy bien de todo el barro. Me ha gustado que nos lo pone muy fácil. Aquó os dejo el programa completo:

xxx

Contenido solo disponible para suscriptores. ¡Accede al contenido!

   

Este ha sido simplemente un ejemplo de uso del teclado, pero puedes encontrar mas ejemplos en la documentación de M5Stack sobre el módulo USB.

Hay ejemplos de cómo manejar un ratón USB (O inalámbrico, claro) entre otro montón de elementos a conectar, que incluyen bluetooth, PS5, XBOX y MIDI, entre otros que no tengo ni idea de para que sirven. En fin, que son los 20 € mejor gastados de mi vida por las posibilidades que ofrece (Que probablemente nunca llegue a usar, pero que quieres que te diga. Disfruto mucho con los cacharritos electrónicos)

Pantallazo consola arduino

Por si alguien tiene curiosidad por ver las cosas que se pueden hacer con él, aquí os dejo el link de los ejemplos
https://github.com/m5stack/M5Stack/tree/master/examples

Y aquí va un pequeño video de muestra del asunto: