Liaison RX-TX entre Mega et Nano

Bonjour,

j'ai réalisé une liaison RX-TX entre ma Mega (pin 16 et 17) ma Nano (pin RX0 et TX1).

Je souhaite envoyer une instruction depuis la Mega pour passer la pin digitale 2 de la Nano soit high ou low selon les besoins.

J'ai donc écrit ceci en complément des codes déjà présents sur les cartes:

Pour la Mega (maître) :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(16, 17);

  // Variables pour le programme
    int hProg; // variable Heure pour programme: Hx100 + minutes
          
void setup()

  {
   mySerial.begin(57600);
  }

void loop()

  {   
    {
      if (hProg >= 700 &&  hProg <= 2300)
        {
          {if (mySerial.available())  
              { 
                mySerial.write("on");  
              }
          }
        }
      else
        {
          {
            if (mySerial.available())  
              { 
                mySerial.write("off");  
              }
          }
        }       
     }
  }

Pour la Nano (esclave) :

#include <SoftwareSerial.h>


SoftwareSerial mySerial(16, 17); // RX, TX

  int e;
  int alimLaser = 2;  
          
void setup()

  {
    pinMode(alimLaser, OUTPUT);
    Serial.begin(9600);
    mySerial.begin(57600);  
  }

void loop()

  {  
    if (mySerial.available())
      {
        if (mySerial.read() == "on")
          {
            digitalWrite(alimLaser, HIGH);
            e = 1;
          }
        else if (mySerial.read() == "off")
          {
            digitalWrite(alimLaser, LOW);
            e = 0;
          }
      }
  
      }

Je précise bien que ce sont des bouts de codes à ajouter à ce qui existe déjà.

Ai je commis des erreurs ?

Merci par avance pour votre aide.

bonjour,

Je précise bien que ce sont des bouts de codes à ajouter à ce qui existe déjà.

Ai je commis des erreurs ?

on doit deviner quoi?
si ca fonctionne ou non?

:slight_smile:

je voulais juste savoir si en ajoutant ces lignes de codes ma liaison série fonctionnerait entre les deux cartes.

EGT59:
je voulais juste savoir si en ajoutant ces lignes de codes ma liaison série fonctionnerait entre les deux cartes.

Bonjour,

La réponse est clairement non.

Sur la nano

  • tu utilises SoftwareSerial sur les pins 16 et 17 alors que tu dis que tu as réalisé une liaison sur TX et RX
  • la fonction read() ne lit qu'un caractère alors que tu dois lire une chaine

Sur la mega

  • tu attend d'avoir reçu quelque chose avant d'envoyer alors que tu ne va rien recevoir
  • tu utilises write au lieu ce print pour envoyer une chaine
  • tu n'es pas obligé d'utiliser SoftwareSerial car la mega a 4 liaisons serie.

merci pour ton aide

Je vais rectifier çà.

Voilà les codes rectifiés :

pour la mega :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(16,17);

  // Variables pour le programme
    int hProg; // variable Heure pour programme: Hx100 + minutes
          
void setup()

  {
   mySerial.begin(57600);
  }

void loop()

  {   
    {
      if (hProg >= 700 &&  hProg <= 2300)
        {
          mySerial.print("o");  
        }
        
      else
        {
          mySerial.print("n");  
        }
     }
  }

Pour la nano :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0,1); // RX, TX

  int e;
  int alimLaser = 2;  
          
void setup()

  {
    pinMode(alimLaser, OUTPUT);
    Serial.begin(9600);
    mySerial.begin(57600);  
  }

void loop()

  {  
    if (mySerial.available())
      {
        if (mySerial.read() == "o")
          {
            digitalWrite(alimLaser, HIGH);
            e = 1;
          }
        else if (mySerial.read() == "n")
          {
            digitalWrite(alimLaser, LOW);
            e = 0;
          }
      }
  }

Sur la mega, j'utilise la liaison série 2, ok, mais si je ne spécifie pas le SoftwareSerial ça ne compile pas car il ne connait pas mySerial.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0,1); // RX, TX

auncun sens, pin 0-1 sont déjà des serial
donc change de pin 2-3 par exemple

