Crea tu propia red CAN con módulos MCP2515 y Arduino

Si eres un apasionado de la tecnología y te encanta experimentar con Arduino, este artículo es perfecto para ti. En esta guía te mostraremos cómo crear tu propia red CAN utilizando módulos MCP2515 y Arduino. ¡Descubre cómo poner en práctica tus conocimientos y llevar tus proyectos al siguiente nivel!

Los coches solían disponer de más de 2.000 metros de cable que conectaban, por ejemplo, los interruptores del salpicadero directamente con los faros y las luces traseras. A medida que los automóviles se volvieron más complejos, esta simple lógica dejó de funcionar. En 1986, Bosch introdujo el sistema de bus CAN, que resolvió este problema y abarató y facilitó la fabricación de automóviles. CAN es ahora el estándar de la industria y se utiliza en todo, desde automóviles y camiones hasta autobuses, tractores, aviones y barcos.

Si sabe cómo leer y analizar mensajes CAN en su Arduino, puede obtener datos de su automóvil, como la temperatura del refrigerante, la posición del acelerador, la velocidad del vehículo y la velocidad del motor, y usarlos en sus proyectos de tablero.

El módulo de interfaz de bus CAN MCP2515 es la mejor solución para agregar conectividad CAN con interfaz SPI a su Arduino. Este tutorial le mostrará cómo conectar el módulo MCP2515 a un Arduino, pero primero una introducción rápida al protocolo CAN.

Conceptos básicos del sistema de bus CAN

Una red de área de controlador (bus CAN) es un estándar de comunicación que permite que los dispositivos del vehículo se comuniquen entre sí sin una computadora host.

Para comprender mejor el bus CAN, imagine su automóvil como un cuerpo humano. En este contexto, el bus CAN es el sistema nervioso.

Crea tu propia red CAN con módulos MCP2515 y Arduino

De manera similar a cómo el sistema nervioso permite la comunicación entre diferentes partes del cuerpo, el bus CAN permite la comunicación entre diferentes buses CAN nodotambién conocido como Dispositivos de control electrónico. (o dispositivos de control).

Un automóvil moderno tiene más de 70 dispositivos de control, cada uno de los cuales es responsable de realizar una tarea específica. Aunque estos dispositivos de control pueden realizar una única tarea de manera eficiente, necesitan compartir información entre sí. Por ejemplo, la unidad de control del motor envía la velocidad actual del motor al grupo de instrumentos, donde se muestra en un tacómetro; De manera similar, el módulo de control de la puerta del conductor envía un mensaje al módulo de control de la puerta del pasajero para operar la ventana.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Los dispositivos de control están conectados al bus en uno Configuración multimaestro. Esto significa que cada dispositivo de control puede tomar el control del bus y enviar información (p. ej. datos de sensores) a través de él. Los datos enviados son aceptados por todos los demás dispositivos de control del bus CAN. Cada dispositivo de control puede entonces leer los datos y decidir si los acepta o los ignora.

Topología del bus CAN

La comunicación física se realiza a través del mazo de cables del bus CAN, que consta de dos líneas, PUEDE bajo Y PUEDE alto. Ambos cables están fuertemente trenzados para que la interferencia electromagnética afecte la señal en ambos cables por igual, minimizando así los errores.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Los otros extremos del cable están terminados con resistencias de 120 ohmios. Debido a que el bus CAN es un bus de datos de alta velocidad, si el bus no está terminado, la señal se reflejará e interferirá con la siguiente señal de datos en la línea, lo que potencialmente interrumpirá la comunicación y provocará que el bus falle.

Crea tu propia red CAN con módulos MCP2515 y Arduino

señalización CAN

Para permitir la transmisión de datos en estas líneas, se cambian sus niveles de voltaje. Estos cambios en los niveles de voltaje luego se traducen en niveles lógicos que permiten que los nodos de la red se comuniquen entre sí.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Para transmitir un «1 lógico» en el bus CAN, el voltaje en ambas líneas se establece en 2,5 voltios (es decir, no hay diferencia de voltaje). Esta condición se conoce como condición recesivae indica que el bus CAN está disponible para su uso por cada nodo.

En cambio, para transmitir «0 lógico», la línea CAN alta se establece en 3,5 voltios y la línea CAN baja en 1,5 voltios (es decir, hay una diferencia de voltaje de 2 V). Este estado del autobús se conoce como Estado dominanteque le dice a cada nodo en el bus que otro nodo está transmitiendo y que espere a que se complete la transmisión antes de enviar su mensaje.

