Opciones de interfaz de computadora a Arduino

Necesito enviar 800 bytes de datos desde una computadora a una placa arduino cada 20 ms (aproximadamente). Empecé con la biblioteca en serie que funciona bien, pero es demasiado lenta incluso a su velocidad más alta (115200 baudios) para interactuar con una computadora.

¿Qué otras interfaces están disponibles que pueden enviar a una velocidad más rápida? ¿Puedo usar usb o spi? Parece que no puedo encontrar bibliotecas para estos. Necesito algo con una velocidad de 320 kbaudios.

editar

¿Hay algún escudo que pueda hacer esto? ¿Bluetooth o wifi?

¿Qué estás haciendo con estos datos? El AVR no está diseñado para manejar una gran cantidad de datos, si pudieras optimizar tus comunicaciones eso sería preferible independientemente de cómo hables con la cosa. Es posible que ni siquiera sea posible almacenar en búfer 800 bytes.
800 bytes es lo mínimo que puedo enviar, creo. Tengo 400 LED conectados a un arduino y cada uno tiene su propio color de 15 bits. Todavía no estoy comprimiendo los 800 bytes, supongo que podría hacerlo si tuviera una forma eficiente de hacerlo. ¿Hay una biblioteca de arduino para eso?
Entonces, ¿una matriz RGB de 20x20 a 50 Hz?
Precisamente, pero probablemente podría bajar a alrededor de 30 ms (~ 33 Hz) si 50 Hz es demasiado ambicioso.
Si no está haciendo nada más con AVR durante la recepción de datos, entonces AVR puede manejarlo sin problemas, si se alimenta con datos a través de una conexión en serie de 921600 o 460800 bps.

Respuestas (5)

¿Qué hay de enviar solo bytes modificados cada 20 ms? Necesitaría 9 bits adicionales para el direccionamiento, pero si metiera ese bit en el bit vacío en sus datos de color de 15 bits, podría hacerlo con solo un byte adicional por LED. Dependiendo de qué tan rápido su pantalla cambie de color, eso podría funcionar bien. Podría hacer un umbral, de modo que si el color cambia menos de X, espere a la siguiente ronda para enviar esos datos.

¿O tal vez intentar entrelazar los datos? ¿Enviar filas pares e impares en secuencia alterna?

¿O usar 4 Arduinos en paralelo?

¿O controlar los LED a través de un registro de desplazamiento y luego enviar 15 bits a 15 pines Arduino a través de un puerto paralelo (suponiendo que pueda encontrar una PC con un puerto paralelo)?

El factor limitante es probablemente el puerto serie de su computadora, los controladores y/o la biblioteca Arduino. Si no recuerdo mal, el AVR UART puede subir a su frecuencia de reloj dividida por 8 o 16, y un chip FTDI puede tener velocidades de transmisión arbitrarias igualmente altas (3 Mbaudios para este FT232RL en mi escritorio).

La mayoría de los escudos se comunicarán a través del AVR UART, por lo que si la biblioteca Arduino lo limita, no lo ayudarán.

Con el hardware adecuado, Windows puede manejar la comunicación en serie hasta 921600 bps (115200 x2, x4, x8). Hay tarjetas de comunicación PCI que admiten esta velocidad de transmisión, pero los convertidores USB<>RS232 son más populares. Si no recuerdo mal, todos los convertidores basados ​​en FTDI pueden manejarlo. El mayor problema es el lado AVR, donde no podrá hacer nada más mientras se reciben los datos. RX debe ser la única interrupción permitida en el lado AVR. Probablemente también tendrá que sincronizar su AVR lo más alto que pueda (16 o 20MHz dependiendo del modelo, 14.746 Mhz si quiere tener 921600 exactamente). Luego, enviará desde la PC todo el paquete de comunicación, AVR hace el trabajo después de recibirlo y envía un byte de confirmación de que está listo para el próximo paquete. Cuando la PC recibe reconocimiento, puede enviar otro paquete. Y así sucesivamente ... Los temporizadores simples en el lado de la PC son (debido a la multitarea en Windows) muy malos para manejar una resolución de 10 ms y no son precisos en absoluto (excepto los temporizadores multimedia cuando se manejan correctamente), por lo que usar el byte de reconocimiento simple ya descrito es una opción mucho mejor.

No sé qué escudos están disponibles, solo soy un tipo de microcontrolador en general.

A medida que su tasa de baudios aumenta, un protocolo síncrono tiene mucho sentido. SPI es muy simple y permitirá velocidades de transmisión superiores a 1 Mbps muy fácilmente.

Sin embargo, si solo necesita llegar a 300 kbaudios o incluso a 1 MBaud y está de acuerdo con UART, la línea de chips FTDI es el verdadero negocio .

Uno de los chips que puede hacer esto específicamente es el FT2232H . Estos no son compatibles con SPI, pero pueden manejar UART muy rápido. De sus especificaciones:

Velocidad de transferencia de datos UART RS232/RS422/RS485 de hasta 12 Mbaudios. (Velocidad de datos RS232 limitada por un cambiador de nivel externo).

Hmmm interesante, tendré que mirar ese chip. Desafortunadamente, no puedo usar SPI porque ya lo estoy usando para controlar los LED conectados al arduino (a través de los pines 11 y 13).
Lo siento, me equivoqué de comunicación. El chip FT2232H es UART. Corregiré mi publicación.
¿Está utilizando controladores programables para controlar realmente los LED o está utilizando registros de desplazamiento? ¿Cuánto tiempo de procesador está usando simplemente manipulando los datos para enviar el SPI?
@NickT, estoy muy confundido por tu comentario. Puede usar UART para obtener los datos y configurar los LED, estoy seguro de que es una carga de trabajo completa.
Tenía curiosidad de cómo manejaba los 1200 LED; no hay forma de que pueda verlo hecho con un AVR sin controladores auxiliares. Dijo que estaba usando el SPI para comunicarse, por lo que podría ser un controlador, pero posiblemente un registro de desplazamiento básico.
@NickT, creo que puede malinterpretarlo, dijo que no puede usar SPI y que está discutiendo sobre una respuesta, no sobre la pregunta. Tu comentario es para la pregunta, no para mi respuesta.
Era relevante para la información que apareció anteriormente en el hilo de comentarios sobre esta respuesta a la pregunta.
@NickT, ¿dónde dijo que está usando SPI?

Los Arduinos son geniales, pero tienen sus limitaciones. A menos que esté programando en C y solo esté utilizando el cargador de arranque arduino, tenderán a funcionar mucho más lento. No soy un gran gurú de las tasas de datos, etc., pero esperaría que a 50 Hz estés chocando contra la pared por las capacidades de arduinos. Sugeriría mirar la programación en C (hackaday.com acaba de hacer un gran conjunto de tutoriales sobre esto) o probar con otro microcontrolador, mi favorito para proyectos como este es el propulsor de paralaje, esencialmente 8 microcontroladores en uno.