IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Python 3.X] Plusieurs actions simultanées - Rpi


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 30
    Points
    30
    Par défaut [Python 3.X] Plusieurs actions simultanées - Rpi
    Bonjour,

    Cela fait un moment que je n'ai pas posté, je me débrouille comme je peux avec mes maigres connaissances, beaucoup de tutos, sujet déjà présents, mais là je sèche un peu.
    Il s'agit d'une IHM assez imposante (en terme de composants, boutons, etc) associée à mon Raspberry Pi Zero, pour un jeu coopératif pour mes enfants. Le fait que ce soit sur Raspberry n'a pas vraiment d'importance dans un premier temps, ma question concerne Python pur.
    J'ai besoin, à un moment donné, de faire plusieurs actions simultanées, je vous donne un exemple très concret :
    J'ai une espèce de chenillard qui présente un code couleur (aléatoire à chaque partie). Celui-ci doit tourner tout le temps sans s'arrêter (admettons led rouge, led bleue, led jaune, répété à l'infini).
    Et avec ce code, le jeu consiste à connecter des câbles sur les bornes de couleurs correspondantes aux codes (peut d'apparenter à des interrupteurs de couleur).
    Le problème c'est que tant que ma "boucle infinie" ne se termine pas, je ne peux jamais détecter l'action sur un quelconque interrupteur.
    Auriez vous une piste ? Un outil à utiliser ? Une fonction déjà existante ?
    J'ai peur de ce que vous allez m'annoncer, j'ai vu du multi-threading, de la POO (je n'en fais pas du tout je code très procédurier, la base des bases).

    Merci de vos lumières.

    La photo du projet pour ceux qui se poseraient la question ;-)

    Nom : IMG_20180118_175908.jpg
Affichages : 926
Taille : 252,1 Ko

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ben oui, si ton code tourne en boucle pour le chenillard, il ne fera pas autre chose en même temps.

    Ça se solutionne en général avec un thread et de manière assez simple rassure-toi.

    Soit tout le chenillard sera dans un thread, soit tu lances des Timer (un thread de temporisation) en boucle mais de toutes façons tu gardes ton programme principal à l'écoute des signaux provenant du hardware.

    Difficile de t'en dire plus sans voir ton code.

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 600
    Points : 56 698
    Points
    56 698
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Citation Envoyé par esope60 Voir le message
    Le problème c'est que tant que ma "boucle infinie" ne se termine pas, je ne peux jamais détecter l'action sur un quelconque interrupteur.
    La bibliothèque RPi.GPIO comprend une fonction GPIO.add_event_detect qui permet de lancer un thread sur détection de front d'une entrée, à la façon d'une interruption sur microcontrôleur Interruption et détection de front

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    merci pour ces éléments de réponse.

    Voilà j'ai fait un bout de code simplifié pour vous montrer l'exemple type :

    Donc le but serait que ces 2 bidules tournent en même temps :
    il manque des choses, des imports, etc, mais c'est pour vous donner une idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    def chenillard():
        boucle = True
        while boucle:
            #digitaWrite est une sortie GPIO du raspberry configuré soit 0V ou +3.3V
            digitalWrite(25,HIGH)
            digitalWrite(26,HIGH)
            digitalWrite(27,HIGH)
            time.sleep(.05)
            digitalWrite(25,LOW)
            digitalWrite(26,LOW)
            digitalWrite(27,LOW)
            time.sleep(.05)
     
    def bouton():
        #25 est le numéro d'entrée GPIO (broche du raspberry)
        interrupteur_0 = 35
        appui = True
        while apui:
            #mcp1 est un microcontrolleur style mille patte définie avant.
            if mcp1.input(interrupteur_0) == False
            print("gagné")
            appui = False
            time.sleep (0.02)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Bonsoir,



    La bibliothèque RPi.GPIO comprend une fonction GPIO.add_event_detect qui permet de lancer un thread sur détection de front d'une entrée, à la façon d'une interruption sur microcontrôleur Interruption et détection de front
    C'est fort intéressant et correspondrait à mon besoin mais le problème c'est que je n'utilise pas directement les GPIO, j'utilise soit des Shift-register, soit des MCP qui fonctionnent avec juste 2 pins de multiplexage du bus I2C.
    Donc je ne peux utiliser la bibliothèque de base GPIO.
    Malheureusement il n'y a qu'une quinzaine d'entrée.sortie utilisables sur le raspberry, moi j'ai besoin d'une bonne centaine, d'où les composants supplémentaires.

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Vu ton code tu peux mettre simplement ton chenillard dans un thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    from threading import Thread
     
    run = True
     
    def chenillard():
        global run
        if run:
            digitalWrite(25,HIGH)
            ...
     
    def ..
     
    if __name__ == "__main__":
        Thread(target=chenillard).start()
        # ici tu lances ton appli
    Et pour stopper le chenillard il te suffit de mettre la globale run à False

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    Génial si ça peut marcher comme ça. merci beaucoup
    Du coup autre question, ceci peut fonctionner si j'ai plusieurs fonctions simples définies (style chenillard) en même temps, ou on ne peut mettre qu'un seul thread en plus du programme principal ?
    Merci beaucoup !

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Tu peux lancer autant de threads que tu veux mais Python ne permet qu'une exécution à la fois et c'est ton os qui décide quel thread s'exécute à quel moment.

    Si tu en lances un grand nombre en même temps ça peut donner des résultats surprenant.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 43
    Points : 30
    Points
    30
    Par défaut
    OK, en fait si tu en mets plusieurs en même temps, tu as l'illusion qu'ils fonctionnent en même temps mais c'est du multi tâche, à tour de rôle quoi.
    L'illusion suffit à mon besoin ;-)

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Plusieurs actions simultanément
    Par Meloody dans le forum MATLAB
    Réponses: 24
    Dernier message: 17/12/2012, 10h29
  2. Plusieurs action simultané
    Par topolino dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/06/2009, 11h03
  3. Réponses: 6
    Dernier message: 15/04/2004, 11h04
  4. [KeyEvent] plusieurs touches simultanées enfoncées
    Par gege2mars dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/01/2004, 11h44
  5. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo