- Įvadas į CAN
- CAN palyginimas su SPI ir I2C
- CAN protokolo programos
- Kaip naudoti CAN protokolą „Arduino“
- Būtini komponentai
- Grandinės schema
- Sujungimas tarp dviejų MCP2515 CAN modulių
- „Arduino“ programavimas CAN ryšiui
- CAN siųstuvo šalutinio kodo paaiškinimas („Arduino Nano“)
- CAN Receiver Side Code Explanation (Arduino UNO)
- Working of CAN communication in Arduino
Šiandien bet kurį vidutinį automobilį sudaro apie 60–100 jutiklių, skirtų jutimui ir keitimuisi informacija. Kadangi automobilių gamintojai nuolat daro savo automobilį protingesnį su tokiomis funkcijomis kaip autonominis vairavimas, oro pagalvių sistema, padangų slėgio stebėjimas, pastovaus greičio palaikymo sistema ir kt., Tikimasi, kad šis skaičius išaugs. Skirtingai nuo kitų jutiklių, šie jutikliai apdoroja svarbiausią informaciją, todėl šių jutiklių duomenys turėtų būti perduodami naudojant standartinius automobilių komunikacijos protokolus. Pvz., Greičio palaikymo sistemos duomenys, tokie kaip greitis, droselio padėtis ir kt., Yra gyvybiškai svarbios vertės, siunčiamos į elektroninio valdymo bloką (ECU)norint nuspręsti automobilio pagreičio lygį, neteisingas bendravimas ar duomenų praradimas čia gali sukelti kritinių gedimų. Taigi, skirtingai nei įprasti ryšio protokolai, tokie kaip UART, SPI ar I2C, dizaineriai naudoja daug patikimų automobilių ryšio protokolų, tokių kaip LIN, CAN, FlexRay ir kt.
Iš visų turimų protokolų CAN yra labiau naudojamas ir populiarus. Mes jau aptarėme, kas yra CAN ir kaip CAN veikia. Taigi, šiame straipsnyje mes dar kartą apsvarstysime pagrindus, o tada galiausiai taip pat keisimės duomenimis tarp dviejų „Arduinos“, naudodami CAN ryšį. Skamba įdomiai teisingai! Taigi, pradėkime.
Įvadas į CAN
„CAN“, dar žinomas kaip „ Controller Area Network“, yra nuosekliojo ryšio magistralė, skirta naudoti pramonėje ir automobiliuose. Tai pranešimais pagrįstas protokolas, naudojamas ryšiui tarp kelių įrenginių. Kai sujungiami keli CAN įrenginiai, kaip parodyta žemiau, ryšys sudaro tinklą, veikiantį kaip mūsų centrinė nervų sistema, leidžiančią bet kuriam įrenginiui kalbėti su bet kuriuo kitu mazgo įrenginiu.
CAN tinklas sudarys tik du laidus "CAN High ir gali Low už dvikryptė duomenų perdavimas, kaip parodyta pirmiau. Paprastai CAN ryšio greitis svyruoja nuo 50 Kbps iki 1Mbps, o atstumas gali svyruoti nuo 40 metrų esant 1Mbps iki 1000 metrų esant 50kbps.
CAN pranešimo formatas:
CAN ryšyje duomenys tinkle perduodami kaip tam tikras pranešimo formatas. Šiame pranešimo formate yra daug segmentų, tačiau du pagrindiniai segmentai yra identifikatorius ir duomenys, kurie padeda siųsti ir atsakyti į pranešimus CAN magistralėje.
Identifikatorius arba CAN ID: identifikatorius taip pat žinomas kaip CAN ID arba dar žinomas kaip PGN (parametrų grupės numeris). Jis naudojamas CAN įrenginiams, esantiems CAN tinkle, identifikuoti. Identifikatoriaus ilgis yra 11 arba 29 bitai, atsižvelgiant į naudojamo CAN protokolo tipą.
Standartinis CAN: 0-2047 (11 bitų)
Išplėstas CAN: 0-2 29 -1 (29 bitų)
Duomenys: tai yra tikrieji jutiklio / valdymo duomenys, kuriuos reikia siųsti iš vieno įrenginio į kitą. Dydžio duomenys gali būti nuo 0 iki 8 baitų ilgio.
Duomenų ilgio kodas (DLC): nuo 0 iki 8, nurodant esančių duomenų baitų skaičių.
CAN naudojami laidai:
CAN protokolas susideda iš dviejų laidų, būtent CAN_H ir CAN_L informacijai siųsti ir gauti. Abu laidai veikia kaip diferencialinė linija, o tai reiškia, kad CAN signalą (0 arba 1) parodo potencialų skirtumas tarp CAN_L ir CAN_H. Jei skirtumas yra teigiamas ir didesnis už tam tikrą minimalią įtampą, jis yra 1, o jei skirtumas yra neigiamas, jis yra 0.
Paprastai CAN ryšiui naudojamas vytos poros kabelis. Dviejuose CAN tinklo galuose paprastai naudojamas vienas 120 omų rezistorius, kaip parodyta paveikslėlyje, taip yra todėl, kad linija turi būti subalansuota ir susieta su tuo pačiu potencialu.
CAN palyginimas su SPI ir I2C
Kadangi mes jau išmokome naudoti SPI su „Arduino“ ir IIC su „Arduino“, palyginkime SPI ir I2C su CAN savybes
Parametras | SPI | I2C | GALI |
Greitis | Nuo 3Mbps iki 10Mbps | Standartas: 100 kbps | 10–1 MB / s taip pat priklauso nuo naudojamo laido ilgio |
Greitas: 400 Kbps | |||
Spartus: 3.4Mbps | |||
Tipas | Sinchroninis | Sinchroninis | Asinchroninis |
Laidų skaičius | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 laidai (SDA, SCL) | 2 laidai (CAN_H, CAN_L) |
Dvipusis | Visas dvipusis | Pusiau dvipusis | Pusiau dvipusis |
CAN protokolo programos
- Dėl patikimumo ir patikimumo CAN protokolas jie naudojami tokiose pramonės šakose kaip automobilių, pramonės mašinos, žemės ūkis, medicinos įranga ir kt.
- Kadangi laidų sudėtingumas CAN yra mažesnis, jie daugiausia naudojami automobiliuose, pavyzdžiui, automobiliuose.
- Maža įdiegimo kaina ir aparatūros komponentų kaina taip pat yra mažesnė.
- Lengva pridėti ir išimti CAN magistralės įrenginius.
Kaip naudoti CAN protokolą „Arduino“
Kadangi „Arduino“ nėra integruoto CAN prievado, naudojamas CAN modulis, vadinamas MCP2515. Šis CAN modulis yra susietas su „Arduino“ naudojant SPI ryšį. Pažiūrėkime daugiau apie MCP2515 išsamiau ir kaip jis sąsaja su „Arduino“.
MCP2515 CAN modulis:
MCP2515 modulis turi CAN valdiklį MCP2515, kuris yra didelės spartos CAN siųstuvas-imtuvas. Ryšys tarp MCP2515 ir MCU yra per SPI. Taigi, lengva sąsaja su bet kuriuo mikrovaldikliu, turinčiu SPI sąsają.
Pradedantiesiems, norintiems išmokti „CAN Bus“, šis modulis bus gera pradžia. Ši „CAN SPI“ plokštė idealiai tinka pramoninei automatizavimui, namų automatizavimui ir kitiems įterptiems automobilių projektams.
MCP2515 savybės ir specifikacijos:
- Naudojamas greitaeigis CAN siųstuvas-imtuvas TJA1050
- Matmenys: 40 × 28mm
- SPI valdymas išplėsti „Multi CAN“ magistralės sąsają
- 8MHz kristalinis osciliatorius
- 120Ω gnybto varža
- Turi nepriklausomą raktą, LED indikatorių, maitinimo indikatorių
- Palaiko 1 Mb / s CAN veikimą
- Veikia silpnai srovės režimu
- Galima prijungti iki 112 mazgų
MCP2515 CAN modulio kištukas:
PIN vardas |
NAUDOTI |
VCC |
5 V maitinimo įvesties kaištis |
BND |
Įžemintas kaištis |
CS |
SPI SLAVE pasirinkite kaištį (aktyvus žemas) |
TAIP |
SPI pagrindinio įvesties vergo išvesties laidas |
SI |
SPI pagrindinio išvesties vergo įvesties laidas |
SCLK |
SPI Laikrodžio kaištis |
INT |
MCP2515 pertraukimo kaištis |
Šioje pamokoje pažiūrėkime, kaip siųsti drėgmės ir temperatūros (DHT11) jutiklio duomenis iš „Arduino Nano“ į „Arduino Uno“ per CAN magistralės modulį MCP2515.
Būtini komponentai
- „Arduino UNO“
- „Arduino NANO“
- DHT11
- 16x2 LCD ekranas
- MCP2515 CAN modulis - 2
- 10k potenciometras
- Bandomoji Lenta
- Laidų sujungimas
Grandinės schema
Jungtis CAN siųstuvo pusėje:
Komponentas - kaištis |
„Arduino Nano“ |
MPC2515 - VCC |
+ 5 V |
MPC2515 - GND |
BND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5 V |
DHT11 - GND |
BND |
DHT11 - IŠJUNGTA |
A0 |
Grandinės jungtys CAN imtuvo pusėje:
Komponentas - kaištis |
„Arduino UNO“ |
MPC2515 - VCC |
+ 5 V |
MPC2515 - GND |
BND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
BND |
LCD - VDD |
+ 5 V |
LCD - V0 |
Į 10K potenciometro centro PIN kodą |
LCD - RS |
3 |
LCD - RW |
BND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5 V |
LCD - K. |
BND |
Sujungimas tarp dviejų MCP2515 CAN modulių
H - CAN aukštas
L - GALI žema
MCP2515 („Arduino Nano“) |
MCP2515 („Arduino UNO“) |
H |
H |
L |
L |
Atlikus visus ryšius, mano aparatūra atrodė taip žemiau
„Arduino“ programavimas CAN ryšiui
Pirmiausia turime įdiegti CAN biblioteką „Arduino IDE“. MCP2515 CAN modulio susiejimas su „Arduino“ tampa lengvesnis naudojant šią biblioteką.
- Atsisiųskite „Arduino CAN MCP2515“ bibliotekos ZIP failą.
- Iš „Arduino IDE“: eskizas -> įtraukti biblioteką -> pridėti.ZIP biblioteką
Šioje pamokoje kodavimas yra padalintas į dvi dalis: CAN siųstuvo kodas („Arduino Nano“) ir kitas kaip „ CAN“ imtuvo kodas („Arduino UNO“), kuriuos abu galite rasti šio puslapio apačioje. To paties paaiškinimas yra toks.
Prieš rašydami duomenų siuntimo ir priėmimo programą įsitikinkite, kad įdiegėte biblioteką atlikdami pirmiau nurodytus veiksmus, o CAN modulis MCP2515 jūsų programoje yra inicializuotas taip.
Inicijuoti MCP2515 CAN modulį:
Norėdami sukurti ryšį su MCP2515, atlikite šiuos veiksmus:
1. Nustatykite PIN kodą, prie kurio prijungta SPI CS (pagal nutylėjimą - 10)
MCP2515 mcp2515 (10);
2. Nustatykite perdavimo greitį ir osciliatoriaus dažnį
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Galimi „Baud“ tarifai:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_BAN_CAN_CAN_CAN_CAN_CAN_CAN_CAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN_KAN
Galimas laikrodžio greitis:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Nustatykite režimus.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN siųstuvo šalutinio kodo paaiškinimas („Arduino Nano“)
Siųstuvo skyriuje „Arduino Nano“ sąsaja su „MCP2515 CAN“ moduliu per SPI kaiščius ir „ DHT11“ siunčia temperatūros ir drėgmės duomenis į CAN magistralę.
Pirmiausia įtraukiamos reikalingos bibliotekos, SPI biblioteka, skirta naudoti SPI ryšį, MCP2515 biblioteka, skirta naudoti CAN ryšį, ir DHT biblioteka, skirta naudoti DHT jutiklį su „Arduino“ . Anksčiau mes sujungėme DHT11 su „Arduino“.
# įtraukti
Dabar yra apibrėžtas DHT11 (OUT pin), susieto su „Arduino Nano“ A0, kaiščio pavadinimas
#define DHTPIN A0
Be to, DHTTYPE apibrėžiamas kaip DHT11.
#define DHTTYPE DHT11
„ CanMsg“ struktūros duomenų tipas CAN pranešimo formatui saugoti.
struct can_frame canMsg;
Nustatykite PIN kodą, prie kurio prijungta SPI CS (pagal nutylėjimą - 10)
MCP2515 mcp2515 (10);
Be to, inicializuojamas DHT klasės objektas dht su DHT kaiščiu su „Arduino Nano“ ir DHT tipo, kaip DHT11.
DHT dht (DHTPIN, DHTTYPE);
Kitas negaliojančioje sąrankoje ():
Pradėkite SPI komunikaciją naudodami šį teiginį
SPI.prasideda ();
Tada naudokite žemiau pateiktą teiginį, kad gautumėte temperatūros ir drėgmės vertes iš DHT11 jutiklio.
dht.prasideda ();
Tada MCP2515 bus atstatytas naudojant šią komandą
mcp2515.reset ();
Dabar MCP2515 nustatytas 500KBPS ir 8MHZ greitis kaip laikrodis
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
„MCP2525“ yra nustatytas įprastu režimu
mcp2515.setNormalMode ();
Tuščiajame cikle ():
Šis sakinys gauna drėgmės ir temperatūros vertę ir saugo sveiko skaičiaus kintamuosius h ir t.
int h = dht.skaičiuokite drėgmę (); int t = dht.skaitytiTemperatūra ();
Next the CAN ID is given as 0x036 (As per choice) and DLC as 8 and we give the h and t data to the data and data and rest all data with 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; //Update humidity value in canMsg.data = t; //Update temperature value in canMsg.data = 0x00; //Rest all with 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
After all, to send the message to CAN BUS we use the following statement.
mcp2515.sendMessage(&canMsg);
So now the temperature and humidity data are sent as message to CAN bus.
CAN Receiver Side Code Explanation (Arduino UNO)
In the receiver section, Arduino UNO interfaced with the MCP2515 and 16x2 LCD display. Here the Arduino UNO receives the Temperature and Humidity from CAN bus and display the data received in LCD.
First the required libraries are included, SPI Library for using SPI Communication, MCP2515 Library for using CAN Communication and LiquidCrsytal Library for using 16x2 LCD with Arduino.
#include
Next the LCD pins that are used in connecting with the Arduino UNO are defined.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
A struct data type is declared for storing CAN message format.
struct can_frame canMsg;
Set the pin number where SPI CS is connected (10 by default)
MCP2515 mcp2515(10);
In void setup ():
First the LCD is set at 16x2 mode and a welcome message is displayed.
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("CAN ARDUINO"); delay(3000); lcd.clear();
Begin the SPI communication by using following statement.
SPI.begin();
Next the MCP2515 is being RESET using the following command.
mcp2515.reset();
Now the MCP2515 is set speed of 500KBPS and 8MHZ as clock.
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
And the MCP2525 is set at normal mode.
mcp2515.setNormalMode();
Next in void loop():
The following statement is used to receive the message from the CAN bus. If message is received it gets into the if condition.
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
In the if condition the data is received and stored in c anMsg , the data that has humidity value and data that has temperature value. Both values are stored in an integer x and y.
int x = canMsg.data; int y = canMsg.data;
After receiving the values, the temperature and humidity values are displayed in 16x2 LCD display using following statement.
lcd.setCursor(0,0); lcd.print("Humidity: "); lcd.print(x); lcd.setCursor(0,1); lcd.print("Temp: "); lcd.print(y); delay(1000); lcd.clear();
Working of CAN communication in Arduino
Once the hardware is ready upload the program for CAN transmitter and CAN receiver (complete programs are given below) in the respective Arduino boards. When powered you should notice the temperature value read by DHT11 will be sent to another Arduino through CAN communication and displayed on the LCD of the 2nd Arduino as you can see in the below image. I have also used my AC remote to check if the temperature displayed on the LCD is close to actual room temperature.
The complete working can be found at the video linked below. If you have any questions leave them in the comment section or use our forums for other technical questions.