Použijte tento robustní sériový komunikační protokol k propojení dvou desek Arduino a vzájemnému posílání dat.

Sběrnice Controller Area Network (CAN) je robustní a spolehlivý komunikační protokol, který je široce používán v různých průmyslových, automobilových a leteckých aplikacích. Je určen pro přenos dat mezi mikrokontroléry a zařízeními po síti CAN bus. Možná to ještě nevíte, ale je to věc za těmi šílenými úpravami palubní desky auta, které vidíte na sociálních sítích.

Provedeme vás, jak vytvořit sběrnici CAN s modulem CAN MCP2515 pomocí Arduina a prkénka. Projdeme si také knihovnu Arduino CAN a ukážeme si, jak odesílat a přijímat data přes sběrnici CAN.

Co je sběrnice CAN?

Sběrnice CAN je sériový komunikační protokol, který byl vyvinut společností Bosch v 80. letech minulého století. Je široce používán v různých aplikacích kvůli své vysoké spolehlivosti a robustnosti. Umožňuje přenos dat mezi zařízeními vysokou rychlostí s minimální latencí pouze po dvou linkách: CAN High a CAN Low.

V roce 1994 se sběrnice CAN stala mezinárodním standardem (ISO 11898), který byl navržen speciálně pro rychlou sériovou výměnu dat mezi elektronickými řídicími jednotkami v automobilových aplikacích. Podívejte se na našeho komplexního průvodce na

instagram viewer
co je sběrnice CAN a jakou roli hraje v automobilových systémech pro více podrobností.

Jedním z důvodů, proč je sběrnice CAN tak oblíbená, je její detekce a oprava chyb. Protokol dokáže detekovat a opravovat chyby v přenosu dat. Díky tomu je ideální pro aplikace, kde je kritická integrita dat, jako je průmyslová automatizace.

Seznámení s modulem CAN MCP2515

Modul řadiče sběrnice CAN MCP2515 je zařízení, které poskytuje výjimečnou podporu pro široce používaný protokol CAN verze 2.0B. Tento modul je ideální pro komunikaci s vysokou přenosovou rychlostí až 1 Mbps.

MCP2515 IC je nezávislý CAN kontrolér s rozhraním SPI, který umožňuje komunikaci s širokou škálou mikrokontrolérů. TJA1050 IC na druhé straně funguje jako rozhraní mezi IC řadiče CAN MCP2515 a fyzickou sběrnicí CAN.

Pro větší pohodlí je zde propojka, která vám umožní připojit 120 ohmové zakončení, což ještě více usnadňuje připojení vašich vodičů k CAN_H & MŮŽU šrouby pro komunikaci s ostatními moduly CAN.

Vlastnosti

Specifikace

Vysílač

TJA1050

Rozhraní mikrokontroléru

SPI (umožňuje integraci sběrnice Multi CAN)

Krystalový oscilátor

8 MHz

Ukončení

120Ω

Rychlost

1 Mbps

Spotřeba energie

Nízkoproudý pohotovostní provoz

Dimenze

Rozměr 40 x 28 mm

Kapacita uzlu

Podporuje až 112 uzlů

Další informace můžete získat z Technický list MCP2515 v případě, že tento modul potřebujete pro pokročilejší projekt.

Struktura zpráv CAN

Struktura zprávy CAN se skládá z více segmentů, ale nejkritičtějšími segmenty pro tento projekt jsou identifikátor a data. Identifikátor, známý také jako CAN ID nebo číslo skupiny parametrů (PGN), identifikuje zařízení na CAN síť a délka identifikátoru může být buď 11 nebo 29 bitů, v závislosti na typu protokolu CAN použitý.

Mezitím data představují aktuální přenášená data senzoru/řízení. Data mohou být dlouhá od 0 do 8 bajtů a kód délky dat (DLC) označuje počet přítomných datových bajtů.

Knihovna sběrnice CAN Arduino MCP2515

Tato knihovna implementuje Protokol CAN V2.0B, který může pracovat rychlostí až 1 Mbps. Poskytuje rozhraní SPI, které může pracovat rychlostí až 10 MHz při podpoře standardních (11bitových) i rozšířených (29bitových) dat. A co víc, přichází se dvěma přijímacími vyrovnávacími pamětmi, které umožňují prioritní ukládání zpráv.

Inicializace sběrnice CAN

Zde je instalační kód, který budete potřebovat k inicializaci sběrnice CAN:

#zahrnout
#zahrnout

MCP2515 mcp2515(10); // Nastavení pinu CS