Nodo de bus CAN

Cada nodo CAN contiene un transceptor CAN, un controlador CAN y un microcontrolador.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Un transceptor CAN

  • Al recibir: Convierte los niveles de voltaje en el bus CAN en valores que el controlador CAN pueda entender.
  • Al enviar: convierte el flujo de datos del controlador CAN en niveles de bus CAN.

Un controlador CAN

  • Al enviar: Transmite el mensaje del microcontrolador al bus en serie cuando el bus está libre.
  • Al recibir: almacena los bits en serie recibidos del bus hasta que esté disponible un mensaje completo e indica al microcontrolador que lo recupere (generalmente activando una interrupción).

un microcontrolador

Decide qué significan los mensajes que recibe y qué mensajes quiere transmitir. A él se conectan sensores, actuadores y dispositivos de control.

Un marco CAN estándar

La comunicación a través del bus CAN se realiza a través de marcos CAN. Aquí hay una trama CAN estándar con un identificador de 11 bits. Echemos un vistazo rápido a cada uno de los ocho campos de mensaje:

Crea tu propia red CAN con módulos MCP2515 y Arduino
  • SOF: El inicio de la trama es un «0 dominante» para indicar a los otros nodos que un nodo CAN quiere comunicarse.
  • IDENTIFICACIÓN: El ID es el ID del marco. Se utiliza para indicar qué significa el mensaje y quién lo envía. El ID también define la prioridad: cuanto menor sea el ID, mayor será la prioridad del mensaje.
  • RTR: La solicitud de transmisión remota indica si un nodo está enviando datos o solicitando datos de otro nodo.
  • control: El controlador incluye el Bit de extensión de identificador (IDE), que es un «0 dominante» para 11 bits. También contiene el código de longitud de datos (DLC) de 4 bits, que indica cuántos bytes de datos se incluirán en el mensaje.
  • Datos: Los 8 bytes de datos contienen la información real.
  • CDN: La verificación de redundancia cíclica se utiliza para detectar errores.
  • ACK: La ranura ACK indica si el nodo ha reconocido y recibido los datos correctamente.
  • EOF: El EOF marca el final del marco CAN.

Lo especial del bus CAN es que se trata de un protocolo basado en mensajes. Normalmente, en una red distribuida, cada dispositivo tiene una ID única para distinguirlo de otros dispositivos en el mismo bus, y los mensajes se envían desde el Dispositivo A al Dispositivo B según sus ID.

Por el contrario, las estaciones del bus CAN no tienen ID. Más bien, a cada mensaje se le asigna una ID CAN única que indica de qué trata el mensaje. Todos los nodos reciben todos los mensajes y cada nodo filtra los mensajes relevantes para él.

Descripción general del hardware del módulo MCP2515

El módulo de interfaz de bus CAN MCP2515 es una solución CAN completa que incluye el controlador CAN MCP2515 de Microchip y el transceptor CAN de alta velocidad TJA1050 de Philips. Es la mejor solución para agregar conectividad CAN con interfaz SPI a su Arduino.

Debido a su confiabilidad y robustez, el módulo MCP2515 se puede utilizar en diversos proyectos que requieren una transmisión de datos confiable en ambientes ruidosos o en largas distancias.

El controlador CAN MCP2515

El MCP2515 es un controlador CAN independiente que implementa la especificación CAN versión 2.0B. Es capaz de enviar y recibir datos estándar y extendidos y tramas remotas. El MCP2515 incluye máscaras y filtros para filtrar mensajes no deseados, lo que reduce la sobrecarga de la MCU del host.

Crea tu propia red CAN con módulos MCP2515 y Arduino

El MCP2515 tiene un pin de salida de interrupción (INT) que puede activar una interrupción de MCU cuando se recibe y carga un mensaje válido en uno de los búferes de recepción.

El transceptor CAN TJA1050

El TJA1050 sirve como interfaz entre un controlador CAN MCP2515 y el bus CAN físico de dos cables, cumpliendo con los requisitos automotrices de alta velocidad (hasta 1 Mbps), baja corriente de reposo, compatibilidad electromagnética y descarga electrostática.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Con el transceptor CAN TJA1050 se pueden conectar al bus un máximo de 110 estaciones.

Conexión de bus CAN

Hay un terminal de tornillo de 2 pines (etiquetado H y L) a bordo para conectar un cable de par trenzado de bus CAN.

Crea tu propia red CAN con módulos MCP2515 y Arduino

