MPU6050 or i2cdev or Wire.h conflicting with Software serial library

Hi all,

I am running into this problem of not being able to use a GPS module with MPU6050 and by trying out different things, I think the i2cdev or MPU6050I or wire library is causing problems for the Software serial library. I am using an MPU6050 as a gyroscope with my arduino uno. I am using Jeff Rowberg's libraries and MPU6050_DMP6 code from example as base for getting gyro data. Everything MPU6050 related I've found from his github repo here: GitHub - jrowberg/i2cdevlib: I2C device library collection for AVR/Arduino or other C++-based MCUs.

It is working fine by itself, but I also need to use a GPS, and for that I am using Software Serial library to use pin 10 and 11 as RX and TX pins. (Although it seems irrelevant to me but I am using ublox-NEO-6M-0-001). Both of the programs are working fine separately but when I combine them, Software serial commands do not execute.

Things I have tried so far:
I have tried changing the default i2c address from 0x68 to 0x69.
I have also tried running it on Arduino mega2560 and tried using its multi serial functionality but that is giving me the same problem (Serial1 commands are not working in the same way softwareserial commands don't work).

I can share code and more information if that helps.

I really need to do this and if anyone of you can help, that would be awesome.

Looking forward

I have also tried running it on Arduino mega2560

WHY are you using SoftwareSerial on a Mega with 4 hardware serial ports?

SoftwareSerial is VERY processor intensive. It is likely that SoftwareSerial is causing problems for your other libraries, not the other way around.

PaulS:
WHY are you using SoftwareSerial on a Mega with 4 hardware serial ports?

SoftwareSerial is VERY processor intensive. It is likely that SoftwareSerial is causing problems for your other libraries, not the other way around.

On Mega I used Serial1 instead of SoftwareSerial but it's giving me the same problem. Within the code I have identified that as soon as I use Wire.begin(), SoftwareSerial or Serial1 communication stops.

On Mega I used Serial1 instead of SoftwareSerial but it's giving me the same problem. Within the code I have identified that as soon as I use Wire.begin(), SoftwareSerial or Serial1 communication stops.

The code you haven't posted?

PaulS:
The code you haven't posted?

Here is the GPS code that uses software serial library: http://collabedit.com/pjvc6

It runs without an issue.

Here is the MPU6050 code that I am using for detecting sudden change in the gyro data, combined with the code above (GPS code starting from line 208 in the void loop). http://collabedit.com/6rbhd

I haven't replaced the SoftwareSerial ports with Serial1 hardware ports in this version of the code but I have tested that on Mega2560 already.

Here's what I know is happening in the code:

in void setup(), MPU is being initialized and connections (SCL and SDA) are being verified. The very first line in void setup i.e. Wire.begin() is causing the SoftwareSerila and Serial1 ports to misbehave.

Void loop() has the code for MPU6050 until line 206. This code detects sudden change in the gyro data which I need to record alongside the GPS coordinates. From line 214, it's code to get the GPS coordinates.

I can explain more if you want.

Thanks in advance

Are you looking for help on collabedit, too? If not, why did you post your code there? I thought you wanted help HERE.

PaulS:
Are you looking for help on collabedit, too? If not, why did you post your code there? I thought you wanted help HERE.

No I am not looking for help there. I just wanted to share the code on an online text editor and collabedit was the first result on google. Don't even know what that is lol

The point was that if you want help HERE, you post your code HERE. We don't go looking for your code on some virus-infested site.

PaulS:
The point was that if you want help HERE, you post your code HERE. We don't go looking for your code on some virus-infested site.

The code 2 in its entirety :

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include "Wire.h"
#include <SoftwareSerial.h>
#include <TinyGPS.h>
SoftwareSerial mySerial(10, 11); // RX, TX
TinyGPS gps;
MPU6050 mpu(0x69);
using namespace std;

#define INTERRUPT_PIN 2 // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer.

// orientation/motion vars
Quaternion q; // [w, x, y, z] quaternion container
VectorInt16 aa; // [x, y, z] accel sensor measurements
VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements
VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements
VectorFloat gravity; // [x, y, z] gravity vector
float euler[3]; // [psi, theta, phi] Euler angle container
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

int smallBups = 0, LargeBups = 0;
class valuesPackage
{
public:
float p = 0, r =0;
};

int index = 0;
valuesPackage valuesArr[2]; //os

// ================================================================
// === INTERRUPT DETECTION ROUTINE ===
// ================================================================

volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
mpuInterrupt = true;
}

// ================================================================
// === INITIAL SETUP ===
// ================================================================

void setup() {
//NOTE for PAULS FROM ARDUINO.CC FORUMS
//heres where the problem is. remove Wire.begin and GPSworks
Wire.begin();

Serial.begin(9600);
// GPS starts here
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);

//GPS ends here
while (!Serial); // wait for Leonardo enumeration, others continue immediately

// initialize device
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);

// verify connection
Serial.println(F("Testing device connections..."));
Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

// wait for ready

// load and configure the DMP
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();

// supply your own gyro offsets here, scaled for min sensitivity
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

// make sure it worked (returns 0 if so)
if (devStatus == 0) {
// turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);

// enable Arduino interrupt detection
Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();

// set our DMP Ready flag so the main loop() function knows it's okay to use it
Serial.println(F("DMP ready! Waiting for first interrupt..."));
dmpReady = true;

// get expected DMP packet size for later comparison
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}

}

// ================================================================
// === MAIN PROGRAM LOOP ===
// ================================================================

void loop() {

//MPU6050 void setup stuff copied here

//GPS code ends here
// if programming failed, don't try to do anything
if (!dmpReady) return;

// wait for MPU interrupt or extra packet(s) available

// reset interrupt flag and get INT_STATUS byte
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();

// get current FIFO count
fifoCount = mpu.getFIFOCount();

// check for overflow (this should never happen unless our code is too inefficient)
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
// reset so we can continue cleanly
mpu.resetFIFO();
// Serial.println(F("FIFO overflow!"));

// otherwise, check for DMP data ready interrupt (this should happen frequently)
} else if (mpuIntStatus & 0x02) {
// wait for correct available data length, should be a VERY short wait
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

// read a packet from FIFO
mpu.getFIFOBytes(fifoBuffer, packetSize);

// track FIFO count here in case there is > 1 packet available
// (this lets us immediately read more without waiting for an interrupt)
fifoCount -= packetSize;

//Yaw pitch roll calculation starts here.
// display Euler angles in degrees
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

valuesPackage obj;

obj.p = ypr[1] * 180/M_PI;
obj.r = ypr[2] * 180/M_PI;
valuesArr[index%2] = obj;
index++;
if(index > 7)
{
int lastIndex = (index+1)%2;
int p = valuesArr[index%2].p - valuesArr[lastIndex].p;
int r = valuesArr[index%2].r - valuesArr[lastIndex].r;
p = abs(p);
r = abs(r);

if((p > 1 && p <= 7) || (r > 1 && r <= 7))
{
Serial.println("small bump\t with pr \t");
Serial.println(p);
Serial.println(r);

}
else if( p > 7 || r > 7)
{
Serial.println("larg bump\t with pr \t");
Serial.println(p);
Serial.println(r);
}
}
delay(300);

//ttvalue=millis()-ttvalue;
//Serial.println(ttvalue);
#endif

// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}

//GPS code starts here

long lat, lon;

if (mySerial.available()) {
char c = mySerial.read();
if (gps.encode(c)) {
Serial.println("Acquired Data");
Serial.println("-------------");

gps.get_position(&lat, &lon);
Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);

Serial.println();
}
}

}

That is NOT the code you are running on the Mega.