Страница 1 из 7 1234567 ПоследняяПоследняя
Показано с 1 по 10 из 64
  1. #1
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию OBD-II диагностика на Arduino

    Схему нарисовал, осталось изучить протокол общения с автомобилем и написать прошивку
    Искрене надеюсь на вашу помощь.
    Для связки компьютера по seral и автомобиля нужно использовать библиотеку SoftwareSerial

    Пример работы arduino с софтверным Serial Port:
    PHP код:
    #include <SoftwareSerial.h>

    #define rxPin 3
    #define txPin 2

    SoftwareSerial mySerial =  SoftwareSerial(rxPintxPin);
    byte pinState 0;

    void setup()  
    {
      
    pinMode(rxPinINPUT);
      
    pinMode(txPinOUTPUT);
      
    mySerial.begin(9600);
    }

    void loop() {
      
    char someChar mySerial.read();
      
    mySerial.print(someChar);

    Пример кода OBD-II терминала для Arduino
    PHP код:
    #include <SoftwareSerial.h>

    #define rxPin 3 
    #define txPin 2
    #define K_IN  0
    #define K_OUT 1

    #define READ_ATTEMPTS 125

    SoftwareSerial mySerial =  SoftwareSerial(rxPintxPin);
    char command;                                                 //Terminal Commands

    char pid_reslen[] =                                         //PID Lengths
    {
      
    // pid 0x00 to 0x1F
      
    4,4,2,2,1,1,1,1,1,1,1,1,2,1,1,1,
      
    2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,4,

      
    // pid 0x20 to 0x3F
      
    4,2,2,2,4,4,4,4,4,4,4,4,1,1,1,1,
      
    1,2,2,1,4,4,4,4,4,4,4,4,2,2,2,2,

      
    // pid 0x40 to 0x4E
      
    4,8,2,2,2,1,1,1,1,1,1,1,1,2,2
    };

    long tempLong;
    char str[40];

    void setup()  {
      
    pinMode(rxPinINPUT);
      
    pinMode(txPinOUTPUT);
      
    digitalWrite(txPinHIGH);
      
    delay(500);
      
    pinMode(K_ININPUT);
      
    pinMode(K_OUTOUTPUT);
      
    pinMode(13OUTPUT);
      
    mySerial.begin(9600);
      
    mySerial.println("-=Arduino OBD2 Terminal=-");
    }

    void loop() {
      
    command mySerial.read();
      switch (
    command) {
      case 
    '1':
        
    obdConnect();
        break;
      case 
    '2':
        
    mySerial.println("MIL Selected");
        
    get_pid(0x01str, &tempLong);
        break;
      case 
    '3':
        
    mySerial.println("RPM Selected");
        
    get_pid(0x03str, &tempLong);
        break;
      case 
    '4':
        
    mySerial.println("MAF Selected");
        
    get_pid(0x10str, &tempLong);
        break;
      }
    }


    int obdConnect(){
      
    mySerial.println("Attempting ECU initialization...");
      if (
    iso_init() == 0){
        
    mySerial.println("PASS");
        return 
    0;
      }
      else{
        
    mySerial.println("FAIL");
        return 
    1;
      }
    }


    byte iso_init()
    {
      
    byte b;

      
    serial_tx_off();                             //disable UART so we can "bit-Bang" the slow init.
      
    serial_rx_off();
      
    delay(3000);                                 //k line should be free of traffic for at least two secconds.
      
      
      
    digitalWrite(K_OUTHIGH);                // drive K line high for 300ms
      
    delay(300);

      
    // send 0x33 at 5 bauds
      
      
    digitalWrite(K_OUTLOW);                  // start bit
      
    delay(200);

      
    b=0x33;
      for (
    byte mask 0x01mask != 0mask <<= 1)
      {
        if (
    mask
          
    digitalWrite(K_OUTHIGH); 
        else
          
    digitalWrite(K_OUTLOW);
        
    delay(200);
      }

      
    digitalWrite(K_OUTHIGH);                // stop bit + 60 ms delay
      
    delay(260);

      
      
    Serial.begin(10400);                        // switch now to 10400 bauds

      
      
    byte i=0;                                    // wait for 0x55 from the ECU (up to 300ms)
      
    while(i<&& !iso_read_byte(&b)){
            
    i++;
      }
      
    mySerial.println(bBYTE);
      if(
    != 0x55){
            return 
    1;
      }
      
      
    iso_read_byte(&b);
      
    mySerial.println(bBYTE);                    // wait for kw1 and kw2
      
    iso_read_byte(&b);
      
    mySerial.println(bBYTE);
      
    iso_write_byte(~b);                         // send ~kw2 (invert of last keyword)
      
    iso_read_byte(&b);
      
    mySerial.println(bBYTE);          // ECU answer by 0xCC (~0x33)
      
    if(b!=0xCC)
        return 
    1;
      
      return 
    0;
    }



    void serial_rx_off() {
      
    UCSR0B &= ~(_BV(RXEN0));  
    }

    void serial_tx_off() {
       
    UCSR0B &= ~(_BV(TXEN0));  
       
    delay(20);                                 //allow time for buffers to flush
    }

    void serial_rx_on() {
      
    Serial.begin(10400);
    }


    boolean iso_read_byte(byte b)
    {
      
    int readData;
      
    boolean success true;
      
    byte t=0;

      while(
    != READ_ATTEMPTS  && (readData=Serial.read())==-1) {
        
    delay(1);
        
    t++;
      }
      if (
    t>=READ_ATTEMPTS) {
        
    success false;
      }
      if (
    success)
      {
        *
    = (bytereadData;
      }

      return 
    success;
    }

    void iso_write_byte(byte b)
    {
      
    serial_rx_off();
      
    Serial.print(b);
      
    delay(10);    
      
    serial_rx_on();
    }


    byte iso_checksum(byte *databyte len)
    {
      
    byte i;
      
    byte crc;

      
    crc=0;
      for(
    i=0i<leni++)
        
    crc=crc+data[i];

      return 
    crc;
    }

    byte iso_write_data(byte *databyte len)
    {
      
    byte in;
      
    byte buf[20];

                          
    // ISO header
      
    buf[0]=0x68;
      
    buf[1]=0x6A;        // 0x68 0x6A is an OBD-II request
      
    buf[2]=0xF1;        // our requesterХs address (off-board tool)


      // append message
      
    for(i=0i<leni++)
        
    buf[i+3]=data[i];

      
    // calculate checksum
      
    i+=3;
      
    buf[i]=iso_checksum(bufi);

      
    // send char one by one
      
    n=i+1;
      for(
    i=0i<ni++)
      {
        
    iso_write_byte(buf[i]);
      }

      return 
    0;
    }

    // read n byte(s) of data (+ header + cmd and crc)
    // return the count of bytes of message (includes all data in message)
    byte iso_read_data(byte *databyte len)
    {
      
    byte i;
      
    byte buf[20];
      
    byte dataSize 0;

      for(
    i=0i<len+6i++)
      {
        if (
    iso_read_byte(buf+i))
        {
          
    dataSize++;
        }
      }
      
      
    memcpy(databuf+5len);
      
    delay(55);    //guarantee 55 ms pause between requests
      
    return dataSize;
    }

    boolean get_pid(byte pidchar *retbuflong *ret)
    {
      
    byte cmd[2];                                                    // to send the command
      
    byte buf[10];                                                   // to receive the result
      
      
    byte reslen pid_reslen[pid];                                 // receive length depends on pid
     
      
    cmd[0]=0x01;                                                    // ISO cmd 1, get PID
      
    cmd[1]=pid;
      
      
    iso_write_data(cmd2);                                         // send command, length 2
      
      
    if (!iso_read_data(bufreslen))                                 // read requested length, n bytes received in buf
      
    {
          
    mySerial.println("ISO Read Data Error.");
          return 
    false
      }

      *
    ret=buf[0]*256U+buf[1];                                         // a lot of formulas are the same so calculate a default return value here
      
      
    mySerial.print("Return Value ");
      
    mySerial.print(pidDEC);
      
    mySerial.print(" : ");
      
    mySerial.println(*ret);
      
      return 
    true;

    Нажмите на изображение для увеличения. 

Название:	CARDUINO_OBD_II.png 
Просмотров:	31054 
Размер:	37.0 Кб 
ID:	5979
    Последний раз редактировалось Chip; 19.03.2017 в 02:29.

  2. #2
    Продвинутый Аватар для MiD_E34
    Регистрация
    11.01.2008
    Сообщений
    492
    Вес репутации
    307

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    я так понял, что порт один...
    Т.е. через него будет и связь с машиной, и связь с компом?
    X-Trail,2010
    i5 Intel 3.5" board, DC-DC PS, 4G, W8.1x64, iCar, CityG.

  3. #3
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,382
    Вес репутации
    10

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    Нет не один, используется библиотека софтового Serial Port <SoftwareSerial.h>
    А хардверный порт так и остается , просто в примере он не используется
    Последний раз редактировалось Chip; 05.10.2009 в 17:54.

  4. #4
    Продвинутый Аватар для MiD_E34
    Регистрация
    11.01.2008
    Сообщений
    492
    Вес репутации
    307

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    ясно, я думал, эта библиотека от хардового, хотя название ее говорит само за себя
    X-Trail,2010
    i5 Intel 3.5" board, DC-DC PS, 4G, W8.1x64, iCar, CityG.

  5. #5
    Новичок
    Регистрация
    02.09.2009
    Возраст
    40
    Сообщений
    1
    Вес репутации
    0

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    mySerial используется для связи с компьютером? если да тогда почему судя по картинке она подключена к машине

    Код:
    #define rxPin 3  
    #define txPin 2
    ...
    SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
    это + картинка показывают работу с машиной,
    а вот здесь
    Код:
    void loop() { 
      command = mySerial.read(); 
      switch (command) { 
      case '1': 
        obdConnect(); 
        break; 
      case '2': 
        mySerial.println("MIL Selected"); 
        get_pid(0x01, str, &tempLong); 
        break; 
      case '3': 
        mySerial.println("RPM Selected"); 
        get_pid(0x03, str, &tempLong); 
        break; 
      case '4': 
        mySerial.println("MAF Selected"); 
        get_pid(0x10, str, &tempLong); 
        break; 
      } 
    }
    вроде как связь с ком портом компьютера, т.е. ожидание какой номер команды введут скажем в гипертерминале, или я что-то не так понял?
    Последний раз редактировалось MariMax; 20.10.2009 в 11:05.

  6. #6
    Новичок
    Регистрация
    16.06.2009
    Сообщений
    4
    Вес репутации
    0

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    коллеги, а кто-нибудь эту тему дальше развивал?
    есть мысль читать через CAN-шину сообщения от подрулевых переключателей.

    вообще, пока нашёл только один(!) похожий проект:
    http://code.google.com/p/opengauge/w/list

  7. #7
    Пользователь
    Регистрация
    29.11.2009
    Возраст
    49
    Сообщений
    65
    Вес репутации
    198

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    Цитата Сообщение от softic Посмотреть сообщение
    коллеги, а кто-нибудь эту тему дальше развивал?
    есть мысль читать через CAN-шину сообщения от подрулевых переключателей.

    вообще, пока нашёл только один(!) похожий проект:
    http://code.google.com/p/opengauge/w/list


    http://code.google.com/p/multidisplay/
    D945GCLF2,160gb,2gb-ram,8" TFT LCDTouch+2lcd7" ,Bt,WiFi,SILABS,OBD2,DVBT, ,Audioson,Hertz,Fokal

  8. #8
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    Цитата Сообщение от Chip Посмотреть сообщение
    ...
    Пример кода OBD-II терминала для Arduino / Carduino...
    Кто-нибудь попробовал?

  9. #9
    Новичок
    Регистрация
    01.12.2010
    Возраст
    56
    Сообщений
    6
    Вес репутации
    174

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    На японца праворукова начну пробовать, как придет индикатор 16х2, через неделю. На Duino. Будет железячный вариант. Валентин 8080 помоги с пидами, плиз.
    Последний раз редактировалось Noid; 01.12.2010 в 22:11. Причина: синтаксис

  10. #10
    Местный
    Регистрация
    10.11.2010
    Сообщений
    144
    Вес репутации
    201

    По умолчанию Re: OBD-II диагностика на Carduino (Arduino)

    Цитата Сообщение от Noid Посмотреть сообщение
    На японца праворукова начну пробовать, как придет индикатор 16х2, через неделю. На Duino. Будет железячный вариант. Валентин 8080 помоги с пидами, плиз.
    Начали пробовать?

Страница 1 из 7 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •