Categories: ElektronikYazılım

Elm327 ile OBD2 verisi almak

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.

burakalakus

View Comments

  • Merhaba

    Dizel bir aracın anlık ve ortalama yakıt bilgisi hangi formul kullanılarak yapılıyor?
    Yardımcı olabılır mısınız?

  • Merhaba

    obdsimwindows uygulamasını com0com programı ıle bırlıkte açıyorum.Obdsim den succesfuly mesajı gelıyor

    Ancak herhangı bır obd programında ilgili sanal obd portunu seçip baglanaıyorum.
    Bu konuda yardımcı olur musunuz?

  • çok sağolun gerçekten güzel bir yazı olmuş.. yazdığınız programı proje olarak buraya koyma ihtimaliniz var mı?

    • Bu aslında boş vakitlerimde vakit harcadığım yaklaşık 6-7 ay vakit alan dokunmatik ekran için dizayn ettiğim bir visual studio solution'ın bir parçası. Kısacası uzun zamandan beri açmadığım bir proje ve içinden sadece bu kodu alıp çıkarmak gerçekten zor :) Çünkü içinde medya oynatıcı, ibbtrafik, telefon vs. modülleri var ayrıca.

      Aynı zamanda kodun büyük bölümünü kendi kullandığım araca göre optimize ettim. Aracım manuel vitesli bir araç, hangi viteste gittiğimi normal şartlarda arabadan alabileceğim bir arayüz yok. Onun yerine bende hız/devirden dişli oranı hesaplayıp vites tahmini yaptım.

      Ama boş bir vaktimde elm327 tarafı için çok basit bir modül yazabilirim. Kodu dll haline getirip yada açık bir şekilde class halinde de paylaşabilirim. Bu şekilde daha çok işinize yarar.

      Bu arada blogumun ingilizce versiyonunda sormuş bir arkadaş, data_gonder fonksiyonu benim eklediğim bir fonksiyon. Onun içeriğinide yazmamışım buraya.

      1 buçuk yıl önce yazdığım bir kod, şimdi yazsaydım timer'lar yada sleep yerine adam gibi threading yapardım.

      • Bir öğretmenimin bana verdiği projenin son kısmında böyle bir program yazmam gerekiyor ama tam mantığı ve kodları kafama oturamadı :) eğer böyle bir class veya örnek proje paylaşırsanız bana çok yardımcı olursunuz :).. şimdiden teşekkürler

Recent Posts

Geeklink Homekit Entegrasyonu

Geeklink Homekit Entegrasyonu Read More

5 sene ago

Linux Timezone Değiştirme (RHEL / CentOS)

Linux Timezone değiştirme işlemini komut satırından kolaylıkla yapabilirsiniz. Tüm bölgeler için timezone bilgileri /usr/share/zoneinfo/ altında saklanır. /etc/localtime ise zoneinfo altındaki… Read More

5 sene ago

Avaya SAL Gateway

Avaya SAL Gateway (Secure Access Link), Avaya tarafından ürünlerine uzaktan destek vermek için kullanılan bir uzak bağlantı çözümü. Read More

5 sene ago

Fping Komutu ve Kullanımı

Ping, işletim sisteminden bağımsız en çok kullandığımız komutlardan biri. Ağ erişim problemlerinde sorunu izole etmeden tutun da bir cihazın çalışıp… Read More

5 sene ago

Manchester Kodlaması Nedir?

Haberleşme birden fazla paydaş gerektirir ve tıpkı bir orkestra gibi uyumlu olması şarttır. Nasıl müzikte bas gitar davul "kick"iyle uyumlu… Read More

5 sene ago

SSH Key ile Şifresiz ve Güvenli Sunucu Erişimi

Bilgi işlem sektöründeyseniz özellikle gün içinde bir çok farklı Linux/Unix sunucuya erişiminiz varsa şifre hatırlamak, bunları saklamak, hem zulüm hem… Read More

8 sene ago