Velocidad SerialUSB arduino DUE

Buenas noches a todos, gracias por leer, alguien me podria hacer el favor de indicarme en que dirección usualmente se encuentra el archivo que tiene el codigo fuente que se ejecuta cuando se usa Seria.begin(xxxx) para el arduino DUE, quiero mirar como configuran el prescaler para aumentar la velocidad al maximo del DUE que es 5250000 Baudios.

Muchas Gracias.

Mas fácil... lee esto DUE Serial Speedy
Hablan de usar 250000 sin problemas pero subes a 251000 y falla.
Tmb debes subier el buffer de 64 a 256

he estado leyendo el post que me comentaste Surbyte, mi ingles no es muy bueno pero algo he entendido, por lo que veo recomiendan usar SerialUSB sin embargo a unos les funciona a otros no, queria probarlo cargando este codigo en mi arduino:

char bufferenvio[1000];
char prueba[]="0123456789";
unsigned long previousTime,actualTime;

void setup() {
  SerialUSB.begin(9600);
  for(int n=0;n<100;n++)
    strcat(bufferenvio,prueba);
}

void loop() {
  for(int n=0;n<30;n++)
  {
    previousTime=micros();
    SerialUSB.println(bufferenvio);
    actualTime=micros();
    SerialUSB.print("Tiempo:");
    SerialUSB.println(actualTime-previousTime);
  }
  while(1);
}

simplemente envio 1000 caracteres y ello lo hago 30 veces solo para lograr repetitibilidad en mis resultados, sin embargo no he entendido como funciona SerialUSB

  • ¿Solo funciona conectando el cable USB en el puerto “Native”? (lo he conectado alli y tampo me llega nada a la consola Serial)
  • ¿Que pines utiliza? ¿Tambien el 0 y el 1 como Serial?
  • ¿Se puede usar la consola serial de arduino para esperar los datos?

por ahora quiero lograr comunicarme con el SerialUSB ya luego hare las pruebas de velocidad ya que parece ser que el hilo que me comentas se quedo en duda de la velocidad real que se podia alcanzar.

En el datasheet mencionan que el maximo BaudRate es el que comente al inicio de este hilo "5250000 " y creia que solo era cuestion de cambiar el prescaler del reloj que tal vez los que programaron el core en esa parte de serial no se fijaron muy bien pero por lo que leo parece no ser tan sencillo, necesito transmitir 3kBytes en una ventana de 4mS por ello necesito altas velocidades en el puerto serie.

Gracias.

Y porque no pensaste en transmitir los datos via Ethernet?

porque creia que no era necesario dada la velocidad de Reloj superior del arduino Due y podia evitarme dicho hardware que en costo es igual al arduino Due, prefiero eliminar la funcionalidad de comunicacion que agregar un modulo ethernet para el proyecto actual, por ello hacia las preguntas con respecto a SerialUSB ya que no logro que imprima un Hola Mundo tan siquiera en consola entonces no se que anda mal con ello, si es mi arduino o que finalmente no funciona como 'Serial'.

A ver.. porque no explicas que necesitas hacer? Asi podemos sugerirte mejor alternativas.
250kbps no alcanzan?

Como te digo Surbyte necesito enviar una matriz la cual internamente tiene un historico de los valores leidos de 30 sensores, este historico es de almenos 100, por ende tenemos 30bytes100=3000bytes y pasando a bits 30008=24000bits, debido a que necesito que el due ejecute el void loop(); como minimo una vez cada 8.3mS que es la velocidad de desplazamiento de un actuador entonces tengo una ventana corta de tiempo para enviar estos datos, asumiendo 4mS para el envio y el resto para el progama en si tendremos una velocidad minima requerida de 6Mbps, en vez de enviar los datos en caracteres si envio la medida de cada sensor que es digital el dato, se evita la multiplicacion por 8 teniendo una velocidad entonces de 750kbps, con esto sobrepaso los 250kbps de cota maxima.

Ahora estamos en tema!!!
A buscar una solución porque esto no se presenta todos los días.
SIgo creyendo que es mas fácil usar algo via ethernet y no se si damos con la velocidad que requieres, porque ethernet puede hablar de 10Mpbs pero la conexión es SPI y hay que ver a cuanto transfiere.

