🛠 Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Objetivos
El chip SAM3X8E integra DOS controladores CAN — el argumento estrella de la Due para el sector automotriz e industrial — pero la hoja de datos oficial es clara: « CAN : Yes (ext. transceiver needed) ». No hay ningún transceptor soldado en la placa. Este tutorial configura un enlace CAN a 500 kbit/s con la comunidad due_can (collin80) y un pequeño módulo transceptor de 3,3 V, para luego enviar y recibir tramas.
Material
- 1 Arduino Due
- 1 módulo transceptor CAN de 3,3 V (SN65HVD230, o TJA1050 alimentado a 3,3 V en la parte lógica)
- 2 resistencias de terminación de 120 Ω (una en cada extremo del bus)
- 1 segundo nodo CAN para probar (otra Due + transceptor, o adaptador USB-CAN tipo PCAN/Canable)
- Biblioteca: due_can (https://github.com/collin80/due_can), a través del gestor de bibliotecas
- Nota documentada: los pines CAN0 están definidos en el core (CANRX0=68, CANTX0=69); verifica en tu revisión/clone que estas señales sean accesibles antes de soldar nada
Código completo
// 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);
}
Verificación esperada
Con un segundo nodo (otra Due o adaptador USB-CAN configurado a 500 kbit/s), las tramas con ID 0x123, de 8 bytes, que contienen el valor de millis en little-endian, se muestran cada 10 ms. En el adaptador USB-CAN: candump muestra 0123 [8] ... con un contador que aumenta. Los dos LED TX/RX del transceptor parpadean.
Errores frecuentes
- Buscar un conector CAN en la Due: no hay ninguno — la mención oficial « ext. transceiver needed » significa que sin un módulo externo, no aparece nada en el cable, aunque el código compile.
- Usar un transceptor de 5 V (MCP2551 solo): la lógica de la Due es de 3,3 V; usa un transceptor de 3,3 V o tolerante a 3,3 V en TXD.
- Olvidar las resistencias de 120 Ω en los dos extremos del bus: las tramas se envían, pero ninguna llega, o aparecen errores CRC.
- Mezclar velocidades: 250 kbit/s de un lado y 500 kbit/s del otro = silencio total sin mensajes de error.
- Confundir los pines: CAN0 = RX 68 / TX 69 en el core (CAN1 = 88/89); en algunos clones las señales no están enrutadas a un conector — de ahí la verificación previa en la revisión de la placa.
- No declarar la biblioteca due_can: el core SAM no proporciona una API CAN nativa; sin la librería,
Can0no existe. - Conectar CAN_H/CAN_L al revés entre dos nodos: no hay ACK, ni mensajes de error; intercambia los dos cables.
Otros tutoriales para esta placa
- 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)
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino