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.
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
02.3Özellikler
| Adaptör | CANable V2.1 (stok SLCAN firmware) |
|---|---|
| Çalışma modu | M1 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ırma | Kapalı: araç hattı zaten sonlandırılmış |
| Kayıt formatı | CSV (session_id, timestamp, can_id, data_hex, raw_line) |
| Bulunan sinyal | 0x2C4 · 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.
02.5Yazılım
canable_logger.py | Ham çerçeveleri canlı gösterir ve CSV'ye ekler. Her çalıştırma yeni bir oturum kimliği üretir. |
|---|---|
rpm_analyzer.py | Kayıtları tarar, RPM adaylarını sıralar ve kalibre eder. |
rpm_live.py | Terminalde yalnızca devir değerini gösterir. |
rpm_gauge.py | Analog/dijital devir saati. Ölçek canlı ayarlanabilir, kayıtlı CSV oynatılabilir. |
| CANalyzer | SavvyCAN 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:


0x2C1 çerçevelerinin her 32 ms'de gönderilmesi.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.