Contrôler arduino via python ( débutant )

Bonjour,

je suis nouveau sur le forum, pour un projet en terminale S-SI j’ai fait commander une carte arduino UNO (Rev3) et je l’ai reçu il y a 2 jours. J’ai fait mes premières expériences avec le langage arduino (de petit test, allumer LED, afficher son état, etc …) que je trouve d’ailleurs simple à utiliser, car je programme un peu du C et C++ :).
Pour notre projet, on est 2 (dont moi) qui nous occupons de la partie programmation et j’ai besoin de pouvoir contrôler la carte arduino avec du python (si vous voulez connaître notre projet très ambitieux merci de le dire dans les réponses et je prendrai la peine d’expliquer notre grand projet ;)).
Maintenant, après beaucoup de recherches sur internet, forums et blogs anglais pour découvrir comment contrôler notre arduino j’ai un problème. J’ai réussi à installer la dernière version de Pyserial (qui est déjà assez compliqué), et j’ai quelques bases en python. Pour l’instant j’arrive à me connecter à mon port serial via python (après beaucoup de recherche également), et maintenant je voudrais pour commencer “seulement” pouvoir allumer et éteindre une LED via python. J’ai copié en partie du code d’un site mais qui datait et qui ne marchait plus à cause de la version de Python (la j’ai la dernière version de Python 3.2.xxx). Après 36 essaient je n’y arrive pas, alors je me suis dit avant de devenir fou je vais vous demander! :D. Voici le code sur l’arduino (qui marche lorsqu’on ouvre le moniteur série et qu’on envoi Y ou N pour allumer ou éteindre) :

  int ledPin = 13;  // choose the pin for the LED  
  int val = 0;      // variable for reading the pin status  
  int msg;   // variable to hold data from serial  
  
  void setup() {  
    pinMode(ledPin, OUTPUT);      // declare LED as output  
    Serial.begin(9600);  
    Serial.print("Program Initiated\n");  
  }  
    
  void loop(){  
          // While data is sent over serial assign it to the msg  
      while (Serial.available()>0){  
          msg=Serial.read();  
      }  
    
    // Turn LED on/off if we recieve 'Y'/'N' over serial  
    if (msg=='Y') {  
      digitalWrite(ledPin, HIGH);  // turn LED ON  
      Serial.print("LED Activated\n");  
      msg=' ';  
    } else if (msg=='N') {  
      digitalWrite(ledPin, LOW); // turn LED OFF  
    }  
  }

Et voici le code en python qui pause problème :

import serial  
import time  

yes="Y"
locations=['/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3','COM4']    
  
for device in locations:  
    try:  
        print ("Trying...",device) 
        arduino = serial.Serial(device, 9600)  
        break  
    except:  
        print ("Failed to connect on",device)     
  
print(arduino.readline())
time.sleep(2)
while 1:
    arduino.write(yes)

Alors j’ai essayer tout (ou presque) sans succès =(, avec un délai d’attente (car vue sur un forum que c’était peut être sa), sans, avec la boucle while, sans et je pense que ce qui pose problème est le arduino.write(), car python me met une erreur :
Traceback (most recent call last):
File “C:\Users\Daniel\Desktop\testarduino.py”, line 18, in
arduino.write(yes)
File “C:\Python32\lib\site-packages\serial\serialwin32.py”, line 258, in write
data = bytes(data)
TypeError: string argument without an encoding
la variable n’est pas le bon type j’imagine, mais j’ai vraiment tout essayer et même mis msg dans le code arduino en int, avant il était de type char dans le code python (code hex, binaire, string, bytes, …) sans que sa marche jamais :frowning:

Si vous avez d’autres questions n’hésitez pas, merci de m’aider !! :slight_smile:

P.S. : Désoler pour mon orthographe

Bonsoir,

Voici ce que j’utilise en python via un module Bluetooth pour communiquer les informations à ma carte Arduino.
Cela peut t’aider, il faut peut-être modifie le code.

test.py (1.32 KB)

Salut

Linux ou windows ? sous linux ce serai plutôt : /dev/ttyACM0 sous windows voir sous quel COM le système te l'a mis !

A+ chabot380

Salut !! :)

@ nolimit60 merci beaucoup pour ton code python sa marche ! :) c'est juste à cause du .encode() qui manquait alors ? Sinon je suis en train de décortiquer ton code pour essayer de bien le comprendre, je vais faire des recherches sur les fonctions que tu as employées ! En tout cas merci de m'avoir aider c'est un bon pas en avant pour moi ;).

@chabot380 je suis sous windows 7 64 Bit, comme dit j'arrive à me connecter au port serial (c'est le COM4 chez moi) c'est parce que j'ai laisser les /dev/ttyACM0 que tu pensais que j'étais sous linux j'imagine, en faite c'est juste pour que mon code python fonctionne également sous une autre machine linux :)

Merci tous deux pour vos réponses rapide, je posterai le projet si vous voulez, car j'aurai surement d'autres questions ;)