CAN převodník MCP2515 (čtení informací)  – část 1.

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.

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.
Datasheet MCP2515 stáhneš tady: PDF

Schéma je tady: PDF

_57

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í

img_1008 img_1009img_1011

Krok 2: Zapojení součástek
CAN převodník používá SPI interface. Převodník zapojíme dle obrázku, viz níž:

obdcan-arduino-spi-communication-bus-illustration-diagram obd-arduino-interface-connection

Aby převodník správně pracoval, je potřeba stáhnout knihovny tady. Nebo odkaz na knihovny zde: ZIP

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(&amp;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&lt;len; i++)                // Tisk každého bytu dat
      {
        if(rxBuf[i] &lt; 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

Napoj Arduino do PC – zapni seriálový monitor – zvol rychlost 115200 a podívej se, jak CAN sběrnice auta bombarduje Arduino příkazy.

serial_monitor_receive
V dalším článku se naučíš posílat příkazy do CAN sběrnice auta s pomocí Arduina.

Napsat komentář