Communication RS232 vers Uno

Bonjour,

Etant nouveau dans l'univers de l'arduino et n'ayant que peu d'experience dans la programmation je me permet de demander de l'aide pour un projet qui consiste à piloter une carte Arduino Uno par l'intermediaire d'un signal RS-232. Je m'explique, pour le moment je souhaite faire simple, je veux juste faire allumer une LED branchée sur la broche 13 dès que la carte reçoit "1" sur son Rx (donc la broche 0) et ensuite faire éteindre cette même LED quand la carte reçoit "0" On ne peut pas faire plus simple :)

Voici le code que j'ai fais:

int LED1 = 13;
int Rx = 0;

void setup() {
  pinMode(Rx, INPUT);
  pinMode(LED1, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int RsValue = Serial.read(Rx);
  if (RsValue = 1); else digitalWrite(LED1, HIGH); // allumer la LED 1
  if (RsValue = 0); else digitalWrite(LED1, LOW); // éteindre la LED 1
}

Seulement le probleme est que lorsque je veux le compiler, l'éditeur trouve des erreurs qui sont:

sketch_apr07a.cpp: In function 'void loop()':
AnalogReadSerial:14: error: no matching function for call to 'HardwareSerial::read(int&)'
C:\Users\User\Desktop\arduino-1.0\hardware\arduino\cores\arduino/HardwareSerial.h:56: note: candidates are: virtual int HardwareSerial::read()

Je ne sais pas ce que ça veut dire et je ne vois pas où j'ai pu faire d'erreur... Donc si quelqu'un peut me renseigner ça serait top XD

Bonne journée tout le monde

jehuty47:

sketch_apr07a.cpp: In function 'void loop()':

AnalogReadSerial:14: error: no matching function for call to ‘HardwareSerial::read(int&)’
C:\Users\User\Desktop\arduino-1.0\hardware\arduino\cores\arduino/HardwareSerial.h:56: note: candidates are: virtual int HardwareSerial::read()

Si tu décryptes bien ton message d’erreur :

AnalogReadSerial:14: error: no matching function for call to ‘HardwareSerial::read(int&)’

ligne 14: ne peux pas trouver donc appeler la fonction (méthode) read(int&) de la classe HardwareSerial, ce qui veux dire qu’elle n’existe pas. soit celà viens de son nom soit mauvais type de paramètres.

candidates are: virtual int HardwareSerial::read()

Comme il a trouver une fonction (méthode) portant le même nom :
la (les) candidate(s) possible est (sont) : read() de la classe HardwareSerial .

Vers la ligne 14 tu n’as qu’une seule fonction (méthode) portant ce nom, le problème ce situe …

jehuty47:

int RsValue = Serial.read(Rx);

Il y a quelque chose en trop ici Serial.read(Rx). :grin: :wink:

Voir http://arduino.cc/en/Serial/Read pour plus de précision.

Edit: tu peux suivre ce que fait Geek, c’est similaire niveau code à ce que tu veux faire.
http://arduino.cc/forum/index.php/topic,99652.0.html
http://arduino.cc/forum/index.php/topic,99980.30.html

Bonjour,

jehuty47:
Etant nouveau dans l’univers de l’arduino et n’ayant que peu d’experience dans la programmation je me permet de demander de l’aide pour un projet qui consiste à piloter une carte Arduino Uno par l’intermediaire d’un signal RS-232.

Je sait bien que c’est pâque, mais je vois venir les œufs cassé :zipper_mouth_face:
Tu connecte ton arduino à un port RS232, soit, mais utilise tu un circuit MAX232 ou assimilé pour faire la liaison entre les +/- 12v du port RS232 et les 0/5v de l’arduino ?
Si non tu va au devant de gros problémes et ça risque de sentir le brulé :wink:

jehuty47:
Je m’explique, pour le moment je souhaite faire simple, je veux juste faire allumer une LED branchée sur la broche 13 dès que la carte reçoit “1” sur son Rx (donc la broche 0) et ensuite faire éteindre cette même LED quand la carte reçoit “0”

C’est un programme des plus simple effectivement, il faut bien commencer par quelque par :slight_smile:

Ton code :

int LED1 = 13; // ok, un const byte au lieu du int serait plus adapté pour stocker une valeur égale à 13
int Rx = 0; // ???

void setup() {
  pinMode(Rx, INPUT); // Erreur, mettre D0 en entrée n'apportera que des problémes avec le port série
  pinMode(LED1, OUTPUT); // Ok
  Serial.begin(9600); // Ok
}

void loop() {
  // Erreur il faut d'abord tester si un octet à était recu sur le port série avant de le lire
  int RsValue = Serial.read(Rx); // Erreur, Serial.read() retourne un byte et ne prend pas d'argument, il ne fait que lire un octet sur le port série
  if (RsValue = 1); else digitalWrite(LED1, HIGH); // allumer la LED 1
  // 1 ligne, 2 erreurs, jolie COMBO ^^
  // if (RsValue = 1) -> = -> assignation, RsValue = 1
  // if (RsValue == 1) -> == -> test de valeur qui retourne true ou false
  // if (nnn); else xxx; -> c'est syntaxiquement correcte, mais pas valable.
  //                           -> Si la condition nnn est vrai alors ; (= ne rien faire) sinon (else) faire xxx
  //                               Tu fait tout le contraire de ce que tu veut faire 
  if (RsValue = 0); else digitalWrite(LED1, LOW); // éteindre la LED 1
  // Même chose qu'au dessus
}

Aie aie aie … tu n’as pas révisé tes cours de c/c++ et d’arduino à ce que je vois :wink:

Un bon tuto sur Serial (fabrication maison) : http://skyduino.wordpress.com/2011/10/09/screencast-arduino-episode-3-serial/
Si tu le regarde en entier tu devrais comprendre tes erreurs et te dire “ralala j’ai était bête de faire ça comme ça” :wink:

Le code correspondant à ton sujet :

const byte broche_led = 13; // Broche sur laquelle est cablé la led

// Fonction setup() exécuté au démarage de la carte arduino
void setup() {
  pinMode(broche_led, OUTPUT); // La broche avec la led est placé en sortie
  digitalWrite(broche_led, LOW); // et est mise à LOW pour le moment

  Serial.begin(9600); // Initialisation du port série à 9600 bauds
}

// Fonction loop() exécuté en boucle tant que l'arduino est alimenté
void loop() {
  while(Serial.available() < 1); // Tant que l'on a pas recu un octet sur le port série -> attente

  char valeur = Serial.read();
  if(valeur == '1')
    digitalWrite(LED1, HIGH); // allumer la led
  else if(valeur == '0') 
    digitalWrite(LED1, LOW); // éteindre la led
}

Woww je ne m'attendais pas à autant d'attention ça fait plaisir :astonished: Donc tout d'abord je tiens à vous remercier pour ces réponses aussi bien détaillées qu'instructives :)

Pour ce qui est du branchement en RS-232 sur la carte je suis assez tranquil vu que j'envoie les commandes par l'intermédiaire de mon IPhone qui envoie au maximum du 3V...

Maintenant je suis un peu embêté parce que je n'ai plus rien à dire mis à part que ça marche ! J'arrive à piloter mon Arduino avec mon IPhone ! Il me reste plus qu'à brancher quelques relais et autres ports RS pour faire un peu de domotique chez moi :D

Juste une dernière petite question avant de trop m'égarer J'ai vu qu'il éxiste des modules Ethernet pour l'arduino et je voulais savoir s'il était possible (en gros) de pouvoir effectuer des actions en fonction de différents états de variables qui seraient modifiées par des boutons sur une page html ? Je m'explique, je voudrais me connecter sur une page html avec un pc ou smartphone sur laquelle il y aurait des boutons par exemple "ON" et "OFF" qui, par exemple, remplaceraient les codes "1" et "0" de mon montage RS-232

J'espère ne pas trop abuser de votre gentillesse, en tout cas je vous remercie pour tout ce que vous m'avez apporté

jehuty47: Woww je ne m'attendais pas à autant d'attention ça fait plaisir :astonished: Donc tout d'abord je tiens à vous remercier pour ces réponses aussi bien détaillées qu'instructives :)

Pas de quoi, c'est toujours un plaisir de venir en aide aux autres ^_^

jehuty47: Pour ce qui est du branchement en RS-232 sur la carte je suis assez tranquil vu que j'envoie les commandes par l'intermédiaire de mon IPhone qui envoie au maximum du 3V...

Les iphones utilise donc du 0v / 3v, je savais pas (j'ai pas d'iphone), je me coucherai moins bête ce soir. Donc en étant pointilleux on ne devrai pas dire RS-232 mais "port série TTL 3v" pour être exact :grin:

jehuty47: Juste une dernière petite question avant de trop m'égarer J'ai vu qu'il éxiste des modules Ethernet pour l'arduino et je voulais savoir s'il était possible (en gros) de pouvoir effectuer des actions en fonction de différents états de variables qui seraient modifiées par des boutons sur une page html ? Je m'explique, je voudrais me connecter sur une page html avec un pc ou smartphone sur laquelle il y aurait des boutons par exemple "ON" et "OFF" qui, par exemple, remplaceraient les codes "1" et "0" de mon montage RS-232

C'est tout à fait possible et même trés courant ;) Regarde sur l'ami google "webduino" c'est un mini serveur web pour carte arduino.

Les iphones utilise donc du 0v / 3v, je savais pas (j'ai pas d'iphone), je me coucherai moins bête ce soir.

Moi non plus je ne savais, ça fait deux mois que je pensais avoir fais un montage qui ne marchait pas, je n'avais pas beaucoup de moyens de le tester

Donc en étant pointilleux on ne devrai pas dire RS-232 mais "port série TTL 3v" pour être exact

Je suis d'accord avec toi, j'ai fait un petit abus de language...

Encore merci pour tes renseignements je vais aller voir ça de suite :)

P.S: Sympa ton tuto sur le Serial j'ai adoré ;)

Je m'explique, je voudrais me connecter sur une page html avec un pc ou smartphone sur laquelle il y aurait des boutons par exemple "ON" et "OFF" qui, par exemple, remplaceraient les codes "1" et "0" de mon montage RS-232

Je pense que tu devrais essayer de faire une recherche sur le forum. Il y a eu, il n'y a pas très longtemps il me semble, un sujet proche de ce que tu cherches à faire.