Aiuto BalanceRobot messaggio di errore

Non riesco a capire dove sia l'errore, ho controllato ogni cosa, comprese le librerie e non manca nulla. Nonostante tutto l'errore rimane. Aiutatemi per favore, grazie mille.

Messaggio di errore:

sketch_jan28a.ino: In function 'void setup()':
sketch_jan28a:47: error: 'i2cWrite' was not declared in this scope
sketch_jan28a:48: error: 'i2cWrite' was not declared in this scope
sketch_jan28a:50: error: 'i2cRead' was not declared in this scope
sketch_jan28a:58: error: 'i2cRead' was not declared in this scope
sketch_jan28a.ino: In function 'void dof()':
sketch_jan28a:131: error: 'i2cRead' was not declared in this scope
'i2cWrite' was not declared in this scope

Codice:

#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
/* IMU Data */
int16_t accX, accY, accZ;
int16_t tempRaw;
int16_t gyroX, gyroY, gyroZ;

float accXangle;
float gyroXangle;
float kalAngleX;

unsigned long timer;
uint8_t i2cData[14];
float CurrentAngle;


const int AIN1 = 3;
const int AIN2 = 9;
const int BIN1 = 10;
const int BIN2 = 11;

int speed;

// PID
const float Kp = 4; 
const float Ki = 1;
const float Kd = 1;
float pTerm, iTerm, dTerm, integrated_error, last_error, error;
const float K = 1.9*1.12;
#define   GUARD_GAIN   10.0

#define runEvery(t) for (static typeof(t) _lasttime;(typeof(t))((typeof(t))millis() - _lasttime) > (t);_lasttime += (t))


void setup() {  
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
Serial.begin(57600);
Wire.begin();
i2cData[0] = 7;
i2cData[1] = 0x00;
i2cData[2] = 0x00;
i2cData[3] = 0x00;
while(i2cWrite(0x19,i2cData,4,false));
while(i2cWrite(0x6B,0x01,true));

  while(i2cRead(0x75,i2cData,1));
if(i2cData[0] != 0x68) {
  Serial.print(F("Error reading sensor"));
  while(1);
}

delay(100);

while(i2cRead(0x3B,i2cData,6));
accX = ((i2cData[0] << 8) | i2cData[1]);
accY = ((i2cData[2] << 8) | i2cData[3]);
accZ = ((i2cData[4] << 8) | i2cData[5]);
accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;

kalmanX.setAngle(accXangle);
gyroXangle = accXangle;
timer = micros();
}

void loop() {
runEvery(25)
{
  dof();
  if (CurrentAngle <= 180.2 && CurrentAngle >= 179.8)
  {
    stop();
  }
  else{
  if (CurrentAngle < 230 && CurrentAngle > 130)
  {
  Pid();
  Motors();
  }
  else
  {
    stop();
  }
}
}
}

void Motors(){
if (speed > 0)
{ 
  //forward 
  analogWrite(AIN1, speed);
  analogWrite(AIN2, 0);
  analogWrite(BIN1, speed);
  analogWrite(BIN2, 0);
}
else
{ 
  // backward
  speed = map(speed,0,-255,0,255);
  analogWrite(AIN1, 0);
  analogWrite(AIN2, speed);
  analogWrite(BIN1, 0);
  analogWrite(BIN2, speed);
}
}

void stop()
{
analogWrite(AIN1, 0);
analogWrite(AIN2, 0);
analogWrite(BIN1, 0);
analogWrite(BIN2, 0);
}

void Pid(){
error = 180 - CurrentAngle;
pTerm = Kp * error;
integrated_error += error;
iTerm = Ki * constrain(integrated_error, -GUARD_GAIN, GUARD_GAIN);
dTerm = Kd * (error - last_error);
last_error = error;
speed = constrain(K*(pTerm + iTerm + dTerm), -255, 255);
}

void dof()
{
while(i2cRead(0x3B,i2cData,14));
accX = ((i2cData[0] << 8) | i2cData[1]);
accY = ((i2cData[2] << 8) | i2cData[3]);
accZ = ((i2cData[4] << 8) | i2cData[5]);
tempRaw = ((i2cData[6] << 8) | i2cData[7]);  
gyroX = ((i2cData[8] << 8) | i2cData[9]);
gyroY = ((i2cData[10] << 8) | i2cData[11]);
gyroZ = ((i2cData[12] << 8) | i2cData[13]);
accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;
double gyroXrate = (double)gyroX/131.0;
CurrentAngle = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000);
timer = micros();
}

i2cRead di che libreria dovrebbe far parte? Se la risposta è nella Wire.h puoi constatare che nella Wire.h il metodo Read è scritto semplicemente read.
link

@Vitto98: prima di tutto, dato che non lo hai ancora fatto, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More -> Modify) il tuo post e racchiudi il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Il codice senza tag CODE può venire male interpretato dal motore del forum e ... il risultato è quello che vedi nel tuo post ... "emoticons" al posto di parti di codice.

Guglielmo

@RobertoBochet ic2Read dovrebbe far parte della libreria i2cdev che ho scaricato e aggiunto ad arduino, in qualsiasi caso non riesco a capire dove sia il problema.

E perché hai scaricato quella libreria ? Arduino ha la sua libreria standard per la gestione di devices I2C e non occorre aggiungerne altre (... anche perché l'avrai anche scaricata, ma poi stai includendo quella standard di Arduino e quindi NON la stai usando).

Guglielmo

@gpb01 che sia la sua standard o scaricata la libreria è presente nell'applicazione, di conseguenza non dovrebbe dare errore, ma continua ugualmente a darmi la stessa segnalazione

Quale applicazione ? Quale robot balanced ? Lo scrivi come se il mondo dovesse sapesse di che progetto specifico stai parlando.
Dacci più informazioni: quale progetto stai provando ? Che hardware hai ?
Quali librerie (e metti un sacrosanto link) stai provando ?

Allora ti rispondo in maniera che tu possa capire cosi almeno se riuscite mi potete dare un'aiuto, ho costruito un balanced robot utilizzato Arduino, Modulo 6 assi MPU-6050, L293D per la gestione dei motori.
L'unico problema è l'errore che mi da il codice dicendomi ic2Write is not declared in this scope e mi seleziona questa riga di codice:

while(i2cWrite(0x6B,0x01,true));

Le librerie che ho inserito sono:
Kalman Filter
MPU6050
PID v1
I2Cdev

ma stai forse facendo questo ?

Vitto98:
@gpb01 che sia la sua standard o scaricata la libreria è presente nell'applicazione, di conseguenza non dovrebbe dare errore, ma continua ugualmente a darmi la stessa segnalazione

... io vedo l'include della Wire.h, ma l'include della I2Cdev.h NON lo vedo ... a che riga si trova ? ? ?

Guglielmo

@Brunello nono simile, ma con meno sensori, il codice è diverso
@gpd01 non l'ho scritta, adesso l'ho inserito nel programma ma non funziona ugualmente. L'errore è sempre quello

... permettimi, senza alcuna offesa, ma, secondo me, tu NON sai bene cosa stai facendo e stai muovendoti facendo copia/incolla senza capire cosa stai copiando/incollando. ::slight_smile:

Intanto, se guardi in nel package i2cdevlib, la parte i2Cdev è così descritta: "Add support for i2c_t3 on Teensy 3.1/3.2" ... ma in ogni caso ... i2cWrite sarà un metodo di una classe quindi occorre il "costruttore" della classe e poi va chiamato con la sintassi con cui si chiamano i metodi ... oggetto.metodo() ...

Ho idea che devi studiarti esattamente le componenti di quel package e capire: 1. a cosa servono e 2. come si usano.

Guglielmo

Infatti a me serve solo sapere cosa devo fare per sistemare questo codice in modo che mi possa funzionare il tutto, non mi offendo, non mi interessa, io ho scritto in questo forum per farmi aiutare e colmare la mia ignoranza del C, non per essere giudicato.

NO, non funziona cosí.
Ti aiutiamo per portarti a capire l' errore per il quale non funziona il Tuo progetto ( che secondo me abbiamo giá ampiamente fatto) ma non per correggerti lo sketch.
Inoltre non avendo il Tuo hardware e non avendo nemmeno informazioni sul hardware che usi non possiamo scrivere uno sketch che funziona.

Per questo Ti aiutiamo se vuoi imparare ma non Ti diamo la pappa pronta.

Ciao Uwe

No, assolutamente, chiedevo solo un'aiuto per capire cosa mancasse nel codice

Secondo me é un codice non ha mai funzionato e non puó funzionare perché é scritto in modo sbagliato.

i2cWrite sarà un metodo di una classe quindi occorre il "costruttore" della classe e poi va chiamato con la sintassi con cui si chiamano i metodi ... oggetto.metodo() ...

Come ha scritto Guglielmo non viene usato in modo corretto l'oggetto. Se non capisci cosa significa allora studiati la programmazione a oggetti per esempio del C++.

Ciao Uwe

ic2write dovrebbe far parte della libreria i2cdev come fa vedere da github
anche qua è presente "i2cwrite"

Vitto98:
anche qua è presente "i2cwrite"
KalmanFilter/examples/MPU6050/I2C.ino at master · TKJElectronics/KalmanFilter · GitHub

Veramente li NON usa i2cwrite(), li dentro E' DEFINITO i2cwrite() ...

....
....
uint8_t i2cWrite(uint8_t registerAddress, uint8_t *data, uint8_t length, bool sendStop) {
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data, length);
  uint8_t rcode = Wire.endTransmission(sendStop); // Returns 0 on success
  if (rcode) {
    Serial.print(F("i2cWrite failed: "));
    Serial.println(rcode);
  }
  return rcode; // See: http://arduino.cc/en/Reference/WireEndTransmission
}
....
....

... e se non ti studi tutto il package, come si include, quali .h devi usare, ecc. ecc. difficilmente ne esci.

Guglielmo

Vitto98:
ic2write dovrebbe far parte della libreria i2cdev come fa vedere da github
anche qua è presente "i2cwrite"
KalmanFilter/examples/MPU6050/I2C.ino at master · TKJElectronics/KalmanFilter · GitHub

Allora mi spieghi come puoi usare qualcosa di una libreria che non includi?
Lo sketch che hai segnalato nel altro tread ( Building a self balancing bot - Bajdi electronics ) include solo Wire.h e Kalman.h

Ciao Uwe

@uwefed Infatti dopo su aiuto di Guglielmo ho aggiunto anche la libreria I2C.h ma mi rimane ugualmente lo stesso errore