로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/10/15
Link#1 opengauge (Down:305)
ㆍ추천: 0  ㆍ조회: 4619   
  아듀이노 J1850-PWM 스캐너
참조 : OpenScanGauge PWM
저자 : Nathan Weigl

OBD-II 커넥터가 있는 차량이지만, ISO 9141 표준을 지원하지 않는 경우에는,
OBD-II 커넥터에서 지원하는 J1850-PWM 방식을 검토해야 한다.
이 장치는 J1850-PWM 프로토콜로 명령을 송신하고, 차량의 ECU로 부터 응답을 읽는다.

차량의 개발이 진행됨에 따라서, 미래의 버전에서는 사라지는 OBD-II 방식이지만,
현재까지는, J1850-PWM이 가장 많은 차량에 장착된 OBD-II 인터페이스의 표준방식이다.
물론 시판하고 잇는 차량스캐너도, 차량에 따라 J1850-PWM 방식을 사용한다.
 
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 ~ )

J1850-PWM의 PID
J1850-PWM은 포트자동차에서 채택한 방식으로 바이트 기반의 통신방식이다.
즉 바이트로 송신하고 바이트로 수신하므로 비트 기반보다 처리가 간단한다.

J1850-PWM Mode 00의 PID 01~09는 다음과 같다. 참조 : ELM320

PID

Result of Requested PID

PID의 요청내용

1

show current data 현재 데이터를 보내라

2

show freeze frame data 저장된 데이터를 보내라

3

show diagnostic trouble codes 고장번호를 보내라

4

clear trouble codes and stored value 고장번호와 저장값을 지워라

5

test result, oxygen sensors 산소센서의 시험결과

6

test result, non-continously monitored 불연속적인  감시값을 보내라

7

test result, continuosly monitored 연속적인 감시값을 보내라

8

special control mode 특수한 제어를 하겟다

9

request vehicle serial number 차량의 일련번호를 보내라

예를 들면 모드=01 PID=00송신하면, 41 00 BE 1F B8 10을 응답한다.
41 0001 00과 같은 값이며, 실제로 보내진 데이터는 BE 1F B8 10 이다.
 
엔진 냉각수 온도(ECT)를 구하려면, 모드=01, PID=05를 송신한다.
응답은 41 05 7B로 들어오며, 41 05는 역시 PID에 대한 확인응답이며, 응답 PID 0x41 -0x40 =1,
실제 데이터는 7B 이다. 온도값 0x7B는 10진으로 123으로 -40을 하면 83'C 이다.
(주의 : 온도값 0x7B는 0x7B - 0x40 = 0x3B = 59'C로 계산해야 하는지도 모른다)
 
차량의 지원규격을 알아 보려면, 01 1C를 송신하면, 41 1C 01을 보내온다.
물론 0x41 0x1C는 응답 모드=0x01, PID=0x1C 이며, 마지막 바이트 0x01로 OBD 표준을 응답한다.

PID

Result

설명

01

OBD-II California ARB ARB의 OBD2

02

OBD Federal EPA EPA의 OBD

03

OBD and OBD-II OBD1과 OBD2

04

OBD-I OBD1

05

not intended to meet any OBD reauirements OBD 지원 안함

06

EOBD 유럽 OBD

J1850-PWM 스캐너의 하드웨어
아듀이노 기판,
J1850-PWM 인터페이스,
OBD-II 커넥터 (J1962 Male 16핀)
16x2 문자 LCD
누름단추 3개

ODB-II 커넥터 연결
(ODB-II)                       (아듀이노 기판)
 2 --- J1850 BUS(+) ---- 아듀이노 D4 (J1850-PWM 인터페이스를 통해서 연결)
 4 --- GND ------------ 아듀이노 GND
 5 --- GND
 7 ---  ISO K
10 --- J1850 BUS(-) ---- 아듀이노 D3 (J1850-PWM 인터페이스를 통해서 연결)
16 --- VBAT ----------- 아듀이노 Vin
 
16x2 문자 LCD 연결
(LCD 핀)    (아듀이노 기판) 
  1 GND  --- GND
  2 +5V  --- VCC
  3 Vadj --- Conrtast Resistor---GND
  4 RS ---- D12
  5 RW  --- GND
  6 ENB --- D2
  7 D0
  8 D1
  9 D2
 10 D3
 11 D4 --- D7
 12 D5 --- D8
 13 D6 --- D9
 14 D7 --- D10
 15 BL- --- GND
 16 BL+ --- VCC
 
누름단추
S1은 LCD에 표시하는 화면을 전환한다.
S2는 메뉴를 선택하며
S3는 LCD의 밝기를 조절한다 
 
S1  SELECT --- A2
S2  MENU --- A3
S3  BRIGHT --- A4
 
J1850-PWM 인터페이스 회로 (작성 중입니다)


 
소스설명
참조 : OpenScanGauge PWM
 
#undef int
#include <LCD4Bit.h>
#include <stdio.h>

//create lcd object for 4 lines
LCD4Bit lcd = LCD4Bit(4);
double vss;
double maf;
double mpg;
int rpm;

//pins to use for data
int busneg=3;
int buspos=4;

//arrays to store values returned from ECU
int vss_byte[4]={0,0,0,0};
int maf_byte[4]={0,0,0,0};
int rpm_byte[4]={0,0,0,0};

//hex commands for speed, MAF, and rpm
char *vss_cmd[] = {
"61", "6A", "F1", "01", "0D", "8B"
};
char *maf_cmd[] = {
"61", "6A", "F1", "01", "10", "C7"
};
char *rpm_cmd[] = {
"61", "6A", "F1", "01", "0C", "96"
};

//array to look up binary values for hex chars
char *hexconvert[16][2] ={
{"0","0000"},{"1","0001"},{"2","0010"},{"3","0011"},
{"4","0100"},{"5","0101"},{"6","0110"},{"7","0111"},
{"8","1000"},{"9","1001"},{"A","1010"},{"B","1011"},
{"C","1100"},{"D","1101"},{"E","1110"},{"F","1111"}
};

char vss_str[5];
char mpg_str[4];
char rpm_str[5];
void pwm_send(char **cmd);

void setup()
{
  lcd.init();
}

void loop()

  getValues();
  printOutput();
}

/* Format and Display data on LCD */
void printOutput()
{
  lcd.clear();
  lcd.cursorTo(1,0);
  lcd.printIn("MPG: ");
  lcd.cursorTo(1,5);
  mpg =(7107 * vss) / maf;
  sprintf(mpg_str, "%d.%d", mpg/10, mpg-((mpg/10)*10));
  lcd.printIn(mpg_str);

  lcd.cursorTo(1,9);
  lcd.printIn("Speed: ");
  lcd.cursorTo(1,16);
  vss = ((vss * 6214)/10000);
  sprintf(vss_str, "%d", vss);
  lcd.printIn(vss_str);

  lcd.cursorTo(3,0);
  lcd.printIn("RPM: ");
  lcd.cursorTo(3,5);
  sprintf(rpm_str, "%d", rpm);
  lcd.printIn(rpm_str);
  delay (1000);
}

/* retrieve data for display */
void getValues()
{
  pwm_send(vss_cmd);
  pwm_read(vss_byte);
  vss = vss_byte[0];

  pwm_send(rpm_cmd);
  pwm_read(rpm_byte);
  rpm = (rpm_byte[0] * 256 + rpm_byte[1])/4;

  pwm_send(maf_cmd);
  pwm_read(maf_byte);
  maf = ((256 * maf_byte[0]) + maf_byte[1])/100;
}

