Cómo crear una red CAN Bus con módulos MCP2515 y Arduino

  • El protocolo CAN permite la comunicación eficiente en entornos industriales y automotrices.
  • El módulo MCP2515 es una solución óptima para conectar Arduino a una red CAN.
  • El bus CAN utiliza dos cables (CAN_H y CAN_L) para la transferencia de datos fiable y de larga distancia.
  • Este tutorial te guiará paso a paso por la configuración y el uso de una red CAN con Arduino.

coches conectados

Si te encanta la tecnología y sueles hacer experimentos con Arduino, este artículo te va a fascinar. Hoy veremos cómo montar tu propia red CAN utilizando el módulo MCP2515 y Arduino. Descubrirás cómo realizar la comunicación entre diferentes dispositivos en una red CAN de manera eficiente y confiable. Este tipo de red es muy usada en automóviles y otras aplicaciones industriales.

Ya sea que estés realizando un proyecto automotriz o necesites comunicación entre varios microcontroladores, el bus CAN es perfecto para aplicaciones donde la confiabilidad y el rendimiento son esenciales. Y con el módulo MCP2515, es muy sencillo integrar Arduino en esta red. Así que, prepárate para aprender a fondo sobre el protocolo CAN, la configuración del hardware y la programación necesaria.

¿Qué es el bus CAN?

El bus CAN (Controller Area Network) es un protocolo de comunicación serial que permite que diferentes dispositivos se comuniquen entre sí. Fue desarrollado en 1986 por Bosch, y está diseñado específicamente para aplicaciones automotrices, aunque su uso se ha extendido a otros sectores como la automatización industrial. En este tipo de red, los dispositivos conectados envían y reciben mensajes sin necesidad de un host o controlador central, lo que lo convierte en un protocolo muy eficiente para entornos en los que la comunicación y la confiabilidad son claves.

Un coche moderno contiene más de 70 dispositivos de control, conocidos como ECUs (Unidades de Control Electrónico), conectados entre sí mediante el bus CAN. Gracias a este protocolo, las ECUs intercambian información clave para el funcionamiento del automóvil, como los datos de velocidad del vehículo o la posición del acelerador.

Topología y señales del bus CAN

La topología del sistema CAN es de tipo multimaestro, lo que significa que cualquier dispositivo conectado a la red puede tomar el control del bus para enviar mensajes. Todos los nodos escuchan estos mensajes y deciden si deben responder o ignorarlos.

Desde el punto de vista físico, la comunicación se realiza mediante dos cables: CAN_H y CAN_L. Estos cables están trenzados para minimizar interferencias electromagnéticas. Además, los extremos de la red deben estar terminados con resistencias de 120 ohmios para evitar reflexiones en la señal.

Señalización en CAN

El sistema CAN utiliza dos estados lógicos para la comunicación: dominante y recesivo. En el estado dominante, CAN_H tiene un voltaje de 3.5V y CAN_L de 1.5V. En este estado se transmite un ‘0’ lógico. Por otro lado, en el estado recesivo, ambos cables tienen un voltaje de 2.5V, lo que indica que el bus está libre y se puede transmitir un ‘1’ lógico. Es este cambio de voltajes entre los dos cables lo que permite la transmisión de datos en la red.

El módulo MCP2515

El módulo MCP2515 es una solución ideal para agregar conectividad CAN a tu Arduino. Está compuesto por un controlador CAN (el MCP2515, que sigue la especificación CAN 2.0B) y un transceptor CAN (el TJA1050, que maneja la comunicación física). Estos dos chips trabajan juntos para que puedas enviar y recibir mensajes CAN con tu Arduino a través de la interfaz SPI.

El MCP2515 admite tanto mensajes estándar (11 bits) como extendidos (29 bits) y tiene la capacidad de filtrar mensajes no deseados mediante el uso de máscaras y filtros, lo que descarga trabajo del microcontrolador. Es una excelente opción para proyectos que requieren comunicaciones fiables, ya sea en ambientes ruidosos o sobre largas distancias.

Componentes del módulo MCP2515

El módulo MCP2515 incluye las siguientes partes:

  • Controlador CAN MCP2515: Responsable de realizar todas las funciones de protocolo CAN, como la transmisión y recepción de mensajes.
  • Transceptor CAN TJA1050: Responsable de convertir los datos del controlador CAN en señales para el bus CAN físico y viceversa.
  • Pines de comunicación SPI: Mediante los pines SCK, MOSI, MISO y CS, el MCP2515 se comunica con el Arduino a través de su interfaz SPI.
  • Terminales de bus CAN: Este pequeño bloque de terminales de tornillo está marcado como ‘H’ y ‘L’. CAN_H y CAN_L deben conectarse a los cables de la red CAN.

