Arduino+ script python

Bonjour à tous,

Afin de développer mes compétences en arduino et surtout en robotique, j'ai envie d'interfacé un script python d'une manette de PS2 à l'arduino.

Le problème c'est que je ne vois pas comment interfacé les deux parties

j'ai suivi ce tutoriel, http://www.stealthcopter.com/blog/2010/02/python-interfacing-with-an-arduino/ qui permet d'allumer une led par liaison série, puis de l'allumer avec un script python.

Voilà le code pour la liaison série de l'arduino:

int ledPin = 13;  // choose the pin for the LED
int val = 0;      // variable for reading the pin status
char 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
  }
}

Ainsi que le code du script python:

import serial  
import time  
  
locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3',  
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3']    
  
for device in locations:  
    try:  
        print "Trying...",device  
        arduino = serial.Serial(device, 9600)  
        break  
    except:  
        print "Failed to connect on",device     
  
try:  
    arduino.write('Y')  
    time.sleep(1)  
    print arduino.readline()  
except:  
    print "Failed to send!"

Donc la led s'allume bien avec la liaison série d'arduino, mais ensuite, je ne vois vraiment pas comment utiliser le script python. J'ai installé pygame, "pyserial", mais ça ne m'avance pas plus.

Il ne faut pas installer un logiciel pour créer la liaison série pour le script?

Je suis sous windows et j'utilise notepad pour le script python.

Question en plus, est-ce qu'il y en a qui ont réussi à installer Eclipse sur windows, car moi je galère un peu après l'avoir paramétré plusieurs fois j'ai toujours une erreur à la fin.

Merci d'avance.

L'allumage de LED te permet de voir quelles sont les étapes de part et d'autre de ta liaison pour que les deux parties (ton arduino et ton pc) se parlent et se comprennent, à savoir Python vérifie que l'arduino est là, lui envoie un caractère, et Arduino lit ce caractère et agit en conséquence.
La suite, avec ta manette de PS2, ben ça dépend de ce que tu veux faire, mais globalement ça fonctionnera sur le même principe.
J'imagine que tu veux controler des choses branchées sur l'arduino avec ta manette branchée à ton pc ?
Dis-nous en un peu plus sur ton projet.

Le problème c'est que je n'arrive pas à allumer la led avec mon script python. Je commence par la base pour ensuite faire plus compliquer. Pour le moment j'essaye d'allumer la led et ensuite une fois que j'aurais compris comment faire ça, je passerais à la manette.

J'aimerais en effet, contrôler des choses qui seront branchées sur une arduino. D'abord, j'utiliserais la manette pour commander des leds et des moteurs en ayant l'arduino branché au PC. Ensuite, je passerais par du xbee, pour envoyer les informations (commande moteur...) de la manette qui sera toujours branché au PC à l'arduino qui sera 10 mètres plus loin.

Mais pour le moment, je n'arrive pas à allumer la led avec le script python, je ne vois pas du tout comment faire. Je ne vois pas comment faire pour envoyer un caractère grâce à python, car lorsque je lance mon script il ne fonctionne pas...

Bonsoir,
Va voir le tuto suivant : [Tutoriel] Arduino et Ethernet Shield | Skyduino - Le DIY à la française
Il y a un exemple en python
@+

Salut

Comme IDE pour Python moi j'utilise ça : DrPython download | SourceForge.net

A+
chabot380

ça a l'air intéressant comme IDE, je vais voir comment il fonctionne et si c'est plus simple de l'utiliser

Concernant le tutoriel, je vais modifier mon code afin de pouvoir allumer ma led en espérant que cela fonctionne.

Edit:

import socket
import time
import serial 

print ("~ Client WebLed ~")
locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3','/dev/ttyUSB4'
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3','/dev/ttyS4'] 


	
for device in locations:  
    try:  
        print ("Trying...",device)  
        arduino = serial.Serial(device, 9600)  
        break  
    except:  
        print ("Failed to connect on",device)     
  
try:  
    arduino.write('Y')  
    time.sleep(1)  
    print (arduino.readline())  
except:  
    print ("Failed to send!")  

print ("a+ !")

Voilà le code que j'ai pour python, et il n'arrive à ce connecté à aucun port usb:
~ Client WebLed ~
Trying... /dev/ttyUSB0
Failed to connect on /dev/ttyUSB0
Trying... /dev/ttyUSB1
Failed to connect on /dev/ttyUSB1
Trying... /dev/ttyUSB2
Failed to connect on /dev/ttyUSB2
Trying... /dev/ttyUSB3
Failed to connect on /dev/ttyUSB3
Trying... /dev/ttyUSB4/dev/ttyS0
Failed to connect on /dev/ttyUSB4/dev/ttyS0
Trying... /dev/ttyS1
Failed to connect on /dev/ttyS1
Trying... /dev/ttyS2
Failed to connect on /dev/ttyS2
Trying... /dev/ttyS3
Failed to connect on /dev/ttyS3
Trying... /dev/ttyS4
Failed to connect on /dev/ttyS4
Failed to send!
a+ !

Merci pour vos réponses en tout cas

locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3','/dev/ttyUSB4'
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3','/dev/ttyS4']

Ce sont des noms de périphériques Linux. Sous Windows il faudrait tester COM1, COM2, .....

Il est nécessaire de time.sleep (2) après l'ouverture du port série pour permettre au bootloader de démarrage pour le temps et commencez votre programme. Si vous envoyez des données trop rapidement après l'ouverture du port série peut être perdue, ce qui semble être ce qui se passe dans votre cas.