prázdnotazaložit(){
zatímco (!Seriál);
Seriál.začít(9600);
SPI.začít(); //Zahájí komunikaci SPI

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

Tím se inicializuje MCP2515 s bitovou rychlostí CAN 500 kb/s a frekvencí oscilátoru 8 MHz.

Provozní režimy MCP2515 CAN

S řadičem sběrnice CAN MCP2515 se používají tři provozní režimy:

  • setNormalMode(): nastaví ovladač na odesílání a přijímání zpráv.
  • setLoopbackMode(): nastaví ovladač tak, aby posílal a přijímal zprávy, ale zprávy, které odesílá, bude také přijímat sám.
  • setListenOnlyMode(): nastaví ovladač tak, aby pouze přijímal zprávy.

Jedná se o volání funkcí používané k nastavení provozního režimu řadiče sběrnice CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Odesílání dat přes sběrnici CAN

Chcete-li odeslat zprávu přes sběrnici CAN, použijte sendMsgBuf() metoda:

nepodepsanýchar data[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, data);

Tím se odešle zpráva s ID 0x01 a datové užitečné zatížení {0x01, 0x02, 0x03, 0x04}. Prvním parametrem je CAN ID, druhým je priorita zprávy, třetím je délka datové zátěže a čtvrtým je samotná datová zátěž.

The sendMsgBuf() metoda vrací hodnotu indikující, zda byla zpráva odeslána úspěšně nebo ne. Tuto hodnotu můžete zkontrolovat voláním checkError() metoda:

-li (CAN.checkError()) {
Seriál.println("Chyba při odesílání zprávy.");
}

To zkontroluje, zda během přenosu zprávy nedošlo k chybě, a v případě potřeby vytiskne chybovou zprávu.

Příjem dat ze sběrnice CAN

Chcete-li přijmout zprávu přes sběrnici CAN, můžete použít readMsgBuf() metoda:

nepodepsanýchar len = 0;
nepodepsanýchar buf[8];
nepodepsanýchar canID = 0;

-li (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}

To zkontroluje, zda je zpráva k dispozici na sběrnici CAN, a poté zprávu přečte do buf pole. Délka zprávy je uložena v len a ID zprávy je uloženo v canID variabilní.

Jakmile obdržíte zprávu, můžete zpracovat užitečné zatížení dat podle potřeby. Můžete například vytisknout datovou část na sériový monitor:

Seriál.tisk("Přijatá zpráva s ID");
Seriál.tisk(canID, HEX);
Seriál.tisk(" a údaje: ");

pro (int i = 0; i < len; i++) {
Seriál.tisk(buf[i], HEX);
Seriál.tisk(" ");
}

Seriál.println();

Toto vytiskne ID přijaté zprávy a datovou zátěž na sériový monitor.

Jak připojit CAN Bus Transceiver k Breadboardu

Chcete-li vytvořit sběrnici CAN pro připojení dvou zařízení v tomto příkladu projektu, budete potřebovat:

  • Dva mikrokontroléry (pro tento příklad dvě desky Arduino Nano)
  • Dva moduly MCP2515 CAN
  • Prkénko na krájení
  • Startovací dráty
  • Modul obrazovky I2C 16x2 LCD
  • Ultrazvukový senzor HC-SR04

Pro tento příklad projektu jsou ve skice Arduina použity čtyři knihovny. Je tam NewPing knihovna, která poskytuje snadno použitelné rozhraní pro ultrazvukový senzor a také Knihovna SPI, který usnadňuje komunikaci mezi deskou Arduino a řadičem sběrnice CAN MCP2515. The LiquidCrystal_I2C pro zobrazovací modul se používá knihovna.

Nakonec je tu Knihovna mcp2515 pro rozhraní s čipem MCP2515, což nám umožňuje snadno přenášet data přes síť CAN bus.

Nastavení hardwaru (příklad HC-SR04)

V tomto projektu využívajícím senzor HC-SR04 a LCD bude jedna deska Arduino Nano fungovat jako přijímač, zatímco druhá Arduino bude fungovat jako odesílatel. Připojte komponenty vašeho vysílače podle níže uvedeného schématu zapojení:

Zde je schéma obvodu přijímače:

Nakonec spojte dva uzly dohromady pomocí CAN_H a MŮŽU řádky, jak je znázorněno:

Při zapojování modulů je důležité zajistit, aby napájecí napětí bylo ve specifikovaném rozsahu a aby CAN H a MŮŽU piny jsou správně připojeny ke sběrnici.

Programování modulu MCP2515 CAN Bus

Pamatujte, že při programování modulu MCP2515 je důležité použít správnou přenosovou rychlost, aby byla zajištěna úspěšná komunikace s ostatními zařízeními CAN v síti.

Kód odesílatele:

#zahrnout
#zahrnout
#zahrnout

MCP2515 mcp2515(10);
konstbyte trigPin = 3;
konstbyte echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);

strukturovatcan_framecanMsg;

prázdnotazaložit(){
Seriál.začít(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

prázdnotasmyčka(){
nepodepsanýint vzdálenost = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN id jako 0x036
canMsg.can_dlc = 8; //Délka dat CAN jako 8
canMsg.data[0] = vzdálenost; //Aktualizujte hodnotu vlhkosti v [0]
canMsg.data[1] = 0x00; //Odpočívej všem s 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;

mcp2515.sendMessage(&canMsg);//Odešle zprávu CAN
zpoždění(100);
}

Kód přijímače:

#zahrnout
#zahrnout
#zahrnout

MCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
strukturovatcan_framecanMsg;

prázdnotazaložit(){
Seriál.začít(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.nastavitKurzor(0, 0);
lcd.tisk("TUTORIAL MUO CAN");
zpoždění(3000);
lcd.Průhledná();
}

prázdnotasmyčka(){
-li (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Pro příjem dat
{
int vzdálenost = canMsg.data[0];
lcd.nastavitKurzor(0,0);
lcd.tisk("Vzdálenost: ");
lcd.tisk(vzdálenost);
lcd.tisk("cm ");
}
}

Posuňte své Arduino projekty na další úroveň

Kombinace sběrnice CAN a Arduina poskytuje výkonnou platformu pro budování nebo učení sofistikovaných komunikačních sítí používaných v různých aplikacích. I když se to může zdát jako strmá křivka učení, vlastní nastavení na prkénku je docela šikovný způsob, jak se naučit používat síť CAN bus ve složitých projektech DIY.