El módulo MCP2515 admite velocidades de datos de hasta 1 Mbit/s. Sin embargo, la velocidad de transmisión máxima está determinada por la longitud de la línea de autobús: las líneas de autobús más largas conducen a velocidades de transmisión más lentas. La longitud máxima del bus es de 40 metros a 1 Mbit/s y puede alcanzar los 500 metros a 125 kbit/s.

Terminación de nodo

El bus CAN debe estar terminado con resistencias en ambos extremos para evitar reflexiones en la línea. Por lo tanto, el módulo MCP2515 tiene un terminador de 120 ohmios y un puente de terminación de nodo. Para activar la resistencia debes dejar el jumper en su lugar.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Si el módulo es el primer o último nodo de la red CAN, se debe configurar el puente. Si el módulo es un nodo central, se debe quitar el puente.

Especificaciones técnicas

Aquí están las especificaciones:

Tensión de funcionamiento 4,75 a 5,25 V (según los requisitos de TJA1050)
Especificación de lata Versión 2.0B con 1 Mbit/s
Frecuencia de cristal 8MHz
Búfer de transmisión Tres buffers de envío con funciones de priorización y cancelación.
Recibir buffer Dos buffers de recepción con almacenamiento de mensajes priorizados
Filtro de mensajes Seis filtros de 29 bits
Máscaras Dos máscaras de 29 bits
Salidas de interrupción Una interrupción con habilitaciones seleccionables.
interfaz SPI de alta velocidad (10MHz)

Puede encontrar más información sobre el controlador CAN MCP2515 en la siguiente hoja de datos.

Para obtener más información sobre el transceptor CAN TJA1050, consulte la hoja de datos a continuación.

Configuración de pines del módulo MCP2515

Ahora veamos el pinout.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Puerto de entrada

Los pines de ruptura en un lado del módulo se utilizan para comunicarse con el microcontrolador.

EN T El pin genera una interrupción cuando se recibe y carga un mensaje válido en uno de los buffers de recepción.

SCK es el pin del reloj SPI.

SI es la entrada de datos en serie/pin MOSI para los datos enviados desde su Arduino al módulo.

ENTONCES es la salida de datos en serie/pin MISO para los datos enviados desde el módulo a su Arduino.

C.S. es el pin de selección de chip. Debe mantenerse bajo para iniciar una transacción SPI.

Tierra es una base común para el poder y la lógica.

VCC es el pin de alimentación. Conéctelo únicamente a una fuente de alimentación de 5 V.

Conexión de bus CAN

En el otro lado del módulo hay un terminal de tornillo de 2 pines y un cabezal de pines de 2 pines para conectar cables de par trenzado del bus CAN.

l es la señal CAN baja para el estándar de bus CAN.

h es la señal CAN alta para el estándar de bus CAN.

Conexión de hardware

Ahora que sabemos todo sobre el módulo, construyamos nuestra propia red CAN.

Ejemplo 1: red CAN simple con dos nodos

En este ejemplo, se configura una red de bus CAN simple con dos nodos: un nodo envía un mensaje y el otro lo recibe.

Primero, conecte el pin VCC del módulo a 5 V en el Arduino y el pin GND a tierra.

Conectemos los pines SPI. Tenga en cuenta que cada placa Arduino tiene un conjunto único de pines SPI que deben conectarse en consecuencia. En placas Arduino como UNO/Nano V3.0, estos pines son digitales 13 (SCK), 12 (MISO), 11 (MOSI) y 10 (CS). Si estás utilizando otra placa Arduino, lee la documentación oficial. Posiciones de los pines SPI Antes de continuar.

Ahora conecta el pin INT del módulo al pin digital 2 del Arduino.

Necesitas crear dos de esos circuitos. Uno actúa como transmisor y el otro como receptor. Ambos tienen el mismo cableado.

La conexión de los módulos es sencilla: CAN L está conectado a CAN L y CAN H está conectado a CAN H. Lo ideal es que los cables estén torcidos, pero esto no es necesario para pruebas simples de placas de pruebas u otras tiradas cortas.

Es importante recordar que a medida que aumenta la longitud del bus o aumenta el ruido eléctrico ambiental, el uso de cables de par trenzado y la adición de blindaje se vuelven más importantes.

Por último, coloca el jumper en ambos módulos ya que se trata de una red de bus CAN simple con dos nodos.

Construya la red como se muestra.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Ejemplo 2: red CAN de múltiples nodos

En este ejemplo, se configura una red CAN más grande: varios nodos envían mensajes y un nodo los reenvía a una PC a través de una interfaz en serie.

