- Pengantar CAN
- Perbandingan CAN atas SPI & I2C
- CAN Protokol Aplikasi
- Cara menggunakan protokol CAN di Arduino
- Komponen Diperlukan
- Diagram Sirkuit
- Koneksi antara dua modul CAN MCP2515
- Pemrograman Arduino untuk komunikasi CAN
- Penjelasan Kode Samping CAN Transmitter (Arduino Nano)
- CAN Receiver Penjelasan Kode Samping (Arduino UNO)
- Cara kerja komunikasi CAN di Arduino
Saat ini setiap mobil rata-rata terdiri dari sekitar 60 hingga 100 unit sensor di dalamnya untuk merasakan dan bertukar informasi. Dengan pabrikan mobil yang terus-menerus membuat mobil mereka lebih pintar dengan fitur-fitur seperti Autonomous driving, sistem Airbag, pemantauan Tekanan Ban, sistem kontrol Cruise, dll. Angka ini diharapkan akan meningkat. Tidak seperti sensor lain, sensor ini memproses informasi penting dan karenanya data dari sensor ini harus dikomunikasikan menggunakan protokol komunikasi otomotif standar. Misalnya, data sistem kendali jelajah seperti kecepatan, posisi throttle dll adalah nilai vital yang dikirim ke Unit Kontrol Elektronik (ECU)untuk menentukan tingkat akselerasi mobil, miskomunikasi atau hilangnya data di sini dapat menyebabkan kegagalan kritis. Karenanya tidak seperti protokol komunikasi standar seperti UART, SPI atau I2C, desainer menggunakan protokol komunikasi mobil yang sangat andal seperti LIN, CAN, FlexRay, dll.
Dari semua protokol yang tersedia, CAN lebih banyak digunakan dan populer. Kami telah membahas apa itu CAN dan bagaimana BISA bekerja. Jadi, pada artikel ini kita akan melihat dasar-dasarnya lagi dan akhirnya kita juga akan bertukar data antara dua Arduino menggunakan komunikasi CAN. Kedengarannya menarik bukan! Jadi, mari kita mulai.
Pengantar CAN
CAN alias Controller Area Network adalah bus komunikasi serial yang dirancang untuk aplikasi industri dan otomotif. Ini adalah protokol berbasis pesan yang digunakan untuk komunikasi antara beberapa perangkat. Ketika beberapa perangkat CAN dihubungkan bersama seperti yang ditunjukkan di bawah ini, koneksi membentuk jaringan yang bertindak seperti sistem saraf pusat kami yang memungkinkan perangkat apa pun untuk berbicara dengan perangkat lain di node.
Sebuah BISA Jaringan akan terdiri dari hanya dua kabel CAN Tinggi dan CAN Rendah untuk transmisi data bi-directional seperti yang ditunjukkan di atas. Biasanya kecepatan komunikasi CAN berkisar dari 50 Kbps hingga 1Mbps dan jarak dapat berkisar dari 40 meter pada 1Mbps hingga 1000 meter pada 50kpbs.
Format Pesan CAN:
Dalam komunikasi CAN, data dikirim dalam jaringan sebagai format pesan tertentu. Format pesan ini berisi banyak segmen tetapi dua segmen utama adalah pengenal dan data yang membantu untuk mengirim dan menanggapi pesan di bus CAN.
Identifier atau CAN ID: Pengenal ini juga dikenal sebagai CAN ID atau disebut juga PGN (Parameter Group Number). Ini digunakan untuk mengidentifikasi perangkat CAN yang ada di jaringan CAN. Panjang pengenal adalah 11 atau 29 bit berdasarkan jenis protokol CAN yang digunakan.
Standar BISA: 0-2047 (11-bit)
Extended CAN: 0-2 29 -1 (29-bit)
Data: Ini adalah data sensor / kontrol aktual yang harus dikirim dari satu perangkat ke perangkat lainnya. Ukuran data dapat berkisar dari 0 hingga 8 byte.
Kode Panjang Data (DLC): 0 hingga 8 untuk jumlah byte data yang ada.
Kabel yang digunakan di CAN:
Protokol CAN terdiri dari dua kabel yaitu CAN_H dan CAN_L untuk mengirim dan menerima informasi. Kedua kabel tersebut bertindak sebagai garis diferensial, yang berarti sinyal CAN (0 atau 1) diwakili oleh perbedaan potensial antara CAN_L dan CAN_H. Jika perbedaannya positif dan lebih besar dari tegangan minimum tertentu maka itu adalah 1 dan jika perbedaannya negatif itu adalah 0.
Biasanya kabel twisted pair digunakan untuk komunikasi CAN. Sebuah resistor 120-ohm tunggal umumnya digunakan di kedua ujung jaringan CAN seperti yang ditunjukkan pada gambar, ini karena garis perlu diseimbangkan dan diikat ke potensial yang sama.
Perbandingan CAN atas SPI & I2C
Karena kita sudah mempelajari cara menggunakan SPI dengan Arduino dan IIC dengan Arduino, mari kita bandingkan fitur SPI dan I2C dengan CAN
Parameter | SPI | I2C | BISA |
Kecepatan | 3Mbps hingga 10Mbps | Standar: 100Kbps | 10KBps hingga 1MBps Juga tergantung pada panjang kabel yang digunakan |
Cepat: 400 Kbps | |||
Kecepatan tinggi: 3.4Mbps | |||
Tipe | Sinkronis | Sinkronis | Asinkron |
Jumlah Kabel | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 kabel (SDA, SCL) | 2 kabel (CAN_H, CAN_L) |
Rangkap | Dupleks Penuh | Half Duplex | Half Duplex |
CAN Protokol Aplikasi
- Karena kekokohan dan keandalan protokol CAN, mereka digunakan dalam industri seperti Otomotif, mesin Industri, Pertanian, Peralatan Medis, dll.
- Karena kompleksitas kabel berkurang di CAN, kabel ini terutama digunakan dalam aplikasi otomotif seperti mobil.
- Biaya implementasi yang rendah dan harga komponen perangkat keras juga lebih murah.
- Mudah untuk menambah dan menghapus perangkat bus CAN.
Cara menggunakan protokol CAN di Arduino
Karena Arduino tidak berisi port CAN bawaan, modul CAN yang disebut MCP2515 digunakan. Modul CAN ini dihubungkan dengan Arduino dengan menggunakan komunikasi SPI. Mari kita lihat lebih lanjut tentang MCP2515 secara rinci dan bagaimana itu dihubungkan dengan Arduino.
Modul BISA MCP2515:
Modul MCP2515 memiliki pengontrol CAN MCP2515 yang merupakan transceiver CAN berkecepatan tinggi. Hubungan antara MCP2515 dan MCU melalui SPI. Jadi, mudah untuk berinteraksi dengan mikrokontroler yang memiliki antarmuka SPI.
Untuk pemula yang ingin mempelajari CAN Bus, modul ini akan menjadi awal yang baik. Papan CAN SPI ini sangat ideal untuk otomasi industri, otomasi rumah, dan proyek tertanam otomotif lainnya.
Fitur dan Spesifikasi MCP2515:
- Menggunakan kecepatan tinggi transceiver CAN TJA1050
- Dimensi: 40 × 28mm
- Kontrol SPI untuk memperluas antarmuka bus Multi CAN
- Osilator kristal 8MHZ
- Resistensi terminal 120Ω
- Memiliki kunci independen, indikator LED, indikator Daya
- Mendukung operasi CAN 1 Mb / s
- Operasi siaga arus rendah
- Hingga 112 node dapat dihubungkan
Pinout dari Modul CAN MCP2515:
Nama Pin |
MENGGUNAKAN |
VCC |
5V Pin masukan daya |
GND |
Pin tanah |
CS |
Pin pilih SPI SLAVE (Aktif rendah) |
BEGITU |
SPI master input slave output lead |
SI |
Kabel masukan budak keluaran master SPI |
SCLK |
Pin Jam SPI |
INT |
Pin interupsi MCP2515 |
Dalam tutorial ini mari kita lihat cara mengirim data sensor kelembaban & suhu (DHT11) dari Arduino Nano ke Arduino Uno melalui modul bus CAN MCP2515.
Komponen Diperlukan
- Arduino UNO
- Arduino NANO
- DHT11
- Layar LCD 16x2
- MCP2515 CAN Module - 2
- Potensiometer 10k
- Papan tempat memotong roti
- Menghubungkan Kabel
Diagram Sirkuit
Koneksi di sisi CAN Transmitter:
Komponen - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - BEGITU |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - KELUAR |
A0 |
Koneksi Sirkuit di CAN Receiver side:
Komponen - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - BEGITU |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Ke PIN Pusat Potensiometer 10K |
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 |
Koneksi antara dua modul CAN MCP2515
H - CAN High
L - CAN Low
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H. |
H. |
L |
L |
Setelah semua koneksi dibuat, perangkat keras saya terlihat seperti ini di bawah
Pemrograman Arduino untuk komunikasi CAN
Pertama kita harus menginstal perpustakaan untuk CAN di Arduino IDE. Interfacing Modul CAN MCP2515 dengan Arduino menjadi lebih mudah dengan menggunakan perpustakaan berikut.
- Unduh file ZIP dari Arduino CAN MCP2515 Library.
- Dari Arduino IDE: Sketch -> Include Library -> Add.ZIP Library
Dalam tutorial ini pengkodean dibagi menjadi dua bagian satu sebagai kode pemancar CAN (Arduino Nano) dan lainnya sebagai kode Penerima CAN (Arduino UNO) yang keduanya dapat ditemukan di bagian bawah halaman ini. Penjelasannya adalah sebagai berikut.
Sebelum menulis program untuk mengirim dan menerima data, pastikan Anda telah menginstal pustaka mengikuti langkah-langkah di atas dan modul CAN MCP2515 diinisialisasi dalam program Anda sebagai berikut.
Inisialisasi Modul CAN MCP2515:
Untuk membuat koneksi dengan MCP2515 ikuti langkah-langkah:
1. Atur nomor pin di mana SPI CS terhubung (10 secara default)
MCP2515 mcp2515 (10);
2. Atur kecepatan baud dan frekuensi osilator
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Tarif Baud yang Tersedia:
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_250KBPS, CAN_200KBPS, CAN_250KBPS
Kecepatan Jam yang Tersedia:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Atur mode.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Penjelasan Kode Samping CAN Transmitter (Arduino Nano)
Di bagian pemancar, Arduino Nano dihubungkan dengan modul CAN MCP2515 melalui pin SPI dan DHT11 mengirimkan data Suhu dan Kelembaban ke bus CAN.
Pertama perpustakaan yang dibutuhkan disertakan, Perpustakaan SPI untuk menggunakan Komunikasi SPI, Perpustakaan MCP2515 untuk menggunakan Komunikasi CAN dan Perpustakaan DHT untuk menggunakan sensor DHT dengan Arduino . Kami sebelumnya menghubungkan DHT11 dengan Arduino.
#include
Sekarang nama pin DHT11 (pin OUT) yang terhubung dengan A0 dari Arduino Nano telah ditentukan
# Tentukan DHTPIN A0
Dan juga, DHTTYPE didefinisikan sebagai DHT11 .
# Tentukan DHTTYPE DHT11
Sebuah canMsg struct tipe data untuk menyimpan format pesan CAN.
struct can_frame canMsg;
Atur nomor pin di mana SPI CS terhubung (10 secara default)
MCP2515 mcp2515 (10);
Dan juga objek dht untuk kelas DHT dengan pin DHT dengan tipe Arduino Nano dan DHT sebagai DHT11 diinisialisasi.
DHT dht (DHTPIN, DHTTYPE);
Berikutnya dalam penyiapan void ():
Mulailah komunikasi SPI dengan menggunakan pernyataan berikut
SPI. Mulai ();
Dan kemudian gunakan pernyataan di bawah ini untuk mulai menerima nilai Suhu dan kelembaban dari sensor DHT11.
dht.begin ();
Selanjutnya MCP2515 sedang RESET menggunakan perintah berikut
mcp2515.reset ();
Sekarang MCP2515 mengatur kecepatan 500KBPS dan 8MHZ sebagai jam
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Dan MCP2525 diatur pada mode normal
mcp2515.setNormalMode ();
Di loop kosong ():
Pernyataan berikut mendapatkan nilai Kelembaban dan Suhu dan disimpan dalam variabel integer h dan t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Selanjutnya CAN ID diberikan sebagai 0x036 (Sesuai pilihan) dan DLC sebagai 8 dan kami memberikan data h dan t ke data dan data dan sisanya semua data dengan 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Perbarui nilai kelembapan di canMsg.data = t; // Perbarui nilai suhu di canMsg.data = 0x00; // Istirahatkan semuanya dengan 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
Bagaimanapun, untuk mengirim pesan ke CAN BUS kami menggunakan pernyataan berikut.
mcp2515.sendMessage (& canMsg);
Jadi sekarang data suhu dan kelembaban dikirim sebagai pesan ke CAN bus.
CAN Receiver Penjelasan Kode Samping (Arduino UNO)
Di bagian penerima, Arduino UNO dihubungkan dengan MCP2515 dan layar LCD 16x2. Di sini Arduino UNO menerima Suhu dan Kelembaban dari CAN bus dan menampilkan data yang diterima dalam LCD.
Pertama perpustakaan yang dibutuhkan disertakan, Perpustakaan SPI untuk menggunakan Komunikasi SPI, Perpustakaan MCP2515 untuk menggunakan Komunikasi CAN dan Perpustakaan LiquidCrsytal untuk menggunakan LCD 16x2 dengan Arduino .
#include
Selanjutnya pin LCD yang digunakan untuk menghubungkan dengan Arduino UNO ditentukan.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
Sebuah struct tipe data dinyatakan untuk menyimpan format pesan CAN.
struct can_frame canMsg;
Atur nomor pin di mana SPI CS terhubung (10 secara default)
MCP2515 mcp2515 (10);
Dalam penyiapan batal ():
Pertama, LCD disetel pada mode 16x2 dan pesan selamat datang ditampilkan.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); penundaan (3000); lcd.clear ();
Mulailah komunikasi SPI dengan menggunakan pernyataan berikut.
SPI. Mulai ();
Selanjutnya MCP2515 sedang RESET menggunakan perintah berikut.
mcp2515.reset ();
Sekarang MCP2515 mengatur kecepatan 500KBPS dan 8MHZ sebagai jam.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Dan MCP2525 diatur pada mode normal.
mcp2515.setNormalMode ();
Berikutnya dalam void loop ():
Pernyataan berikut digunakan untuk menerima pesan dari bus CAN. Jika pesan diterima, itu masuk ke kondisi if .
jika (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Pada kondisi jika data diterima dan disimpan di anMsg , data yang memiliki nilai kelembaban dan data yang memiliki nilai suhu. Kedua nilai disimpan dalam bilangan bulat x dan y.
int x = canMsg.data; int y = canMsg.data;
Setelah menerima nilai, nilai suhu dan kelembaban ditampilkan pada layar LCD 16x2 dengan menggunakan pernyataan berikut.
lcd.setCursor (0,0); lcd.print ("Kelembaban:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); penundaan (1000); lcd.clear ();
Cara kerja komunikasi CAN di Arduino
Setelah perangkat keras siap, unggah program untuk pemancar CAN dan penerima CAN (program lengkap diberikan di bawah) di papan Arduino masing-masing. Ketika bertenaga Anda harus melihat nilai suhu dibaca oleh DHT11 akan dikirim ke Arduino lain melalui komunikasi BISA dan ditampilkan pada LCD dari 2 nd Arduino seperti yang Anda lihat pada gambar di bawah. Saya juga menggunakan remote AC untuk memeriksa apakah suhu yang ditampilkan di LCD mendekati suhu ruangan sebenarnya.
Pekerjaan lengkap dapat ditemukan di video yang ditautkan di bawah ini. Jika Anda memiliki pertanyaan, tinggalkan di bagian komentar atau gunakan forum kami untuk pertanyaan teknis lainnya.