Estoy usando un Arduino para las lecturas de los sensores y enviándolas a una Raspberry Pi vía USB, usando PySerial para la recepción de datos.
Funciona muy bien, excepto por el hecho de que los datos recibidos se modifican torpemente (y se establecen como constantes). Por ejemplo, estoy leyendo voltajes y calculando corrientes. Los resultados en la serie Arduino son los siguientes:
Volt Current
4.93 0.38
4.92 0.37
4.92 0.37
4.92 0.36
... ...
Sin embargo, en la Raspberry Pi, se lee constantemente de la siguiente manera (Observe cómo los dígitos se cambian a cero):
Volt Current
4.99 0.30
4.99 0.30
4.99 0.30
4.99 0.30
... ...
He intentado varias vueltas, pero sin suerte. No estoy seguro de dónde está el problema, ya que estoy muy seguro de que mi código es impecable. Incluso he convertido las lecturas a cadena antes de enviarlas y, sin embargo, siguen apareciendo las lecturas constantes y los dígitos a cero. He añadido un contador de enteros que se ha enviado correctamente sin problemas.
¿Alguien ha probado esto antes? ¿Alguna idea sobre cómo solucionarlo?
Código Raspberry Pi:
from time import gmtime, strftime
import time
import serial
import struct
ser = serial.Serial('/dev/ttyACM1', 19200)
f = open('results.txt','w')
while 1:
temp=strftime("%Y-%m-%d %H:%M:%S", gmtime())+'\t'+ser.readline()
print(temp)
f.write(temp)
f.close()
f = open('results.txt','a')
time.sleep(5)
Código Arduino:
...
double volt = 5.0*(analogRead(A0))/1023.0;
double current = 5.18 - temp; //Resistance ~= 1 Ohm if you are wondering
buffer += d2s(volt,2)+'\t'+d2s(current,2)+'\t'+ d2s(count,0) +'\t' + d2s(minCount,0);
Serial.println(buffer);
...
//I got this from the web
String d2s(double input,int decimalPlaces){
String string;
if(decimalPlaces!=0){
string = String((int)(input*pow(10,decimalPlaces)));
if(abs(input)<1){
if(input>0)
string = "0"+string;
else if(input<0)
string = string.substring(0,1)+"0"+string.substring(1);
}
return string.substring(0,string.length()-
decimalPlaces)+"."+string.substring(string.length()-decimalPlaces);
}
else {
return String((int)input);
}
}
0 votos
¿Puede mostrar los fragmentos de código pertinentes en ambos extremos?
0 votos
Hecho... Echa un vistazo
0 votos
Un ataque general a los problemas de este tipo es probar a hacer todo hacia y desde archivos de texto en lugar de fuentes de datos en vivo. Así que, por ejemplo, capturaría la salida del arduino a un archivo de texto, verificaría visualmente que es correcto, luego lo procesaría con el programa python y verificaría que la salida coincide con la entrada. Es probable que tengas un problema de parseo o de impresión con valores de punto flotante...
0 votos
¿Dónde estás configurando la UART del Arduino?
0 votos
@Chris Actualmente no tengo acceso a un adaptador de tarjeta SD para el arduino, pero definitivamente voy a dar una oportunidad
0 votos
@Alejandro Pues no sé muy bien a qué te refieres, pero la configuración en serie se hace en ambos lados con una tasa de baudios de 19200. Sin embargo, en la RPi lo configuro para usar el puerto USB '/dev/ttyACM0'. ¿Responde esto a tu pregunta?
0 votos
Me refería a capturar la salida serial del arduino a un archivo en una pc o en la pi.
0 votos
No veo dónde estás haciendo la configuración de la UART en el Arduino (tasa de baudios, etc). Puede ser que haya un problema ahí.
0 votos
void setup() { ... Serial.begin(19200); ... }
0 votos
¿Tienes un osciloscopio? Sería útil para determinar si los bits del cable son válidos o no.
0 votos
Lamentablemente no. Sin embargo, sigo creyendo que es un problema de la librería PySerial por no poder parsear correctamente ciertos elementos, ya que el monitor serie de Arduino lee todo correctamente. ¿Quizás sea un problema de extensión de ASCII? Aunque eso es muy poco probable
0 votos
Realmente dudo que sea PySerial. Lo he usado bastante, sin problemas.
0 votos
Utilice hexdump en la pi para examinar el exacto salida del arduino. Utiliza un programa de prueba en el PC para inyectar datos serie falsos a la pi para su análisis.