- Johdanto CAN: iin
- CAN: n vertailu SPI: n ja I2C: n välillä
- CAN-protokollasovellukset
- Kuinka käyttää CAN-protokollaa Arduinossa
- Tarvittavat komponentit
- Piirikaavio
- Kahden MCP2515 CAN -moduulin välinen yhteys
- Arduinon ohjelmointi CAN-viestintää varten
- CAN-lähettimen sivukoodin selitys (Arduino Nano)
- CAN-vastaanottimen sivukoodin selitys (Arduino UNO)
- CAN-viestinnän työskentely Arduinossa
Nykyään jokaisessa keskimääräisessä autossa on noin 60-100 anturiyksikköä tietojen tunnistamiseksi ja vaihtamiseksi. Autovalmistajien avulla autonsa älykkäämpiä ominaisuuksia ovat esimerkiksi autonominen ajo, turvatyynyjärjestelmä, rengaspaineen valvonta, vakionopeudensäädin jne. Tämän määrän odotetaan nousevan vain korkealle. Toisin kuin muut anturit, nämä anturit käsittelevät kriittistä tietoa, joten näiden antureiden tiedot tulisi välittää käyttämällä tavanomaisia autojen viestintäkäytäntöjä. Esimerkiksi vakionopeudensäätöjärjestelmän tiedot, kuten nopeus, kaasun asento jne., Ovat elintärkeitä arvoja, jotka lähetetään elektroniselle ohjausyksikölle (ECU)auton kiihtyvyyden määrittämiseksi väärä tiedonsiirto tai tietojen menetys voi johtaa kriittisiin virheisiin. Siksi, toisin kuin tavanomaiset yhteyskäytännöt, kuten UART, SPI tai I2C, suunnittelijat käyttävät paljon luotettavia autoliikenneprotokollia, kuten LIN, CAN, FlexRay jne.
Kaikista käytettävissä olevista protokollista CAN on pääasiassa käytetty ja suosittu. Olemme jo keskustelleet siitä, mikä on CAN ja miten CAN toimii. Joten tässä artikkelissa tarkastellaan uudelleen perusasiat ja sitten lopuksi vaihdamme myös tietoja kahden Arduinon välillä käyttämällä CAN-viestintää. Kuulostaa mielenkiintoiselta! Joten, aloitetaan.
Johdanto CAN: iin
CAN eli Controller Area Network on sarjaliikenneväylä, joka on suunniteltu teollisuuden ja autoteollisuuden sovelluksiin. Se on viestipohjainen protokolla, jota käytetään viestintään useiden laitteiden välillä. Kun useita CAN-laitteita on kytketty yhteen alla olevan kuvan mukaisesti, yhteys muodostaa verkon, joka toimii kuten keskushermostomme, jolloin kaikki laitteet voivat puhua minkä tahansa muun solmun laitteen kanssa.
CAN-verkko koostuu vain kaksi johdinta CAN korkea ja CAN Low kaksisuuntaisen tiedonsiirron, kuten on esitetty edellä. Tyypillisesti CAN: n tiedonsiirtonopeus vaihtelee 50 Kbps: sta 1Mbps: iin ja etäisyys voi vaihdella 40 metristä nopeudella 1Mbps - 1000 metriin 50 kbps: ssä.
CAN-viestin muoto:
CAN-tietoliikenteessä data lähetetään verkossa tietyn sanoman muodossa. Tämä sanomamuoto sisältää monia segmenttejä, mutta kaksi pääsegmenttiä ovat tunniste ja tiedot, jotka auttavat lähettämään viestejä ja vastaamaan niihin CAN-väylässä.
Tunniste tai CAN ID: Tunniste tunnetaan myös nimellä CAN ID tai tunnetaan myös nimellä PGN (parametriryhmän numero). Sitä käytetään tunnistamaan CAN-verkossa olevat CAN-laitteet. Tunnisteen pituus on joko 11 tai 29 bittiä käytetyn CAN-protokollan tyypin perusteella.
Vakio CAN: 0-2047 (11-bittinen)
Laajennettu CAN: 0-2 29 -1 (29-bittinen)
Tiedot: Tämä on todellinen anturi / ohjaustieto, joka on lähetettävä laitteesta toiseen. Kokotiedot voivat olla välillä 0–8 tavua.
Datan pituuskoodi (DLC): 0 - 8 käytettävissä olevien datatavujen lukumäärälle.
CAN: ssa käytetyt johdot:
CAN-protokolla koostuu kahdesta johtimesta, nimittäin CAN_H ja CAN_L tietojen lähettämiseksi ja vastaanottamiseksi. Molemmat johdot toimivat differentiaalilinjana, eli CAN-signaalia (0 tai 1) edustaa potentiaaliero CAN_L: n ja CAN_H: n välillä. Jos ero on positiivinen ja suurempi kuin tietty minimijännite, se on 1 ja jos ero on negatiivinen, se on 0.
Normaalisti CAN-viestintään käytetään kierrettyä parikaapelia. CAN-verkon kahdessa päässä käytetään yleensä yhtä 120 ohmin vastusta, kuten kuvassa on esitetty, koska johto on tasapainotettava ja sidottava samaan potentiaaliin.
CAN: n vertailu SPI: n ja I2C: n välillä
Koska olemme jo oppineet käyttämään SPI: tä Arduinon kanssa ja IIC: n Arduinon kanssa, vertailkaamme SPI: n ja I2C: n ominaisuuksia CAN: n kanssa
Parametri | SPI | I2C | VOI |
Nopeus | 3Mbps - 10Mbps | Vakio: 100 kt / s | 10KBps - 1MBps riippuu myös käytetyn langan pituudesta |
Nopea: 400 kbps | |||
Nopeus: 3.4Mbps | |||
Tyyppi | Synkroninen | Synkroninen | Asynkroninen |
Johtojen lukumäärä | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 johtoa (SDA, SCL) | 2 johtoa (CAN_H, CAN_L) |
Kaksipuolinen | Täysi kaksipuolinen | Puoli duplex | Puoli duplex |
CAN-protokollasovellukset
- CAN-protokollan kestävyyden ja luotettavuuden vuoksi niitä käytetään esimerkiksi autoteollisuudessa, teollisuuskoneissa, maataloudessa, lääketieteellisissä laitteissa jne.
- Koska johdotuksen monimutkaisuus CAN: ssa vähenee, niitä käytetään pääasiassa autoteollisuudessa, kuten autoissa.
- Alhaiset toteutuskustannukset ja myös laitteistokomponenttien hinta ovat halvemmat.
- Helppo lisätä ja poistaa CAN-väylälaitteita.
Kuinka käyttää CAN-protokollaa Arduinossa
Koska Arduino ei sisällä sisäänrakennettua CAN-porttia, käytetään MCP2515-nimistä CAN-moduulia. Tämä CAN-moduuli on liitetty Arduinoon SPI-tiedonsiirron avulla. Katsotaanpa lisää MCP2515: stä yksityiskohtaisesti ja siitä, miten se on liitetty Arduinoon.
MCP2515 CAN -moduuli:
MCP2515-moduulissa on CAN-ohjain MCP2515, joka on nopea CAN-lähetin-vastaanotin. Yhteys MCP2515: n ja MCU: n välillä tapahtuu SPI: n kautta. Joten, se on helppo liittää minkä tahansa mikrokontrollerin kanssa, jolla on SPI-liitäntä.
Aloittelijoille, jotka haluavat oppia CAN-väylän, tämä moduuli toimii hyvänä alkuun. Tämä CAN SPI -levy on ihanteellinen teollisuusautomaatioon, kodiautomaatioon ja muihin sulautettuihin autoihin.
MCP2515: n ominaisuudet ja määritykset:
- Käyttää nopeaa CAN-lähetin-vastaanotinta TJA1050
- Ulottuvuus: 40 × 28mm
- SPI-ohjaus laajentaa Multi CAN -väyläliitäntää
- 8 MHz: n kideoskillaattori
- 120Ω: n liittimen vastus
- Sisältää itsenäisen avaimen, LED-merkkivalon, virran merkkivalon
- Tukee 1 Mb / s CAN-toimintaa
- Heikon virran valmiustila
- Jopa 112 solmua voidaan liittää
MCP2515 CAN -moduulin pinout:
PIN-nimi |
KÄYTTÄÄ |
VCC |
5 V: n virtaliitin |
GND |
Maadoitettu tappi |
CS |
SPI SLAVE -valintanapa (aktiivinen matala) |
NIIN |
SPI-isäntälaitteen orjaulostulojohto |
SI |
SPI-master-lähtö-orja-tulojohto |
SCLK |
SPI-kellotappi |
INT |
MCP2515 keskeytystappi |
Katsotaanpa tässä opetusohjelmassa, kuinka kosteus- ja lämpötilatunnistintietoja (DHT11) lähetetään Arduino nanosta Arduino Unoon CAN- väylämoduulin MCP2515 kautta.
Tarvittavat komponentit
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-näyttö
- MCP2515 CAN -moduuli - 2
- 10k potentiometri
- Leipälauta
- Johtojen liittäminen
Piirikaavio
Liitäntä CAN-lähettimen puolella:
Komponentti - tappi |
Arduino Nano |
MPC2515 - VCC |
+ 5 V |
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 |
+ 5 V |
DHT11 - GND |
GND |
DHT11 - OUT |
A0 |
Piiriliitännät CAN-vastaanottimen puolella:
Komponentti - tappi |
Arduino UNO |
MPC2515 - VCC |
+ 5 V |
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 |
+ 5 V |
LCD - V0 |
10K-potentiometrin keskikoodiin |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5 V |
LCD - K. |
GND |
Kahden MCP2515 CAN -moduulin välinen yhteys
H - VOI korkea
L - VOI matala
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Kun kaikki liitännät oli tehty, laitteistoni näytti tältä alla
Arduinon ohjelmointi CAN-viestintää varten
Ensin meidän on asennettava kirjasto CAN: lle Arduino IDE: ssä. MCP2515 CAN -moduulin liittäminen Arduinoon on helpompaa seuraavaa kirjastoa käyttämällä.
- Lataa Arduino CAN MCP2515 -kirjaston ZIP-tiedosto.
- Arduino IDE: Sketch -> Sisällytä kirjasto -> Lisää.ZIP-kirjasto
Tässä opetusohjelmassa koodaus on jaettu kahteen osaan, yksi CAN-lähettimen koodina (Arduino Nano) ja toinen CAN-vastaanottimen koodina (Arduino UNO), jotka molemmat löytyvät tämän sivun alalaidasta. Saman selitys on seuraava.
Ennen kuin kirjoitat ohjelmaa tietojen lähettämistä ja vastaanottamista varten, varmista, että olet asentanut kirjaston noudattamalla yllä olevia ohjeita ja CAN-moduuli MCP2515 alustetaan ohjelmassa seuraavasti.
Alusta MCP2515 CAN -moduuli:
Luo yhteys MCP2515: een seuraavasti:
1. Aseta PIN-numero, johon SPI CS on kytketty (oletusarvoisesti 10)
MCP2515 mcp2515 (10);
2. Aseta siirtonopeus ja oskillaattorin taajuus
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Saatavilla olevat Baud-hinnat:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KB
Saatavilla olevat kellonopeudet:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Aseta tilat.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN-lähettimen sivukoodin selitys (Arduino Nano)
Lähetinosassa Arduino Nano on liitetty MCP2515 CAN -moduuliin SPI-nastojen kautta ja DHT11 lähettää lämpötila- ja kosteustiedot CAN-väylään.
Ensin sisältyvät vaaditut kirjastot, SPI-kirjasto SPI-tietoliikenteen käyttöön, MCP2515-kirjasto CAN-tiedonsiirtoon ja DHT-kirjasto DHT-sensorin käyttämiseen Arduinon kanssa . Olemme aiemmin liittäneet DHT11: n Arduinoon.
#sisältää
Nyt Arduino Nano A0: een liitetyn DHT11: n (OUT-nasta) pin-nimi on määritetty
#define DHTPIN A0
Ja DHTTYPE määritellään myös nimellä DHT11.
#define DHTTYPE DHT11
CanMsg struct datatyypin tallentamiseksi CAN viestin muoto.
struct kan_kehys canMsg;
Aseta PIN-numero, johon SPI CS on kytketty (oletusarvoisesti 10)
MCP2515 mcp2515 (10);
Ja myös luokan DHT objekti dht alustetaan DHT-tapilla, jossa on Arduino Nano ja DHT-tyyppi, kuten DHT11.
DHT dht (DHTPIN, DHTTYPE);
Seuraava tyhjässä asetuksessa ():
Aloita SPI-viestintä seuraavalla lausekkeella
SPI alkaa ();
Käytä sitten alla olevaa lausetta aloittaaksesi lämpötila- ja kosteusarvojen vastaanottamisen DHT11-anturista.
dht. alku ();
Seuraavaksi MCP2515 nollataan seuraavan komennon avulla
mcp2515.reset ();
Nyt MCP2515 on asettanut kelloksi nopeuden 500KBPS ja 8MHz
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Ja MCP2525 on asetettu normaalitilaan
mcp2515.setNormalMode ();
Tyhjässä silmukassa ():
Seuraava lauseke saa kosteuden ja lämpötilan arvon ja tallentaa kokonaislukumuuttujiksi h ja t.
int h = dht. lukea kosteus (); int t = dht. luettu lämpötila ();
Seuraava CAN tunnus annetaan 0x036 (Kuten kohti valinta) ja DLC kuin 8 ja annamme h ja t dataa datan ja tiedon ja levätä kaikki tiedot 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Päivitä kosteusarvo kansiMsg.data = t; // Päivitä lämpötila-arvo kanSs.data = 0x00; // Levätä kaikki arvoon 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Loppujen lopuksi viestin lähettämiseen CAN-väylälle käytämme seuraavaa lausetta.
mcp2515.sendMessage (& canMsg);
Joten nyt lämpötila- ja kosteustiedot lähetetään viestinä CAN-väylään.
CAN-vastaanottimen sivukoodin selitys (Arduino UNO)
Vastaanotinosassa Arduino UNO on liitetty MCP2515- ja 16x2-LCD-näyttöihin. Täällä Arduino UNO vastaanottaa lämpötilan ja kosteuden CAN-väylältä ja näyttää vastaanotetut tiedot LCD-näytöllä.
Ensin sisältyvät vaaditut kirjastot, SPI-kirjasto SPI-tiedonsiirtoon, MCP2515-kirjasto CAN-tiedonsiirtoon ja LiquidCrsytal-kirjasto 16x2 LCD: n käyttämiseen Arduinon kanssa .
#sisältää
Seuraavaksi määritetään LCD-nastat, joita käytetään yhteyden muodostamiseen Arduino UNO: han.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Struct tietotyyppi ilmoitetaan säilytykseen CAN viestin muoto.
struct kan_kehys canMsg;
Aseta PIN-numero, johon SPI CS on kytketty (oletusarvoisesti 10)
MCP2515 mcp2515 (10);
Tyhjässä asennuksessa ():
Ensin nestekidenäyttö asetetaan 16x2-tilaan ja näyttöön tulee tervetuloviesti.
lcd-alku (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("VOI ARDUINO"); viive (3000); lcd.clear ();
Aloita SPI-viestintä seuraavalla lausekkeella.
SPI alkaa ();
Seuraavaksi MCP2515 nollataan seuraavan komennon avulla.
mcp2515.reset ();
Nyt MCP2515 on asettanut kelloksi nopeuden 500KBPS ja 8MHz.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Ja MCP2525 on asetettu normaalitilaan.
mcp2515.setNormalMode ();
Seuraava tyhjä silmukka ():
Seuraavaa lausetta käytetään vastaanottamaan viesti CAN-väylältä. Jos viesti vastaanotetaan, se joutuu if- tilaan.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Että jos ehto data on vastaanotettu ja tallennettu c anMsg , tiedot, jotka on kosteus arvo ja tiedot, jotka on lämpötila-arvo. Molemmat arvot tallennetaan kokonaislukuun x ja y.
int x = canMsg.data; int y = canMsg.data;
Saatuaan arvot lämpötila- ja kosteusarvot näytetään 16x2 LCD-näytössä seuraavan lausunnon avulla.
lcd.setCursor (0,0); lcd.print ("Kosteus:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Lämpötila"); lcd.print (y); viive (1000); lcd.clear ();
CAN-viestinnän työskentely Arduinossa
Kun laitteisto on valmis, lataa CAN-lähettimen ja -vastaanottimen ohjelma (täydelliset ohjelmat ovat jäljempänä) vastaaviin Arduino-levyihin. Kun virta huomaa lämpötila-arvo luetaan DHT11 lähetetään toiseen Arduino kautta CAN viestintää ja näkyvät LCD on 2 toisen Arduino kuten näet alla olevassa kuvassa. Olen myös käyttänyt AC-kaukosäädintä tarkistaaksesi, onko nestekidenäytössä näkyvä lämpötila lähellä todellista huoneen lämpötilaa.
Koko työ löytyy alla olevasta videosta. Jos sinulla on kysyttävää, jätä ne kommenttiosioon tai käytä foorumeitamme muihin teknisiin kysymyksiin.