What is the maximum SPI speed your device can use? This is controlled by the first parameter in SPISettings. If you are using a chip rated at 15 MHz, use 15000000.

Por lo tanto, Ethernet no es un impedimento sino un plan B

A investigar otras posibles soluciones.

Esta página da unos benchmarks, a ver si puedes comprobarlos?

Este hilo da algunas pistas. Cito la parte relevante

You can actually put
Serial.begin(1000000); // 1Bps
it should even work with 2000000. :sunglasses:

I did not test 2Mb with the Hardware serial library but with my own library as I need the serial in half-duplex mode and need some special stuff.

Anyway, you can squeeze a whooping 2Mbps out of an Arduino (tested only on Mega, but should be the same on the others as long as the clock is 16MHz). To modify the UARTnA register bit for Double Speed mode:

bitSet(UCSR0A, U2X0); // NB if you put now speed 10000 it is actually 20000, the UART divider is now 8 and not anymore 16

I am using this on the Arduino Megas TX3, so it is:
bitSet(UCSR3A, U2X3);
I needed that because I bricked ( :o ) a AX-12+ servo setting it to 2Mbit/sec

En teoría (hay que probarlo) puedes alcanzar 2Mbps en un MEGA y el DUE mas aún

ya estuve leyendo lo referente a SPI en el datasheet del arduino DUE e intuyo que la velocidad maxima es la maxima del reloj del DUE remito este fragmento para que confirmemos.

Clock Generation

The SPI Baud rate clock is generated by dividing the Master Clock (MCK), by a value between 1
and 255.

This allows a maximum operating baud rate at up to Master Clock and a minimum operating
baud rate of MCK divided by 255.

Digo que intuyo porque no se si MCK hace referencia al reloj principal de arduino.

surbyte:
Esta página da unos benchmarks, a ver si puedes comprobarlos?

lo lei y hablan de velocidades de recepción en diferentes placas de arduino segun lo que mi pobre ingles entiende jejeje no entiendo muy bien que es lo que intentan mostrar supongo que la velocidad de recepcion de diferentes placas que soportan USB subi el codigo a mi DUE y abri el ejecutable que proponen pero se cierra inmediatamente y desde codeblocks no se ve al ejecutar que haya mayor interacion con el arduino, sin embargo, como digo parece ser para verificar la velocidad de recepcion del arduino y no la de transmision y segun el codigo que se sube al arduino siguen usando el puerto serie entonces tendriamos el mismo limitante.

surbyte:
Este hilo da algunas pistas. Cito la parte relevante
En teoría (hay que probarlo) puedes alcanzar 2Mbps en un MEGA y el DUE mas aún

si ese hilo lo habia leido y lastima que es para el MEGA porque en el DUE me imagino todos los registros cambian por eso arranque el hilo preguntando por la direccion de la carpeta del Core donde se defina el serial del Due para ir y modificar el registro que define el prescaler y lograr asi la velocidad que propone el datasheet.

Bueno pero si MEGA puede DUE con mas razón lo hace y lo superará.
Acá algunas algo interesante para probar.
DUE tomando datos a una tasa de 1MSPS, tal vez sea lo que buscas?
Acá alcanzan valores impresionantes link

Parece ser que recomiendan lo del primer hilo que me comentaste usar SerialUSB sin embargo no se porque no logro recibir nada en Arduindo por eso retomo las preguntas de unos post arriba

firius2010:

  • ¿Solo funciona conectando el cable USB en el puerto "Native"? (lo he conectado alli y tampo me llega nada a la consola Serial)
  • ¿Que pines utiliza? ¿Tambien el 0 y el 1 como Serial?
  • ¿Se puede usar la consola serial de arduino para esperar los datos?

por ahora quiero lograr comunicarme con el SerialUSB ya luego hare las pruebas de velocidad ya que parece ser que el hilo que me comentas se quedo en duda de la velocidad real que se podia alcanzar.

He estado volteando aca con el uso de SerialUSB y en ocasiones me lo reconoce el terminal y en otras no pero ya le voy agarrando el truco, les comento volvi a hacer la prueba que les digo, envio 1000 caracteres y con micros mido el tiempo que tarda en enviar dicha trama el siguiente es el codigo:

char bufferenvio[1000];
char prueba[]="0123456789";
unsigned long previousTime=0,actualTime=0;

void setup() {
  delay(5000);
  SerialUSB.begin(115200);
  for(int n=0;n<100;n++)
    strcat(bufferenvio,prueba);
  bufferenvio[1000]='\0';
}

void loop() 
{
  for(int n=0;n<30;n++)
  {
    SerialUSB.print("Tiempo:");
    SerialUSB.print(actualTime-previousTime);
    SerialUSB.print("\t");
    previousTime=micros();
    SerialUSB.println(bufferenvio);
    actualTime=micros();
  }
}

adjunto un txt con los datos recibidos en el terminal por si alguien quiere ver lo que llega que presenta ciertos errores que quisiera me ayudaran a entender.

Hice una grafica en MatLab de la velocidad calculada para cada envio de cada paquete de mil porque se envia infinitamente en el void loop () y quedo aterrado con esta velocidad :o no se si creemelo o no que opinais vosotros

El archivo adjunto se los dejo en mega porque dado el tamaño el foro no me deja

Archivo de Texto con datos recibidos por el puerto serie

Como pueden observar en su gran mayoria todos los datos llegan bien sin embargo no se si es por la forma en que construyo el buffer que se envia que siempre al final envia unos bits extraños que en ocasiones creo que causan un salto de linea, en cualquier caso quedo aterrado con la velocidad.

Haciendo una nueva prueba como lei en los post que me recomendo Surbyte al disminuir el tamaño del buffer que se envia por el puerto serie se disminuye dramaticamente la velocidad de transferencia en esta nueva prueba envie solo paquetes de un Byte y la respuesta es la que se observa a continuacion:

tener en cuenta que la maxima velocidad usando Serial es 250000bps=31.25kBps

el buffer debe tener multiplos del máximo que maneja el buffer serie.
Por lo que lei debe ser 4096. Prueba con ese tamaño.

surbyte:
el buffer debe tener multiplos del máximo que maneja el buffer serie.
Por lo que lei debe ser 4096. Prueba con ese tamaño.

probando con el tamaño de buffer que recomienda Surbyte se obtienen los resultados que se ven a continuación:

aumenta aun mas la velocidad, intente con tamaños del buffer multiplos de 4096 y al limite de la memoria del Due en un inicio intente con 94208 menor a los 96000 de memoria del Due pero se obtuvo un error de compilacion, posteriormente intente con un valor de 61440 cercano al tamaño maximo del primer banco de memoria del Due 64000 en esta ocasion si compilo y envio mensajes con velocidades de alrededor de 6MBps, sin embargo, la comunicacion se torna algo erratica y al cabo de un tiempo parece ser que se llena el buffer de Java porque muestra el siguiente error en el IDE de arduino y no llegan mas datos:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

Estas pruebas las hice solo para verificar el funcionamiento, mi idea no es usar una cantidad tan grande de memoria pero sirve consignar aca la informacion por si a alguien en un futuro le sirve como cota maxima de transmision con el Arduino DUE usando SerialUSB.

5.7 Mbps con 4k de buffer? Me parece mas que suficiente
Ahora porque esas caidas a 2Mbps?
Sigue siendo impresionante pero es para analizar no?

las caidas de esa ultima imagen son como máximo hasta 3MBps recalco la B porque son Bytes, no 2 Mbps Surbyte, y según lo que leí en todos los post que me compartiste dice que el bus USB al ser compartido depende de los otros componente conectados entonces por ejemplo un movimiento del puntero o conexión y des-conexión de periféricos me imagino que afecta, entonces asumo que fue por ello.

aun Asi me hubiese gustado haber podido habilitar la comunicación Serie al maximo que habla el datasheet alterando los registros del Due, porque aunque con SerialUSB se logran transmisiones como vimos de hasta 5MBps que comparados con los 656.3kBps es superior esta velocidad va a depender de:

  • El tamaño del buffer de envio
  • Los perifericos y actividad de los mismos ademas de caracteristicas de velocidad del propio pc

De este analisis tambien se observo que hay un mínimo de velocidad de SerialUSB de alrededor de 7kBps ello fue para un buffer de 1Byte, entonces yo preferiria tener 656.3kBps estables y no esta gama de velocidades de USB pero bueno para aplicaciones con paquetes grandes de informacion se aprecia la notable supremacía de SerialUSB.