Cómo montar una red CAN con Arduino

Con el módulo MCP2515, montar una red CAN es relativamente sencillo. A continuación te explico cómo conectar el módulo a tu placa Arduino y cómo configurar el software.

Conexiones del módulo MCP2515

Para empezar, conecta los pines SPI de tu Arduino de la siguiente manera:

  • MISO (Salida del módulo) al pin D12 de Arduino
  • MOSI (Entrada del módulo) al pin D11 de Arduino
  • SCK (Reloj) al pin D13 de Arduino
  • CS (Selección de chip) al pin D10 de Arduino

También necesitarás conectar el pin INT del MCP2515 a un pin digital de Arduino, por ejemplo, el D2, ya que este pin se usa para manejar las interrupciones cuando se recibe un mensaje válido.

No olvides alimentar tu módulo. El pin VCC debe conectarse a 5V, y el pin GND a tierra.

En cuanto a los terminales del bus CAN, conecta CAN_H a CAN_H y CAN_L a CAN_L entre los distintos nodos que quieras interconectar. Recuerda que el bus CAN debe estar terminado en ambos extremos con una resistencia de 120 ohmios.

Programación en Arduino

Una vez que hayas conectado los nodos, es hora de programar tu Arduino para que se comunique con el bus CAN a través del módulo MCP2515. La mejor manera de hacerlo es utilizando una biblioteca adecuada, como la biblioteca ‘mcp2515’.

Primero, necesitas instalar esta biblioteca. Si estás usando el IDE de Arduino, dirígete a Sketch > Include Library > Manage Libraries. Busca ‘mcp2515’ y selecciona la opción de instalar.

Con la biblioteca instalada, puedes proceder a escribir el código para tu nodo transmisor y tu nodo receptor. A continuación te muestro ejemplos básicos para ambos.

Ejemplo de código para el nodo transmisor

Este código envía un mensaje ‘Hola Mundo’ a través del bus CAN cada segundo.

#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo transmisor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); }}void loop() { Serial.print("Enviando mensaje... "); CAN.beginPacket(0x12); CAN.write('H'); CAN.write('o'); CAN.write('l'); CAN.write('a'); CAN.write(' '); CAN.write('M'); CAN.write('u'); CAN.write('n'); CAN.write('d'); CAN.write('o'); CAN.endPacket(); Serial.println("Mensaje enviado correctamente"); delay(1000);}

Ejemplo de código para el nodo receptor

Este código recibe los mensajes del bus CAN y los muestra en el monitor serie.

#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo receptor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); } CAN.onReceive(onReceive);}void loop() {}void onReceive(int packetSize) { Serial.print("Mensaje recibido con ID: 0x"); Serial.print(CAN.packetId(), HEX); Serial.print(" | Tamaño: "); Serial.print(packetSize); Serial.print(" | Datos: "); while (CAN.available()) { Serial.print((char)CAN.read()); } Serial.println();}

Velocidades y distancias en una red CAN

El bus CAN permite la comunicación en diversas velocidades. La velocidad máxima soportada por el MCP2515 es de 1 Mbit/s, pero la longitud del bus limita la velocidad de transmisión. Por ejemplo, a 1 Mbit/s, la longitud máxima del bus es de aproximadamente 40 metros. Sin embargo, si necesitas recorrer distancias mayores, puedes reducir la velocidad. A 125 kbit/s, la longitud del bus puede llegar a los 500 metros.

Es importante planificar bien la red y usar la velocidad adecuada para la longitud del bus y el entorno en el que se va a utilizar, ya que los entornos ruidosos pueden afectar la calidad de la comunicación.

Recuerda también utilizar par trenzado para los cables CAN_H y CAN_L, ya que esto ayuda a reducir las interferencias electromagnéticas y mejora la fiabilidad de la red.

Red CAN con múltiples nodos

Si quieres formar una red con varios nodos, el proceso es muy similar. Lo único que necesitas hacer es asegurarte de conectar todos los nodos en paralelo a las líneas CAN_H y CAN_L. También recuerda colocar las resistencias de terminación solo en los extremos de la línea principal, y no en los nodos intermedios.

En una red más compleja, puedes tener varios nodos que actúan como transmisores y receptores. Cada nodo añade una carga mínima al bus, lo que permite conectar hasta 112 nodos en una red CAN sin afectar significativamente el rendimiento.

Ya sea que estés utilizando un bus CAN en un automóvil para leer datos del motor o en un proyecto industrial para comunicar varios sensores, el módulo MCP2515 permite agregar esta funcionalidad de manera sencilla y eficiente. Este tipo de red es ideal para aplicaciones donde es esencial la baja latencia y la fiabilidad en la transmisión de datos.


Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.