domingo, 30 de abril de 2023

Arduino Nano chino (con controlador CH340) funcionando en Windows y Linux

Introducción

Existen en el mercado distintos tipos de placas Arduino para la realización de infinidad de proyectos. Puedes consultar nuestra entrada de "iniciación a Arduino" para obtener más información acerca de los distintos modelos y características. Hasta ahora, nosotros hemos trabajado con Arduino Uno sin excesivos problemas. Sin embargo, últimamente nos topamos con que determinados tipos de placa no funcionaban correctamente en Windows y sobre todo en Linux, principalmente los Arduino NANO. Nos pusimos a investigar hasta que encontramos el problema y posteriormente la solución.

Arduino nano, pequeño y funcional

Arduino uno, para proyectos más voluminosos

Raíz del problema: controlador CH340 versus RS-232

Los controladores RS-232 y CH340 son dos tipos diferentes de chips utilizados para comunicar distintos aparatos mediante el puerto serie, y por tanto incluido en todas las placas Arduino para que estas puedan "hablar" con el PC. Aquí están las diferencias entre ellos:

El RS-232 es un estándar de comunicación serial ampliamente utilizado en la industria y su creación se remonta al año 1962 (aunque se ha ido revisando y actualizando constantemente hasta el día de hoy). Por otro lado, el CH340, mucho más moderno y barato, es un controlador USB a UART que permite la comunicación entre la placa Arduino y un puerto USB en la computadora. No sigue el estándar RS-232, sino que utiliza una comunicación UART (Universal Asynchronous Receiver-Transmitter).

Existen muchas diferencias entre RS-232 y CH340. Por ejemplo, el RS-232 utiliza voltajes positivos y negativos relativamente altos (hasta ±15V) para transmitir datos, lo que permite una mejor inmunidad al ruido y una mayor distancia de transmisión. En cambio, el CH340 utiliza niveles de voltaje TTL (Transistor-Transistor Logic) de 0V y 5V para representar los bits de datos.

El CH340 es un chip conversor USB a UART, lo que significa que se encarga de convertir la comunicación USB de la computadora en una señal UART que la placa Arduino pueda entender. Por otro lado, el RS-232 no requiere una conversión USB a UART, ya que utiliza un estándar de comunicación diferente.

Cuando comenzaron a crearse las primeras placas Arduino (italianas), se incluyó en su diseño al antiguo controlador estándar RS-232. Esto tenía la ventaja de proporcionar una comunicación más básica y directa a costa de un mayor consumo y un mayor precio. Posteriormente se diseñaron nuevas placas Arduino más económicas (procedentes principalmente de China) que hacían uso del controlador CH340.  La diferencia de precios entre una placa que utilizada el estándar RS-232 y otra que usa el CH340 puede ser de entre 10 y 15 euros en el mercado (las placas Arduino UNO originales tienen un precio de unos 15 euros frente a los 4 euros de las placas chinas con controlador CH340). Aquellas siguen usándose por razones de compatibilidad para determinados equipos antiguos que usan puertos serie estándar. La elección entre comprar una y otra por tanto depende de las necesidades específicas de comunicación, la compatibilidad de la placa Arduino que estés utilizando y del del precio.

La placa superior incluye el controlador RS-232.
La placa inferior incluye el controlador CH340.

Detalle del controlador CH340

Nosotros disponemos en el taller de los dos tipos de Arduino UNO. Sin embargo, todos nuestros Arduino NANO incluyen el controlador CH340.

Problema a la hora de utilizar los Arduino CH340

Hemos podido comprobar que cuando conectamos una placa Arduino con controlador CH340 al puerto USB del PC, este no siempre la reconoce. Y cuanto esto ocurre, el IDE de programación de Arduino no se comunica correctamente con la placa, con lo que genera errores como el siguiente:

