Hoy en día, cualquier automóvil promedio consta de alrededor de 60 a 100 unidades de sensores para detectar e intercambiar información. Con los fabricantes de automóviles que constantemente hacen que su automóvil sea más inteligente con características como conducción autónoma, sistema de bolsas de aire, monitoreo de presión de neumáticos, sistema de control de crucero, etc., solo se espera que este número sea alto. A diferencia de otros sensores, estos sensores procesan información crítica y, por lo tanto, los datos de estos sensores deben comunicarse mediante protocolos estándar de comunicación automotriz . Por ejemplo, los datos del sistema de control de crucero como la velocidad, la posición del acelerador, etc. son valores vitales que se envían a la Unidad de Control Electrónico (ECU)Para decidir el nivel de aceleración del automóvil, una falta de comunicación o pérdida de datos aquí podría conducir a fallas críticas. Por lo tanto, a diferencia de los protocolos de comunicación estándar como UART, SPI o I2C , los diseñadores utilizan protocolos de comunicación automotrices muy confiables como LIN, CAN, FlexRay, etc.

Componentes requeridos:

  • Arduino UNO
  • Arduino NANO
  • DHT11
  • Pantalla LCD de 16×2
  • Módulo CAN MCP2515 – 2
  • Potenciómetro 10k
  • Tablero de circuitos
  • Cables de conexión

Introducción a CAN.

CAN aka Controller Area Network es un bus de comunicación en serie diseñado para aplicaciones industriales y automotrices. Es un protocolo basado en mensajes utilizado para la comunicación entre múltiples dispositivos. Cuando se conectan varios dispositivos CAN como se muestra a continuación, la conexión forma una red que actúa como nuestro sistema nervioso central permitiendo que cualquier dispositivo hable con cualquier otro dispositivo en el nodo.

Una red CAN constará de solo dos cables CAN High y CAN Low para la transmisión de datos bidireccional como se muestra arriba. Típicamente, la velocidad de comunicación para CAN varía de 50 Kbps a 1Mbps y la distancia puede variar de 40 metros a 1Mbps a 1000 metros a 50kpbs.

Formato del mensaje CAN:

En la comunicación CAN, los datos se transmiten en la red como un formato de mensaje particular. Este formato de mensaje contiene muchos segmentos, pero dos segmentos principales son el identificador y los datos que ayudan a enviar y responder mensajes en el bus CAN.   

Identificador o ID de CAN: El identificador también se conoce como ID de CAN o también conocido como PGN (Número de grupo de parámetros). Se utiliza para identificar los dispositivos CAN presentes en una red CAN. La longitud del identificador es de 11 o 29 bits según el tipo de protocolo CAN utilizado.

CAN estándar: 0-2047 (11 bits)

CAN extendido: 0-2 29 -1 (29 bits)

Datos: estos son los datos reales del sensor / control que deben enviarse de un dispositivo a otro. Los datos de tamaño pueden tener entre 0 y 8 bytes de longitud.

Código de longitud de datos (DLC): 0 a 8 para el número de bytes de datos presentes.

Cables utilizados en CAN:

El protocolo CAN consta de dos cables, a saber, CAN_H y CAN_L para enviar y recibir información. Ambos cables actúan como una línea diferencial , lo que significa que la señal CAN (0 o 1) está representada por la diferencia de potencial entre CAN_L y CAN_H. Si la diferencia es positiva y mayor que un cierto voltaje mínimo, entonces es 1 y si la diferencia es negativa es un 0.

Normalmente se usa un cable de par trenzado para la comunicación CAN. Por lo general, se usa una sola resistencia de 120 ohmios en los dos extremos de la red CAN como se muestra en la imagen, esto se debe a que la línea debe estar equilibrada y vinculada al mismo potencial.

Comparación de CAN sobre SPI e I2C.

