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 :

Pas moyen d'écrire des données vers l'arduino avec python


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut Pas moyen d'écrire des données vers l'arduino avec python
    Salut je galère à écrire des données vers l'Arduino

    voici le petit programme tout simple pour basculer des relais

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include "Adafruit_MCP23017.h"
    #include "Wire.h"
     
    Adafruit_MCP23017 mcp;
     
    void setup() {
    mcp.begin();
    for (int pin = 0; pin  < 16; pin ++)
        {
            mcp.pinMode(pin, OUTPUT);
        } 
    for (int pin = 0; pin < 16; pin++)
        {
            mcp.digitalWrite(pin, HIGH); 
        }
    Serial.begin(9600);   
    }
    void loop() {
        if(Serial.available())
        {        
            String pinstr = Serial.readStringUntil(',');
            String commandestr = Serial.readStringUntil('\n');
            int pin = pinstr.toInt();
            int commande = commandestr.toInt();
     
            switch (commande) {
              case 0:
                  mcp.digitalWrite(pin, HIGH);
                  break;
              case 1:
                mcp.digitalWrite(pin, LOW);
                  break;
            }
     
        }
    }
    Je cherche donc à envoyer le pin et 0 pour low ou 1 pour high

    en Python3 en mode console ça passe nickel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
    [GCC 8.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import serial
    >>> ser = serial.Serial('/dev/ttyUSB0', 9600)
    >>> ser.write(b'1,1')
    3
    >>> ser.write(b'1,0')
    3
    >>>
    Par contre en mode fichier la rien ne passe .... je lance

    python3 pilote.py 1 1

    par d'erreur mais l'arduino n'interprete pas bien ce que j'envoi, surement un mauvais encodage ...

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import sys
    import serial
    import time
     
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1, writeTimeout=1)
    if (ser.isOpen()):
            print("open")
            arg1=sys.argv[1]    
            arg2=sys.argv[2]
            pin=arg1+","+arg2
            print (type(pin))
            pin=bytes(pin,'utf-8')
            print(pin)
            ser.write(pin) 
            ser.close()

    Un peu aide merci

  2. #2
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour fennec62

    Je n'ai pas Python donc j'ai fait des essais depuis le moniteur de l'IDE Arduino.
    J'ai donc corrigé, un petit peu ta loop() ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void loop() {
    	if(Serial.available())
    	{
    		String pinstr = Serial.readStringUntil(',');
    		String commandestr = Serial.readStringUntil('\n');
    		int pin = pinstr.toInt();
    		int commande = commandestr.toInt();
     
    		mcp.digitalWrite(pin,commande);
    	}
    }
    En envoyant
    4,1
    ou
    4,0
    ça fonctionne.
    Essayé avec un PCF8574

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Merci je teste

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


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

    Il se trouve que l'Arduino a la désagréable manie de faire un reset quand le programme Python établit une communication série via le connecteur USB, chose qui ne se produit pas en ligne de commande. Et pendant que l'Arduino se réinitialise, pas de réception possible...
    Le moyen le plus simple, rajouter un time.sleep(2) ou time.sleep(3) juste après l'ouverture du port, le temps que l'Arduino se réinitialise.

    Je sais qu'il y a un aussi autre moyen hardware pour éviter ce reset, si je le retrouve...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String commandestr = Serial.readStringUntil('\n');
    Dans ce cas, j'aurais bien ajouté un \n:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    pin = arg1 + "," + arg2 + "\n"

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


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    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 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Il se trouve que l'Arduino a la désagréable manie de faire un reset quand le programme Python établit une communication série via le connecteur USB...
    Vu dans la doc,
    The Uno board contains a trace that can be cut to disable the auto-reset. The pads on either side of the trace can be soldered together to re-enable it. It's labeled "RESET-EN".
    You may also be able to disable the auto-reset by connecting a 110 ohm resistor from 5V to the reset line

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Merci chef

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/03/2008, 16h32
  2. [Access 2002] Exporter des données vers une base Access 2.0
    Par SamLeChiseuji dans le forum Access
    Réponses: 27
    Dernier message: 01/06/2006, 11h41
  3. exporter des données vers EXCEL!
    Par JauB dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 25/11/2005, 15h13
  4. Réponses: 7
    Dernier message: 29/09/2005, 10h19
  5. [socket] envoyer des données vers un port com
    Par Slimer dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 20/07/2004, 17h35

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