- Inleiding tot CAN
- Vergelijking van CAN via SPI en I2C
- CAN-protocoltoepassingen
- Hoe het CAN-protocol in Arduino te gebruiken
- Componenten vereist
- Schakelschema
- Verbinding tussen twee MCP2515 CAN-modules
- Arduino programmeren voor CAN-communicatie
- CAN-zender Zijcode-uitleg (Arduino Nano)
- CAN-ontvanger Side Code-uitleg (Arduino UNO)
- Werking van CAN-communicatie in Arduino
Tegenwoordig bestaat elke gemiddelde auto uit zo'n 60 tot 100 sensoreenheden voor het detecteren en uitwisselen van informatie. Met autofabrikanten die hun auto constant slimmer maken met functies als autonoom rijden, airbagsysteem, bandenspanningscontrole, cruisecontrolsysteem enz., Wordt verwacht dat dit aantal alleen maar hoog zal worden. In tegenstelling tot andere sensoren verwerken deze sensoren kritische informatie en daarom moeten de gegevens van deze sensoren worden gecommuniceerd met behulp van standaard auto-communicatieprotocollen. Gegevens van het cruise control-systeem zoals snelheid, gasklepstand enz. Zijn vitale waarden die naar de elektronische regeleenheid (ECU) worden gestuurdom het versnellingsniveau van de auto te bepalen, kan een miscommunicatie of verlies van gegevens hier tot kritieke storingen leiden. Daarom gebruiken ontwerpers, in tegenstelling tot standaard communicatieprotocollen zoals UART, SPI of I2C, veel betrouwbare auto-communicatieprotocollen zoals LIN, CAN, FlexRay enz.
Van alle beschikbare protocollen wordt CAN meer overwegend gebruikt en populairder. We hebben al besproken wat CAN is en hoe CAN werkt. In dit artikel gaan we dus nogmaals in op de basis en tenslotte gaan we ook data uitwisselen tussen twee Arduino's via CAN-communicatie. Klinkt interessant toch! Dus laten we beginnen.
Inleiding tot CAN
CAN oftewel Controller Area Network is een seriële communicatiebus die is ontworpen voor industriële en automobieltoepassingen. Het is een op berichten gebaseerd protocol dat wordt gebruikt voor communicatie tussen meerdere apparaten. Wanneer meerdere CAN-apparaten met elkaar zijn verbonden, zoals hieronder getoond, vormt de verbinding een netwerk dat werkt als ons centrale zenuwstelsel, waardoor elk apparaat kan spreken met elk ander apparaat in het knooppunt.
Een CAN-netwerk bestaat uit slechts twee draden CAN High en CAN Low voor bidirectionele gegevensoverdracht, zoals hierboven weergegeven. De communicatiesnelheid voor CAN varieert doorgaans van 50 Kbps tot 1 Mbps en de afstand kan variëren van 40 meter bij 1 Mbps tot 1000 meter bij 50 kbps.
Formaat van CAN-bericht:
Bij de CAN-communicatie worden de gegevens in het netwerk verzonden als een bepaald berichtformaat. Dit berichtformaat bevat veel segmenten, maar twee hoofdsegmenten zijn de identificatie en gegevens die helpen bij het verzenden en beantwoorden van berichten in de CAN-bus.
Identifier of CAN ID: de identifier is ook bekend als een CAN ID of ook wel bekend als PGN (Parameter Group Number). Het wordt gebruikt om de CAN-apparaten in een CAN-netwerk te identificeren. De lengte van de identifier is 11 of 29 bits, afhankelijk van het gebruikte type CAN-protocol.
Standaard CAN: 0-2047 (11-bit)
Extended CAN: 0-2 29 1 (29-bit)
Gegevens: Dit zijn de feitelijke sensor- / regelgegevens die van het ene apparaat naar het andere moeten worden verzonden. De groottegegevens kunnen tussen de 0 en 8 bytes lang zijn.
Datalengtecode (DLC): 0 tot 8 voor het aantal aanwezige databytes.
Draden gebruikt in CAN:
Het CAN-protocol bestaat uit twee draden namelijk CAN_H en CAN_L om informatie te verzenden en ontvangen. Beide draden werken als een differentiële lijn, wat betekent dat het CAN-signaal (0 of 1) wordt weergegeven door het potentiaalverschil tussen CAN_L en CAN_H. Als het verschil positief is en groter dan een bepaalde minimumspanning, dan is het 1 en als het verschil negatief is, is het 0.
Normaal gesproken wordt een twisted pair-kabel gebruikt voor CAN-communicatie. Een enkele weerstand van 120 ohm wordt over het algemeen gebruikt aan de twee uiteinden van het CAN-netwerk, zoals weergegeven in de afbeelding, dit komt omdat de lijn moet worden gebalanceerd en aan hetzelfde potentiaal moet worden gekoppeld.
Vergelijking van CAN via SPI en I2C
Omdat we al hebben geleerd hoe we SPI met Arduino en IIC met Arduino kunnen gebruiken, vergelijken we de kenmerken van SPI en I2C met CAN
Parameter | SPI | I2C | KAN |
Snelheid | 3 Mbps tot 10 Mbps | Standaard: 100 Kbps | 10KBps tot 1MBps Hangt ook af van de gebruikte draadlengte |
Snel: 400 Kbps | |||
Hoge snelheid: 3,4 Mbps | |||
Type | Synchroon | Synchroon | Asynchroon |
Aantal draden | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 draden (SDA, SCL) | 2 draden (CAN_H, CAN_L) |
Duplex | Volledige duplex | Half duplex | Half duplex |
CAN-protocoltoepassingen
- Vanwege de robuustheid en betrouwbaarheid van het CAN-protocol worden ze gebruikt in industrieën zoals de automobielindustrie, industriële machines, landbouw, medische apparatuur enz.
- Omdat de complexiteit van de bedrading in CAN wordt verminderd, worden ze voornamelijk gebruikt in automobieltoepassingen zoals auto's.
- Lage implementatiekosten en ook de prijs van hardwarecomponenten is ook lager.
- Eenvoudig toevoegen en verwijderen van CAN-bus-apparaten.
Hoe het CAN-protocol in Arduino te gebruiken
Omdat Arduino geen ingebouwde CAN-poort heeft, wordt een CAN-module genaamd MCP2515 gebruikt. Deze CAN-module is gekoppeld aan Arduino door gebruik te maken van de SPI-communicatie. Laten we meer in detail bekijken over MCP2515 en hoe het is gekoppeld aan Arduino.
MCP2515 CAN-module:
MCP2515-module heeft een CAN-controller MCP2515 die een snelle CAN-transceiver is. De verbinding tussen MCP2515 en MCU verloopt via SPI. Het is dus gemakkelijk om te communiceren met elke microcontroller met een SPI-interface.
Voor beginners die CAN Bus willen leren, is deze module een goede start. Dit CAN SPI-bord is ideaal voor industriële automatisering, domotica en andere embedded projecten in de auto-industrie.
Kenmerken en specificatie van MCP2515:
- Maakt gebruik van snelle CAN-transceiver TJA1050
- Afmeting: 40 × 28 mm
- SPI-besturing voor uitbreiding van de Multi CAN-bus-interface
- 8MHZ kristaloscillator
- 120Ω eindweerstand
- Heeft onafhankelijke sleutel, LED-indicator, Power-indicator
- Ondersteunt CAN-werking van 1 Mb / s
- Lage stroom standby-werking
- Er kunnen maximaal 112 knooppunten worden aangesloten
Pinout van MCP2515 CAN-module:
Pin Naam |
GEBRUIK |
VCC |
5V Power input pin |
GND |
Aardingspin |
CS |
SPI SLAVE select pin (actief laag) |
ZO |
SPI master input slave output kabel |
SI |
SPI master output slave input lead |
SCLK |
SPI-klokpen |
INT |
MCP2515 onderbrekingspin |
Laten we in deze tutorial kijken hoe we vochtigheid & temperatuur (DHT11) sensorgegevens van Arduino Nano naar Arduino Uno kunnen sturen via CAN- busmodule MCP2515.
Componenten vereist
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD-scherm
- MCP2515 CAN-module - 2
- 10k Potentiometer
- Breadboard
- Verbindingsdraden
Schakelschema
Aansluiting aan CAN-zenderzijde:
Component - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - ZO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - BINNEN |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - UIT |
A0 |
Circuitaansluitingen aan CAN-ontvangerzijde:
Component - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - ZO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - BINNEN |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Naar 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 |
Verbinding tussen twee MCP2515 CAN-modules
H - CAN Hoog
L - CAN laag
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H. |
H. |
L. |
L. |
Nadat alle verbindingen waren gemaakt, zag mijn hardware er hieronder als volgt uit
Arduino programmeren voor CAN-communicatie
Eerst moeten we een bibliotheek installeren voor CAN in Arduino IDE. Het koppelen van de MCP2515 CAN-module met de Arduino wordt eenvoudiger door de volgende bibliotheek te gebruiken.
- Download het ZIP-bestand van de Arduino CAN MCP2515-bibliotheek.
- Van de Arduino IDE: Sketch -> Bibliotheek opnemen ->.ZIP-bibliotheek toevoegen
In deze tutorial is de codering opgedeeld in twee delen, een als CAN-zendercode (Arduino Nano) en een als CAN-ontvangercode (Arduino UNO) die beide onderaan deze pagina te vinden zijn. De verklaring voor hetzelfde is als volgt.
Voordat u een programma schrijft voor het verzenden en ontvangen van gegevens, moet u ervoor zorgen dat u de bibliotheek hebt geïnstalleerd volgens de bovenstaande stappen en dat de CAN-module MCP2515 als volgt in uw programma wordt geïnitialiseerd.
Initialiseer MCP2515 CAN-module:
Volg de stappen om verbinding te maken met MCP2515:
1. Stel de pincode in waarop SPI CS is aangesloten (standaard 10)
MCP2515 mcp2515 (10);
2. Stel de baudrate en oscillatorfrequentie in
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Beschikbare baudsnelheden:
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_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KBPS, CAN_200KB
Beschikbare kloksnelheden:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Stel modi in.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN-zender Zijcode-uitleg (Arduino Nano)
In de transmittersectie is Arduino Nano via SPI-pinnen verbonden met de MCP2515 CAN-module en DHT11 stuurt temperatuur- en vochtigheidsgegevens naar de CAN-bus.
Eerst worden de vereiste bibliotheken meegeleverd, SPI-bibliotheek voor gebruik van SPI-communicatie, MCP2515-bibliotheek voor gebruik van CAN-communicatie en DHT-bibliotheek voor gebruik van DHT-sensor met Arduino . We hebben eerder DHT11 met Arduino gekoppeld.
# omvatten
Nu is de pinnaam van DHT11 (OUT-pin) die is verbonden met de A0 van Arduino Nano gedefinieerd
# definiëren DHTPIN A0
En ook wordt de DHTTYPE gedefinieerd als DHT11.
# definiëren DHTTYPE DHT11
Een canMsg struct-gegevenstype voor het opslaan van CAN-berichtformaat.
struct can_frame canMsg;
Stel het pincode in waarop SPI CS is aangesloten (standaard 10)
MCP2515 mcp2515 (10);
En ook object dht voor klasse DHT met DHT-pin met Arduino Nano en DHT-type als DHT11 wordt geïnitialiseerd.
DHT dht (DHTPIN, DHTTYPE);
Volgende in ongeldige setup ():
Begin de SPI-communicatie door de volgende verklaring te gebruiken
SPI.begin ();
En gebruik vervolgens onderstaande verklaring om temperatuur- en vochtigheidswaarden van de DHT11-sensor te ontvangen.
dht.begin ();
Vervolgens wordt de MCP2515 RESET met de volgende opdracht
mcp2515.reset ();
Nu is de MCP2515 ingesteld op een snelheid van 500KBPS en 8MHZ als klok
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
En de MCP2525 is ingesteld op de normale modus
mcp2515.setNormalMode ();
In de lege lus ():
De volgende instructie haalt de waarde voor vochtigheid en temperatuur op en slaat deze op in een integer-variabele h en t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Vervolgens wordt de CAN-ID gegeven als 0x036 (volgens keuze) en DLC als 8 en we geven de h- en t-gegevens aan de gegevens en gegevens en laten alle gegevens rusten met 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Update vochtigheidswaarde in canMsg.data = t; // Update temperatuurwaarde in canMsg.data = 0x00; // Rust alles met 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Om het bericht naar CAN BUS te sturen gebruiken we immers de volgende verklaring.
mcp2515.sendMessage (& canMsg);
Dus nu worden de temperatuur- en vochtigheidsgegevens als bericht naar de CAN-bus gestuurd.
CAN-ontvanger Side Code-uitleg (Arduino UNO)
In het ontvangergedeelte werkte Arduino UNO samen met de MCP2515 en het 16x2 LCD-scherm. Hier ontvangt de Arduino UNO de temperatuur en vochtigheid van de CAN-bus en geeft de ontvangen gegevens weer op het LCD-scherm.
Eerst worden de vereiste bibliotheken meegeleverd, SPI-bibliotheek voor het gebruik van SPI-communicatie, MCP2515-bibliotheek voor het gebruik van CAN-communicatie en LiquidCrsytal-bibliotheek voor het gebruik van 16x2 LCD met Arduino .
# omvatten
Vervolgens worden de LCD-pinnen gedefinieerd die worden gebruikt om verbinding te maken met de Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Er wordt een struct- gegevenstype gedeclareerd voor het opslaan van CAN-berichtformaat.
struct can_frame canMsg;
Stel het pincode in waarop SPI CS is aangesloten (standaard 10)
MCP2515 mcp2515 (10);
In ongeldige setup ():
Eerst wordt het LCD-scherm ingesteld op 16x2-modus en wordt een welkomstbericht weergegeven.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); vertraging (3000); lcd.clear ();
Begin de SPI-communicatie door de volgende verklaring te gebruiken.
SPI.begin ();
Vervolgens wordt de MCP2515 RESET met het volgende commando.
mcp2515.reset ();
Nu is de MCP2515 ingesteld op een snelheid van 500KBPS en 8MHZ als klok.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
En de MCP2525 is ingesteld op de normale modus.
mcp2515.setNormalMode ();
Volgende in lege lus ():
De volgende instructie wordt gebruikt om het bericht van de CAN-bus te ontvangen. Als er een bericht is ontvangen, komt het in de if- toestand.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
In de if- toestand worden de gegevens ontvangen en opgeslagen in c anMsg , de gegevens met een vochtigheidswaarde en gegevens met een temperatuurwaarde. Beide waarden worden opgeslagen in een geheel getal x en y.
int x = canMsg.data; int y = canMsg.data;
Na ontvangst van de waarden worden de temperatuur- en vochtigheidswaarden weergegeven op een 16x2 LCD-display met behulp van de volgende verklaring.
lcd.setCursor (0,0); lcd.print ("Vochtigheid:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); vertraging (1000); lcd.clear ();
Werking van CAN-communicatie in Arduino
Zodra de hardware klaar is, upload je het programma voor CAN-zender en CAN-ontvanger (volledige programma's worden hieronder weergegeven) in de respectieve Arduino-kaarten. Bij voeding zou je moeten opmerken dat de temperatuurwaarde die door de DHT11 wordt gelezen, via CAN-communicatie naar een andere Arduino wordt gestuurd en wordt weergegeven op het LCD-scherm van de 2e Arduino, zoals je kunt zien in de onderstaande afbeelding. Ik heb ook mijn AC-afstandsbediening gebruikt om te controleren of de temperatuur die op het LCD-scherm wordt weergegeven, de werkelijke kamertemperatuur benadert.
De volledige werking is te vinden op de onderstaande video. Als je vragen hebt, laat ze dan achter in het commentaargedeelte of gebruik onze forums voor andere technische vragen.