Difficulté pour lire le port série sur un écran lcd

Bonjour à tous,

J'ai pour projet de concevoir un testeur de câble dont le but est d'identifier les fils sur un câble multiconducteur d'une longueur de 200m et pouvant dépasser les 60 contacts.

Vous trouverez en pièce jointe une image illustrant le principe.

Concrètement, j'ai une carte émettrice (Uno) qui en émulant des ports séries va envoyer sur chaque sortie le nom du contact en boucle.
De l'autre côté du câble, une carte réceptrice (Due) avec une pointe de touche reliée à Rx1.

Si je passe par la console virtuelle, je vois bien s'afficher le nom du contact par contre si j'envoie la lecture de Rx1 sur un lcd 16x2, ça sature et j'obtiens des signes étranges.

Alors étant complètement débutant, je cherche sans trouver le moyen d'afficher le nom du contact (que ce soit un chiffre ou une lettre) que sur deux cases du lcd et non pas sous la forme d'un défilement qui encombre finalement tout l'écran.

Auriez-vous une solution pour :

  • Ne pas faire "planter" le lcd,
  • Afficher que sur deux cases du lcd?

Ci-dessous le code de la carte émettrice (Uno) :

#include <SoftwareSerial.h>   
 SoftwareSerial mySerial1(0, 8); // RX, TX  
 SoftwareSerial mySerial2(0, 9); // RX, TX  
 SoftwareSerial mySerial3(0, 10); // RX, TX  
 SoftwareSerial mySerial4(0, 11); // RX, TX  
 SoftwareSerial mySerial5(0, 12); // RX, TX  
 SoftwareSerial mySerial6(0, 13); // RX, TX  

void setup() {
  //-- Définition et ouverture des ports logiciel  
  mySerial1.begin(9600);  
  mySerial2.begin(9600);  
  mySerial3.begin(9600);
  mySerial4.begin(9600);
  mySerial5.begin(9600);
  mySerial6.begin(9600);  
 }  
 //-- Envoi de la communication  
 void loop() {  
  mySerial1.println("1");
  delay(100);
  mySerial2.println("2");
  delay(100);
  mySerial3.println("3");
  delay(100);
  mySerial4.println("4");
  delay(100);
  mySerial5.println("5");
  delay(100);
  mySerial6.println("6");
  delay(100);
 }

Et celui de la carte réceptrice (Due) :

#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); 

void setup() {
  Serial1.begin(9600);   
  lcd.begin(16,2);
 }   
 void loop() {  
  lcd.print(Serial1.read()); 
}

D'avance, merci.

Bonjour

merci de demander le déplacement dans la bonne section.

Bonjour,

Peux tu s’il te plaît m’indiquer quelle section et à qui dois-je faire ma demande?

Sujet déplacé...

Merci !

Sinon j’ai continué de chercher et malheureusement je ne peux pas essayer ce soir mais je pense qu’il pourrait avoir un début de réponse ici :
https://forum.arduino.cc/index.php?topic=42422.0

Bonjour,

Je n'ai pas de réponse particulière pour les problèmes d'afficheur, mais juste une remarque concernant la communication série ( RS232 ).
La mise au point et les tests sur de courte distance de câble devrait bien se passé mais la communication sur un câble de 200m risque de te poser pas mal de problème, perte en ligne, perte d'info si le câble n'est pas blindé ou non torsadé ...
Je doute que les sorties microcontrôleur supporte une tel longueur.

Information indicative trouvé : Longueur maximale de câble d'un port série

Normes pour les connexions aux ports série sont fixés par l'Association Industrie électronique ( EIA). Leurs protocoles sont ajoutés par les lettres RS , qui signifient norme recommandée . Connexions de ports série sont régies par RS- 232, RS- 422, RS- 423 et RS-485. Recommandations
Les normes spécifient une longueur de câble maximale pour les connexions série . Il s'agit de 15 mètres pour RS- 232 et 1200 mètres pour RS-422 , RS- 423 et RS-485.
Limites

Bon courage a toi

Bonjour,

Il suffit que tu affiches toujours au même endroit. Il faut aussi que tu testes si tu reçois un caractères, sinon tu va recevoir -1 et ça va perturber ton affichage.

void loop() {
  if (Serial1.available())
  {
    lcd.setCursor(0, 0);
    lcd.print((char)Serial1.read());
  }
}

