Liaison RS232 et Arduino

Bonjour,

Dans le cadre de mon projet, je dois faire communiquer mon Arduino UNO avec un télémètre laser via une liaison RS232.

Celui ci envoie la valeur de la distance mesurée si on lui envoie la commande “M1”. Je cherche donc à coder un programme qui me permette d’envoyer la commande “M1” au capteur par mon Arduino et ensuite de récupérer la mesure.
J’ai essayé d’écrire un code mais il ne se passe rien et je ne comprends pas pourquoi… Je ne sais pas comment gérer le problème du CR (il s’agit de l’appui sur le bouton entrée). Dois-je l’écrire également ?

Quelqu’un pourrait-il m’aider?

#define RX 4 //Initialisation des ports de la liaison
#define TX 5

#include <SoftwareSerial.h> //appel de la bibliothèque

SoftwareSerial RS232(RX,TX); //Création de l'objet RS232

int i;
int recu[20];

void setup() {
  Serial.begin(9600);
  RS232.begin(9600); //initialisation de la liaison série RS232
  Serial.println("Initialisation de la communication ok!");
}

void loop() {
  i=0;
  RS232.print('M1'); //demande de l'envoi de la chaine depuis l'émetteur
  //Serial.println("test0");
  if(RS232.read()=='M1'){ //si la demande a bien été envoyée
    //Serial.println("test1");
    while (RS232.available()>0){ //alors tant que des caractères sont présents dans la liaison RS232
      //Serial.println("test2");
      recu[i]=RS232.read(); //lecture caractère par caractère
      Serial.print(recu[i]); //affichage dans le moniteur série
      Serial.print(";");
      i++;
  }
}
  delay(5000);
}

Je vous remercie d’avance !

En langage Arduino, carriage return se dit \r et newline se dit \n. Il suffit d'ajouter ce que tu veux à la fin :

RS232.print('M1\r');

Je vous remercie de votre réponse ! J’ai fait les modifications et pourtant il ne se passe rien de plus…

Maaath21: Bonjour,

Dans le cadre de mon projet, je dois faire communiquer mon Arduino UNO avec un télémètre laser via une liaison RS232.

Il est toujours bon de rappeler que l'interface électrique de l'Arduino n'est pas compatible d'une interface RS232. Il faut utiliser un circuit d'adaptation de niveau MAX232 ou équivalent

J'utilise le convertisseur suivant : https://www.amazon.fr/Ultra-Compact-Convertisseur-RS232-vers/dp/B00OPU2QJ4/ref=sr_1_18?ie=UTF8&qid=1533048186&sr=8-18&keywords=module+RS232+arduino

Celu ci fonctionne très bien, je l'ai déjà utilisé dans une autre partie de ce projet !

Essaye avec

RS232.print('M1\r\n');

J'ai essayé votre commande et toujours rien...

Au passage, j'ai revérifié à l'aide d'Hercule qu'il y avait bien une communication, et c'est le cas :/

Si je comprends bien, l'Arduino est relié au capteur par la liaison RS232 ? Tu as connecté le TX du capteur au RX de l'Arduino (pin 4) et réciproquement ?

Est-ce que tu peux relier l'Arduino à un PC avec cette liaison et visualiser les messages que tu envoies ?

  1. Utilise des guillemets doubles et pas simples:

....print ("M1");

Maintenant c'est la data sheet qui te dira s'il faut \r, \n, les deux, ou aucun...

  1. On ne peut pas lire la réponse de cette façon:

if(RS232.read()=='M1')

Il vaut mieux attendre qu'on ait un début de réponse:

while (RS232.available () == 0)

  1. Remets la variable i à zéro lors du début de la lecture de la réponse.

Alors en fait j'utilise un câble RJ11/RS232. Le prise RJ11 est connectée au capteur et la prise RS232 dans l'adaptateur de l'Arduino qui lui est connecté en 4 broches avec l'Arduino (Rx, Tx, +5V et GND).

