← Tüm projeler

Proje 02 · 2026

CAN-Bus Sniffer ve RPM Çözümleme

Bir aracın OBD-II soketinden CAN trafiğini dinleyip, üreticiye özel motor devri sinyalini tersine mühendislikle bulan araç seti.

Rol
Tek geliştirici
Donanım
CANable V2.1
Yazılım
Python, python-can
Kaynak
GitHub ↗

02.1Özet

Araçların içindeki kontrol üniteleri birbirleriyle CAN hattı üzerinden konuşur. Standart OBD-II sorguları bazı değerleri verir, ama üreticiler asıl verilerin çoğunu kendi tanımladıkları mesajlarla yayınlar ve bu mesajların anlamı belgelenmemiştir.

Bu projede bir Toyota Hilux'un OBD-II soketine sadece dinleme modunda bağlandım, ham çerçeveleri kaydettim ve farklı motor devirlerinde alınan kayıtları karşılaştırarak devir sinyalini buldum: CAN ID 0x2C4, ilk iki bayt big-endian, ölçek ×0.8. Ardından bu sinyali canlı gösteren bir devir saati uygulaması yazdım.

02.2Blok diyagram

CAN dinleme zinciri blok diyagramı Araç ECU'ları kontrol üniteleri OBD-II soketi pin 6 / 14 / 5 CAN · 500 kbit/s CANable V2.1 SLCAN · listen-only CAN canable_logger.py çerçeve → CSV USB rpm_analyzer.py kalibrasyon CSV rpm_gauge.py devir saati 0x2C4 rpm_live.py terminal RPM

02.3Özellikler

AdaptörCANable V2.1 (stok SLCAN firmware)
Çalışma moduM1 silent / listen-only: hatta çerçeve gönderilmez
Bit hızı500 kbit/s (250 kbit/s seçilebilir)
BağlantıCANH → OBD pin 6 · CANL → pin 14 · GND → pin 4/5
SonlandırmaKapalı: araç hattı zaten sonlandırılmış
Kayıt formatıCSV (session_id, timestamp, can_id, data_hex, raw_line)
Bulunan sinyal0x2C4 · D0–D1 big-endian · RPM = raw × 0.8

02.4Yöntem

Devir sinyalini bulmak için araç sabit, vites boşta ve el freni çekiliyken üç kısa kayıt aldım: rölanti, 1500 ve 2500 d/dk. Her kayıtta gösterge veya diagnostik cihazdan okunan gerçek devir referans alındı.

python3 canable_logger.py --duration 15 --output data/rpm_idle.csv
python3 canable_logger.py --duration 15 --output data/rpm_1500.csv
python3 canable_logger.py --duration 15 --output data/rpm_2500.csv

python3 rpm_analyzer.py calibrate \
  --sample data/rpm_idle.csv=750 \
  --sample data/rpm_1500.csv=1500 \
  --sample data/rpm_2500.csv=2500

rpm_analyzer.py her CAN ID için olası 16 bitlik alanları (başlangıç baytı, endian) tarar ve referans devirlerle en tutarlı doğrusal ilişkiyi (ölçek, ofset) veren adayı sıralar. Kayıtta standart OBD cevabı 41 0C A B varsa doğrudan ((A × 256) + B) / 4 formülü kullanılır.

0x2C4 çerçevesinin bayt yerleşimi CAN ID 0x2C4 · DLC 8 · örnek çerçeve 03 D0 C0 D1 00 D2 00 D3 00 D4 00 D5 00 D6 00 D7 raw = (D0 << 8) | D1 = 0x03C0 = 960 RPM = raw × 0.8 = 768 D2–D7: bu çalışmada kullanılmadı

02.5Yazılım

canable_logger.pyHam çerçeveleri canlı gösterir ve CSV'ye ekler. Her çalıştırma yeni bir oturum kimliği üretir.
rpm_analyzer.pyKayıtları tarar, RPM adaylarını sıralar ve kalibre eder.
rpm_live.pyTerminalde yalnızca devir değerini gösterir.
rpm_gauge.pyAnalog/dijital devir saati. Ölçek canlı ayarlanabilir, kayıtlı CSV oynatılabilir.
CANalyzerSavvyCAN benzeri genel analiz uygulaması: live/trace görünümü, DBC ile decode, filtre, grafik, periyodik gönderim, CSV/ASC/JSON log.

Örnek terminal çıktısı:

     1.242s  RPM:   768.0  raw: 03 C0 00 00 00 00 00 00

CANalyzer'ın Dashboard sekmesinde devir saati, gaz pedalı sinyali ve tezgâh testi için sanal gaz pedalı bir arada:

CANalyzer Dashboard: Gösterge (0x2C4, ×0.8) ve gaz pedalı (0x2C1) yapılandırması, sanal pedal ve ACİL STOP.
Şekil 3CANalyzer Dashboard — Gösterge (0x2C4, ×0.8) ve gaz pedalı (0x2C1) yapılandırması, sanal pedal ve ACİL STOP.
Filtre paneli: Yön (RX/TX), ID aralığı ve ID listesine göre filtreleme.
Şekil 4Filtre paneli — Yön (RX/TX), ID aralığı ve ID listesine göre filtreleme.
Şekil 1Tezgâh testi — CANable'a bağlanıp sanal gaz pedalıyla 0x2C1 çerçevelerinin her 32 ms'de gönderilmesi.
Şekil 2Arayüz turu — Bağlantı, gönderim (OBD-II hazır sorguları dahil) ve filtre sekmeleri.

02.6Sonuçlar ve öğrenilenler

  • Üreticiye özel yayın sinyali (0x2C4) sürekli geldiği için canlı izleme için OBD sorgusundan daha uygun: hatta hiçbir istek göndermek gerekmiyor.
  • Araca bağlanırken güvenlik öncelikli: adaptör listen-only modda açılıyor, 5V çıkışı ve sonlandırma direnci kullanılmıyor.
  • OBD soketinin arkasında bir gateway varsa araç içi bazı ağlar görünmeyebilir. Bu yüzden önce hangi mesajların göründüğünü kaydetmek gerekiyor.