Problème UART entre 2 cartes Uno

Bonsoir, déjà préalablement sous Smartphone, 3 catégorie dans lesquelles on peut poster : le Bar, Développement, Projets finis.
J ai déjà eu 2 remarques concernant le lieu de post du message. Je tente donc ici puisque je ne sais où poster.

Voilà, j'essaie quelque chose de très simple. Relier 2 Uno via UART.
La première envois toutes les 10s un 1 puis 0 sur TX 11. La seconde en réaction, sur un 1 reçus sur Rx8, doit faire clignoter sa LED on board.
La carte émettrice envois correctement sur le Tx. Par contre la réceptrice semble ne recevoir qu un "-1" et donc ne réagit pas. Par ailleurs sa LED TX est toujours allumée.

Faut-il d ailleurs nécessairement connecter Rx-Tx en croisé où puis je me contenter du TX côté émetteur arrivant sur le RX côté récepteur ?


// Arduino émetteur Tx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Tx(10,11);

void setup(){
Serial.begin(9600);
SerialUART_Tx.begin(9600);
}

void loop(){
SerialUART_Tx.print(1);
Serial.println(“Envois 1 sur port UART Rx10-Tx11”);
delay(10000);
SerialUART_Tx.println(0);
Serial.println(“Envois 0 sur port UART Rx10-Tx11”);
delay(10000);
}


//Arduino récepteur Rx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Rx(8,9);

int receptionOrdre=0;

void setup(){
Serial.begin(9600);
SerialUART_Rx.begin(9600);
pinMode(LED_BUILTIN, OUTPUT) ;
}

void loop(){
receptionOrdre = SerialUART_Rx.read();
Serial.println(receptionOrdre);
if (receptionOrdre == 1) {
digitalWrite(LED_BUILTIN, HIGH) ;
delay(1000) ;
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
}

Bonsoir

si tu avais pris le temps de lire attentivement le message épinglé en tête de forum tu aurai su ou poster :wink:

je déplace ton message à la racine du Forum

Désolé, j ai déjà pris le temps de le lire mais sur smartphone je ne vois pas où sélectionner une autre des 3 rubriques mentionnées dans mon post

image

→ c’est donc ni dans ‘Tutoriels etCours’, ni dans ‘Réalisations et projets Finis’ , ni dans le Bar mais à la racine du Forum

Bonsoir toupie
A la réception, tu lis le port série en permanence ce qui fait que tu lis, la plus part du temps comme quoi, il n'y a rien.
il faut tester s'il y a quelque chose à lire:

void loop() {
  if (SerialUART_Rx.available()) {
    receptionOrdre = SerialUART_Rx.read();
    Serial.println(receptionOrdre);

Côté émission, au lieu de SerialUART_Tx.print(1);, écris SerialUART_Tx.write(1);
En faisant print, tu envoies le code ASCII du 1, sot 49.

Cordialement
jpbbricole

Si tu penses que la charte graphique du forum est mal faite je suis d;accord avec toi.
Les sous forum localisés sont mal accessibles et sont la dernière roue du carrosse.
Les gestionnaires du forum n'ont rien à faire de nos remarques, c'est comme cela on n'y peut rien.

Néanmoins, les autres demandeurs sur smartphone y arrivent, c'est que c'est possible moyennant un effort.
Les seuls que tu gênes, sont des bénévoles qui sont obligés de faire le ménage.
Donc un peu de compréhension.
Merci.

Il n' y a aucun problème de compréhension juste de technique... Dsl mais je ne vois pas où, sur smartphone, mettre un topic à la racine...

Ce n'est pas moi qui te le dirai, parce que moi le smartphone, il est plus souvent déchargé sur étagère que dans ma poche.

Lorsque tu arrives dans "International/Français", dans le milieu de la fenêtre près du bord droit, tu vois, une icône qui représente une feuille avec un crayon, tu tapes sur cette icône et une fenêtre de saisie va s'ouvrir. Ce n'est d'ailleurs pas très différent de ce que tu vois lorsque tu es sur PC, sauf que sur PC après l'icône, il est écrit "New Topic"

Merci pour ces précisions concernant l'ergonomie, je tâcherais de poster au bon endroit quand je pianote sur mon tel...

J'ai procédé aux différentes modifications. Néanmoins pas mieux...
Le Tx se fait bien côté emmeteur. Par contre quand l'envois se fait, c'est la LED Tx qui s'allume sur le récepteur.
Je précise, j'ai juste brancher Tx-Rx et la masse commune mais pas le retour croisé.
Côté reception, mon moniteur série de m'envois plus en permanence des -1 mais une suite continue de "49", "48", "10"...

Côté émetteur, tu as bien write(10)?
Dans ton moniteur tu as le résultat d'un println(10)

Alors je m’étais embruillé dans le code entre le Serial.write et SerialUART.print.

C’est corrigé.

La réception de 0 et de 1 est bonne côté récepteur.

Dans le doute, j’ai câblé en croisé.

Pour autant, c’est toujours le Tx qui clignote côté récepteur et la LED ne clignote pas…



// Arduino émetteur Tx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Tx(10,11);

void setup(){
Serial.begin(9600);
SerialUART_Tx.begin(9600);}

void loop(){
SerialUART_Tx.write("1");
Serial.println("Envois 1 sur port UART Tx11");
delay(4000);
SerialUART_Tx.write("0");
Serial.println("Envois 0 sur port UART Tx11");
delay(4000);}
//Arduino récepteur Rx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Rx(8,9);

char receptionOrdre=0;

void setup(){
Serial.begin(9600);
SerialUART_Rx.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);}

void loop(){
if (SerialUART_Rx.available()){
receptionOrdre = SerialUART_Rx.read();
Serial.println("Ordre reçu sur port UART Rx8 : ");
Serial.println(receptionOrdre);
if (receptionOrdre == "1") {
digitalWrite(LED_BUILTIN, HIGH) ;
delay(500) ;
digitalWrite(LED_BUILTIN, LOW);
delay(500);}
else if (receptionOrdre == "0") {
digitalWrite(LED_BUILTIN, LOW);}}}

C'est pas if (receptionOrdre == "1") mais if (receptionOrdre == 1)

Alors ça ne change rien.

Par ailleurs je comprends pas.

Je fait un SerialUART_Tx.write(“1”);

J’envoie quoi un int ou un char ?

Et côté récepteur je définis : char receptionOrdre;

Puis je fais un teste sur receptionOrdre==”1”

c'est normal, pas d'inquiétude pour ça.
à chaque boucle, ton "récepteur" envoie au moniteur série :

Serial.println("Ordre reçu sur port UART Rx8 : ");

donc la DEL TX "visualise" cette communication

côté émetteur :

void loop()
{
   SerialUART_Tx.write("1");
   delay(4000);
   SerialUART_Tx.write("0");
   delay(4000);
}

tu n'envoies qu'une fois '1' ou '0' avec à chaque fois une attente de 4 sec : ton récepteur ne reçoit qu'une fois '1' ou '0' pendant ces 4 sec, ta DEL (LED_BUILTIN) ne doit donc clignoter qu'à 1/8 Hz

Tu dois faire SerialUART_Tx.write(1)

Pourquoi ça?
Coté réception le code teste if (receptionOrdre == "1") donc c'est bien un caractère ASCII qui est attendu.

Bonjour fdufnews

Pas tout à fait, je lui ai fait corriger sa réception au post #13

Cordialement
jpbbricole

Bonjour toupie631

Pour résumer ces modifications, je t'ai corrigé les 2 programmes, ainsi on envoie:

byte commande; //Valeur à envoyer

commande = 1;
SerialUART_Tx.write(commande);

et on reçoit:

byte receptionOrdre=0;

if (receptionOrdre == 1)

L'émission:

// Arduino émetteur Tx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Tx(10,11);

byte commande; //Valeur à envoyer
void setup(){
	Serial.begin(9600);
SerialUART_Tx.begin(9600);}

void loop(){
	commande = 1;
	SerialUART_Tx.write((byte)1);
	Serial.println("Envois 1 sur port UART Tx11");
	delay(4000);
	commande = 0;
	SerialUART_Tx.write(commande);
	Serial.println("Envois 0 sur port UART Tx11");
delay(4000);}

La réception:

//Arduino récepteur Rx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Rx(8,9);

byte receptionOrdre=0;

void setup(){
	Serial.begin(9600);
	SerialUART_Rx.begin(9600);
	pinMode(LED_BUILTIN, OUTPUT);
	Serial.println("Côté récepteur");}

void loop(){
	if (SerialUART_Rx.available()){
		receptionOrdre = SerialUART_Rx.read();
		Serial.print("Ordre reçu sur port UART Rx8 : ");
		Serial.println(receptionOrdre);
		if (receptionOrdre == 1) {
			digitalWrite(LED_BUILTIN, HIGH) ;
			delay(500) ;
			digitalWrite(LED_BUILTIN, LOW);
		delay(500);}
		else if (receptionOrdre == 0) {
		digitalWrite(LED_BUILTIN, LOW);}}}

N'hésites pas à poser des questions.
Maintenant si tu veux commander plus qu'une LED depuis un autre Arduino, il faudra faire évoluer ton protocole de transmission, si tu veux de l'aide... :wink:

A+
Cordialement
jpbbricole

OK, je suis d’accord effectivement, ce qui me chagrinais plus c’était de ne rien voir sur le Rx…

Je ne vois toujours rien d’ailleurs…

Le gros soucis était donc le format de l’envoi en byte ! Ainsi celà fonctionne (merci pour votre assistanat !!), mais pas comme je l’attendais :

Pour moi, durant la pause de 4 s déclenchée après l’envoie de l’ordre 1, je pensais faire clignoter toutes les 500ms ma LED de l’autre côté… donc au moins 6-7 fois.

En fait l’ordre n’est pas envoyé en continu sur le port UART. Il est envoyé 1 fois, Le récepteur le voit 1 fois et point barre.

Elle ne clignotait donc que très peu souvent donc certainement à la fréquence évoquée par 5cylindres (Mercedes ??)

J’ai donc corrigé mon code et là, ça fonctionne comme je l’imaginais. Ouf ! Je suis pas prêt d’envoyer un satellite sur Mars avec Arduino !

// Arduino émetteur Tx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Tx(10,11);
byte commandeON =1;
byte commandeOFF =0;

void setup(){
Serial.begin(9600);
SerialUART_Tx.begin(9600);
}

void loop(){
SerialUART_Tx.write(commandeON);
Serial.println("Envois 1 sur port UART Tx11");
delay(5000);
SerialUART_Tx.write(commandeOFF);
Serial.println("Envois 0 sur port UART Tx11");
delay(5000);
}
//Arduino récepteur Rx
#include <SoftwareSerial.h>
SoftwareSerial SerialUART_Rx(8,9);

byte receptionOrdre;

void setup(){
Serial.begin(9600);
SerialUART_Rx.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);}

void loop(){
if (SerialUART_Rx.available()){  //si quelque chose se présente sur le port UART
receptionOrdre = SerialUART_Rx.read();}

Serial.println("Ordre reçu sur port UART Rx8 : ");
Serial.println(receptionOrdre);
if (receptionOrdre == 1) {
digitalWrite(LED_BUILTIN, HIGH) ;
delay(500) ;
digitalWrite(LED_BUILTIN, LOW);
delay(500);}
else if (receptionOrdre == 0) {
digitalWrite(LED_BUILTIN, LOW);}}