🚗 MCP2515 CAN bus modul (TJA1050)
Lyt med på bilens hemmelige netværk! CAN-bus er nervesystemet i biler, maskiner og industri. Modulet har en MCP2515 CAN-controller (snakker SPI med din Arduino) og en TJA1050 transceiver (snakker elektrisk med bussen). Perfekt til eget dashboard, dataopsamling eller et lukket netværk mellem flere mikrocontrollere.
🛒 Køb MCP2515 CAN bus modulet 📄 MCP2515 datasheet (Microchip)⚡ Hurtige specifikationer
| Parameter | Værdi |
|---|---|
| CAN-controller | Microchip MCP2515 (CAN 2.0B, op til 1 Mbit/s) |
| Transceiver | TJA1050 (kræver 5V: ca. 4,75–5,25V) |
| Interface | SPI + interrupt-pin |
| Krystal | Typisk 8 MHz (læs teksten på krystallen – nogle moduler har 16 MHz) |
| Terminering | 120 Ω via jumper (J1) |
| Forsyning | 5V |
📌 Pinout
| Pin | Navn | Funktion | Forbindes til |
|---|---|---|---|
| 1 | INT | Interrupt – går LOW når der er en ny besked | D2 (UNO/Nano) |
| 2 | SCK | SPI clock | D13 |
| 3 | SI | SPI data ind (MOSI) | D11 |
| 4 | SO | SPI data ud (MISO) | D12 |
| 5 | CS | Chip select | D10 |
| 6 | GND | Stel | GND |
| 7 | VCC | Forsyning | 5V |
| Skrue | H | CAN High | CAN-H (OBD2 pin 6) |
| Skrue | L | CAN Low | CAN-L (OBD2 pin 14) |
📏 Rækkefølgen INT–SCK–SI–SO–CS–GND–VCC er den mest udbredte på de blå moduler, men læs altid silketrykket.
🔌 Sådan forbinder du den
| MCP2515 | Arduino UNO/Nano | ESP32 |
|---|---|---|
| VCC | 5V | 5V / VIN (TJA1050 skal have 5V) |
| GND | GND | GND |
| CS | D10 | GPIO 5 |
| SO (MISO) | D12 | GPIO 19 – via level shifter (SO er 5V når modulet kører 5V) |
| SI (MOSI) | D11 | GPIO 23 |
| SCK | D13 | GPIO 18 |
| INT | D2 | GPIO 4 (valgfri) |
Mellem to moduler: H til H, L til L, og jumperen på begge (en terminering i hver ende).
💻 Eksempelkode
Installér biblioteket CAN af Sandeep Mistry via Library Manager. Det bruger CS = D10 og INT = D2 som standard. Sketchen lytter og printer alle beskeder:
#include <CAN.h>
void setup() {
Serial.begin(115200);
while (!Serial);
CAN.setClockFrequency(8E6); // 8 MHz krystal (skift til 16E6 hvis der staar 16.000 paa den)
if (!CAN.begin(500E3)) { // 500 kbit/s - almindelig hastighed i biler
Serial.println("CAN start fejlede!");
while (1);
}
CAN.observe(); // kun lytte - sender ingen ACK/fejl paa bussen
Serial.println("Lytter paa CAN-bussen...");
}
void loop() {
int stoerrelse = CAN.parsePacket();
if (stoerrelse) {
Serial.print("ID 0x");
Serial.print(CAN.packetId(), HEX);
Serial.print(" : ");
while (CAN.available()) {
Serial.print(CAN.read(), HEX);
Serial.print(" ");
}
Serial.println();
}
}
💡 KompoNemt-tip fra værkstedet
- Jumperen J1 er en 120 Ω termineringsmodstand. CAN skal termineres i begge ender af kablet. På bilens OBD2-stik er der allerede terminering – fjern jumperen der. På bordet mellem to Arduinoer skal den sidde på begge moduler.
-
Forkert hastighed kan forstyrre bilen. Brug listen-only (
CAN.observe()) mens du finder den rigtige bitrate (typisk 500 kbit/s, nogle biler 250 kbit/s). - Krystallen er den klassiske faldgrube: koden skal vide, om den er 8 eller 16 MHz. Forkert = ingen beskeder eller volapyk.
- OBD2 pin 6 og 14 er standard-CAN på de fleste nyere biler (ældre biler kan bruge andre protokoller). Pin 16 er 12V fra batteriet – hold den langt væk fra dit 5V-modul!
🔧 Fejlfinding
- "CAN start fejlede": Tjek SPI-ledningerne (SO/SI byttet om er klassikeren), CS-pin og 5V på VCC.
- Ingen beskeder: Forkert bitrate eller forkert krystalfrekvens i koden. Prøv 250E3 og 500E3.
- Virker med to moduler på bordet, men ikke i bilen: H og L byttet om, eller bilens CAN sidder ikke på OBD2 pin 6/14.
- ESP32 opfører sig mærkeligt: SO sender 5V tilbage til en 3.3V-pin – brug en level shifter.
Sidder du fast? Skriv til os – vi hjælper gerne.