- Bevezetés a CAN-ba
- A CAN összehasonlítása az SPI és az I2C felett
- CAN protokollalkalmazások
- A CAN protokoll használata Arduino-ban
- Szükséges alkatrészek
- Kördiagramm
- Csatlakozás két MCP2515 CAN modul között
- Az Arduino programozása a CAN kommunikációhoz
- A CAN adó mellékkódjának magyarázata (Arduino Nano)
- A CAN vevő oldalkódjának magyarázata (Arduino UNO)
- CAN kommunikáció működése Arduinóban
Ma minden átlagos autó körülbelül 60-100 érzékelőegységből áll, amelyek érzékelik és kicserélik az információkat. Az autógyártók folyamatosan intelligensebbé teszik autójukat olyan funkciókkal, mint az autonóm vezetés, a légzsákrendszer, a gumiabroncsnyomás-figyelés, a sebességtartó automatika stb. Ez a szám csak várhatóan magas lesz. Más érzékelőktől eltérően ezek az érzékelők kritikus információkat dolgoznak fel, ezért az ezen érzékelőkből származó adatokat szabványos autóipari kommunikációs protokollok segítségével kell kommunikálni. Például a sebességtartó automatika rendszerének adatai, mint például a sebesség, a fojtószelep helyzet stb .az autó gyorsulási szintjének eldöntése érdekében a téves kommunikáció vagy az adatok elvesztése kritikus hibákhoz vezethet. Ezért az olyan szabványos kommunikációs protokollokkal ellentétben, mint az UART, az SPI vagy az I2C, a tervezők sokkal megbízhatóbb autó kommunikációs protokollokat használnak, mint például a LIN, CAN, FlexRay stb.
Az összes rendelkezésre álló protokoll közül a CAN-t elsősorban használják és népszerűbbek. Már megbeszéltük, mi a CAN és hogyan működik a CAN. Tehát ebben a cikkben újra megvizsgáljuk az alapokat, majd végül két Arduinos között is cserélünk adatokat CAN kommunikáció segítségével. Érdekesen hangzik! Tehát kezdjük.
Bevezetés a CAN-ba
A CAN aka Controller Area Network egy soros kommunikációs busz, amelyet ipari és autóipari alkalmazásokhoz terveztek. Ez egy üzenetalapú protokoll, amelyet több eszköz közötti kommunikációra használnak. Ha több CAN eszközt csatlakoztatnak egymáshoz, az alábbiak szerint, a kapcsolat egy olyan hálózatot képez, amely a központi idegrendszerünkhöz hasonlóan működik, és lehetővé teszi, hogy bármely eszköz beszéljen a csomópont bármely más eszközével.
A CAN hálózat csak két CAN High és CAN Low vezetékből áll a kétirányú adatátvitelhez a fentiek szerint. A CAN kommunikációs sebessége jellemzően 50 Kbps és 1Mbps között mozog, a távolság pedig 40 méter 1Mbps sebességgel és 1000 méter 50 Kbps sebességgel.
A CAN üzenet formátuma:
A CAN kommunikációban az adatokat a hálózat egy meghatározott üzenetformátumként továbbítja. Ez az üzenetformátum sok szegmenst tartalmaz, de két fő szegmens az azonosító és az adatok, amelyek segítenek az üzenetek küldésében és megválaszolásában a CAN-buszon.
Azonosító vagy CAN ID: Az azonosító más néven CAN ID vagy más néven PGN (Parameter Group Number). A CAN hálózatban lévő CAN eszközök azonosítására szolgál. Az azonosító hossza 11 vagy 29 bit, az alkalmazott CAN protokoll típusától függően.
Normál CAN: 0-2047 (11 bites)
Kiterjesztett CAN: 0-2 29 -1 (29-bit)
Adatok: Ez az a tényleges érzékelő / vezérlő adat, amelyet az egyik eszközről a másikra kell elküldeni. A méretadatok 0 és 8 bájt közöttiek lehetnek.
Adathossz-kód (DLC): 0–8 a jelen lévő adatbájtok számához.
CAN-ban használt vezetékek:
A CAN protokoll két vezetékből áll, nevezetesen CAN_H és CAN_L az információk küldésére és fogadására. Mindkét vezeték differenciálvonalként működik, vagyis a CAN jelet (0 vagy 1) a CAN_L és a CAN_H közötti potenciálkülönbség képviseli. Ha a különbség pozitív és nagyobb, mint egy bizonyos minimális feszültség, akkor ez 1, és ha a különbség negatív, akkor 0.
A CAN kommunikációhoz általában sodrott érpárat használnak. A képen látható módon általában egyetlen 120 ohmos ellenállást használnak a CAN hálózat két végén, mert a vezetéket ki kell egyensúlyozni és azonos potenciálhoz kell kötni.
A CAN összehasonlítása az SPI és az I2C felett
Mivel már megtanultuk használni az SPI-t az Arduino-val és az IIC-t az Arduino-val, hasonlítsuk össze az SPI és az I2C jellemzőit a CAN-nal
Paraméter | SPI | I2C | TUD |
Sebesség | 3Mbps - 10Mbps | Normál: 100Kbps | 10KBps - 1MBps a használt vezeték hosszától is függ |
Gyors: 400 Kbps | |||
Nagy sebesség: 3.4Mbps | |||
típus | Szinkron | Szinkron | Aszinkron |
Vezetékek száma | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 vezeték (SDA, SCL) | 2 vezeték (CAN_H, CAN_L) |
Duplex | Teljes duplex | Félduplex | Félduplex |
CAN protokollalkalmazások
- A CAN protokoll megbízhatósága és megbízhatósága miatt olyan iparágakban használják őket, mint az autóipar, az ipari gépek, a mezőgazdaság, az orvosi berendezések stb.
- Mivel a kábelezés bonyolultsága csökken a CAN-ban, főleg autóipari alkalmazásokban használják, például autóban.
- Alacsony megvalósítási költség és a hardver alkatrészek ára is alacsonyabb.
- Könnyen hozzáadható és eltávolítható a CAN busz eszköz.
A CAN protokoll használata Arduino-ban
Mivel az Arduino nem tartalmaz beépített CAN portot, az MCP2515 nevű CAN modult használják. Ez a CAN modul az SPU kommunikáció használatával kapcsolódik az Arduinóhoz. Nézzünk meg többet az MCP2515-ről részletesen, és arról, hogyan kapcsolódik az Arduino-hoz.
MCP2515 CAN modul:
Az MCP2515 modul rendelkezik egy MCP2515 CAN vezérlővel, amely nagy sebességű CAN adóvevő. Az MCP2515 és az MCU közötti kapcsolat az SPI-n keresztül történik. Tehát könnyen kezelhető bármely SPI interfésszel rendelkező mikrovezérlővel.
Azoknak a kezdőknek, akik szeretnék megtanulni a CAN buszt, ez a modul jó kezdetként szolgál. Ez a CAN SPI tábla ideális ipari automatizáláshoz, otthoni automatizáláshoz és más beágyazott autóipari projektekhez.
Az MCP2515 jellemzői és specifikációja:
- TJA1050 nagysebességű CAN adó-vevőt használ
- Méret: 40 × 28mm
- SPI vezérlés a bővített Multi CAN busz interfészhez
- 8MHZ kristályoszcillátor
- 120Ω kapcsos ellenállás
- Független kulccsal, LED kijelzővel, Tápfeszültség jelzővel rendelkezik
- 1 Mb / s CAN működést támogat
- Alacsony áramú készenléti üzemmód
- Legfeljebb 112 csomópont csatlakoztatható
Az MCP2515 CAN modul kivágása:
PIN neve |
HASZNÁLAT |
VCC |
5V tápegység |
GND |
Őrölt csap |
CS |
SPI SLAVE kiválasztó csap (aktív alacsony) |
ÍGY |
SPI master bemeneti slave kimeneti vezeték |
SI |
SPI master kimeneti slave bemeneti vezeték |
SCLK |
SPI Óra tű |
INT |
MCP2515 megszakító csap |
Ebben az oktatóanyagban lássuk, hogyan lehet a páratartalom és hőmérséklet (DHT11) érzékelő adatait elküldeni az Arduino Nano-ból az Arduino Uno-ba az MCP2515 CAN buszmodulon keresztül.
Szükséges alkatrészek
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD kijelző
- MCP2515 CAN modul - 2
- 10k potenciométer
- Kenyérlemez
- Vezetékek csatlakoztatása
Kördiagramm
Csatlakozás a CAN adó oldalán:
Alkatrész - Tű |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
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 |
+ 5V |
DHT11 - GND |
GND |
DHT11 - KI |
A0 |
Áramköri csatlakozások a CAN vevő oldalán:
Alkatrész - Tű |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
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 |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
10K potenciométer középső PIN-kódjához |
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 |
Csatlakozás két MCP2515 CAN modul között
H - CAN magas
L - alacsony lehet
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Miután az összes csatlakozás megtörtént, a hardverem alább nézett ki
Az Arduino programozása a CAN kommunikációhoz
Először telepítenünk kell egy könyvtárat a CAN számára az Arduino IDE-ben. Az MCP2515 CAN modul és az Arduino összekapcsolása megkönnyíti a következő könyvtár használatát.
- Töltse le az Arduino CAN MCP2515 könyvtár ZIP fájlját.
- Az Arduino IDE alkalmazásból: Vázlat -> Könyvtár beillesztése ->.ZIP könyvtár hozzáadása
Ebben az oktatóanyagban a kódolás két részre oszlik, az egyik CAN adó kódként (Arduino Nano), a másik pedig a CAN vevő kódként (Arduino UNO), amelyek mind megtalálhatók az oldal alján. Ugyanez magyarázata a következő.
Az adatok küldésére és fogadására szolgáló program írása előtt ellenőrizze, hogy telepítette-e a könyvtárat a fenti lépések végrehajtásával, és az MCP2515 CAN modult a program a következő módon inicializálja.
Az MCP2515 CAN modul inicializálása:
Az MCP2515-tel való kapcsolat létrehozásához kövesse a következő lépéseket:
1. Állítsa be a PIN-kódot, ahova az SPI CS csatlakozik (alapértelmezés szerint 10)
MCP2515 mcp2515 (10);
2. Állítsa be az adatátviteli sebességet és az oszcillátor frekvenciáját
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Elérhető Baud-árak:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KB
Rendelkezésre álló óra sebességek:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Állítsa be a módokat.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
A CAN adó mellékkódjának magyarázata (Arduino Nano)
Az adó szakaszban az Arduino Nano az MCP2515 CAN modulhoz kapcsolódva SPI csapokon keresztül, a DHT11 pedig hőmérséklet- és páratartalom adatokat küld a CAN buszra.
Először a szükséges könyvtárakat, SPI könyvtárat az SPI kommunikáció használatához, az MCP2515 könyvtárat a CAN kommunikációhoz és a DHT könyvtárat a DHT érzékelő Arduino használatához . Korábban összekötöttük a DHT11-et az Arduinóval.
#include
Most meghatároztuk az Arduino Nano A0-jához kapcsolódó DHT11 (OUT pin) pin nevét
#define DHTPIN A0
Ezenkívül a DHTTYPE- t DHT11-ként definiálják.
#define DHTTYPE DHT11
A canMsg struct adattípus tárolására CAN üzenet formátumban.
struct can_frame canMsg;
Állítsa be a PIN-kódot, ahová az SPI CS csatlakozik (alapértelmezés szerint 10)
MCP2515 mcp2515 (10);
A DHT osztály DHT objektuma, az Arduino Nano és a DHT típus DHT11 néven, inicializálva van.
DHT dht (DHTPIN, DHTTYPE);
Következő az érvénytelen beállításban ():
Kezdje az SPI kommunikációt a következő utasítás használatával
SPI.begin ();
Ezután használja az alábbi állítást, hogy megkapja a hőmérséklet és páratartalom értékeket a DHT11 érzékelőtől.
dht.kezdés ();
Ezután az MCP2515 a következő paranccsal áll vissza RESET-re
mcp2515.reset ();
Most az MCP2515 órajelként 500KBPS és 8MHZ sebességet állít be
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Az MCP2525 normál üzemmódban van
mcp2515.setNormalMode ();
A void ciklusban ():
Az alábbi utasítás megkapja a Páratartalom és Hőmérséklet értéket, és egy h és t egész változóban tárolja.
int h = dht.readHumidity (); int t = dht.olvasott Hőmérséklet ();
Ezután a CAN ID-t 0x036 (választás szerint), a DLC-t pedig 8-ként adjuk meg, és a h és t adatokat megadjuk az adatoknak és adatoknak, és az összes adatot 0-val nyugtatjuk.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.adata = h; // Páratartalom értékének frissítése a canMsg.data = t; // Hőmérsékletérték frissítése a canMsg.data = 0x00 értékben ; // Pihenjen mind a 0 canMsg.data = 0x00 értékkel; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Végül is, hogy az üzenetet elküldhessük a CAN BUS-nak, a következő állítást használjuk.
mcp2515.sendMessage (& canMsg);
Tehát most a hőmérsékleti és páratartalmi adatokat üzenetként küldjük a CAN buszra.
A CAN vevő oldalkódjának magyarázata (Arduino UNO)
A vevő részben az Arduino UNO kapcsolódott az MCP2515 és a 16x2 LCD kijelzőhöz. Itt az Arduino UNO megkapja a hőmérsékletet és a páratartalmat a CAN buszról, és az LCD-n megjeleníti a kapott adatokat.
Először a szükséges könyvtárak tartoznak hozzá, az SPI Library az SPI Communication használatához, az MCP2515 Library a CAN Communication használatához és a LiquidCrsytal Library a 16x2 LCD használatához az Arduino-val .
#include
Ezután meghatározzuk azokat az LCD csapokat, amelyeket az Arduino UNO-val való összeköttetéshez használnak.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A CAN üzenet formátumának tárolásához strukturális adattípus van deklarálva.
struct can_frame canMsg;
Állítsa be a PIN-kódot, ahová az SPI CS csatlakozik (alapértelmezés szerint 10)
MCP2515 mcp2515 (10);
Üres beállításban ():
Először az LCD-t állítja be 16x2 módba, és üdvözlő üzenet jelenik meg.
lcdbegin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); késés (3000); lcd.clear ();
Kezdje az SPI kommunikációt a következő utasítás használatával.
SPI.begin ();
Ezután az MCP2515 a következő paranccsal áll vissza RESET-re.
mcp2515.reset ();
Most az MCP2515 órajelként 500KBPS és 8MHZ sebességet állít be.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Az MCP2525 normál üzemmódban van.
mcp2515.setNormalMode ();
Következő a void ciklusban ():
A következő utasítást használjuk az üzenet fogadására a CAN buszról. Ha üzenet érkezik, akkor az if feltételbe kerül.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Az if feltétel esetén az adatokat c anMsg-be fogadják és tárolják, azok az adatok, amelyek nedvességértékkel rendelkeznek, és adatok, amelyek hőmérsékleti értékkel rendelkeznek. Mindkét értéket x és y egész számban tároljuk.
int x = canMsg.adatok; int y = canMsg.adatok;
Az értékek beérkezését követõen a hõmérséklet és a páratartalom értékei 16x2 LCD kijelzõn jelennek meg a következõ utasítás szerint.
lcd.setCursor (0,0); lcd.print ("Páratartalom:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Hőmérséklet:"); lcd.print (y); késés (1000); lcd.clear ();
CAN kommunikáció működése Arduinóban
Miután a hardver készen áll, töltse fel a programot a CAN adó és a CAN vevő számára (a teljes programokat alább adjuk meg) a megfelelő Arduino táblákra. Ha bekapcsoláskor észre kell a hőmérsékleti értéket olvasni DHT11 fog küldeni egy másik Arduino CAN kommunikáció és megjelenik az LCD a 2 nd Arduino, mint látható az alábbi képen. A távirányítómat is használtam annak ellenőrzésére, hogy az LCD-n megjelenített hőmérséklet közel van-e a szoba tényleges hőmérsékletéhez.
A teljes munka megtalálható az alábbi linkre kattintva. Ha bármilyen kérdése van, hagyja őket a megjegyzés részben, vagy más technikai kérdésekhez használja fórumunkat.