Isi kandungan:

CAN Protocol - Ya, Kita Boleh !: 24 Langkah
CAN Protocol - Ya, Kita Boleh !: 24 Langkah

Video: CAN Protocol - Ya, Kita Boleh !: 24 Langkah

Video: CAN Protocol - Ya, Kita Boleh !: 24 Langkah
Video: Lagi sholat di prank, ga boleh gitu ya adik adik 2024, November
Anonim
Image
Image
Sumber Yang Digunakan
Sumber Yang Digunakan

Subjek lain yang baru-baru ini dicadangkan oleh pengikut saluran YouTube saya ialah protokol CAN (Controller Area Network), yang akan kami fokuskan hari ini. Penting untuk menjelaskan bahawa CAN adalah protokol komunikasi bersiri serentak. Ini bermaksud penyegerakan antara modul yang disambungkan ke rangkaian dilakukan berkaitan dengan permulaan setiap mesej yang dihantar ke bas. Kami akan memulakan dengan memperkenalkan konsep asas protokol CAN dan melakukan pemasangan sederhana dengan dua ESP32.

Di litar kami, ESP boleh bertindak sebagai Master dan Slave. Anda boleh menghantar beberapa mikrokontroler secara serentak, kerana CAN dapat menangani perlanggaran semuanya secara automatik. Kod sumber projek ini sangat mudah. Lihatlah!

Langkah 1: Sumber yang Digunakan

  • Dua modul ESP WROOM 32 NodeMcu
  • Dua transceiver CAN dari WaveShare
  • Pelompat untuk sambungan
  • Penganalisis logik untuk tangkapan
  • Tiga kabel USB untuk ESP dan penganalisis
  • Pasangan berpusing 10 meter untuk dijadikan bas

Langkah 2: CAN (Rangkaian Kawasan Pengawal)

CAN (Rangkaian Kawasan Pengawal)
CAN (Rangkaian Kawasan Pengawal)
  • Ia dikembangkan oleh Robert Bosch GmbH pada tahun 1980-an untuk melayani industri automotif.
  • Ini telah meluas selama bertahun-tahun kerana ketahanan dan kelenturan pelaksanaannya. Ia digunakan dengan peralatan ketenteraan, mesin pertanian, automasi industri dan bangunan, robotik, dan peralatan perubatan.

Langkah 3: CAN - Ciri

BOLEH - Ciri
BOLEH - Ciri
BOLEH - Ciri
BOLEH - Ciri
  • Komunikasi bersiri dua wayar
  • Maksimum 8 bait maklumat berguna setiap bingkai, dengan kemungkinan pemecahan
  • Alamat diarahkan ke mesej dan bukan ke nod
  • Menetapkan keutamaan kepada mesej dan menyampaikan mesej "ditahan"
  • Keupayaan berkesan untuk mengesan dan memberi isyarat kesalahan
  • Keupayaan berbilang master (semua nod boleh meminta akses bas)
  • Keupayaan multicast (satu mesej untuk beberapa penerima pada masa yang sama)
  • Harga pindahan hingga 1Mbit / s pada bas 40 meter (pengurangan kadar dengan peningkatan panjang bar)
  • Fleksibiliti konfigurasi dan pengenalan nod baru (sehingga 120 nod setiap bas)
  • Perkakasan standard, kos rendah, dan ketersediaan yang baik
  • Protokol terkawal: ISO 11898

Langkah 4: Litar Digunakan

Litar Yang Digunakan
Litar Yang Digunakan

Di sini, saya mempunyai Transceiver. Terdapat satu di setiap sisi, dan mereka dihubungkan dengan sepasang wayar. Yang satu bertanggungjawab untuk menghantar dan yang lain untuk menerima data.

Langkah 5: Voltan Saluran Penghantaran (Pengesanan Pembezaan)

Voltan Talian Penghantaran (Pengesanan Pembezaan)
Voltan Talian Penghantaran (Pengesanan Pembezaan)

