Gunakan protokol komunikasi serial yang kuat ini untuk menghubungkan dua papan Arduino bersama-sama dan mengirim data satu sama lain.

Bus Controller Area Network (CAN) adalah protokol komunikasi yang kuat dan andal yang banyak digunakan di berbagai aplikasi industri, otomotif, dan kedirgantaraan. Ini dirancang untuk transmisi data antara mikrokontroler dan perangkat melalui jaringan bus CAN. Anda mungkin belum mengetahuinya, tetapi itulah yang ada di balik mod dasbor mobil gila yang Anda lihat di media sosial.

Kami akan memandu Anda tentang cara membuat bus CAN dengan modul CAN MCP2515 menggunakan Arduino dan papan tempat memotong roti. Kami juga akan membahas pustaka Arduino CAN dan mendemonstrasikan cara mengirim dan menerima data melalui bus CAN.

Apa itu Bus CAN?

Bus CAN adalah protokol komunikasi serial yang dikembangkan oleh Bosch pada 1980-an. Ini banyak digunakan dalam berbagai aplikasi karena keandalan dan ketahanannya yang tinggi. Ini memungkinkan transmisi data antar perangkat dengan kecepatan tinggi dengan latensi minimal hanya melalui dua jalur: CAN High dan CAN Low.

Pada tahun 1994, bus CAN menjadi standar internasional (ISO 11898) yang dirancang khusus untuk pertukaran data serial yang cepat antara pengontrol elektronik dalam aplikasi otomotif. Lihat panduan lengkap kami di apa itu bus CAN dan apa perannya dalam sistem otomotif untuk detail lebih lanjut.

Salah satu alasan mengapa bus CAN begitu populer adalah karena fitur deteksi dan koreksi kesalahannya. Protokol dapat mendeteksi dan memperbaiki kesalahan dalam transmisi data. Ini membuatnya ideal untuk aplikasi di mana integritas data sangat penting, seperti otomasi industri.

Mengetahui Modul CAN MCP2515

Modul CAN Bus Controller MCP2515 adalah perangkat yang memberikan dukungan luar biasa untuk CAN Protocol versi 2.0B yang banyak digunakan. Modul ini ideal untuk komunikasi dengan kecepatan data tinggi hingga 1Mbps.

IC MCP2515 adalah pengontrol CAN independen dengan Antarmuka SPI yang memungkinkan komunikasi dengan berbagai mikrokontroler. IC TJA1050, di sisi lain, berfungsi sebagai antarmuka antara IC pengontrol CAN MCP2515 dan bus CAN fisik.

Untuk menambah kenyamanan, terdapat jumper yang memungkinkan Anda memasang terminasi 120 ohm, membuatnya lebih mudah menghubungkan kabel Anda ke CAN_H & BISAKAH SAYA sekrup untuk komunikasi dengan modul CAN lainnya.

Fitur

Spesifikasi

Transceiver

TJA1050

Antarmuka mikrokontroler

SPI (memungkinkan integrasi bus Multi CAN)

Osilator kristal

8MHz

Penghentian

120Ω

Kecepatan

1Mbps

Konsumsi daya

Operasi siaga arus rendah

Dimensi

40x28mm

Kapasitas simpul

Mendukung hingga 112 node

Anda bisa mendapatkan informasi tambahan dari Lembar data MCP2515 jika Anda membutuhkan modul ini untuk proyek yang lebih maju.

Struktur Pesan CAN

Struktur pesan CAN terdiri dari beberapa segmen, tetapi segmen yang paling penting untuk proyek ini adalah pengidentifikasi dan data. Pengidentifikasi, juga dikenal sebagai ID CAN atau Nomor Grup Parameter (PGN), mengidentifikasi perangkat di CAN jaringan, dan panjang pengidentifikasi dapat berupa 11 atau 29 bit, tergantung pada jenis protokol CAN digunakan.

