Tengo un Arduino conectado a una caja de linux (una Raspberry Pi). Estoy leyendo un pin analógico y lo escribo junto Serial.println()
con el valor de millis()
El puerto serie funciona a 9600 bps
Algo en las líneas de:
void Setup() {
Serial.begin(9600)
}
void loop() {
Serial.print(analogRead(A0));
Serial.print("\t");
Serial.println(millis());
}
En el extremo receptor veo un flujo continuo de 5 o 6 segundos, luego un intervalo de 2 segundos sin datos, luego otros 5 o 6 segundos llenos de datos. No lo "visto" en vivo, pero estoy trazando el valor de millis () con una lectura de datos del puerto serie.
Creo que podría ser que los datos se pierdan en el búfer de escritura del arduino, o que otra cosa tome tiempo del procesador cada 5 o 6 segundos (hay un protector de ethernet sin usar adjunto) o tal vez el puerto serie escribe en ráfagas.
Cuando aumento la tasa de baudios a 115200, todavía obtengo intervalos de tiempo, pero parecen más aleatorios.
Actualizar:
El aumento de la tasa de baudios a 38400 eliminó las brechas en las muestras (brechas medidas en tiempo de arduino millis())
Otra cosa extraña fue:
En el extremo receptor, estaba haciendo cat /dev/ttyACM0
y canalizándolo, a awk
lo que agregaba el reloj del sistema a cada línea recibida. Luego tracé el tiempo recibido frente al tiempo del sistema, y no era una línea recta, sino una trama en forma de escalera. Se eliminó lo innecesario cat
y el tiempo volvió a la normalidad.
Resulta que cat /dev/ttyACM0 | awk {print}
no es lo mismo que </dev/ttyACM0 awk {print}
. Parece que el gato hace un almacenamiento en búfer extraño.
Ahora parece que el arduino lee todos los valores.
analogRead() devolverá valores de 2 a 3 dígitos, digamos 3. millis() crecerá rápidamente a valores de 4 y 5 caracteres, y con el tabulador y la nueva línea, se generan aproximadamente 10 caracteres en cada ejecución del ciclo.
A 9600 baudios, su puerto serie puede escribir un poco menos de 1000 caracteres/seg o un poco menos de 100 líneas de 10 caracteres/seg. Su bucle podría ejecutarse fácilmente más rápido que 100 veces/seg y, de ser así, el búfer de salida en serie sin duda se está desbordando. Debe retrasar 10 ms o más en el bucle para que el puerto serie se ponga al día. 115 K baudios es 12 veces más rápido, por lo que podría reducir el retraso (una vez que sepa cuánto necesita) por ese factor para la velocidad en baudios más alta.
Dos posibilidades como yo lo veo:
Su programa es en realidad mucho más grande de lo que nos está mostrando y, de hecho, está experimentando algún tipo de desbordamiento de pila que resulta en reinicios aleatorios.
Es mucho más probable que su "problema" esté en Rasp Pi y que el tráfico en serie entrante se almacene en búfer antes de enviarse a su (en la parte superior de la pila de aplicaciones), presumiblemente Python, aplicación
Si quiere asegurarse de que los bytes salgan del Arduino lo antes posible, llame a Serial.flush() al final de cada bucle (o después de cada Serial.print*)
yippie
jwygralak67
marianov