Dalam CAN, bit yang dominan adalah Zero.

Pengesanan Pembezaan Garis Mengurangkan Sensitiviti Bising (EFI)

Langkah 6: Bentuk Piawaian dan Bingkai CAN

Bentuk Piawai dan Bingkai CAN
Bentuk Piawai dan Bingkai CAN

Format standard dengan pengecam 11-bit

Langkah 7: Bentuk Piawaian dan Bingkai CAN

Bentuk Piawaian dan Bingkai CAN
Bentuk Piawaian dan Bingkai CAN

Format lanjutan dengan pengecam 29-bit

Langkah 8: Bentuk Piawaian dan Bingkai CAN

Penting untuk diperhatikan bahawa protokol sudah menghitung CRC dan menghantar isyarat ACK dan EOF, yang merupakan perkara yang sudah dilakukan oleh protokol CAN. Ini menjamin bahawa mesej yang dihantar tidak akan sampai dengan cara yang salah. Ini kerana jika ia memberikan masalah pada CRC (Redundant Cyclic Check atau Redundancy Check), yang sama dengan digit cek maklumat, ia akan dikenal pasti oleh CRC.

Langkah 9: Empat Jenis Bingkai (bingkai)

Empat Jenis Bingkai (bingkai)
Empat Jenis Bingkai (bingkai)

Penting untuk diperhatikan bahawa protokol sudah menghitung CRC dan menghantar isyarat ACK dan EOF, yang merupakan perkara yang sudah dilakukan oleh protokol CAN. Ini menjamin bahawa mesej yang dihantar tidak akan sampai dengan cara yang salah. Ini kerana jika ia memberikan masalah pada CRC (Redundant Cyclic Check atau Redundancy Check), yang sama dengan digit maklumat, ia akan dikenal pasti oleh CRC.

Empat jenis bingkai (bingkai)

Penghantaran dan penerimaan data dalam CAN didasarkan pada empat jenis bingkai. Jenis bingkai akan dikenal pasti oleh variasi dalam bit kawalan atau bahkan dengan perubahan dalam peraturan penulisan bingkai untuk setiap kes.

  • Bingkai Data: Mengandungi data pemancar untuk penerima
  • Remote Frame: Ini adalah permintaan data dari salah satu nod
  • Rangka Kesalahan: Ini adalah bingkai yang dikirim oleh salah satu node ketika mengenal pasti kesalahan dalam bas dan dapat dikesan oleh semua nod
  • Overload Frame: Berfungsi untuk melambatkan lalu lintas di bas kerana data yang berlebihan atau kelewatan pada satu atau lebih nod.

Langkah 10: Litar - Perincian Sambungan

Litar - Perincian Sambungan
Litar - Perincian Sambungan

Langkah 11: Litar - Tangkap Data

Litar - Tangkapan Data
Litar - Tangkapan Data

Panjang gelombang yang diperoleh untuk CAN standard dengan ID 11-bit

Langkah 12: Litar - Tangkap Data

Litar - Tangkapan Data
Litar - Tangkapan Data

Panjang gelombang yang diperoleh untuk CAN yang diperpanjang dengan ID 29-bit

Langkah 13: Litar - Tangkap Data

Litar - Tangkapan Data
Litar - Tangkapan Data

Data yang diperoleh oleh penganalisis logik

Langkah 14: Perpustakaan Arduino - BOLEH

Perpustakaan Arduino - BOLEH
Perpustakaan Arduino - BOLEH

Saya menunjukkan di sini dua pilihan di mana anda boleh memasang Perpustakaan Pemandu CAN

Pengurus Perpustakaan Arduino IDE

Langkah 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Langkah 16: Kod Sumber Pemancar

Kod Sumber: Termasuk dan Persediaan ()

Kami akan memasukkan pustaka CAN, memulakan siri untuk debug, dan memulakan bas CAN pada 500 kbps.

#include // Inclui a biblioteca BOLEH membatalkan penyediaan () {Serial.begin (9600); // inicia siri untuk debug sementara (! Serial); Serial.println ("Transmissor CAN"); // Inicia o barramento DAPAT 500 kbps jika (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador sementara (1); }}

Langkah 17: Kod Sumber: Gelung (), Menghantar Paket CAN 2.0 Standard

Dengan menggunakan standard CAN 2.0, kami menghantar pakej. ID 11-bit mengenal pasti mesej. Blok data mesti mempunyai 8 bait. Ia memulakan paket dengan ID 18 dalam heksadesimal. Ini mengemas 5 bait dan menutup fungsinya.

gelung void () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bit e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em heksadesimal CAN.write ('h'); // 1º bait CAN.write ('e'); // 2º bait CAN.write ('l'); // 3º bait CAN.write ('l'); // 4º bait CAN.write ('o'); // 5º bait CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); kelewatan (1000);

Langkah 18: Kod Sumber: Gelung (), Menghantar Pakej CAN 2.0 yang Diperpanjang

Dalam langkah ini, ID mempunyai 29 bit. Ia mula menghantar 24 bit ID dan, sekali lagi, mengemas 5 bait dan berhenti.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 byte Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 perpuluhan (abcdef em hexa) = 24 bit preenchidos até aqui CAN.write ('w'); // 1º bait CAN.write ('o'); // 2º bait CAN.write ('r'); // 3º bait CAN.write ('l'); // 4º bait CAN.write ('d'); // 5º bait CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); kelewatan (1000); }

Langkah 19: Kod Sumber Penerima

Kod Sumber: Termasuk dan Persediaan ()

Sekali lagi, kami akan memasukkan pustaka CAN, memulakan siri untuk debug, dan memulakan bas CAN pada 500 kbps. Sekiranya ralat berlaku, ralat ini akan dicetak.

#include // Inclui a biblioteca BOLEH membatalkan penyediaan () {Serial.begin (9600); // inicia siri untuk debug sementara (! Serial); Serial.println ("Reseptor BOLEH"); // Inicia o barramento DAPAT 500 kbps jika (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador sementara (1); }}

Langkah 20: Kod Sumber: Gelung (), Mendapatkan Pakej dan Memeriksa Format

Kami cuba memeriksa ukuran paket yang diterima. Kaedah CAN.parsePacket () menunjukkan kepada saya saiz pakej ini. Oleh itu, jika kita mempunyai pakej, kita akan memeriksa sama ada ia diperluaskan atau tidak.

gelung kosong () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); jika (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

Langkah 21: Sumber: Gelung (), Periksa untuk Melihat Adakah Itu Pakej Jauh

Di sini, kami memeriksa apakah paket yang diterima adalah permintaan data. Dalam kes ini, tidak ada data.

jika (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }

Langkah 22: Kod Sumber: Gelung (), Panjang Data Diminta atau Diterima

Sekiranya paket yang diterima adalah permintaan, kami menunjukkan panjang yang diminta. Kami kemudian memperoleh Kod Panjang Data (DLC), yang menunjukkan panjang data. Akhirnya, kami menunjukkan tempoh yang diterima.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); sekiranya (CAN.packetRtr ()) {// se o pacote recebido é de requisição, indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Kod Panjang Data, que indica o comprimento dos dados)} yang lain {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

Langkah 23: Kod Sumber: Gelung (), Sekiranya Data Diterima, Ia Kemudian Mencetak

Kami mencetak (pada monitor bersiri) data, tetapi hanya jika paket yang diterima bukan permintaan.

// Imprime os dados somente se o pacote recebido não foi de requisição sementara (CAN.available ()) {Serial.print ((char) CAN.read ()); } Bersiri.println (); } Bersiri.println (); }}

Langkah 24: Muat turun Fail

PDF

INO

Disyorkan: