Go Down

Topic: Problemas con comuicación serial. (Read 1 time) previous topic - next topic

Estimados

Uso arduino uno y un notebook con ubuntu de donde ejecuto un código python con la libreria serial (import serial), mi problema es que si ejecuto el programa desde mi notebook y está el serial monitor de arduino funcionando entonces todo va bien, pero si cuando ejecuto mi código no está el serial monitor de arduino ejecutandose entonces no funciona correctamente.

Necesito que no sea necesario tener abierto el serial monitor por temas técnicos de mi proyecto, quisiera saber si alguien tiene alguna idea de cómo arreglar esto.

Saludos.

billroy

Es necessario esperar mas o menos 1000 ms despues de serial.Serial(…) en Python.

-br

Gracias por tu respuesta, pero no me funcionó, ¿alguna otra idea?.

Saludos.

Tenias razón, en mi caso eran 1.5 seg, pero ¿cómo hacer que no sea necesario esto? lo que pasa es que a cada rato envio una petición serial y tengo que esperar de nuevo los 1.5 seg de más.


Saludos.

billroy

Bueno.  Es el "bootloader timeout".

Saludos.

-br

yOPERO

A mi suena a reset cuando cuando abre el com port. Prueba poner un capacitor entre los pines de gnd y reset a ver que pasa.
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Anskar

#6
Nov 14, 2012, 04:38 pm Last Edit: Nov 14, 2012, 04:41 pm by Anskar Reason: 1
Soy un novato ;), pero lo que yo hago es llamar a serial.Serial al principio del programa, así cuando quiero recoger los datos ya ha esperado el segundo de marras... o sea:


import serial

class LaClasePrincipal():
   serial = serial.Serial('localización de arduino', baudios)
   def __init__(self):
       parte inicial el programa
       ....
   def datos_arduino(self):
       self.serial.read()
       proceso de datos arduino


Tampoco se si es lo correcto, pero noto que el parapadeo del arduino se efectua al principio i no cuando quiero recoger los datos.
En caso de no necesitarlo siempre se puede hacer de poner el serial.Serial en otra instancia que se llame en algun momento del programa. Lo que no se es como cerrarlo :D, que tampoco estaria mal saber.

Anskar

Encontré la forma de cerrar la comunicación con el puerto serie.

Tan fácil como:

serial = serial.Serial('/ruta/al/puerto/serie', baudios)
serial.close()

UndercoverNerd

Pero eso soluciona lo de que funcione con el serial de arduino abierto?
Es que a mí me pasa lo mismo.

Anskar

Por lo que puedo entender, el problema está en que, igual que en una llamada telefónica, hay que esperar que se "descuelgue" el aparato receptor para establecer la comunicación. En el caso de python-Arduino eso es la llamada

serial.Serial()

Se nota que Arduino parpadea hasta que se establece la comunicación y los envios de datos ya son instantaneos. O sea, siempre que se pida los datos de arduino con

serial.read()

el parpadeo no se efectua por que la comunicación ya está establecida. El problema, creo yo, (si alguien lo puede confirmar será de más ayuda que mis comentarios de newbe) está en hacer la llamada a comunicación

serial.Read()

cada vez que se quieren recuperar los datos de Arduino, entonces es cuando la comunicación tarda un rato en establecerse y se pierden los primeros datos. Por eso lo que propongo es establecer la comunicación serial antes de necesitar el envio de datos y tener siempre disponible la comunicación para no tener que esperar el bootloader, puesto que ya está establecido anteriormente.... no sé si me explico bien o igual me pierdo algo.

yOPERO

Yo creo que aquí hay un problema de timing.

Y eso de pedir ayuda y no poner código(no cachos) hace mas difícil poder ayudar.

en fin...

Cada vez que Python se conecta a arduino este envía una señal de reset al arduino para evitar eso hay que hacer una pequeña pausa después de realizar la conexión. La pausa depende de muchos factores pero parece ser que una pausa de 2ms funcionara en cualquier PC.

Code: [Select]
ser = serial.Serial(PORT)

/*----Dar tiempo al Arduino para hacer el reset-------------*/
time.sleep(2.0)

/*----Ahora si enviamos datos--------------------------------*/
written = ser.write(val)
ser.close()



Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Go Up