Ciao a tutti!
allora ho un problema elettrico serio.
Le sto provando davvero tutte, con i miei limiti di conoscenza e purtroppo
non riesco a venirne fuori!
Se guardate l'immagine allegata potete vedere come utilizzo una batteria
LIPO a 3 celle 2700ah da 11,4V per alimentare:
TRAMITE STEP-DOWN 2A SETTATO a 5V:
Arduino MEGA2560
Giroscopio MPU-6050 (GY-521)
4 x sensori di forza
Ricevitore PS2
Laser LIDAR
Adafruit Servo board
TRAMITE STEP-DOWN 10A SETTATO a 6,19 V :
Alimentazione servi sulla Adafruit Servo board
Questo è il codice di setup del giroscopio:
//-------------------------- GYRO
// join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 12; // 400kHz I2C clock (200kHz if CPU is 8MHz)
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(200, true); //200 o 400????
#endif
Serial.begin(115200); //115200
//Serial.begin(57600);
while (!Serial); // wait for Leonardo enumeration, others continue immediately
mpu.initialize();
// load and configure the DMP
//Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();
// supply your own gyro offsets here, scaled for min sensitivity
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); //1788 // 1688 factory default for my test chip
// make sure it worked (returns 0 if so)
if (devStatus == 0) {
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 {
}
E questo è il codice nel loop principale:
// 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;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
// display Euler angles in degrees
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
z = ypr[0] * 180/M_PI; //yawn
x = ypr[1] * 270/M_PI; //roll SE SI RIDUCE IN 90/M_PI, I GRADI AUMENTANO MENO DURANTE INCLINAZIONE
y = ypr[2] * 270/M_PI; //pitch SE SI RIDUCE IN 90M_PI, I GRADI AUMENTANO MENO DURANTE INCLINAZIONE
//--------------------------------------------- valore asse Y - PITCH
//angolo_pitch_reale = y;
angolo_pitch_attuale = y;
//--------------------------------------------- valore asse X - LATERAL ROLL
//angolo_roll_reale = x;
angolo_roll_attuale = x;
//--------------------------------------------- valore asse Z - YAWN BUSSOLA (trasformato in 360°)
if (z <= 0 && z >= -179)
{
angolo_rotta_attuale = (z + 361) % 360;
}
if (z >= 0 && z <= 179)
{
angolo_rotta_attuale = (z + 360) % 360;
}
#endif
}
Ok, utilizzando questa configurazione, ottengo che tutto funzioni bene.
Ma avviando il robot, una volta su 4, il giroscopio fallisce l'iniziallizzazione, bloccando tutto il programma.
Fino ad'ora non mi importava molto, anche perchè la maggioranza di volta in cui avviavo il robot, ottenevo buoni risultati e questo problema appunto si verificava nella minoranza dei casi.
Ok, due giorni fa, durante uno dei tanti test, mi sono reso conto che era giunto il momento di sostituire lo step-down da 10A con uno da 20A dato che in alcune configurazioni di postura, le zampe del mio robot chiedevano piu' corrente di quella che poteva "passare" dallo step-down da 10A.
Dico questo perchè gia' con il robot appoggiato a terra, con tutto il suo peso, fermo senza fare movimenti, lo step-down da 10A aveva gia' la lucina BLU trasformata in ROSSA. In questo Step-down, la lucina se diventa rossa significa che lo step-down è vicinissimo al suo limite di Ampere "erogabili"..
Quindi l'ho sostituito appunto con il nuovo step-down da 20A e 300Watt.
A quel punto riprovo tutto e noto che purtroppo il giroscopio ora TUTTE LE VOLTE che avvio il programma, non riesce a inizializzarsi.
Tutte le volte purtroppo!
con l'altro step-down da 10A una volta su quattro falliva l'inizializzazione ma con questo 4 volte su 4 il giroscopio non si inizializza.
Solo 2 volte sono riuscito a farlo partire ma nemmeno un secondo dopo i dati RAW impazziscono fino a crashare e bloccare il programma.
Ora... mi chiedo in ambito hardware cosa cavolo genera tutto cio!
Ho provato a utilizzare varie configurazioni con diversi condensatori attaccati un paio di centimetri dal giroscopio ma il risultato non cambia.
Con la batteria SPENTA e il robot attaccato via USB al PC, tutto ok, il giroscopio funziona.
Ma se accendo la batteria e poi attacco il robot via USB al pc (per poter utilizzare processing), zero, il giroscopio non inizializza.
Se voglio utilizzare il giroscopio, sono costretto a riutilizzare lo step-down da 10A. Ritornando ad avere 3 volte su 4 il giroscopio funzionante.
Un dubbio mi gira in testa.. non è che mi sono dimenticato qualche GROUND da mettere in comune tra Adafruit e Arduino? o magari tra Adafruit e giroscopio?