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.
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”.