본문 바로가기
기타_모아/자료실

[스크랩]아듀이노 OBD-II 스캐너 제작

by KANG Stroy 2013. 6. 10.
728x90
728x90

OBD (On-Board Diagnostics)란?
자동차는 계측제어를 위해 센서를 탑재하고, ECU로 엔진을 제어하고 있다. 
ECU는 점화시기와 연료분사, 가변 밸브 타이밍, 공회전, 한계값 설정 등 엔진을 제어하며, 
자동변속기 제어, 구동계통, 제동계통, 조향계통 등 차량의 모든 부분을 제어하는 역할을 한다. 
 
전자 진단장치는 최근 ODB(On-Board Diagnostic)라는 국제표준(ISO) 규격으로 정착되었다. 
OBD 표준은 자동차에 부착된 센서에서, ECU로 전달된 자동차의 상태나 고장정보를, 
직렬 통신을 이용하여 자동차의 콘솔이나 외부장치에서 볼 수 있도록 한 기능이다. 
OBD-II 표준의 제정으로, 향후 차량 자동진단 장치의 시장이 창출될 것으로 예상된다.

ODB-II용 DTC표시장치 및 커넥터 
Actron PocketScan CP9125와 차량의 ODB-II 커넥터 (SAE J1962)
   

ODB-II 커넥터 (표준 배열)
2 번 --- J1850 (BUS+)
4 번 --- GND (-) <--- 접지 -
5 번 --- S-GND (신호접지)<---  ODB-II GND
6 번 --- J2284 (CAN-H)
7 번 --- ISO9141-2 (K-LINE) <--- ODB-II K
10 번 --- J1850 (BUS-)
14 번 --- J2284 (CAN-L)
15 번 --- ISO9141-2 (L-LINE) <--- ODB-II L
16 번 --- BAT (+) <--- 전원+
 
       SAE J1962 차량측 (Female)


ODB-II 인터페이스의 종류 및 연결방법  
4(GND) 핀과 16(BAT+) 핀은 공용이다. 
지엠의 J1850 VPW는  2(1850 BUS+), 5(SIG-GND) 핀을 사용한다.
포드의 J1850 PWM은 2(1850 BUS+), 5(SIG-GND), 10(1850 BUS-) 핀을 사용한다.
크라이슬러의 ISO 9141-2는 5(SIG-GND), 7(9141-K), 15(9141-L) 핀을 사용한다.

ODB-II 인터페이스 적용규격
ISO 11519-4 (SAE J1850) 10.4 Kbps VPW ( ~ 1996)
ISO 11519-4 (SAE J1850)  41.6 Kbps PWM ( ~ 1996)
ISO 14230-4 (ISO 9141-2 호환) 10400 bps KWL2000 (1996 ~ )
ISO 15765-4 (BOSCH)  ~125 /250/500 Kbps CAN (2008 ~ )

참고 :  OBD2 케이블 
시중에서 판매하는 케이블, 한쪽은 RS232에 많이 사용하는 DB9 입니다. 
판매 사이트 : http://www.ezdaq.com/goods/view.php?goodsno=282 (소매 27,500원)

 
 
 
J1962 OBD-II 16 Pin Male Connector
중국 www. diytrade.com에서 판매하는 OBD 커넥터
중국 사이트 : http://www.cct-elec.com/  (소량구매 불가)
미국 사이트 : http://www.mefi4.com/sc/details.asp?item=obd2conn (소매 $5.95)
    

-----------------------------------------------------------------------------------------------------------------
ODB-II 인터페이스 회로 
(ISO K Line 칩 MCZ32290을 사용한 예) 
ISO K Line Serial Link IC 데이터 : http://www.freescale.com/files/analog/doc/data_sheet/MC33290.pdf
 
  
OBDUINO에 사용하는 ODB-II 인터페이스 회로 
전용 IC인 MC33290을 사용하지 않고, 이산(descrete) 부품을 사용한 ISO9141-2 인터페이스 회로이다. 
작동원리는 MC33290의 내부회로와 기능이 같으므로, OBDuino 인터페이스로 사용이 가능하다.

좌측의 아듀이노 MPU 기판의 D2와 D2에 연결, 우측은 SAE J1962 (Male 16핀) 커넥터에 연결한다. 
ODB-II 커넥터 16 번핀에 연결된 9V 출력은 M168-MINI 기판의 9V 전원입력(24번 핀)으로 연결한다.

       
-----------------------------------------------------------------------------------------------------------------
아듀이노 호환기판 M168-USB와 M168-MINI로 만든 OBDuino

참조 사이트 : http://code.google.com/p/opengauge/w/list 

일반 호환기판을 사용한 회로
 
주의 : 기판에 따라서 12V를 입력할 수 잇도록 7805 Regulator 회로가 장착된 제품이 많다.


아듀이노 M168-USB  기판을 사용한 회로 
 

 
M168-USB와 MINI 기판은 VCC로 LCD를 구동하기 위해, LM1117-5.0 LDO와 XTA은 16MHz를 장착하고 있다.
회로도 좌측 하단의 USB232 인터페이스는 M168-USB 기판에 장착된 기본회로이며, PC의 USB 포트로 연결한다. 
M168-USB 아듀이노 호환기판를 사용하면, OBDuino를 PC에 연결하여 PC 스캐너 소프트웨어를 사용할 수 있다.

  
M18-USB 기판 소개 : http://www.avrtools.co.kr/technote7/board.php?board=tnshoppublic&command=body&no=44

OBDuino의 16X2 LCD
아듀이노 기판과 LCD 표시기는 다음과 같이 연결한다. (DB0 ~ DB3은 연결없음)
                GND ---  LCD GND (1)
                 +5V ---   LCD VCC (2)
아듀이노 포트 D6 --- LCD Contrast (3)
아듀이노 포트 D4 --- LCD RS (4)
                 GND --- LCD R/W (5)
아듀이노 포트 D5 --- LCD Enable (6)
                              LCD DB0
                              LCD DB1
                              LCD DB2
                              LCD DB3
아듀이노 포트 D7 --- LCD DB4
아듀이노 포트 D8 --- LCD DB5
아듀이노 포트 D12 --- LCD DB6
아듀이노 포트 D13 --- LCD DB7
아듀이노 포트 D9 --- LCD BL+ (15) 
                 GND --- LCD BL- (16)

OBDuino의 스위치
OBDunio에 연결된 3개의 누름 단추의 기능은 다음과 같다.
A3 포트 --- S1 (좌측) = SELECT (DEC/NO) = 화면을 전환,혹은 숫자감소/NO
A4 포트 --- S2 (중앙) = MENU  (NEXT) = 매뉴선택,혹은 다음 매뉴.
A5 포트 --- S3 (우측) = BRIGHT (INC/YES) = 밝기 40~160 선택,혹은 숫자증가/YES

S2+S3 = 거리계(trip meter) 리셋을 Y/N를 선택하고,S2를 누르면 실행한다.
S2 (중앙)를 누르면 설정 매뉴가 나온다.
- LCD Contrast = 0-100, LCD의 명암을 조절
- Metric 단위 = 단위선택, NO =rods and hogshead, YES=SI
- Fuel/hour speed = 0-255, 속도의 단위를 선택 L/100 혹은 MPG를 L/h 혹은 GPH
- 연비 효율 = 0-100%, 차량의 MAP을 흡기량(MAF)으로 에뮬레이트, 연비를 %로 표시한다.
- 엔진 배기량 = 0.0-10.0, MAP =2,0은 2000cc를 말한다
- PID 설정 =NO/YES, PID를 선택하면 PID 설정화면이 나온다, (ECU 연결이 없으면 작동이 안됨)

- 화면설정(Scr 'n' Corner 'm') = 0x00-0xFF, YES를 누르면 먼저 아이템을 선택, M 코너의 n을 선택,
  0xF0 - 표시없음, 만일 다른 PID를 선택하면, 결과를 8자 이상으로 사용할 수 있다.
  0xF1 - 순간 연료소비량 (instant Fuel Consumption)
  0xF2 - 거리당 평균 연료소비량(average consumption on trip)
  0xF3 - 이동한 거리(distance of the trip)
  0xF4 - 차량의 전지 전압 (battery voltage)
  0xF5 - CAN 상태, CAN 프로토콜을 사용할 때, TX와 RX 오류를 표시한다.

OBDuino의 소스
위에서 설명한 OBDuino 하드웨어(MC33290 혹은 ELM327)와 첨부파일 OBDuino.PDE를 사용하면
공개된 설계자료 OBDuino (즉 ODB-II 스캐너)를 제작할 수 잇습니다. 

아듀이노 기판과 소프트웨어는, 통일된 회로와 공개된 소프트웨어를 배포합니다.

소스는 아듀이노 기판의 ATMEGA168-20AU MPU에서, 16MHz XTAL로 작동합니다.
확장자 PDE 파일은 아듀이노 소프트웨어(편집,컴파일,업로드)의 소스 파일입니다.
아듀이노 개발환경 소프트웨어는, 이 자료실 아듀이노 0012 소개를 참조하십시요.


첨부 파일 #1 : 아듀이노 OBDuino.pde <--- 아듀이노 기판으로 ODB-II 스캐너를 만드는 소스.
첨부파일 OBDuino 소스와 M168-USB 아듀이노 호환기판으로 OBDuino 인터페이스를 시험하엿다.
OBDuino 소스는 #DEBUG 옵션을 사용하면, 차량의 OBD-II 커넥터에 연결하지 않고도 기판의 시험이 가능하다.

OBDuino에서 #define DEBUG와 #define ELM 옵션을 사용할 때, 기판의 직렬통신 출력. (9600,N,8,1)
ELM 인터페이스는 직렬통신 포트를 사용하며, 별도의 ELM327 MPU와 약간의 하드웨어를 필요로한다.
ELM327 자료 : http://www.elmelectronics.com/DSheets/ELM327DS.pdf
ISO 9141 인터페이스는 MC33290를 사용하므로, OBD-II 인터페이스 하드웨어가 비교적 간단하다.

OBD-II OBDuino의 작동화면
 
 
------------------------------------------------------------------------------------------------------------------
OBD-II ISO 14230 프로토콜
포맷은 1 비트 시작(LOW), 8 비트 데이터, 1비트 정지(HIGH)로 구성되며, 속도는 10400 bps 이다.
전송은 1 바이트 씩 전송하며, 한 바이트의 전송에서는, LSB 비트를 우선으로 전송한다.
OBD에서는, 여러개의 명령이나 응답은, 상위 바이트를 우선으로 송신한다.
 
고속 초기화 명령 
300ms을 High로 한다음, 5ms 펄스폭 =200 bps로 0xF0을 송신하고, 통신속도를 10400 bps로 바꾸어 명령을 송신한다,
혹은 300ms을 High로, 25ms을 Low, 25ms High로 한다음, 통신속도를 10400 bps로 바꾸어 명령을 송신한다,

저속 초기화 명령  
300ms을 High로 한다음, 200ms 펄스폭 =5 bps로 0x33을 송신하고, 통신속도를 10400 bps로 바꾸어 명령을 송신한다,
 
진단기의 송신 명령 형식
머리문자 (C0 + 명령 수), 목적지 (33), 전송원 (F1), 명령(PID) ~ PID번호(0x??,,,0x??), 첵섬,
송신 코드 예는 0xC1(header, length=1), 0x33(dest), 0xF1(src), 0x81(connect request), 0x66(crc)을 송신한다, 

명령수가 1 이라면 머리문자는 C1 으로 된다. 머리문자 0xC1은 기능주소이고 0x81은 물리주소이다, 
명령을 받는 장치의 주소는 0x33 이고, 보내는 장치의 주소는 0xF1 이다, 전송 내용은 0x81(통신시작을 요청)이다. 
시작명령 A(0x41)는 40을 더하면 0x81을 송신한다.  명령 0x81은 통신시작을 요청하는 식별자(ID)이다
CRC는 0x00으로 시작하여 머리문자부터 CRC를 제외한 모든 문자값을 더한 1바이트 검사자(Checksum)이다.
 
ECU의 응답 형식
머리 (80 + 데이터 수), 목적지(F1), 전송원(01), 데이터(40 + 명령0) ~ 응답(XX) xN, 첵섬(머리~명령 끝), 
응답코드 예는, 0x83(headrer), 0xF1(dest), 0x01(src), 0xC1(OK), 0xE9(kb1), 0x8F(kb2), 0xAE(crc)로 들어온다.

머리문자 0x83은 물리주소 3 이다, 받는 장치주소는 0xF1, 보내는 장치주소는 0x01의 머리문자 3개로 구성되며, 
응답 0xC1은 통신요청을 승락하는 식별자(ID)이다. 실제로 받는 전송값은 2 바이트로 KB1 =0xE9, KB2 =0x8F 이다, 
실지 KB 값 0x8FE9는 일반 타이밍, 목적주소, 발송주소를 포함을 의미한다. 다른 값이면 포맷이 틀려진다.
 
예를 들면, 머리는 데이터 길이가 3이면 0x80 +3 =0x83, 차량의 고장이 없으면 OK =0xC1 , 이어서 KB1KB2를 응답,
만일 고장이 있다면, 응답코드는 0xC1(OK)은 0x7F(FAIL)로 바뀌어 들어온다.
그외에 ECU는 0x80 (통신중지의 요청)이 들어오면, 0xC2(통신중지의 요청을 수락)로 응답한다.


명령/응답 코드의 예
머리문자 + 목적지 + 전송지 + 명령 0 + 첵섬 ---> 머리 + 목적지 + 전송지 + 응답0 + 응답1 + 응답2 + 첵섬
 C1      33           F1         81       66   --->  83        F1       01        C1        E9    8F     AE
len=1  수신자   전송자  통신시작 CRC --->len=3   수신자  전송자 통신수락  KB1  KB2   CRC   

ID는 2 바이트 이며,1 바이트는 모드, 1바이트는 ID다. 모드 01~0F는 SAE J1979 규격과 일치한다.
PID 모드 00~09 : http://www.avrtools.co.kr/technote7/board.php?board=download&command=body&no=97
PID 모드 10~85 : 참조 : http://prj.perquin.com/obdii/

Mode

 PID가 ECU로 요청하는 목적

 PID가 요청하는 데이터 혹은 목적

 10 Start Diagnostic Session자기진단 기능을 시작한다
 11 ECU ResetECU를 리셋한다
 12 Read Freeze Frame Data저장된 고장코드(DTC)를 읽는다
 13 Read Diagnostic Trouble Codes현재의 고장코드를 읽어 온다 
 14 Clear Diagnostic Information저장된 고장코드(DTC)를 지운다 
 17 Read Status of Diagnostic Trouble Codes고장코드(DTC)에서 Status를 읽는다
 18 Read Diagnostic Trouble Codes By StatusECU Status에서 고장코드(DTC)를 읽는다 
 1A Read Ecu IdECU의 ID를 읽는다 
 20 Stop Diagnostic Session자기진단 기능을 중지한다
 21 Read Data By Local IdLocal ID로 데이터를 읽는다
 22 Read Data By Common IdCommon ID로 데이터를 읽는다
 23 Read Memory By Address특정한 주소의 메모리를 읽는다
 25 Stop Repeated Data Transmission연속 데이터 전송을 중지한다
 26 Set Data Rates전송속도를 변경한다 
 27 Security Access안전 잠금을 한다
 2C Dynamically Define Local IdLocal ID를 동적으로 정의 
 2E Write Data By Common IdCommon ID로 데이터를 저장한다 
 2F Input Output Control By Common IdCommon ID로 입출력을 제어한다 
 30 Input Output Control By Local IdLocal ID로 입출력을 제어한다  
 31 Start Routine By Local IDLocal ID로 함수를 시작한다
 32 Stop Routine By Local IDLocal ID로 함수를 정지한다 
 33 Request Routine Results By Local IdLocal ID로 시작한 함수의 실행결과를 요구한다
 34 Request DownloadECU에서 데이터를 묶음으로 읽는다 
 35 Request UploadECU로 데이터 묶음을 저장한다.
 36 Transfer data데이터의 전송을 요구한다
 37 Request transfer exit데이터 전송을 중지한다
 38 Start Routine By AddressECU를 특정 주소부터 실행한다
 39 Stop Routine By AddressECU를 특정 주소에서 정지한다
 3A Request Routine Results By AddressECU를 특정 주소부터 실행한 결과를 요청한다
 3B Write Data By Local Id Local ID로 데이터를 저장한다
 3D Write Memory By Address특정 주소의 메모리에 전송값을 저장한다.
 3E Tester Present 
 81 Start Communication통신시작을 요청
 82 Stop Communication통신중지를 요청
 83 Access Timing Parameters타이밍 값을 요청
 85 Start Programming ModeECU 셋업, (L-line을 사용한다) 



------------------------------------------------------------------------------------------------------------------
ECU 에뮬레이터
차량 스캐너의 인터페이스 장치를 시험하려면, OBD2 커넥터가 있는 차량이 필요하다.
그러나, 에뮬레이션 소프트웨어를 이용한 PC로, OBD-II 스캐너 하드웨어를 시험할 수 있다.

스캔항목 설정 --> ECU-emulator + PC --> 통신포트 --> OBD-II 인터페이스 + OBD-II 스캐너 --> 스캔결과 표시
OBD-II 스캐너가 연결된 통신포트, 사용하는 프로토콜의 종류, 스캐너 하드웨어의 종류를 변경할 수 있다.

현재 이 에뮬레이터는 Jeff's interfaceELM323 based interfaceAutoEnginuity 등의 자동차 스캐너를 지원한다.
jeff 인터페이스는, ISO 1941 인터페이스 MC33290을 Optocoupler로 구현한, 매우 간단한 OBD to Serial 회로이다.
참조 : http://www.geocities.com/darkyp/eng/ecuemulator.html

 
 
ECU Emulator 실행파일 받기 : http://www.geocities.com/darkyp/eng/ecuemubin.zip 
Delphi 5/6 소스코드 파일받기 : http://www.geocities.com/darkyp/eng/ecuemusrc.zip
복사 파일받기 : 스캐너 에뮬레이션 소프트웨어 Ecu-Emulator.zip는 첨부파일 #2 입니다. 


이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다. 
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
  
AVRTOOLS™

 

 

 

본문 http://avrtools.co.kr/technote7/board.php?board=download&command=body&no=95

728x90

'기타_모아 > 자료실' 카테고리의 다른 글

QR 코드 만들기  (0) 2013.06.19
url 줄이기 / 긴 주소 줄이기  (0) 2013.06.17
주파수를 RPM으로  (0) 2013.06.05
벙커1특강 - 철학박사 강신주의 다상담 "몸"  (0) 2013.05.27
AEC Q100 관련 자료  (0) 2013.05.27

댓글