Se pueden agregar nodos adicionales entre los dos nodos finales. Estos se pueden empalmar en serie o conectar al bus principal con un cable de acometida corto, siempre que la longitud sea inferior a 12 pulgadas.

Finalmente, coloque el puente en el primer y último nodo de la red CAN y retírelo de los nodos intermedios.

Construya la red como se muestra.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Instalación de biblioteca

Hay una biblioteca realmente excelente disponible para trabajar con el módulo MCP2515. Debe descargarlo e instalarlo en su IDE de Arduino.

Para instalar la biblioteca, navegue hasta Bosquejo > incluir biblioteca > Administrar bibliotecas… Espere a que el administrador de la biblioteca descargue el índice de la biblioteca y actualice la lista de bibliotecas instaladas.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Filtra tu búsqueda escribiendo “mcp2515'. Buscar PUEDE de Mistry Sandeep. Haga clic en esta entrada y luego seleccione «Instalar».

Crea tu propia red CAN con módulos MCP2515 y Arduino

código de ejemplo de arduino

En esta sencilla prueba intentaremos transmitir un mensaje «Hola mundo» en el bus CAN para ver si se puede decodificar. Le ayuda a aprender a utilizar los módulos y puede servir como base para futuros experimentos y proyectos prácticos.

Código para el nodo emisor

Cargue este boceto en el nodo remitente.

Si tiene varios nodos en un bus CAN, cargue este boceto en cada nodo transmisor. Asegúrese de cambiar los ID de mensaje de cada nodo a valores únicos.

#include <CAN.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("CAN Sender");

  // start the CAN bus at 500 kbps
  if (!CAN.begin(500E3)) {
    Serial.println("Starting CAN failed!");
    while (1);
  }
}

void loop() {
  // send packet: id is 11 bits, packet can contain up to 8 bytes of data
  Serial.print("Sending packet ... ");

  CAN.beginPacket(0x12);
  CAN.write('h');
  CAN.write('e');
  CAN.write('l');
  CAN.write('l');
  CAN.write('o');
  CAN.endPacket();

  Serial.println("done");

  delay(1000);

  // send extended packet: id is 29 bits, packet can contain up to 8 bytes of data
  Serial.print("Sending extended packet ... ");

  CAN.beginExtendedPacket(0xabcdef);
  CAN.write('w');
  CAN.write('o');
  CAN.write('r');
  CAN.write('l');
  CAN.write('d');
  CAN.endPacket();

  Serial.println("done");

  delay(1000);
}

Código para el nodo receptor

Cargue este boceto en el nodo destinatario.

#include <CAN.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("CAN Receiver Callback");

  // start the CAN bus at 500 kbps
  if (!CAN.begin(500E3)) {
    Serial.println("Starting CAN failed!");
    while (1);
  }

  // register the receive callback
  CAN.onReceive(onReceive);
}

void loop() {
  // do nothing
}

void onReceive(int packetSize) {
  // received a packet
  Serial.print("Received ");

  if (CAN.packetExtended()) {
    Serial.print("extended ");
  }

  if (CAN.packetRtr()) {
    // Remote transmission request, packet contains no data
    Serial.print("RTR ");
  }

  Serial.print("packet with id 0x");
  Serial.print(CAN.packetId(), HEX);

  if (CAN.packetRtr()) {
    Serial.print(" and requested length ");
    Serial.println(CAN.packetDlc());
  } else {
    Serial.print(" and length ");
    Serial.println(packetSize);

    // only print packet data for non-RTR packets
    while (CAN.available()) {
      Serial.print((char)CAN.read());
    }
    Serial.println();
  }

  Serial.println();
}

Tenga en cuenta que la función de bucle se deja vacía porque el boceto utiliza una interrupción para notificar al Arduino cuando se recibe un mensaje válido y se carga en uno de los buffers de recepción.

demostración

Después de cargar el boceto, abra el monitor en serie con una velocidad de baudios de 9600. El nodo remitente envía un paquete CAN estándar y un paquete CAN extendido cada segundo.

Crea tu propia red CAN con módulos MCP2515 y Arduino

El nodo receptor lo recibe y lo transmite al PC a través de la interfaz serie.

Crea tu propia red CAN con módulos MCP2515 y Arduino

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded




Creación de una red CAN con módulos MCP2515 y Arduino

Introducción

