Page 1 of 1

New I2C Adapter doesn't work, two other OBD tools do

Posted: Tue Dec 16, 2014 5:21 pm
by element22
We have a problem here. I see several messages about the I2C Adapter not working, which are being shrugged off. My freshly bought I2C Adapter Model B doesn't work. To verify that everything is OK with OBD in my car I used two independent tools: a MaxiScan LCD scanner and a Bluetooth OBD adapter that links to an Android tablet. Both work fine (see images below). When I plug in the I2C Adapter with Arduino Uno with the standard code (below), it doesn't work. I added a LED signal function to see exactly where I get stuck and it's on obd.init(). After that, every 10 seconds the blue light in the I2C adapter flashes and nothing happens. This doesn't tell me much. It would be much more useful if obd.init() reported an error code (not just a bool) that would tell me exactly what's going on (lack of physical connection, unsupported protocol, etc). This is a brand new adapter, so if this problem isn't fixed I'll want a refund.

Image

ImageImage

Code: Select all

#include <Arduino.h>
#include <Wire.h>
#include <OBD.h>

#define LEDPin 13

COBDI2C obd;

void flashLED (int times) {
  int pls=180;
  for (int i=0;i<times;i++) {
    digitalWrite(LEDPin,HIGH);
    delay(pls);
    digitalWrite(LEDPin,LOW);
    delay(pls);
  }
}

void setup()
{
  // we'll use the debug LED as output
  pinMode(13, OUTPUT);
  // start communication with OBD-II UART adapter
  flashLED(4);
  delay(500); 
  obd.begin();
  flashLED(6); 
  // initiate OBD-II connection until success
  while (!obd.init());
  flashLED(8); 
}

void loop()
{
  int value;
  if (obd.read(PID_RPM, value)) {
    // RPM is successfully read and its value stored in variable 'value'
    // light on LED when RPM exceeds 3000
    digitalWrite(13, value > 2000 ? HIGH : LOW);
  }
}

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Fri Dec 19, 2014 2:54 pm
by stanley
I see some people connecting I2C adapter to Arduino's Rx and Tx and apparently Rx and Tx pins are not for I2C communication. Did you connect the wires correctly?

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Fri Dec 19, 2014 8:24 pm
by element22
Nothing connected to Tx/Rx on Arduino. Yellow lead from I2C Adapter plugged into SCL, blue into SDA, power red/blue to Vin/GND. The power from OBD seems to work, as Arduino boots up.

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Sun Dec 21, 2014 11:24 am
by stanley
I've just modifyied the library a bit. Please update the OBD library with this:
http://freematics.com/dl/OBD_library_20141221.7z

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Mon Dec 22, 2014 6:45 am
by element22
Downloaded the new lib, recompiled, uploaded to Arduino, same thing: it gets stuck on obd.init().

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Mon Dec 22, 2014 11:05 am
by stanley
If your car is an older one with ISO9141-2, this product might not working. Only some ofold ISO9141-2 vehicles are supported.

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Tue Dec 23, 2014 1:24 am
by element22
My car was bought new in 2010 in the US, so it uses the ISO 15765 CAN. Quote: "2008: All cars sold in the United States are required to use the ISO 15765-4 signaling standard (a variant of the Controller Area Network (CAN) bus)." ( Source: http://en.wikipedia.org/wiki/On-board_diagnostics )

Images showing the CAN high and low pins in my car's OBD port:

Image

Image

Image

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Thu Dec 25, 2014 10:06 am
by stanley
You can try manually setting the protocol used by the adapter like this:

Code: Select all

setProtocol(PROTO_CAN_29B_500K)

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Mon Jan 05, 2015 1:58 pm
by element22
After lots of work I've achieved some shaky communication, by looping through protocols and hitting on the right one:

Code: Select all

void setup() {
   obd.begin();
   conn=obd.init();
   if (!conn) {
      for (int i=0; i<4; i++) { 
         if (i==0) obd.setProtocol(PROTO_CAN_11B_500K);
         else if (i==1) obd.setProtocol(PROTO_CAN_11B_250K);
         else if (i==2) obd.setProtocol(PROTO_CAN_29B_250K);
         else if (i==3) obd.setProtocol(PROTO_CAN_29B_500K);
         flashLED(2);
         conn=obd.init();
         if (conn) break;
      }
   }
   if (conn) flashLED(6);
}


Then, if I read nothing but PID_RPM and step on the gas pedal, it works (LED turns on when RPM>1500, goes out if RPM<1500):

Code: Select all

void loop() {
  int value;
  if (conn) {
    if (obd.read(PID_RPM, value)) {
      digitalWrite(13, value > 1500 ? HIGH : LOW);
    }
  } else {
    flashLED(3);
    delay(1000);
  }
}


However, as soon as I try reading PID_RUNTIME, something gets messed up. The adapter flashes every 6 sec and there's either no reaction to my stepping on the gas, or the reaction is very strange: delayed by 20 sec and lasts forever. Is there something special about reading PID_RUNTIME?

Code: Select all

void loop() {
   int value; // save RPM here
   int runTime=-1;
   if (conn) {
      obd.read(PID_RUNTIME,runTime);
      delay(1500);
      if (obd.read(PID_RPM, value)) {
         digitalWrite(13, value > 1500 ? HIGH : LOW);
      }
   } else {
      flashLED(3);
      delay(1000);
   }
}

Re: New I2C Adapter doesn't work, two other OBD tools do

Posted: Wed Jan 07, 2015 5:55 pm
by element22
I got it to work, though the OBD communication is still shaky (it takes several tries for obd.init to succeed). For whatever reason I can only make one reliable obd.read() call per loop. I only need PID_RUNTIME, so I removed PID_RPM and things seem to work.