I2Cdev - beginner level -

Een vriend van mij heeft een machine ontwikkeld die zijn hagen altijd perfect verticaal snoeit. De messen staan op een soort metalen kader dat in 1 richting kan aangepast worden met een DC motor 12V.
De machine kan dus over ongelijke grond rijden, maar de hagen blijven dus mooi verticaal gesnoeid. Om de level te houden had hij ooit een vriend die voor hem een arduino bordje samengesteld had, waar je hieronder
de samenstelling ziet. Basis is dus een Arduino Uno board met daarop een DUALCHANNEL H-BRIDGE motor shield van ELECROW.COM bordje en daarbovenop een prototype shield v.5 board welke een GY-521 sensor ( MPU 6050 ) bevat.
We hebben toch via via de code kunnen krijgen die dit kon uitvoeren.
Dus, ik dacht als totale LEEK in de arduino wereld, dat ik die code even kon inladen en klaar is kees…..
OEPS, niet dus. Als ik de onderstaande code upload, krijg ik meldingen rond de I2C bibliotheek die niet gevonden wordt.
Mij is het a) al een raadsel waar je die library kan downloaden
b) Dan hoe je die moet bijvoegen in mijn laptop dus en
c) dan de code kan aanpassen dat die bibliotheek gevonden worden in mijn laptop.
Hoe ik de bestaande code kan herstellen en eens (zonder de machine bij mij te hebben) kan testen?
Ik heb wel gezien dat die GY-521 sensor vrij los op het kleine witte breadbordje staat. Het is een IMU en denk al dat je die vast
moet monteren op de het bordje. Als hij los zit kan dit niet werken omdat dan de as waar de correctie op uitgevoerd wordt
altijd veranderde waarden krijgt. Met een losse sensor kan je nooit goed meten, laat staan corrigeren….

De code :
#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);
}
}

Als ik het arduino uno board aansluit en de software ( versie 1.8.13) start krijg ik deze 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

Er zijn duizenden libraries in omloop voor de arduino. Dan is het de kunst om de juiste te vinden die doet wat je nodig hebt.

De meeste kun je vinden met een simpele search in google (of in duckduckgo). Die I2CDev.h bijvoorbeeld op :
https://github.com/jrowberg/i2cdevlib/blob/master/Arduino/I2Cdev/I2Cde…

In de arduino omgeving zelf kan je librarys (bibliotheken) opzoeken en automatisch importeren. Gewoon op de naam van de gewenste lib zoeken. https://pcmweb.nl/artikelen/programmeren/extra-arduino-bibliotheken-in…
Opgelet met de IMU sensor, hier is ook meestal een kalibratie vereist !

Ik zou verwachten dat de i2c lib standaard meegeleverd word en niet 1 van de vele "kan je downloaden" libs is.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

library downloaden en installeren in uw arduino IDE (vaak is het voldoende de arduino ide af te sluiten, de library in de library folder te kopieren en dan arduino weer starten.

de correcte library, tja, bij de ontwikkelaar van dat stuk software eens vragen misschien.

en anders haal je een versie van internet en probeer je die. krijg je nog fouten, die library eraf gooien, andere downloaden en weer proberen... tot je de correcte gevonden hebt.

is het originele defect? of probeer je een 2de te maken?

ik hou van werken ..., ik kan er uren naar kijken

Ik zou verwachten dat de i2c lib standaard meegeleverd word en niet 1 van de vele "kan je downloaden" libs is.

Is ook zo, maar die heet 'wire'. Hier is blijkbaar een andere variant gebruikt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Het kan ook zijn dat die vriend van toen het programma zelf geschreven heeft natuurlijk.

Als je haar maar goed zit, GROETEN LAMBIEK.

Effe googlen: Dit is hem: https://github.com/jrowberg/i2cdevlib

De download zip van github kan niet geschikt zijn als zip om aan de arduino library manager te geven. Dus even zoeken of er ergens een arduino-zip is.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/