<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Acc%C3%A9l%C3%A9rocube</id>
		<title>Les Fabriques du Ponant - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Acc%C3%A9l%C3%A9rocube"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Acc%C3%A9l%C3%A9rocube"/>
		<updated>2026-04-05T23:27:02Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2023_:_acc%C3%A9l%C3%A9rocube&amp;diff=21834</id>
		<title>ENIB 2023 : accélérocube</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=ENIB_2023_:_acc%C3%A9l%C3%A9rocube&amp;diff=21834"/>
				<updated>2023-01-19T14:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Accélérocube : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==photo du projet==&lt;br /&gt;
[[Fichier:IMG 20230118 111934988.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
==Que fait ce projet ? ==&lt;br /&gt;
Cube qui éclaire une ampoule si posé vers le haut&lt;br /&gt;
&lt;br /&gt;
==Liste des composants==&lt;br /&gt;
*ampoule&lt;br /&gt;
*accéléromètre&lt;br /&gt;
*bois&lt;br /&gt;
*vis&lt;br /&gt;
*pinces croco&lt;br /&gt;
*batterie&lt;br /&gt;
*carte arduino&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const int MPU_addr=0x3F;&lt;br /&gt;
int gyro_x, gyro_y, gyro_z;&lt;br /&gt;
long gyro_x_cal, gyro_y_cal, gyro_z_cal;&lt;br /&gt;
boolean set_gyro_angles;&lt;br /&gt;
 &lt;br /&gt;
long acc_x, acc_y, acc_z, acc_total_vector;&lt;br /&gt;
float angle_roll_acc, angle_pitch_acc;&lt;br /&gt;
 &lt;br /&gt;
float angle_pitch, angle_roll;&lt;br /&gt;
int angle_pitch_buffer, angle_roll_buffer;&lt;br /&gt;
float angle_pitch_output, angle_roll_output;&lt;br /&gt;
int diceNum;&lt;br /&gt;
&lt;br /&gt;
long loop_timer;&lt;br /&gt;
int temp;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  setup_mpu_6050_registers(); &lt;br /&gt;
  for (int cal_int = 0; cal_int &amp;lt; 1000 ; cal_int ++){                  &lt;br /&gt;
    read_mpu_6050_data(); &lt;br /&gt;
    //Add the gyro x offset to the gyro_x_cal variable                                            &lt;br /&gt;
    gyro_x_cal += gyro_x;&lt;br /&gt;
    //Add the gyro y offset to the gyro_y_cal variable                                              &lt;br /&gt;
    gyro_y_cal += gyro_y; &lt;br /&gt;
    //Add the gyro z offset to the gyro_z_cal variable                                             &lt;br /&gt;
    gyro_z_cal += gyro_z; &lt;br /&gt;
    //Delay 3us to have 250Hz for-loop                                             &lt;br /&gt;
    delay(3);                                                          &lt;br /&gt;
  }&lt;br /&gt;
  gyro_x_cal /= 1000;                                                 &lt;br /&gt;
  gyro_y_cal /= 1000;                                                 &lt;br /&gt;
  gyro_z_cal /= 1000;&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  loop_timer = micros();                                               &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // Get data from MPU-6050&lt;br /&gt;
  read_mpu_6050_data();&lt;br /&gt;
     &lt;br /&gt;
  //Subtract the offset values from the raw gyro values&lt;br /&gt;
  gyro_x -= gyro_x_cal;                                                &lt;br /&gt;
  gyro_y -= gyro_y_cal;                                                &lt;br /&gt;
  gyro_z -= gyro_z_cal;                                                &lt;br /&gt;
         &lt;br /&gt;
  //Gyro angle calculations . Note 0.0000611 = 1 / (250Hz x 65.5)&lt;br /&gt;
  &lt;br /&gt;
  //Calculate the traveled pitch angle and add this to the angle_pitch variable&lt;br /&gt;
  angle_pitch += gyro_x * 0.0000611;  &lt;br /&gt;
  //Calculate the traveled roll angle and add this to the angle_roll variable&lt;br /&gt;
  //0.000001066 = 0.0000611 * (3.142(PI) / 180degr) The Arduino sin function is in radians                                &lt;br /&gt;
  angle_roll += gyro_y * 0.0000611; &lt;br /&gt;
                                     &lt;br /&gt;
  //If the IMU has yawed transfer the roll angle to the pitch angle&lt;br /&gt;
  angle_pitch += angle_roll * sin(gyro_z * 0.000001066);&lt;br /&gt;
  //If the IMU has yawed transfer the pitch angle to the roll angle               &lt;br /&gt;
  angle_roll -= angle_pitch * sin(gyro_z * 0.000001066);               &lt;br /&gt;
  &lt;br /&gt;
  //Accelerometer angle calculations&lt;br /&gt;
  &lt;br /&gt;
  //Calculate the total accelerometer vector&lt;br /&gt;
  acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z)); &lt;br /&gt;
   &lt;br /&gt;
  //57.296 = 1 / (3.142 / 180) The Arduino asin function is in radians&lt;br /&gt;
  //Calculate the pitch angle&lt;br /&gt;
  angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296; &lt;br /&gt;
  //Calculate the roll angle      &lt;br /&gt;
  angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;       &lt;br /&gt;
  &lt;br /&gt;
  //Accelerometer calibration value for pitch&lt;br /&gt;
  angle_pitch_acc -= 0.0;&lt;br /&gt;
  //Accelerometer calibration value for roll                                              &lt;br /&gt;
  angle_roll_acc -= 0.0;                                               &lt;br /&gt;
  if(set_gyro_angles){ &lt;br /&gt;
  &lt;br /&gt;
  //If the IMU has been running &lt;br /&gt;
  //Correct the drift of the gyro pitch angle with the accelerometer pitch angle                      &lt;br /&gt;
    angle_pitch = angle_pitch * 0.9996 + angle_pitch_acc * 0.0004; &lt;br /&gt;
    //Correct the drift of the gyro roll angle with the accelerometer roll angle    &lt;br /&gt;
    angle_roll = angle_roll * 0.9996 + angle_roll_acc * 0.0004;        &lt;br /&gt;
  }&lt;br /&gt;
  else{ &lt;br /&gt;
    //IMU has just started  &lt;br /&gt;
    //Set the gyro pitch angle equal to the accelerometer pitch angle                                                           &lt;br /&gt;
    angle_pitch = angle_pitch_acc;&lt;br /&gt;
    //Set the gyro roll angle equal to the accelerometer roll angle                                       &lt;br /&gt;
    angle_roll = angle_roll_acc;&lt;br /&gt;
    //Set the IMU started flag                                       &lt;br /&gt;
    set_gyro_angles = true;                                            &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  //To dampen the pitch and roll angles a complementary filter is used&lt;br /&gt;
  //Take 90% of the output pitch value and add 10% of the raw pitch value&lt;br /&gt;
  angle_pitch_output = angle_pitch_output * 0.9 + angle_pitch * 0.1; &lt;br /&gt;
  //Take 90% of the output roll value and add 10% of the raw roll value &lt;br /&gt;
  angle_roll_output = angle_roll_output * 0.9 + angle_roll * 0.1; &lt;br /&gt;
  //Wait until the loop_timer reaches 4000us (250Hz) before starting the next loop  &lt;br /&gt;
  &lt;br /&gt;
  // Print to Serial Monitor   &lt;br /&gt;
  //Serial.print(&amp;quot; | Angle  = &amp;quot;); Serial.println(angle_pitch_output);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Check Angle for Level LEDs&lt;br /&gt;
  &lt;br /&gt;
    if (angle_pitch_output &amp;lt; -2.01) {&lt;br /&gt;
    // Turn on Level LED&lt;br /&gt;
    digitalWrite(levelLED_neg1, HIGH);&lt;br /&gt;
    digitalWrite(levelLED_neg0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_level, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos1, LOW);&lt;br /&gt;
    &lt;br /&gt;
    } else if ((angle_pitch_output &amp;gt; -2.00) &amp;amp;&amp;amp; (angle_pitch_output &amp;lt; -1.01)) {&lt;br /&gt;
    // Turn on Level LED&lt;br /&gt;
    digitalWrite(levelLED_neg1, LOW);&lt;br /&gt;
    digitalWrite(levelLED_neg0, HIGH);&lt;br /&gt;
    digitalWrite(levelLED_level, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos1, LOW);&lt;br /&gt;
    &lt;br /&gt;
    } else if ((angle_pitch_output &amp;lt; 1.00) &amp;amp;&amp;amp; (angle_pitch_output &amp;gt; -1.00)) {&lt;br /&gt;
    // Turn on Level LED&lt;br /&gt;
    digitalWrite(levelLED_neg1, LOW);&lt;br /&gt;
    digitalWrite(levelLED_neg0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_level, HIGH);&lt;br /&gt;
    digitalWrite(levelLED_pos0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos1, LOW);&lt;br /&gt;
    &lt;br /&gt;
    } else if ((angle_pitch_output &amp;gt; 1.01) &amp;amp;&amp;amp; (angle_pitch_output &amp;lt; 2.00)) {&lt;br /&gt;
    // Turn on Level LED&lt;br /&gt;
    digitalWrite(levelLED_neg1, LOW);&lt;br /&gt;
    digitalWrite(levelLED_neg0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_level, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos0, HIGH);&lt;br /&gt;
    digitalWrite(levelLED_pos1, LOW);&lt;br /&gt;
    &lt;br /&gt;
    } else if (angle_pitch_output &amp;gt; 2.01) {&lt;br /&gt;
    // Turn on Level LED&lt;br /&gt;
    digitalWrite(levelLED_neg1, LOW);&lt;br /&gt;
    digitalWrite(levelLED_neg0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_level, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos0, LOW);&lt;br /&gt;
    digitalWrite(levelLED_pos1, HIGH);&lt;br /&gt;
    &lt;br /&gt;
    }  &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 while(micros() - loop_timer &amp;lt; 4000); &lt;br /&gt;
 //Reset the loop timer                                &lt;br /&gt;
 loop_timer = micros();&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup_mpu_6050_registers(){&lt;br /&gt;
 &lt;br /&gt;
  //Activate the MPU-6050&lt;br /&gt;
  &lt;br /&gt;
  //Start communicating with the MPU-6050&lt;br /&gt;
  Wire.beginTransmission(0x68); &lt;br /&gt;
  //Send the requested starting register                                       &lt;br /&gt;
  Wire.write(0x6B);  &lt;br /&gt;
  //Set the requested starting register                                                  &lt;br /&gt;
  Wire.write(0x00);&lt;br /&gt;
  //End the transmission                                                    &lt;br /&gt;
  Wire.endTransmission(); &lt;br /&gt;
                                              &lt;br /&gt;
  //Configure the accelerometer (+/-8g)&lt;br /&gt;
  &lt;br /&gt;
  //Start communicating with the MPU-6050&lt;br /&gt;
  Wire.beginTransmission(0x68); &lt;br /&gt;
  //Send the requested starting register                                       &lt;br /&gt;
  Wire.write(0x1C);   &lt;br /&gt;
  //Set the requested starting register                                                 &lt;br /&gt;
  Wire.write(0x10); &lt;br /&gt;
  //End the transmission                                                   &lt;br /&gt;
  Wire.endTransmission(); &lt;br /&gt;
                                              &lt;br /&gt;
  //Configure the gyro (500dps full scale)&lt;br /&gt;
  &lt;br /&gt;
  //Start communicating with the MPU-6050&lt;br /&gt;
  Wire.beginTransmission(0x68);&lt;br /&gt;
  //Send the requested starting register                                        &lt;br /&gt;
  Wire.write(0x1B);&lt;br /&gt;
  //Set the requested starting register                                                    &lt;br /&gt;
  Wire.write(0x08); &lt;br /&gt;
  //End the transmission                                                  &lt;br /&gt;
  Wire.endTransmission(); &lt;br /&gt;
                                              &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void read_mpu_6050_data(){ &lt;br /&gt;
 &lt;br /&gt;
  //Read the raw gyro and accelerometer data&lt;br /&gt;
 &lt;br /&gt;
  //Start communicating with the MPU-6050                                          &lt;br /&gt;
  Wire.beginTransmission(0x68);  &lt;br /&gt;
  //Send the requested starting register                                      &lt;br /&gt;
  Wire.write(0x3B);&lt;br /&gt;
  //End the transmission                                                    &lt;br /&gt;
  Wire.endTransmission(); &lt;br /&gt;
  //Request 14 bytes from the MPU-6050                                  &lt;br /&gt;
  Wire.requestFrom(0x68,14);    &lt;br /&gt;
  //Wait until all the bytes are received                                       &lt;br /&gt;
  while(Wire.available() &amp;lt; 14);&lt;br /&gt;
  &lt;br /&gt;
  //Following statements left shift 8 bits, then bitwise OR.  &lt;br /&gt;
  //Turns two 8-bit values into one 16-bit value                                       &lt;br /&gt;
  acc_x = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                  &lt;br /&gt;
  acc_y = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                  &lt;br /&gt;
  acc_z = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                  &lt;br /&gt;
  temp = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                   &lt;br /&gt;
  gyro_x = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                 &lt;br /&gt;
  gyro_y = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                                 &lt;br /&gt;
  gyro_z = Wire.read()&amp;lt;&amp;lt;8|Wire.read();                  &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégories==&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Enib2023]]&lt;/div&gt;</summary>
		<author><name>Accélérocube</name></author>	</entry>

	</feed>