mario290386
Posts: 9
Joined: Tue Jul 24, 2018 7:03 pm

Detectar un cambio en la salida de un comando

Tue Aug 07, 2018 5:58 pm

He acabado un proyecto mediante el cual comunico una Raspberry con un Arduino mediante comunicación serie, en principio me funciona todo bien pero tengo un problema que no he podido resolver, haber si alguien conoce la respuesta y me puede echar una mano.

Tengo un script en shell llamado estado.sh que básicamente lo que hace es comprobar el estado de unos GPIOs, luego creo unas variables para poder preguntar por su valor y segun están en HIGH o LOW pues mandan mensajes via serie al Arduino para hacer un ciclo de programa con estos estados.

Hasta aqui bien todo funciona, el problema viene porque para que esto funcione bien tiene que trabajar en tiempo real, con lo cual necesito conocer en todo momento el estado de las variables que se encargan de decir si los GPIO están en alto o bajo, lo primero que se me ocurrió fué usar el comando :
watch -n 2 ./estado.sh

que básicamente lo que hace es ejecutar cada 2 segundos el script mediante el cual compruebo el estado de los GPIO, el problema es que se ejecuta siempre incluso cuando no hay cambios en los GPIO y esto hace que se me reinicie la comunicación serie, por lo que este metodo no me funciona bien, por lo que necesito alguna manera de verificar que si no hay cambios no me ejecute el script o si no me reiniciaría la comunicacion serie.

Un saludo!!

User avatar
lmarmisa
Posts: 1197
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Detectar un cambio en la salida de un comando

Wed Aug 08, 2018 9:48 am

Un shell script puede almacenar un dato en una variable shell exportada al sistema, de modo que esa variable pueda ser leída en una llamada posterior al script (en tu caso 2 segundos después) para conocer el estado anterior.

Code: Select all

export estado_gpios = valor
https://stackoverflow.com/questions/115 ... out-export

A la hora de leer la variable hay que anteponerle un $. Por ejemplo:

Code: Select all

echo $estado_gpios
Gracias a esta variable puedes modificar tu script para enviar información a Arduino sólo cuando se detecta un cambio en los GIPOs.

Hay un problemilla adicional. La primera vez que llames al script, no existirá la variable $estado_gpios y tu script podría no funcionar adecuadamente. Pero hay formas de conocer si una variable está o no definida y que el script se comporte de la manera adecuada para cada caso:

https://www.cyberciti.biz/faq/linux-uni ... fined-not/
Last edited by lmarmisa on Wed Aug 08, 2018 10:49 am, edited 1 time in total.

mario290386
Posts: 9
Joined: Tue Jul 24, 2018 7:03 pm

Re: Detectar un cambio en la salida de un comando

Wed Aug 08, 2018 10:49 am

Hola lmarmisa,
Se me ha ocurrido una solución gracias a tu aporte, he modificado mi script en python que es el encargado de establecer la comunicación serie y he realizado un bucle mediante un contador, de manera que si se ha enviado la información al arduino no vuelva a enviarla hasta que no haya un cambio. El problema que tengo es que no consigo importar la variable al archivo python, y necesito saber su valor sin tener que definirla.

En bash he exportado la siguiente variable tal y como me has recomendado:
export contadorN=0

y desde el mi script normal.py estoy intentado importar dicha variable:

Code: Select all

#!/usr/bin/env python

import serial
import time
import contadorN


if contadorN == 0:

arduino = serial.Serial("/dev/ttyUSB0", 9600)
arduino.open
time.sleep(2)
print("modo normal")
arduino.write("1")
arduino.close()
contadorN=contadorN+1

else:
print("mayor que 0")

Pero al ejecutar el archivo normal.py me muestra el siguiente error y dice que la variable no existe:

File "./normal.py", line 5, in <module>
import contadorN
ImportError: No module named contadorN

El motivo por el cual no puedo definir la variable en el mismo archivo es porque cada vez que ejecute el archivo normal.py la variable se me pondra a 0, y necesito que la segunda vez que ejecute el fichero no se ejecute la condición puese el valor de contadorN será igual a 1.

Muchas gracias por la ayuda.

User avatar
lmarmisa
Posts: 1197
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Detectar un cambio en la salida de un comando

Wed Aug 08, 2018 10:54 am

Para importar una variable de entorno en python, debes usar la función os.environ:

Code: Select all

import os
contadorN = os.environ['contadorN']
https://stackoverflow.com/questions/490 ... rom-python

mario290386
Posts: 9
Joined: Tue Jul 24, 2018 7:03 pm

Re: Detectar un cambio en la salida de un comando

Wed Aug 08, 2018 11:39 am

Bien ya me funciona al definir la variable y no me da error, lo que me pasa ahora que el bucle if no funciona, no se si es debido a que no se esta tomando el valor de la variable que he importado o es por otro motivo. Lo que he hecho es definir en la shell de linux el valor de la variable:
export contadorN=0

Y en el archivo normal.py la he importado tal y como me has comentado:

Code: Select all

#!/usr/bin/env python

import serial
import time
import os
contadorN = os.environ['contadorN']


if contadorN == 0:

        arduino = serial.Serial("/dev/ttyUSB0", 9600)
        arduino.open
        time.sleep(2)
        print("modo normal")
        arduino.write("1")
        arduino.close()


else:
        print("mayor que 0")

Pues al ejecutar el script no me entra en el bucle if, se va directamente al else, no entiendo porque,si la variable vale 0 debería de entrar en el if. He probado poniendo otros valores a la variable pero nunca entra en el if, sospecho que no estoy importando de manera adecuada los valores de la variable.

Gracias de nuevo!!

User avatar
lmarmisa
Posts: 1197
Joined: Thu Feb 14, 2013 2:22 am
Location: Jávea, Spain

Re: Detectar un cambio en la salida de un comando

Wed Aug 08, 2018 4:24 pm

El valor devuelto por os.environ['contadorN'] es un string y deberías tenerlo en cuenta en la comparación.

Code: Select all

#!/usr/bin/env python

import serial
import time
import os

if  os.environ["contadorN"] == "0":
        arduino = serial.Serial("/dev/ttyUSB0", 9600)
        arduino.open
        time.sleep(2)
        print("modo normal")
        arduino.write("1")
        arduino.close()
else:
        print("mayor que 0")
https://docs.python.org/2/library/os.html#os.environ

NOTA: no entro a analizar si el script funciona o no como esperas que lo haga. Sólo te indico cómo debe de ser tratado el valor de la variable de entorno.

mario290386
Posts: 9
Joined: Tue Jul 24, 2018 7:03 pm

Re: Detectar un cambio en la salida de un comando

Thu Aug 09, 2018 6:55 pm

Cierto lmarmisa!! Ahora ya si me funciona como deberia, muchas gracias por la ayuda. Ahora sigo batallando con otros problemas jeje.

Return to “Español”

Who is online

Users browsing this forum: No registered users and 1 guest