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 :

Détections sur entrées de GPIO et traitement associé


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut Détections sur entrées de GPIO et traitement associé
    Bonjour à tous

    La structure suivante est utilisée pour afficher les données de course d'un circuit 24.
    Or si les voitures passent en même temps la ligne, la deuxième détection est perdue.
    Pourriez vous me dire si par le threading ou par autre chose je peux améliorer mon programme

    Merci d'avance

    Code algo : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Tant que...
            if attentePassage() == 1:
                ...
                texte1 = pilote1
                texte4 = calculTempsTour()
                Mise a jour de champs dans une fenêtre...
                ...
     
            else:
                texte1 = pilote2
                texte4 = calculTempsTour()
                Mise a jour de champs dans une fenêtre...
                ...
            ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def attentePassage():
        while True:
            if GPIO.input(button1)==0: 
                return(1) #renvoi numPiste = 1
     
            if GPIO.input(button2)==0: 
                return(2) #renvoi numPiste = 2

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut,

    Si le signal a détecter est un carré qui dure T s., il faudrait pouvoir lire l'état des N pins dans un intervalle de temps "petit" devant T/N.

    Ce qui veut dire qu'attente passage ne se contente pas de sortir quand il trouve un carré quelque part mais la liste des N états où au moins un est à 0.

    Les threads ne vont rien apporter car avec Python, vous utiliserez au mieux un CPU: la lecture restera séquentielle avec en plus l'overhead du changement de thread par rapport à une lecture séquentielle.

    Par contre, vous devriez pouvoir utiliser GPIO.add_event_detect... ou demander de l'aide dans un forum plus "hardware".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def attentePassage():
        pistes = {1,2}
        while pistes:
            if 1 in pistes and GPIO.input(button1)==0: 
                pistes.remove(1)
                yield(1) #renvoi numPiste = 1
     
            if 2 in pistes and GPIO.input(button2)==0:
                pistes.remove(2)
                yield(2) #renvoi numPiste = 2
     
    for p in attentePassage():
        print(p)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def attentePassage():
        pistes = [1,2]
        while pistes:
            if 1 in pistes and GPIO.input(button1)==0: yield(pop(0))
            if 2 in pistes and GPIO.input(button2)==0: yield(pop(1))
     
    for p in attentePassage():
        print(p)

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Bonjour
    Merci pour la réponse de W

    Pour les threads, ce que j’ai réussi à comprendre dans les docs me fait également penser que les threads ne m’apportent rien au niveau du temps de traitement.
    Pour ce traitement j’ai 2 tâches prioritaires : la détection de la voiture (attentePassage) et le calcul du temps au tour (calculTempsTour).

    L’affichage reste secondaire. Je pensais qu’il y aurait éventuellement une solution avec une pile (identification et temps) mais avec 2 threads le problème serait probablement l’accès à cette pile.
    Un thread en écriture et l’autre en lecture/écriture.
    Pour ce qui est du traitement des interruptions, tel que je le connais sur le GPIO, je ne gagne rien au niveau du temps de traitement, mais c’est vrai que la détection du front montant du signal est plus appropriée pour le passage d’une voiture au ralenti (signal pas trop long qui ne peux pas être détecté 2 fois).

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Merci Josmiley pour la réponse

    J'ai regardé vite fait et je crois que c'est une bonne solution.
    Je vais prendre le temps de regarder ça

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 742
    Par défaut
    Salut,

    Citation Envoyé par tm68780 Voir le message
    (signal pas trop long qui ne peux pas être détecté 2 fois).
    C'est pour çà que l'approche séquentielle doit être "au pire" lire les N ports et retourner ou pas la liste de l'état de chaque port si l'un d'entre eux (ou plusieurs) est passé à 0.
    note: si détecte un port qui est passé à 0, puis on le traite et on retourne voir s'il y a un autre port à traiter ajoute du délai entre 2 lectures successives (et encore plus si on repart à lire la séquence de tous les ports).

    Citation Envoyé par tm68780 Voir le message
    la détection du front montant du signal est plus appropriée pour le passage d’une voiture au ralenti (signal pas trop long qui ne peux pas être détecté 2 fois).
    Le problème du polling est qu'on bouffe déjà un CPU pour scanner l'état des ports. On va pouvoir réaliser N scans par secondes et détecter une transition plus grande que 1/N secondes d'un facteur k.

    Si vous associez un callback à la détection d'une transition, vous pouvez gérer autrement la contrainte CPU: le callback se contentant d'ajouter un évènement à traiter dans une pile/liste/Queue.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 99
    Par défaut
    Salut Josmiley

    Je crois que le code prend effectivement en compte toutes les détections (même très rapprochés) mais il ne fonctionne que si les voitures se suivent.
    Si le 1 a un tour d'avance il ne sera pas compté.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/06/2008, 19h15
  2. [C#] Comment détecter l'appui sur 'Entrée' ?
    Par ArHacKnIdE dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/01/2008, 17h05
  3. Détection d'entré de la souris
    Par soad dans le forum 2D
    Réponses: 6
    Dernier message: 10/02/2007, 21h35
  4. faire réagir un textarea lors de l'appui sur entrée
    Par keumlebarbare dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/10/2006, 17h12
  5. gestion JTable sur entrée
    Par noussa_nouha dans le forum Composants
    Réponses: 9
    Dernier message: 03/08/2006, 12h34

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