Go Down

Topic: [Arduino/Python] Communication port série (Read 165 times) previous topic - next topic

AchrafArd

Bonjour,

j'ai réaliser un montage Arduino qui allume des LED selon la valeur de la variable count :
Quote
const int LED[4]={2,3,4,5};
char count;
 
void setup() {
 
  Serial.begin(9600);
  while (!Serial) {
    // wait for serial port to connect.
  }
  Serial.print("TEST ECHO: ");
  for (int i=0; i<=3;i++) pinMode(LED,OUTPUT);
}
 
void loop() {
  if (Serial.available()>0) {
  count = Serial.read();
  }
  if (count=='0') {
    digitalWrite(LED[0],HIGH);
    digitalWrite(LED[1],LOW);
    digitalWrite(LED[2],LOW);
    digitalWrite(LED[3],LOW);
  }
  if (count=='1') {
    digitalWrite(LED[0],LOW);
    digitalWrite(LED[1],HIGH);
    digitalWrite(LED[2],LOW);
    digitalWrite(LED[3],LOW);
  }
  if (count=='2') {
    digitalWrite(LED[0],LOW);
    digitalWrite(LED[1],LOW);
    digitalWrite(LED[2],HIGH);
    digitalWrite(LED[3],LOW);
  }
  if (count=='3') {
    digitalWrite(LED[0],LOW);
    digitalWrite(LED[1],LOW);
    digitalWrite(LED[2],LOW);
    digitalWrite(LED[3],HIGH);
  }
   
  }
je voudrai pouvoir commander la valeur de la variable count depuis Python en utilisant la bibliothéque pyserial :

Quote
import serial
 
ser = serial.Serial('COM3', baudrate = 9600, timeout = 1)
if ser.isOpen():
    print(ser.name + " is open")
   
ser.write(b'0')
ser.close()
la LED 0 ne s'allume pas bien que la communication est établie, le baudrate est le même des deux cotés, merci de me donner vos suggestions

hazerty565

#1
Jun 09, 2017, 09:29 pm Last Edit: Jun 09, 2017, 09:37 pm by hazerty565
j'ai l'impression que ça vient du ser.write(b'0') <== çà serrait pas plutot ser.write('0') ..??


question con... mais tu es sur que c'est le com3..? tu devrais mettre ser = serial.Serial('COM3', 9600, timeout=0)

tiens, si tu veux, ce site, pourra sans doute t'aider..

http://www.dad3zero.net/201207/communiquez-avec-arduino-en-python/

tu dervrais utilisé switch/ case

switch ( count){
case '0':
// action a faire
break;
case '1':
//action a faire
break;

ect

AchrafArd

Merci hazerty pour ta réponse.
le 'b' de ser.write(b'0') précise que la chaine '0' est de type byte, c'est ce que j'ai trouver dans la documentation. mon Arduino est belle et bien brancher dans le port COM3.
Je tiens a préciser que ce montage est fonctionnel quand je communique avec lui via le Moniteur Série de l'"IDE" d'Arduino

3Sigma

Bonjour,

Il faut rajouter un "retour chariot" du genre ser.write(b'0\n') ou ser.write(b'0\r') ou ser.write(b'0\r\n')

J-M-L

#4
Jun 10, 2017, 10:39 am Last Edit: Jun 10, 2017, 12:01 pm by J-M-L
Non aucune raison d'ajouter un retour chariot puisque le code côté arduino lit à la volée
Il se peut qu'il vous manque juste un flush(apres l'ecriture pour vous assurer que l'octet soit bien envoyé immédiatement et pas bufferisé)

Attention avec un UNO à l'autre bout du port série, quand votre code Python ouvre le port série votre arduino reboote. Il serait bon d'attendre un peu avant de balancer l'octet histoire que votre code soit opérationnel de l'autre côté en attente des commandes et de ne pas ouvrir et fermer le port série en permanence sinon votre arduino va rebooter constamment
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up