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;
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.
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
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
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
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
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
View Comments
merhaba ben elm 327 cihazı aldım ama cd si yok driverini nerden bulabilirim
Aşağıdaki makalede tüm iletim sistemleri için kurulumu adımlarla çok güzel açıklamış : http://www.totalcardiagnostics.com/support/Knowledgebase/Article/View/1/0/how-to-install-elm327-usb-cable-on-windows-and-obd2-software
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
Teşekkürler
Teşekkürler
teşekkürler