Kim D Posted July 30, 2020 Report Share Posted July 30, 2020 Dear, I try to restore a friends machine, that drives over un-level ground and need to hold a vertical device always perfectly vertical using 1x 12VDC motor. Stabilization is done on 1 axis. Not 2 I believe. His former old friend build a Arduino Uno board with on top a DUALCHANNEL H-BRIDGE motor shield from ELECROW.COM and on top of that board a prototype shield v.5 board containing a GY-521 sensor ( MPU 6050 I believe). We managed to get his old code back via relatives of his former friend who look like this : #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #include "PID_v1.h" // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // is used in I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif MPU6050 mpu; // 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 VectorFloat gravity; // [x, y, z] gravity vector float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector // PID double kp = 20, ki = 0, kd = 0; double Setpoint = 0; // leveled double Input = 0, Output = 0; PID PID1(&Input, &Output, &Setpoint, kp, ki, kd, DIRECT); // ================================================================ // === INTERRUPT DETECTION ROUTINE === // ================================================================ volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } void setup() { // join I2C bus (I2Cdev library doesn't do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialize serial communication Serial.begin(115200); // initialize DMP devStatus = mpu.dmpInitialize(); // Offsets for calibrating mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 factory default // 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(0, 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(")")); } // Motor_1 controll pin initiate; pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(9, OUTPUT); // Speed control //Enable the Motor Shield output; pinMode(6, OUTPUT); digitalWrite(6, HIGH); //PID initiate PID1.SetMode(AUTOMATIC); PID1.SetSampleTime(1); PID1.SetOutputLimits(-255, 255); } void loop() { //If programming failed, don't try to do anything if (!dmpReady) return; // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt && fifoCount < packetSize) { // other program behavior stuff here // . // . // . // if you are really paranoid you can frequently test in between other // stuff to see if mpuInterrupt is true, and if so, "break;" from the // while() loop to immediately process the MPU data // . // . // . } // 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; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); Input = ypr[2] * 180 / M_PI; PID1.Compute(); //Output to motor shield control_motor(Output); //Display Euler angles in degrees Serial.print("ypro\t"); Serial.print(ypr[0] * 180 / M_PI); Serial.print("\t"); Serial.print(ypr[1] * 180 / M_PI); Serial.print("\t"); Serial.print(ypr[2] * 180 / M_PI); Serial.print("\t"); Serial.println(Output); } } void control_motor(double pwm_value) { int pwm = round(pwm_value); if (pwm < -255) pwm = -255; if (pwm > 255) pwm = 255; if (pwm > 0) { //Set the motor direction CW digitalWrite(4, LOW); digitalWrite(5, HIGH); analogWrite(9, pwm); //Set the motor speed } else { //Set the motor direction CCW digitalWrite(4, HIGH); digitalWrite(5, LOW); analogWrite(9, pwm); } } But once I connect my arduino uno board and launch the program I get this error message: Arduino: 1.8.13 (Windows 7), Board:"Arduino Uno" V2:1:10: fatal error: I2Cdev.h: No such file or directory #include "I2Cdev.h" ^~~~~~~~~~ compilation terminated. exit status 1 I2Cdev.h: No such file or directory ZIP file does not contain a map or valid library What do I need to do? Thanks for any help. Very welcome when you don't have any arduino experiences !!! Kind regards, Quote Link to comment Share on other sites More sharing options...
Kim D Posted August 3, 2020 Author Report Share Posted August 3, 2020 No one to help??? how do i get this fault eliminated? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.