Связка Arduino и OBDII адаптера на ELM327

Тема в разделе "Arduino & Shields", создана пользователем EvgenyM, 21 сен 2013.

  1. EvgenyM

    EvgenyM Нуб

    Добрый день.
    Есть Arduino UNO и OBDII адаптер (http://www.aliexpress.com/item/Hot-Sale-elm-327-usb/461219967.html)
    Не получается их связать :(
    Подключаю адаптер к компьютеру, появляется устройство на COM77, подключаюсь к нему обычным терминалом на скорости 38400, ввожу ATI - в ответ получаю "ELM327 v1.5", т.е., как я понимаю все ок.
    Подключаю Arduino к компютеру, подключаюсь на COM порт терминалом - вижу запрос ATI, ввожу в ответ что нибудь и вижу эти символы на LCD дисплее Arduino.
    Но когда подключаю OBDII адаптер через USB шнур к Arduino - связи нет, хотя при этом светодиод на OBDII адаптере загорается.
    В общем после Serial.println в ответ ничего не приходит, Serial.read всегда возвращает '-1', а Serial.available() тоже ничего не дает.
    Вот скетч Arduino:
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(2, 8, 3, 10, 11, 12, 13);

    void setup()
    {
    Serial.begin(38400);
    }

    void loop()
    {
    lcd.clear();

    lcd.print("ATI ");
    Serial.println("ATI");

    for(int i=0;i<16;i++) {
    char c = Serial.read();
    if (c < 0) c = '-';
    lcd.print(c);
    delay(200);
    }
    }

    Что может быть?
    Куда копать?
     
  2. lerik2703

    lerik2703 Гик

    интересно вы ELM327 напрямую к чипу ATMEGA8U2-MU ардуино подключаете?
     
  3. EvgenyM

    EvgenyM Нуб

    Просто через переходник один конец адаптера OBDII в USB разъем Arduino UNO
    Так не будет работать?
    Подскажите пожалуйста как будет работать?
     
  4. lerik2703

    lerik2703 Гик

    нет конечно! ATMEGA8U2-MU не может выступать в роли USB-host! разбирать устройство (чип elm327 имеет аппаратный RS232 интерфейс (18,17) ноги)и подключать на прямую (предварительно отключив преобразователь интерфейса (хотя я как-то экспериментировал с китайской GSM розеткой тупо напрямую подключил и ничего работало :D )) благо питание 5в ничего дополнительного городить не надо :) !
     
  5. EvgenyM

    EvgenyM Нуб

    Понятно...
    Я тут покопал и нашел несколько вариантов:
    1) Arduino USB Host Shield
    2) USB кабель для планшетов с OTG (как я понял он дает возможность работать планшету как USB Host)
    3) подключить USB выход OBDII адаптера на RX/TX выходы Arduino и использовать SoftwareSerial, может сработать?
     
  6. lerik2703

    lerik2703 Гик

    вот вариант от амперки USB Host Shield. на оф.сайте написано что поддерживает чипы Prolific PL2303 и FTDI FT232
     
  7. EvgenyM

    EvgenyM Нуб

    Понял, спасибо за помощь!
     
  8. Halt

    Halt Нуб

    Как Ваши успехи? я планирую заняться подобной связкой.
     
  9. EvgenyM

    EvgenyM Нуб

    Заказал USB host controller для ардуино у Китайцев и OBDII шнур только с RS232 разъемом а не с USB, на днях должно прийти.
    Буду пробовать обе схемы:
    1) Arduino + RS232 OBDIIадаптер
    2) Arduino + USB Host controller + USB OBDII адаптер
     
  10. Brassee

    Brassee Нуб

    Подниму тему, может быть кому-то еще интересно.

    Распаял синезубый OBD сканер на ELM327, теперь он общается с ардуино через uart. Практически все блютуз модули имеют одинаковую распиновку, но на всякий случай проверяйте.

    Собственно скетчи, первый работает вместе с [этой] библиотекой. Второй без библиотеки. В любом случае PIDы в MODE1 читать получается, все работает. Сейчас основной затык с DTC (кодами ошибок), пока не понял как их расшифровывать. Если кто-то может помочь с этим - буду рад.

    Номер 1:
    Код (Text):

    #include "Wire.h"
    #include "OBD.h"
    #include "LiquidCrystal.h"
    //Пины дисплея
    LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

    //Тип UART
    COBD obd;

    int spdVal = 0;
    int rpmVal = 0;
    int tmpVal = 0;

    void setup()
    {
      lcd.begin(20, 4);
      obd.begin();
      //Инициализация OBD
      while (!obd.init());
    }

    void loop()
    {
      obd.read(PID_SPEED, spdVal);
      obd.read(PID_RPM, rpmVal);
      obd.read(PID_COOLANT_TEMP, tmpVal);
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("SPD:");
        lcd.print(spdVal);
        lcd.setCursor(0,1);
        lcd.print("RPM:");
        lcd.print(rpmVal);
        lcd.setCursor(0,2);
        lcd.print("TMP:");
        lcd.print(tmpVal);
        delay(75);

    }  
    Номер 2:
    Код (Text):
    #include "LiquidCrystal.h"
    LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

    char rxData[20];
    char rxIndex=0;

    int spdVal = 0;
    int rpmVal = 0;
    int tmpVal = 0;
    int ambTmpVal = 0;

    void setup(){
      Serial.begin(38400);
      lcd.begin(20, 4);

      delay(1500);
      Serial.println("ATZ");
      delay(2000);

      Serial.flush();
    }
    void loop(){

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("SPD:");
      lcd.setCursor(0, 1);
      lcd.print("RPM:");
      lcd.setCursor(0, 2);
      lcd.print("TMP:");
      lcd.setCursor(0, 3);
      lcd.print("AMP:");

      // Скорость
      Serial.flush();
      Serial.println("010D");
      //OBD отвечает два раза
      getResponse();
      getResponse();
      spdVal = strtol(&rxData[6],0,16);
      lcd.setCursor(4, 0);
      lcd.print(spdVal);
      delay(100);

      // Обороты
      Serial.flush();
      Serial.println("010C");
      getResponse();
      getResponse();
      rpmVal = ((strtol(&rxData[6],0,16)*256)+strtol(&rxData[9],0,16))/4;
      lcd.setCursor(4, 1);
      lcd.print(rpmVal);
      delay(100);

      // Температура
      Serial.flush();
      Serial.println("0105");
      getResponse();
      getResponse();
      tmpVal = (strtol(&rxData[6],0,16)-40);
      lcd.setCursor(4, 2);
      lcd.print(tmpVal);
      delay(100);

      // Температура за бортом
      Serial.flush();
      Serial.println("0146");
      getResponse();
      getResponse();
      ambTmpVal = (strtol(&rxData[6],0,16)-40);
      lcd.setCursor(4, 3);
      lcd.print(tmpVal);
      delay(100);

    }
    //Получаем строку
    void getResponse(void){
      char inChar=0;
      while(inChar != '\r'){
        if(Serial.available() > 0){
          if(Serial.peek() == '\r'){
            inChar=Serial.read();
            rxData[rxIndex]='\0';
            rxIndex=0;
          }
          else{
            inChar = Serial.read();
            rxData[rxIndex++]=inChar;
          }
        }
      }
    }
     

    Вложения:

    • IMG_0940.jpg
      IMG_0940.jpg
      Размер файла:
      91,7 КБ
      Просмотров:
      5.782
  11. EvgenyM

    EvgenyM Нуб

    Вот то, что есть у меня:
    Есть мануал по ELM327, там на 7ой странице есть пример разбора (в аттаче)
    И, собственно, коды ошибок в txt файлике
     

    Вложения:

  12. Brassee

    Brassee Нуб

    Спасибо, полезный документ. Постараюсь поскорее освоить.
     
  13. lerik2703

    lerik2703 Гик

    получилось с ошибками?
     
  14. Brassee

    Brassee Нуб

    Времени не было. На днях вернусь к этому.
     
  15. suxo

    suxo Нуб

    А не подскажете - в дангом случае - куда подпаиваться ардуиной?
    это мини elm327 (клон) bluetooth адаптер.
    Он состоит из двух плат, вот верхнуюю я выпаял и сфоткал. на ней как я понимаю сам блютус модуль и еще схемы всякие.
    Хотелось бы ардуиной сюда подключиться но проводами, а не по блютус.

    [​IMG]
    [​IMG]
     
  16. bublonik

    bublonik Нуб

    Первый пример не компилится. Ошибки в библиотеке.
     
  17. torero999

    torero999 Нуб

    Компилятся оба примера. Другое дело, у второго примера не получается разбудить ELMку....
    С первым коннектится, но почемуто связь есть на несколько секунд. Да, показания считываются всё нормально, но потом связь рвётся и заново коннект. Не знаю с чем может быть связано. Есть предположение, что мешает работе впаянный Bluetooth модуль. "UART не позвляет параллелить устройства, это шина типа "точка-точка"." - нашел в Интернете. Попробую отпаять и проверить.
     
  18. torero999

    torero999 Нуб

    Спасибо большое за скетч! Проверил лично у меня работает первый с библиотекой OBD.h
    Второй тоже компилится, но не показывает значений. Почему - не понятно.

    Отдльно скажу, что проврил ELM без Bluetooth модуля. Работает, связь стабильна.
    Так что предположение о работе UART подтвердилось. Кто хочет работать со связкой Arduino+ELM327 отпаивайте дополнительные модули от адаптера.
     
  19. bublonik

    bublonik Нуб

    Нужно "delay(100);" увеличивать, для каждого ЭБУ свое время выставлять. У меня минимум на 200мс работает.

    У меня сейчас все работает по второму примеру через Bluetooth, но возникла другая проблема. Слишком большая задержка в показаниях на экране из за всех "delay()" в скетче. Если к примеру добавить обороты то обновление происходит не сразу, пока все задержки не проскочит. Избавиться от этого можно, но пока не получается. ELM327 ответ на запрос присылает в виде:
    41 05 7B
    >
    Символ ">" говорит о готовности принимать следующий запрос. (из даташита на ELM)
    Если в функции getResponse организовать окончание приема данных не по символу '\r' а по '>' то задержки не нужны будут. Просто замена '\r' а на '>' не помогает, функция перестает работать. Пока не могу допетрить как это сделать. Может у кого есть мысли по этому поводу, мозги уже сломал. На данный момент в скетче запись строки в буфер производится по времени задержки. Правильно было бы организовать окончание считывания по символу окончания передачи.
    И еще, если запросы отправлять в виде "01051" (добавляется 1 в конце запроса), то ELM будет отправлять ответ не 2 раза а один. getResponse нужно будет выполнять 1 раз, соответственно время на обработку то же сократится.
     
  20. mrGorb

    mrGorb Нуб

    Друзья, кто-нибудь разобрался со считыванием ошибок?