transmission sur le port série et allumer une led

Bonjour,

je me permets de vous demander un peu d’aide car je suis bloqué dans mon projet. Il s’agit d’envoyer via python des bytes de données sur mon arduino UNO. Je souhaite allumer une led lorsque le byte vaut « 1 » et éteindre la led sinon.

J'envoie sur le port série des bytes. En effet, j'ai créé un programme sur python qui convertit un message et qui le stocke dans une liste sous forme de bytes, chaque élément (donc 0 ou 1) est ensuite envoyé sur le port série via la bibliothèque pyserial

Je ne suis pas sur d’avoir correctement codé la partie arduino. Je me suis inspiré de certains codes que j’ai pu trouver sur internet.

Pouvez-vous me dire s’il y a des erreurs?

int led=13; 

void setup() {

 Serial.begin(9600);
 pinMode(led, OUTPUT);

}

void loop() {
 while (Serial.available() > 0) {
   int etat=Serial.read();

       if(etat > 0){
         digitalWrite(led,HIGH);
       } 
       else {
         digitalWrite(led,LOW);
       }


     }


 delay(100);
}

Merci beaucoup pour votre aide.

Max

bpnjour,
déjà le code entre balise code </>, merci

après, tu ne lis pas ce qui arrive sur le port série, mais juste si une activité a lieu.
donc un 0 ou 1 ou z revient au même.
inspire toi des exemples de l’ide section communication

merci et désolé pour les balises, je les ai corrigées.

Après avoir regardé les codes exemples je ne vois pas quelle est la fonction qui permet de lire ce qui arrive sur le port série.

D'après ce que j'ai compris il s'agit de:

while (Serial.available() > 0) {
   int etat =Serial.read();

Comment lire sur le port série?

Merci beaucoup pour votre aide.

Max

tu as testé ton code via la console ide?

teste ca via la console de l’ide

  int ledPin = 13;  
  int msg;  
 
  void setup() { 
    pinMode(ledPin, OUTPUT);      
    Serial.begin(9600); 

  } 
   
  void loop(){ 

      while (Serial.available()>0){ 
          msg=Serial.read(); 
      } 
   
    // allume LED avec 1
    if (msg=='1') { 
      digitalWrite(ledPin, HIGH);  // turn LED ON 
      Serial.print("LED allumée\n"); 
      msg=' '; 
    } 
    // stop LED avec 0
    if (msg=='0') { 
      digitalWrite(ledPin, LOW); // turn LED OFF 
            Serial.print("LED OFF\n"); 
             msg=' ';

    } 
  }

bonsoir,

Tout d'abord merci pour le code que vous proposez.

J'ai pu constater qu'il fonctionne bien, seulement, dans mon cas, un programme python (via la distribution spyder, avec la bibliothèque pyserial installée) envoie ces 0 ou 1. C'est là que je ne comprends pas, mon programme ne fonctionne pas. Je l'ai modifié en "copiant" les principes du vôtre mais toujours pas de résultats...

Peut- être qu'il y a une particularité que je n'ai pas saisie...

je vous joins une copie du code que j'utilise sur python:

def envoi(message): 
    T= convertion_bin_list(message)
    port = Serial('/dev/cu.usbmodem1411', 9600)
    port.open()
    if (port.isOpen()): #test que le port est ouvert
        for i in T:
            port.write(int(i))
print(envoi(message))

avec T=[0, 1, 1, 0, 0, 1, 0, 0]

Merci beaucoup pour votre aide.

Max

le code donné fonctione farpaitement avec un code python que j'ai fait vite fait l'autre jour.

ha ben ouai, évidemment le code ne prend en compte qu'un seul paramètre à la fois.

quel os ton ordi? mac, ca ressemble pas à du linux le cu.usbmodem1411

Cela veut dire qu'il faut que je supprime la boucle "for" et que je remplace le port.write(i) par port.write(T)? Je viens d'essayer avec votre code mais ça ne fonctionne pas.

Mon ordi est un Mac OS X El Capitan version 10.11.2

Merci encore pour votre aide.

Max

si si mon code fonctionne, sinon je l'aurai pas mis ;) voila le code python utilisé pour que ca fonctionne, mais c'est un 1 ou 0 à la fois et non une suite 1,0,1,0etc... a remplacer port_name = '/dev/ttyACM0' par le bon port

#!/usr/bin/env python

import os
import sys
import serial
import argparse

port_name = '/dev/ttyACM0'

def get_port():
  port = serial.Serial()
  port.port = port_name
  port.baud_rate = 19200
  return port

def switch_on():
  port = get_port()
  port.open()
  port.write('H')  

def switch_off():
  port = get_port()
  port.open()
  port.write('L')  

def main():
  parser = argparse.ArgumentParser(description = 'Switch on/off the LED of an Arduino board with the PhysicalPixel sketch loaded')

  subparsers = parser.add_subparsers(title = 'subcommands',
                                     description = 'valid subcommands',
                                     help = 'additional help')

  cmd_parser = subparsers.add_parser('1', description = 'Switch the LED on')
  cmd_parser.set_defaults(func = switch_on)

  cmd_parser = subparsers.add_parser('0', description = 'Switch the LED off')
  cmd_parser.set_defaults(func = switch_off)

  args = parser.parse_args()
  args.func()

if __name__ == '__main__':
  main()

je me suis mal exprimé, je me doutais bien que vous aviez posté un code fonctionnel, c'est juste que je n'avais pas réussi à le faire fonctionné...

Merci beaucoup pour m'avoir expliqué pourquoi cela ne fonctionnait pas :)

Une dernière question, comment faire fonctionner le code python que vous avez posté? Vous avez utilisé une structure que je ne comprends pas. Concrètement, comment allumer la led?

Comme vous l'aurez compris je suis un grand débutant.

Merci par avance pour le temps que vous m'accordez