Je ne peux pas connecter l'Arduino à mon PC avec cette liaison car j'ai 2 SUB Dç mâles et je n'ai pas d'adaptateur :/ (je vais en chercher tout de même)

Je vais modifier mon programme !

Je vous remercie de votre aide.

J'ai connecté l'Arduino au PC et je reçois "3338" toutes les 5secondes...

Pour compléter la réponse de cbrandt : essaye avec RS232.write ("M1"); Que montre le PC avec ça ?

Pour la réception des données du capteur, il faudrait connaitre le format des données. Tu peux déjà lire ceci qui te guidera.

En envoyant "M1", le PC me renvoie M1 aussi !

Bon, il te reste à faire la partie de lecture des données du capteur, parce que ce que tu as écrit risque de ne pas fonctionner.

Quel est le format des données ? int, byte, float, signé ou pas ? Quelle est la référence du capteur ? As-tu la datasheet ?

Les données lues par le capteur sont des float signés par exemple “-00.7891”.
Celles reçues sont codés sur 8 bits en ASCII d’après la datasheet.

Le capteur est un télémètre laser de précision de l’entreprise KEYENCE. Je joins la datasheet complète en pièce jointe.
La partie 5 regroupe toutes les informations nécessaires pour la liaison RS232.

J’ai modifié un peu mon code, et le programme arduino me renvoie “on ne reçoit rien 8x” puis “Time out error” codé sur 8 bit.

void loop() {
  i=0;
  RS232.print("M113"); //demande de l'envoi de la chaine depuis l'émetteur
  //Serial.println("test0");
  delay(500);
  charlu = RS232.read();
  chardispo = RS232.available();
  //Serial.println(chardispo);
  //Serial.println(charlu);
  if(charlu != -1){ //si la demande a bien été envoyée
    Serial.println("On reçoit qqchose");
    recu[i]=charlu;
    Serial.print(recu[i]);
    i = 1;
    while (charlu != -1){
      charlu=RS232.read();
      recu[i]=charlu;
      Serial.print(recu[i]);
      //Serial.print(";");
      i++;
    }
    Serial.println();
//    for (int i=0; i<8; i++){
//    decodage(recu[i]);
//    //Serial.println();
//    delay(200);
  }

  else {
    Serial.println("On ne reçoit rien");
  }
 delay(3000);
 }

Chapeau pepe !

Je vous remercie de vos réponses.

Je ne comprends pas tout le programme que vous m'avez envoyé. Si j'ai bien compris, le déroulement du processus est le suivant :

1 - on envoie une chaîne de caractères à l'aide de la méthode print() terminée par un caractère CR. 2 - on attend que la transmission se fasse. 3 - on vérifie à l'aide de la fonction available() que la transmission de la commande a bien eu lieu (en regardant le nombre de caractères). 4 - on attend que la commande soit traitée 5 - on lit les caractères reçus suite à l'envoi de la commande à l'aide de la fonction read(). 6 - on s'assure que "la taille" des caractères est conforme 7 - on attend un peu avant de relancer le processus

Et à travers ces étapes il faut en plus gérer les erreurs possibles de transmission. Mais je ne vois comment utiliser vos fonctions. La première renvoie les messages d'erreur mais je ne vois pas où elle renvoie la valeur lue par le capteur. De plus, je ne vois pas quand utiliser la fonction ignoreReponse(). Après la première ? Je les appelle successivement dans la boucle loop ?

Je m'excuse si mes questions peuvent paraître naïve, mais je ne fais de l'Arduino que depuis quelques semaines...

La première renvoie les messages d'erreur mais je ne vois pas où elle renvoie la valeur lue par le capteur.

La fonction remplit un tableau qui est accessible dans l'ensemble du code (variable globale, à déclarer dans l'entête)

C'est le "char reponse[20]" ? Donc si je comprends bien, après avoir exécuté la fonction, je fais un Serial.print(reponse) ? (pour le voir afficher sur mon moniteur)