Arduino y USB, ¿cómo funciona?

Después de comprar una placa Arduino (UNO), decidí no usar el IDE de Arduino porque carecía de algunas funciones y todas las bibliotecas están escritas en C++. Estoy codificando con C. Una cosa que realmente echo de menos es una interfaz en serie que permitía que mi Arduino hablara con la PC a la que está conectado.

Hasta ahora estoy familiarizado con el protocolo SPI, y pensé en usar chips convertidores USB-SPI, pero como ya tengo USB implementado en la placa, decidí buscar información sobre cómo se hace y en qué consiste el USB.

Hasta ahora descubrí que es UART el que se comunica con un chip en la placa Arduino, y ese chip es responsable de la comunicación con la PC.

Pero, ¿alguien puede explicarme qué sucede realmente en ese tablero? Y apúntame en la dirección correcta, por favor.

Respuestas (2)

En las placas Arduino "ordinarias" como la Uno, el UART serial del microcontrolador AVR se utiliza para comunicarse con una PC.

Debido a que las PC modernas ya no suelen tener puertos seriales, el conector serial de 9 pines y los traductores de nivel que se encuentran en las primeras placas Arduino han sido reemplazados hace mucho tiempo por un chip de puente USB<>Serial incorporado. Originalmente, este era un FT232R, pero desde el Uno ha sido un MCU Atmel diferente, como el ATmega8u2 o 16u2, que ejecuta un firmware que proporciona una funcionalidad similar.

Esencialmente, el procesador principal de Arduino necesita tener su UART de hardware configurado para generar mensajes de depuración o programar datos a una velocidad en baudios elegida, usando señalización serial asíncrona de nivel lógico. Si el puerto USB está conectado a una computadora que ejecuta los controladores CDC ACM apropiados, se le ordenará al chip de puente USB que lote los datos recibidos y los reenvíe a la computadora host, donde se puede reclamar de las API seriales como si viniera de un puerto serie tradicional.

Para comunicarse en la otra dirección, un programa en la PC envía datos a través de API seriales, estos se agrupan en paquetes USB y se envían al chip puente, que los convierte en datos seriales asíncronos y los envía a la MCU principal. Se necesitaría escribir un programa que se ejecute en el propio Arduino para recopilar estos datos del UART, generalmente usando interrupciones (u opcionalmente sondeos frecuentes) y luego interpretarlos.

El cargador de arranque utilizado en Arduino realiza ambas operaciones por sí mismo mientras se ejecuta, brevemente después de cada reinicio, más tiempo si ve tráfico relacionado con un cargador de arranque. Pero esa capacidad es irrelevante para el programa principal (también conocido como "boceto") que debe volver a implementar la lógica para interactuar con el propio UART. Vale la pena señalar que puede usar el cargador de arranque Arduino sin usar el IDE o escribir programas de estilo Arduino.

Si busca en línea, probablemente encontrará muchos ejemplos de código para usar ATmega UART en un programa C, en comparación con C ++ o Arduino.

Algunas otras placas Arduino funcionan de manera diferente; por ejemplo, el Leonardo usa un chip ATmega32u4 como su procesador principal, que puede hablar directamente por USB. En ese caso, no se necesita un puente adicional. Pero en lugar de una configuración UART simple, el programa en la MCU principal ahora debe incluir una lógica mucho más compleja para manejar el hardware USB en sí, incluidas las interrupciones que deben ejecutarse con bastante frecuencia. Esto es mucho más difícil de implementar en un proyecto desde cero, aunque significa una menor cantidad de piezas y un poco más de flexibilidad, ya que el puerto USB se puede usar para fines que van más allá de canalizar una transmisión en serie virtual.

No FT2232, sino FT232R.
De hecho, eso fue un error mental de mi parte. Creo que se usó el ft232rl, mientras que el ft2232 es el chip elegante adecuado para cosas como jtag y serial.
algunos clones tienen CH430 para el chip de interfaz.

Como se señaló en otra respuesta , hay una conversión de puerto USB a puerto serie en la placa UNO.

También hay un programa de cargador de arranque instalado en el microcontrolador. La capacidad de programar el microcontrolador UNO a través del puerto serie depende al 100% de un gestor de arranque. Si durante el desarrollo de la programación, algo le sucede a ese cargador de arranque, debe volver a cargar el cargador de arranque en el chip. Esto se hace con un programador en serie en circuito (ICSP), que se conecta a uno de los conectores de cabecera de 0,1" en el UNO.

Si va a desarrollarse de la manera que describe, recomendaría comprar y usar un ICSP para programar, y solo programar las comunicaciones del puerto serie directamente. La conversión de serie a USB será manejada de manera transparente por el hardware integrado.

Entonces, su sugerencia es: para no dañar el programa del cargador de arranque en Arduino, ¿es mejor que use otro dispositivo (también conocido como programador) para hacer mis cosas en serie?
Casi todo lo contrario. Si el cargador de arranque está correctamente instalado, evitará que se dañe durante el flasheo del programa principal. Pero usar ISP para recargar algo está 100% garantizado para borrar el gestor de arranque, ya que ISP solo puede borrar el chip completo. Entonces, una vez que comience a usar ISP, tendrá que usarlo nuevamente para restaurar el cargador de arranque si alguna vez desea usarlo. Tenga en cuenta que puede usar otro Arduino que ejecute el boceto ISP como un adaptador ISP en caso de que necesite uno temporalmente. El cargador de arranque es tan apropiado para C desnudo como para bocetos de Arduino.
Se necesita un programador para acceder al área de carga de arranque de la memoria flash. Su boceto, en C o C++, no tendrá acceso a las llamadas para sobrescribir el área de carga de arranque. Necesita un cargador de arranque especial que tenga las llamadas necesarias configuradas como una función en el área de carga de arranque, que el boceto puede llamar para permitir que los datos que ingresan desde el puerto serie se escriban en el área de carga de arranque.
A pesar de lo malo que es el IDE de Arduino, si eres nuevo en el mundo de los microcontroladores y pasas una o dos horas probando algunos de sus ejemplos en serie del menú desplegable, podría darte una perspectiva inicial de lo que puede hacer el hardware antes de cambiar a C sin sistema operativo. programas y Serial.begin(9600); serial.println("hola mundo"); se convierte en unas pocas docenas de líneas de código orientado al hardware.
@ChrisStratton ya implementé UART y SPI, y hasta ahora funciona. pero una implementación muy simple. Me gustaría deshacerme del gestor de arranque, porque no es mi código el que se ejecuta en mi dispositivo. Otra pregunta que está surgiendo en este momento es el código dentro de Atmega8 que maneja la conexión USB. por qué se muestra como puerto com en mi pc. ¿Es posible ICPS ese chip?