Sementara itu, data mewakili data sensor/kontrol aktual yang sedang dikirim. Panjang data dapat berkisar dari 0 hingga 8 byte, dan Kode Panjang Data (DLC) menunjukkan jumlah byte data yang ada.

Perpustakaan CAN Arduino MCP2515

Perpustakaan ini menerapkan BISA protokol V2.0B, yang dapat beroperasi dengan kecepatan hingga 1Mbps. Ini menyediakan antarmuka SPI yang dapat beroperasi pada kecepatan hingga 10MHz sambil mendukung data standar (11-bit) dan diperpanjang (29-bit). Terlebih lagi, ini hadir dengan dua buffer penerima, yang memungkinkan penyimpanan pesan yang diprioritaskan.

Menginisialisasi Bus CAN

Berikut adalah kode penyiapan yang Anda perlukan untuk menginisialisasi bus CAN:

#termasuk
#termasuk

MCP2515 mcp2515(10); // Tetapkan pin CS

ruang kosongmempersiapkan(){
ketika (!Serial);
Serial.mulai(9600);
SPI.mulai(); //Memulai komunikasi SPI

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

Ini menginisialisasi MCP2515 dengan kecepatan bit CAN 500Kbps dan frekuensi osilator 8MHz.

Mode Operasional CAN MCP2515

Ada tiga mode operasional yang digunakan dengan pengontrol bus CAN MCP2515:

  • setNormalMode(): menyetel pengontrol untuk mengirim dan menerima pesan.
  • setLoopbackMode(): menyetel pengontrol untuk mengirim dan menerima pesan, tetapi pesan yang dikirimnya juga akan diterima dengan sendirinya.
  • setListenOnlyMode(): menyetel pengontrol agar hanya menerima pesan.

Ini adalah panggilan fungsi yang digunakan untuk mengatur mode operasional pengontrol bus CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Mengirim Data Melalui Bus CAN

Untuk mengirim pesan melalui bus CAN, gunakan sendMsgBuf() metode:

tidak ditandatanganiarang data[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4,data);

Ini mengirim pesan dengan ID 0x01 dan muatan data {0x01, 0x02, 0x03, 0x04}. Parameter pertama adalah CAN ID, yang kedua adalah prioritas pesan, yang ketiga adalah panjang payload data, dan yang keempat adalah payload data itu sendiri.

Itu sendMsgBuf() metode mengembalikan nilai yang menunjukkan apakah pesan berhasil dikirim atau tidak. Anda dapat memeriksa nilai ini dengan memanggil checkError() metode:

jika (CAN.checkError()) {
Serial.println("Kesalahan mengirim pesan.");
}

Ini memeriksa apakah terjadi kesalahan selama pengiriman pesan dan mencetak pesan kesalahan jika perlu.

Menerima Data Dari Bus CAN

Untuk menerima pesan melalui bus CAN, Anda dapat menggunakan bacaMsgBuf() metode:

tidak ditandatanganiarang len = 0;
tidak ditandatanganiarang buf[8];
tidak ditandatanganiarang canID = 0;

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

Ini memeriksa apakah pesan tersedia di bus CAN dan kemudian membaca pesan ke dalam buf Himpunan. Panjang pesan disimpan dalam len variabel, dan ID pesan disimpan di canID variabel.

Setelah Anda menerima pesan, Anda dapat memproses payload data sesuai kebutuhan. Misalnya, Anda dapat mencetak muatan data ke monitor serial:

Serial.mencetak("Pesan yang diterima dengan ID");
Serial.mencetak(canID, HEX);
Serial.mencetak(" dan datanya: ");

untuk (int saya = 0; saya < len; saya++) {
Serial.mencetak(buf[i], HEX);
Serial.mencetak(" ");
}

Serial.println();

Ini mencetak ID dari pesan yang diterima dan muatan data ke monitor serial.

Cara Menghubungkan Transceiver Bus CAN ke Breadboard

Untuk membangun bus CAN untuk menghubungkan dua perangkat dalam proyek contoh ini, Anda memerlukan:

  • Dua mikrokontroler (dua papan Arduino Nano untuk contoh ini)
  • Dua modul CAN MCP2515
  • Papan tempat memotong roti
  • Kabel jumper
  • Modul layar LCD I2C 16x2
  • Sensor ultrasonik HC-SR04

Untuk contoh proyek ini, empat pustaka digunakan dalam sketsa Arduino. Ada Ping Baru perpustakaan, yang menyediakan antarmuka yang mudah digunakan untuk sensor Ultrasonik, serta perpustakaan SPI, yang memfasilitasi komunikasi antara papan Arduino dan pengontrol bus CAN MCP2515. Itu LiquidCrystal_I2C perpustakaan digunakan untuk modul tampilan.

Terakhir, ada perpustakaan mcp2515 untuk berinteraksi dengan chip MCP2515, memungkinkan kita mengirimkan data dengan mudah melalui jaringan bus CAN.

Penyiapan Perangkat Keras (Contoh HC-SR04)

Dalam proyek ini menggunakan sensor HC-SR04 dan LCD, satu papan Arduino Nano akan bertindak sebagai penerima, sedangkan Arduino lainnya akan bertindak sebagai pengirim. Hubungkan komponen pengirim Anda sesuai dengan diagram pengkabelan di bawah ini:

Berikut adalah diagram untuk rangkaian penerima:

Terakhir, hubungkan kedua node bersama-sama menggunakan CAN_H Dan BISAKAH SAYA baris seperti yang ditunjukkan:

Saat memasang modul, penting untuk memastikan bahwa voltase catu daya berada dalam kisaran yang ditentukan dan bahwa BISA H Dan BISAKAH SAYA pin terhubung dengan benar ke bus.

Memprogram Modul Bus CAN MCP2515

Perhatikan bahwa saat memprogram modul MCP2515, penting untuk menggunakan kecepatan bit yang benar untuk memastikan komunikasi yang sukses dengan perangkat CAN lain di jaringan.

Kode pengirim:

#termasuk
#termasuk
#termasuk

MCP2515 mcp2515(10);
constbyte tripin = 3;
constbyte echoPin = 4;
Ping Baru sonar(trigPin, echoPin, 200);

structcan_framecanMsg;

ruang kosongmempersiapkan(){
Serial.mulai(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

ruang kosonglingkaran(){
tidak ditandatanganiint jarak = sonar.ping_cm();
canMsg.can_id = 0x036; // BISA id sebagai 0x036
canMsg.can_dlc = 8; // DAPATKAN panjang data sebagai 8
canMsg.data[0] = jarak; //Perbarui nilai kelembapan di [0]
canMsg.data[1] = 0x00; // Istirahat semua dengan 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);// Mengirim pesan CAN
menunda(100);
}

Kode penerima:

#termasuk
#termasuk
#termasuk

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

ruang kosongmempersiapkan(){
Serial.mulai(9600);

mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.mencetak("TUTORIAL MUO BISA");
menunda(3000);
lcd.jernih();
}

ruang kosonglingkaran(){
jika (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // Untuk menerima data
{
int jarak = canMsg.data[0];
lcd.setCursor(0,0);
lcd.mencetak("Jarak: ");
lcd.mencetak(jarak);
lcd.mencetak("cm");
}
}

Bawa Proyek Arduino Anda ke Tingkat Selanjutnya

Kombinasi bus CAN dan Arduino menyediakan platform yang kuat untuk membangun atau mempelajari jaringan komunikasi canggih yang digunakan dalam berbagai aplikasi. Meskipun ini mungkin tampak seperti kurva belajar yang curam, memiliki pengaturan Anda sendiri di papan tempat memotong roti adalah cara yang cukup berguna untuk mempelajari seluk-beluk penggunaan jaringan bus CAN dalam proyek DIY yang rumit.