Transferencia de datos de alta velocidad a un PC

hola, una consulta
Estoy intentando transferir dos señales digitales, obtenidas de dos pines del arduino, ambas medidas activadas por una interrupción en un pin adicional, el problema es que tengo un cuello de botella en la transmisión de datos entre arduino hacia el pc, necesito transferir lectura del arduino a el computador antes de la siguiente interrupción.
La señal de interrupción tiene una frecuencia de 96khz, una medición completa equivale a 512 datos binarios y tengo un tiempo entre interrupción e interrupción de 10 micro segundos.

Estoy usando serial por protocolo serial UART pero no es lo suficientemente rapido para transmitir a el computador.

alguna recomendación ?

byte h=1101;

void setup(){
Serial.begin(2000000);
}

// the loop function runs over and over again forever
void loop(){
 printBits(h);
 delay(1000);
}

void printBits(long int n) {
  byte numBits =4;  // 2^numBits must be big enough to include the number n
  char b;
  char c = ' ';   // delimiter character
  for (byte i = 0; i < numBits; i++) {
    // shift 1 and mask to identify each bit value
    b = (n & (1 << (numBits - 1 - i))) > 0 ? '1' : '0'; // slightly faster to print chars than ints (saves conversion)
    Serial.print(b);
    if (i < (numBits - 1) && ((numBits-i - 1) % 5 == 0 )) Serial.print(c); // print a separator at every 4 bits
  }
}

esta imagen corresponde al sketch del codigo mencionado anteriormente

En esta imagen observamos la señal de clock y la señal de datos, sa una velocidad de 2Mbaudios, aun no es suficiente para leer el dato y enviarlo.

Explica mejor el problema.
Link de la ionosonda hoja de datos, etc
No entiendo porque quieres enviar pulsos de 10 useg al PC via un Arduino? Algo no cierra.

1 Like

@Surbyte listo

Que significa tu respuesta? Por favor, se más claro!!

1 Like

No es posible enviar un byte en ese tiempo. A la velocidad de 115200 bits por segundos, te lleva 78 microsegundos enviar un byte (si no hice mal las cuentas).
Hace falta mas información para poder darte una repuesta: pon un enlace al manual de la sonda (como te pidieron), modelo de arduino, código .
¿Lo que intentas transmitir en un binario de dos dígitos? por que allí ya tienes una gran perdida de eficiencia en velocidad de transmisión. En un solo byte puedes transmitir cuatro datos binarios de dos dígitos.

1 Like

@PeterKantTropus en teoria debería poder guardar 4 datos binarios en un bit, pero no puedo implementarlo, tal vez tienes algún ejemplo de como hacerlo porque yo no pude
estoy usando un arduino DUE, UNO y un mega para hacer diferentes pruebas
los datos de la ionosonda por ahora son irrelevantes, mi problema es solamente el cuello de botella en la transmisión del arduino a la pc por el serial, tiene que ser lo suficientemente rapido para leer y enviar el dato antes del siguiente ciclo.
Añadí el codigo y foto de observado en el osciloscopio

Primero lee la diferencia entre bits y byte. Un byte transmitido por serial son 8 bits, de esa manera puedes concatenar 4 datos de 2 bits , por ejemplo, los datos binarios 01,11,10,11 puedes enviarlo como el dato binario 01111011 que es equivalente al 123 decimal o 7B hexadecimal . Olvídate de trabajar transmitiendo caracteres (serial.Print) la transmisión rápida de datos se hace con bytes. Tienes este tutorial de Luis Llamas para empezar. No es capricho que te pidamos el manual de la sonda, comprender como funciona nos permite aconsejarte la mejor manera de optimizar tu programa. La experiencia me indica que no sirve dar una respuesta, si tenemos re elaborar la respuesta por cada pieza de información que nos dan.
saludos

1 Like

@mycroft22
Parece que intentas leer de la sonda paquetes de 1 nibble. Me uno a la petición de la doc de la sonda.
Pero envias un caracter (8bits) por cada bit con lo que necesitas una velocidad serial 8 veces más de lo que deberías.
Aunque si ver la documentación de la sonda etc vamos un poco a ciegas, yo te recomendaría empaquetar 2 lecturas de la sonda (2 nibbles = 1 byte) tal como así:

byte nibble_lectura_1=B1101;
byte nibble_lectura_2=B0110;
byte caracter_a_enviar;
caracter_a_enviar=((nibble_lectura_1<<4)&nibble_lectura_2); //hacer SHL de 4 bites
1 Like

