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.
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.
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.
Cruce
chris stratton
Jasén