Qui sotto potete vedere il software modificato ,per semplificare ho inserito solo la parte che e' stata modificata.
#ifdef OUTPUT_READABLE_REALACCEL
// display real acceleration, adjusted to remove gravity
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetAccel(&aa, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
Serial.print("areal\t");
Serial.print(aaReal.x);
Serial.print("\t");
Serial.print(aaReal.y);
Serial.print("\t");
Serial.println(aaReal.z);
lettura[attuale++] = aaReal.x;
if (attuale > (NUM_ELEM_MEAN - 1) ) {
attuale = 0;
}
media = 0;
for(int index=0;index<NUM_ELEM_MEAN;index++) {
media += lettura[index];
}
media = media / NUM_ELEM_MEAN;
//NEW CODE
if (delay_counter < 1700) {
delay_counter++;
} else {
v = (-500. + media)*(255./400.);
if (v == 0) {
//fermo
vel = 0;
analogWrite (E1,0);
digitalWrite(M1,LOW);
analogWrite (E2,0);
digitalWrite(M2,LOW);
} else if (v > 0) {
//avanti
vel = v;
analogWrite (E1,vel);
digitalWrite(M1,HIGH);
analogWrite (E2,vel);
digitalWrite(M2,HIGH);
} else if (v < 0){
//in dietro
vel = -v;
analogWrite (E1,vel);
digitalWrite(M1,LOW);
analogWrite (E2,vel);
digitalWrite(M2,LOW);
}
}
#endif
Ho semplicemente sostituito nel codice precedente il dato da usare che tiene conto solo della variazione dell'asse x chiamato:"aaReal.x".Poi ho dovuto inserire per la calibrazione del sensore anziché il valore in gradi usato precedentemente il valore -500 che consiste nel valore di partenza quando e' perfettamente parallelo al terreno.Ecco qui si sono presentati i primi problemi perché ad ogni accensione questo valore ha una variazione che quindi mi sposta il riferimento iniziale e questo mi sta dando qualche problema di stabilita'.
Ho dovuto inserire un counter
if (delay_counter < 1700) {
delay_counter++;
questo perché il sensore all'accensione impiega alcuni secondi(circa 15) per raggiungere il valore stabile iniziale quindi dopo circa 1700 letture diventa stabile.Quindi i comandi ai motori vengono inviati dopo questi 15 secondi.
Ora al software manca solo la parte di sterzata data dal potenziometro collegato al manubrio che ancora non ho sviluppato.
Ciao Giuseppe complimentissimi per il tuo lavoro e per la volonta' di condividerlo con altri!!! Anche io da tempo sto coltivando il sogno di costruire un segway !!ottimo esercizio fisico, meccanico ed elettronico!!! Ed anche io ho l'mpu6050 e quindi...nn ti dico come sono felice aver scoperto questo blog!!!!ancora complimenti e grazie mille!!ora mi mettero' a leggere tutto quanto hai scritto per capire meglio e trarre spunti! Magari poi ti rompero' le scatole con qualche domanda se posso!!ok?grazie ancora e buona continuazione!ciao,Lorenzo
RispondiEliminaCiao Giuseppe,
RispondiEliminacome sai sto seguendo attentamente il tuo progetto poiche' anche io sto facendo, o meglio tentando di fare, qualcosa di simile (anche se io sto ancora analizzando solo la parte software!). Un a domanda pero' volevo farti: come mai hai deciso di usare il valore "aaReal.x" al posto di altri, per esempio "yaw"? Te lo chiedo perche' in alcuni progetti ed in quello che sto facendo io...viene preso il valore proprio dal gyro (se capisco bene) "yaw".
Grazie mille e complimenti per il lavoro che sta uscendo proprio bene!bravo!
ciao,Lorenzo
ciao loarri scusa se ti rispondo in ritardo ma ho sempre meno tempo da dedicarmi a questo progetto e blog
Eliminacomunque ho deciso di usare aaReal.X perché non sente la variazione dell'asse della sterzata....non so se riesco a spiegartelo a parole.Prima usavo euler angle ma quando giravo il segway a destra o sinistra i dati variavano e quindi variava la velocita' dei motori mentre io volevo che la velocita' dei motori variasse solo all'inclinazione avanti indietro e non destra sinistra.......perche' la sterzata deve essere gestita in altro modo con un potenziometro.Spero di essermi spiegato.
grazie ciao