Arduino Galileo

Buon pomeriggio,
Sto realizzando un progetto per la mia tesina di maturità e, avendo riscontrato dei problemi mi è stato consigliato di provare un Arduino più potente.
sono riuscito a reperire l'Arduino intel Galileo ma sto riscontrando molti problemi.

  1. non riesco a capire se sto utilizzando il programma giusto per programmarlo.
  2. se sto utilizzando il programma giusto l'Arduino nonostante io lo programmi (con i programmi di prova perché qualsiasi programma scritto da me non me lo fa compilare) non risponde a nessun comando.
  3. non riesco a capire se le librerie che utilizzo siano compatibili con l'intel Galileo.

vi prego aiutatemi non so proprio dove sbattere la testa :confused:

Il Galileo era un prodotto Intel che non ha che fare niente con Arduino.

Spiegati cosa vuoi fare e che problemi hai riscontrato cosí vediamo di risolverli insieme.

Ciao Uwe

... probabilmente il posto più adatto, dove andare a porre queste domande, è il forum di supporto Intel per le Galileo/Galileo 2 ::slight_smile:

Guglielmo

utilizzando l’MPU6050 volevo calcolare l’angolo di inclinazione di un corpo in movimento e scriverlo su un display Oled.
ho trovato un programma già fatto che mi misurava l’angolo e me lo stampava sul monitor seriale, io ho aggiunto le librerie per utilizzare il display e alcune stringhe di codice.
il programma risulta molto lento ad elaborare i dati e scrivessi sul display, portando l’MPU6050 a 90° il display visualizza tutti i valori fino ad arrivare a 90° impiegando molto tempo.
vi faccio vedere il programma.

void loop(){

  read_mpu_6050_data();   
 //Subtract the offset values from the raw gyro values
  gyro_x -= gyro_x_cal;                                                
  gyro_y -= gyro_y_cal;                                                
  gyro_z -= gyro_z_cal;                                                
         
  //Gyro angle calculations . Note 0.0000611 = 1 / (250Hz x 65.5)
  angle_pitch += gyro_x * 0.0000611;                                   //Calculate the traveled pitch angle and add this to the angle_pitch variable
  angle_roll += gyro_y * 0.0000611;                                    //Calculate the traveled roll angle and add this to the angle_roll variable
  //0.000001066 = 0.0000611 * (3.142(PI) / 180degr) The Arduino sin function is in radians
  angle_pitch += angle_roll * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the roll angle to the pitch angel
  angle_roll -= angle_pitch * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the pitch angle to the roll angel
  
  //Accelerometer angle calculations
  acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z));  //Calculate the total accelerometer vector
  //57.296 = 1 / (3.142 / 180) The Arduino asin function is in radians
  angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296;       //Calculate the pitch angle
  angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;       //Calculate the roll angle
  
  angle_pitch_acc -= 0.0;                                              //Accelerometer calibration value for pitch
  angle_roll_acc -= 0.0;                                               //Accelerometer calibration value for roll

  if(set_gyro_angles){                                                 //If the IMU is already started
    angle_pitch = angle_pitch * 0.9996 + angle_pitch_acc * 0.0004;     //Correct the drift of the gyro pitch angle with the accelerometer pitch angle
    angle_roll = angle_roll * 0.9996 + angle_roll_acc * 0.0004;        //Correct the drift of the gyro roll angle with the accelerometer roll angle
  }
  else{                                                                //At first start
    angle_pitch = angle_pitch_acc;                                     //Set the gyro pitch angle equal to the accelerometer pitch angle 
    angle_roll = angle_roll_acc;                                       //Set the gyro roll angle equal to the accelerometer roll angle 
    set_gyro_angles = true;                                            //Set the IMU started flag
  }
  
  //To dampen the pitch and roll angles a complementary filter is used
  angle_pitch_output = angle_pitch_output * 0.9 + angle_pitch * 0.1;   //Take 90% of the output pitch value and add 10% of the raw pitch value
  angle_roll_output = angle_roll_output * 0.9 + angle_roll * 0.1;      //Take 90% of the output roll value and add 10% of the raw roll value
  Serial.print(" | Angle  = "); Serial.println(angle_pitch_output);
     
  display.clearDisplay();
display.setCursor(32,32);
display.println(angle_pitch_output);
display.display();  // Print everything we set previously   
}

void setup_mpu_6050_registers(){
  //Activate the MPU-6050
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x6B);                                                    //Send the requested starting register
  Wire.write(0x00);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the accelerometer (+/-8g)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1C);                                                    //Send the requested starting register
  Wire.write(0);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
  //Configure the gyro (500dps full scale)
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x1B);                                                    //Send the requested starting register
  Wire.write(0);                                                    //Set the requested starting register
  Wire.endTransmission();                                             
}


void read_mpu_6050_data(){                                             //Subroutine for reading the raw gyro and accelerometer data
  Wire.beginTransmission(0x68);                                        //Start communicating with the MPU-6050
  Wire.write(0x3B);                                                    //Send the requested starting register
  Wire.endTransmission();                                              //End the transmission
  Wire.requestFrom(0x68,14);                                           //Request 14 bytes from the MPU-6050
  while(Wire.available() < 14);                                        //Wait until all the bytes are received
  acc_x = Wire.read()<<8|Wire.read();                                  
  acc_y = Wire.read()<<8|Wire.read();                                  
  acc_z = Wire.read()<<8|Wire.read();                                  
  temp = Wire.read()<<8|Wire.read();                                   
  gyro_x = Wire.read()<<8|Wire.read();                                 
  gyro_y = Wire.read()<<8|Wire.read();                                 
  gyro_z = Wire.read()<<8|Wire.read();                                 
}

Cancelare il display é una cosa molto lenta. è meglio sovrascrivere solo la parte da modificare.

Ciao Uwe

il problema sta anche nel fatto che senza il display l'angolo sul monitor seriale si vede in tempo reale, quando vado ad aggiungere il display si legge lento anche sul monitor.

Come ha gia detto Uwe, il clear display rallenta tutto ... non so che display usi, se non e' grafico, basta che riscrivi senza fare il clear (salvo aggiungere degli spazi vuoti per coprire eventuali cifre inutili se usi virgola mobile), se invece e' grafico, forse la soluzione piu rapida e' riscrivere esattamente la stessa cosa con il colore di fondo prima della nuova frase ... tipo, se ho scritto una riga in bianco su nero, per scrivere una riga diversa cancellando la prima, scrivo la vecchia riga in nero su nero, riposiziono il cursore, e scrivo la nuova riga in bianco ... e se parte della vecchia e' identica alla nuova, riscrivo solo la parte diversa ... ad esempio, se scrivo "ANGOLO 00", e la parola "ANGOLO" e' sempre la stessa mentre le cifre cambiano, non serve che la riscriva ogni volta, posiziono il cursore all'inizio del numero e sovrascrivo solo quello ... :wink: