V tomto článku budeme rozebírat čtení informací ze sběrnice CAN automobilů.
Do sběrnice CAN se napojíme přes diagnostický konektor OBD2.
V českém internetu nejsou informace o tom, jak propojit čínský CAN převodník s integrovaným obvodem MPC2515, oscilátorem 8MHz a Arduinem.
Rozhodl jsem se, že o tom tedy napíšu krátký článek, abych tuto internetovou mezeru alespoň částečně zaplnil.
MCP2515 je čip, vyroben firmou Microchip semiconductor, podporující CAN specifikaci 2.0B a může nejen přijímat, ale i posílat standartní a rozšířené rámce. Tento čip má dvě masky a šest filtrů. Filtry se používají k odfiltrování nevyžádaných zpráv a tím pádem ke snížení zatížení Microcontroleru.
Krok 1: Seznam součástek
1. Arduino Uno
2. CAN převodník MCP2515
3. Dráty samec-samice
4. Krabička z akrylového skla (nemusí být)
5. Distanční sloupky (nemusí být)
6. Auto s CAN sběrnicí
Krok 2: Zapojení součástek
CAN převodník používá SPI interface. Převodník zapojíme dle obrázku, viz níž:
Aby převodník správně pracoval, je potřeba stáhnout knihovny tady.
Tato knihovna má dva příklady – přijímání a posílání dat. V tomto článku se budeme zabývat pouze přijímáním dat. Příklad správně funguje pouze s modulem převodníku s 16MHz oscilátorem. Čínské převodníky mají 8MHz oscilátor. Proto musíme příklad opravit. Při initilizaci CAN sběrnice musíme specifikovat frekvence oscilátoru: CAN0.begin(CAN_500KBPS, MCP_8MHz). Ještě je možné zkopírovat kód, viz dole, a přidat ho.
Krok 3: Nahrát kód
// demo: MCP2515 CAN-BUS , čtení informací
#include <mcp_can.h>
#include <SPI.h>
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
MCP_CAN CAN0(10); // nastavit CS k pinu 10
void setup()
{
Serial.begin(115200);
// init can bus : baudrate = 500k
if(CAN0.begin(CAN_500KBPS, MCP_8MHz) == CAN_OK) Serial.print("can init ok!!\r\n");
else Serial.print("Can init fail!!\r\n");
pinMode(2, INPUT); // nastavení pinu 2 pro /INT vstup
Serial.println("MCP2515 Library Receive Example...");
}
void loop()
{
if(!digitalRead(2)) // Jestli pin 2 je low, čtení informací z bufferu
{
CAN0.readMsgBuf(&len, rxBuf); // čtení informací: len = délka dat, buf = data byte(s)
rxId = CAN0.getCanId(); // čtení ID
Serial.print("ID: ");
Serial.print(rxId, HEX);
Serial.print(" Data: ");
for(int i = 0; i<len; i++) // Tisk každého bytu dat
{
if(rxBuf[i] < 0x10) // Jestli byte dat míň než 0x10, přidat nulu před
{
Serial.print("0");
}
Serial.print(rxBuf[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
Pokud je toto všechno spojeno dráty, nahrajeme kód do Arduina. Napojíme CAN převodník do CAN sběrnice auto, viz obrázek a můžeme začít.
Krok 4: bavit se
V dalším článku se naučíš posílat příkazy do CAN sběrnice auta s pomocí Arduina.