Interfaz de computadora de alta velocidad con un Arduino

Estoy planeando un proyecto con un Arduino que implica el manejo de muchas solicitudes de una computadora host, y el estándar de 115200 baudios máximos en serie no es suficiente. Me gustaría poder obtener dúplex completo de 1 Mbps si es posible, pero dúplex completo de 400 Kbps o más sería aceptable. Estoy usando un Arduino Due, por lo que debería poder manejar velocidades de comunicación significativamente más altas.

¿Hay alguna manera de aumentar significativamente la velocidad en baudios sobre la serie, o hay una segunda opción que pueda elegir en términos de interfaz con una computadora a velocidades más altas?

Los dispositivos FTDI FT232 pueden alcanzar hasta 3 Mbps sin problemas, por lo que si tiene un convertidor serie USB basado en FTDI, esa sería una opción fácil. Realmente desearía que la gente de Arduino se hubiera quedado con ellos, en lugar del ATmega16U2.
Tal vez el UART admita velocidades de bits de 1 Mbps, pero también necesita el microcontrolador para alimentarlo con datos. Se puede hacer, pero alcanzarás un máximo con bastante facilidad.
Si está bloqueando un AVR con "muchas solicitudes" a 400 kbps, me sorprendería si tiene mucho tiempo libre para hacer algo útil.

Respuestas (3)

Definitivamente es posible alcanzar el rango de Mbps con un Arduino, especialmente con tu Due. El monitor en serie solo admite baudios hasta 115200, pero puede usar una ventana de terminal separada que le permite configurar su baudio a lo que desee.

Para obtener un poco más de información, consulte este hilo en el foro de Arduino.

En términos de configuración, en Arduino es tan fácil como Serial.begin(1000000);o hasta ese punto. Se trata de la configuración del dispositivo con el que desea comunicarse y lo que puede manejar.

¿El controlador serial sobre USB estándar admite tales velocidades? Hablaré con él a través de un script, no del monitor en serie en el IDE.
Creo que sí. Si está utilizando un script, debe estar en buena forma. El hardware UART en Arduino Due es el mismo que el UNO; utiliza el ATmega16U para interactuar con la serie, que es capaz de al menos 1 Mbps. El controlador serie a través de USB también debería admitir esa velocidad.
Para probar, siempre puede configurar un boceto de prueba rápido. Establezca el baudio en algo más alto que el predeterminado y use un terminal configurado en el mismo baudio. Si los datos llegan, sabrá que el Arduino es bueno hasta ese baudio.
Técnicamente, en realidad no importa lo que solicite la PC anfitriona en términos de velocidad en baudios, sino solo que el 16U y el procesador Arduino principal estén de acuerdo: el lado USB real funciona mucho más rápido que la velocidad en baudios en serie de todos modos, y toda la PC lo que hace es decirle al 16U a qué velocidad ejecutar su interfaz serial. Además, si busca imprecisiones en los divisores de baudios, recuerde que lo que realmente importa es que coincidan entre los dos chips de su placa, no que coincidan con algún objetivo tradicional. Aprovechar al máximo eso podría requerir un firmware personalizado para el 16U.

Buscaría escribir un firmware personalizado para el Atmega16u2 que está haciendo la interfaz USB. Ese chip puede hablar USB de velocidad completa (velocidad de señal de hasta 12 Mbit) y el puerto de salida SPI de ese chip está convenientemente disponible en el encabezado ICSP. Conecte eso a la entrada SPI del Arduino (también disponible en su encabezado ICSP) y puede ejecutar SPI a, creo, 4 Mbit / s (4 relojes de CPU por bit).

Los Atmegas en el mega (16u2 y 128) pueden ejecutar su puerto serial a hasta 2 Mbit/s. Si escribe firmware personalizado para el 16u2, también puede usar el USART serial asíncrono que ya está allí.

En ambos casos, es probable que pierda la capacidad de programación del puerto serie, por lo que tendrá que usar un programador separado basado en USB.

El proyecto LUFA tiene muchos programas de muestra y bibliotecas útiles para hablar USB en un chip Atmega. "libusb" es una biblioteca conveniente para hablar directamente con dispositivos USB, en lugar de tener que depender de la emulación en serie.

Hay algunos resultados que pueden ser de utilidad aquí .