Utilizați acest protocol de comunicație serială robust pentru a conecta două plăci Arduino împreună și pentru a trimite date unul către celălalt.

Autobuzul Controller Area Network (CAN) este un protocol de comunicație robust și fiabil, care este utilizat pe scară largă în diverse aplicații industriale, auto și aerospațiale. Este conceput pentru transmiterea de date între microcontrolere și dispozitive printr-o rețea de magistrală CAN. Poate că nu știți încă acest lucru, dar acesta este lucrul din spatele acelor modificări nebunești ale tabloului de bord pe care le vedeți pe rețelele sociale.

Vă vom prezenta cum să construiți o magistrală CAN cu modulul CAN MCP2515 folosind un Arduino și o placă de breadboard. Vom trece, de asemenea, peste biblioteca CAN Arduino și vom demonstra cum să trimitem și să primim date prin magistrala CAN.

Ce este un autobuz CAN?

Bus-ul CAN este un protocol de comunicație în serie care a fost dezvoltat de Bosch în anii 1980. Este utilizat pe scară largă în diverse aplicații datorită fiabilității și robusteței sale ridicate. Permite transmiterea datelor între dispozitive la viteze mari cu latență minimă pe doar două linii: CAN High și CAN Low.

instagram viewer

În 1994, magistrala CAN a devenit un standard internațional (ISO 11898) care a fost conceput special pentru schimbul rapid de date seriale între controlerele electronice în aplicațiile auto. Consultați ghidul nostru cuprinzător despre ce este un bus CAN și ce rol joacă acesta în sistemele auto pentru mai multe detalii.

Unul dintre motivele pentru care magistrala CAN este atât de populară este datorită caracteristicilor sale de detectare și corectare a erorilor. Protocolul poate detecta și corecta erorile în transmiterea datelor. Acest lucru îl face ideal pentru aplicațiile în care integritatea datelor este critică, cum ar fi automatizarea industrială.

Cunoașterea modulului CAN MCP2515

Modulul controler magistrală CAN MCP2515 este un dispozitiv care oferă suport excepțional pentru protocolul CAN, utilizat pe scară largă, versiunea 2.0B. Acest modul este ideal pentru comunicații la rate mari de date de până la 1 Mbps.

MCP2515 IC este un controler CAN independent cu o interfață SPI care permite comunicarea cu o gamă largă de microcontrolere. CI TJA1050, pe de altă parte, funcționează ca o interfață între CI controlerul CAN MCP2515 și magistrala CAN fizică.

Pentru un plus de confort, există un jumper care vă permite să atașați o terminație de 120 ohmi, făcând și mai ușor să vă conectați firele la CAN_H & POT SĂ șuruburi pentru comunicarea cu alte module CAN.

Caracteristică

Specificație

Transceiver

TJA1050

Interfață pentru microcontroler

SPI (permite integrarea magistralei Multi CAN)

Oscilator de cristal

8MHz

Încetarea

120Ω

Viteză

1 Mbps

Consumul de energie

Funcționare în standby cu curent scăzut

Dimensiune

40 x 28 mm

Capacitatea nodului

Suportă până la 112 noduri

Puteți obține informații suplimentare de la Fișă tehnică MCP2515 în cazul în care aveți nevoie de acest modul pentru un proiect mai avansat.

Structura mesajului CAN

Structura mesajului CAN constă din mai multe segmente, dar cele mai critice segmente pentru acest proiect sunt identificatorul și datele. Identificatorul, cunoscut și sub numele de CAN ID sau Parameter Group Number (PGN), identifică dispozitivele de pe CAN rețea, iar lungimea identificatorului poate fi de 11 sau 29 de biți, în funcție de tipul de protocol CAN folosit.

Între timp, datele reprezintă datele reale ale senzorului/controlului transmise. Datele pot avea o lungime de la 0 la 8 octeți, iar codul de lungime a datelor (DLC) indică numărul de octeți de date prezenți.

Biblioteca Arduino MCP2515 CAN Bus

Această bibliotecă implementează Protocolul CAN V2.0B, care poate funcționa la viteze de până la 1 Mbps. Oferă o interfață SPI care poate funcționa la viteze de până la 10 MHz, în timp ce acceptă atât date standard (11 biți) cât și date extinse (29 de biți). În plus, vine cu două buffer-uri de recepție, care permit stocarea prioritizată a mesajelor.

Inițializarea magistralei CAN

Iată codul de configurare de care veți avea nevoie pentru a inițializa magistrala CAN:

#include
#include

MCP2515 mcp2515(10); // Setați pinul CS

