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.