Digital IO por las malas (SioFus)

Si algo caracteriza los proyectos de marketing tecnológico, es la integración de muchas tecnologías, todas juntas, cumpliendo un propósito; concreto o vago, eso ya depende del proyecto en cuestión. En un equipo pequeño, nos obliga a tener perfiles suficientemente heterogéneos… echando mano del refranero: «el que mucho abarca, buena sombra le cobija». Nos hacemos una idea.

Así pues, un buen día hace varias meses, se presentó un proyecto: tenía mucho de interfaz de usuario, una lógica que corría sobre Node.js, una base de datos, tenía incluso un pequeño módulo escrito en C++ con OpenCV… pero tenía una necesidad muy simple y concreta: en un momento dado de la interacción, debíamos encender un relé… simplemente para iluminar una tira de LEDS.

La solución fácil hubiera sido comprar una tarjeta de con GPIO, utilizar una Raspberry con sus puertos de IO tan fáciles de utilizar, conectarnos a una Arduino que hiciera el trabajo «sucio»… Pero todas esas soluciones se antojaban un tanto aparatosas para enceder una simple tira de LEDs desde un PC con Debian instalado.

 

La solución fácil existe. La eficiente hay que crearla

Levantamos la vista y nos encontramos con un adaptador USB 2 Serial. De alguna manera, un proceso debería decirle al mundo real que pasaran o dejaran de pasar 5V (luego me daría cuenta que a bastante poco amperaje, pero esa sería otra historia). Así nació SioFus (Simple Input Output from Usb2Serial… poesía pura, lo sabemos).

Montando SioFus en laboratorio

Montando SioFus en laboratorio

El proceso fue algo tedioso y basado, cómo no, en prueba y error:

  • Para empezar, había que hacerlo en C
  • Además, había que investigar bien la interfaz serie RS232
  • Por último, el secreto parecía estar en la llamada ioctl

El resultado es un ejecutable que realiza 2 tareas bien sencillas:

  • Utilizar los pines DCD, DSR, CTS y RNG del puerto serie, para detectar si se cierra o no un circuito, utilizando el PIN1 de USB (+5V)
  • Enviar +/-5V a los pines DTR y RTS en base a ciertos eventos no bloqueantes (getChar() en la aplicación actual)

El código fuente está disponible en Github y tenemos un par de proyectos que prueban que la cosa funciona.

En la lista de TO-DO de cosas (que es altamente probable que nunca se lleven a cabo) tenemos la tarea de crear una extensión para Node.js (o io.js) que hable directamente, sin necesidad de utilizar un «sucio» wrapper comunicado mediante stdin/stout.

¿Conseguiremos sacar un poco de tiempo? Seguiremos informando.

 

 



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Javier Infante Porro

Linux, HTTP, JS, TS, PHP... Programo (entre otras cosas) en Irontec desde hace más de 12 ó 13 años... @jabiinfante

Queremos tu opinión :)