CAN-BUS Shield V2.0

CAN-BUS es un bus industrial común debido a su larga distancia de transmisión, velocidad de comunicación media y alta confiabilidad. Se encuentra comúnmente en herramientas de máquinas modernas, como un bus de diagnóstico automotriz.
Este CAN-BUS Shield adopta el controlador de bus CAN MCP2515 con interfaz SPI y el transceptor CAN MCP2551 para dar a tu Arduino/Seeeduino capacidad CAN-BUS. Con un cable convertidor OBD-II añadido y la biblioteca OBD-II importada, estás listo para construir un dispositivo de diagnóstico a bordo o un registrador de datos.
Versión
Este documento se aplica a las siguientes versiones de productos:
Versión | Fecha de Lanzamiento | Cómo Comprar |
CAN BUS Shield V1.0 | Oct 14, 2012 | |
CAN BUS Shield V1.1 | Aug 10, 2013 | |
CAN BUS Shield V1.2 | Jan 5, 2015 | |
CAN BUS Shield V2.0 | Aug 01,2017 |
Opción Alternativa
Si tu proyecto tiene limitaciones de espacio y tampoco necesitas otras funciones excepto CAN-BUS, aquí tienes un módulo Grove CAN-BUS que es compatible con Arduino, más compacto y rentable, por favor haz clic aquí para visitar su página.
¿Qué pasa si quiero conectar este shield a mi coche?
Si quieres leer datos o controlar tu coche, hay un cable OBD>DB9 disponible para ti, este cable hace más fácil conectar al conector OBD y al conector DB9. Este cable también funcionará con cualquier cosa que tenga un conector OBD. Añadir un interruptor de alimentación hace un clic tan satisfactorio.
Analizador USB-CAN
Si quieres un Analizador de Bus CAN para depurar tu Bus CAN, se recomienda este Analizador USB-CAN.
Características
- Implementa CAN V2.0B con velocidad de hasta 1 Mb/s
- Velocidad de interfaz SPI de hasta 10 MHz
- Tramas de datos y remotas estándar (11 bit) y extendidas (29 bit)
- Dos buffers de recepción con almacenamiento de mensajes priorizados
- Conector DB-9 estándar industrial
- Indicadores LED
El CAN BUS Shield funciona bien con Arduino UNO (ATmega328), Arduino Mega (ATmega1280/2560) así como Arduino Leonardo (ATmega32U4).
Descripción General del Hardware
- Interfaz DB9 - para conectar a la Interfaz OBDII a través de un Cable DBG-OBD.
- V_OBD - Obtiene alimentación de la Interfaz OBDII (desde DB9)
- Indicador Led:
- PWR: alimentación
- TX: parpadea cuando se están enviando datos
- RX: parpadea cuando hay datos recibiendo
- INT: interrupción de datos
- Terminal - CAN_H y CAN_L
- Pines de Arduino UNO
- Conector Grove serial
- Conector Grove I2C
- Pines ICSP
- IC - MCP2551, un transceptor CAN de alta velocidad (hoja de datos)
- IC - MCP2515, controlador CAN independiente con interfaz SPI (hoja de datos)
Cuando uses más de dos CAN Bus Shield en una red, debes tomar en consideración la impedancia. Debes cortar P1 en el PCB con un cuchillo, o simplemente quitar R3 del PCB.
Mapa de pines
El pin FREE está disponible para otros usos.
Interfaz DB9 y OBDii
Pin CS
Cuando produjimos el nuevo lote de CAN-BUS Shield V2, el cable de las almohadillas traseras fue incrustado dentro del PCB, aunque el cable entre las almohadillas ahora no es visible en el exterior, el interior sigue conectado, si quieres cambiar el cableado de las almohadillas, aún necesitas cortar el cableado en el PCB primero.
El pin SPI_CS de V1.2 está conectado a D9 por defecto. Si quieres cambiar a D10, por favor sigue las siguientes instrucciones.
- Paso1: Echa un vistazo a la parte trasera del PCBA, encontrarás una almohadilla llamada CS.
- Paso2: Corta el cable entre la almohadilla 9 y la almohadilla del medio.
- Paso3: Solda la almohadilla del medio y la almohadilla 10.
Ten cuidado con el cortador, es fácil lastimarte a ti mismo o al PCBA.
Pines SPI
Los pines SPI (SCK, MISO, MOSI) están enrutados a los pines ICSP por defecto. Pero para algunas placas, los pines SPI están ubicados en D11~D13. si esto sucede, necesitas hacer algún cambio al PCBA. Echa un vistazo a la parte trasera del PCBA, hay tres almohadillas, MOSI, MISO y SCK, están conectadas a A por defecto. Puedes cambiarlas a B si es necesario.
Para Arduino UNO, Arduino Mega, Arduino Leonardo y cualquier otra placa Arduino basada en AVR, funciona bien con la configuración por defecto.
Ten cuidado cuando vayas a cambiar los pines SPI, es fácil lastimarte a ti mismo o al PCBA.
Comenzando
Aquí tienes un ejemplo simple para mostrarte cómo funciona el CAN-BUS Shield. En este ejemplo necesitamos 2 piezas de CAN-BUS Shields así como Arduino o Seeeduino.
Este ejemplo está construido bajo Arduino IDE versión 1.6.9.
PASO 1: Qué necesitamos
Nombre | Función | Cant | Enlace |
CAN-BUS Shield | Comunicación CAN Bus | 2 | Enlace |
Seeeduino V4.2 | Controlador | 2 | Enlace |
PASO 2: Conexión de Hardware
Inserta cada CAN-BUS Shield en Seeeduino V4.2, y conecta los 2 CAN-BUS Shield entre sí mediante 2 cables puente. Se muestra en las imágenes a continuación.
CAN_H a CAN_H, CAN_L a CAN_L
PASO 3: Software
Por favor sigue los procedimientos de cómo instalar una librería de arduino para instalar la librería del CAN BUS shield.
- Descarga la librería de Arduino Seeed_Arduino_CAN aquí.
Instala la librería en tu Arduino IDE cuando esté descargada.
Uno de los nodos (un nodo significa Seeeduino + CAN_BUS Shield) actúa como maestro, el otro actúa como esclavo. El maestro enviará datos al esclavo constantemente.
Cada nodo puede actuar como maestro antes de que el código sea cargado.
Abre el ejemplo send (File > Examples > Seeed_Arduino_CAN > send) y cárgalo al maestro.
O copia lo siguiente al Arduino IDE y cárgalo:
#include <SPI.h>
#include "mcp2515_can.h"
/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL SerialUSB
#else
#define SERIAL Serial
#endif
const int SPI_CS_PIN = 9;
mcp2515_can CAN(SPI_CS_PIN); // Set CS pin
void setup() {
SERIAL.begin(115200);
while(!Serial){};
while (CAN_OK != CAN.begin(CAN_500KBPS)) { // init can bus : baudrate = 500k
SERIAL.println("CAN BUS Shield init fail");
SERIAL.println(" Init CAN BUS Shield again");
delay(100);
}
SERIAL.println("CAN BUS Shield init ok!");
}
unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void loop() {
// send data: id = 0x00, standrad frame, data len = 8, stmp: data buf
stmp[7] = stmp[7] + 1;
if (stmp[7] == 100) {
stmp[7] = 0;
stmp[6] = stmp[6] + 1;
if (stmp[6] == 100) {
stmp[6] = 0;
stmp[5] = stmp[6] + 1;
}
}
CAN.sendMsgBuf(0x00, 0, 8, stmp);
delay(100); // send data per 100ms
SERIAL.println("CAN BUS sendMsgBuf ok!");
}
PASO 4: Ver Resultado
Abre el Monitor Serie del IDE de Arduino (esclavo), obtendrás los datos enviados desde el maestro.
APIs
1.Establecer la velocidad de baudios
Esta función se utiliza para inicializar la velocidad de baudios del sistema CAN Bus.
Las velocidades de baudios disponibles se listan a continuación:
#define CAN_5KBPS 1
#define CAN_10KBPS 2
#define CAN_20KBPS 3
#define CAN_25KBPS 4
#define CAN_31K25BPS 5
#define CAN_33KBPS 6
#define CAN_40KBPS 7
#define CAN_50KBPS 8
#define CAN_80KBPS 9
#define CAN_83K3BPS 10
#define CAN_95KBPS 11
#define CAN_100KBPS 12
#define CAN_125KBPS 13
#define CAN_200KBPS 14
#define CAN_250KBPS 15
#define CAN_500KBPS 16
#define CAN_666kbps 17
#define CAN_1000KBPS 18
2.Configurar Máscara de Recepción y Filtro
Hay 2 registros de máscara de recepción y 5 registros de filtro en el chip controlador que garantizan que obtengas datos del dispositivo objetivo. Son especialmente útiles en una red grande que consiste en numerosos nodos.
Proporcionamos dos funciones para que utilices estos registros de máscara y filtro. Son:
Máscara:
init_Mask(unsigned char num, unsigned char ext, unsigned char ulData);
Filtro:
init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);
- num representa qué registro usar. Puedes llenar 0 o 1 para máscara y 0 a 5 para filtro.
- ext representa el estado de la trama. 0 significa que es una máscara o filtro para una trama estándar. 1 significa que es para una trama extendida.
- ulData representa el contenido de la máscara o filtro.
3.Verificar Recepción
El MCP2515 puede operar en modo de sondeo, donde el software verifica si hay una trama recibida, o usando pines adicionales para señalar que se ha recibido una trama o se ha completado la transmisión.
Usa la siguiente función para sondear tramas recibidas.
INT8U MCP_CAN::checkReceive(void);
La función devolverá 1 si llega una trama, y 0 si no llega nada.
4.Obtener ID CAN
Cuando llegan algunos datos, puedes usar la siguiente función para obtener el ID CAN del nodo "emisor".
INT32U MCP_CAN::getCanId(void)
5.Enviar Datos
CAN.sendMsgBuf(INT8U id, INT8U ext, INT8U len, data_buf);
Es una función para enviar datos al bus. En la cual:
- id representa de dónde provienen los datos.
- ext representa el estado del marco. '0' significa marco estándar. '1' significa marco extendido.
- len representa la longitud de este marco.
- data_buf es el contenido de este mensaje.
Por ejemplo, en el ejemplo 'send', tenemos:
unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp); //send out the message 'stmp' to the bus and tell other devices this is a standard frame from 0x00.
6.Recibir Datos
La siguiente función se utiliza para recibir datos en el nodo 'receptor':
CAN.readMsgBuf(unsigned char len, unsigned char buf);
En condiciones donde se han establecido máscaras y filtros. Esta función solo puede obtener tramas que cumplan con los requisitos de las máscaras y filtros.
- len representa la longitud de los datos.
- buf es donde almacenas los datos.
7.init_CS
es muy útil para ti usar dos shields CAN-BUS con un Arduino. proporcionamos el pin CS_CAN para que selecciones. si no puedes saber cómo usar el pin CS_CAN, puedes ir a pin CS_CAN para aprender.
void MCP_CAN::init_CS(byte _CS)
- _CS representa el pin que selecciones.(9 o 10)
Generar una Nueva Velocidad de Baudios
Hemos proporcionado muchas velocidades de baudios de uso frecuente, como se muestra a continuación:
#define CAN_5KBPS 1
#define CAN_10KBPS 2
#define CAN_20KBPS 3
#define CAN_25KBPS 4
#define CAN_31KBPS 5
#define CAN_33KBPS 6
#define CAN_40KBPS 7
#define CAN_50KBPS 8
#define CAN_80KBPS 9
#define CAN_83KBPS 10
#define CAN_95KBPS 11
#define CAN_100KBPS 12
#define CAN_125KBPS 13
#define CAN_200KBPS 14
#define CAN_250KBPS 15
#define CAN_500KBPS 16
#define CAN_666KBPS 17
#define CAN_1000KBPS 18
Sin embargo, es posible que aún no puedas encontrar la velocidad que deseas. Aquí proporcionamos un software para ayudarte a calcular la velocidad de baudios que necesitas.
Haz clic aquí para descargar el software, está en chino, pero no te preocupes, es fácil de usar.
Abre el software, lo que necesitas hacer es establecer la velocidad de baudios que deseas, y luego hacer algunas configuraciones simples, después haz clic en calcular.
Entonces obtendrás algunos datos, cfg1, cfg2 y cfg3.
Necesitas añadir algo de código a la biblioteca.
Abre mcp_can_dfs.h, necesitas añadir el código de abajo aproximadamente en la línea 272:
#define MCP_16MHz_xxxkBPS_CFG1 (cfg1) // xxx is the baud rate you need
#define MCP_16MHz_xxxkBPS_CFG2 (cfg2)
#define MCP_16MHz_xxxkBPS_CFG3 (cfg2)
Luego vamos a la línea 390 aproximadamente, añade el siguiente código:
#define CAN_xxxKBPS NUM // xxx is the baudrate you need, and NUM is a number, you need to get a different from the other rates.
Abre mcp_can.cpp, ve a la función mcp2515_configRate (alrededor de la línea 190), luego añade el siguiente código:
case (CAN_xxxKBPS):
cfg1 = MCP_16MHz_xxxkBPS_CFG1;
cfg2 = MCP_16MHz_xxxkBPS_CFG2;
cfg3 = MCP_16MHz_xxxkBPS_CFG3;
break;
Entonces puedes usar la velocidad de baudios que necesites. Y por favor hazme un pull request en github cuando uses una nueva velocidad, para que pueda añadirla a la librería y ayudar a otros usuarios.
Proyectos
Si quieres hacer algunos proyectos increíbles con el shield CAN-BUS, aquí tienes algunos proyectos de referencia.
Juegos CAN BUS de Volkswagen
¿Alguna vez quisiste jugar un simulador de coche/camión con un tablero real en tu PC? ¡Yo también! Estoy intentando controlar un tablero de VW Polo 6R vía CAN Bus con un Arduino Uno y un Seeed CAN Bus Shield. Inspirado por Silas Parker. ¡Gracias Sepp e Is0-Mick por su gran apoyo!
Hackea el CAN-BUS de tu vehículo
Los vehículos modernos vienen equipados con un CAN-BUS Controller Area Network. En lugar de tener un millón de cables yendo de un lado a otro desde varios dispositivos en tu coche hasta la batería, está haciendo uso de un sistema más inteligente.
Todas las funciones electrónicas están conectadas al TIPM (Módulo de Potencia Totalmente Integrado), como solenoides/relés para bloquear las puertas o mini motores para subir las ventanas, etc.
Desde cada nodo (es decir, el panel de interruptores que controla tus ventanas o cerraduras eléctricas de puertas) transmite un mensaje a través del CAN. Cuando el TIPM detecta un mensaje válido reaccionará en consecuencia como bloquear las puertas, encender luces y así sucesivamente.
FAQ
P1: No puedo obtener datos de otro dispositivo CAN.
- Verifica si la conexión es correcta
- Verifica si la configuración de velocidad de baudios es correcta
P2: El monitor serie imprime Init Fail.
- Verifica si la configuración del pin CS coincide con el código. Para CAN Bus Shield V1.1/1.2, el pin CS está conectado a D9, otros están a D10.
Visor de Esquemas en Línea
Recursos
- [PDF]Esquemas CAN-BUS Shield V2.0
- [Eagle]Esquema y PCB del CAN-BUS Shield V2.0
- [Library]Librería Arduino para CAN-BUS Shield
- [Datasheet]Hoja de datos MCP2515
- [Datasheet]Hoja de datos MCP2551
- [Demo]Una Demo OBD
- [Tool]Herramienta de Velocidad de Baudios MCP2515
- [Tool]Analizador USB-CAN
- [Cable]Cable DB9 a OBD2
- [Drawing]Dibujo CAN BUS Shield v2.0 en PDF
- [Drawing]Dibujo CAN BUS Shield v2.0 en DXF
Soporte Técnico y Discusión de Productos
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.