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

  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 confirmé Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    février 2013
    Messages
    182
    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 : 182
    Points : 465
    Points
    465

    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 379
    Points : 44 376
    Points
    44 376
    Billets dans le blog
    9

    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
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 10 379
    Points : 44 376
    Points
    44 376
    Billets dans le blog
    9

    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 Devil-Atomic666 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. 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