Plusieurs remarques:

  • le principe est difficilement transposable à 60 fils en l'état. Il faudrait multiplexer les lignes (tu ne pourras pas piloter les 60 lignes en même temps) et si tu multiplexes les lignes il va y avoir un moment où les lignes non pilotées risquent de présenter le code d'une ligne voisine par couplage mutuel (si tu travailles en tension)
  • sur de telles longueurs il n'est pas judicieux de piloter en tension. Il vaudrait mieux piloter en courant. Ce qui permettrait d'avoir une résistance de terminaison sur le fil testé et donc de limiter l'effet causé par le couplage de fils voisins. De plus le pilotage en courant est moins sensible à la résistance du conducteur.
  • ce principe de test est adapté à l'identification d'un fil dans un toron mais il n'est pas adapté à la recherche de panne car il ne permet pas d'identifier rapidement un fil coupé ou des fils en court-circuit.

Bonjour
Une remarque d'importance, l'arduino Due n'est pas tolérant 5V il y a des risques de l'endommager.

Une autre carte Uno est bien suffisante pour réaliser le "récepteur"

Bonsoir et merci beaucoup pour vos remarques.

mais la communication sur un câble de 200m risque de te poser pas mal de problème, perte en ligne, perte d'info si le câble n'est pas blindé ou non torsadé ...
Je doute que les sorties microcontrôleur supporte une tel longueur.

Pourquoi pas utiliser un shield RS485?

Il suffit que tu affiches toujours au même endroit. Il faut aussi que tu testes si tu reçois un caractères, sinon tu va recevoir -1 et ça va perturber ton affichage.

Bon j'ai réessayé ce matin et à ma grande surprise cela ne fonctionne plus ! Alors j'ai tout recâblé au minimum et même enlevé le lcd pour faire suivre le RX1 de la Due sur la console et le résultat est que je ne retrouve plus les nombres correspondants aux contacts.
Cela m'affiche 50, 49, 48 , etc... au lieu de 6, 5 , 4, etc...

J'ai également essayé en remplaçant la Due par une Uno et même résultat... Du coup, je suis bloqué au point de départ.

le principe est difficilement transposable à 60 fils en l'état. Il faudrait multiplexer les lignes (tu ne pourras pas piloter les 60 lignes en même temps) et si tu multiplexes les lignes il va y avoir un moment où les lignes non pilotées risquent de présenter le code d'une ligne voisine par couplage mutuel (si tu travailles en tension)

Pour gérer les 60 fils, je comptais utiliser des 74HC... à 8 sorties donc au minimum 8 I/O digital sur l'arduino avec chaque sortie qui envoie en boucle un nom de contact différent sur les 8 possibilités des mux.

Je travaille sur des câbles qui auront un blindage principal avec parfois des fils simples, parfois des fils blindés (en paire, en tierce, ...).
Il me semblait que sur des petites sections comme du 0.35mm² et sous 5V @20mA, la perte serait de 200mV donc je ne me suis pas inquiété sur la longueur du câble.

J'ai pas un bagage énorme en électronique, pouvez-vous m'indiquer une piste de travail sur comment piloter en courant avec l'Arduino?

Une remarque d'importance, l'arduino Due n'est pas tolérant 5V il y a des risques de l'endommager.

Effectivement ce n'était pas prévu seulement je possède à la base une Due puis j'ai acheté deux Uno pour le projet. Je me suis servi de la Due pour bénéficier des entrées supplémentaires même après avoir pluggé le lcd qui prend toute la place sur une Uno; peut-être une erreur vu que plus rien ne marche maintenant :frowning:

hsdorian:
Cela m'affiche 50, 49, 48 , etc... au lieu de 6, 5 , 4, etc...

Tu es sur que tu as bien castė Serial1.read() en char ?

Tu es sur que tu as bien castė Serial1.read() en char ?

Je n’ai pas encore essayé en char seulement cela fonctionnait sans auparavant et c’est ça qui m’inquiète.
J’espère pouvoir dégager un peu de temps pour faire un essai ce soir !

Tres bonne journée.

Bonsoir,

J'ai essayé avec le code suivant :

#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);

void setup() {
  Serial1.begin(9600);   
  lcd.begin(16,2);
 }   

void loop() {
  if (Serial1.available())
  {
    lcd.setCursor(0, 0);
    lcd.print((char)Serial1.read());
  }
}

Cela ne fonctionne pas et je ne reçois qu'un caractère qui semble être la superposition de plusieurs caractères (voir photo en pièce jointe) et ça peu importe l'entrée de l'Uno.

