Utilisation d'un autre port série sur l'arduino Mega

Bonjour à tous,

Voila je suis entrain de de récupérer des données de ma carte Arduino Méga (là juste l'etat d'un capteur inductif donc 0 ou 1) et j'aimerais également récupérer des données d'un moteur.
J'ai donc une carte pour mon moteur qui se branche en Tx et Rx, que moi j'ai brancher sur l'UART 2 de la Méga (Rx : 17 et Tx : 16).
J'ai pas très bien saisi comment gérer plusieurs ports série ... Donc ma question c'est comment effectuer des Serial.print sur mon deuxieme UART ?

voila mon code arduino :

#include <Wire.h>
#include <EEPROM.h>
#include <Servo.h>
#include "VescUart.h"
#include "datatypes.h"
#include <SoftwareSerial.h>

float Courant=0;                       //  Variables de mesures génératrice moyenée sur 5 mesures
float MotCourant=0;                    //   Temps de latence de la mesure : 500 ms
float Tension=0;                  
float Puissance=0;
float Duty=0;
float RPM=0;
float KRPM;
int Tacho=0;

bool Capot = A2;
bool openCapot; 


void setup() {
  // initialize both serial ports:
  pinMode(Capot, INPUT); 
  Serial.begin(9600);
  Serial1.begin(9600);
}

struct bldcMeasure measuredValues;

void loop() {
  
  // lis sur l'UART2 (Tx : 16 et Rx : 17)

int i;
                 
i=0;                                      // réinitialisation des variables compteurs
Courant=0;
MotCourant=0;
Tension=0;
Puissance=0;
RPM=0;
Duty=0;


  while (i<=4){                                         // moyennage sur 5 mesures
  VescUartGetValue(measuredValues);
  delay(30);
  Courant=Courant+(measuredValues.avgInputCurrent/5);
  MotCourant=MotCourant+(measuredValues.avgMotorCurrent/5);
  Tension=Tension+(measuredValues.inpVoltage/5);
  Puissance=Puissance+(measuredValues.avgInputCurrent*measuredValues.inpVoltage/5);
  RPM=RPM+(measuredValues.rpm/45);                                                             //   1 tour = 9 impulsions
  Duty=Duty+(measuredValues.dutyCycleNow/5);
  Tacho=(measuredValues.tachometer/5);
  i++;
  }

 KRPM=RPM/1000.0;

Serial2.print("Courant: ");
Serial2.println(Courant);
Serial2.print("Courant moteur: ");
Serial2.println(MotCourant);
Serial2.print("Tension: ");
Serial2.println(Tension);
Serial2.print("Puissance: ");
Serial2.println(Puissance);
Serial2.print("Vitesse: ");
Serial2.println(RPM);
Serial2.print("KRPM: ");
Serial2.println(KRPM);
Serial2.print("Duty: ");
Serial2.println(Duty);
Serial2.print("Tacho: ");
Serial2.println(Tacho);



 // lis sur le port USB de la machine (UART1) 
 openCapot = analogRead(A2); 
 Serial.print("Etat capot = "); 
 Serial.println(openCapot); 
 
  
}

J'ai vu qu'on pouvait l'ecrire de tel facon : Serial2.print, est ce bon ?

Pour être plus précise j'utilise un controllino (qui est une arduino Mega)

J'eseper que c'est assez clair :confused:

voila ce que le port série m'affiche :

@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0
@⸮@⸮@⸮@⸮@⸮Etat capot = 0

oui les caractère ce n'est pas une erreur de frappe ::slight_smile:

Regarde sur la fiche technique du Mega puis ici (réponse 2) pour voir comment lire sur les ports série

Serial: 0 (RX) and 1 (TX);
Serial 1: 19 (RX) and 18 (TX);
Serial 2: 17 (RX) and 16 (TX);
Serial 3: 15 (RX) and 14 (TX).
Used to receive (RX) and transmit (TX) TTL serial data. Pins 0 and 1 are also connected to the corresponding pins of the FTDI USB-to-TTL Serial chip.

Côté code, tu fais pas mal d'erreurs :

  • Tu n'as pas besoin de cette bibliothèque (#include <SoftwareSerial.h>), d'ailleurs tu ne l'utilises pas
  • Ceci me parait bizarre : bool Capot = A2; --> change le en #define Capot A2
  • Enfin, tu lis sur Serial2 alors que tu initialises (dans le setup) les Serial et Serial1 : pas étonnant que tu obtiennes des caractères bizarres. Ceci"@⸮@⸮@⸮@⸮@⸮" correspond à la réponse du Serial2 non initialisé, et le reste au Serial.

Donc change

Serial1.begin(9600);

en

Serial2.begin(9600);

et ça devrait aller mieux

Merci pour le conseil sur le #define.
Oui j'ai vu l'erreur est j'ai remplacé Serial1 par Serial2 mais toujours rien (a part ces caractères bizarres).

Je ne comprends pas pourquoi tu veux utiliser le Serial2 : je crois comprendre que tu lis sur Serial1 (pins 19/RX et 18/TX) mais tu dois écrire tout sur Serial (pins 0/RX et 1/TX), donc ça donnerait ça :

(J'ai un peu mis en forme ton code)

#include <Wire.h>
#include <EEPROM.h>
#include <Servo.h>
#include "VescUart.h"
#include "datatypes.h"

float Courant = 0;                     //  Variables de mesures génératrice moyenée sur 5 mesures
float MotCourant = 0;                  //   Temps de latence de la mesure : 500 ms
float Tension = 0;
float Puissance = 0;
float Duty = 0;
float RPM = 0;
float KRPM;
int   Tacho = 0;

#define Capot A2
bool openCapot;


void setup() {
  // initialize both serial ports:
  pinMode(Capot, INPUT);
  Serial.begin(9600);    // 0 (RX) and 1 (TX)
  Serial1.begin(9600);   // 19 (RX) and 18 (TX)
}

struct bldcMeasure measuredValues;

void loop() {

  // lis sur l'UART1 (Tx : 19 et Rx : 18)

  int i = 0;    // réinitialisation des variables compteurs
  Courant = 0;
  MotCourant = 0;
  Tension = 0;
  Puissance = 0;
  RPM = 0;
  Duty = 0;

  while (i <= 4) {     // moyennage sur 5 mesures
    VescUartGetValue(measuredValues);
    delay(30);
    Courant = Courant + (measuredValues.avgInputCurrent / 5);
    MotCourant = MotCourant + (measuredValues.avgMotorCurrent / 5);
    Tension = Tension + (measuredValues.inpVoltage / 5);
    Puissance = Puissance + (measuredValues.avgInputCurrent * measuredValues.inpVoltage / 5);
    RPM = RPM + (measuredValues.rpm / 45);                                                       //   1 tour = 9 impulsions
    Duty = Duty + (measuredValues.dutyCycleNow / 5);
    Tacho = (measuredValues.tachometer / 5);
    i++;
  }
  KRPM = RPM / 1000.0;

  Serial.print("Courant: ");         Serial2.println(Courant);
  Serial.print("Courant moteur: ");  Serial2.println(MotCourant);
  Serial.print("Tension: ");         Serial2.println(Tension);
  Serial.print("Puissance: ");       Serial2.println(Puissance);
  Serial.print("Vitesse: ");         Serial2.println(RPM);
  Serial.print("KRPM: ");            Serial2.println(KRPM);
  Serial.print("Duty: ");            Serial2.println(Duty);
  Serial.print("Tacho: ");           Serial2.println(Tacho);

  // lit l'entrée A2 analogique
  openCapot = analogRead(A2);
  Serial.print("Etat capot = ");      Serial.println(openCapot);
}

Non j'utilise le Serial2 pour lire les données de mon moteur et le Serial pour les afficher. Mais le probleme c'est que je ne recois rien ! Certes il va y avoir un print "Tension = " mais pas de valeur après ...
Je pense qu'il y a une faute dans ce code car tu met Serial1.begin(9600); et apres Serial2.print ?

J'avais vu et modifié entre temps.

Si ton programme lit les données moteur avec la bibliothèque VescUartControl, il les lit sur Serial1. Il est écrit :

/This library was created on an Adruinio 2560 with different serial ports to have a better possibility
to debug. The serial ports are define with #define:
#define SERIALIO Serial1 for the UART port to VESC
#define DEBUGSERIAL Serial for debuging over USB
So you need here to define the right serial port for your arduino.
If you want to use debug, uncomment DEBUGSERIAL and define a port.
/

Donc le Serial1 est utilisé pour lire les données moteur, et tu affiches tes résultats sur le Serial standard.
As-tu testé les exemples de la bibliothèque ?

Je viens de tester l'exemple de la bibliothèque, mais j'ai changer dans "config.h" le Serial1 en Serial2 et également dans "VestUart.h" #define SERIALIO Serial2 (car j'ai déjà des interruption brancher en Serial1 donc je ne peux pas l'utiliser).
Toujours pas de valeurs qui s'affiche ...
Au niveau du câblage faut-il croiser les fils Tx/Rx ?

Quelle carte Controllino utilises-tu ? Mini, Maxi, Maxi Automation, Mega ?

La Mini dispose d'une seule interface série, les autres de 2 !
En supposant que ce n'est pas la Mini, tu dois trouver quelles pins sont utilisées pour ces liaisons série et les déclarer afin d'être sûr que le programme lit ses données au bon endroit.

Puisque tu arrives à écrire sur la liaison série standard, pas de problème pour celle-ci. L'autre, on peut l'appeler comme on veut (Serial1 ou Serial2), l'important c'est de bien définir les pins qu'elle utilise.

Sur la datasheet de la Mega, on trouve

  • TXD : pin 3
  • RXD : pin 2
    Elles sont accessibles sur les deux broches du connecteur X1 en bas (TX à gauche, RX à droite).

Pour le Serial1 c'est bien

  • TX1 : 18
  • RX1 : 19
    Mais elles servent aussi pour les interruptions.

EDIT
Donc, si tu ne peux pas t'en servir pour le moteur, il faut créer un port série logiciel, avec la bibliothèque SoftwareSerial.

Tu inclus dans ton code:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

Tu initialises dans le setup :

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);

Ensuite, j'imagine qu'il faut rendre la bibliothèque VescUartControl compatible de SoftwareSerial, et ça ne doit pas être simple.

Tu utilises la fonction VescUartGetValue. Quand on regarde le source de VescUart.cpp, cette fonction appelle d'autres fonctions dont seule ReceiveUartMessage est concernée par le port série (ou presque seule). C'est cette fonction qu'il faudrait comprendre et adapter... Mais ça dépasse mes compétences...

Et il y a peut-être des solutions plus simples !

Oui mais il y a également Serial2 (Tx16 et Rx17) qui se trouve sur le X2 et Serial3 mais la avec RS485 sur Rx15 et Tx14.
Donc pourquoi crée un port série logiciel alors que je peux utiliser le Serial2 sur lequel je suis actuellement branché ?
Surtout que ceux-ci (Serial1,2 et 3) sont déjà dans la config de la librairie VescUart ...

J'ai beau lire et relire le site Controllino : ils indiquent 1 ou 2 ports série, pas 3 ni 4. D'où ma question : quelle carte utilises-tu ?

J'utilise une Méga (Controllino MEGA).
C'est bon, problème résolu tout marche ... j'ai changer correctement la librairie après quelques recherches et cela marche.
Merci pour tes conseils, cela m'a bien aidé.

Cool !