Arduino y USB, ¿cómo funciona?

2

Después de comprar una placa Arduino (UNO) decidí no usar Arduino IDE ya que carecía de algunas características y todas las bibliotecas están escritas en C ++. Estoy codificando con C. Una cosa que realmente echo de menos es una interfaz serial que le permitió a mi Arduino hablar con la PC a la que está conectado.

Hasta ahora estoy familiarizado con el protocolo SPI, y creo que uso los chips convertidores USB-SPI, pero como ya tengo el 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 quien habla con un chip en la placa Arduino, y ese chip es responsable de la comunicación con la PC.

¿Pero puede alguien explicarme lo que realmente sucede en esa pizarra? Y apúntame en la dirección correcta, por favor.

    
pregunta Anton Stafeyev

2 respuestas

11

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

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

Esencialmente, el procesador principal de Arduino debe tener su hardware UART configurado para emitir mensajes de depuración o datos del programa a una velocidad de transmisión elegida, utilizando una señalización serial asíncrona de nivel lógico. Si el puerto USB está conectado a una computadora que ejecuta los controladores ACM del CDC apropiados, se le ordenará al chip puente USB que envíe por lotes los datos recibidos y los envíe al ordenador host, donde se puede reclamar desde las API seriales como si vinieran de un puerto serial tradicional.

Para comunicarse en la otra dirección, un programa en la PC envía datos a través de API en serie, esto se agrupa en paquetes USB y se envía al chip puente, que los convierte en datos seriales asíncronos y los envía a la MCU principal. Un programa que se ejecute en el Arduino en sí debería escribirse para recopilar estos datos del UART, generalmente utilizando interrupciones (u opcionalmente, sondeos frecuentes) y luego interpretarlos.

El cargador de arranque usado en el Arduino realiza ambas operaciones en su propio nombre 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. Cabe destacar que puede usar el gestor de arranque Arduino sin usar el IDE o escribir programas de estilo Arduino.

Si miras a tu alrededor en línea, es probable que encuentres muchos ejemplos de código para utilizar ATmega UART en un programa en C, en comparación con uno en C ++ o Arduino.

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

    
respondido por el Chris Stratton
2

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

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

Si va a desarrollarse de la manera que describe, recomendaría comprar y usar un ICSP para la programación, 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.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas