‘CANBUS’ Kategorisi için Arşiv

Arduino ve CAN BUS

Yayınlandı: Mart 7, 2013 / arduino, bus, CAN, CANBUS, mcp2515, mcp2551, OBD, VAG
Etiketler:, , ,
Yeni eklenenler: BUS (CAN/LIN/K-LINE)

Elm ve OBD konusunda bahsetmiştim, araç bilgilerini okumanın başka bir yolu da, araç içinde dolaşan farklı canbus hatlarına girmektir. Bus sayısı, hızları, ve içerdiği bilgiler farklı olabiliyor ancak genelde tüm araçlarda CANBUS protokolü kullanılıyor.

Farklı hatlar, farklı bilgiler topluyor ve bu hatlar aynı zamanda, gateway ünitesi üzerinden birbirleri ile de haberleşiyor. 

gateway

OBD portundan alınan bilginin fazlasını, diğer hatlardan almak mümkün. VAG araçlarına ait canbus diagramı aşağıdaki gibi.

Burada şeması verilen devre, bir CAN kontrolcü ve mikrokontrolcüden oluşuyor.
CAN kontrolcü olarak Mikrochip firmasının MCP2515 entegresi, mikrokontrolcü olarak da, Arduino nano kartı kullandım. 

Arduino’nun (veya ATMEGA’nın) MCP2515 bağlantısı için SPI ve INT pinleri kullanılıyor. 
MCP2515’in RST ucu, arduino kartının reset ucuna bağlanacak. (hardware reset için)

Devre 3 modda çalışabiliyor.

  • mod-1 Sniffer
  • mod-2 OBD2 Reader
  • mod-3 Sender

Mod seçimi D6 ve D7 pinlerine bağlı switch ile yapılıyor. Şemada göstermedim ama D6 ve D7 pinleri 10k direnç ile şaseye çekilmeli.

anahtar “B” konumunda ise; devre, periyodik olarak, bazı OBD komutlarını gönderiyor ve bu komutların yanıtlarını alıyor. Bu, bağlantı testi için kullanılabilir. Aynı kodları veya daha fazlasını “C” konumunda da gönderebilirsiniz.

OBD için gönderilen komutlar:
ENGINE_COOLANT_TEMP  (0x05) 
ENGINE_RPM           (0x0C)  
VEHICLE_SPEED        (0x0D)  
INTAKE_AIR_TEMP      (0x0F)  
CONT_MODULE_VOLT     (0x42) 
AMBIENT_AIR_TEMP     (0x46)  
CATALYST_TEMP_B1S1   (0x3C)  

Switch “A” konumunda ise, canbus hattındaki data trafiği dinleniyor. Filtre veya mask tanımlanmamış ise, hat üzerindeki tüm datalar izlenebilir.

Switch “C” konumunda ise, yazılan komutu can hattına gönderiyor ve yanıtını bekliyor.

Hattan alınan tüm datalar, tanımlanmış bir formatta, arduino’nun seri çıkışına gönderiliyor.
PC arayüzü bu dataları alıp tabloya yazıyor. Bu arayüz üzerinden, hat hızı, maske ve filtre tanımlamak ve komut göndermek de mümkün.
cantools
Başta da dediğim gibi, araç içindeki tüm can hatları gateway’de birleşiyor ve gateway
bu hatlar üzerinde geçiş sağlıyor. OBD soketi üzerinden de bu hatlara geçiş olduğunu düşünüyorum ama bu konuda fazla deneme imkanım olmadı. Bazı markalarda, OBD soketinde, diagnostik hattının haricindeki hatlar da bulunabiliyor. Şayet yoksa, yapılması gereken, hattın geçtiği bir noktadan, paralel uç almak.
Örneğin, vw grubunda, radyo soketindeki can hattına bağlanıp data akışını dinlemek ve
buradan bazı işlemler yapmak mümkün. (direksiyondaki butonları okumak, radyo veya yol bilgisayarı ekranına yazı yazmak gibi) Diğer bilgiler için başka hatlara bağlanmak gerekiyor.

OBD-II Araç Bilgi Ekranı

Yayınlandı: Ocak 3, 2013 / CANBUS, ELM327, OBD, OBD2, VAG, VAG-COM
Etiketler:, , ,
Aracın bilgi ekranında gösterilmeyen bazı verileri izlemek, bazılarını da bir araya toplamak için küçük bir projeye başlamıştım. Henüz tam olarak bitmese de sona yaklaştım.
OBD2 soketi bazı markalarda farklılık gösterse de genelde resimdeki gibi 16 pinli bir soket.
Direksiyonun alt taraflarında veya orta konsolda oluyor, C4’lerde kül tablasının altındaydı örneğin. Astra’da vitesin arkasında, kapağın altına gizlenmişti. Seat’da sol altta, yine kapağın altında.
Donanım 2 bölümden oluşuyor.
1.bölüm, OBD portundan verileri alıp işleyen ve seri olarak displaye gönderen modül
2.bölüm, seri dataları işleyip ekrana basan 3.2″ lik grafik ekran ve 320×240 çözünürlükte. Üzerinde kendi kontrolcüsü ve donanımsal seri portu var. 
 
Alınan datalar:
Hız
Motor devri
Motor suyu sıcaklığı
Dış ortam sıcaklığı
Turbo hava girişi sıcaklığı
CAT sıcaklığı

AKÜ voltajı

Yakıt tüketimi ile ilgili bilgiler maalesef hazır olarak gelmiyor. Saatteki yakıt tüketim (lt/h) bilgisi alınabiliyor. ancak anlık tüketim, ortamalama tüketim vs. bilgilerin,
bazı datalardan hesaplanarak çıkartılması gerekiyor. (Araç hızı, MAF sensör bilgisi gibi) Bunların dışında, OBD2’den gelen birçok data var, istenirse bunlar da işlenip kullanılabilir.


Verileri diagnostik portundan okumanın bir kaç yolu var.
ELM çipli bir devre (veya hazır modül) kullanabilirsiniz veya PIC/Ardunio gibi bir kontrolcü kullanabilirsiniz.
ELM kullanacaksanız, daha önceki konularda anlattığım gibi, AT komutlarını kullanabilirsiniz. Bağlantı kurulduktan sonra, mod ve pid değerlerini sorgulamanız yeterli.

Mode: 0x01 için sorgulanacak pid değerleri:

#define ENGINE_COOLANT_TEMP 0x05  //A-40
#define ENGINE_RPM          0x0C  //((A*256)+B)/4
#define VEHICLE_SPEED       0x0D  //A
#define INTAKE_AIR_TEMP     0x0F  //A-40
#define CONT_MODULE_VOLT    0x42  //((A*256)+B)/1000
#define AMBIENT_AIR_TEMP    0x46  //A-40
#define ENGINE_OIL_TEMP     0x5C  //A-40
#define CATALYST_TEMP_B1S1  0x3C  //(((A*256)+B)/10)-40
ELM entegresini veya hazır devreleri kullanmak istemezseniz, diagnostik portla bağlantı kuracak bir arabirime ihtiyacınız olacak. Bunun için microchip firmasının 2515 ve 2551 canbus entegrelerini kullanabilirsiniz. 

Canbus haberleşmesi, bir-iki satırla geçiştirilmeyecek kadar kapsamlı. O nedenle, bunu daha sonraya bırakıyorum. Ben, test için daha önce yaptığım CANBUS arabirimini kullandım.

 


Modül, OBD2/CANBUS hattına sürekli olarak yukarıdaki sorgu komutlarını gönderiyor ve aşağıdaki şekilde yanıt alıyor. Bu datalar belirli bir formata çevrilip, seri port üzerinden grafik LCD’ye gönderiliyor.

Display devresi, seri porttan gelen bilgileri işleyerek ekrana yazıyor.
Arabirim ve GLCD 5V ile çalışıyor. Deneme için diagnostik portundaki 12V çıkışını kullandım. Kontak kapalı olduğunda bile bu uçta gerilim var. Test için kullanılabilir ancak kalıcı bir uygulama için başka bir yerden +12V almak daha mantıklı.

Yukarıda bahsettiğim grafik display, ELM327 modülünü AT komutları ile sorgulayacak ve gelen dataları işleyecek kapasitede. ELM modülü ile ek bir devre olmadan da okuma yapılabilir.

Burada karşıma çıkacak en büyük sorun, kullandığım ekrana, araç içinde uygun ve güzel bir yer bulmak. tabi bu her model araç için farklı çözümler gerektiriyor.
Proje istediğim gibi gelişirse, ilerleyen zamanlarda, aracın kendi multimedya sistemini kullanmayı düşünüyorum.

VAG araçlarında (vw, seat, audi, skoda) kullanılan RCD/RNS510 medya cihazının, geri görüş kamerası için bir video girişi bulunuyor. Bu giriş bir kontak girişiyle tetikleniyor.

 
Okunan ve işlenen dataları PAL formatında göndermek, -zahmetli olsa da- mümkün. Yine bu bilgiler, MFD üzerinde de izlenebilir. 

devam edecek…


linkler:
ELM327 ile OBD-II Haberleşmesi -1
ELM327 ile OBD-II Haberleşmesi -2
ARDUINO-CANBUS
CAN-Blue
CAN-Black

ELM327 ile OBDII haberleşmesi -II

Yayınlandı: Ocak 2, 2013 / CANBUS, ELM, ELM327, OBD, PID

Elimizde ELM çipli bir okuyucu olduğunu düşünelim. bununla, OBD portundan bilgi okumak istiyoruz. Elinizdeki bluetooth destekli bir modelse, öncelikle yapmanız gereken, bluetooth bağlantısını kurmak ve bağlantı için atanan sanal COM portun hangisi olduğunu belirlemek.
Hyperterminal programını açın, modülü bağladığınız portu seçin. Baud hızını ayarlayın. (modüle göre değişmekle beraber genelde default olarak 38400 baud kullanıyorlar) 
Bağlantı kurulduğunda veya ‘ATZ’ komutu gönderdiğinizde aşağıdaki gibi bir yanıt gelmeli.

ATZ
ELM 327 v1.X
>

Bu yanıtı aldıysanız bağlantı kurulmuş demektir.  ELM birden fazla protokolü destekliyor, protokolü ve baud rate değerini bilmiyorsanız, otomatik modu kullanabilirsiniz.

Protokol ve hızı otomatik ayarlaması için aşağıdaki komutu gönderiyoruz.

>ATSP 0
>OK

hız ve protokol sorgulama:
>ATDP
>AUTO

Artık istediğiniz bilgileri sorgulayabilirsiniz.

Sorgulama kodu  ‘Mode’ ve ‘PID’ olmak üzere 2 bayttan oluşur.
Mode 01, anlık dataları okumak için kullanılır.

PID ise, okunacak sensör bilgisinin kodudur. 
örneğin; PID 0x05, ‘Soğutma suyu sıcaklığı’ değeridir.

bu konuda detaylı bilgiyi
http://en.wikipedia.org/wiki/OBD-II_PIDs adresinde bulabilirsiniz.

Mode
(hex)
PID
(hex)
Data bytes returned Description Min value Max value Units Formula
01 00 4 PIDs supported [01 – 20]
01 01 4 Monitor status since DTCs cleared. (Includes malfunction indicator lamp (MIL) status and number of DTCs.)
01 02 2 Freeze DTC
01 03 2 Fuel system status
01 04 1 Calculated engine load value 0 100  % A*100/255
01 05 1 Engine coolant temperature -40 215 °C A-40

‘Soğutma suyu sıcaklığı’ değerini okumak için aşağıdaki şekilde mode ve PID değerini gönderin.

> 01 05
> 41 05 7B

burada 7B sorgumuzun sonucudur, değeri desimale çevirip formülü uygularsak (bu komut için A-40) 123-40 = 83°C değerini buluruz.

Araçların çoğu standard PID’leri desteklese de, her araçda tüm komutlar okunamayabiliyor. Aracınızın hangi PID’leri desteklediğini görmenin de kolay bir yolu var.
PID 00, 20, 40 ,60 ve 80 aracın desteklediği PID numarasını geri döndürür.


>01 00 sorgusunun yanıtı 4 bayttır ve bu 4 bayt, 0x01 ile 0x20 arasındaki 32 adet PID’in hangilerinin desteklendiğini gösterir.

Örneğin:

>01 00
>41 00 BE 1F A8 13

             B    E    1    F    A    8    1        3              
            ---- ---- ---- ---- ---- ---- ----  ----------
supported?  1011 1110 0001 1111 1010 1000 0001  0  0  1  1
PID num     1234 5678 9ABC DEF. .... .... .... 1D 1E 1F 20

Bu şekilde, aracınızın desteklediği komutları alabilir ve  sorgulama yapabilirsiniz.
Burada sadece anlık sensör bilgilerinin alınması konusunda bilgi vermeye çalıştım. Diğer modlarda arıza bilgilerini almak, arıza ışığını söndürmek, araca ait diğer bilgileri almak mümkün.

OBD2 ile ilgili örnek uygulama için <Araç Bilgi Ekranı> linkine bakabilirsiniz.

Link:
ELM327 ile ODBII haberleşmesi -I

Kaynak:
wikipedia.org