S'il vous plaît pardonnez ma machine traduits en français.

Cordialement,

-br

J'avance doucement mais sûrement, je sent que la gestion de la manette va être dur vue que je n'arrive même pas à allumer une led.

Donc voici mon code python qui se connecte à mon port (j'ai vérifier et ces bien le COM3) mais le problème c'est que la led ne s'allume toujours pas.

import socket
import time
import serial 

print ("~ Client WebLed ~")
print ("ouverture du port")
ser = serial.Serial("COM3")
ser.baudrate = 9600
time.sleep(2)

print ("port ouvert") 


	
for device in ser:  
    try:  
        print ("Trying...",device)  
        arduino = serial.Serial(device, 9600)  
        break  
    except:  
        print ("Failed to connect on",device)     
  
try:  
    arduino.write('Y')  
    time.sleep(1)  
    print (arduino.readline())  
except:  
    print ("Failed to send!")  

print ("a+ !")

Voici mon code arduino

int ledPin = 13;  // choose the pin for the LED
int val = 0;      // variable for reading the pin status
char 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
  }
}

Quand je passe par la liaison série de l'arduino, la led s’éteint et s'allume bien, mais ne fonctionne pas quand je passe par le script python.

En vous remerciant de votre aide précieuse.

…
print ("~ Client WebLed ~")
print ("ouverture du port")
ser = serial.Serial("COM3")
ser.baudrate = 9600
#time.sleep(2)    # <-- not here please

print ("port ouvert") 
	
for device in ser:  
    try:  
        print ("Trying...",device)  
        arduino = serial.Serial(device, 9600)  
        time.sleep(2)     # <--- here instead please 
        break
…

Best,

-br

Cela ne fonctionne toujours pas

Quel python ?
2.xx ou3.xx ?
certaines librairies du 2 ne marche pas sur le 3 :~

je suis en python 3.2

Mais normalement pyserial fonctionne avec python 3.2

salut

import socket # pas besoin !
import time
import serial 

print ("~ Client WebLed ~")
print ("ouverture du port")
ser = serial.Serial("COM3")
ser.baudrate = 9600
time.sleep(2)

print ("port ouvert") 


	
for device in ser:  
    try:  
        print ("Trying...",device)  
        arduino = serial.Serial(device, 9600)  
        break  
    except:  
        print ("Failed to connect on",device)     
  
try:  
    arduino.write('Y')  
    time.sleep(1)  
    print (arduino.readline())  
except:  
    print ("Failed to send!")  

print ("a+ !")

Pourquoi : ser = serial.Serial("COM3") donc il s'appelle ser
et ensuite : arduino = serial.Serial(device, 9600) il s'appelle arduino ?

Quand tu fais ser =serial.Serial("COM3") tu ouvres ton port ! Je crois que ,vu ci-dessus tu veux ouvrir ton port deux fois. ça ne te donne pas une erreur ?
Avant de relancer ton programme fait un ser.close(), pour fermer le port.

A+

tu peut faire ser=serial.Serial("COM3",9600). pour ouvrir le port en une seul ligne.

D'accord avec Chabot, y'a un micmac dans ta déclaration de port.

Perso j'arrive très bien à communiquer en utilisant la syntaxe suivante:

import serial
import sys

SERIALPORT = "/dev/tty.usbmodem1d11"  #changer selon ton port
try:
	ser = serial.Serial(SERIALPORT, 9600)
except serial.SerialException:
	print "no device connected - exiting"
	sys.exit()

(...instructions...)

ser.write(cequetuveuxenvoyer)
ser.close()

Bonjour,

Il y a effectivement un import inutile (c'est pas beau le copier/coller bêtement ;)) et un gros méli-mélo dans l'ouverture du port série !

Pour le problème du "ça marche avec le serial monitor / ça marche plus avec le script" c'est à mon avis un problème de reset.
De base PySerial ne fait aucun reset du port série, il faut le faire à la main.

Exemple de script python + arduino :

Ps: la fonction readline() est bloquante par défaut.
Il faut juste configurer le timeout à l'ouverture du port série (voir mon exemple).

Ah oui en effet, j'ai un petit problème de port, mais ça ne me faisait pas d'erreur ça ne fonctionne pas c'est tout.

j'avais vu qu'on pouvait faire avec cette ligne : ser=serial.Serial("COM3",9600) mais dans mon cas ça me mettait une erreur.

En tout cas merci pour vos réponses, je vais retourner travaillé mon programme... Je vous tiendrais au courant.

Je ne suis pas très bon en programmation, mais bon ça s'apprend, je n'ai toujours pas compris la logique pourtant j'ai des cours de C,C++, VHDL, mais je ne sais pas je n'arrive pas^^

simple petite remarque, sous linux on execute un programme python directement.
Sous windows il faut créer un executable !
Je pense que tu l'as fait. :roll_eyes:

chabot380

chabot380:
simple petite remarque, sous linux on execute un programme python directement.
Sous windows il faut créer un executable !

Hoho gros troll détecté :wink:

Les scripts python sous windows s'exécutent de la même manière que sous linux.
Une fois l'interpréteur python installé il s'approprie automatiquement les extensions .py ou .pyc.

salut
J'ai dit une connerie ? :roll_eyes:
Sous linux je peux lancer un programme python sans passer par le console.
Sous windows aussi ? Je ne savais pas !
Désolé :grin:

chabot380