golînființat(){
in timp ce (!Serial);
Serial.ÎNCEPE(9600);
SPI.ÎNCEPE(); //Începe comunicarea SPI

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

Aceasta inițializează MCP2515 cu o rată de biți CAN de 500 Kbps și o frecvență a oscilatorului de 8 MHz.

Moduri de operare CAN MCP2515

Există trei moduri de funcționare utilizate cu controlerul de magistrală CAN MCP2515:

  • setNormalMode(): setează controlerul să trimită și să primească mesaje.
  • setLoopbackMode(): setează controlerul să trimită și să primească mesaje, dar mesajele pe care le trimite vor fi și ele primite de la sine.
  • setListenOnlyMode(): setează controlerul să primească numai mesaje.

Acestea sunt apeluri de funcții utilizate pentru a seta modul de funcționare al controlerului de magistrală CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Trimiterea datelor prin magistrala CAN

Pentru a trimite un mesaj prin magistrala CAN, utilizați sendMsgBuf() metodă:

nesemnatchar date[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, date);

Aceasta trimite un mesaj cu ID-ul 0x01 și o încărcătură de date de {0x01, 0x02, 0x03, 0x04}. Primul parametru este ID-ul CAN, al doilea este prioritatea mesajului, al treilea este lungimea încărcăturii de date, iar al patrulea este încărcarea de date în sine.

The sendMsgBuf() metoda returnează o valoare care indică dacă mesajul a fost trimis cu succes sau nu. Puteți verifica această valoare apelând la checkError() metodă:

dacă (CAN.checkError()) {
Serial.println(„Eroare la trimiterea mesajului”.);
}

Aceasta verifică dacă a apărut o eroare în timpul transmiterii mesajului și tipărește un mesaj de eroare dacă este necesar.

Primirea datelor de la magistrala CAN

Pentru a primi un mesaj prin magistrala CAN, puteți utiliza readMsgBuf() metodă:

nesemnatchar len = 0;
nesemnatchar buf[8];
nesemnatchar canID = 0;

dacă (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}

Aceasta verifică dacă un mesaj este disponibil pe magistrala CAN și apoi citește mesajul în buf matrice. Lungimea mesajului este stocată în len variabilă, iar ID-ul mesajului este stocat în canID variabil.

Odată ce ați primit un mesaj, puteți procesa încărcătura de date după cum este necesar. De exemplu, puteți imprima încărcătura utilă de date pe monitorul serial:

Serial.imprimare(„Mesaj primit cu ID”);
Serial.imprimare(canID, HEX);
Serial.imprimare(" și date: ");

pentru (int i = 0; i < len; i++) {
Serial.imprimare(buf[i], HEX);
Serial.imprimare(" ");
}

Serial.println();

Aceasta imprimă ID-ul mesajului primit și încărcarea utilă a datelor pe monitorul serial.

Cum să conectați un transceiver CAN Bus la o placă de breadboard

Pentru a construi o magistrală CAN pentru a conecta două dispozitive în acest proiect exemplu, veți avea nevoie de:

  • Două microcontrolere (două plăci Arduino Nano pentru acest exemplu)
  • Două module CAN MCP2515
  • O placă
  • Fire jumper
  • Un modul de ecran LCD I2C 16x2
  • Senzor ultrasonic HC-SR04

Pentru acest exemplu de proiect, patru biblioteci sunt utilizate în schița Arduino. Există NewPing biblioteca, care oferă o interfață ușor de utilizat pentru senzorul cu ultrasunete, precum și pentru Biblioteca SPI, care facilitează comunicarea între placa Arduino și controlerul de magistrală CAN MCP2515. The LiquidCrystal_I2C biblioteca este utilizată pentru modulul de afișare.

În cele din urmă, există biblioteca mcp2515 pentru a interfața cu cipul MCP2515, permițându-ne să transmitem cu ușurință date prin rețeaua magistrală CAN.

Configurare hardware (Exemplu HC-SR04)

În acest proiect folosind un senzor HC-SR04 și LCD, o placă Arduino Nano va acționa ca receptor, în timp ce cealaltă Arduino va acționa ca emițător. Conectați componentele expeditorului conform schemei de cablare de mai jos:

Iată schema pentru circuitul receptorului:

În cele din urmă, conectați cele două noduri împreună folosind CAN_H și POT SĂ linii așa cum se arată:

Când conectați modulele, este important să vă asigurați că tensiunea de alimentare este în intervalul specificat și că POATE H și POT SĂ pinii sunt conectați corespunzător la magistrală.

Programarea modulului CAN Bus MCP2515

Rețineți că atunci când programați modulul MCP2515, este important să utilizați rata de biți corectă pentru a asigura o comunicare de succes cu alte dispozitive CAN din rețea.

Cod expeditor:

#include
#include
#include

MCP2515 mcp2515(10);
constoctet trigPin = 3;
constoctet echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);

structcan_framecanMsg;

golînființat(){
Serial.ÎNCEPE(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

golbuclă(){
nesemnatint distanta = sonar.ping_cm();
canMsg.can_id = 0x036; //ID-ul CAN ca 0x036
canMsg.can_dlc = 8; //Lungimea datelor CAN este 8
canMsg.data[0] = distanta; //Actualizează valoarea umidității în [0]
canMsg.data[1] = 0x00; //Odihnește toți cu 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;

mcp2515.sendMessage(&canMsg);//Trimite mesajul CAN
întârziere(100);
}

Cod receptor:

#include
#include
#include

MCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
structcan_framecanMsg;

golînființat(){
Serial.ÎNCEPE(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.imprimare(„TUTORIAL MUO CAN”);
întârziere(3000);
lcd.clar();
}

golbuclă(){
dacă (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Pentru a primi date
{
int distanta = canMsg.data[0];
lcd.setCursor(0,0);
lcd.imprimare("Distanța:");
lcd.imprimare(distanţă);
lcd.imprimare("cm ");
}
}

Du-ți proiectele Arduino la următorul nivel

Combinația dintre magistrala CAN și Arduino oferă o platformă puternică pentru construirea sau învățarea rețelelor de comunicații sofisticate utilizate în diverse aplicații. Deși poate părea a fi o curbă de învățare abruptă, a avea propria ta configurație pe o placă de breadboard este o modalitate destul de utilă de a învăța cum să folosești o rețea de autobuz CAN în proiecte de bricolaj complexe.