Ciao a tutti, sono tornato dopo aver accantonato arduino per un po causa sessione estiva. Mi sono rimesso all'opera nella speranza di poter progettare un dispositivo che mi permettesse di raccogliere dati utilizzando un mpu6050 e di salvarli in una sd. E' una specie di datalogger che non sfutta un modulo rtx bensì salva il tempo millis().
Ovviamente realizzare ciò mi ha portato tanti problemi tutti risolti in un modo o nell'altro. Oggi credevo di avercela finalmente fatta, tutto funzionava ma dovevo modificare lo sketch poichè avevo dimenticato di far printare uno " " sul file .txt, tuttavia quando ho aggiunto ciò e ricaricato lo sketch mi si è ripresentato un nuovo problema che non c'era mai stato:
// check esistenza file, in caso lo elimino
if (SD.exists("datalog.txt")) {
SD.remove("datalog.txt");
digitalWrite(7, HIGH);
delay(2000);
}
l'if viene aperto ma la funzione .remove non fa il suo compito.
il risultato è che non viene eliminato il file che vi era in precedenza per poi ricrearne un altro vuoto ma semplicemente aggiunge i nuovi dati al file contenente ii dati di un altra "sessione".
vi allego il codice anche se come già detto, mi sembra essere uno di quei casi di "prima funzionava e ora no e non ho cambiato nulla", ovviamente mi piace pensare che la magia nera non esista ![]()
// include librerie per i2c e gestione mpu
#include <Wire.h>
#include <MPU6050_tockn.h>
// librerie gestione interfaccia SPI e SD
#include <SPI.h>
#include <SD.h>
//##########################################################################
// creo oggetto per mpu
MPU6050 mpu6050(Wire);
// creazione oggetto file
File file;
void setup() {
//pinmode
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
// check connessione SD
if (!SD.begin(10)) {
digitalWrite(9, HIGH);
while(1);
}
// check esistenza file, in caso lo elimino
if (SD.exists("datalog.txt")) {
SD.remove("datalog.txt");
digitalWrite(7, HIGH);
delay(2000);
}
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
// creo file in modalità WRITE
file = SD.open("datalog.txt", FILE_WRITE);
file.println("coordinate inclinazione x y z");
delay(2000);
digitalWrite(8, LOW);
delay(1000);
// inizializzo i2c ed mpu
digitalWrite(8, HIGH);
Wire.begin();
mpu6050.begin();
// taro mpu
mpu6050.calcGyroOffsets(true);
delay(1000);
digitalWrite(8, LOW);
file.close();
}
//##########################################################################
// definizione di altre varibili
unsigned long dt, t1=0;
float x, y, z;
void loop() {
// update del mpu6050
mpu6050.update();
digitalWrite(9, HIGH);
// prendo dati ogni 0.2 sec
dt = millis() - t1;
if (dt >= 300) {
t1 = millis();
digitalWrite(9, LOW);
// estraggo dati angoli lungo le coordinate
x = mpu6050.getAngleX();
y = mpu6050.getAngleY();
z = mpu6050.getAngleZ();
// converto dati numerici in stringa
String coord = String(x,1) + " " + String(y,1) + " " + String(z,1) +" ";
// stampo i numeri nel file
file = SD.open("datalog.txt", FILE_WRITE);
file.print(coord.c_str());
file.println(t1, DEC);
file.close();
}
}
i led mi aiutano per il debugging del codice poichè non posso utilizzare la serial. Infatti un'altra informazione importante è che sto realizzando questo progetto utilizzando un Atmega328 standalone (anche questo mi ha dato molti problemi per programmarlo per via della sua signature che si discosta da quella del fratello P).
se volete vi allego lo schema elettrico, ma è molto standard:
i2c per mpu6050
spi (maledetta) per il lettore di microsd
quarzo da 16000hz
due condensatori da 22pico
resistenza da 10kohm connessa al pin di reset dell'atmega
e tre led connessi ai pin 9 8 7
grazie mille!
Riccardo