Windows no dispone de forma nativa de los controladores necesarios para usar CH340. No entendemos la razón, pues hoy en día se trata de un controlador estándar usado en miles de productos. Por tanto, cuando conectamos una placa Arduino "china", esta no es reconocida y al intentar subir el programa a la misma se generan los errores antes mencionados.
El caso de Linux es distinto. Linux viene de serie con todos los drivers necesarios para usar CH340. Sin embargo, hemos podido comprobar que algunas placas Arduino UNO chinas son reconocidas perfectamente, pero la mayoría (si no todas) las placas Arduino NANO no son reconocidas. No entendíamos por qué pasaba esto. En nuestras pruebas hemos utilizado Ubuntu 20.04 y Ubuntu 22.04, y en ambos sistemas ocurría el mismo problema.

Soluciones encontradas

En Windows la solución es simple. Solamente debemos instalar el driver que maneja el controlador CH340. Podemos encontrarlo fácilmente en Internet, o descargarlo de este enlace.

Driver para instalación en Windows. Una vez descargado debemos ejecutarlo.

Durante la ejecución aparecerá esta pantalla.
Es posible que Windows, durante el proceso, nos solicite permiso para la instalación,
en cuyo caso debemos aceptar.

A continuación se mostrará esta pantalla. Entonces deberemos pulsar "Install"

Cuando finalice la instalación, se nos mostrará el siguiente mensaje.
Ya podremos usar Arduino sin problemas

Ahora, cuando conectemos la placa Arduino aparecerá el siguiente mensaje en Windows

En Linux (Ubuntu 20.04 y superiores) se incluye de serie el controlador CH34X. El problema en este sistema operativo es algo distinto. Todos los dispositivos que se conectan a un PC por el puerto USB incluyen de fábrica un par de códigos de identificación tanto del fabricante como del tipo de aparato, cada uno de ellos de 4 cifras (4+4 cifras en total). Pues bien, todos los Arduinos NANO con los que nos hemos encontrado hasta el momento tienen como código identificador el siguiente: 1a86-7523. Y ya es casualidad que exista otro aparato en el mercado con el mismo código (una especie de teclado Braille) que usa para comunicarse con el PC el controlador CH340. Linux viene preparado para reconocer este aparato, y cuando intentamos conectar un Arduino NANO con este código, se produce un conflicto de reconocimiento y todo falla.
Aparato Braille con controlador CH340 que entra en conflicto con Arduino NANO

Pues bien, simplemente hay que eliminar de cierta base de datos la información relativa al "aparato Braille" editanto para ello el fichero:

 /usr/lib/udev/rules.d/85-brltty.rules

y eliminando la siguiente línea de su interior:

ENV{PRODUCT}=="1a86/7523/*", ENV{BRLTTY_BRAILLE_DRIVER}="bm", GOTO="brltty_usb_run"

Podemos bien borrar la línea y guardar el fichero o bien ponerla en comentario, precediéndola del caracter "#". Una vez guardado el fichero, debemos reiniciar el sistema y listo.

Recuerda que para editar el fichero, debes tener permisos de administrador. Puedes abrir un terminal y teclear el siguiente comando:

sudo nano /usr/lib/udev/rules.d/85-brltty.rules

El comando sudo le dice al sistema que lo que vas a ejecutar (el comando nano) debe hacerse como administrador. Por eso, tras la ejecución se pedirá la clave de administración. Por otra parte, el comando nano invoca al editor NANO. Puedes usar cualquier otro editor de texto en lugar de NANO, como el gedit o el mcedit (siempre que los tengas instalados).

Es posible que en otras distribuciones de Linux exista una línea similar en alguno de los ficheros que se encuentran dentro del directorio /usr/lib/udev/rules.d/. Pero por el momento, esta solución nos ha servido para que nuestros Arduino NANO chinos funcionen perfectamente.

Configurar IDE para usar el Arduino correcto

Finalmente debemos recordar que debemos indicar en el IDE Arduino que tipo de placa estamos usando. En nuestro caso, para usar los pequeños Arduino NANO chinos, debemos seleccionar la información que se muestra en la siguiente imagen en donde ya aparece disponible el puerto USB correcto.
Parámetros de configuración de Arduino NANO en Linux


Autor:
Pablo Díaz Márquez


No hay comentarios: