- Pengenalan BOLEH
- Perbandingan CAN over SPI & I2C
- Aplikasi Protokol BOLEH
- Cara menggunakan protokol CAN di Arduino
- Komponen Diperlukan
- Rajah Litar
- Sambungan antara dua modul MCP2515 CAN
- Pengaturcaraan Arduino untuk komunikasi CAN
- DAPAT Penjelasan Kod Sampingan Pemancar (Arduino Nano)
- DAPAT Penerangan Kod Sampingan Penerima (Arduino UNO)
- Mengendalikan komunikasi CAN di Arduino
Hari ini mana-mana kereta rata-rata terdiri daripada sekitar 60 hingga 100 unit sensor di dalamnya untuk mengesan dan bertukar maklumat. Dengan pembuatan kenderaan yang berterusan menjadikan kereta mereka lebih pintar dengan ciri seperti pemanduan Autonomous, sistem Airbag, pemantauan Tekanan Tayar, sistem kawalan Cruise dan lain-lain, jumlah ini hanya dijangka meningkat. Tidak seperti sensor lain, sensor ini memproses maklumat kritikal dan oleh itu data dari sensor ini harus disampaikan menggunakan protokol komunikasi automotif standard. Sebagai contoh, data sistem kawalan pelayaran seperti kelajuan, kedudukan pendikit dll adalah nilai penting yang dihantar ke Unit Kawalan Elektronik (ECU)untuk menentukan tahap pecutan kereta, salah komunikasi atau kehilangan data di sini boleh menyebabkan kegagalan kritikal. Oleh itu, tidak seperti protokol komunikasi standard seperti UART, SPI atau I2C, pereka menggunakan banyak protokol komunikasi automatik seperti LIN, CAN, FlexRay dll.
Dari semua protokol yang ada, CAN lebih banyak digunakan dan popular. Kami telah membincangkan apa itu CAN dan bagaimana CAN berfungsi. Oleh itu, dalam artikel ini kita akan melihat asasnya sekali lagi dan akhirnya kita juga akan bertukar data antara dua Arduino menggunakan komunikasi CAN. Kedengarannya menarik! Oleh itu, mari kita mulakan.
Pengenalan BOLEH
CAN aka Controller Area Network adalah bas komunikasi bersiri yang direka untuk aplikasi industri dan automotif. Ini adalah protokol berasaskan mesej yang digunakan untuk komunikasi antara pelbagai peranti. Apabila beberapa peranti CAN disambungkan bersama seperti yang ditunjukkan di bawah, sambungan membentuk rangkaian yang bertindak seperti sistem saraf pusat kita yang membolehkan mana-mana peranti bercakap dengan peranti lain di dalam nod.
A CAN Network akan terdiri daripada hanya dua wayar CAN tinggi dan CAN Rendah untuk penghantaran data bi-arah seperti yang ditunjukkan di atas. Biasanya kelajuan komunikasi untuk CAN berkisar antara 50 Kbps hingga 1Mbps dan jaraknya boleh berkisar antara 40 meter pada 1Mbps hingga 1000 meter pada 50kpbs.
Format Mesej CAN:
Dalam komunikasi CAN data dihantar dalam rangkaian sebagai format mesej tertentu. Format mesej ini mengandungi banyak segmen tetapi dua segmen utama adalah pengecam dan data yang membantu menghantar dan bertindak balas kepada mesej dalam bas CAN.
Identifier atau CAN ID: Pengecam juga dikenali sebagai CAN CAN atau juga dikenali sebagai PGN (Parameter Group Number). Ini digunakan untuk mengenal pasti peranti CAN yang ada dalam rangkaian CAN. Panjang pengecam sama ada 11 atau 29 bit berdasarkan jenis protokol CAN yang digunakan.
Standard CAN: 0-2047 (11-bit)
Luas CAN: 0-2 29 -1 (29-bit)
Data: Ini adalah data sensor / kawalan sebenar yang harus dihantar dari satu alat ke yang lain. Panjang data boleh berukuran 0 hingga 8 bait.
Kod Panjang Data (DLC): 0 hingga 8 untuk bilangan bait data yang ada.
Kawat yang digunakan dalam CAN:
Protokol CAN terdiri daripada dua wayar iaitu CAN_H dan CAN_L untuk menghantar dan menerima maklumat. Kedua-dua wayar berfungsi sebagai garis pembeza, yang bermaksud isyarat CAN (0 atau 1) diwakili oleh perbezaan potensi antara CAN_L dan CAN_H. Sekiranya perbezaannya positif dan lebih besar daripada voltan minimum tertentu maka ia adalah 1 dan jika perbezaannya negatif, itu adalah 0.
Biasanya kabel pasangan terpintal digunakan untuk komunikasi CAN. Perintang 120 ohm tunggal biasanya digunakan di kedua hujung rangkaian CAN seperti yang ditunjukkan dalam gambar, ini kerana garis perlu seimbang dan terikat pada potensi yang sama.
Perbandingan CAN over SPI & I2C
Oleh kerana kita sudah belajar bagaimana menggunakan SPI dengan Arduino dan IIC dengan Arduino, mari kita bandingkan ciri SPI dan I2C dengan CAN
Parameter | SPI | I2C | BOLEH |
Kepantasan | 3Mbps hingga 10Mbps | Standard: 100Kbps | 10KBps hingga 1MBps Juga bergantung pada panjang wayar yang digunakan |
Cepat: 400 Kbps | |||
Kelajuan tinggi: 3.4Mbps | |||
Jenis | Segerak | Segerak | Tidak segerak |
Bilangan Wayar | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 wayar (SDA, SCL) | 2 wayar (CAN_H, CAN_L) |
Dupleks | Dupleks Penuh | Separuh dupleks | Separuh dupleks |
Aplikasi Protokol BOLEH
- Kerana ketahanan dan kebolehpercayaan protokol CAN, ia digunakan dalam industri seperti Automotif, mesin Industri, Pertanian, Peralatan Perubatan dll.
- Oleh kerana kerumitan pendawaian dikurangkan dalam CAN, ia terutama digunakan dalam aplikasi automotif seperti kereta.
- Kos rendah untuk dilaksanakan dan juga harga komponen perkakasan juga lebih rendah.
- Mudah untuk menambah dan mengeluarkan peranti bas CAN.
Cara menggunakan protokol CAN di Arduino
Oleh kerana Arduino tidak mengandungi port CAN bawaan, modul CAN yang disebut MCP2515 digunakan. Modul CAN ini dihubungkan dengan Arduino dengan menggunakan komunikasi SPI. Mari lihat lebih lanjut mengenai MCP2515 secara terperinci dan bagaimana ia dihubungkan dengan Arduino.
Modul MCP2515 CAN:
Modul MCP2515 mempunyai pengawal CAN MCP2515 yang merupakan pemancar CAN berkelajuan tinggi. Hubungan antara MCP2515 dan MCU adalah melalui SPI. Oleh itu, mudah untuk berinteraksi dengan mana-mana mikrokontroler yang mempunyai antara muka SPI.
Bagi pemula yang ingin belajar CAN Bus, modul ini akan berfungsi sebagai permulaan yang baik. Papan CAN SPI ini sesuai untuk automasi industri, automasi rumah dan projek tertanam automotif lain.
Ciri dan Spesifikasi MCP2515:
- Menggunakan transceiver CAN berkelajuan tinggi TJA1050
- Dimensi: 40 × 28mm
- Kawalan SPI untuk mengembangkan antara muka bas Multi CAN
- Pengayun kristal 8MHZ
- Rintangan terminal 120Ω
- Mempunyai kunci bebas, penunjuk LED, penunjuk Daya
- Menyokong operasi BISA 1 Mb / s
- Operasi siap sedia semasa rendah
- Sehingga 112 nod boleh disambungkan
Pinout modul MCP2515 CAN:
Nama Pin |
PENGGUNAAN |
VCC |
Pin input kuasa 5V |
GND |
Pin tanah |
CS |
SPI SLAVE pilih pin (Aktif rendah) |
JADI |
SPI master input hamba output plumbum |
SI |
Input input hamba output SPI utama |
SCLK |
Pin Jam SPI |
INT |
Pin gangguan MCP2515 |
Dalam tutorial ini mari kita lihat cara menghantar data sensor kelembapan & suhu (DHT11) dari Arduino Nano ke Arduino Uno melalui modul bas CAN MCP2515.
Komponen Diperlukan
- Arduino UNO
- Arduino NANO
- DHT11
- Paparan LCD 16x2
- Modul CAN MCP2515 - 2
- Potensiometer 10k
- Papan roti
- Wayar Penyambung
Rajah Litar
Sambungan di sebelah CAN Transmitter:
Komponen - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - JADI |
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 |
Sambungan Litar di Bahagian Penerima CAN:
Komponen - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - JADI |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Kepada 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 |
Sambungan antara dua modul MCP2515 CAN
H - BOLEH Tinggi
L - BOLEH Rendah
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Setelah semua sambungan dibuat, perkakasan saya kelihatan seperti di bawah
Pengaturcaraan Arduino untuk komunikasi CAN
Pertama kita harus memasang perpustakaan untuk CAN di Arduino IDE. Interfacing MCP2515 CAN Module dengan Arduino menjadi lebih mudah dengan menggunakan pustaka berikut.
- Muat turun fail ZIP Perpustakaan Arduino CAN MCP2515.
- Dari Arduino IDE: Sketsa -> Sertakan Perpustakaan -> Tambah Perpustakaan.ZIP
Dalam tutorial ini pengkodan dibahagikan kepada dua bahagian satu sebagai kod pemancar CAN (Arduino Nano) dan yang lain sebagai kod Penerima CAN (Arduino UNO) yang kedua-duanya terdapat di bahagian bawah halaman ini. Penjelasan untuk perkara yang sama adalah seperti berikut.
Sebelum menulis program untuk mengirim dan menerima data pastikan anda telah memasang perpustakaan mengikuti langkah-langkah di atas dan modul CAN MCP2515 diinisialisasi dalam program anda seperti berikut.
Memulakan Modul MCP2515 CAN:
Untuk membuat sambungan dengan MCP2515 ikuti langkah-langkah:
1. Tetapkan nombor pin di mana SPI CS disambungkan (10 secara lalai)
MCP2515 mcp2515 (10);
2. Tetapkan kadar baud dan frekuensi pengayun
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Harga 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_50KBPS, CAN_250BB, CAN500
Kelajuan Jam yang tersedia:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Tetapkan mod.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
DAPAT Penjelasan Kod Sampingan Pemancar (Arduino Nano)
Di bahagian pemancar, Arduino Nano dihubungkan dengan modul CAN MCP2515 melalui pin SPI dan DHT11 menghantar data Suhu dan Kelembapan ke bas CAN.
Pertama perpustakaan yang diperlukan disertakan, Perpustakaan SPI untuk menggunakan Komunikasi SPI, Perpustakaan MCP2515 untuk menggunakan Komunikasi CAN dan Perpustakaan DHT untuk menggunakan sensor DHT dengan Arduino . Kami sebelum ini menghubungkan DHT11 dengan Arduino.
#sertakan
Sekarang nama pin DHT11 (pin OUT) yang dihubungkan dengan A0 dari Arduino Nano ditakrifkan
#tentukan DHTPIN A0
Dan juga, DHTTYPE ditakrifkan sebagai DHT11.
#tentukan DHTTYPE DHT11
A canMsg struct jenis data untuk menyimpan format mesej CAN.
struct can_frame canMsg;
Tetapkan nombor pin di mana SPI CS disambungkan (10 secara lalai)
MCP2515 mcp2515 (10);
Dan juga, objek dht untuk kelas DHT dengan pin DHT dengan Arduino Nano dan jenis DHT kerana DHT11 diinisialisasi.
DHT dht (DHTPIN, DHTTYPE);
Seterusnya dalam persediaan kosong ():
Mulakan komunikasi SPI dengan menggunakan pernyataan berikut
SPI.begin ();
Dan kemudian gunakan pernyataan di bawah untuk mula menerima nilai Suhu dan kelembapan dari sensor DHT11.
dht.begin ();
Seterusnya MCP2515 diatur semula menggunakan arahan berikut
mcp2515.reset ();
Kini MCP2515 ditetapkan kelajuan 500KBPS dan 8MHZ sebagai jam
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Dan MCP2525 ditetapkan pada mod normal
mcp2515.setNormalMode ();
Dalam gelung kekosongan ():
Pernyataan berikut mendapat nilai Kelembapan dan Suhu dan menyimpan dalam pembolehubah integer h dan t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Seterusnya CAN CAN diberikan sebagai 0x036 (Sesuai pilihan) dan DLC sebagai 8 dan kami memberikan data h dan t ke data dan data dan meletakkan semua data dengan 0.
bolehMsg.can_id = 0x036; bolehMsg.can_dlc = 8; bolehMsg.data = h; // Kemas kini nilai kelembapan di canMsg.data = t; // Kemas kini nilai suhu di canMsg.data = 0x00; // Rehatkan semua dengan 0 canMsg.data = 0x00; bolehMsg.data = 0x00; bolehMsg.data = 0x00; bolehMsg.data = 0x00; bolehMsg.data = 0x00;
Lagipun, untuk menghantar mesej ke CAN BUS kami menggunakan pernyataan berikut.
mcp2515.sendMessage (& canMsg);
Jadi sekarang data suhu dan kelembapan dihantar sebagai mesej ke bas CAN.
DAPAT Penerangan Kod Sampingan Penerima (Arduino UNO)
Di bahagian penerima, Arduino UNO dihubungkan dengan paparan LCD MCP2515 dan 16x2. Di sini Arduino UNO menerima suhu dan kelembapan dari bas CAN dan memaparkan data yang diterima dalam LCD.
Pertama perpustakaan yang diperlukan disertakan, Perpustakaan SPI untuk menggunakan Komunikasi SPI, Perpustakaan MCP2515 untuk menggunakan Komunikasi CAN dan Perpustakaan LiquidCrsytal untuk menggunakan LCD 16x2 dengan Arduino .
#sertakan
Seterusnya pin LCD yang digunakan untuk menghubungkan dengan Arduino UNO ditentukan.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A struct jenis data diisytiharkan untuk menyimpan format mesej CAN.
struct can_frame canMsg;
Tetapkan nombor pin di mana SPI CS disambungkan (10 secara lalai)
MCP2515 mcp2515 (10);
Dalam persediaan tidak sah ():
Mula-mula LCD ditetapkan pada mod 16x2 dan mesej selamat datang dipaparkan.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("BOLEH ARDUINO"); kelewatan (3000); lcd.clear ();
Mulakan komunikasi SPI dengan menggunakan pernyataan berikut.
SPI.begin ();
Seterusnya MCP2515 sedang diatur semula menggunakan arahan berikut.
mcp2515.reset ();
Kini MCP2515 ditetapkan kelajuan 500KBPS dan 8MHZ sebagai jam.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
Dan MCP2525 ditetapkan pada mod normal.
mcp2515.setNormalMode ();
Selanjutnya dalam gelung void ():
Pernyataan berikut digunakan untuk menerima mesej dari bas CAN. Sekiranya mesej diterima, ia masuk ke dalam keadaan if .
jika (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
Dalam keadaan jika data diterima dan disimpan dalam c anMsg , data yang memiliki nilai kelembapan dan data yang memiliki nilai suhu. Kedua-dua nilai disimpan dalam bilangan bulat x dan y.
int x = canMsg.data; int y = canMsg.data;
Setelah menerima nilai, nilai suhu dan kelembapan dipaparkan dalam paparan LCD 16x2 menggunakan pernyataan berikut.
lcd.setCursor (0,0); lcd.print ("Kelembapan:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); kelewatan (1000); lcd.clear ();
Mengendalikan komunikasi CAN di Arduino
Setelah perkakasan siap memuat naik program untuk pemancar CAN dan penerima CAN (program lengkap diberikan di bawah) di papan Arduino masing-masing. Semasa dihidupkan, anda harus perhatikan nilai suhu yang dibaca oleh DHT11 akan dihantar ke Arduino lain melalui komunikasi CAN dan dipaparkan di LCD Arduino kedua seperti yang anda lihat pada gambar di bawah. Saya juga telah menggunakan alat kawalan jauh AC saya untuk memeriksa sama ada suhu yang dipaparkan pada LCD hampir dengan suhu bilik yang sebenarnya.
Kerja lengkap boleh didapati di video yang dipautkan di bawah. Sekiranya anda mempunyai pertanyaan, tinggalkan di ruangan komen atau gunakan forum kami untuk pertanyaan teknikal yang lain.