I2C Module Problems with Grove Beginner Kit for Arduino

Back to the OLED Problem.

Mayby it has also something to do with the 3-Axis module.

HW I2C for the OLED works ony when the 3-Axis module is also connected.

I used the following sketch to proof it:

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h> 
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


// works only whenn the 3-Axis Module is also connected. If the 3-Axis Modul is not connected the Display keeps black
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE); 

// SW I2C works allways 
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();                   // clear the internal memory
  u8g2.setFont(u8g2_font_ncenB08_tr);   // choose a suitable font
  u8g2.drawStr(0,10,"Hello World!");    // write something to the internal memory
  u8g2.sendBuffer();                    // transfer internal memory to the display
  delay(1000);  
}

The Setup

This thread warms my heart! So nice to see this level of collaboration! :heart_eyes::star_struck:

I was confused by this b/c I didn’t believe that the Grove kit would be outputting 3v3 on any PCB trace since all the grove connections from the Lotus board when you break it out is 5V and all the grove sensors seem to have a 3v3 regulator and logic level shifters if needed. So I had to confirm for myself and made a image from the PCB viewer to help clarify anyone who was confused by this weird 3v3 rail that shouldn’t really be needed. Thanks everyone!

Did some more digging - if you zoom in on the PCB viewer, there are even two different labels for the two 3v3 rails (3V3 from lotus, L_3V3 from reg)!?

I’m having this exact problem.
I removed the accelerometer module (only) and now none of the I2C modules work (OLED display, Barometer, accelerometer.

Is there an official fix from Seeed Studio for this?

I’m about to start teaching several classes using this kit and many students have purchased the kit on my advice. Help!

  • Wayne Seltzer, Boulder, Colorado, USA

I soldered the 3.3 v connection as in your diagram.
Now this i2c scanner sketch finds the accelerometer board.

However, the “Sensing Movement” sketch outputs:
x:-0.20 y:0.10 z:1.00
LIS3DHTR didn’t connect.

Is this sketch working for you?
(It worked before I removed the accelerometer module from the board.)

Can’t get the Air Pressure Sensor(BMP280) sketch to work after removing the accelerometer module.
Hangs on “bmp280.init().”
Wondering if Seeed Studio actually tested this product by removing the modules?

Perhaps there is some sort of problem with I2C termination resistors when the module(s) are removed from the board?

Thanks,
Wayne

@Baozhu: What is Seeed Studio doing to resolve this problem?

We have fixed this problem in the latest production hardware. @Wayne_Seltzer

“We have fixed this problem in the latest production hardware.”
Good to know.
Is there a way to quickly determine which board has the problem?
None of my 3 boards has any rev. number that I can find?
How do people who have the boards with the problem obtain a replacement?
I have students in several classes who have purchased this product and I’d like to be sure they
can be completely successful with their projects.

Thanks,
Wayne

Hi @Wayne_Seltzer
Please refer to the below picture, it is very easy to distinguish it.
The old version has a cable connected from the lotus to the air pressure sensor, but the new version does not.
Please contact support@seeed.cc for replacement.

I have 3 Grove Beginner Kit for Arduino Boards. 2 are “old”, and one is “new”, as shown in the photos that jiachenglu has shared.

I removed the “3-axis Acceleration” module from the new board, as I previously did with an old board.
When I run the Lesson 7: Displaying Data on OLED code, the OLED does not display.
When I connect the “3-axis Acceleration” module with a Grove cable to the top II2 port, the OLED works.
When I run the “Lesson 10: Sensing Movement” (Grove-Beginner-Kit-For-Arduino/#lesson-10-sensing-movement), code, I see a few x-y-z values display, then "LIS3DHTR didn’t connect:

x:0.60  y:0.50  z:0.55
x:0.70  y:0.50  z:0.55
x:0.65  y:0.50  z:0.55
LIS3DHTR didn't connect.

I’m sorry to say that the new board does not solve the problem.
Questions:

  1. Why is it necessary to connect the “3-axis Acceleration” module to get the OLED to work? Perhaps something to do with termination resistors for the I2C (IIC) bus? If so, need to provide a way to terminate the I2C bus without connecting the “3-axis Acceleration” module for projects that do not need to use that module.

  2. Why is the “3-axis Acceleration” module failing when connected via the Grove I2C cable?

  3. Can someone at Seeed Studio repeat my tests to verify or deny my results?

Thanks,
Wayne

Hi @Wayne_Seltzer
Thanks for your feedback on this problem to us, I will repeat your tests tomorrow.

More test results.
The sketch in Lesson 9: Measuring Surrounding Air Pressure does not work when the “3-axis Acceleration” module is removed from the board. And, it doesn’t work when connected via IIC/I2C/Grove connector, either. Same problem on the old and new boards.
(The sketch works on an old board with none of modules removed.)
Just get:
bmp280 init:
which implies that the call to bmp280.getTemperature() is hanging.

Here is a capture of the SCL line on the old board, no modules removed, sketch running correctly:
image

Here is a capture of the SCL on the new board, with the “3-axis Acceleration” module removed,sketch is failing:
image

Similar test for I2C SDA signal for the “3-axis Acceleration” module running the sketch from “Lesson 10: Sensing Movement”

New board with “3-axis Acceleration” module removed and connected with I2C/IIC/Grove cable.
Fails with “LIS3DHTR didn’t connect.” Note that the SDA signal isn’t transitioning completely to LOW.
image

Old board with “3-axis Acceleration” module in place, not removed. Works correctly:
image

Hi Wayne_seltzer
I have tested other module without connecting 3-axis Acceleration, the problem occurs as you said, it may be that the module lacks a pull-up resistor, I need further confirmation, I will give you the answer tomorrow.

Best Regards
Fenyi

More test results:

Remove “3-axis Acceleration” and “Air Pressure” modules from the Grover Beginner Kit board.
Connect I2C cables for both modules.
No problems with test program, at the end of this note. (Combination of the OLED, motion, and pressure lessons.)

However, if you don’t connect the removed modules, the OLED will not work.
Why? On the OLED module, SDA and SCL have 10K pullup resistors to Vcc.
Need lower value pullups.
Solution: Add 4.7K resistors from SDA to Vcc and SCL to Vcc on an IIC connector.

Can someone at Seeed Studio verify my result?

What to do for people who have purchased these boards?

Those who have the old board: Provide a 3-axis acceleration module that fixes the 3.3v problem.
(Perhaps the Grove - 3-Axis Digital Accelerometer (LIS3DHTR) SKU 114020121) works with the beginner kit?)
(My students are not able to solder the rework wire. And, I can’t do it for them as our classes are remote.)

For all customers: Provide a Grove connector that includes 4.7K pullup resistors for SCL and SDA.
(Perhaps a modification to the Grove - I2C Hub (6 Port) SKU 103020272? Add pull-up resistors?)

I teach at two different schools. We would need to contact the people who purchased the beginner kits to determine what needs to be shipped where. (We can do this via email, not in the forum.)

Thanks,
Wayne

//Test I2C modules (OLED, pressure,accelerometer)
//OLED
#include <Arduino.h>
#include <U8x8lib.h>

U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

//Accelerometer
#include "LIS3DHTR.h"
#include <Wire.h>
LIS3DHTR<TwoWire> LIS;           //Hardware I2C
#define WIRE Wire

//pressure
#include "Seeed_BMP280.h"
BMP280 bmp280;

void setup(void) {
  Serial.begin(9600);

  //OLED
  u8x8.begin();
  u8x8.setPowerSave(0);
  u8x8.setFlipMode(1);
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.clearDisplay();
  u8x8.setCursor(0, 0);
  u8x8.print("I2C module test");

  //Accelerometer
  Serial.println("LIS_accel init:");
  LIS.begin(WIRE, 0x19); //IIC init
  delay(50);
  LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);

  //pressure
  Serial.println("bmp280_pressure init:");
  if (!bmp280.init()) {
    Serial.println("Device not connected or broken!");
    u8x8.clearDisplay();
    u8x8.setCursor(0, 0);
    u8x8.print("bmp280 fail:  ");
  }
}

void loop(void) {
  u8x8.clearDisplay();
  u8x8.setCursor(0, 0);
  u8x8.print("Accl:  ");
  u8x8.print(abs(LIS.getAccelerationX()) + abs(LIS.getAccelerationY()) + abs(LIS.getAccelerationZ()));

  u8x8.setCursor(0, 1);
  u8x8.print("Press: ");
  u8x8.print(bmp280.getPressure());

  u8x8.setCursor(0, 2);
  u8x8.print("Temp:  ");
  u8x8.print(bmp280.getTemperature());

  delay(100);
}

Hi Wayne_seltzer
I figure out the problem.
Please review “https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/”, there is a “FAQ” mention this problem.
if you just use OLED without other modules, you need to replace “U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8;” with “U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=/ SCL, / data=/ SDA, / reset=*/ U8X8_PIN_NONE);”.
if you use OLED connect with other modules, please put “U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8);”.

Best regards
Fenyi

1 Like

@fenyi: Can you please provide a sketch that works with the other modules removed?
Not working for me…

Hi Wayne_Seltzer

You can try to only connect OLED and remove other modules.
I attach the simple example below, it should be work.

#include <Arduino.h>
#include <U8x8lib.h>
 
// U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
 
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // OLEDs without Reset of the Display
 
void setup(void) {
  u8x8.begin();
  u8x8.setFlipMode(1);
}
 
void loop(void) {
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  u8x8.setCursor(0, 0);
  u8x8.print("Hello World!");
}

Yes, software I2C works, even with the pullup resistor problem.
This is an OK workaround, but isn’t a fix for the hardware bug.
And, software I2C is slower, which could be a problem for some projects.

I’d rather use hardware I2C.
Will Seeed Studio be redesigning the Grove Beginner Kit to resolve this problem?
And, will existing customers get replacement boards?
Or, perhaps, some sort of Grove connector with pullup resistors?
(I’m using 3.9K pullups on the SDA and SCL lines when only the OLED is connected to the I2C bus.)
And will customers that have old boards get corrected 3-Axis Acceleration Modules?

Also, will Seeed Studio update the Lesson Guide to explain the issue, workarounds, and replacement process?

Without a complete resolution of the problem, I will not be able to continue to use the Grove Beginner Kit for my university and K-12 classes. I will mostly likely use the Sparkfun RedBoard with QWIIC modules instead.