- Introduktion til CAN
- Sammenligning af CAN over SPI & I2C
- CAN-protokolapplikationer
- Sådan bruges CAN-protokol i Arduino
- Komponenter, der kræves
- Kredsløbsdiagram
- Forbindelse mellem to MCP2515 CAN-moduler
- Programmering af Arduino til CAN-kommunikation
- CAN Transmitter Side Code Forklaring (Arduino Nano)
- CAN-modtager Side Kode Forklaring (Arduino UNO)
- Arbejde med CAN-kommunikation i Arduino
I dag består enhver gennemsnitlig bil af omkring 60 til 100 sensorenheder i den til registrering og udveksling af information. Da bilproducenter konstant gør deres bil mere intelligent med funktioner som autonom kørsel, airbag-system, dæktryksovervågning, fartpilot osv., Forventes dette tal kun at blive højt. I modsætning til andre sensorer behandler disse sensorer kritisk information, og derfor skal dataene fra disse sensorer kommunikeres ved hjælp af standardprotokoller til bilkommunikation. For eksempel er fartøjskontrolsystemdata som hastighed, gasspjældstilling osv. Vitale værdier, der sendes til den elektroniske styreenhed (ECU)at beslutte bilens accelerationsniveau, en fejlkommunikation eller tab af data her kan føre til kritiske fejl. Derfor bruger designere i modsætning til standardkommunikationsprotokoller som UART, SPI eller I2C meget pålidelige bilkommunikationsprotokoller som LIN, CAN, FlexRay osv.
Ud af alle de tilgængelige protokoller er CAN mere overvejende brugt og populær. Vi har allerede diskuteret, hvad der er CAN, og hvordan CAN fungerer. Så i denne artikel vil vi se på det grundlæggende igen, og endelig vil vi også udveksle data mellem to Arduinos ved hjælp af CAN-kommunikation. Lyder interessant lige! Så lad os komme i gang.
Introduktion til CAN
CAN aka Controller Area Network er en seriel kommunikationsbus designet til industrielle og automotive applikationer. Det er en beskedbaseret protokol, der bruges til kommunikation mellem flere enheder. Når flere CAN-enheder er forbundet sammen som vist nedenfor, danner forbindelsen et netværk, der fungerer som vores centrale nervesystem, der gør det muligt for enhver enhed at tale med enhver anden enhed i noden.
Et CAN-netværk vil kun bestå af to ledninger CAN High og CAN Low til tovejs datatransmission som vist ovenfor. Kommunikationshastigheden for CAN varierer typisk fra 50 Kbps til 1 Mbps, og afstanden kan variere fra 40 meter ved 1 Mbps til 1000 meter ved 50 kpbs.
Format for CAN-meddelelse:
I CAN-kommunikationen overføres dataene i netværket som et bestemt meddelelsesformat. Dette meddelelsesformat indeholder mange segmenter, men to hovedsegmenter er identifikatoren og dataene, der hjælper med at sende og svare på meddelelser i CAN-bus.
Identifikator eller CAN ID: Identifikatoren er også kendt som et CAN ID eller også kendt som PGN (Parameter Group Number). Det bruges til at identificere de CAN-enheder, der findes i et CAN-netværk. Længden af identifikatoren er enten 11 eller 29 bits baseret på den anvendte CAN-protokoltype.
Standard CAN: 0-2047 (11-bit)
Udvidet CAN: 0-2 29 -1 (29-bit)
Data: Dette er de faktiske sensor- / kontroldata, der skal sendes fra en enhed til en anden. Størrelsesdataene kan være alt fra 0 til 8 byte i længden.
Datalængdekode (DLC): 0 til 8 for antallet af tilstedeværende databytes.
Ledninger brugt i CAN:
CAN-protokol består af to ledninger, nemlig CAN_H og CAN_L til at sende og modtage information. Begge ledninger fungerer som en differentiel linje, hvilket betyder at CAN-signalet (0 eller 1) er repræsenteret af potentialforskellen mellem CAN_L og CAN_H. Hvis forskellen er positiv og større end en bestemt minimumsspænding, er den 1, og hvis forskellen er negativ, er den 0.
Normalt bruges et twisted pair-kabel til CAN-kommunikation. En enkelt 120 ohm modstand bruges generelt i de to ender af CAN-netværket som vist på billedet, dette er fordi linjen skal være afbalanceret og bundet til samme potentiale.
Sammenligning af CAN over SPI & I2C
Da vi allerede har lært at bruge SPI med Arduino og IIC med Arduino, så lad os sammenligne funktionerne i SPI og I2C med CAN
Parameter | SPI | I2C | KAN |
Hastighed | 3Mbps til 10Mbps | Standard: 100 Kbps | 10KBps til 1MBps afhænger også af længden på den anvendte ledning |
Hurtig: 400 Kbps | |||
Højhastighed: 3,4 Mbps | |||
Type | Synkron | Synkron | Asynkron |
Antal ledninger | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 ledninger (SDA, SCL) | 2 ledninger (CAN_H, CAN_L) |
Duplex | Fuld duplex | Halv dupleks | Halv dupleks |
CAN-protokolapplikationer
- På grund af CAN-protokollens robusthed og pålidelighed bruges de i industrier som bilindustri, industrielle maskiner, landbrug, medicinsk udstyr osv.
- Da ledningskompleksiteten er reduceret i CAN, bruges de hovedsageligt i bilindustrien som bil.
- Lave omkostninger til implementering og også hardware-komponentprisen er også mindre.
- Let at tilføje og fjerne CAN-busenheder.
Sådan bruges CAN-protokol i Arduino
Da Arduino ikke indeholder nogen indbygget CAN-port, bruges et CAN-modul kaldet MCP2515. Dette CAN-modul er grænseflade med Arduino ved hjælp af SPI-kommunikation. Lad os se mere om MCP2515 i detaljer, og hvordan det er grænseflade med Arduino.
MCP2515 CAN-modul:
MCP2515-modulet har en CAN-controller MCP2515, som er en højhastigheds CAN-modtager. Forbindelsen mellem MCP2515 og MCU foregår via SPI. Så det er let at grænseflade til enhver mikrocontroller, der har SPI-grænseflade.
For begyndere, der ønsker at lære CAN Bus, fungerer dette modul som en god start. Dette CAN SPI-kort er ideelt til industriel automatisering, hjemmeautomatisering og andre indlejrede bilprojekter.
Funktioner og specifikation af MCP2515:
- Bruger højhastigheds CAN-transceiver TJA1050
- Dimension: 40 × 28 mm
- SPI-kontrol til udvidelse af Multi CAN-businterface
- 8MHZ krystaloscillator
- 120Ω terminalmodstand
- Har uafhængig nøgle, LED-indikator, Strømindikator
- Understøtter 1 Mb / s CAN-drift
- Lav strøm standby-drift
- Der kan tilsluttes op til 112 noder
Pinout af MCP2515 CAN-modul:
Pin-navn |
BRUG |
VCC |
5V strømindgangsstift |
GND |
Jordstift |
CS |
SPI SLAVE vælg pin (Aktiv lav) |
SÅ |
SPI-masterinput slaveudgangsledning |
SI |
SPI master output slave input lead |
SCLK |
SPI Clock pin |
INT |
MCP2515 afbrydelsesstift |
Lad os i denne vejledning se, hvordan du sender sensordata for fugtighed og temperatur (DHT11) fra Arduino Nano til Arduino Uno via CAN- busmodul MCP2515.
Komponenter, der kræves
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-skærm
- MCP2515 CAN-modul - 2
- 10k Potentiometer
- Brødbræt
- Tilslutning af ledninger
Kredsløbsdiagram
Tilslutning på CAN-sendersiden:
Komponent - ben |
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 - UD |
A0 |
Kredsløbstilslutninger på CAN-modtagerens side:
Komponent - ben |
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 |
Til 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 |
Forbindelse mellem to MCP2515 CAN-moduler
H - CAN High
L - CAN Lav
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Når alle forbindelser var foretaget, så min hardware sådan ud nedenfor
Programmering af Arduino til CAN-kommunikation
Først skal vi installere et bibliotek til CAN i Arduino IDE. Interfacing MCP2515 CAN-modul med Arduino bliver lettere ved at bruge følgende bibliotek.
- Download ZIP-filen af Arduino CAN MCP2515 Library.
- Fra Arduino IDE: Skitse -> Inkluder bibliotek -> Tilføj.ZIP-bibliotek
I denne vejledning er kodning opdelt i to dele, en som CAN-senderkode (Arduino Nano) og en anden som CAN-modtagerkode (Arduino UNO), som begge findes nederst på denne side. Forklaringen på det samme er som følger.
Inden du skriver et program til afsendelse og modtagelse af data, skal du sikre dig, at du har installeret biblioteket ved at følge ovenstående trin, og CAN-modulet MCP2515 er initialiseret i dit program som følger.
Initialiser MCP2515 CAN-modul:
Følg trinene for at oprette forbindelse til MCP2515:
1. Indstil pinkoden, hvor SPI CS er tilsluttet (10 som standard)
MCP2515 mcp2515 (10);
2. Indstil baudrate og oscillatorfrekvens
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tilgængelige baudpriser:
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.
Tilgængelige urhastigheder:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Indstil tilstande.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN Transmitter Side Code Forklaring (Arduino Nano)
I sendersektionen har Arduino Nano grænseflade til MCP2515 CAN-modulet gennem SPI-ben, og DHT11 sender temperatur- og fugtighedsdata til CAN-bus.
Først inkluderes de krævede biblioteker, SPI-bibliotek til brug af SPI-kommunikation, MCP2515-bibliotek til brug af CAN-kommunikation og DHT-bibliotek til brug af DHT-sensor med Arduino . Vi har tidligere interfacet DHT11 med Arduino.
#omfatte
Nu er pin-navnet på DHT11 (OUT-pin), der er forbundet med A0 i Arduino Nano, defineret
#definer DHTPIN A0
Og også er DHTTYPE defineret som DHT11.
#definer DHTTYPE DHT11
En canMsg- strukturdatatype til lagring af CAN-meddelelsesformat.
struct can_frame canMsg;
Indstil pinkoden, hvor SPI CS er tilsluttet (10 som standard)
MCP2515 mcp2515 (10);
Og også objekt dht for klasse DHT med DHT-pin med Arduino Nano og DHT-type, da DHT11 initialiseres.
DHT dht (DHTPIN, DHTTYPE);
Næste i ugyldig opsætning ():
Start SPI-kommunikationen ved hjælp af følgende erklæring
SPI.begin ();
Og brug derefter udsagnet nedenfor for at begynde at modtage temperatur- og fugtighedsværdier fra DHT11-sensoren.
dht.begin ();
Dernæst nulstilles MCP2515 ved hjælp af følgende kommando
mcp2515.reset ();
Nu er MCP2515 indstillet på 500KBPS og 8MHZ som ur
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Og MCP2525 er indstillet til normal tilstand
mcp2515.setNormalMode ();
I hulrummet ():
Følgende udsagn henter fugtigheds- og temperaturværdien og gemmes i en heltalsvariabel h og t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Dernæst gives CAN ID som 0x036 (som pr. Valg) og DLC som 8, og vi giver h og t data til data og data og hviler alle data med 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Opdater fugtighedsværdi i canMsg.data = t; // Opdater temperaturværdi i canMsg.data = 0x00; // Hvil alle med 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
For at sende meddelelsen til CAN BUS bruger vi trods alt følgende udsagn.
mcp2515.sendMessage (& canMsg);
Så nu sendes data om temperatur og fugtighed som en besked til CAN-bus.
CAN-modtager Side Kode Forklaring (Arduino UNO)
I modtagerafsnittet interagerede Arduino UNO med MCP2515 og 16x2 LCD-displayet. Her modtager Arduino UNO temperaturen og fugtigheden fra CAN-bussen og viser de data, der modtages i LCD.
Først inkluderes de krævede biblioteker, SPI-bibliotek til brug af SPI-kommunikation, MCP2515-bibliotek til brug af CAN-kommunikation og LiquidCrsytal Library til brug af 16x2 LCD med Arduino .
#omfatte
Dernæst defineres LCD-stifter, der bruges i forbindelse med 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 strukturdatatype erklæres til lagring af CAN-beskedformat.
struct can_frame canMsg;
Indstil pinkoden, hvor SPI CS er tilsluttet (10 som standard)
MCP2515 mcp2515 (10);
I ugyldig opsætning ():
Først er LCD'et indstillet til 16x2-tilstand, og en velkomstmeddelelse vises.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); forsinkelse (3000); lcd.clear ();
Start SPI-kommunikationen ved hjælp af følgende erklæring.
SPI.begin ();
Dernæst nulstilles MCP2515 ved hjælp af følgende kommando.
mcp2515.reset ();
Nu er MCP2515 indstillet på 500KBPS og 8MHZ som ur.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Og MCP2525 er indstillet til normal tilstand.
mcp2515.setNormalMode ();
Næste i ugyldig sløjfe ():
Følgende erklæring bruges til at modtage beskeden fra CAN-bussen. Hvis der modtages besked, kommer den ind i if- tilstanden.
hvis (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
I hvis tilstand data modtages og lagres i c anMsg , de data, der har fugtighedsværdi og data, der har temperaturværdi. Begge værdier er gemt i et heltal x og y.
int x = canMsg.data; int y = canMsg.data;
Efter modtagelse af værdierne vises temperatur- og fugtighedsværdierne i 16x2 LCD-display ved hjælp af følgende erklæring.
lcd.setCursor (0,0); lcd.print ("Fugtighed:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); forsinkelse (1000); lcd.clear ();
Arbejde med CAN-kommunikation i Arduino
Når hardwaren er klar, skal du uploade programmet til CAN-transmitter og CAN-modtager (komplette programmer er angivet nedenfor) i de respektive Arduino-kort. Når du er tændt, skal du bemærke, at temperaturværdien, der læses af DHT11, sendes til en anden Arduino gennem CAN-kommunikation og vises på LCD'et på 2. Arduino, som du kan se i nedenstående billede. Jeg har også brugt min AC-fjernbetjening til at kontrollere, om temperaturen, der vises på LCD'et, er tæt på den aktuelle stuetemperatur.
Den komplette arbejde kan findes i videoen, der er linket nedenfor. Hvis du har spørgsmål, skal du lade dem være i kommentarsektionen eller bruge vores fora til andre tekniske spørgsmål.