Utilice este sólido protocolo de comunicación en serie para conectar dos placas Arduino y enviarse datos entre sí.

El bus de la red de área del controlador (CAN) es un protocolo de comunicación robusto y confiable que se usa ampliamente en varias aplicaciones industriales, automotrices y aeroespaciales. Está diseñado para la transmisión de datos entre microcontroladores y dispositivos a través de una red de bus CAN. Puede que aún no lo sepas, pero es lo que hay detrás de esas locas modificaciones en el tablero de los autos que ves en las redes sociales.

Lo guiaremos a través de cómo construir un bus CAN con el módulo CAN MCP2515 usando un Arduino y una placa de prueba. También repasaremos la biblioteca Arduino CAN y demostraremos cómo enviar y recibir datos a través del bus CAN.

¿Qué es un autobús CAN?

El bus CAN es un protocolo de comunicación en serie desarrollado por Bosch en la década de 1980. Es ampliamente utilizado en diversas aplicaciones debido a su alta confiabilidad y robustez. Permite la transmisión de datos entre dispositivos a altas velocidades con una latencia mínima en solo dos líneas: CAN High y CAN Low.

instagram viewer

En 1994, el bus CAN se convirtió en un estándar internacional (ISO 11898) que fue diseñado específicamente para el intercambio rápido de datos en serie entre controladores electrónicos en aplicaciones automotrices. Consulte nuestra guía completa sobre qué es un bus CAN y qué papel juega en los sistemas automotrices para más detalles.

Una de las razones por las que el bus CAN es tan popular es por sus funciones de detección y corrección de errores. El protocolo puede detectar y corregir errores en la transmisión de datos. Esto lo hace ideal para aplicaciones donde la integridad de los datos es fundamental, como en la automatización industrial.

Conociendo el Módulo CAN MCP2515

El módulo controlador de bus CAN MCP2515 es un dispositivo que proporciona un soporte excepcional para el protocolo CAN versión 2.0B ampliamente utilizado. Este módulo es ideal para la comunicación a altas velocidades de datos de hasta 1 Mbps.

El MCP2515 IC es un controlador CAN independiente con una interfaz SPI que permite la comunicación con una amplia gama de microcontroladores. El IC TJA1050, por otro lado, funciona como una interfaz entre el IC del controlador CAN MCP2515 y el bus CAN físico.

Para mayor comodidad, hay un puente que le permite conectar una terminación de 120 ohmios, lo que facilita aún más la conexión de los cables al CAN_H & PUEDO tornillos para comunicación con otros módulos CAN.

Característica

Especificación

Transceptor

TJA1050

Interfaz de microcontrolador

SPI (permite la integración de bus Multi CAN)

Oscilador de cristal

8MHz

Terminación

120Ω

Velocidad

1Mbps

El consumo de energía

Funcionamiento en espera de baja corriente

Dimensión

40x28mm

Capacidad del nodo

Admite hasta 112 nodos

Puede obtener información adicional de la Hoja de datos MCP2515 en caso de que necesite este módulo para un proyecto más avanzado.

Estructura del mensaje CAN

La estructura del mensaje CAN consta de varios segmentos, pero los segmentos más críticos para este proyecto son el identificador y los datos. El identificador, también conocido como CAN ID o Número de grupo de parámetros (PGN), identifica los dispositivos en el CAN red, y la longitud del identificador puede ser de 11 o 29 bits, dependiendo del tipo de protocolo CAN usado.

Mientras tanto, los datos representan los datos reales del sensor/control que se transmiten. Los datos pueden tener entre 0 y 8 bytes de longitud, y el código de longitud de datos (DLC) indica la cantidad de bytes de datos presentes.

La biblioteca de bus CAN Arduino MCP2515

Esta biblioteca implementa la Protocolo CAN V2.0B, que puede operar a velocidades de hasta 1Mbps. Proporciona una interfaz SPI que puede operar a velocidades de hasta 10 MHz mientras admite datos estándar (11 bits) y extendidos (29 bits). Además, viene con dos búferes de recepción, que permiten el almacenamiento de mensajes priorizados.

Inicialización del bus CAN

Aquí está el código de configuración que necesitará para inicializar el bus CAN:

#incluir
#incluir

MCP2515 mcp2515(10); // Establecer pin CS

vacíoconfiguración(){
mientras (!De serie);
De serie.comenzar(9600);
SPI.comenzar(); //Comienza la comunicación SPI

mcp2515.restablecer();
mcp2515.setTasa de bits (CAN_500KBPS, MCP_8MHZ);
mcp2515.setModoNormal();
}

Esto inicializa el MCP2515 con una tasa de bits CAN de 500 Kbps y una frecuencia de oscilador de 8 MHz.

MCP2515 CAN Modos operativos

Hay tres modos operativos utilizados con el controlador de bus CAN MCP2515:

  • establecerModoNormal(): configura el controlador para enviar y recibir mensajes.
  • establecer modo de bucle invertido (): configura el controlador para enviar y recibir mensajes, pero los mensajes que envía también serán recibidos por sí mismo.
  • establecerListenOnlyMode(): configura el controlador para que solo reciba mensajes.

Estas son llamadas de función que se utilizan para establecer el modo operativo del controlador de bus CAN MCP2515.

mcp2515.setModoNormal();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Envío de datos a través del bus CAN

Para enviar un mensaje a través del bus CAN, utilice el enviarMsgBuf() método:

no firmadocarbonizarse datos[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, datos);

Esto envía un mensaje con la ID 0x01 y una carga de datos de {0x01, 0x02, 0x03, 0x04}. El primer parámetro es CAN ID, el segundo es la prioridad del mensaje, el tercero es la longitud de la carga útil de datos y el cuarto es la carga útil de datos en sí.

El enviarMsgBuf() El método devuelve un valor que indica si el mensaje se envió correctamente o no. Puede comprobar este valor llamando al comprobarError() método:

si (CAN.checkError()) {
De serie.imprimir("Error al enviar el mensaje".);
}

Esto verifica si ocurrió un error durante la transmisión del mensaje e imprime un mensaje de error si es necesario.

Recepción de datos desde el bus CAN

Para recibir un mensaje a través del bus CAN, puede utilizar el leerMsgBuf() método:

no firmadocarbonizarse len = 0;
no firmadocarbonizarse abue[8];
no firmadocarbonizarse canID = 0;

si (CAN.checkReceive()) {
CAN.readMsgBuf(&largo, buf);
canID = CAN.getCanId();
}

Esto comprueba si hay un mensaje disponible en el bus CAN y luego lee el mensaje en el buf formación. La longitud del mensaje se almacena en el Len variable, y el ID del mensaje se almacena en el CanID variable.

Una vez que haya recibido un mensaje, puede procesar la carga útil de datos según sea necesario. Por ejemplo, podría imprimir la carga útil de datos en el monitor serie:

De serie.imprimir("Mensaje recibido con ID");
De serie.imprimir(ID de can, HEX);
De serie.imprimir(" y datos: ");

para (En t yo = 0; yo De serie.imprimir(buf[i], HEX);
De serie.imprimir(" ");
}

De serie.imprimir();

Esto imprime la ID del mensaje recibido y la carga útil de datos en el monitor serie.

Cómo conectar un transceptor de bus CAN a una placa de pruebas

Para construir un bus CAN para conectar dos dispositivos en este proyecto de ejemplo, necesitará:

  • Dos microcontroladores (dos placas Arduino Nano para este ejemplo)
  • Dos módulos CAN MCP2515
  • una placa de prueba
  • Cables puente
  • Un módulo de pantalla LCD I2C 16x2
  • Sensor ultrasónico HC-SR04