The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX).

pourquoi changer de pin? j'ai connecté mes câbles à ces pins là qui, comme tu le dis, sont faites pour ça.

Si je ne déclare pas ces pins, ça ne compile pas comme les 16 et 17 sur la mega. J'ai compris que les pins 16 et 17 c'est le Serial2 mais je ne sais pas comment exploité celà.

Si tu as un tuto qui m'explique comment faire, je suis preneur car j'aime bien comprendre

Merci pour ton aide

Pourquoi ça?

   if (mySerial.available())

Il ne faut faire qu'une seule lecture dans la loop
si tu fais

       if (mySerial.read() == "o")

et que c'est faux, tu as à jamais perdu l'octet lu

"o" ça c'est une chaine
'o' ça c'est un caractère

Je te mets un exemple pour t'inspirer
------- mega -------

// programme de la mega
// Utilisation de Serial2 TX:16  RX:17

// Variables pour le programme
int hProg; // variable Heure pour programme: Hx100 + minutes

void setup()
{
  Serial2.begin(57600);
}

void loop()
{
  if (hProg >= 700 &&  hProg <= 2300)
  {
    Serial2.println("on");
  }
  else
  {
    Serial2.println("off");
  }

  delay(1000);
}

------- nano -------

// programme nano

#include <SoftwareSerial.h>

SoftwareSerial mySerial(4, 5); // RX, TX

int e;
int alimLaser = 2;

void setup()

{
  pinMode(alimLaser, OUTPUT);
  Serial.begin(9600);
  mySerial.begin(57600);
}

void loop()

{
  char buf[10];     // buffer de réception
  if (mySerial.available())
  {
    mySerial.readBytesUntil('\n', buf, sizeof buf); // lecture jusqu'à la fin de ligne
    if (strcmp(buf, "on") == 0)
    {
      digitalWrite(alimLaser, HIGH);
      e = 1;
    }
    else if (strcmp(buf, "off") == 0)
    {
      digitalWrite(alimLaser, LOW);
      e = 0;
    }
  }
}

ok merci, je vais potasser le sujet sérieusement car çà à l'air + compliqué que prévu, surtout pour un débutant comme moi.

En tous cas merci pour ton aide et ta patience

pourquoi changer de pin? j'ai connecté mes câbles à ces pins là qui, comme tu le dis, sont faites pour ça.

tu réponds à ta question, rx et tx sur la nano sont déjà des serial, donc inutile des les remettre en

SoftwareSerial mySerial(0,1); // RX, TX

Serial.begin(5757600) ; suffit
mais dans ce cas, tu ne peux plus utiliser le port usb pour vérifier ce que tu recois.

   Serial.begin(9600);
    mySerial.begin(57600);

donc, ce que karmil a mis fonctionnera pour la nano, tu sépare le serial de réception et le serial pour l'usb

Si je ne déclare pas ces pins, ça ne compile pas comme les 16 et 17 sur la mega. J'ai compris que les pins 16 et 17 c'est le Serial2 mais je ne sais pas comment exploité celà.

c'est indiqué ici et karmil donne la réponse

The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX).

pour un port serial existant, pas besoin de faire une déclaration sofwtare serial
pour un port serial virtuel, oui.

Bonjour,

:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

La journée commence bien.

J'ai enfin compris la différence entre les liaisons "série" existantes et à créer grâce à vos explications.

Je vais ressouder mes connections RX/TX ailleurs que sur 0 et 1 sur ma nano car c'est mieux de pouvoir conserver un oeil sur ce qui se passe comme le souligne infobarquee.

Un grand merci pour votre aide.

bonjour,

Je reviens sur le bout de code que Kamill m'a gentillement donnplus haut pour la Mega qui émet l'instruction.

J'ai supprimé de mon code toutes les intructions delay car bloquantes. Le delay(1000) met le souk dans mon code entier. Peut on passer de 1000 à 10? la nano aura t elle le temps de lire l'instruction ou utiliser une autre fonction genre while?
J'ai essayé avec millis mais j'y arrive pas

Merci de m'aider un peu