Als je van technologie houdt en vaak experimenteert met Arduino, zal dit artikel je fascineren. Vandaag zullen we zien hoe u uw eigen CAN-netwerk kunt opzetten met behulp van de MCP2515-module en Arduino. Je ontdekt hoe je efficiënt en betrouwbaar kunt communiceren tussen verschillende apparaten op een CAN-netwerk. Dit type netwerk wordt veel gebruikt in auto's en andere industriële toepassingen.
Of u nu een automobielproject uitvoert of communicatie tussen meerdere microcontrollers nodig heeft, de CAN-bus is perfect voor toepassingen waarbij betrouwbaarheid en prestaties essentieel zijn. En met de MCP2515-module is het heel eenvoudig om Arduino in dit netwerk te integreren. Bereid u dus voor om diepgaand te leren over het CAN-protocol, de hardwareconfiguratie en de noodzakelijke programmering.
Wat is CAN-bus?
De CAN-bus (Controller Area Network) is een serieel communicatieprotocol waarmee verschillende apparaten met elkaar kunnen communiceren. Het werd in 1986 ontwikkeld door Bosch en is specifiek ontworpen voor toepassingen in de automobielsector, hoewel het gebruik ervan zich heeft verspreid naar andere sectoren, zoals de industriële automatisering. In dit type netwerk verzenden en ontvangen aangesloten apparaten berichten zonder dat er een centrale host of controller nodig is, waardoor het een zeer efficiënt protocol is voor omgevingen waar communicatie en betrouwbaarheid van cruciaal belang zijn.
Een moderne auto bevat meer dan 70 besturingsapparaten, ook wel ECU’s (Electronic Control Units) genoemd, die via de CAN-bus met elkaar zijn verbonden. Dankzij dit protocol wisselen de ECU's belangrijke informatie uit voor de werking van de auto, zoals gegevens over de voertuigsnelheid of de stand van het gaspedaal.
CAN-bustopologie en signalen
De topologie van het CAN-systeem is type multimaster, wat betekent dat elk apparaat dat op het netwerk is aangesloten, de controle over de bus kan overnemen om berichten te verzenden. Alle knooppunten luisteren naar deze berichten en beslissen of ze reageren of negeren.
Vanuit fysiek oogpunt wordt de communicatie uitgevoerd via twee kabels: KAN_H y KAN IK. Deze kabels zijn gevlochten om elektromagnetische interferentie te minimaliseren. Bovendien moeten de uiteinden van het netwerk worden afgesloten met weerstanden van 120 ohm om reflecties in het signaal te voorkomen.
CAN-signalering
Het CAN-systeem gebruikt twee logische toestanden voor communicatie: dominant y recessief. In de dominante toestand heeft CAN_H een spanning van 3.5 V en CAN_L een spanning van 1.5 V. In deze toestand wordt een logische '0' verzonden. Aan de andere kant hebben beide draden in de recessieve toestand een spanning van 2.5 V, wat aangeeft dat de bus vrij is en een logische '1' kan worden verzonden. Het is deze verandering in de spanning tussen de twee kabels die gegevensoverdracht op het netwerk mogelijk maakt.
De MCP2515-module
El MCP2515-module Het is een ideale oplossing voor het toevoegen van CAN-connectiviteit aan uw Arduino. Het bestaat uit een CAN-controller (de MCP2515, die de CAN 2.0B-specificatie volgt) en een CAN-transceiver (de TJA1050, die de fysieke communicatie afhandelt). Deze twee chips werken samen zodat je CAN-berichten kunt verzenden en ontvangen met je Arduino via de SPI-interface.
De MCP2515 ondersteunt zowel standaard (11-bit) als uitgebreide (29-bit) berichten en heeft de mogelijkheid om ongewenste berichten eruit te filteren door het gebruik van maskers en filters, waardoor het werk van de microcontroller wordt weggenomen. Het is een uitstekende optie voor projecten die betrouwbare communicatie vereisen, zowel in luidruchtige omgevingen als over lange afstanden.
MCP2515 Modulecomponenten
De MCP2515-module bevat de volgende onderdelen:
- MCP2515 CAN-controller: Verantwoordelijk voor het uitvoeren van alle CAN-protocolfuncties, zoals het verzenden en ontvangen van berichten.
- TJA1050 CAN-zendontvanger: Verantwoordelijk voor het omzetten van data van de CAN-controller naar signalen voor de fysieke CAN-bus en vice versa.
- SPI-communicatiepinnen: Met behulp van de SCK-, MOSI-, MISO- en CS-pinnen communiceert de MCP2515 met de Arduino via de SPI-interface.
- CAN-busterminals: Dit kleine schroefklemmenblok is gemarkeerd met 'H' en 'L'. CAN_H en CAN_L moeten op de CAN-netwerkkabels worden aangesloten.
Hoe je een CAN-netwerk opzet met Arduino
Met de MCP2515 module is het opzetten van een CAN-netwerk relatief eenvoudig. Hieronder leg ik uit hoe je de module op je Arduino bord aansluit en hoe je de software configureert.
MCP2515 Moduleverbindingen
Om te beginnen sluit u de SPI-pinnen van uw Arduino als volgt aan:
- MISO (module-uitgang) op pin D12 van Arduino
- MOSI (module-ingang) op pin D11 van Arduino
- SCK (Klok) naar Arduino-pin D13
- CS (Chip Select) naar Arduino-pin D10
U zult ook de INT-pin van de MCP2515 moeten aansluiten op een Arduino digitale pin, bijvoorbeeld D2, omdat deze pin wordt gebruikt om interrupts af te handelen wanneer een geldig bericht wordt ontvangen.
Vergeet niet uw module van stroom te voorzien. De VCC-pin moet worden aangesloten op 5V en de GND-pin op aarde.
Wat de CAN-busterminals betreft, verbindt u CAN_H met CAN_H en CAN_L met CAN_L tussen de verschillende knooppunten die u met elkaar wilt verbinden. Houd er rekening mee dat de CAN-bus aan beide uiteinden moet worden afgesloten met een weerstand van 120 ohm.
Arduino-programmering
Zodra je de knooppunten hebt aangesloten, is het tijd om je Arduino te programmeren om via de MCP2515-module met de CAN-bus te communiceren. De beste manier om dit te doen is door gebruik te maken van een geschikte bibliotheek, zoals de bibliotheek 'mcp2515'.
Eerst moet u deze bibliotheek installeren. Als u de Arduino IDE gebruikt, gaat u naar Schets > Bibliotheek opnemen > Bibliotheken beheren. Zoek naar 'mcp2515' en selecteer de installatieoptie.
Als de bibliotheek is geïnstalleerd, kunt u doorgaan met het schrijven van de code voor uw zenderknooppunt en uw ontvangerknooppunt. Hieronder laat ik u basisvoorbeelden voor beide zien.
Codevoorbeeld voor zenderknooppunt
Deze code verzendt elke seconde een 'Hello World'-bericht over de CAN-bus.
#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo transmisor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); }}void loop() { Serial.print("Enviando mensaje... "); CAN.beginPacket(0x12); CAN.write('H'); CAN.write('o'); CAN.write('l'); CAN.write('a'); CAN.write(' '); CAN.write('M'); CAN.write('u'); CAN.write('n'); CAN.write('d'); CAN.write('o'); CAN.endPacket(); Serial.println("Mensaje enviado correctamente"); delay(1000);}
Codevoorbeeld voor het ontvangende knooppunt
Deze code ontvangt berichten van de CAN-bus en geeft deze weer op de seriële monitor.
#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo receptor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); } CAN.onReceive(onReceive);}void loop() {}void onReceive(int packetSize) { Serial.print("Mensaje recibido con ID: 0x"); Serial.print(CAN.packetId(), HEX); Serial.print(" | Tamaño: "); Serial.print(packetSize); Serial.print(" | Datos: "); while (CAN.available()) { Serial.print((char)CAN.read()); } Serial.println();}
Snelheden en afstanden in een CAN-netwerk
De CAN-bus maakt communicatie op verschillende snelheden mogelijk. De maximale snelheid die door de MCP2515 wordt ondersteund is 1 Mbit/s, maar de lengte van de bus beperkt de transmissiesnelheid. Bij 1 Mbit/s is de maximale buslengte bijvoorbeeld ongeveer 40 meter. Als u echter grotere afstanden moet afleggen, kunt u uw snelheid verlagen. Bij 125 kbit/s kan de buslengte oplopen tot 500 meter.
Het is belangrijk om het netwerk goed te plannen en de juiste snelheid te gebruiken voor de lengte van de bus en de omgeving waarin deze zal worden gebruikt, aangezien luidruchtige omgevingen de kwaliteit van de communicatie kunnen beïnvloeden.
Vergeet ook niet om twisted pair te gebruiken voor CAN_H- en CAN_L-kabels, omdat dit de elektromagnetische interferentie helpt verminderen en de netwerkbetrouwbaarheid verbetert.
CAN-netwerk met meerdere knooppunten
Als u een netwerk met meerdere knooppunten wilt vormen, is het proces vrijwel hetzelfde. Het enige dat u hoeft te doen is ervoor te zorgen dat u alle knooppunten parallel aansluit op de CAN_H- en CAN_L-lijnen. Denk er ook aan om afsluitweerstanden alleen aan de uiteinden van de hoofdlijn te plaatsen, en niet aan de tussenliggende knooppunten.
In een complexer netwerk heb je mogelijk meerdere knooppunten die als zenders en ontvangers fungeren. Elk knooppunt voegt minimale belasting toe aan de bus, waardoor maximaal 112 knooppunten op een CAN-netwerk kunnen worden aangesloten zonder de prestaties aanzienlijk te beïnvloeden.
Of u nu een CAN-bus in een auto gebruikt om motorgegevens uit te lezen of in een industrieel project om meerdere sensoren te communiceren, de MCP2515-module maakt het eenvoudig en efficiënt om deze functionaliteit toe te voegen. Dit type netwerk is ideaal voor toepassingen waarbij een lage latentie en betrouwbaarheid bij de gegevensoverdracht essentieel zijn.