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

Arduino Discussion :

Problème de script python pour piloter un arduino


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    artisan
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Problème de script python pour piloter un arduino
    Bonjour à tous !

    Je suis débutant dans le monde de l’Arduino et de la programmation. J’ai comme objectif de réaliser un bras robotisé constitué de trois servo pour mettre en place ou retirer un couvercle de télescope afin d’automatiser les prises de vues nocturne.
    A l’aide de mBlock et divers morceaux de programme glanés sur le net, j’ai réussi à écrire une petite application fonctionnelle pour l’arduino qui me permet de piloter la fonction d’ouverture et fermeture en local à l’aide de deux boutons poussoir ou par l’intermédiaire de commandes envoyées sur le port série via la prise usb.
    Voici le programme Arduino:

    Code arduino : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    #include <Arduino.h>
    #include <Servo.h>
     
     
    Servo ServoCapot;
    Servo ServoRotation;
    Servo ServoTranslation;
    const int boutonfermeture2 = 2;
    const int boutonouverture3 = 3;
    String commande;
    int AngleServoCapot;
    int AngleServoRotation;
    int AngleServoTranslation;
    int reception;
     
     
     
     
    void setup()
    {
        Serial.begin(115200);
        Serial.flush();
        ServoCapot.attach(10, 500, 2475); // init pin
        ServoRotation.attach(9, 500, 2475); // init pin
        ServoTranslation.attach(8, 500, 2475); // init pin
        pinMode(boutonfermeture2,INPUT);
        pinMode(boutonouverture3,INPUT);
        ServoCapot.write(0); // write to servo
        ServoRotation.write(137); // write to servo
        ServoTranslation.write(47); // write to servo
        AngleServoCapot = 0;
        AngleServoRotation = 137;
        AngleServoTranslation = 47;
     
    }
     
     
    void loop() 
    {             // put your main code here, to run repeatedly:
     
       while (Serial.available() > 0)
      {
        reception = Serial.read();
        commande += char(reception);
        delay(5);
      }
     
      if (commande != "")
      {
        traitementserial(); // Appel de la fonction
      }
       if(digitalRead(2) == HIGH)
        {
           fermeture(); // Appel de la fonction
        }
        if(digitalRead(3) == HIGH)
        {
           ouverture(); // Appel de la fonction
        }
    }
     
    // Fonctions
     
    void ouverture() // Fonction de traitement de l'ouverture
    { 
            while(!(((AngleServoTranslation)==(137))))
            {
                _loop();
                ServoTranslation.write((AngleServoTranslation) + (1)); // write to servo
                AngleServoTranslation += 1;
                _delay(0.02);
            }
            _delay(1);
            while(!(((AngleServoCapot)==(180))))
            {
                _loop();
                ServoCapot.write((AngleServoCapot) + (1)); // write to servo
                AngleServoCapot += 1;
                _delay(0.02);
            }
            _delay(1);
            while(!(((AngleServoRotation)==(47))))
            {
                _loop();
                ServoRotation.write((AngleServoRotation) - (1)); // write to servo
                AngleServoRotation += -1;
                _delay(0.02);
            }
     }
     
     void fermeture() // Fonction de traitement de la fermeture
      { 
       while(!(((AngleServoRotation)==(137))))
            {
                _loop();
                ServoRotation.write((AngleServoRotation) + (1)); // write to servo
                AngleServoRotation += 1;
                _delay(0.02);
            }
            _delay(1);
            while(!(((AngleServoCapot)==(0))))
            {
                _loop();
                ServoCapot.write((AngleServoCapot) - (1)); // write to servo
                AngleServoCapot += -1;
                _delay(0.02);
            }
            _delay(1);
            while(!(((AngleServoTranslation)==(47))))
            {
                _loop();
                ServoTranslation.write((AngleServoTranslation) - (1)); // write to servo
                AngleServoTranslation += -1;
                _delay(0.02);
            }
        }
     
     void traitementserial() // Fonction de traitement de la commande
    {
      if (commande == "ouverture")
      {
        ouverture();
      }
      else if (commande == "fermeture")
      {
        fermeture();
      }
        else
      {
        Serial.print("Commande '" + commande + "' inconnue : ");// Traitement de la commande inconnue.
      }
     
      if ((AngleServoTranslation)==(47))
      {
        Serial.println("Capot fermé");
      }
      if ((AngleServoTranslation)==(137))
      {
        Serial.println("Capot ouvert");
      }
        commande = "";
    }
     void _delay(float seconds){
        long endTime = millis() + seconds * 1000;
        while(millis() < endTime)_loop();
    }
     
     void _loop(){
     
    }

    J’ai ensuite adapté un petit programme python que j’ai trouvé sur le très intéressant tutoriel « Piloter Arduino depuis un PC avec Python et Boa Constructor » à l’adresse suivante :
    https://herve-troadec.developpez.com...-boa/#LVII-B-5

    Ce programme me permet d’envoyer les commandes nécessaires à l’Arduino pour ouvrir et fermer le couvercle.
    Voici le programme python:

    Code Python version 1 : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #!/usr/bin/python
    # coding: utf8
     
    import serial
    import time
     
    print("Initialisation du port")
    portCom = serial.Serial()
    portCom.port = "/dev/cu.usbserial-1420"
    portCom.baudrate = 115200
     
    print("Ouverture du port...")
    try:
      portCom.open()
    except serial.SerialException:
      print("Un problème s'est produit à l'ouverture du port.\n"
        "Vérifiez que le port utilisé par la carte Arduino est\n"
        "bien '/dev/cu.usbserial-1420'. Si ce n'est pas le cas, modifiez\n"
          "le script Python en conséquence.")
      saisie = ""
      while saisie != "q":
          saisie = str(raw_input("Entrer 'q' pour quitter: "))
     
    while portCom.is_open:
      commande = str(raw_input("Saisir une commande ('q' pour quitter): "))
      if commande != "q":
        portCom.write(commande)    
        time.sleep(10)
        nbCar = portCom.in_waiting
        retour = portCom.read(nbCar)
        print(retour)
        portCom.reset_input_buffer()
      else:
        portCom.close()

    Mais mes connaissances en programmation ne me permettent pas de modifier ce programme comme j’aimerais qu’il soit.
    En fait, j’aimerais le simplifier au maximum. L’idée est de garder la possibilité de le quitter si il rencontre des difficultés à se connecter au port série de l’arduino mais j’aimerais ne pas avoir à écrire la commande d’ouverture ou de fermeture. Je voudrais avoir deux scripts, un pour l’ouverture et un autre pour la fermeture. Ces scripts envoient juste la commande à l’arduino, vérifient que la commande a bien été envoyée et si oui, il quitte ou si non, un message « erreur » s’écrit.
    J’ai essayé ceci mais cela ne marche pas bien. Le programme s’arrête comme si la condition « if retour == "Capot ouvert »: » ne fonctionnait pas
    Voici le programme python modifié:

    Code python version 2 : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #!/usr/bin/python
    # coding: utf8
     
    import serial
    import time
     
    print("Initialisation du port")
    portCom = serial.Serial()
    portCom.port = "/dev/cu.usbserial-1420"
    portCom.baudrate = 115200
     
    commande = "ouverture"
     
    print("Ouverture du port...")
    try:
      portCom.open()
    except serial.SerialException:
      print("Un problème s'est produit à l'ouverture du port.\n"
        "Vérifiez que le port utilisé par la carte Arduino est\n"
        "bien '/dev/cu.usbserial-1420'. Si ce n'est pas le cas, modifiez\n"
          "le script Python en conséquence.")
      saisie = ""
      while saisie != "q":
          saisie = str(raw_input("Entrer 'q' pour quitter: "))
     
    while portCom.is_open:
        portCom.write(commande)    
        time.sleep(10)
        nbCar = portCom.in_waiting
        retour = portCom.read(nbCar)
        if retour == "Capot ouvert":
            print(retour)
            portCom.reset_input_buffer()
            portCom.close()
        else:
            print("erreur")
            portCom.close()

    Si certains d’entre vous peuvent m’aiguiller, ce serait super cool !

    L’idée, au finale, est de faire deux scripts exécutables à l’aide de py2app.

    Merci par avance…

  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,

    Tu met ton print(retour) à l'intérieur de la condition donc, si elle n'est pas vraie, tu ne peux pas savoir pourquoi.

  3. #3
    Candidat au Club
    Homme Profil pro
    artisan
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Tu met ton print(retour) à l'intérieur de la condition donc, si elle n'est pas vraie, tu ne peux pas savoir pourquoi.
    Oui, effectivement. Je l'ai donc placé avant la condition et je l'ai mis aussi comme message d'erreur.
    mais rien ne s'écrit, donc la commande venant de l'arduino n'est pas lu. Pourquoi, alors que le script précédant fonctionne très bien avec la même fonction de lecture du port série.
    Comme ci la boucle "while portCom.is_open:" fonctionnait mal.

    Bon, en même temps, je suis vraiment nul en programmation.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par astrofab Voir le message
    Comme ci la boucle "while portCom.is_open:" fonctionnait mal.
    La boucle ne sert à rien: quelque soit le cas, vous faites un port.close()...

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

  5. #5
    Candidat au Club
    Homme Profil pro
    artisan
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    La boucle ne sert à rien: quelque soit le cas, vous faites un port.close()...

    - W
    Oui, mais dans un cas, ça devarit me dit que la fonction a bien été exécutée, dans l'autre je devrais avoir un message d'erreur. Or, rien ne s'écrit.
    Apres, oui, dans les deux cas le programme quitte. C'est voulu.

  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
    Citation Envoyé par astrofab Voir le message
    Oui, effectivement. Je l'ai donc placé avant la condition
    Non, tu l'as placé dans la condition, donc inutile et dans le else tu print simplement "erreur".

    Pas plus utile ça.

  7. #7
    Candidat au Club
    Homme Profil pro
    artisan
    Inscrit en
    Avril 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan

    Informations forums :
    Inscription : Avril 2019
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Non, tu l'as placé dans la condition, donc inutile et dans le else tu print simplement "erreur".

    Pas plus utile ça.
    Quand j'écris "je l'ai donc placé" je voulais dire que j'ai essayé de le mettre avant et à la place du message d'erreur pour être sur de voir ce qui arrive de l'arduino.
    Comme rien ne s'écrit, j'en déduit que le programme n'arrive pas à lire la commande venant de l'arduino.
    Pourtant, il y arrive très bien avec le programme python version 1

    C'est pour cette raison que je demande de l'aide parce que je ne vois pas pourquoi.

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 639
    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 639
    Points : 56 970
    Points
    56 970
    Billets dans le blog
    40
    Par défaut
    Salut,

    Essaie en rajoutant un time.sleep(3) juste après l'ouverture du port COM. Explications ici.

Discussions similaires

  1. Problème de script VB pour comparateurs sur plusieurs feuille
    Par Kerberos69 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/03/2009, 13h49
  2. Migration sunopsis v4/ODI problème du script jython pour FTP
    Par gusy78 dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 30/07/2008, 14h21
  3. SUNOPSIS/ODI problème de script Jython pour FTP
    Par bmontandon dans le forum ODI (ex-Sunopsis)
    Réponses: 2
    Dernier message: 01/10/2007, 14h02
  4. [Cherche tuto/cours]Script Python pour Unix
    Par elflamby dans le forum Général Python
    Réponses: 2
    Dernier message: 05/09/2007, 14h38
  5. problème de script php pour revenir à la page précédente
    Par mandyben dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2006, 10h12

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