November 09, 2024, 04:28:00 AM

I2C not working on NANO

Started by robbiedeloose, October 15, 2016, 02:49:56 PM

Previous topic - Next topic

robbiedeloose

Hi Guys,

Just recieved an Olimex Nano in the mail. When I run the I2C scanner code the program gets stuck when it starts scanning the first time.

This gives me following on Servie monitor

I2C Scanner
Scanning...


Should get:

Scanning...
No I2C devices found


Doesn't matter if a I2C device is connected or not. Codes works on my mega and pro mini

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

JohnS

Looks like a software bug.  I guess you get to debug someone else's software if you want to.

John

robbiedeloose

can anybody confirm this behaviour on the Nano?

LubOlimex

Code looks good. There is enough wait for the 32u4 type of boards. Did you compile the code for Arduino Leonardo?

Are you using the proper pins at the UEXT connector for I2C? These are pins #5 (SDA) and #6 (SCL) of the UEXT connector.

Does your motor have pull-ups on the I2C lines? Note that OLIMEXINO-NANO also has pull-ups on SDA and SCL (4.7K).

Best regards,
Lub/OLIMEX
Technical support and documentation manager at Olimex

robbiedeloose

Yes,  code was compiles for arduino Leonardo.

I tested with a bmp180 sensor with no additional resistors and also without connecting anything to the uext port

Kr,
Robbie

LubOlimex

How do you power the sensor? Via the NANO board? If that is so remember to allow the powering on the UEXT with the following code:

pinMode (8, OUTPUT);
digitalWrite (8, LOW);

Also note that the UEXT provides 3.3V voltage, if your sensor requires 5V the UEXT is not suitable for the powering.

Also did you notice that we have an example for the I2C. It is made for OLIMEXINO-NANO and MOD-LCD1x9, and it is available here: https://www.olimex.com/Products/Modules/LCD/MOD-LCD-1x9/resources/MOD-LCD1X9_Arduino_Library.zip

Best regards,
Lub/OLIMEX
Technical support and documentation manager at Olimex