
Bus BISA sendiri sudah banyak digunakan di mana, saya tertarik penggunaannya di mobil, meskipun area ini tidak bisa dibatasi. Terutama beberapa tahun yang lalu kesempatan ini muncul. Saya melihat spesifikasi umum - sepertinya tidak ada yang rumit. Saya melihat program yang ditemukan di Internet - dan saya tidak suka, masing-masing tidak memiliki sesuatu yang tampaknya perlu bagi saya pada waktu itu. Saya akan menemukan kembali sepeda saya. Saya membuat sniffer CAN saya lebih jauh di bawah luka.
BISA bus
Menjabarkan detail teknis bus CAN adalah bagian dari dokumentasi. Dalam artikel ini, cukup untuk mengetahuinya:
- memiliki koneksi fisik dua kawat
- ada berbagai kecepatan data
- keripik siap pakai dan bahkan papan siap pakai dengan komponen yang disolder sudah tersedia untuk koneksi
Setelah membolak-balik halaman satu toko online terkenal dari Kerajaan Tengah, saya memesan beberapa opsi berbeda untuk perisai dan pergi untuk mempelajari fitur-fitur sinyal listrik di dalam mobil. Mobil eksperimental adalah LADA Kalina Cross dengan mesin ke 127 dan ITELMA M74.5 CAN unit kontrol elektronik.
Saya terhubung ke konektor diagnostik OBD (pin 6 dan 14) dan melihat osiloskop yang ada di sana. Setelah memutar kunci kontak, paket dengan amplitudo hingga 2,5 V mulai berjalan. Saya berhenti di osiloskop dan melihat ke paket.
Bit mulai dan berhenti terlihat, beberapa data dalam paket. Pada saat itu saya sudah tahu bahwa kecepatan transfer data diharapkan 500 kbit / s, sebagai yang paling sering untuk bus CAN motor. Durasi paket sekitar 230 Ξs dan sebelum paket ada jeda yang agak besar dalam transmisi data. Saya skala waktu dan melihat tiga paket dan jeda di antara mereka.
Jika kita menambahkan durasi transfer data dan jeda antar paket, ternyata transfer satu bagian data membutuhkan waktu sekitar 1 ms.
Mengapa saya menyimpulkan semua ini? Dan pertanyaannya adalah murni praktis: apakah ada kecepatan port serial yang cukup untuk mentransfer semua data? Dan berdasarkan apa yang kita lihat, kita dapat menyimpulkan bahwa kecepatan 500 kbit / s berkembang di dalam paket, yang memakan waktu sekitar seperempat dari waktu transmisi. Jadi tingkat transfer rata-rata akan empat kali lebih rendah. Pada saat itu, saya masih belum memiliki tes kecepatan antarmuka serial Arduino, dan melihat ke depan saya dapat mengatakan bahwa bahkan dengan konverter Serial ke USB CH340 yang paling umum, kecepatan 2 Mbps bekerja dengan stabil.
BISA pemindai di Arduino
Perisai pertama yang tiba untuk Arduino UNO klasik. Ya, harganya jauh lebih mahal daripada rekan-rekannya yang lebih kecil, tetapi ia memiliki semua yang Anda butuhkan dan bahkan dua tombol.
Dengan dia saya memulai semua percobaan. Rakitan sirkuit sederhana dengan perisai ini dan layar dua garis kristal cair. Tujuannya adalah untuk menampilkan setidaknya beberapa data di layar. Saya memilah-milah berbagai perpustakaan untuk bekerja dengan bus CAN di Arduino (Saya akan langsung mengatakan bahwa perpustakaan yang benar dan berfungsi disebut CAN-BUS Shield oleh Seeed Studio dengan file header mcp_can.h), mengubah resonator kuarsa pada pelindung 16 MHz (aslinya 8 MHz) - tidak ada data.
Dua sirkuit mikro dipasang pada pelindung: pengendali bus CAN MCP2515 dan pengemudi bus CAN TJA1050. Setelah membaca dokumentasi dan berbagai forum, saya memutuskan untuk mengubah TJA1050 menjadi driver yang lebih kanonik MCP2551 dan data muncul. Mungkin TJA1050 pada awalnya rusak, karena sangat sulit untuk membuat kesalahan dengan menghubungkannya dengan dua kabel, di samping itu, saya menggunakan konektor OBD dan DB9 untuk koneksi.
Dalam beberapa jam, sebuah pemindai CAN sederhana dapat ditulis, yang menampilkan jumlah paket yang ditangkap, ID-nya, dan hingga 8 byte data untuk paket ini pada LCD.
Di sinilah tombol pada perisai berguna, yang saya gunakan untuk beralih di antara jumlah paket yang ditampilkan.
Tentang tombolSecara umum, tombol-tombol ini berguna untuk banyak hal. Bersama mereka saya mulai menguji kontrol beberapa perangkat mobil.
Awalnya sudah dimulai, kita harus beralih ke implementasi yang lebih menarik.
BISA sniffer di Arduino
Tugasnya cukup sederhana:
- menerima paket dari CAN bus
- kami menempatkan data yang diterima dalam struktur kami
- mengirim struktur melalui port serial
Saya tidak melihat masalah dengan dua tugas pertama. Perpustakaan menyediakan interupsi ketika menerima paket data berikutnya dan fungsi yang mudah untuk menerima data. Tetapi saya memutuskan untuk mengirim data ke komputer melalui pustaka CyberLib, yang menghilangkan beberapa overhead dari seluruh platform Arduino, yang dengannya Anda dapat sedikit membongkar prosesor untuk memproses data. Kemudian, perpustakaan ini harus ditinggalkan.
Agar data dikirim dengan benar untuk diproses di sisi komputer, awalan empat byte 0xAA55AA55 dimasukkan ke dalam aliran sebelum setiap bagian data berikutnya (untuk beberapa alasan, byte ini diingat untuk dua byte terakhir dari sektor boot DOS, hanya saja urutannya berbeda). Logikanya adalah ini:
- komputer membaca seluruh aliran dari port serial dan menemukan urutan awalan yang diinginkan 0xAA55AA55 di dalamnya
- segera setelah awalan akan ada 4 byte pengenal paket
- selanjutnya panjang data paket ini, ia mengontrol panjang seluruh paket
- hingga 8 byte data
Mengenai hal ini, bagian perangkat lunak dalam Arduino, pada waktu itu, selesai. Kemudian secara signifikan direnovasi, tetapi konsep umum tidak berubah.
Saya juga menulis sebuah generator paket data sederhana untuk debugging untuk di-debug di rumah - ia hanya mengirim paket-paket dengan data acak ke port serial, yang memungkinkan Anda untuk men-debug aplikasi pada komputer Anda dalam kondisi yang nyaman.
Sekitar waktu yang sama, komponen yang lebih kecil dari perisai Arduino Nano dan Mini CAN tiba.
Saya merancang kasing kecil, mencetaknya dan meletakkan semua komponen di dalamnya.
Di luar, ada konektor OBD di satu sisi dan Mini USB di sisi lain. Di dalam ada saklar untuk resistor penghentian.
BISA sniffer di PC menggunakan wxWidgets
Saya membuat sketsa konsep sederhana program di C #, yang menampilkan data yang diterima di Grid. Dan dia pergi untuk memeriksa di dalam mobil. Saya hanya tidak menggunakan laptop saya, karena baterainya telah memerintahkan saya untuk hidup lama dan digunakan sebagai komputer stasioner, tetapi saya mengambil netbook dengan prosesor yang sangat lemah. Apa yang saya lihat ... saya tidak melihat apa-apa. Kedua core 100% dimuat, antarmuka aplikasi tidak merespons. Tetapi di komputer saya, yang masih jauh lebih cepat daripada netbook, dengan generator paket acak aplikasi bekerja dengan baik dan menampilkan data. Dari sini, saya menyimpulkan bahwa platform .NET pada komputer yang lemah tidak akan berfungsi untuk saya, karena saya bisa men-debug di lapangan pada saat itu hanya dengan netbook itu.
Sebelumnya, saya menggunakan perpustakaan wxWidgets di beberapa proyek dan saya hanya punya pengalaman yang menyenangkan tentang itu. Ini ringan, tidak perlu membawa berbagai pustaka dengannya, dan bahkan lintas platform, yang memberi harapan bahwa bagian antarmuka kode dapat ditransfer tanpa perubahan signifikan ke platform lain. Di akhir artikel akan ada tautan ke program yang dikompilasi, jika tidak ada keinginan untuk repot dengan semua ini.
Cara menginstal dan mengkompilasi wxWidgets untuk Visual StudioInstalasi dan kompilasi1. Unduh Windows Installer
wxWidgets dan instal, misalnya, di folder C: \ wxWidgets
2. Buat variabel lingkungan:
WXWIN = C: \ wxWidgets
3. Jalankan prompt perintah Visual Studio dan buka direktori:
% WXWIN% \ build \ msw
4. Ketik dua perintah untuk dikompilasi:
nmake / f makefile.vc BUILD = debug RUNTIME_LIBS = statis
nmake / f makefile.vc BUILD = lepaskan RUNTIME_LIBS = statis
Menyiapkan proyek di Visual Studio1. Dalam Visual Studio, buat Proyek Win32, dengan proyek Empty parameter.
2. Dalam properti proyek untuk Semua konfigurasi, tentukan jalur di bagian direktori VC ++:
Sertakan Direktori:
$ (WXWIN) \ termasuk
$ (WXWIN) \ termasuk \ msvc
Direktori Perpustakaan:
$ (WXWIN) \ lib \ vc_lib
3. Di bagian C / C ++ - Pembuatan Kode, ubah:
Perpustakaan Runtime untuk Debug: / konfigurasi MTd
Perpustakaan Runtime untuk mengkonfigurasi Rilis: / MT
4. Di bagian Umum, ubah:
Set Karakter: Gunakan Set Karakter Unicode
5. Untuk menambahkan ikon ke file exe, Anda perlu menambahkan file sumber daya dengan konten berikut:
#sertakan "wx \ msw \ wx.rc"
ikon wxicon app_icon.ico
6. Selain itu, jika Anda perlu menggunakan UAC, di bagian Linker - Manifest File:
Level Eksekusi UAC: membutuhkanAdministrator
Prototipe pertama yang diimplementasikan dalam C ++ dan wxWidgets menunjukkan bahwa bahkan netbook berupaya menampilkan data dalam sebuah tabel, dan saya mulai mengembangkan apa yang telah saya rencanakan.
Secara arsitektur, program ini terdiri dari dua aliran: antarmuka dan alur kerja dengan port serial. Tidak ada algoritma yang sangat menarik yang diterapkan. Kode ini banyak dikomentari dan harus cukup mudah. Tautan ke sumbernya ada di akhir artikel.
Hal pertama yang dilakukan adalah pewarnaan sel data dalam tabel sesuai dengan batasan memperoleh data ini. Sudah di prototipe pertama, melihat 17 baris data yang terus berubah nilai, saya menyadari bahwa perlu untuk entah bagaimana membedakan antara data baru dan data yang tidak berubah atau jarang berubah. Dia membuat pewarnaan dalam dua tahap:
- data pertama kali disorot dalam latar belakang sel hijau
- data yang datang berulang kali dan selanjutnya disorot dengan latar belakang merah, yang secara bertahap memudar menjadi putih jika data ini tidak berubah lagi
Segera menjadi jelas sel mana yang tidak digunakan sama sekali, mana yang berisi sinyal penghitung. Pencarian untuk nilai variabel yang menarik sangat disederhanakan. Selanjutnya, semua gambar dianimasikan. Jika animasi tidak berfungsi dalam artikel (pada beberapa browser seluler) - klik pada gambar untuk membuka versi lengkap animasi.

Lalu saya ingin tetap memeriksa apakah port serial mengatasi aliran data. Untuk melakukan ini, di sisi Arduino, saya menambahkan penghitung untuk jumlah paket yang diterima dan penghitung byte dalam paket. Penghitung ini dikirim ke komputer dalam sebuah paket dengan pengenal 0x000. Setelah menerima data ini, program tidak menampilkannya dalam tabel, tetapi menampilkannya di bidang informasi terpisah di bagian atas. Hasilnya bahkan cukup menyenangkan. Rata-rata, hingga 750 paket / detik diterima pada kecepatan hingga 9,5 kB / detik, dan di sinilah di wilayah ini hingga 80 kbit / detik, yang sangat memungkinkan untuk port serial. Namun demikian, pertukaran data dikonfigurasi secara default pada 500 kbps, biarlah stoknya lebih baik.
Menambahkan kemampuan untuk menulis data ke log muncul setelah saya menghubungkan adaptor diagnostik ELM327 secara paralel dengan antarmuka OBD dan menghubungkannya ke telepon, mencoba membaca berbagai data. Data berjalan sangat cepat sehingga tidak mungkin untuk melihatnya. Setelah mencatat semua ini dalam jurnal, Anda dapat dengan tenang duduk dan melihat data yang dikirimkan. Untuk melakukan ini, bahkan data teks ASCII dapat ditulis ke log. Anda juga dapat memilih jenis file, pembatas karakter dan mengkonfigurasi filter paket dengan mengklik pengenal paket yang ditentukan dalam tabel dan mengklik tombol "Tambahkan ID untuk menyaring" (secara default, semua data ditulis) jika semua data ditulis berlebihan.
Saat itulah realisasi datang bahwa semua aplikasi telepon yang melakukan semua jenis "diagnostik" melalui bundel ELM327 dan telepon tidak berkomunikasi langsung dengan bus CAN kendaraan. Mereka hanya menggunakan fungsi diagnostik OBD melalui bus CAN dengan mengakses CAN ID 0x7E0. Biasanya ini adalah alamat pengendali motor (ECU), jawaban darinya datang dalam paket dengan pengenal 0x7E8. Tetapi semua paket data lainnya disebut Vendor Specific dan tidak ada produsen yang akan membukanya (walaupun ada contoh:
Ford merilis SDK untuk mobilnya ).
Melanjutkan mempelajari apa yang sedang ditransmisikan dalam paket-paket ini, saya datang dengan ide lain: ketika saya mengklik sel di tabel, di jendela program di sebelah kanan, menampilkan nilai biner dan desimal dari byte ini, serta mengambil byte berikutnya dan menambahkan kata. Selanjutnya, gandakan kata ini dengan koefisien tertentu dan dapatkan hasil desimal. Kedengarannya tidak terlalu jelas, tetapi sehubungan dengan apa yang telah dilakukan: kecepatan mesin datang dalam paket CAN ID 0x180, dalam dua byte pertama. Dua byte ini memberikan kata tertentu yang sebanding dengan belokan. Jika arti kata ini dibagi 8, maka momentum saat ini diperoleh. Oleh karena itu, faktor 0,125 ditunjukkan, sebagai kebalikan dari 8. Selanjutnya, kata ini divisualisasikan dalam grafik dengan penyesuaian dinamis dalam amplitudo. Pada prinsipnya, pengali dapat dicari dalam urutan terbalik: Saya menemukan sel yang sangat mirip dengan kecepatan mesin atau sesuatu yang lain sesuai jadwal, setelah itu pengali disesuaikan untuk mendapatkan nilai nyata.

Nah, representasi biner memungkinkan Anda untuk mencari berbagai indikator bit. Misalnya, pencarian indikator indikator arah direduksi menjadi menyalakannya dan mengamati sel mana yang mulai berubah, dalam contoh di bawah ini adalah CAN ID 0x481 byte 2. Setelah itu, mengklik pada sel menampilkan nilai biner di bidang yang sesuai, di mana pengalihan dua yang lebih rendah sudah terlihat bit (kiri, kanan, dan jika bersama - alarm).

Dan akhirnya, saya perlu mengirim beberapa data kontrol ke bus CAN dan melihat reaksi terhadap perintah-perintah ini. Kode ditambahkan ke program Arduino yang menerima data dari komputer dan transfer ke bus CAN. Pada tahap ini CyberLib harus ditinggalkan, karena tidak memiliki dukungan untuk mengganggu penerimaan data dalam buffer port serial. Dalam program di komputer, saya menambahkan beberapa bidang teks di mana Anda dapat memasukkan berbagai parameter dan tabel untuk melihat respons aktuator. Contoh di bawah ini menunjukkan perintah kontrol mengaktifkan / menonaktifkan kecepatan pertama kipas pendingin (0x0A) dan mengaktifkan / menonaktifkan kopling AC (0x0B).

Ringkasan
Hampir tidak ada tempat untuk menemukan dekripsi lengkap dari data pabrikan, terutama yang resmi. Dalam kasus terbaik, ini akan menjadi penelitian orang lain dalam rangka implementasi beberapa fungsi tambahan. BISA sniffer dapat membantu Anda menemukan data ini. Saya dapat menemukan sekitar 40 parameter mobil yang berbeda dan demi percobaan, berdasarkan data yang diterima, saya membuat kendali sendiri atas kipas pendingin.
Saya berharap semua ini bermanfaat tidak hanya bagi saya.