Użyj tego niezawodnego protokołu komunikacji szeregowej, aby połączyć ze sobą dwie płyty Arduino i przesyłać między sobą dane.

Magistrala Controller Area Network (CAN) to solidny i niezawodny protokół komunikacyjny, który jest szeroko stosowany w różnych zastosowaniach przemysłowych, motoryzacyjnych i lotniczych. Przeznaczony jest do transmisji danych pomiędzy mikrokontrolerami i urządzeniami poprzez sieć magistrali CAN. Być może jeszcze tego nie wiesz, ale to właśnie kryje się za tymi szalonymi modami deski rozdzielczej samochodu, które widzisz w mediach społecznościowych.

Przeprowadzimy Cię przez proces budowy magistrali CAN z modułem CAN MCP2515 przy użyciu Arduino i płytki prototypowej. Omówimy również bibliotekę Arduino CAN i zademonstrujemy, jak wysyłać i odbierać dane przez magistralę CAN.

Co to jest magistrala CAN?

Magistrala CAN to protokół komunikacji szeregowej opracowany przez firmę Bosch w latach 80. Jest szeroko stosowany w różnych aplikacjach ze względu na wysoką niezawodność i solidność. Pozwala na transmisję danych pomiędzy urządzeniami z dużą prędkością przy minimalnym opóźnieniu przez zaledwie dwie linie: CAN High i CAN Low.

instagram viewer

W 1994 roku magistrala CAN stała się międzynarodowym standardem (ISO 11898), który został zaprojektowany specjalnie do szybkiej szeregowej wymiany danych między sterownikami elektronicznymi w zastosowaniach motoryzacyjnych. Zapoznaj się z naszym obszernym przewodnikiem dot czym jest magistrala CAN i jaką rolę pełni w systemach motoryzacyjnych po więcej szczegółów.

Jednym z powodów, dla których magistrala CAN jest tak popularna, są jej funkcje wykrywania i korygowania błędów. Protokół może wykrywać i korygować błędy w transmisji danych. Dzięki temu idealnie nadaje się do zastosowań, w których integralność danych ma kluczowe znaczenie, na przykład w automatyce przemysłowej.

Znajomość modułu CAN MCP2515

Moduł kontrolera magistrali CAN MCP2515 to urządzenie, które zapewnia wyjątkową obsługę szeroko stosowanego protokołu CAN w wersji 2.0B. Ten moduł jest idealny do komunikacji z dużą szybkością transmisji danych do 1 Mb/s.

MCP2515 IC to niezależny kontroler CAN z interfejsem SPI, który umożliwia komunikację z szeroką gamą mikrokontrolerów. Z drugiej strony układ scalony TJA1050 działa jako interfejs między układem scalonym kontrolera CAN MCP2515 a fizyczną magistralą CAN.

Dla dodatkowej wygody istnieje zworka, która umożliwia podłączenie zakończenia 120 omów, co jeszcze bardziej ułatwia podłączanie przewodów do CAN_H & CZY MOGĘ śruby do komunikacji z innymi modułami CAN.

Funkcja

Specyfikacja

nadajnik-odbiornik

TJA1050

Interfejs mikrokontrolera

SPI (pozwala na integrację magistrali Multi CAN)

Oscylator kwarcowy

8MHz

Zakończenie

120Ω

Prędkość

1 Mb/s

Pobór energii

Niskoprądowa praca w trybie gotowości

Wymiar

40x28mm

Pojemność węzła

Obsługuje do 112 węzłów

Dodatkowe informacje można uzyskać od Arkusz danych MCP2515 jeśli potrzebujesz tego modułu do bardziej zaawansowanego projektu.

Struktura komunikatów CAN

Struktura komunikatów CAN składa się z wielu segmentów, ale najbardziej krytycznymi segmentami dla tego projektu są identyfikator i dane. Identyfikator, znany również jako identyfikator CAN lub numer grupy parametrów (PGN), identyfikuje urządzenia w sieci CAN sieci, a długość identyfikatora może wynosić 11 lub 29 bitów, w zależności od typu protokołu CAN używany.