Aplicaciones de protocolo CAN

  1. Debido a la robustez y confiabilidad del protocolo CAN, se utilizan en industrias como automotriz, máquinas industriales, agricultura, equipos médicos, etc.
  2. Como la complejidad del cableado se reduce en CAN, se utilizan principalmente en aplicaciones automotrices como automóviles.
  3. El bajo costo de implementación y el precio de los componentes de hardware también es menor.
  4. Fácil de agregar y quitar los dispositivos de bus CAN.

Cómo usar el protocolo CAN en Arduino.

Como Arduino no contiene ningún puerto CAN incorporado, se utiliza un módulo CAN llamado MCP2515 . Este módulo CAN está conectado con Arduino mediante el uso de la comunicación SPI. Veamos más sobre MCP2515 en detalle y cómo se conecta con Arduino.

Módulo CAN MCP2515:

El módulo MCP2515 tiene un controlador CAN MCP2515 que es un transceptor CAN de alta velocidad . La conexión entre MCP2515 y MCU es a través de SPI. Por lo tanto, es fácil interactuar con cualquier microcontrolador que tenga interfaz SPI.

Para los principiantes que quieran aprender CAN Bus, este módulo actuará como un buen comienzo. Esta placa CAN SPI es ideal para la automatización industrial, domótica y otros proyectos automotrices integrados.

Características y especificaciones de MCP2515:

  • Utiliza el transceptor CAN de alta velocidad TJA1050
  • Dimensión: 40 × 28 mm
  • Control SPI para ampliar la interfaz del bus CAN múltiple
  • Oscilador de cristal 8MHZ
  • Resistencia terminal 120Ω
  • Tiene llave independiente, indicador LED, indicador de encendido
  • Admite la operación CAN de 1 Mb / s
  • Operación en espera de baja corriente
  • Se pueden conectar hasta 112 nodos

Pinout del módulo CAN MCP2515:

Nombre pinUTILIZAR
VCCPin de entrada de alimentación de 5V
GNDPin de tierra
CSPin SPI SLAVE select (bajo activo)
ENTONCESSPI maestro entrada esclavo salida conductor
SISalida principal SPI cable de entrada esclavo
SCLKPin de reloj SPI
EN TPin de interrupción MCP2515

En este tutorial, veamos cómo enviar datos del sensor de humedad y temperatura (DHT11) de Arduino Nano a Arduino Uno a través del módulo de bus CAN MCP2515.

Conexión en el lado del transmisor CAN: 

Componente – PinArduino Nano
MPC2515 – VCC+ 5V
MPC2515 – GNDGND
MPC2515 – CSD10 (SPI_SS)
MPC2515 – SOD12 (SPI_MISO)
MPC2515 – SID11 (SPI_MOSI)
MPC2515 – SCKD13 (SPI_SCK)
MPC2515 – INTD2
DHT11 – VCC+ 5V
DHT11 – GNDGND
DHT11 – FUERAA0

Conexiones de circuito en el lado del receptor CAN:

Componente – PinArduino UNO
MPC2515 – VCC+ 5V
MPC2515 – GNDGND
MPC2515 – CS10 (SPI_SS)
MPC2515 – SO12 (SPI_MISO)
MPC2515 – SI11 (SPI_MOSI)
MPC2515 – SCK13 (SPI_SCK)
MPC2515 – INT2
LCD – VSSGND
LCD – VDD+ 5V
LCD – V0Hasta el PIN del centro del potenciómetro 10K
LCD – RS3
LCD – RWGND
LCD – E4 4
LCD – D45 5
LCD – D56 6
LCD – D67 7
LCD – D78
LCD – A+ 5V
LCD – KGND

Conexión entre dos módulos CAN MCP2515

H – PUEDE alto

L – CAN bajo

MCP2515 (Arduino Nano)MCP2515 (Arduino UNO)
HH
LL

Una vez que se hicieron todas las conexiones, mi hardware se veía así a continuación.

Programación de Arduino para comunicación CAN

Primero tenemos que instalar una biblioteca para CAN en Arduino IDE. La interfaz del módulo CAN MCP2515 con el Arduino se vuelve más fácil mediante el uso de la siguiente biblioteca.

  1. Descargue el archivo ZIP de la biblioteca Arduino CAN MCP2515 .
  2. Desde el IDE de Arduino: Sketch -> Incluir biblioteca -> Agregar biblioteca .ZIP

En este tutorial, la codificación se divide en dos partes, una como código de transmisor CAN (Arduino Nano) y otra como código de receptor CAN (Arduino UNO), que se encuentran en la parte inferior de esta página. La explicación de lo mismo es la siguiente.

Antes de escribir un programa para enviar y recibir datos, asegúrese de haber instalado la biblioteca siguiendo los pasos anteriores y que el módulo CAN MCP2515 se inicialice en su programa de la siguiente manera.

Inicialice el módulo MCP2515 CAN: 

Para crear una conexión con MCP2515, siga los pasos:

1. Configure el número de pin donde está conectado SPI CS (10 por defecto)

MCP2515 mcp2515 (10);

2. Establecer la velocidad de transmisión y la frecuencia del oscilador

mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);

Tasas de baudios disponibles:

CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBK, CAN_2.50KKK, CAN_2.

Velocidades de reloj disponibles:

MCP_20MHZ, MCP_16MHZ, MCP_8MHZ

3. Establecer modos.

mcp2515.setNormalMode (); 
mcp2515.setLoopbackMode (); 
mcp2515.setListenOnlyMode ();

Explicación del código lateral del transmisor CAN (Arduino Nano)

En la sección del transmisor, Arduino Nano interactuó con el módulo CAN MCP2515 a través de los pines SPI y DHT11 envía datos de temperatura y humedad al bus CAN.

Primero se incluyen las bibliotecas requeridas, la Biblioteca SPI para usar la Comunicación SPI, la Biblioteca MCP2515 para usar la Comunicación CAN y la Biblioteca DHT para usar el sensor DHT con Arduino .

#include <SPI.h>           
#include <mcp2515.h>       
#include <DHT.h>   

Ahora se define el nombre del pin DHT11 (pin OUT) que está conectado con el A0 de Arduino Nano

#definir DHTPIN A0     

Y también, el DHTTYPE se define como DHT11.

#define DHTTYPE DHT11

Un tipo de datos de estructura canMsg para almacenar el formato de mensaje CAN.

struct can_frame canMsg;

Establezca el número de pin donde está conectado SPI CS (10 por defecto)

MCP2515 mcp2515 (10);

Y también, el objeto dht para la clase DHT con pin DHT con Arduino Nano y tipo DHT como DHT11 se inicializa.

DHT dht (DHTPIN, DHTTYPE);     

Siguiente en void setup ():

Comience la comunicación SPI utilizando la siguiente declaración

SPI.begin ();    

Y luego use la siguiente declaración para comenzar a recibir valores de temperatura y humedad del sensor DHT11. 

dht.begin ();   

A continuación, se reinicia el MCP2515 con el siguiente comando

mcp2515.reset ();

Ahora el MCP2515 tiene una velocidad establecida de 500KBPS y 8MHZ como reloj

mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ); 

Y el MCP2525 está configurado en modo normal

mcp2515.setNormalMode ();

En el bucle vacío ():

La siguiente declaración obtiene el valor de humedad y temperatura y se almacena en una variable entera h y t.

int h = dht.readHumidity ();       
int t = dht.readTemperature ();  

A continuación, la ID de CAN se proporciona como 0x036 (según la elección) y DLC como 8 y le damos los datos h y t a los datos [0]   y a los datos [1]   y el resto de los datos quedan con 0.

canMsg.can_id = 0x036;           
canMsg.can_dlc = 8;               
canMsg.data [0] = h; // Actualizar el valor de humedad en [0] 
canMsg.data [1] = t; // Actualizar el valor de temperatura en [1] 
canMsg.data [2] = 0x00; // Descansa todo con 0 
canMsg.data [3] = 0x00; 
canMsg.data [4] = 0x00; 
canMsg.data [5] = 0x00; 
canMsg.data [6] = 0x00; 
canMsg.data [7] = 0x00;

