1
Bus CAN / Mes débuts en CAN
« le: février 09, 2024, 10:42:32 am »
Bonjour,
Je me suis décidé à écrire ce fil après avoir vraiment rencontré pas mal de difficulté à mettre en place un réseau CAN qui fonctionne. (et ce n'est pas encore tout à fait le cas...)
Le but premier pour moi était de faire tourner sur arduino même si je m'aperçois que la solution avec un ESP 32 peut apporter pas mal de choses.
Le premier point de difficulté est le peu d'informations disponibles sur le Net, le CAN n'est pas si souvent employé dans les projets DIY autres que ferroviaire. La bibliotheque ACAN fonctionne trés bien mais elle est trés pauvre en exemple et ils ne sont trés parlants.
L'une des meilleures sources d'informations est sur ce site et c'est l'article de Jean-Luc : https://www.locoduino.org/spip.php?article268
C'est en reprenant l'article ligne par ligne que j'ai réussi à bien tout faire fonctionner.
juste une petite critique: dans les exemples, il y' a des lignes qui ne servent pas ( des include Canbuffer, ACANsettings, ...) On se pose beaucoup de questions à propos de ces lignes quand ça ne marche chez nous.
Au final, l'origine principal de mes déboires est la sensibilité de la liaison SPI: j'ai au départ utilisé 2 UNO avec 2 Shield Can. j'avais toujours des erreurs "problemes de connexion", j'ai trituré le code dans tout les sens pour finir par m'apercevoir qu'il fallait appuyer un peu sur le shield pour que ça marche (pourtant enfoncé à fond), de même, j'ai ensuite voulu utilser des Nano avec des modules MCP2515, je m'en suis sorti après avoir changé des cables dupont, et même la platine d'essai avec bornier qui reçoit le nano, la continuité au testeur était bonne entre les bornes du nano et les bornes du module. Ca parait trés bête, c'est du niveau débutant++ mais c'est des heures de passée et de la perseverance pour au final arriver à faire marcher. Je pense qu'on a moins de soucis en partant sur un CI et c'est en tous cas important de chercher de ce coté quand on expérimente et que ça ne marche pas.
Je me permet donc de mettre un bout de code pour UNO ou NANO qui ne contient qu'une seule chose et rien d'autre: l'initiation du CAN. Si vous avez "connexion OK", c'est déja une belle etape de franchie et qu'on commencer à s'amuser avec les messages. Juste vérifier que la broche int est raccordé à la broche D2 et que le CS à la broche D10.
Au final, cette partie est la plus pénible quand ca ne marche pas. La partie échange de message est beaucoup plus intéressante et facile à manipuler . La liaison CAN est en effet trés fiable et je n'ai constaté aucune perte ou erreur d'infos dans mes essais
Je me suis décidé à écrire ce fil après avoir vraiment rencontré pas mal de difficulté à mettre en place un réseau CAN qui fonctionne. (et ce n'est pas encore tout à fait le cas...)
Le but premier pour moi était de faire tourner sur arduino même si je m'aperçois que la solution avec un ESP 32 peut apporter pas mal de choses.
Le premier point de difficulté est le peu d'informations disponibles sur le Net, le CAN n'est pas si souvent employé dans les projets DIY autres que ferroviaire. La bibliotheque ACAN fonctionne trés bien mais elle est trés pauvre en exemple et ils ne sont trés parlants.
L'une des meilleures sources d'informations est sur ce site et c'est l'article de Jean-Luc : https://www.locoduino.org/spip.php?article268
C'est en reprenant l'article ligne par ligne que j'ai réussi à bien tout faire fonctionner.
juste une petite critique: dans les exemples, il y' a des lignes qui ne servent pas ( des include Canbuffer, ACANsettings, ...) On se pose beaucoup de questions à propos de ces lignes quand ça ne marche chez nous.
Au final, l'origine principal de mes déboires est la sensibilité de la liaison SPI: j'ai au départ utilisé 2 UNO avec 2 Shield Can. j'avais toujours des erreurs "problemes de connexion", j'ai trituré le code dans tout les sens pour finir par m'apercevoir qu'il fallait appuyer un peu sur le shield pour que ça marche (pourtant enfoncé à fond), de même, j'ai ensuite voulu utilser des Nano avec des modules MCP2515, je m'en suis sorti après avoir changé des cables dupont, et même la platine d'essai avec bornier qui reçoit le nano, la continuité au testeur était bonne entre les bornes du nano et les bornes du module. Ca parait trés bête, c'est du niveau débutant++ mais c'est des heures de passée et de la perseverance pour au final arriver à faire marcher. Je pense qu'on a moins de soucis en partant sur un CI et c'est en tous cas important de chercher de ce coté quand on expérimente et que ça ne marche pas.
Je me permet donc de mettre un bout de code pour UNO ou NANO qui ne contient qu'une seule chose et rien d'autre: l'initiation du CAN. Si vous avez "connexion OK", c'est déja une belle etape de franchie et qu'on commencer à s'amuser avec les messages. Juste vérifier que la broche int est raccordé à la broche D2 et que le CS à la broche D10.
Code: [Sélectionner]
#include <ACAN2515.h> // c'est quand même le minimum
//Broches pour le chip select et l'interruption du MCP2515
static const uint8_t MCP2515_CS = 10;
static const uint8_t MCP2515_INT = 2;
/*
* L'objet pour piloter le MCP2515. SPI designe l'objet
* utilise pour la connexion SPI car sur certaines cartes
* notamment les Teensy, il peut y avoir plusieurs SPI.
*/
ACAN2515 controleurCAN(MCP2515_CS, SPI, MCP2515_INT);
/*
* La frequence du quartz du MCP2515 en hertz.
* Sur les cartes CAN que l'on peut trouvez chez les revendeurs
* chinois, il s'agit generalement d'un quartz 8MHz
*/
static const uint32_t FREQUENCE_DU_QUARTZ = 8ul * 1000ul * 1000ul;
//La fréquence du bus CAN
static const uint32_t FREQUENCE_DU_BUS_CAN = 125ul * 1000ul;
CANMessage canSend; // ces 2 lignes sont inutiles pour initialiser le CAN
CANMessage canRec; // on crée juste 2 objets messages can: un pour envoyer, un pour recevoir
void setup()
{
/* Demarre la ligne serie */
Serial.begin(115200);
/* Demarre le SPI */
SPI.begin();
/* Configure le MCP2515 */
Serial.println("Configuration du MCP2515 ");
/* Fixe la vitesse du bus a 125 kbits/s */
ACAN2515Settings reglages(FREQUENCE_DU_QUARTZ, FREQUENCE_DU_BUS_CAN);
/* Demarre le CAN */
const uint16_t codeErreur = controleurCAN.begin(reglages, [] { controleurCAN.isr(); } );
/* Verifie que tout est ok */
if (codeErreur == 0) {
Serial.println("Configuration ok");
}
else {
Serial.println("Probleme de connexion");
while (1);
}
void loop()
{
//Rien pour l'instant
}
Au final, cette partie est la plus pénible quand ca ne marche pas. La partie échange de message est beaucoup plus intéressante et facile à manipuler . La liaison CAN est en effet trés fiable et je n'ai constaté aucune perte ou erreur d'infos dans mes essais