- Introduksjon til CAN
- Sammenligning av CAN over SPI & I2C
- CAN-protokollapplikasjoner
- Hvordan bruke CAN-protokoll i Arduino
- Komponenter kreves
- Kretsdiagram
- Tilkobling mellom to MCP2515 CAN-moduler
- Programmering av Arduino for CAN-kommunikasjon
- CAN Transmitter Side Code Forklaring (Arduino Nano)
- CAN-mottaker Side Kode Forklaring (Arduino UNO)
- Arbeid med CAN-kommunikasjon i Arduino
I dag består en hvilken som helst gjennomsnittsbil av rundt 60 til 100 sensorenheter i den for å registrere og utveksle informasjon. Med bilprodusenter som hele tiden gjør bilen sin smartere med funksjoner som autonom kjøring, kollisjonspute-system, dekktrykkovervåking, cruisekontrollsystem etc. dette tallet forventes bare å gå høyt. I motsetning til andre sensorer, behandler disse sensorene kritisk informasjon, og dataene fra disse sensorene skal derfor kommuniseres ved hjelp av standard bilkommunikasjonsprotokoller. For eksempel er cruisekontrollsystemdata som hastighet, gassposisjon osv. Viktige verdier som sendes til Electronic Control Unit (ECU).å bestemme bilens akselerasjonsnivå, feilkommunikasjon eller tap av data her kan føre til kritiske feil. Derfor, i motsetning til standard kommunikasjonsprotokoller som UART, SPI eller I2C, bruker designere mye pålitelige bilkommunikasjonsprotokoller som LIN, CAN, FlexRay etc.
Av alle tilgjengelige protokoller er CAN mer overveiende brukt og populær. Vi har allerede diskutert hva som er CAN og hvordan CAN fungerer. Så i denne artikkelen vil vi se på det grunnleggende igjen, og til slutt vil vi også utveksle data mellom to Arduinos ved hjelp av CAN-kommunikasjon. Høres interessant ut! Så la oss komme i gang.
Introduksjon til CAN
CAN aka Controller Area Network er en seriell kommunikasjonsbuss designet for industri- og bilapplikasjoner. Det er en meldingsbasert protokoll som brukes til kommunikasjon mellom flere enheter. Når flere CAN-enheter er koblet sammen som vist nedenfor, danner forbindelsen et nettverk som fungerer som vårt sentralnervesystem, slik at alle enheter kan snakke med andre enheter i noden.
Et CAN-nettverk vil bare bestå av to ledninger CAN High og CAN Low for toveis dataoverføring som vist ovenfor. Vanligvis varierer kommunikasjonshastigheten for CAN fra 50 Kbps til 1 Mbps, og avstanden kan variere fra 40 meter ved 1 Mbps til 1000 meter ved 50 kpbs.
Format for CAN-melding:
I CAN-kommunikasjonen overføres dataene i nettverket som et bestemt meldingsformat. Dette meldingsformatet inneholder mange segmenter, men to hovedsegmenter er identifikatoren og dataene som hjelper til med å sende og svare på meldinger i CAN-buss.
Identifier eller CAN ID: Identifikatoren er også kjent som en CAN ID eller også kjent som PGN (Parameter Group Number). Den brukes til å identifisere CAN-enhetene som er tilstede i et CAN-nettverk. Lengden på identifikatoren er enten 11 eller 29 bits basert på typen CAN-protokoll som brukes.
Standard CAN: 0-2047 (11-bit)
Utvidet CAN: 0-2 29 -1 (29-bit)
Data: Dette er de faktiske sensor- / kontrolldataene som må sendes fra en enhet til en annen. Størrelsesdataene kan ha alt fra 0 til 8 byte.
Datalengdekode (DLC): 0 til 8 for antall tilstedeværende databytes.
Ledninger brukt i CAN:
CAN-protokollen består av to ledninger, nemlig CAN_H og CAN_L for å sende og motta informasjon. Begge ledningene fungerer som en differensiell linje, noe som betyr at CAN-signalet (0 eller 1) er representert av potensialforskjellen mellom CAN_L og CAN_H. Hvis forskjellen er positiv og større enn en viss minimumsspenning, er den 1, og hvis forskjellen er negativ, er den 0.
Normalt brukes en tvunnet parkabel for CAN-kommunikasjon. En enkelt motstand på 120 ohm brukes vanligvis i de to endene av CAN-nettverket som vist på bildet, dette er fordi linjen må balanseres og knyttes til samme potensial.
Sammenligning av CAN over SPI & I2C
Siden vi allerede har lært å bruke SPI med Arduino og IIC med Arduino, la oss sammenligne funksjonene i SPI og I2C med CAN
Parameter | SPI | I2C | KAN |
Hastighet | 3 Mbps til 10 Mbps | Standard: 100 Kbps | 10KBps til 1MBps, avhenger også av lengden på ledningen som brukes |
Rask: 400 Kbps | |||
Høyhastighet: 3,4 Mbps | |||
Type | Synkron | Synkron | Asynkron |
Antall ledninger | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 ledninger (SDA, SCL) | 2 ledninger (CAN_H, CAN_L) |
Tosidig | Full dupleks | Halv dupleks | Halv dupleks |
CAN-protokollapplikasjoner
- På grunn av robustheten og påliteligheten til CAN-protokollen, brukes de i bransjer som bilindustri, industrielle maskiner, jordbruk, medisinsk utstyr etc.
- Da ledningskompleksiteten er redusert i CAN, brukes de hovedsakelig i bilindustrien som bil.
- Lave kostnader å implementere og også prisen på maskinvarekomponenter er også lavere.
- Lett å legge til og fjerne CAN-bussenhetene.
Hvordan bruke CAN-protokoll i Arduino
Siden Arduino ikke inneholder noen innebygd CAN-port, brukes en CAN-modul kalt MCP2515. Denne CAN-modulen er grensesnittet med Arduino ved hjelp av SPI-kommunikasjonen. La oss se om mer om MCP2515 i detalj og hvordan det er grensesnittet med Arduino.
MCP2515 CAN-modul:
MCP2515-modulen har en CAN-kontroller MCP2515 som er høyhastighets CAN-mottaker. Forbindelsen mellom MCP2515 og MCU er gjennom SPI. Så det er enkelt å grensesnitt med enhver mikrokontroller som har SPI-grensesnitt.
For nybegynnere som ønsker å lære CAN Bus, vil denne modulen fungere som en god start. Dette CAN SPI-kortet er ideelt for industriell automatisering, hjemmeautomatisering og andre innebygde bilprosjekter.
Funksjoner og spesifikasjoner for MCP2515:
- Bruker CAN-transceiver med høy hastighet TJA1050
- Dimensjon: 40 × 28mm
- SPI-kontroll for utvidelse av Multi CAN-bussgrensesnitt
- 8MHZ krystalloscillator
- 120Ω terminal motstand
- Har uavhengig nøkkel, LED-indikator, Strømindikator
- Støtter 1 Mb / s CAN-drift
- Lav strøm standby-drift
- Opptil 112 noder kan kobles til
Pinout av MCP2515 CAN-modul:
Pin-navn |
BRUK |
VCC |
5V strøminngangsstift |
GND |
Bakkenål |
CS |
SPI SLAVE velg pin (Aktiv lav) |
SÅ |
SPI hovedinngang slave utgangsledning |
SI |
SPI master output slave input lead |
SCLK |
SPI Clock pin |
INT |
MCP2515 avbruddspinne |
I denne opplæringen, la oss se hvordan du sender fuktighets- og temperatur (DHT11) sensordata fra Arduino Nano til Arduino Uno via CAN- bussmodul MCP2515.
Komponenter kreves
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-skjerm
- MCP2515 CAN-modul - 2
- 10k potensiometer
- Brettbrett
- Koble ledninger
Kretsdiagram
Tilkobling på CAN-sendersiden:
Komponent - Pin |
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 |
Kretsforbindelser på CAN-mottakersiden:
Komponent - Pin |
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 |
Tilkobling mellom to MCP2515 CAN-moduler
H - KAN høy
L - CAN Lav
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Når alle tilkoblingene ble gjort, så maskinvaren min slik ut nedenfor
Programmering av Arduino for CAN-kommunikasjon
Først må vi installere et bibliotek for CAN i Arduino IDE. Grensesnitt MCP2515 CAN-modul med Arduino blir lettere ved å bruke følgende bibliotek.
- Last ned ZIP-filen til Arduino CAN MCP2515 Library.
- Fra Arduino IDE: Sketch -> Include Library -> Add.ZIP Library
I denne opplæringen er koding delt inn i to deler, en som CAN-senderkode (Arduino Nano) og en annen som CAN-mottakerkode (Arduino UNO) som begge finner du nederst på denne siden. Forklaringen på det samme er som følger.
Før du skriver program for sending og mottak av data, må du kontrollere at du har installert biblioteket ved å følge trinnene ovenfor, og at CAN-modulen MCP2515 er initialisert i programmet ditt som følger.
Initialiser MCP2515 CAN-modul:
Følg trinnene for å opprette forbindelse med MCP2515:
1. Angi pin-nummeret der SPI CS er koblet til (10 som standard)
MCP2515 mcp2515 (10);
2. Still inn baudrate og oscillatorfrekvens
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tilgjengelige overføringspriser:
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.
Tilgjengelige klokkehastigheter:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Still inn modus.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN Transmitter Side Code Forklaring (Arduino Nano)
I senderseksjonen grensesnittet Arduino Nano med MCP2515 CAN-modulen gjennom SPI-pinner, og DHT11 sender temperatur- og fuktighetsdata til CAN-buss.
Først er nødvendige biblioteker inkludert, SPI-bibliotek for bruk av SPI-kommunikasjon, MCP2515-bibliotek for bruk av CAN-kommunikasjon og DHT-bibliotek for bruk av DHT-sensor med Arduino . Vi har tidligere grensesnitt DHT11 med Arduino.
#inkludere
Nå er pin-navnet til DHT11 (OUT-pin) som er koblet til A0 av Arduino Nano definert
#definer DHTPIN A0
Og også, DHTTYPE er definert som DHT11.
#define DHTTYPE DHT11
En canMsg- strukturdatatype for lagring av CAN-meldingsformat.
struct can_frame canMsg;
Angi pin-nummeret der SPI CS er koblet til (10 som standard)
MCP2515 mcp2515 (10);
Og også, objekt dht for klasse DHT med DHT-pinne med Arduino Nano og DHT-type når DHT11 initialiseres.
DHT dht (DHTPIN, DHTTYPE);
Neste i ugyldig oppsett ():
Begynn SPI-kommunikasjonen ved å bruke følgende uttalelse
SPI.begin ();
Og bruk deretter uttalelsen nedenfor for å begynne å motta temperatur- og fuktighetsverdier fra DHT11-sensoren.
dht.begin ();
Deretter nullstilles MCP2515 ved hjelp av følgende kommando
mcp2515.reset ();
Nå er MCP2515 satt til 500 KBPS og 8 MHz som klokke
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Og MCP2525 er satt i normal modus
mcp2515.setNormalMode ();
I tomrumsløyfen ():
Følgende påstand får fuktighets- og temperaturverdien og lagres i en heltallvariabel h og t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Deretter blir CAN ID gitt som 0x036 (som per valg) og DLC som 8, og vi gir h og t dataene til dataene og dataene og hviler alle dataene med 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Oppdater fuktighetsverdien i canMsg.data = t; // Oppdater temperaturverdien i canMsg.data = 0x00; // Hvil alle med 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
For å sende meldingen til CAN BUS bruker vi tross alt følgende utsagn.
mcp2515.sendMessage (& canMsg);
Så nå sendes data om temperatur og fuktighet som melding til CAN-buss.
CAN-mottaker Side Kode Forklaring (Arduino UNO)
I mottakerseksjonen grensesnittet Arduino UNO til MCP2515 og 16x2 LCD-skjermen. Her mottar Arduino UNO temperaturen og fuktigheten fra CAN-bussen og viser dataene som er mottatt i LCD.
Først er nødvendige biblioteker inkludert, SPI Library for bruk av SPI Communication, MCP2515 Library for bruk av CAN Communication og LiquidCrsytal Library for bruk av 16x2 LCD med Arduino .
#inkludere
Deretter defineres LCD-pinnene som brukes 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 er erklært for lagring av CAN-meldingsformat.
struct can_frame canMsg;
Angi pin-nummeret der SPI CS er koblet til (10 som standard)
MCP2515 mcp2515 (10);
I ugyldig oppsett ():
Først er LCD-skjermen satt i 16x2-modus, og en velkomstmelding 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 ();
Begynn SPI-kommunikasjonen ved å bruke følgende uttalelse.
SPI.begin ();
Deretter nullstilles MCP2515 ved hjelp av følgende kommando.
mcp2515.reset ();
Nå er MCP2515 satt til 500 KBPS og 8 MHz som klokke.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Og MCP2525 er satt i normal modus.
mcp2515.setNormalMode ();
Neste i ugyldig sløyfe ():
Følgende uttalelse brukes til å motta meldingen fra CAN-bussen. Dersom meldingen er mottatt får det inn i hvis tilstanden.
hvis (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
I if- tilstand dataene blir mottatt og lagret i c anMsg , dataene som har fuktighetsverdi og data som har temperaturverdi. Begge verdiene er lagret i et helt tall x og y.
int x = canMsg.data; int y = canMsg.data;
Etter at du har mottatt verdiene, vises temperatur- og fuktighetsverdiene i 16x2 LCD-skjerm ved bruk av følgende uttalelse.
lcd.setCursor (0,0); lcd.print ("Fuktighet:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); forsinkelse (1000); lcd.clear ();
Arbeid med CAN-kommunikasjon i Arduino
Når maskinvaren er klar, last opp programmet for CAN-sender og CAN-mottaker (komplette programmer er gitt nedenfor) i de respektive Arduino-kortene. Når drevet du bør legge merke til temperaturverdien leses av DHT11 vil bli sendt til en annen Arduino gjennom CAN kommunikasjon og vises på LCD av 2 nd Arduino som du kan se i bildet nedenfor. Jeg har også brukt AC-fjernkontrollen for å sjekke om temperaturen som vises på LCD-skjermen, er nær faktisk romtemperatur.
Komplett arbeid finner du i videoen som er lenket nedenfor. Hvis du har spørsmål, la dem være i kommentarseksjonen eller bruk forumene våre for andre tekniske spørsmål.