La ligne Canbus gère la communication série entre deux modules Arduino, elle est constituée des 2 câbles centraux (fil vert, fil bleu) reliés en série aux deux extrémités par deux résistances de 120 𝛀 se trouvant sur les cartes contrôleurs de canbus MCP et activées avec les cavaliers en bas à droite sur la carte.
On utilise les librairies "mcp2515_can.h" et <SPI.h> pour l’interface du contrôleur MCP2515.
Le Nano (l’émetteur) lit la donnée du potentiomètre et la transmet par l’intermédiaire de la
ligne Canbus dans une des huit trames de données envoyées périodiquement au moyen de
la ligne de programme (voir dans le sketch) suivante:
unsigned char canMsg[8] = {cantxValue, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Chaque trame de signaux est constituée d’un caractère de 8 bits, transite par les fils vert et
bleu a l’allure suivante à l’oscilloscope:
La ligne Canbus se compose physiquement d’un fil HIGH à 3,75V (le vert) et d’un fil
LOW à 1,75V (le bleu) qui vont être modulés à 2,50V pour la transmission des trames
de données. La valeur lue du potentiomètre, qui est envoyée par l’Arduino Nano,
est d’abord mise à l’échelle qui doit être comprise entre 0 et 255 pour être contenue
dans les 8 bits de la trame. Le récepteur Arduino Uno attend en permanence de lire
des données du Canbus. Lorsqu’il y en a une il obtient dans la trame les informations
suivantes: nom de l’émetteur et valeur de la donnée.
CAN.readMsgBuf(&len, buf);// read len:data length, buf: data buf
Le récepteur peut éventuellement filtrer les données en fonction de ce qu’il veut lire
(tel émetteur s’il y en a plusieurs ou telle donnée).
SKETCH de l’émetteur Nano ⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥⟥
/* Uno_Canbus_Pot_Sender_SL01.ino
* utiliser avec Uno_Canbus_Pot_receive_SL02.ino
* slazare 2021 10 06
*/
#include "mcp2515_can.h"
#include <SPI.h>
mcp2515_can CAN(10); // set CS pin
//Pot for adjusting value
int sensorPin = A0;
int sensorValue = 0;
int cantxValue = 0;
void setup()
{
Serial.begin(115200);
// init can bus, baudrate: 100k
if(CAN.begin(CAN_100KBPS) ==CAN_OK) Serial.print("can init ok!!\r\n");
else Serial.print("Can init fail!!\r\n");
}
//Some sample CAN messages
unsigned char msg1[8] = {0, 1, 2, 3, 4, 5, 6, 7};
unsigned char msg2[8] = {0xFF, 0x01, 0x10, 0x0A, 0x00, 0x00, 0x00, 0x00};
unsigned char msg3[4] = {0xFF, 0x01, 0x10, 0x0A};
void loop()
{
//Read the value of the pot
sensorValue = analogRead(sensorPin);
//Each CAN bus byte can store a value between 0-255.
//Dividing sensorValue by 4 puts us in that range.
cantxValue = sensorValue / 4;
Serial.print("cantxValue: ");
Serial.print(cantxValue);
Serial.println();
//Create data packet for CAN message
unsigned char canMsg[8] = {cantxValue, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// send data: id = 0x123, standard flame, data len = 8, stmp: data buf
CAN.sendMsgBuf(0x07B, 0, 8, canMsg);
delay(100);
}
/* Uno_Canbus_Pot_receive_LCD_SL01.ino
* slazare 2021 10 07
* demo: CAN-BUS Shield, receive data with check mode
* utiliser avec Uno_Canbus_Pot_Sender_SL01.ino
* loovee, 2014-6-13
*/
#include <SPI.h>
#include "mcp2515_can.h"
// Set SPI CS Pin according to your hardware
// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;
const int CAN_INT_PIN = 2;
#include <Wire.h> //LCD
#include <LiquidCrystal_I2C.h> //LCD
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
mcp2515_can CAN(SPI_CS_PIN); // Set CS pin
const int LED = 8;
boolean ledON = 1;
void setup() {
SERIAL_PORT_MONITOR.begin(115200);
pinMode(LED, OUTPUT);
while (CAN_OK != CAN.begin(CAN_100KBPS)) { // init can bus : baudrate = 500k
SERIAL_PORT_MONITOR.println("CAN init fail, retry...");
delay(100);
}
SERIAL_PORT_MONITOR.println("CAN init ok!");
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Hello, world!");
delay(1500);
}
void loop() {
unsigned char len = 0;
unsigned char buf[8];
if (CAN_MSGAVAIL == CAN.checkReceive()) { // check if data coming
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned long canId = CAN.getCanId();
SERIAL_PORT_MONITOR.println("-----------------------------");
SERIAL_PORT_MONITOR.print("get data from ID: 0x");
SERIAL_PORT_MONITOR.println(canId, HEX);
// for (int i = 0; i < 1; i++) { // print the data
// SERIAL_PORT_MONITOR.print(buf[i]);
SERIAL_PORT_MONITOR.print(buf[0]); //c'est la valeur de cantxValue
SERIAL_PORT_MONITOR.print("\t");
lcd.clear();
lcd.setCursor(0,0);
lcd.print(buf[0]);
lcd.setCursor(5,0);
lcd.print(canId, HEX);
delay(500);
SERIAL_PORT_MONITOR.println();
}
}