Después de todo, para enviar el mensaje a CAN BUS usamos la siguiente declaración.

 mcp2515.sendMessage (& canMsg);   

Así que ahora los datos de temperatura y humedad se envían como mensaje al bus CAN.

Explicación del código lateral del receptor CAN (Arduino UNO)

En la sección del receptor, Arduino UNO interactuó con la pantalla LCD MCP2515 y 16×2 . Aquí el Arduino UNO recibe la temperatura y la humedad del bus CAN y muestra los datos recibidos en la pantalla LCD.

Primero se incluyen las bibliotecas requeridas, la Biblioteca SPI para usar la Comunicación SPI, la Biblioteca MCP2515 para usar la Comunicación CAN y la Biblioteca LiquidCrsytal para usar LCD 16×2 con Arduino .

#include <SPI.h 
#include <mcp2515.h>           
#include <LiquidCrystal.h> 

A continuación, se definen los pines LCD que se utilizan para conectarse con Arduino UNO.

const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8;  
LiquidCrystal lcd (rs, en, d4, d5, d6, d7);  

Se declara un tipo de datos de estructura para almacenar el formato del mensaje CAN .

struct can_frame canMsg; 

Establezca el número de pin donde está conectado SPI CS (10 por defecto)

MCP2515 mcp2515 (10);    

En configuración nula ():

Primero, la pantalla LCD se configura en modo 16×2 y se muestra un mensaje de bienvenida.

 lcd.begin (16,2);                   
lcd.setCursor (0,0);                
  lcd.print ("CIRCUITO DIGEST"); 
  lcd.setCursor (0,1); 
  lcd.print ("CAN ARDUINO"); 
  retraso (3000); 
  lcd.clear ();

Comience la comunicación SPI utilizando la siguiente declaración.

 SPI.begin ();

A continuación, el MCP2515 se RESTABLECE utilizando el siguiente comando.

mcp2515.reset ();

Ahora el MCP2515 tiene una velocidad establecida de 500KBPS y 8MHZ como reloj.

mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ); 

Y el MCP2525 está configurado en modo normal.

mcp2515.setNormalMode ();

Siguiente en void loop ():

La siguiente declaración se utiliza para recibir el mensaje del bus CAN. Si se recibe el mensaje, entra en la condición if .

if (mcp2515.readMessage (& canMsg) == MCP2515 :: ERROR_OK)

En la condición if , los datos se reciben y almacenan en c anMsg , los datos [0] que tienen un valor de humedad y los datos [1] que tienen un valor de temperatura. Ambos valores se almacenan en un entero x e y.

  int x = canMsg.data [0];         
     int y = canMsg.data [1];  

Después de recibir los valores, los valores de temperatura y humedad se muestran en una pantalla LCD de 16×2 utilizando la siguiente declaración.

lcd.setCursor (0,0);          
lcd.print ("Humedad:");     
lcd.print (x); 
lcd.setCursor (0,1); 
      lcd.print ("Temp:"); 
      lcd.print (y); 
      retraso (1000); 
      lcd.clear ();

Trabajo de comunicación CAN en Arduino

Una vez que el hardware esté listo, cargue el programa para el transmisor CAN y el receptor CAN (los programas completos se detallan a continuación) en las placas Arduino respectivas. Cuando se enciende usted debe notar el valor de temperatura leído por DHT11 será enviado a otro Arduino a través de la comunicación CAN y se muestran en la pantalla LCD de la 2 ª Arduino como se puede ver en la imagen abajo. También he usado mi control remoto de CA para verificar si la temperatura que se muestra en la pantalla LCD está cerca de la temperatura ambiente real.

https://circuitdigest.com/

One thought on “Tutorial CAN de Arduino – Módulo MCP2515 CAN BUS de interfaz con Arduino”

Deja una respuesta

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