Aracınıza bir CARPC kurmak istediğinizde medya uygulamaları ve diğer her Çin malı üründe olan uygulamalar dışında fark yaratacağınız en önemli kısım araçtan veri almak kısmı oluyor. Bundan önceki yazımda VAN ile comfort bus’tan veri almaktan bahsetmiştim. VAN sadece fransız araçlarına özgü bir protokolken OBD2 dediğimiz araçtan veri alma meselesi, tüm araçlarda bir standart haline gelmiş durumda. Veriyi alma şekilleri bile neredeyse aynı.Ben aracıma CARPC kurma çalışmasına girdiğimde önce ücretsiz front-end dediğimiz uygulamaları kullanarak başladım. Ama kafamdaki farklı fikirleri kullanarak çok fazla uygulamayı özelleştiremedim. Bu sebeple C#.NET kullanarak kendi ön yüzümü yazmaya başladım. Medya uygulamaları, görünürlük ve internet üzerinden TV izleme çok fazla vaktimi almadı. Ama OBD2 üzerinden aracın hız, devir motor sıcaklığı gibi verilerini çekmek oldukça fazla ön araştırma gerektirdi. Hazır programlar kullanarak bu bilgileri araç bilgisayarınızdan alabiliyorsunuz. Bu uygulamaların ücretsiz sürümleri olduğu gibi paralı sürümleri de mevcut. ScanTool.NET açık kaynak kodlu eski bir uygulama fakat her araçla çalışmıyor. Hazır uygulamalara çok girmektense bu uygulamaların datayı nasıl aldığından bahsetmek çok daha mantıklı.Araçlarda 16 pinli standard bir OBD2 portu oluyor. Aracınızı servise götürdüğünüze servisteki teknik arkadaşların aracı bilgisayara bağladığı port burasıdır.Benim aracımda bu port önde bulunan sigaralık kapağının altında bulunuyor. OBD2 portu üzerinden bilgisayara veri alabilmenin en kolay yolu ise ELM327 dediğimiz adaptörlerden kullanmak. USB çıkışını bilgisayarınıza bağlayıp seri veri cinsinden veriyi alabiliyorsunuz. Piyasadaki diğer diagnostic uygulamarıda bu donanımla uyumlu bir şekilde çalışabiliyor.

cihazı bilgisayarınıza tanıttığınızda cihaz sanal bir com portu oluşturuyor sisteminiz üzerinde ve bu com portu üzerinden cihazla haberleşebiliyorsunuz.

OBD2’den veri alabilmek için ilk önce initialize işlemini gerçekleştirmeniz gerekmekte. Yani aracınızın marka modeline göre OBD2 protokolündeki farklılıklara göre bağlantıyı başlatmanız ve PID dediğimiz verilerin akışını başlatmanız gerekmekte.

OBD2’deki her parametre (hız, motor devri, motor yükü gibi..) 4 haneli bir Hex sayıyla ifade edilir. Siz hız verisine ulaşmak istediğiniz com portuna “010C” verisini gönderirsiniz, o da size response olarak 010C ile başlayan ve sayısal değerle devam eden bir hex sayı dizisi gönderir. Sizde response’un başındaki 010C’yi kontrol edip bunun hız değeri olduğunu anlarsınız ve verinin devamını bu şekilde işlersiniz.

Şimdi basit bir initialize işleminin nasıl yürüdüğünden bahsedeyim. ELM327 dediğimiz ara bağlantı cihazı modemlerden alışkın olduğumuz AT komutlarıyla çalışır. AT komutlarıyla initialize işlemini gerçekleştirip cihazı bu komutlarla hazır duruma getiririz.

Örnek initialize işlemini C# komutlarıyla beraber yazıyorum;

serialPort1.PortName = comPort;

            try { serialPort1.Open(); }
            catch (System.Exception excep) { durum(false); }

            data_gonder("ATZ");
            System.Threading.Thread.Sleep(2000);
            data_gonder("ATE0");
            System.Threading.Thread.Sleep(1000);
            data_gonder("ATL0");
            System.Threading.Thread.Sleep(500);
            data_gonder("ATH1");
            System.Threading.Thread.Sleep(500);
            data_gonder("ATSP 5");
            System.Threading.Thread.Sleep(500);
            data_gonder("01 00");
            System.Threading.Thread.Sleep(500);

Yukarıdaki kod, serialport component’ini başlatıp ilgili portun tanımını yaptıktan sonra bağlantıyı açıyor. Eğer problem olursa program saçmalamasın diye try catch ile beraber kullandım.

Daha sonra ATZ komudunu porta gönderip donanımı resetliyor, ardından ATE parametresini “0” a çekip extended response’ları kapatıp veri kalabalığını önlüyor. Aynı şekilde ATL0 ve ATH1 komutlarını gönderiyor. Bu yukarıdaki 3 komutta response’ların formatını belirliyor. ATH1 Header’ı etkinleştiriyor böylece verdiği response’un başında hangi PID için response verdiğini anlayabiliyorum. ATSP parametresi araca hangi OBD2 protokolüyle bağlanması gerektiğini belirtiyor. ATSP1, birinci protokol, ATSP2, ikinci protokol gibi. Normalden farklı bir protokolle bağlantı kurulmaya çalışıldığında hata uyarısı response olarak dönüyor zaten. Benim Citroen C4 aracım için ATSP5 uygun protokol. Protokol isimlerini tek tek burda anlatıp kalabalık yapmıyorum, wikipedia’dan obd2 diye aratırsanız hepsini boundrate değerleriyle beraber görebilirsiniz. “0100” değerini de veri gelip sistemin OK olduğunu anlamak için kullanıyoruz.

Yukarıda da bahsettiğim gibi motor verilerinin her birinin bir PID değeri var.

01 0C 2 Engine RPM 0 16,383.75 rpm ((A*256)+B)/4
01 0D 1 Vehicle speed 0 255 km/h A

örnek olarak motor devrini almak için com portuna 010C verisini gönderiyoruz, araçta bize response olarak 01 0C aa bb diye bir değer gönderiyor.  Burdan motor devrini hesaplamak için aa dediğimiz hex sayıyı dec e çevirip A haline getiriyoruz. Aynı şekilde B’yi de hesaplıyoruz. Ardından yukarıdaki tablodaki gibi ((A*256)+B)/4 işlemini yapıyoruz. Bu bize motor devrini tam sayı olarak veriyor.

Diğer PID formatlarına ulaşmak için ; http://en.wikipedia.org/wiki/OBD-II_PIDs

Her araç tüm dökümante edilmiş PID değerleri bize verecek diye bir kaide yok. PID değerleri tüm marka araçlar için genelde aynıdır ama her araç her PID’yi desteklemez. Siz araca desteklenmeye bir PID için response beklediğinizde gelen response “not supported” tarzı bir hata mesajı olacaktır.

Ben kendi aracım için ; Hız, motor devri, motor sıcaklığı, motor yükü, motor hava kütle akışı, araç akü voltajı gibi değerleri alabiliyorum.

Bir gözden kaçırmamız gereken nokta ise, veri yolladıktan sonra 200 milisaniye gibi bir süre sonra response geliyor ve program kodu yazarken bu süreleri göz önünde bulundurmamız gerekiyor. Yukarıda sistemi initialize ederken başka bir komudu göndermeden önce aralara sleep komutları kullanmamın sebebi de buydu. Aracınıza bir veriyi gönderdikten sonra ikinci bir veriyi göndermek için hazır duruma gelmesi için beklemelisiniz.

Bir vereceğim tavsiye de, bu testleri aracınızda yapmak zorunda değilsiniz. “obdsimwindows” diye bir uygulama var ve bu uygulamayı bilgisayarınıza kurarak sanal bir obd2 portu oluşturup verilerinizi bu uygulamaya gönderip test edebilirsiniz.

Ben ilgili uygulamayı mp3car.com forumundan ulaşmıştım;

http://www.mp3car.com/engine-management-obd-ii-engine-diagnostics-etc/137428-free-software-obd-ii-simulator-redux.html

Araştırma yaparken mutlaka yabancı forumları kullanmanızı öneririm. Bu yazı adım adım bir obd2 kaynakçası değil. Sadece size bir yol haritası oluşturmak için temel hatlarıyla haberleşme mantığını anlatmaya çalışan bir makale.