Python - Verificar el estado de una entrada durante un tiempo "x"

 
Vista:

Verificar el estado de una entrada durante un tiempo "x"

Publicado por Oscar (3 intervenciones) el 18/05/2017 20:41:09
Buenas tardes.

En mi trabajo han decidido poner en marcha un sistema de vision artificial donde una RaspBerry se encarga de tomar una foto cuando tenemos un evento de detección. Luego se envia la foto a un servidor y se hacen unos algoritmos para verificar el modelo de la pieza.

El caso es que me han encargado colaborar con la empresa que lo esta desarrollando y no he usado nunca una RaspBerry ni he programado nada con Python.

He programado en multitud de lenguajes, en unos mas avanazado como con robots y automatas; en otros mas básico como en C++ o SQL. Con esto quiero decir que tengo nociones de programacion, se lo que quiero hacer pero no se como hacerlo.

Aqui os describo el problema... Tenemos muchos problemas con "ruido" externo que no ha sido posible paliar con pull-ups ya que el dispositivo se encuentra en un entorno industrial con motores muy potentes, trafos de intensidad... Hemos probado con flancos de subida, de bajada, verificaciones dobles del estado de la entrada... nada ha dado un resultado satisfactorio.

Ahora mismo la detección es la siguiente:
GPIO.add_event_detect(port, GPIO.RISING, callback=send_image, bouncetime=1500)

Cuando tenemos el flanco de subida se ejecuta la funcion "send_image" y en esta lo primero que hacemos es incluir un retardo de 200ms y volver a verificar el estado de la entrada. Si es "1" continuamos con la ejecucion.

El bouncetime de 1500ms es para evitar el efecto "ametralladora" que nos genera el ruido externo. El problema de esto es que si durante esos 1500ms se da un flanco real le estamos ignorando.

Lo que me gustaria hacer es iniciar un temporizador cuando la señal esta en "1" y resetearle cuando la señal esta en "0". Cuando este temporizador sea mayor de 200ms, por ejemplo, lanzo la funcion.

En uno de los lenguajes que manejo con soltura sería algo asi...
DO
@utimer temp_001 = 0
WHILE SIG(-1001)
END_DO

IF temp_001 > 200 THEN
CALL send_image
END_IF

Me gustaría saber como hacer esto con Python si es que el lenguaje y la RaspBerry lo permiten.
Espero haberme explicado.

Gracias por vuestra ayuda!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Verificar el estado de una entrada durante un tiempo "x"

Publicado por Oscar (3 intervenciones) el 19/05/2017 00:52:56
Buenas noches.

Gracias por tu comenario.
Esos dos enlaces no me han dado mucha mas informacion de la que ya tenía.

Llevo un rato preguntandole a google por ejemplos de la libreria "time" y he dado con uno que creo que me puede servir.
1. Cuando tengo un flanco de subida ejecuto la funcion "check_rise" donde recojo el tiempo de reloj en la variable "time_start"
2. Cuando tengo un flanco de bajada ejecuto la funcion "check_fall" donde recojo el tiempo de reloj en la variable "time_end"
3. Resto los valores para saber la anchura del pulso y lo guardo en la variable "time_check"
4. Si esta variable es mayor de 200ms lanzo la funcion que saca la foto, la envia...
5. Si es menos de 200ms ignoro el pulso y espero otro flanco positivo


¿Que os parece?
He de decir que es mi primer codigo en python... :p



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def check_rise:
        print "flanco de subida"
	time_start = time() #recojo el tiempo en flanco de subida
 
def check_fall:
        print "flanco de bajada"
	time_end = time() #recojo el tiempo en flanco de bajada
	time_check = time_end - time_start #calculo la anchura del pulso
        print "tiempo de flanco ",time_check
	if time_check > 0.200: #si el pulso ha sido de mas de 200ms
		print "flanco correcto"
		callback = send_image
	if time_check < 0.200: #si el pulso ha sido de menos de 200ms
	        print "flanco erroneo"
 
GPIO.add_event_detect(port, GPIO.RISING, callback=check_rise)
GPIO.add_event_detect(port, GPIO.FALLING, callback=check_fall)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Verificar el estado de una entrada durante un tiempo "x"

Publicado por CpA (33 intervenciones) el 19/05/2017 11:32:14
Eso no te va a funcionar, porque las variables no son globales. La variables son de cada sección, por lo que te dará error al ejecutar, ya que la variable time_start de la funcion check_fall no está declarada.

Las funciones también están mal definidas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Verificar el estado de una entrada durante un tiempo "x"

Publicado por kip (257 intervenciones) el 22/05/2017 16:05:00
Hola, entiendo un poco lo que quieres hacer e intentare simularlo con un codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import datetime
import time
 
# Aqui simulamos el tiempo del flanco de subida
tiempoFlancoSubida = datetime.datetime.now()
 
# Le damos un delay simulando cuanto se tardo en ejecutarse el flanco de subida
# En este caso un valor mayor a 200ms
time.sleep(0.21)
 
# Aqui simulamos el tiempo del flanco de bajada
tiempoFlancoBajada = datetime.datetime.now()
 
# Obtenemos la diferencia entre ambos restando ambos objetos datetime
# Este resultado sera un objeto del tipo timedelta
delta = tiempoFlancoBajada - tiempoFlancoSubida
 
# Accedemos al metodo del timedelta para obtener los segundos de diferencia
# Estos segundos los multiplicados por 1000 para obtenerlos en ms directamente
milisegsDiferencia = delta.total_seconds() * 1000
 
if milisegsDiferencia > 200:
    print "Se han sobrepasado los 200ms !!"
else:
    print "No se han sobrepasado los 200ms !!"

Es un codigo muy sencillo y como le he colocado al delay un valor mayor a 200ms entonces te mostrara:

1
Se han sobrepasado los 200ms !!

Ahora bien, podrias decirme si lo que he entendido esta correcto, es decir si mi codigo se acerca a lo que quieres ?

Ahora bien viendo tu codigo queria preguntarte que aquel valor de callback que le das como send_image donde lo enviarias ? O es tambien un ejemplo de mas o menos como estaria funcionando si sobrepasa los 200ms ?

Ademas debes tener en cuenta que dentro de una funcion no puedes comparar el valor de una variable que declaraste en otra !

Podrias por favor colocar el codigo con las identaciones correctas o tal vez darnos mas detalles de que pasaria en realidad si sobrepasa los 200ms el time_check ? Tengo la duda de que precisamente deberia ejecutarse.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Verificar el estado de una entrada durante un tiempo "x"

Publicado por Oscar (3 intervenciones) el 29/05/2017 21:07:10
Buenas noches.
Muchas gracias por tu respuesta.
Entiendo el codigo que me propones pero no se ajusta a lo que necesito.
Realmente no necesito medir el ancho total de un pulso sino que necesito asegurarme de la estabilidad del pulso una vez se genera el flanco.
Todo esto se debe a que la raspberry está montada en un entorno industrial agresivo y tenemos mucho ruido que no somos capaces de filtrar; entonces se producen flancos falsos que debo ignorar.

Ya me han solucionado el problema los compañeros de la empresa que estan haciendo la instalacion.

Sobre tu pregunta de la llamada a "send_image" se trata de una función que ordena sacar una foto desde la raspberry y la envía a un servidor donde esa foto es tratada.

No es necesario que me pongais más ejemplos. Poco a poco voy viendo algunos codigos y cogiendo ideas y avanzando.

Una vez mas... gracias por vuestra ayuda!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar