- Wprowadzenie do CAN
- Porównanie CAN przez SPI i I2C
- Aplikacje protokołu CAN
- Jak korzystać z protokołu CAN w Arduino
- Wymagane składniki
- Schemat obwodu
- Połączenie między dwoma modułami CAN MCP2515
- Programowanie Arduino do komunikacji CAN
- Objaśnienie kodu bocznego nadajnika CAN (Arduino Nano)
- Objaśnienie kodu strony odbiornika CAN (Arduino UNO)
- Działanie komunikacji CAN w Arduino
Obecnie każdy przeciętny samochód składa się z około 60 do 100 czujników do wykrywania i wymiany informacji. Ponieważ producenci samochodów stale ulepszają swój samochód dzięki takim funkcjom, jak jazda autonomiczna, system poduszek powietrznych, monitorowanie ciśnienia w oponach, tempomat itp., Oczekuje się, że liczba ta wzrośnie. W przeciwieństwie do innych czujników, czujniki te przetwarzają krytyczne informacje, a zatem dane z tych czujników powinny być przesyłane za pomocą standardowych protokołów komunikacji samochodowej. Na przykład dane z układu tempomatu, takie jak prędkość, położenie przepustnicy itp., Są ważnymi wartościami, które są wysyłane do elektronicznej jednostki sterującej (ECU)Aby zdecydować o poziomie przyspieszenia samochodu, błąd komunikacji lub utrata danych może prowadzić do krytycznych awarii. Dlatego w przeciwieństwie do standardowych protokołów komunikacyjnych, takich jak UART, SPI lub I2C, projektanci używają bardzo niezawodnych protokołów komunikacji samochodowej, takich jak LIN, CAN, FlexRay itp.
Spośród wszystkich dostępnych protokołów, CAN jest najczęściej używany i popularny. Omówiliśmy już, czym jest CAN i jak działa CAN. Tak więc w tym artykule ponownie przyjrzymy się podstawom, a na koniec będziemy również wymieniać dane między dwoma Arduino za pomocą komunikacji CAN. Brzmi interesująco, prawda! Więc zacznijmy.
Wprowadzenie do CAN
CAN, czyli Controller Area Network to szeregowa magistrala komunikacyjna przeznaczona do zastosowań przemysłowych i motoryzacyjnych. Jest to protokół komunikacyjny używany do komunikacji między wieloma urządzeniami. Kiedy wiele urządzeń CAN jest połączonych razem, jak pokazano poniżej, połączenie tworzy sieć działającą jak nasz centralny układ nerwowy, umożliwiając dowolnemu urządzeniu komunikowanie się z dowolnym innym urządzeniem w węźle.
Sieci mogą się składać z tylko dwóch przewodów CAN wysoki i Low do dwukierunkowej transmisji danych, jak podano powyżej. Zwykle prędkość komunikacji dla CAN wynosi od 50 Kb / s do 1 Mb / s, a odległość może wynosić od 40 m przy 1 Mb / s do 1000 m przy 50 kb / s.
Format wiadomości CAN:
W komunikacji CAN dane są przesyłane w sieci jako określony format wiadomości. Ten format wiadomości zawiera wiele segmentów, ale dwa główne segmenty to identyfikator i dane, które pomagają w wysyłaniu i odpowiadaniu na komunikaty w magistrali CAN.
Identyfikator lub identyfikator CAN: Identyfikator jest również znany jako identyfikator CAN lub znany również jako PGN (numer grupy parametrów). Służy do identyfikacji urządzeń CAN obecnych w sieci CAN. Długość identyfikatora wynosi 11 lub 29 bitów w zależności od typu używanego protokołu CAN.
Standardowy CAN: 0-2047 (11-bitowy)
Rozszerzony umożliwia: 0-2 : 29 1 (29-bitowy)
Dane: są to rzeczywiste dane czujnika / sterowania, które należy przesłać z jednego urządzenia do drugiego. Dane rozmiaru mogą mieć dowolną długość od 0 do 8 bajtów.
Kod długości danych (DLC): od 0 do 8 dla liczby obecnych bajtów danych.
Przewody używane w CAN:
Protokół CAN składa się z dwóch przewodów, mianowicie CAN_H i CAN_L do wysyłania i odbierania informacji. Oba przewody działają jako linia różnicowa, co oznacza, że sygnał CAN (0 lub 1) jest reprezentowany przez różnicę potencjałów między CAN_L i CAN_H. Jeśli różnica jest dodatnia i większa niż pewne minimalne napięcie, to wynosi 1, a jeśli różnica jest ujemna, wynosi 0.
Zwykle do komunikacji CAN używana jest skrętka dwużyłowa. Pojedynczy rezystor 120 omów jest zwykle używany na dwóch końcach sieci CAN, jak pokazano na ilustracji, ponieważ linia musi być zbalansowana i połączona z tym samym potencjałem.
Porównanie CAN przez SPI i I2C
Ponieważ nauczyliśmy się już używać SPI z Arduino i IIC z Arduino, porównajmy funkcje SPI i I2C z CAN
Parametr | SPI | I2C | MOGĄ |
Prędkość | 3 Mb / s do 10 Mb / s | Standardowo: 100 kb / s | 10KBps do 1MBps Zależy również od długości używanego przewodu |
Szybka: 400 Kb / s | |||
Wysoka prędkość: 3,4 Mb / s | |||
Rodzaj | Synchroniczny | Synchroniczny | Asynchroniczny |
Liczba przewodów | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 przewody (SDA, SCL) | 2 przewody (CAN_H, CAN_L) |
Dupleks | Pełny dupleks | Half Duplex | Half Duplex |
Aplikacje protokołu CAN
- Ze względu na solidność i niezawodność protokołu CAN są wykorzystywane w branżach takich jak motoryzacja, maszyny przemysłowe, rolnictwo, sprzęt medyczny itp.
- Ponieważ złożoność okablowania w CAN jest zmniejszona, są one używane głównie w zastosowaniach motoryzacyjnych, takich jak samochody.
- Niski koszt wdrożenia, a także cena komponentów sprzętowych jest również niższa.
- Łatwe dodawanie i usuwanie urządzeń magistrali CAN.
Jak korzystać z protokołu CAN w Arduino
Ponieważ Arduino nie zawiera żadnego wbudowanego portu CAN, używany jest moduł CAN o nazwie MCP2515. Ten moduł CAN jest połączony z Arduino za pomocą komunikacji SPI. Zobaczmy więcej szczegółów na temat MCP2515 i tego, jak jest on połączony z Arduino.
Moduł CAN MCP2515:
Moduł MCP2515 posiada kontroler CAN MCP2515, który jest szybkim transceiverem CAN. Połączenie między MCP2515 a MCU odbywa się za pośrednictwem SPI. Dzięki temu łatwo jest współpracować z dowolnym mikrokontrolerem posiadającym interfejs SPI.
Dla początkujących, którzy chcą nauczyć się magistrali CAN, ten moduł będzie dobrym początkiem. Ta płyta CAN SPI jest idealna do automatyki przemysłowej, automatyki domowej i innych wbudowanych projektów motoryzacyjnych.
Funkcje i specyfikacja MCP2515:
- Wykorzystuje szybki transceiver CAN TJA1050
- Wymiar: 40 × 28 mm
- Sterowanie SPI dla rozszerzenia interfejsu Multi CAN bus
- Oscylator kwarcowy 8 MHZ
- Rezystancja zacisków 120Ω
- Posiada niezależny klawisz, wskaźnik LED, wskaźnik zasilania
- Obsługuje 1 Mb / s CAN
- Niski prąd w trybie gotowości
- Można podłączyć do 112 węzłów
Pinout modułu CAN MCP2515:
Nazwa pinu |
POSŁUGIWAĆ SIĘ |
VCC |
Pin wejściowy zasilania 5 V. |
GND |
Kołek uziemiający |
CS |
Pin wyboru SPI SLAVE (aktywny niski) |
WIĘC |
Przewód wyjściowy slave wejścia master SPI |
SI |
Przewód wejściowy Slave wyjścia master SPI |
SCLK |
Pin zegara SPI |
INT |
Pin przerwania MCP2515 |
W tym samouczku zobaczmy, jak przesłać dane czujnika wilgotności i temperatury (DHT11) z Arduino Nano do Arduino Uno za pośrednictwem modułu magistrali CAN MCP2515.
Wymagane składniki
- Arduino UNO
- Arduino NANO
- DHT11
- Wyświetlacz LCD 16x2
- Moduł CAN MCP2515 - 2
- Potencjometr 10 k
- Płytka prototypowa
- Podłączanie przewodów
Schemat obwodu
Połączenie po stronie nadajnika CAN:
Komponent - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - WYJŚCIE |
A0 |
Połączenia obwodów po stronie odbiornika CAN:
Komponent - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Do 10K środkowego kodu PIN potencjometru |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E. |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K. |
GND |
Połączenie między dwoma modułami CAN MCP2515
H - CAN Wysoka
L - CAN niski
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H. |
H. |
L |
L |
Po wykonaniu wszystkich połączeń mój sprzęt wyglądał tak poniżej
Programowanie Arduino do komunikacji CAN
Najpierw musimy zainstalować bibliotekę dla CAN w Arduino IDE. Połączenie modułu CAN MCP2515 z Arduino staje się łatwiejsze dzięki zastosowaniu poniższej biblioteki.
- Pobierz plik ZIP biblioteki Arduino CAN MCP2515.
- Z Arduino IDE: Szkic -> Dołącz bibliotekę -> Dodaj bibliotekę.ZIP
W tym samouczku kodowanie jest podzielone na dwie części, jedną jako kod nadajnika CAN (Arduino Nano), a drugą jako kod odbiornika CAN (Arduino UNO), z których obie można znaleźć na dole tej strony. Wyjaśnienie tego samego jest następujące.
Przed napisaniem programu do wysyłania i odbierania danych upewnij się, że zainstalowałeś bibliotekę postępując zgodnie z powyższymi krokami, a moduł CAN MCP2515 jest zainicjowany w programie w następujący sposób.
Zainicjuj moduł CAN MCP2515:
Aby utworzyć połączenie z MCP2515, wykonaj następujące kroki:
1. Ustaw numer pinu, do którego podłączony jest SPI CS (domyślnie 10)
MCP2515 mcp2515 (10);
2. Ustaw prędkość transmisji i częstotliwość oscylatora
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Dostępne szybkości transmisji:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_50KBPS, CAN_200KBPS, CAN_50KBPS.
Dostępne szybkości zegara:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Ustaw tryby.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Objaśnienie kodu bocznego nadajnika CAN (Arduino Nano)
W sekcji nadajnika Arduino Nano jest połączony z modułem MCP2515 CAN poprzez piny SPI, a DHT11 wysyła dane dotyczące temperatury i wilgotności do magistrali CAN.
Najpierw dołączane są wymagane biblioteki, biblioteka SPI do korzystania z komunikacji SPI, biblioteka MCP2515 do korzystania z komunikacji CAN i biblioteka DHT do korzystania z czujnika DHT z Arduino . Wcześniej połączyliśmy DHT11 z Arduino.
#zawierać
Teraz zdefiniowana jest nazwa pinu DHT11 (pin OUT), który jest połączony z A0 Arduino Nano
# zdefiniować DHTPIN A0
Ponadto DHTTYPE jest zdefiniowany jako DHT11.
# zdefiniować DHTTYPE DHT11
A canMsg struct typ danych do przechowywania format wiadomości CAN.
struct can_frame canMsg;
Ustaw numer pinu, do którego podłączony jest SPI CS (domyślnie 10)
MCP2515 mcp2515 (10);
Inicjalizowany jest również obiekt dht dla klasy DHT z pinem DHT z Arduino Nano i typem DHT jako DHT11.
DHT dht (DHTPIN, DHTTYPE);
Dalej w void setup ():
Rozpocznij komunikację SPI, używając poniższej instrukcji
SPI.begin ();
Następnie użyj poniższego oświadczenia, aby rozpocząć odbieranie wartości temperatury i wilgotności z czujnika DHT11.
dht.begin ();
Następnie MCP2515 jest resetowany za pomocą następującego polecenia
mcp2515.reset ();
Teraz MCP2515 ma ustawioną prędkość 500KBPS i 8MHz jako zegar
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 jest ustawiony w trybie normalnym
mcp2515.setNormalMode ();
W void loop ():
Poniższa instrukcja pobiera wartość wilgotności i temperatury i przechowuje w zmiennej całkowitej h i t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Następnie CAN ID jest podawany jako 0x036 (zgodnie z wyborem), a DLC jako 8, a my podajemy dane hi t do danych i danych, a wszystkie dane ustawiamy na 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Zaktualizuj wartość wilgotności w canMsg.data = t; // Zaktualizuj wartość temperatury w canMsg.data = 0x00; // Odpocznij wszystko z 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Wszakże do wysłania wiadomości na CAN BUS używamy następującego oświadczenia.
mcp2515.sendMessage (& canMsg);
Więc teraz dane dotyczące temperatury i wilgotności są wysyłane jako komunikat do magistrali CAN.
Objaśnienie kodu strony odbiornika CAN (Arduino UNO)
W sekcji odbiornika Arduino UNO współpracował z wyświetlaczem LCD MCP2515 i 16x2. Tutaj Arduino UNO odbiera temperaturę i wilgotność z magistrali CAN i wyświetla dane otrzymane na wyświetlaczu LCD.
Najpierw dołączane są wymagane biblioteki, biblioteka SPI do korzystania z komunikacji SPI, biblioteka MCP2515 do korzystania z komunikacji CAN i biblioteka LiquidCrsytal do korzystania z wyświetlacza LCD 16x2 z Arduino .
#zawierać
Następnie definiowane są piny LCD, które są używane do łączenia się z Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Struct typ danych jest zgłaszana do przechowywania format wiadomości CAN.
struct can_frame canMsg;
Ustaw numer pinu, do którego podłączony jest SPI CS (domyślnie 10)
MCP2515 mcp2515 (10);
W void setup ():
Najpierw wyświetlacz LCD jest ustawiony na tryb 16x2 i pojawia się komunikat powitalny.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("PRZEGLĄD OBWODU"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); opóźnienie (3000); lcd.clear ();
Rozpocznij komunikację SPI, używając poniższej instrukcji.
SPI.begin ();
Następnie MCP2515 jest resetowany za pomocą następującego polecenia.
mcp2515.reset ();
Teraz MCP2515 ma ustawioną prędkość 500KBPS i 8MHz jako zegar.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
A MCP2525 jest ustawiony w trybie normalnym.
mcp2515.setNormalMode ();
Dalej w void loop ():
Poniższa instrukcja służy do odbierania wiadomości z magistrali CAN. Jeśli wiadomość zostanie odebrana, przechodzi do warunku if .
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
W warunkach if dane są odbierane i przechowywane w c anMsg , dane zawierające wartość wilgotności i dane, które mają wartość temperatury. Obie wartości są przechowywane jako liczby całkowite x i y.
int x = canMsg.data; int y = canMsg.data;
Po otrzymaniu wartości wartości temperatury i wilgotności wyświetlane są na wyświetlaczu LCD 16x2 zgodnie z poniższym stwierdzeniem.
lcd.setCursor (0,0); lcd.print ("Wilgotność:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); opóźnienie (1000); lcd.clear ();
Działanie komunikacji CAN w Arduino
Gdy sprzęt będzie gotowy, załaduj program dla nadajnika CAN i odbiornika CAN (kompletne programy są podane poniżej) na odpowiednich płytkach Arduino. Po zasileniu należy zauważyć, że wartość temperatury odczytana przez DHT11 zostanie wysłana do innego Arduino poprzez komunikację CAN i wyświetlona na wyświetlaczu LCD drugiego Arduino, jak widać na poniższym obrazku. Użyłem również pilota AC, aby sprawdzić, czy temperatura wyświetlana na wyświetlaczu LCD jest zbliżona do rzeczywistej temperatury w pomieszczeniu.
Pełną pracę można znaleźć w poniższym filmie wideo. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy lub skorzystaj z naszych forów, aby uzyskać odpowiedzi na inne pytania techniczne.