- Introducción a CAN
- Comparación de CAN sobre SPI e I2C
- Aplicaciones del protocolo CAN
- Cómo usar el protocolo CAN en Arduino
- Componentes requeridos
- Diagrama de circuito
- Conexión entre dos módulos CAN MCP2515
- Programación de Arduino para comunicación CAN
- Explicación del código del lado del transmisor CAN (Arduino Nano)
- Explicación del código del lado del receptor CAN (Arduino UNO)
- Funcionamiento de la comunicación CAN en Arduino
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 constantemente haciendo que su automóvil sea más inteligente con características como conducción autónoma, sistema de airbag, monitoreo de presión de neumáticos, sistema de control de crucero, etc., 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 de comunicación automotrices estándar. 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 la pérdida de datos aquí podría provocar 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 de automóviles mucho más fiables como LIN, CAN, FlexRay, etc.
De todos los protocolos disponibles, CAN es el más utilizado y popular. Ya hemos discutido qué es CAN y cómo funciona CAN. Entonces, en este artículo veremos los conceptos básicos nuevamente y finalmente también intercambiaremos datos entre dos Arduinos usando la comunicación CAN. Suena interesante, ¿verdad? Entonces empecemos.
Introducción a CAN
CAN, también conocida como Controller Area Network, es un bus de comunicación en serie diseñado para aplicaciones industriales y automotrices. Es un protocolo basado en mensajes que se utiliza para la comunicación entre varios 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, lo que permite 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. Normalmente, la velocidad de comunicación para CAN varía de 50 Kbps a 1 Mbps y la distancia puede variar de 40 metros a 1 Mbps a 1000 metros a 50 kpbs.
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-bit)
Datos: Estos son los datos reales del sensor / control que deben enviarse de un dispositivo a otro. Los datos de tamaño pueden tener una longitud de 0 a 8 bytes.
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 0.
Normalmente se utiliza 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 balanceada y atada al mismo potencial.
Comparación de CAN sobre SPI e I2C
Como ya hemos aprendido a usar SPI con Arduino e IIC con Arduino, comparemos las características de SPI e I2C con CAN.
Parámetro | SPI | I2C | PUEDEN |
Velocidad | 3 Mbps a 10 Mbps | Estándar: 100 Kbps | 10 KBps a 1 MBps También depende de la longitud del cable utilizado |
Rápido: 400 Kbps | |||
Alta velocidad: 3,4 Mbps | |||
Tipo | Sincrónico | Sincrónico | Asincrónico |
Numero de alambres | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 hilos (SDA, SCL) | 2 hilos (CAN_H, CAN_L) |
Dúplex | Duplex completo | Medio duplex | Medio duplex |
Aplicaciones del protocolo CAN
- Debido a la robustez y confiabilidad del protocolo CAN, se utilizan en industrias como la automotriz, máquinas industriales, agricultura, equipos médicos, etc.
- Como la complejidad del cableado se reduce en CAN, se utilizan principalmente en aplicaciones automotrices como automóviles.
- El bajo costo de implementación y el precio de los componentes de hardware también es menor.
- 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á interconectado con Arduino mediante la comunicación SPI. Veamos más sobre MCP2515 en detalle y cómo se interconecta 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 se realiza a través de SPI. Por lo tanto, es fácil interactuar con cualquier microcontrolador que tenga una interfaz SPI.
Para los principiantes que quieran aprender CAN Bus, este módulo será un buen comienzo. Esta placa CAN SPI es ideal para la automatización industrial, la domótica y otros proyectos integrados de automoción.
Características y especificaciones de MCP2515:
- Utiliza un transceptor CAN de alta velocidad TJA1050
- Dimensión: 40 × 28 mm
- Control SPI para ampliar la interfaz de bus CAN múltiple
- Oscilador de cristal de 8MHZ
- Resistencia terminal 120Ω
- Tiene llave independiente, indicador LED, indicador de encendido
- Admite 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 de PIN |
UTILIZAR |
VCC |
Pin de entrada de alimentación de 5 V |
GND |
Pin de tierra |
CS |
Pin de selección SPI SLAVE (activo bajo) |
ENTONCES |
Cable de salida esclavo de entrada maestra SPI |
SI |
Cable de entrada esclavo de salida maestra SPI |
SCLK |
Pin de reloj SPI |
EN T |
Pin de interrupción MCP2515 |
En este tutorial, veamos cómo enviar datos del sensor de humedad y temperatura (DHT11) desde Arduino Nano a Arduino Uno a través del módulo de bus CAN MCP2515.
Componentes requeridos
- Arduino UNO
- Arduino NANO
- DHT11
- Pantalla LCD 16x2
- Módulo CAN MCP2515 - 2
- Potenciómetro 10k
- Tablero de circuitos
- Conexión de cables
Diagrama de circuito
Conexión en el lado del transmisor CAN:
Componente - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - TIERRA |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - ASÍ |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - TIERRA |
GND |
DHT11 - FUERA |
A0 |
Conexiones de circuito en el lado del receptor CAN:
Componente - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - TIERRA |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - ASÍ |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Al PIN central del potenciómetro de 10K |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K |
GND |
Conexión entre dos módulos CAN MCP2515
H - CAN Alto
L - CAN baja
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
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 Arduino se vuelve más fácil al usar la siguiente biblioteca.
- Descargue el archivo ZIP de la biblioteca Arduino CAN MCP2515.
- 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), las cuales se pueden encontrar 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.
Inicializar el módulo CAN MCP2515:
Para crear una conexión con MCP2515 siga los pasos:
1. Configure el número de pin donde se conecta SPI CS (10 por defecto)
MCP2515 mcp2515 (10);
2. Configure la velocidad en baudios 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_200KBPS, CAN_125KBPS, CAN_200KBPS, CAN_
Velocidades de reloj disponibles:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Establecer modos.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Explicación del código del lado del transmisor CAN (Arduino Nano)
En la sección del transmisor, Arduino Nano interactuó con el módulo CAN MCP2515 a través de pines SPI y DHT11 envía datos de temperatura y humedad al bus CAN.
Primero se incluyen las bibliotecas necesarias, biblioteca SPI para usar la comunicación SPI, biblioteca MCP2515 para usar la comunicación CAN y biblioteca DHT para usar el sensor DHT con Arduino . Anteriormente interconectamos DHT11 con Arduino.
#incluir
Ahora se define el nombre del pin de DHT11 (pin de SALIDA) que está conectado con el A0 de Arduino Nano
#define DHTPIN A0
Y también, 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 el tipo DHT como DHT11 se inicializa.
DHT dht (DHTPIN, DHTTYPE);
Siguiente en configuración vacía ():
Comience la comunicación SPI utilizando la siguiente declaración
SPI.begin ();
Y luego use la siguiente declaración para comenzar a recibir los valores de temperatura y humedad del sensor DHT11.
dht.begin ();
A continuación, el MCP2515 se reinicia con el siguiente comando
mcp2515.reset ();
Ahora el MCP2515 tiene una velocidad configurada 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 da como 0x036 (según la elección) y DLC como 8 y le damos los datos h y t a los datos y datos y todos los datos descansan con 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Actualiza el valor de humedad en canMsg.data = t; // Actualizar el valor de temperatura en canMsg.data = 0x00; // Descansar todo con 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Después de todo, para enviar el mensaje a CAN BUS utilizamos 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 del lado del receptor CAN (Arduino UNO)
En la sección del receptor, Arduino UNO interactuó con la pantalla LCD MCP2515 y 16x2. 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 necesarias, SPI Library para usar SPI Communication, MCP2515 Library para usar CAN Communication y LiquidCrsytal Library para usar 16x2 LCD con Arduino .
#incluir
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 de 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 vacía ():
Primero, la pantalla LCD se configura en modo 16x2 y se muestra un mensaje de bienvenida.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("RESUMEN DEL CIRCUITO"); 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 reinicia con el siguiente comando.
mcp2515.reset ();
Ahora el MCP2515 tiene una velocidad configurada de 500KBPS y 8MHZ como reloj.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Y el MCP2525 está configurado en modo normal.
mcp2515.setNormalMode ();
Siguiente en bucle vacío ():
La siguiente declaración se utiliza para recibir el mensaje del bus CAN. Si se recibe el mensaje, entra en la condición if .
si (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
En la condición if los datos se reciben y almacenan en c anMsg , los datos que tienen valor de humedad y los datos que tienen valor de temperatura. Ambos valores se almacenan en un número entero xey.
int x = canMsg.data; int y = canMsg.data;
Después de recibir los valores, los valores de temperatura y humedad se muestran en una pantalla LCD de 16x2 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 ();
Funcionamiento de la 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 proporcionan a continuación) en las respectivas placas Arduino. 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 se acerca a la temperatura real de la habitación.
El trabajo completo se puede encontrar en el video vinculado a continuación. Si tiene alguna pregunta, déjela en la sección de comentarios o utilice nuestros foros para otras preguntas técnicas.