Je continue mes recherches.

C'est avec un câble de 200m ou un câble plus court?
Comme dit plus haut, la rue n'accepte pas le 5V.

Bonsoir,

C'est avec un câble de 200m ou un câble plus court?
Comme dit plus haut, la rue n'accepte pas le 5V

Pour l'instant je fais mes essais avec des straps d'une dizaine de centimètre.
J'ai donc remplacé le Due par un Uno et après plusieurs tentatives et tâtonnements, j'ai pu obtenir le résultat recherché avec le code suivant :
Émetteur :

#include <SoftwareSerial.h>   
 SoftwareSerial mySerial1(0, 8); // RX, TX 
 SoftwareSerial mySerial2(0, 9); // RX, TX 
 SoftwareSerial mySerial3(0, 10); // RX, TX 
 SoftwareSerial mySerial4(0, 11); // RX, TX 
 SoftwareSerial mySerial5(0, 12); // RX, TX 
 SoftwareSerial mySerial6(0, 13); // RX, TX 

void setup() {
  //-- Définition et ouverture des ports logiciel 
  mySerial1.begin(9600); 
  mySerial2.begin(9600); 
  mySerial3.begin(9600);
  mySerial4.begin(9600);
  mySerial5.begin(9600);
  mySerial6.begin(9600); 
 } 
 //-- Envoi de la communication 
 void loop() { 
  mySerial1.print(1);
  mySerial2.print(2);
  mySerial3.print(3);
  mySerial4.print(4);
  mySerial5.print(5);
  mySerial6.print(6);
  delay(1000);
 }

Récepteur :

#include <SoftwareSerial.h>   
  SoftwareSerial mySerial(12, 13); // RX, TX 
  
#include <LiquidCrystal.h>
  LiquidCrystal lcd(8,9,4,5,6,7);

void setup() {
  mySerial.begin(9600);  
  lcd.begin(16,2);
 }   

void loop() {
if (mySerial.available())
  {
    lcd.setCursor(0, 1);
    lcd.write(mySerial.read());
    delay(1000);
  }
}

Je compte désormais me préparer pour des tests sur des câbles de grande longueur seulement l'intervention de fdufnews me questionne.

sur de telles longueurs il n'est pas judicieux de piloter en tension. Il vaudrait mieux piloter en courant. Ce qui permettrait d'avoir une résistance de terminaison sur le fil testé et donc de limiter l'effet causé par le couplage de fils voisins. De plus le pilotage en courant est moins sensible à la résistance du conducteur.

Pourriez-vous me donner une piste de travail sur comment piloter en courant?
Je tente tout de même une réflexion :
Sachant que l'Arduino communique en série avec une tension comprise entre 0V et 5V et que la résistance du câble est déterminée par sa longueur et ne peut donc varier, la seule manière de faire varier l'intensité et donc le courant est de jouer sur la tension comme sur une vrai liaison série comme la RS232 qui travaille sur la plage -25V et +25V.
Du coup, la solution serait elle d'ajouter un shield rsXXX?
Merci de votre soutient.

Bonsoir,

Sans réponse de votre part, cela risque d'être compliqué pour moi.

Je vous ferai tout de même un retour une fois le prototype terminé sur les problèmes éventuellement rencontrés au sujet des câbles de grande longueur.

À bientôt.

Bonjour,

J'ai pu essayer mon montage sur un câble de 50m et ça fonctionne !

Seulement j'ai remarqué que si Rx touche par mégarde la masse, le programme plante. Peux-t-on éviter cela?

Réception :

#include <SoftwareSerial.h>   
  SoftwareSerial mySerial(12, 13); // RX, TX 
  
#include <LiquidCrystal.h>
  LiquidCrystal lcd(8,9,4,5,6,7);

void setup() {
  mySerial.begin(9600);  
  //Serial.begin(9600); 
  lcd.begin(16,2);
 }   

void loop() {
if (mySerial.available())
  {
    lcd.setCursor(0, 0);
    lcd.print("Contact trouve :");
    lcd.setCursor(0, 1);
    lcd.write(mySerial.read());
    if (mySerial.available() > 0) {
    lcd.setCursor(1, 1);
    lcd.write(mySerial.read());
    }
    delay(1000);
  }
if (mySerial.available() == 0)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Contact perdu !");
    delay(1000);
      }
}