@DanX3 , @PeterKantTropus y @Surbyte aqui tienen la informacion de la ionosonda, el objetivo de todo es todo esto es mejorar la captura de inogramas de manera digital con arduino, raspberry etc. tomando la informacion directamente desde las placas de la inosonda.

https://drive.google.com/drive/folders/16pIsqqw2yXm1W7iICLYq9elhJ3F9kiF7?usp=sharing

Creo que te equivocaste de foro, acá no hacemos arqueológica :smile: :smile: :smile: :smile: :smile: :smile:
Broma aparte, me tomara tiempo leerlo y entenderlo.

1 Like

ajajaja lose, por ahora el unico problema que tengo es la velocidad de lectura y escritura.... tal vez el protocolo UART es muy lento para esta aplicación, no estoy seguro si se puede utilizar el protocolo spi para transferir información directamente hacia el pc, se puede?

Porque no nos ayudas un poco mas!
Limita la informacion a la o las paginas que hacen falta y no nos envies a leer 200 paginas.
Te queremos ayudar pero si todos colaboramos es más fácil, no?
El manual esta capturado con algo como Adobe Scan o similar o simplemente fotos unidas en un pdf. Esperaba algo bien scanneado tipo libro.
Se lee, entiendeme bien pero no es posible hacer seguimiento de textos como si fuera un pdf.
Qué paginas puntualmente hay que leer?

1 Like

si, tienes razón; lo unico relevante es esto, el objetivo de mi trabajo es reconstruir un ionograma, es una especie de imagen donde se observa y mide los cambios en la ionosfera.
Un ionograma es una imagen que se construye en una matriz de 512 columnas y de 576 filas.

Las señales que salen de la ionosonda y llegan a el arduino son tres señales, DATA, YB y CLOCK. la señal CLOCK es un reloj interno de la ionosonda que sincroniza todo en ella, tiene un frecuencia de 96khz, la señal YB indica la columna del ionograma y la señal DATA indica el contenido de la fila en la columna, ese contenido puede ser un 1 o un 0. En síntesis es eso.
Las tres señales son recepcionadas en el arduino de esta manera : utilizo la señal CLOCK como una interrupción en falling para tomar la señal en DATA y YB, ahora no puedo enviar ese estado a la pc por medio del serial antes de la siguiente interupcion, no es lo sufientemente rapido para leer el estado y enviar esa información.
Lo que estoy probando era lo que mencionaba @PeterKantTropus de los bits en un byte para ganar rapidez en el envio pero no lo logre ... ahora tengo la opción de guardar la información recibida en un array y luego enviarla pero la capcidad del array es de 999, por ahora estoy intentado crear un array para cada señal de YB, osea 512 arrays de dos dimensiones para guardar la informacion de DTA. Esa es la historia .... @Surbyte

Lo que intentas hacer, no se puede. No puedes muestrear a es velocidad en tiempo real por el PC.
La velocidad máxima del puerto USB del Arduino mega es de 115200 bit por segundo(en teoría el atmega8u2 soporta 230000 bits por segundos pero no esta implementado)
Trasmitir un byte, en el modo por defecto, consume 9 bits. Por lo tanto el máximo de datos que puedes transmitir por segundo es de 12 800 ( en teoría y con mucha suerte)
pero tu quieres muestrear una señal de 10 microsegundos, es decir 100 000 datos por segundo. No hay manera. Hay que trabajar sobre la seña original.

no necesito que sea en tiempo real, solo necesito obtener la información de la medición, con 2M de baudios casi lo logro .... tal vez con 3M lo hubiera logrado pero ya no da mas.
Por cierto cambie a el arduino Due.

¿Cuantos bits de información tiene tus datos?

en total son 512 * 576 = 294,112 bits de información.
los datos son todos binarios puros

Menos de 37K pero el DUE tiene esa RAM?
Tiene 96K.
Las señales son TTL?

1 Like

son binarios puras, no tienen ningún protocolo lo unico que me sirve para guiarme es el clock, porque la señal clock y YB siempre estan presentes, todo el tiempo, DATA se mantiene en bajo y cambia solo cuando hay una medición.
la due tiene 512k de ram

Si entiendo que son binarios ¿Pero cuantos bit tiene cada binario que lees? Al principio dijiste que tienes un clock y lees dos pines de arduino, por lo tanto supongo que por cada señal de clock obtienes un binario de de dos bits.

1 Like