Go Down

Topic: Dialogue entre deux arduinos (Read 594 times) previous topic - next topic

gg25

Bonsoir à tous,

Je suis confronté à un problème. J'ai une arduino qui récupère le signal d'une horloge DS3231. J'aimerais envoyer ce signal à une autre carte par liaison RS485.
Bon, la liaison entre les deux fonctionne (j'allume et éteind une led avec retour d'information comme test). Mais je bloque sur l'envoie du signal horloge. Je sais que le signal doit se composer de 7 octets, mais impossible des les envoyer.

Voici le code de mon emetteur (test avec des secondes):
Code: [Select]
#include <SoftwareSerial.h>
#define SSerialRX  11
#define SSerialTX  12
#define SSerialTxControl  13
#define RS485Transmit  HIGH
#define RS485Receive  LOW
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);
int byteReceive;
int byteSend;
int horloge;


void setup()
{
  pinMode(SSerialTxControl, OUTPUT);
 
  digitalWrite(SSerialTxControl, RS485Transmit);
  RS485Serial.begin(4800);
 
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
}


void loop()
{
  DateTime now = RTC.now();
  digitalWrite(SSerialTX, now.second());
  Serial.println(SSerialTX);
  delay(1000);
 }


Si je lis mon serial print qui est mon signal envoyé, je n'ai que des "12" qui s'affichent sur le moniteur série.


Auriez-vous une idée pour m'aiguiller ?

Merci d'avance :)

infobarquee

bonjour,
ca ne serait pas quelque chose comme
Code: [Select]
  RS485Serial.println(now.second());
AUCUNE AIDE PAR MP

gg25

Si je fais :
Code: [Select]
Serial.println (now.second());
 Je lis bien ce que ma carte récupère,  mais je ne sais pas comment l'envoyer a l'autre carte.

infobarquee

si tu veux envoyer via SoftwareSerial il faut utiliser le serial déclaré.
donc teste ce que j'ai mis au dessus.
AUCUNE AIDE PAR MP

fdufnews

Tu remplaces Serial par RS485Serial puisque c'est le nom que tu as donnée à ta liaison série RS485

gg25

#5
Oct 27, 2015, 02:00 pm Last Edit: Oct 27, 2015, 02:12 pm by gg25
Si je fais
Code: [Select]
void loop()
{
  DateTime now = RTC.now();
  RS485Serial.println(now.second());
  delay(1000);
 }

 je n'ai rien qui s'affiche dans mon moniteur série de l'émetteur.

infobarquee

Si je fais
Code: [Select]
void loop()
{
  DateTime now = RTC.now();
  RS485Serial.println(now.second());
  delay(1000);
 }

 je n'ai rien qui s'affiche dans mon moniteur série de l'émetteur.
c'est normal que rien ne s'affiche dans la console.
tu confonds pas mal de choses en fait.
la liaison serie normal avec la console ET la liaison serie entre les deux arduino.
si tu veux afficher dans la console, il faut rajouter
Code: [Select]
Serial.println (now.second());

Code: [Select]
  RS485Serial.println(now.second());
sert a envoyer A L'AUTRE arduino les données.

si tu es certain que tout fontionne du coté de l'émetteur, penche toi sur ce que recoit le récepteur, il n'y a que de ce coté où tu pourras vérifier maintenant
AUCUNE AIDE PAR MP

gg25

#7
Oct 27, 2015, 04:12 pm Last Edit: Oct 27, 2015, 04:14 pm by gg25
Oui, je me suis rendu compte après que je m'étais trompé sur l'utilisation du Serial.

Voici mes deux codes,

emetteur
Code: [Select]
#include <SoftwareSerial.h>  // Inclure librarie "SoftwareSerial.h"
#define SSerialRX  11        // Broche 11 pour RX
#define SSerialTX  12        // Broche 12 pour TX
#define SSerialTxControl  13 // Broche 13 pour selection envoie ou reception
#define RS485Transmit  HIGH  // Etat haut pour transmission RS485
#define RS485Receive  LOW    // Etat bas pour reception RS485
#include <Wire.h>            // Inclure librairie "Wire.h"
#include <RTClib.h>          // Inclure librairie "RTClib.h"

RTC_DS1307 RTC;              // Declarer DS3231 comme DS1307

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);  // Assigner les broches RX et TX a RS485Serial
int byteReceive;
int byteSend;
int horloge;


void setup()
{
  pinMode(SSerialTxControl, OUTPUT);  // Defnir SSerialTxControl comme port de sortie
 
  digitalWrite(SSerialTxControl, RS485Transmit);  // Indiquer que SSerialTxControl est en transmission
  RS485Serial.begin(4800);  // Demarrer liaison RS485 a 4800 bauds
 
  Serial.begin(9600);  // Demarrer Serial a 9600 bauds
  Wire.begin();  // Demarrer librairie "Wire"
  RTC.begin();  // Demarrer librairie "RTC"
}


void loop() // On souhaite recuperer l'heure du DS3132 et l'envoyer sur RS485Serial
{
  DateTime now = RTC.now();  // Lire l'heure du module
  RS485Serial.println(now.second());  // Envoyer les secondes sur RS485Serial
  delay(1000);  // Delais pour lire dans le moniteur serie (a enlever en fn de prototypage)
 }


recepteur :
Code: [Select]
#include <SoftwareSerial.h>  // Inclure librairie "SoftwareSerial.h"
#define SSerialRX  11        // Broche 11 pour RX
#define SSerialTX  12        // Broche 12 pour TX
#define SSerialTxControl  13 // Broche 13 pour selection envoie ou reception
#define RS485Transmit HIGH   // Etat haut pour transmission RS485
#define RS485Receive LOW     // Etat bas pour reception RS485
#include <Wire.h>            // Inclure librairie "Wire.h"
#include <RTClib.h>          // Inclure librairie "RTClib.h"

RTC_DS1307 RTC;              // Declarer DS3231 comme DS1307

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);  // Assigner les broches RX et TX a RS485Serial
int byteReceive;
int byteSend;


void setup()
{
  pinMode(SSerialTxControl, OUTPUT);  // Definir SSerialTxControl comme port de sortie
 
  digitalWrite(SSerialTxControl, RS485Receive);  // Indiquer que SSerialTxControl est en reception
  RS485Serial.begin(4800);  // Demarrer liaison RS485 a 4800 bauds
 
  Serial.begin(9600);  // Demarrer Serial à 9600 bauds
  Wire.begin();  // Demarrer librairie "Wire"
  RTC.begin();  // Demarrer librairie "RTC"
}
 
 
void loop()  // On veut lire ce qui arrive sur RS485
{
 
  Serial.println(RS485Serial);  // Lire ce qui arrive sur RS485serial
}


Je n'obtiens que des 1 sur le moniteur série du récepteur.

fdufnews

Faudrait peut-être tester s'il y a des caractères qui sont arrivés avant de faire afficher.
Voir là: https://www.arduino.cc/en/Reference/SoftwareSerialAvailable

infobarquee

normal, tu confonds encore.
essaye ca
Code: [Select]

void loop()  // On veut lire ce qui arrive sur RS485
{
while (RS485Serial.available()>0)[
  
  Serial.println(RS485Serial.read());  // Lire ce qui arrive sur RS485serial
}

 }
AUCUNE AIDE PAR MP

gg25

C'est bien ?
Code: [Select]
void loop()  // On veut lire ce qui arrive sur RS485
{
  while (RS485Serial.available()>0)
  {
  Serial.println(RS485Serial.read());  // Lire ce qui arrive sur RS485serial
  }
}


C'est déjà un peu mieux, j'obtiens en boucle la suite :
13
10
98
111
110
106
111
117
114

infobarquee

c'est ce que j'avais marqué en code ;)
maintenant, c'est à toi de voir ce qui est envoyé, nous, on est pas derrière ton écran  :)
AUCUNE AIDE PAR MP

gg25

Pourrais-tu m'expliquer le rôle de la boucle While ?

Peut-on afficher sur le moniteur série de l'émetteur ce que l'on envoie sur l'autre carte ? (Pour contrôler que tout est bon)

fdufnews

#13
Oct 27, 2015, 06:49 pm Last Edit: Oct 27, 2015, 06:50 pm by fdufnews
Tu fais un Serial.print de ce que tu veux voir.

Autrement ce que tu reçois en boucle c'est bonjour donc si c'est ce que tu envoies c'est bon. Sinon tu es en contact avec un alien qui veut discuter avec toi.

Go Up