Pages: [1] 2   Go Down
Author Topic: Arduino+ script python  (Read 1641 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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:

Code:
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.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1250
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
Va voir le tuto suivant : http://skyduino.wordpress.com/2011/11/03/tutoriel-arduino-et-ethernet-shield/
Il y a un exemple en python
@+
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut

Comme IDE pour Python moi j'utilise ça : http://sourceforge.net/projects/drpython/

A+
chabot380
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ç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:

Code:
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
« Last Edit: November 20, 2012, 06:06:24 am by neroz » Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3560
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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, .....
Logged

0
Offline Offline
God Member
*****
Karma: 39
Posts: 988
Get Bitlash: http://bitlash.net
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
http://bitlash.net
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
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
Code:
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.
Logged

0
Offline Offline
God Member
*****
Karma: 39
Posts: 988
Get Bitlash: http://bitlash.net
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cela ne fonctionne toujours pas
Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quel python ?
2.xx ou3.xx ?
certaines librairies du 2 ne marche pas sur le 3  smiley-confuse
Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je suis en python 3.2

Mais normalement pyserial fonctionne avec python 3.2
Logged

Biganos
Offline Offline
Sr. Member
****
Karma: 2
Posts: 362
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut
Code:
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.
« Last Edit: November 21, 2012, 11:24:05 am by chabot380 » Logged

ORDINAUSORE 2Ghz AMD64 QUI S'ALLUME EN 48 SECONDES AVEC UBUNTU 12.04
ARDUINO UNO / Shield Ethernet / RTC DS1307
Programmation Python et j'apprends le C
Technicien Télé Vidéo à la retraite.

Offline Offline
Newbie
*
Karma: 1
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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()
Logged

Pages: [1] 2   Go Up
Jump to: