[Arduino M0] Les ports Séries UART

Bonjour,

Je travaille actuellement avec des capteurs qui ne communique uniquement en série UART 3.3V.
Je souhaite pouvoir communiquer avec 6 capteurs "en même temps"(ou 1 par 1).
Pour ne pas utiliser des convertisseurs de niveau logique, j'utilise une carte Arduino M0.

On trouve beaucoup de chose sur internet, mais ça donne l'impression que les avis diverges.
Bref.

Je m'aide de ces sites pour comprendre, mais je ne maîtrise pas les termes techniques en anglais.

Il y a quelque chose qu'ai du mal à comprendre au sujet des SERCOM, je vous expose ce que j'ai à peu près compris:

SERCOM 0 : UART
SERCOM 1 : libre
SERCOM 2 : libre
SERCOM 3 : lcommunication SPI
SERCOM 4 : communication I2C
SERCOM 5 : (libre ou programmation --> j'ai un doute)

Pour le SERCOM 0, j'utilise les pin 0 RX et 1 TX.

Pour le SERCOM 1, j'ai le choix:

Pin Arduino 'Pin' SERCOM SERCOM alt

PA18 D10 SERCOM1.2 SERCOM3.2
PA16 D11 SERCOM1.0 SERCOM3.0
PA19 D12 SERCOM1.3 SERCOM3.3
PA17 D13 SERCOM1.1 SERCOM3.1

Pareille pour le SERCOM 2:

Pin Arduino 'Pin' SERCOM SERCOM alt

PA14 D2 SERCOM2.2 SERCOM4.2
PA09 D3 SERCOM0.1 SERCOM2.1
PA08 D4 SERCOM0.0 SERCOM2.0
PA15 D5 SERCOM2.3 SERCOM4.3

Le SERCOM 5 si possible :
Pin Arduino 'Pin' SERCOM SERCOM alt

// PA20 D6 SERCOM5.2 SERCOM3.2
// PA21 D7 SERCOM5.3 SERCOM3.3

Après avoir déterminer les entrées/sorties, je compile le code suivant.

Uart Serial1 (&sercom0, 0, 1, SERCOM_RX_PAD_3, UART_TX_PAD_0);
void SERCOM0_Handler()
{
  Serial1.IrqHandler();
}

Uart Serial2 (&sercom1, 11, 10, SERCOM_RX_PAD_0, UART_TX_PAD_0);
void SERCOM1_Handler()
{
  Serial2.IrqHandler();
}

Uart Serial3( &sercom2, 2, 3, SERCOM_RX_PAD_2, UART_TX_PAD_0 ) ;
void SERCOM2_Handler()
{
 Serial3.IrqHandler();
}

void setup()
{
  SerialUSB.begin(9600);

  Serial1.begin(115000);
  pinPeripheral(0,  PIO_SERCOM);
  pinPeripheral(0,  PIO_SERCOM);

  Serial2.begin(115000);
  pinPeripheral(10, PIO_SERCOM);
  pinPeripheral(11, PIO_SERCOM);

  Serial3.begin(115000);
  pinPeripheral(2,  PIO_SERCOM);
  pinPeripheral(3,  PIO_SERCOM);
}


void loop()
{

}

La compilation de se programme se fait sans problème, mais j'ai peur que la carte Arduino ne le supporte pas quand je le téléverserai.
"EDIT"
correction, j'obtiens ce message d'erreur:

core\variant.cpp.o: In function `SERCOM5_Handler':

C:\Users\GD\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.18\variants\arduino_mzero/variant.cpp:210: multiple definition of `SERCOM0_Handler'

sketch\balai_gauche_TFMini.ino.cpp.o:C:\Users\GD\Documents\Arduino\Codes Rapport\balai_gauche_TFMini/balai_gauche_TFMini.ino:15: first defined here

core\variant.cpp.o: In function `SERCOM5_Handler':

C:\Users\GD\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.18\variants\arduino_mzero/variant.cpp:210: multiple definition of `Serial1'

sketch\balai_gauche_TFMini.ino.cpp.o:C:\Users\GD\Documents\Arduino\Codes Rapport\balai_gauche_TFMini/balai_gauche_TFMini.ino:15: first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Erreur de compilation pour la carte Arduino M0

EDIT n°2:

Je pense que le SERCOM 0 et SERCOM 5 sont déjà définis, voila ce que je dois coder:

#include <Arduino.h>   // required before wiring_private.h
#include "wiring_private.h" // pinPeripheral() function


Uart Serial2 (&sercom1, 11, 10, SERCOM_RX_PAD_0, UART_TX_PAD_2);

void SERCOM1_Handler()
{
  Serial2.IrqHandler();

}


Uart Serial3( &sercom2, 2, 3, SERCOM_RX_PAD_2, UART_TX_PAD_2 ) ;
void SERCOM2_Handler()
{
 Serial3.IrqHandler();
}



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

  Serial1.begin(115000);
  pinPeripheral(0,  PIO_SERCOM);
  pinPeripheral(1,  PIO_SERCOM);
  Serial2.begin(115000);
  pinPeripheral(10, PIO_SERCOM);
  pinPeripheral(11, PIO_SERCOM);
  Serial3.begin(115000);
  pinPeripheral(2,  PIO_SERCOM);
  pinPeripheral(3,  PIO_SERCOM);
}

Et là ça compile parfaitement.

J'ai potentiellement 3 entrées et 3 sorties UART, mais ce n'est pas suffisant pour contrôler 6 capteurs.

En voyant le nombre de Pin non utilisées, je me pose plusieurs question :

  • Peut-on dédier plusieurs ports dans un seul SERCOM?
    Ce que je veux dire, c'est que par exemple, le SERCOM 2 a 4pin paramétrables, puis-je avoir 2 ports UART : les pin 2RX et 3TX ensemble et 4RX et 5TX pareils?

  • Pour le SERCOM 5, est-il utilisable seulement si le port native USB est utilisé?
    Sachant que l'arduino M0 n'a qu'un seul port USB, et que je dois l'utiliser pour renvoyer les informations à un PC.

-Puis-je me servir du SERCOM3 et SERCOM4 en tant que SERCOM UART?

Si c'est les cas, j'ai alors 6 ports séries utilisables (sans compter le port USB), et je n'aurais besoin que d'une seul carte pour mes 6 capteurs.
Sinon, je peux commander une autre carte M0 et je les fais communiquer en I2C.

Merci d'avance.

Bonjour,

J'ai trouvé partiellement la solution à mon problème.

Pour l'instant, je n'utilise que 3 port séries RX / TX et le port série USB.

Au sujet du nombre de port sur 1 SERCOM, je pense que la réponse est de 1, mais je n'en suis pas encore sûr.

Après plusieurs essais, le code suivant initialise bien les différents ports:

#include <Arduino.h>   // required before wiring_private.h
#include "wiring_private.h" // pinPeripheral() function
#include "TFMini.h"

Uart Serial2 (&sercom1, 10, 11, SERCOM_RX_PAD_0, UART_TX_PAD_2);
void SERCOM1_Handler()
{
  Serial2.IrqHandler();
}

Uart Serial3( &sercom2, 2,3, SERCOM_RX_PAD_2, UART_TX_PAD_0 ) ;
void SERCOM2_Handler()
{
 Serial3.IrqHandler();
}


void setup()
{
  //port série avec le PC
  SerialUSB.begin(9600);

// wait for serial port to connect. Needed for native USB port only
  while (!SerialUSB);
  SerialUSB.println ("Test_initialisation");

  Serial1.begin(115200);

  Serial2.begin(115200);
  pinPeripheral(10, PIO_SERCOM);
  pinPeripheral(11, PIO_SERCOM);

  Serial3.begin(115200);
  pinPeripheral(2,  PIO_SERCOM);
  pinPeripheral(3,  PIO_SERCOM);
}

Prochaine étape, c'est pour le branchement optimale, c'est-à-dire avec une protection contre les courts-circuits.
Je sais que pour une communication en I2C avec une Arduino UNO, on peut utiliser des résistances de 10kOhm entre le 5V / SDA et 5V / SCL. Pour une communication RX/TX avec l'Arduino M0, peut on utiliser des résistances entre le 3.3V / RX et 3.3V / TX ? Si oui, à qu'elle valeur pour la résistance?

PS: les essais réalisés: un capteur branché sur 1 port, le port est différent sur chaque essais.

En I2C on utilise des résistances de pull-up car les lignes SDA et SCL sont en collecteur ouvert.
Une ligne série est un moyen de communication point à point. Le TX est câblé sur le RX du vis-à-vis et vice versa.
Aucun risque de court-circuit.

@+

Merci.

Pour mon système, j'utilise 2 Arduino M0. Je les fait communiquer en I2C.

J'ai remarqué qu'il est nécessaire d'appliquer des résistances de 4.7kOhm, d'après le lien suivant:

https://forum.arduino.cc/index.php?topic=447060.0

Le TX est câblé sur le RX du vis-à-vis et vice versa

Bonjour,

tu peux noter que les USART peuvent aussi faire du "single-wire half-duplex", ce qui permet de faire des réseaux à 1 fil ...

cela peut s'avérer judicieux pour la simplicité de la mise en œuvre et l'économie de broches sur le module

mais c'est assez rare du fait que le le bon vieil uno n'offre pas directement cette possibilité