En los viejos tiempos, los automóviles tenían más de 2,000 metros de cable en ellos, conectando interruptores en el tablero directamente con las luces delanteras y traseras, por ejemplo. A medida que los autos se volvieron más complejos, esta lógica simple ya no funcionaría. En 1986, Bosch introdujo el sistema CAN bus, que resolvió este problema y facilitó y abarató la fabricación de autos. CAN es ahora el estándar de la industria y se utiliza en todo, desde autos y camiones hasta autobuses y tractores, e incluso aviones y barcos.

Preguntas Frecuentes sobre la Creación de una red CAN con módulos MCP2515 y Arduino

  1. ¿Qué es un sistema CAN Bus?

    Un Controller Area Network (CAN bus) es un estándar de comunicaciones diseñado para permitir que los dispositivos dentro de un vehículo se comuniquen entre sí sin necesidad de una computadora central.

  2. ¿Cómo funciona el sistema CAN Bus?

    Similar al sistema nervioso humano, el CAN bus actúa como el sistema nervioso del automóvil, permitiendo la comunicación entre diferentes nodos del bus CAN, también conocidos como Unidades de Control Electrónico (ECUs).

  3. ¿Qué es un nodo CAN Bus?

    Cada nodo CAN contiene un transceptor CAN, un controlador CAN y un microcontrolador que le permite enviar y recibir mensajes a través del bus CAN.

Descripción del Módulo MCP2515

El módulo de interfaz CAN MCP2515 es la mejor solución para agregar conectividad CAN a tu Arduino con interfaz SPI. Este tutorial te mostrará cómo conectar el módulo MCP2515 a un Arduino, pero primero, una breve introducción sobre el protocolo CAN.

Información Técnica

El MCP2515 es un controlador CAN autónomo que implementa la especificación CAN, Versión 2.0B. Es capaz de transmitir y recibir tramas de datos estándar y extendidas, e incluye máscaras y filtros para filtrar mensajes no deseados, lo que reduce la carga del microcontrolador host.

Por otro lado, el transceptor CAN TJA1050 actúa como una interfaz entre el controlador MCP2515 CAN y el bus físico CAN de dos cables, cumpliendo con los requisitos automotrices para alta velocidad, baja corriente en reposo, compatibilidad electromagnética y descarga electrostática.

Instalación de la Biblioteca y Ejemplos de Código para Arduino

Hay una excelente biblioteca disponible para trabajar con el módulo MCP2515. Deberás descargar e instalar esta biblioteca en tu Arduino IDE. Para hacerlo, navega a Sketch > Include Library > Manage Libraries… Busca la biblioteca ‘CAN’ de Sandeep Mistry y haz clic en Instalar.

Ejemplo de Código para el Nodo Transmisor

Aquí tienes un ejemplo de código que puedes cargar en el nodo transmisor para enviar un mensaje «Hola Mundo» a través de la red CAN:

#include <CAN.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("CAN Sender");

  if (!CAN.begin(500E3)) {
    Serial.println("¡Fallo al iniciar CAN!");
    while (1);
  }
}

void loop() {
  Serial.print("Enviando paquete ... ");

  CAN.beginPacket(0x12);
  CAN.write('h');
  CAN.write('e');
  CAN.write('l');
  CAN.write('l');
  CAN.write('o');
  CAN.endPacket();

  Serial.println("hecho");

  delay(1000);
}

Ejemplo de Código para el Nodo Receptor

Este sería un ejemplo de código para el nodo receptor:

#include <CAN.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  Serial.println("Receptor CAN");

  if (!CAN.begin(500E3)) {
    Serial.println("¡Fallo al iniciar CAN!");
    while (1);
  }

  CAN.onReceive(onReceive);
}

void loop() {

}

void onReceive(int packetSize) {
  Serial.print("Recibido ");

  if (CAN.packetExtended()) {
    Serial.print("extendido ");
  }

  if (CAN.packetRtr()) {
    Serial.print("RTR ");
  }

  Serial.print("paquete con ID 0x");
  Serial.print(CAN.packetId(), HEX);

  if (CAN.packetRtr()) {
    Serial.print(" y longitud solicitada ");
    Serial.println(CAN.packetDlc());
  } else {
    Serial.print(" y longitud ");
    Serial.println(packetSize);

    while (CAN.available()) {
      Serial.print((char)CAN.read());
    }
    Serial.println();
  }

  Serial.println();
}

Enlaces de Referencia:


5 comentarios en «Crea tu propia red CAN con módulos MCP2515 y Arduino»

  1. Wow, ¡qué interesante descubrimiento! Definitivamente voy a intentar crear mi propia red CAN con estos módulos y mi Arduino. Gracias por compartir este artículo. ¡A experimentar se ha dicho! 🚀🤖

Deja un comentario