Arduino Forum

International => Français => Topic started by: gabi974 on Jul 11, 2018, 05:45 pm

Title: [Arduino M0] Les ports Séries UART
Post by: gabi974 on Jul 11, 2018, 05:45 pm
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.
https://www.arduino.cc/en/Tutorial/SamdSercom
https://learn.adafruit.com/using-atsamd21-sercom-to-add-more-spi-i2c-serial-ports?view=all#creating-a-new-serial

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.

Code: [Select]


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:
Code: [Select]

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:
Code: [Select]


#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.
Title: Re: [Arduino M0] Les ports Séries UART
Post by: gabi974 on Jul 12, 2018, 11:30 am
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:

Code: [Select]


#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.
Title: Re: [Arduino M0] Les ports Séries UART
Post by: hbachetti on Jul 12, 2018, 11:51 am
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.

@+
Title: Re: [Arduino M0] Les ports Séries UART
Post by: gabi974 on Jul 12, 2018, 01:47 pm
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

Title: Re: [Arduino M0] Les ports Séries UART
Post by: trimarco232 on Jul 13, 2018, 07:22 am
Quote
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é