comprendre python

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
cide
Messages : 9
Enregistré le : mer. 31 mars 2021 14:37

comprendre python

Message par cide » mer. 31 mars 2021 14:58

Bonjour,

J'apprends Python depuis quelques semaines et je ne trouve pas de réponse à une question que je me pose depuis le début. Je code déjà des petits programmes sur Arduino ou ESP8266 mais pour Python, est ce que tout le code doit être écrit dans un seul script (comme arduino) ou iil est possible de lancer plusieurs scripts en même temps au démarrage du raspberry? Un script qui gère les leds, un script qui gère la caméra et un script qui gère les photos?

Je m'explique, j'ai fabriqué un dimmer leds 24V 2 canaux avec un arduino, j'ai modifié le programme pour le faire fonctionner sur un ESP8266 pour bénéficier de la puce WIFI et d'un module DMX. Tout fonctionne avec deux encodeurs numériques et non des potentiomètres. Maintenant j'aimerais réutiliser mon code pour un nouvel objet contenant une camera. J'ai donc traduit le programme en Python mais je bloque. Mes encodeurs numériques fonctionnent, l'intensité des leds varie, la camera enregistre à l'aide d'un seul bouton poussoir (on camera record off camera stop record). un deuxième bouton allume et éteint le raspberry. Maintenant j'aimerais avoir un troisiième bouton poussoir qui prend juste une photo et c'est là que ca coince. Je n'arrive pas à rajouter à mon code existant la fonction bouton poussoir -> photo.

Il y a des dizaines d'exemples sur le net qui fonctionnent seuls dans un script mais je n'arrive pas à les ajouter au mien. Est ce que je peux lancer automatiquement deux scripts au démarrage du raspberry ou c'est mieux que tout soit écrit dans un seul programme?

merci

Cide

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: comprendre python

Message par domi » mer. 31 mars 2021 18:17

Bonjour,

Rien n'oblige d'avoir un seul script, plusieurs scripts peuvent être lancés soit au démarrage, soit par un autre script.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

cide
Messages : 9
Enregistré le : mer. 31 mars 2021 14:37

Re: comprendre python

Message par cide » jeu. 1 avr. 2021 21:25

Bonjour,

Merci pour la réponse mais je n'arrive pas à lancer deux scripts au démarrage.
Pour l'instant j'exécute ces commandes :

Rendre le script executable : sudo chmod +x /chemin/vers fichier/scriptaexecuter.py

Editer le fichier /etc/rc.local : sudo nano /etc/rc.local
Ajouter avant exit 0 : python /home/pi/scriptaexecuter.py

J'ai donc ajouté avant exit 0 : python /home/pi/scriptaexecuter.py
python /home/pi/scriptaexecuter2.py

Séparément, ils s'exécutent au démarrage mais pas ensemble.
Après quelles informations dois je chercher?

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: comprendre python

Message par dyox » ven. 2 avr. 2021 17:42

Bonjour,
sudo chmod +x /chemin/vers fichier/scriptaexecuter.py
Le sudo est inutile et pour une meilleure sécurité, que le script soit que pour le user au lieu de tout le monde donc chmod u+x ...

Quand les scripts se lancent bien hors au boot, c'est toujours un problème de PATH. Donc il faut mettre le chemin absolu de python que vous trouverez avec "which python"

cide
Messages : 9
Enregistré le : mer. 31 mars 2021 14:37

Re: comprendre python

Message par cide » sam. 3 avr. 2021 12:22

Merci, j'ai rajouté le chemin absolu mais ça ne fonctionne toujours pas. J'ai donc écrit ceci :

/usr/bin/python /home/pi/MU.py
/usr/bin/python /home/pi/NMU.py

exit 0

Si une seule ligne sur les deux est écrite, le script se lance sans problème. Mais de cette manière, seul MU se lance et si j'inverse et que j'écris NMU en premier. Rien ne fonctionne.

J'essaye simplement de rajouter ce petit code :

from picamera import PiCamera
import datetime
import time
import RPi.GPIO as GPIO

PHOTO = 13
LED_3 = 20
LED_4 = 16
camera = PiCamera()

GPIO.setmode(GPIO.BCM)
GPIO.setup(PHOTO,GPIO.IN,pull_up_down = GPIO.PUD_UP)
GPIO.setup(LED_3,GPIO.OUT) # LED2 will be an output pin
GPIO.setup(LED_4,GPIO.OUT)# LED2 will be an output pin

while(True):

if GPIO.input(PHOTO) == 0 :
image_path = '/home/pi/Pictures/image_%s.jpg' % int(round(time.time() * 1000))
GPIO.output(LED_4, GPIO.HIGH)
GPIO.output(LED_3, GPIO.LOW)
camera.capture(image_path)
print("Took photo")
time.sleep(.5)
GPIO.output(LED_4, GPIO.LOW)
GPIO.output(LED_3, GPIO.HIGH)


j'essaye de le rajouter à ce code ci:

import picamera
import datetime
import time
import RPi.GPIO as GPIO
from encoder import Encoder


LED_1 = 17
LED_2 = 18
PHOTO = 13
LED_3 = 20
CAMERA = 21
LED_4 = 16


brightness = 0
cold = 0
warm = 100
record = 0


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(CAMERA,GPIO.IN,pull_up_down = GPIO.PUD_UP)
GPIO.setup(PHOTO,GPIO.IN,pull_up_down = GPIO.PUD_UP)
GPIO.setup(LED_1,GPIO.OUT)
GPIO.setup(LED_2,GPIO.OUT)
GPIO.setup(LED_3,GPIO.OUT)
GPIO.setup(LED_4,GPIO.OUT)
GPIO.output(LED_3, GPIO.HIGH)
pwm1 = GPIO.PWM(LED_1,1000)
pwm2 = GPIO.PWM(LED_2,1000)
pwm1.start(0)
pwm2.start(0)


def intensity(brightness):

brightness = e1.getValue()
cold = e2.getValue()
warm = 100 - cold
pwm1.ChangeDutyCycle(warm*brightness/100) # Apply new brightness
pwm2.ChangeDutyCycle(cold*brightness/100) # Apply new brightness
print("* Intensity : {}".format(brightness))


def balance(cold):

cold = e2.getValue()
brightness = e1.getValue()
warm = 100 - cold
pwm1.ChangeDutyCycle(warm*brightness/100) # Apply new brightness
pwm2.ChangeDutyCycle(cold*brightness/100) # Apply new brightness
print("Balance : ",(cold-0) * (6500 - 2700) // (100 - 0) + 2700)


e1 = Encoder(24, 23, intensity)
e2 = Encoder(27, 22, balance)


def camera():

global record

with picamera.PiCamera() as camera:
camera.resolution = (1280, 720)
camera.framerate = 25
while GPIO.input(CAMERA) == 1 :
time.sleep(0.25)
record = 1
print ("Recording")
GPIO.output(LED_4, GPIO.HIGH)
GPIO.output(LED_3, GPIO.LOW)
now = datetime.datetime.now()
timestamp = now.strftime("%y%m%d%H%M%S")
camera.start_preview()
camera.start_recording('/home/pi/Videos/' + str(timestamp) + '.h264')
time.sleep(.5)
while record == 1:
camera.wait_recording(.01)
if GPIO.input(CAMERA) == 0:
print ("Stopped")
camera.stop_recording()
GPIO.output(LED_4, GPIO.LOW)
GPIO.output(LED_3, GPIO.HIGH)
record = 0
while GPIO.input(CAMERA) == 0:
time.sleep(0.1)
time.sleep(.5)

'''if GPIO.input(PHOTO) == 0 :
image_path = '/home/pi/Pictures/image_%s.jpg' % int(round(time.time() * 1000))
GPIO.output(LED_4, GPIO.HIGH)
GPIO.output(LED_3, GPIO.LOW)
camera.capture(image_path)
print("Took photo")
time.sleep(.5)
GPIO.output(LED_4, GPIO.LOW)
GPIO.output(LED_3, GPIO.HIGH)'''


try:

while True:
time.sleep(0.1)
camera()


except KeyboardInterrupt:
print ('Interrupted')
GPIO.cleanup()

finally :
GPIO.cleanup()


Est ce que quelqu'un peut m'aider à rajouter une fonction pour prendre une photo s'il vous plait?

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: comprendre python

Message par dyox » sam. 3 avr. 2021 13:40

Peut-être faut-il forcer une version python3 ?
Avez-vous essayé le cron au lieu de rc.local ?

cide
Messages : 9
Enregistré le : mer. 31 mars 2021 14:37

Re: comprendre python

Message par cide » sam. 3 avr. 2021 17:28

oui j'ai déjà essayé le cron mais sans succès. Cependant je ne me suis pas attardé la dessus. Je vais recommencer cette méthode. merci

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: comprendre python

Message par jelopo » dim. 4 avr. 2021 15:23

Bonjour,

Le rc.local lance les commandes séquentiellement et attend que chaque commande ait rendue la main pour passer à la suivante.
Pour lancer 2 commandes en parallèle, il faut lancer les lancer en tache de fond ou arrière plan.

https://openclassrooms.com/fr/courses/4 ... riere-plan

Code : Tout sélectionner

/usr/bin/python /home/pi/MU.py &
/usr/bin/python /home/pi/NMU.py & 
exit 0
Par contre tant que NMU ne fonctionne pas seul, cela ne devrait pas le faire fonctionner pour autant !
A+

cide
Messages : 9
Enregistré le : mer. 31 mars 2021 14:37

Re: comprendre python

Message par cide » mer. 14 avr. 2021 20:57

Merci pour votre aide. J'ai bien pris le temps de lire et comprendre ce dont vous parlez mais vos solutions ne fonctionnaient pas.

J'en suis donc arrivé à la conclusion que peut être une ligne de code devait empêcher une autre de fonctionner. J'ai trouvé et j'ai remplacé dans mon code :

while GPIO.input(CAMERA) == 1 : (je me suis dit qu'une boucle while pouvait empêcher de passer à le suite)
par
if GPIO.input(CAMERA) == 0 :

et maintenant le code fonctionne correctement en un seul programme. Cependant, je ne comprends pas pourquoi le premier code fonctionne avec while GPIO.input(CAMERA) == 1 : alors que dans GPIO.setup j'active la résistance pull up en interne. Donc pour moi, while GPIO.input(CAMERA) == 1 égale toujours 1, tant que je n'appuie pas sur le bouton (connecté à la masse) ,vu que le potentiel au repos est tiré vers le 3.3V et donc vaut 1. Alors, selon ma logique, le programme devrait se lancer directement sans avoir besoin d'appuyer sur le bouton mais ce n'est pas le cas. Bref, tout ca pour dire que mon code fonctionne maintenant comme je voulais. Je vous remercie pour votre aide.

Je me lance dans Pyaudio. Ce topic est résolu.

Répondre

Retourner vers « Python »