Para este ejemplo de proyecto, se utilizan cuatro bibliotecas en el boceto de Arduino. ahí está el Nuevo ping biblioteca, que proporciona una interfaz fácil de usar para el sensor ultrasónico, así como el biblioteca SPI, que facilita la comunicación entre la placa Arduino y el controlador de bus CAN MCP2515. El LiquidCrystal_I2C biblioteca se utiliza para el módulo de visualización.

Por último, está el biblioteca mcp2515 para interactuar con el chip MCP2515, lo que nos permite transmitir datos fácilmente a través de la red de bus CAN.

Configuración del hardware (ejemplo HC-SR04)

En este proyecto que utiliza un sensor HC-SR04 y una pantalla LCD, una placa Arduino Nano actuará como receptor, mientras que el otro Arduino actuará como emisor. Conecte los componentes de su transmisor de acuerdo con el diagrama de cableado a continuación:

Aquí está el diagrama para el circuito del receptor:

Finalmente, conecte los dos nodos juntos usando el CAN_H y PUEDO líneas como se muestra:

Al conectar los módulos, es importante asegurarse de que el voltaje de la fuente de alimentación esté dentro del rango especificado y que el PUEDE H y PUEDO pines están correctamente conectados al bus.

Programación del módulo de bus CAN MCP2515

Tenga en cuenta que al programar el módulo MCP2515, es importante usar la velocidad de bits correcta para garantizar una comunicación exitosa con otros dispositivos CAN en la red.

Código del remitente:

#incluir
#incluir
#incluir

MCP2515 mcp2515(10);
constantebyte trigPin = 3;
constantebyte echoPin = 4;
Nuevo ping sonar(trigPin, echoPin, 200);

estructuracan_framepuedemensaje;

vacíoconfiguración(){
De serie.comenzar(9600);
mcp2515.restablecer();
mcp2515.setTasa de bits (CAN_500KBPS, MCP_8MHZ);
mcp2515.setModoNormal();
}

vacíobucle(){
no firmadoEn t distancia = sonar.ping_cm();
canMsg.can_id = 0x036; // ID de CAN como 0x036
canMsg.can_dlc = 8; //Longitud de datos CAN como 8
canMsg.datos[0] = distancia; //Actualizar valor de humedad en [0]
canMsg.datos[1] = 0x00; // Resto todo con 0
canMsg.datos[2] = 0x00;
canMsg.datos[3] = 0x00;
canMsg.datos[4] = 0x00;
canMsg.datos[5] = 0x00;
canMsg.datos[6] = 0x00;
canMsg.datos[7] = 0x00;

mcp2515.sendMessage(&canMsg);//Envía el mensaje CAN
demora(100);
}

Código del receptor:

#incluir
#incluir
#incluir

MCP2515 mcp2515(10);
LiquidCrystal_I2C pantalla de cristal líquido(0x27,16,2);
estructuracan_framepuedemensaje;

vacíoconfiguración(){
De serie.comenzar(9600);

mcp2515.restablecer();
mcp2515.setTasa de bits (CAN_500KBPS, MCP_8MHZ);
mcp2515.setModoNormal();
lcd.init();
LCD luz de fondo();
LCD.conjuntoCursor(0, 0);
LCD.imprimir("MUO CAN TUTORIAL");
demora(3000);
LCD.claro();
}

vacíobucle(){
si (mcp2515.leer el mensaje(&canMsg) == MCP2515::ERROR_OK) // Para recibir datos
{
En t distancia = canMsg.data[0];
LCD.conjuntoCursor(0,0);
LCD.imprimir("Distancia: ");
LCD.imprimir(distancia);
LCD.imprimir("cm ");
}
}

Lleve sus proyectos Arduino al siguiente nivel

La combinación del bus CAN y Arduino proporciona una plataforma poderosa para construir o aprender redes de comunicación sofisticadas que se utilizan en diversas aplicaciones. Si bien puede parecer una curva de aprendizaje empinada, tener su propia configuración en una placa de prueba es una forma bastante útil de aprender a usar una red de bus CAN en proyectos complejos de bricolaje.