/* send command to ECU */
void pwm_send(char **cmd)
{
  char bincmd[48];
  hex2bin(cmd, bincmd);
  pinMode(busneg, OUTPUT);
  pinMode(buspos, OUTPUT);
 
  //send SOF and drop back to neutral
  digitalWrite(buspos, HIGH);
  digitalWrite(busneg, LOW);
  delayMicroseconds(32);
  digitalWrite(buspos, LOW);
  digitalWrite(busneg, LOW);
 
  //loop through array of bits
  for (int i=0; i < 48; i++)
  {
    //send 0
    if (bincmd[i] == '0')
    {
      digitalWrite(buspos, HIGH);
      digitalWrite(busneg, LOW);
      delayMicroseconds(16);          //bus active for 16us represents a 0
      digitalWrite(buspos, LOW);
      digitalWrite(busneg, LOW);
    }

    //send 1
    else if (bincmd[i] == '1')
    {
      digitalWrite(buspos, HIGH);
      digitalWrite(busneg, LOW);
      delayMicroseconds(8);           //bus active for 8us represents a 1
      if (i != 47)
      {
      digitalWrite(buspos, LOW);
      digitalWrite(busneg, LOW);
      }
      else delayMicroseconds(72);          //if last bit, send EOF
    }
  }
}

/* Read transmission from ECU */
void pwm_read(int *bytes)
{
  char bitread[32];               //store data bits that we actually care about
  unsigned long duration[80];     //store all bits for processing
  pinMode(busneg, INPUT);
  pinMode(buspos, INPUT);

  for (int i=0; i < 80; i++)
  {
    duration[i]=pulseIn(buspos, HIGH);      //fill array with microsec. times for interpretation later
    if (duration[i] < 48)
    {
      i = 83;                             //if EOF detected, kill loop
    }
  }
  int j=0;
 
  /* translate data portion of frame to bits */
  for (int i=40; i < 72; i++)
  {
    if (duration[i] < 14)
    {
      bitread[j] = '1';
    }

    else if (duration[i] > 14 and duration[i] < 24)
    {
      bitread[j] = '0';
    }
    j++;
  }
  bin2dec(bitread, bytes);             //send bits off for processing to ints
}

/* convert hex command to binary */
void hex2bin(char **cmd, char *bincmd)
{
  int binloc = 0;
  for(int i=0; i < 6; i++)
  {
    for(int j=0; j < 16; j++)
    {
      if (cmd[i][0] == hexconvert[j][0][0])
      {
        for (int k=0; k < 4; k++)
        {
          bincmd[binloc] = hexconvert[j][1][k];
          binloc++;
        }
      }
    }
    for(int j=0; j < 16; j++)
    {
      if (cmd[i][1] == hexconvert[j][0][0])
      {
        for (int k=0; k < 4; k++)
        {
         bincmd[binloc] = hexconvert[j][1][k];
         binloc++;
        }
      }
    }
  }
}

/* convert binary bits to decimal numbers */
void bin2dec(char *cmd, int *numbers)
{
 int val = 128;
  int i=0;
  for (int j=0; j < 32; j++)
  {
    if (cmd[j] == '1')
    {
      numbers[i] = numbers[i] + val;
      val = val/2;
    }
    else if (cmd[j] == '0') val = val/2;
  if (val < 1)
  {
     val = 128;
     i++;
  }
 }
}   // 07-11-2008, 10:44 AM 

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

AVRTOOLS™
   
윗글 아듀이노 AVR-ISP V2의 제작
아래글 아듀이노 MPGduino의 제작
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 861 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17940 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2932 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 3068 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 6122 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 5038 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3574 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 3130 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3532 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 3154 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3423 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 8101 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4239 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3655 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5511 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4302 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3811 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3500 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6779 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 4090 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5707 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7347 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8444 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4619 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 5047 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5718 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9792 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 17579 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6898 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5654 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4971 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4225 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 6165 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4757 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4740 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 5020 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5559 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4177 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13768 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9654 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 6057 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6917 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4225 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3545 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3311 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5334 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 5229 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5879 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4286 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3561 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4880 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9886 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3712 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 5136 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6551 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 5006 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 5016 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5342 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4860 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7702 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6813 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0