🛠 Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Objectifs
La puce SAM3X8E intègre DEUX contrôleurs CAN — l'argument phare de la Due pour l'automobile et l'industriel — mais la fiche technique officielle est claire : « CAN : Yes (ext. transceiver needed) ». Aucun transceiver n'est soudé sur la carte. Ce tuto monte une liaison CAN 500 kbit/s avec la communauté due_can (collin80) et un petit module transceiver 3,3 V, puis envoie et reçoit des trames.
Matériel
- 1 Arduino Due
- 1 module transceiver CAN 3,3 V (SN65HVD230, ou TJA1050 alimenté en 3,3 V côté logique)
- 2 résistances 120 Ω de terminaison (une à chaque extrémité du bus)
- 1 second nœud CAN pour tester (autre Due + transceiver, ou adaptateur USB-CAN type PCAN/Canable)
- Bibliothèque : due_can (https://github.com/collin80/due_can), via le gestionnaire de libraries
- Note documentée : les broches CAN0 sont définies dans le core (CANRX0=68, CANTX0=69) ; vérifier sur votre révision/clone que ces signaux sont bien accessibles avant de souder quoi que ce soit
Code complet
// Emetteur CAN0 a 500 kbit/s — transceiver externe obligatoire
#include <due_can.h>
void setup {
SerialUSB.begin(115200);
Can0.begin(CAN_500KBPS); // CAN0 @ 500 kbit/s
SerialUSB.println("CAN0 pret (500 kbit/s)");
}
void loop {
// 1) Emission periodique
can_frame tx;
tx.canId = 0x123;
tx.canIdLength = ONE_BIT;
tx.dataLength = 8;
uint32_t t = millis;
for (int i = 0; i < 8; i++) tx.data[i] = (t >> (i * 8)) & 0xFF;
Can0.sendMessage(tx); // non bloquant
// 2) Reception eventuelle
can_frame rx;
if (Can0.getMessage(rx)) {
SerialUSB.printf("Rx id=0x%X len=%u\n", rx.canId, rx.dataLength);
}
delay(10);
}
Vérification attendue
Avec un second nœud (autre Due ou adaptateur USB-CAN configuré à 500 kbit/s), les trames ID 0x123, 8 octets, contenant le millis en little-endian, défilent toutes les 10 ms. Sur l'adaptateur USB-CAN : candump affiche 0123 [8] ... avec un compteur qui augmente. Les deux LED TX/RX du transceiver clignotent.
Erreurs fréquentes
- Chercher un connecteur CAN sur la Due : il n'y en a pas — la mention officielle « ext. transceiver needed » signifie que sans module externe, rien n'apparaît sur le câble, même si le code compile.
- Prendre un transceiver 5 V (MCP2551 seul) : la logique de la Due est en 3,3 V ; utiliser un transceiver 3,3 V ou tolérant 3,3 V sur TXD.
- Oublier les 120 Ω aux deux extrémités du bus : les trames partent, aucune n'arrive, ou des erreurs CRC apparaissent.
- Mélanger les vitesses : 250 kbit/s d'un côté, 500 kbit/s de l'autre = silence radio sans message d'erreur.
- Confondre les broches : CAN0 = RX 68 / TX 69 dans le core (CAN1 = 88/89) ; sur certains clones les signaux ne sont pas routés vers un connecteur — d'où la vérification préalable sur la révision de carte.
- Ne pas déclarer la bibliothèque due_can : le core SAM ne fournit pas d'API CAN native ; sans la lib,
Can0n'existe pas. - Câbler CAN_H/CAN_L à l'envers entre deux nœuds : aucun ACK, aucun message d'erreur ; intervertir les deux fils.
Autres tutoriels pour cette carte
- Faire clignoter la LED de l'Arduino Due et apprivoiser ses deux ports USB
- Lire un potentiomètre avec le vrai ADC 12 bits de la Due
- Allumer une LED externe en respectant les broches 3,3 V et 9 mA de la Due
- Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
- Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle
- Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino