- Introduktion till CAN
- Jämförelse av CAN över SPI & I2C
- CAN-protokollapplikationer
- Hur man använder CAN-protokoll i Arduino
- Komponenter krävs
- Kretsschema
- Anslutning mellan två MCP2515 CAN-moduler
- Programmering av Arduino för CAN-kommunikation
- CAN-sändarens sidokodförklaring (Arduino Nano)
- CAN-mottagarsida Kodförklaring (Arduino UNO)
- Arbetar med CAN-kommunikation i Arduino
Idag består varje genomsnittlig bil av cirka 60 till 100 sensorenheter i den för att känna av och utbyta information. Med biltillverkare som ständigt gör sin bil smartare med funktioner som autonom körning, krockkuddesystem, däcktrycksövervakning, farthållarsystem etc. detta antal förväntas bara bli högt. Till skillnad från andra sensorer bearbetar dessa sensorer kritisk information och därför ska data från dessa sensorer kommuniceras med hjälp av standardfordons kommunikationsprotokoll. Till exempel är farthållarsystemdata som hastighet, gasläge etc. viktiga värden som skickas till Electronic Control Unit (ECU)att bestämma bilens accelerationsnivå, felkommunikation eller förlust av data här kan leda till kritiska fel. Till skillnad från standardkommunikationsprotokoll som UART, SPI eller I2C använder designers därför mycket tillförlitliga bilkommunikationsprotokoll som LIN, CAN, FlexRay etc.
Av alla tillgängliga protokoll är CAN mer övervägande använt och populärt. Vi har redan diskuterat vad som är CAN och hur CAN fungerar. Så i den här artikeln kommer vi att granska grunderna igen och slutligen kommer vi också att utbyta data mellan två Arduinos med CAN-kommunikation. Låter intressant rätt! Så, låt oss komma igång.
Introduktion till CAN
CAN aka Controller Area Network är en seriell kommunikationsbuss designad för industri- och fordonsapplikationer. Det är ett meddelandebaserat protokoll som används för kommunikation mellan flera enheter. När flera CAN-enheter är anslutna som visas nedan, bildar anslutningen ett nätverk som fungerar som vårt centrala nervsystem vilket gör att varje enhet kan prata med någon annan enhet i noden.
Ett CAN-nätverk kommer att bestå av endast två ledningar CAN High och CAN Low för dubbelriktad dataöverföring som visas ovan. Normalt varierar kommunikationshastigheten för CAN från 50 Kbps till 1 Mbps och avståndet kan sträcka sig från 40 meter vid 1 Mbps till 1000 meter vid 50 kpbs.
Format för CAN-meddelande:
I CAN-kommunikationen överförs data i nätverket som ett särskilt meddelandeformat. Detta meddelandeformat innehåller många segment men två huvudsegment är identifieraren och data som hjälper till att skicka och svara på meddelanden i CAN-buss.
Identifierare eller CAN-ID: Identifieraren är också känd som ett CAN-ID eller även känd som PGN (Parameter Group Number). Den används för att identifiera de CAN-enheter som finns i ett CAN-nätverk. Längden på identifieraren är antingen 11 eller 29 bitar baserat på vilken typ av CAN-protokoll som används.
Standard CAN: 0-2047 (11-bit)
Utökad CAN: 0-2 29 -1 (29-bit)
Data: Detta är den faktiska sensor- / styrdata som måste skickas från en enhet till en annan. Storleksdata kan vara mellan 0 och 8 byte.
Datalängdskod (DLC): 0 till 8 för antalet data-byte närvarande.
Ledningar som används i CAN:
CAN-protokollet består av två ledningar, nämligen CAN_H och CAN_L för att skicka och ta emot information. Båda trådarna fungerar som en differentiell linje, vilket innebär att CAN-signalen (0 eller 1) representeras av potentialskillnaden mellan CAN_L och CAN_H. Om skillnaden är positiv och större än en viss minimispänning är den 1 och om skillnaden är negativ är den 0.
Normalt används en tvinnad kabel för CAN-kommunikation. Ett enda motstånd på 120 ohm används vanligtvis i de två ändarna av CAN-nätverket som visas i bilden, detta beror på att linjen måste balanseras och kopplas till samma potential.
Jämförelse av CAN över SPI & I2C
Eftersom vi redan har lärt oss hur man använder SPI med Arduino och IIC med Arduino, låt oss jämföra funktionerna i SPI och I2C med CAN
Parameter | SPI | I2C | BURK |
Fart | 3Mbps till 10Mbps | Standard: 100 Kbps | 10KBps till 1MBps Beror också på vilken kabel som används |
Snabb: 400 Kbps | |||
Hög hastighet: 3,4 Mbps | |||
Typ | Synkron | Synkron | Asynkron |
Antal ledningar | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 ledningar (SDA, SCL) | 2 ledningar (CAN_H, CAN_L) |
Duplex | Full duplex | Halv duplex | Halv duplex |
CAN-protokollapplikationer
- På grund av robustheten och tillförlitligheten hos CAN-protokollet används de i industrier som fordonsindustriella maskiner, jordbruk, medicinsk utrustning etc.
- Eftersom kabeldragningskomplexiteten minskar i CAN används de huvudsakligen i fordonsapplikationer som bil.
- Låga kostnader att implementera och även hårdvarukomponenter är också lägre.
- Lätt att lägga till och ta bort CAN-bussenheter.
Hur man använder CAN-protokoll i Arduino
Eftersom Arduino inte innehåller någon inbyggd CAN-port används en CAN-modul som heter MCP2515. Denna CAN-modul är gränssnitt med Arduino med SPI-kommunikation. Låt oss se mer om MCP2515 i detalj och hur den gränssnitt med Arduino.
MCP2515 CAN-modul:
MCP2515-modulen har en CAN-styrenhet MCP2515 som är höghastighets CAN-sändtagare. Förbindelsen mellan MCP2515 och MCU sker via SPI. Så det är enkelt att ansluta till alla mikrokontroller som har SPI-gränssnitt.
För nybörjare som vill lära sig CAN-buss kommer den här modulen att fungera som en bra start. Detta CAN SPI-kort är perfekt för industriell automatisering, hemautomation och andra fordonsinbäddade projekt.
Funktioner och specifikationer för MCP2515:
- Använder höghastighets CAN-sändtagare TJA1050
- Mått: 40 × 28 mm
- SPI-kontroll för utökat Multi CAN-bussgränssnitt
- 8MHZ kristalloscillator
- 120Ω terminalmotstånd
- Har oberoende nyckel, LED-indikator, Strömindikator
- Stöder 1 Mb / s CAN-drift
- Låg ström standby-funktion
- Upp till 112 noder kan anslutas
Pinout av MCP2515 CAN-modul:
Pin-namn |
ANVÄNDA SIG AV |
VCC |
5V strömingångsstift |
GND |
Jordstift |
CS |
SPI SLAVE välj stift (Aktiv låg) |
SÅ |
SPI-huvudingång slavutgångsledning |
SI |
SPI-huvudutgång slavingång |
SCLK |
SPI Clock pin |
INT |
MCP2515 avbrottsstift |
I den här handledningen ska vi se hur vi skickar sensordata för fuktighet och temperatur (DHT11) från Arduino Nano till Arduino Uno via CAN- bussmodul MCP2515.
Komponenter krävs
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-skärm
- MCP2515 CAN-modul - 2
- 10k potentiometer
- Bakbord
- Anslutande ledningar
Kretsschema
Anslutning på CAN-sändarsidan:
Komponent - stift |
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 - UT |
A0 |
Kretsanslutningar på CAN-mottagarsidan:
Komponent - stift |
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 |
Till 10K Potentiometer Center PIN |
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 |
Anslutning mellan två MCP2515 CAN-moduler
H - CAN Hög
L - CAN Låg
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
När alla anslutningar gjordes såg min hårdvara ut så här nedan
Programmering av Arduino för CAN-kommunikation
Först måste vi installera ett bibliotek för CAN i Arduino IDE. Gränssnittet MCP2515 CAN-modul med Arduino blir enklare genom att använda följande bibliotek.
- Ladda ner ZIP-filen från Arduino CAN MCP2515 Library.
- Från Arduino IDE: Skiss -> Inkludera bibliotek -> Lägg till.ZIP-bibliotek
I denna handledning är kodningen uppdelad i två delar, en som CAN-sändarkod (Arduino Nano) och en annan som CAN-mottagarkod (Arduino UNO) som båda finns längst ner på denna sida. Förklaringen till detsamma är som följer.
Innan du skriver program för att skicka och ta emot data, se till att du har installerat biblioteket enligt ovanstående steg och CAN-modulen MCP2515 är initialiserad i ditt program enligt följande.
Initiera MCP2515 CAN-modul:
Följ stegen för att skapa anslutning med MCP2515:
1. Ställ in PIN-numret där SPI CS är ansluten (10 som standard)
MCP2515 mcp2515 (10);
2. Ställ in baudhastighet och oscillatorfrekvens
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tillgängliga överföringshastigheter:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_250.
Tillgängliga klockhastigheter:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Ställ in lägen.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN-sändarens sidokodförklaring (Arduino Nano)
I sändaravsnittet gränssnitt Arduino Nano med MCP2515 CAN-modulen genom SPI-stift och DHT11 skickar temperatur- och luftfuktighetsdata till CAN-bussen.
Först ingår de nödvändiga biblioteken, SPI-bibliotek för användning av SPI-kommunikation, MCP2515-bibliotek för användning av CAN-kommunikation och DHT-bibliotek för användning av DHT-sensor med Arduino . Vi kopplade tidigare DHT11 med Arduino.
#omfatta
Nu definieras stiftnamnet på DHT11 (OUT-stift) som är ansluten till A0 för Arduino Nano
#define DHTPIN A0
Och även den DHTTYPE definieras som DHT11.
#define DHTTYPE DHT11
En canMsg- datatyp för lagring av CAN-meddelandeformat.
struct can_frame canMsg;
Ställ in PIN-numret där SPI CS är ansluten (10 som standard)
MCP2515 mcp2515 (10);
Och också, objekt dht för klass DHT med DHT-stift med Arduino Nano och DHT-typ när DHT11 initialiseras.
DHT dht (DHTPIN, DHTTYPE);
Nästa i ogiltig installation ():
Börja SPI-kommunikationen med följande uttalande
SPI.begin ();
Och använd sedan nedanstående uttalande för att börja få temperatur- och luftfuktighetsvärden från DHT11-sensorn.
dht.begin ();
Därefter återställs MCP2515 med följande kommando
mcp2515.reset ();
Nu är MCP2515 inställd på 500KBPS och 8MHZ som klocka
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Och MCP2525 är inställd på normalt läge
mcp2515.setNormalMode ();
I tomrummet ():
Följande påstående hämtar fuktighets- och temperaturvärdet och lagras i ett heltal variabler h och t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Därefter ges CAN-ID som 0x036 (enligt val) och DLC som 8 och vi ger h- och t-data till data och data och vilar alla data med 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Uppdatera fuktighetsvärde i canMsg.data = t; // Uppdatera temperaturvärdet i canMsg.data = 0x00; // Vila alla med 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
När allt kommer omkring, för att skicka meddelandet till CAN BUS använder vi följande uttalande.
mcp2515.sendMessage (& canMsg);
Så nu skickas data om temperatur och luftfuktighet som ett meddelande till CAN-bussen.
CAN-mottagarsida Kodförklaring (Arduino UNO)
I mottagaravsnittet gränssnitt Arduino UNO med MCP2515 och 16x2 LCD-skärm. Här tar Arduino UNO emot temperatur och luftfuktighet från CAN-bussen och visar data som mottagits i LCD.
Först ingår de nödvändiga biblioteken, SPI-bibliotek för användning av SPI-kommunikation, MCP2515-bibliotek för användning av CAN-kommunikation och LiquidCrsytal Library för användning av 16x2 LCD med Arduino .
#omfatta
Därefter definieras LCD-stift som används för att ansluta till Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
En strukturdatatyp deklareras för lagring av CAN-meddelandeformat.
struct can_frame canMsg;
Ställ in PIN-numret där SPI CS är ansluten (10 som standard)
MCP2515 mcp2515 (10);
I ogiltig installation ():
Först är LCD-skärmen inställd på 16x2-läge och ett välkomstmeddelande visas.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); fördröjning (3000); lcd.clear ();
Börja SPI-kommunikationen med följande uttalande.
SPI.begin ();
Därefter återställs MCP2515 med följande kommando.
mcp2515.reset ();
Nu är MCP2515 inställd på 500KBPS och 8MHZ som klocka.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Och MCP2525 är inställd på normalt läge.
mcp2515.setNormalMode ();
Nästa i ogiltig slinga ():
Följande uttalande används för att ta emot meddelandet från CAN-bussen. Om meddelandet tas emot kommer det in i if- tillståndet.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
I if- tillståndet mottas och lagras data i c anMsg , data som har fuktvärde och data som har temperaturvärde. Båda värdena lagras i ett heltal x och y.
int x = canMsg.data; int y = canMsg.data;
Efter att ha mottagit värdena visas temperatur- och luftfuktighetsvärdena i 16x2 LCD-display med följande uttalande.
lcd.setCursor (0,0); lcd.print ("Luftfuktighet:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); fördröjning (1000); lcd.clear ();
Arbetar med CAN-kommunikation i Arduino
När hårdvaran är klar laddar du upp programmet för CAN-sändare och CAN-mottagare (kompletta program anges nedan) i respektive Arduino-kort. När du är strömförsörjd bör du märka att temperaturvärdet som läses av DHT11 kommer att skickas till en annan Arduino via CAN-kommunikation och visas på LCD-skärmen på andra Arduino, som du kan se i bilden nedan. Jag har också använt min AC-fjärrkontroll för att kontrollera om temperaturen som visas på LCD-skärmen ligger nära den faktiska rumstemperaturen.
Hela arbetet hittar du i videon som länkas nedan. Om du har några frågor lämnar du dem i kommentarsektionen eller använder våra forum för andra tekniska frågor.