Tymczasem dane reprezentują rzeczywiste przesyłane dane czujnika/sterowania. Dane mogą mieć długość od 0 do 8 bajtów, a kod długości danych (DLC) wskazuje liczbę obecnych bajtów danych.

Biblioteka magistrali CAN Arduino MCP2515

Ta biblioteka implementuje Protokół CAN V2.0B, który może działać z prędkością do 1 Mb/s. Zapewnia interfejs SPI, który może działać z prędkością do 10 MHz, obsługując zarówno standardowe (11-bitowe), jak i rozszerzone (29-bitowe) dane. Co więcej, jest wyposażony w dwa bufory odbiorcze, które umożliwiają przechowywanie wiadomości z priorytetami.

Inicjalizacja magistrali CAN

Oto kod konfiguracyjny potrzebny do zainicjowania magistrali CAN:

#włączać
#włączać

MCP2515 mcp2515(10); // Ustaw pinezkę CS

próżniaorganizować coś(){
chwila (!Seryjny);
Seryjny.zaczynać(9600);
SPI.zaczynać(); //Rozpoczyna komunikację SPI

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

Spowoduje to inicjalizację MCP2515 z przepływnością CAN 500 Kb/s i częstotliwością oscylatora 8 MHz.

Tryby pracy CAN MCP2515

Istnieją trzy tryby pracy używane z kontrolerem magistrali CAN MCP2515:

  • ustawTryb Normalny(): ustawia kontroler do wysyłania i odbierania wiadomości.
  • setLoopbackMode(): ustawia kontroler do wysyłania i odbierania wiadomości, ale wysyłane przez niego wiadomości będą również odbierane przez niego.
  • setListenOnlyMode(): ustawia kontroler tak, aby odbierał tylko wiadomości.

Są to wywołania funkcji służące do ustawienia trybu pracy kontrolera magistrali CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Przesyłanie danych przez magistralę CAN

Aby wysłać wiadomość przez magistralę CAN, użyj sendMsgBuf() metoda:

niepodpisanyzwęglać dane[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, dane);

Spowoduje to wysłanie wiadomości z identyfikatorem 0x01 i ładunek danych w wysokości {0x01, 0x02, 0x03, 0x04}. Pierwszym parametrem jest identyfikator CAN, drugim priorytet wiadomości, trzecim długość ładunku danych, a czwartym sam ładunek danych.

The sendMsgBuf() metoda zwraca wartość wskazującą, czy wiadomość została wysłana pomyślnie, czy nie. Możesz sprawdzić tę wartość, wywołując błąd sprawdzania() metoda:

Jeśli (CAN.checkError()) {
Seryjny.println(„Błąd podczas wysyłania wiadomości”.);
}

Sprawdza, czy podczas przesyłania wiadomości wystąpił błąd iw razie potrzeby drukuje komunikat o błędzie.

Odbieranie danych z magistrali CAN

Aby odebrać wiadomość przez magistralę CAN, możesz użyć readMsgBuf() metoda:

niepodpisanyzwęglać długość = 0;
niepodpisanyzwęglać buf[8];
niepodpisanyzwęglać canID = 0;

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

To sprawdza, czy komunikat jest dostępny na magistrali CAN, a następnie wczytuje komunikat do buf szyk. Długość wiadomości jest przechowywana w pliku Len zmienna, a identyfikator wiadomości jest przechowywany w pliku canID zmienny.

Po otrzymaniu wiadomości możesz przetworzyć ładunek danych zgodnie z potrzebami. Na przykład możesz wydrukować ładunek danych na monitorze szeregowym:

Seryjny.wydrukować(„Otrzymano wiadomość z identyfikatorem”);
Seryjny.wydrukować(ID puszki, szesnastkowy);
Seryjny.wydrukować(" i dane: ");

Do (int ja = 0; ja < długość; i++) {
Seryjny.wydrukować(buf[i], HEX);
Seryjny.wydrukować(" ");
}

Seryjny.println();

Spowoduje to wydrukowanie identyfikatora odebranej wiadomości i ładunku danych na monitorze szeregowym.

Jak podłączyć nadajnik-odbiornik magistrali CAN do płytki prototypowej

Aby zbudować magistralę CAN do połączenia dwóch urządzeń w tym przykładowym projekcie, będziesz potrzebować:

  • Dwa mikrokontrolery (w tym przykładzie dwie płyty Arduino Nano)
  • Dwa moduły CAN MCP2515
  • Deska do krojenia chleba
  • Przewody rozruchowe
  • Moduł ekranu LCD I2C 16x2
  • Czujnik ultradźwiękowy HC-SR04

W tym przykładzie projektu w szkicu Arduino używane są cztery biblioteki. Jest NowyPing biblioteka, która zapewnia łatwy w użyciu interfejs dla czujnika ultradźwiękowego, a także biblioteka SPI, co ułatwia komunikację pomiędzy płytką Arduino a kontrolerem magistrali CAN MCP2515. The LiquidCrystal_I2C biblioteka jest używana dla modułu wyświetlacza.

Wreszcie jest biblioteka mcp2515 do interfejsu z chipem MCP2515, co pozwala nam łatwo przesyłać dane przez sieć magistrali CAN.

Konfiguracja sprzętu (przykład HC-SR04)

W tym projekcie wykorzystującym czujnik HC-SR04 i wyświetlacz LCD, jedna płytka Arduino Nano będzie działać jako odbiornik, a druga jako nadajnik. Podłącz komponenty nadajnika zgodnie z poniższym schematem elektrycznym:

Oto schemat obwodu odbiornika:

Na koniec połącz ze sobą dwa węzły za pomocą CAN_H I CZY MOGĘ linie jak pokazano:

Podczas podłączania modułów należy upewnić się, że napięcie zasilania mieści się w określonym zakresie i że CAN H I CZY MOGĘ piny są prawidłowo podłączone do magistrali.

Programowanie modułu magistrali CAN MCP2515

Należy pamiętać, że podczas programowania modułu MCP2515 ważne jest, aby użyć odpowiedniej przepływności, aby zapewnić pomyślną komunikację z innymi urządzeniami CAN w sieci.

Kod nadawcy:

#włączać
#włączać
#włączać

MCP2515 mcp2515(10);
konstbajt pin wyzwalający = 3;
konstbajt echoPin = 4;
NowyPing sonar(TrigPin, echoPin, 200);

strukturacan_framepuszkaWiadomość;

próżniaorganizować coś(){
Seryjny.zaczynać(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

próżniapętla(){
niepodpisanyint odległość = sonar.ping_cm();
canMsg. can_id = 0x036; // Identyfikator CAN jako 0x036
canMsg.can_dlc = 8; //Długość danych CAN jako 8
canMsg.data[0] = odległość; //Zaktualizuj wartość wilgotności w [0]
canMsg.data[1] = 0x00; // Reszta z 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);//Wysyła komunikat CAN
opóźnienie(100);
}

Kod odbiornika:

#włączać
#włączać
#włączać

MCP2515 mcp2515(10);
LiquidCrystal_I2C LCD(0x27,16,2);
strukturacan_framepuszkaWiadomość;

próżniaorganizować coś(){
Seryjny.zaczynać(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
podświetlenie LCD();
LCD.ustaw Kursor(0, 0);
LCD.wydrukować(„PRZEWODNIK MUO CAN”);
opóźnienie(3000);
LCD.jasne();
}

próżniapętla(){
Jeśli (mcp2515.czytać wiadomość(&canMsg) == MCP2515::ERROR_OK) // Aby odebrać dane
{
int odległość = canMsg.data[0];
LCD.ustaw Kursor(0,0);
LCD.wydrukować("Dystans: ");
LCD.wydrukować(dystans);
LCD.wydrukować("cm ");
}
}

Przenieś swoje projekty Arduino na wyższy poziom

Połączenie magistrali CAN i Arduino zapewnia potężną platformę do budowy lub nauki zaawansowanych sieci komunikacyjnych wykorzystywanych w różnych aplikacjach. Choć może się to wydawać stromą krzywą uczenia się, posiadanie własnej konfiguracji na płytce prototypowej jest całkiem wygodnym sposobem na poznanie zasad korzystania z sieci magistrali CAN w złożonych projektach typu „zrób to sam”.