Horizon artificiel avec le MPU6050

Bonjour à tous et mes vœux de santé pour cette nouvelle année, je suis débutant en code source et je monte un projet sur une carte Arduino Uno avec un MPU6050, le but étant d'animer via un servo moteur de type 9G un mobile représentant un avion, j'ai copié un code sur le net car je suis incapable pour le moment d'en élaborer un et ça fonctionne, mais je souhaiterai à la mise sous tension que le servo moteur évolue de 60° sur la gauche ensuite de revenir sur la droite à son point initial (donc -60° ) et de repartir ensuite sur la droite de la même valeur pour ensuite se repositionner sur sa position d'origine donc le point central si je puis m'exprimer ainsi de façon à prouver mécaniquement que le mobile accouplé au servo n'a pas subi de dommage et donc me confirmer qu'il est opérationnel ce qui implique d'insérer des lignes de code supplémentaire et là j’avoue que .., voici le code employé

/*MPU6050 sensor with servo control.
   https://srituhobby.com
*/

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <Servo.h>

Servo servo;
Adafruit_MPU6050 srituhobby;

void setup(void) {
  Serial.begin(115200);
  servo.attach(3);
  Wire.begin();
  srituhobby.begin();
  servo.write(0);

  srituhobby.setAccelerometerRange(MPU6050_RANGE_8_G);//2_G,4_G,8_G,16_G
  srituhobby.setGyroRange(MPU6050_RANGE_500_DEG);//250,500,1000,2000
  srituhobby.setFilterBandwidth(MPU6050_BAND_21_HZ);

  delay(100);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  srituhobby.getEvent(&a, &g, &temp);

  int value = a.acceleration.y;

  value = map(value,  -10, 10, 180, 0);
  servo.write(value);  
  Serial.println(value);
  //delay(10);

}

Merci pour vos retours et conseils

Bonjour @eric457 et Bienvenue sur ce forum

Prends le temps de consulter le 'mode d'emploi du forum' :

On y trouve entre autres choses la manip' pour formater le code publié dans le corps des messages et ainsi motiver les aidants en facilitant la lecture du code et le copié/collé pour examen dans un IDE
Tel quel ton code aura peu de lecteurs

Si j'ai bien compris ce que tu veux, voici à quoi devrait ressembler ton code :

/*MPU6050 sensor with servo control.
https://srituhobby.com
*/

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <Servo.h>

Servo servo;
Adafruit_MPU6050 srituhobby;

void setup(void) {
  Serial.begin(115200);
  servo.attach(3);
  Wire.begin();
  srituhobby.begin();
  servo.write(90);

  srituhobby.setAccelerometerRange(MPU6050_RANGE_8_G);  //2_G,4_G,8_G,16_G
  srituhobby.setGyroRange(MPU6050_RANGE_500_DEG);       //250,500,1000,2000
  srituhobby.setFilterBandwidth(MPU6050_BAND_21_HZ);

  delay(500);
  servo.write(90 + 60);
  delay(500);
  servo.write(90);
  delay(500);
  servo.write(90 - 60);
  delay(500);
  servo.write(90);
  delay(500);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  srituhobby.getEvent(&a, &g, &temp);

  int value = a.acceleration.y;

  value = map(value, -10, 10, 180, 0);
  servo.write(value);
  Serial.flush();  // Attend que le buffer de sortie série soit vide avant de poursuivre
  Serial.println(value);
  //delay(10);
}

C'est quand même plus lisible avec des couleurs, non ?

J'ai ajouté quelques servo.write(x); suivis de delay(500); pour réaliser le mouvement d'initialisation demandé.

J'ai aussi ajouté un Serial.flush(); pour laisser au port série le temps de respirer.

merci pour ta réponse, j'essaie ce soir et pour mon prochain post/script je tacherai de mettre les couleurs :wink:

Pourquoi repousser ça à plus tard, tu peux le faire tout de suite, il suffit d'éditer ton post original (icône en forme de crayon sous ton post) et d'ajouter les balises manquantes.

..Désolé je ne pensais pas pouvoir revenir sur un post donc chose faite ! je reviens sur Etienne_74, ton script fonctionne très bien tant que je suis sur le logiciel (IDE 2.2.1) et la compilation n'a dévoilée aucune erreur, cependant quand je le ferme ou que je branche mon alimentation externe car il sera embarqué je n'ai plus cette phase de contrôle à la mise sous tension, son fonctionnement en natif n'étant pas impacté, pourtant le téléversement s'est bien déroulé

Merci

Tu es sûr et certain?
Il n'y a aucune raison pour que le fonctionnement diffère entre connecté au PC et sur alimentation externe.

c'est là le hic, avant de poster j'ai répété plusieurs foi l'opération et rien, par contre si je reconnecte via l' IDE et que je sollicite le moniteur série en "on/off" l'initialisation fonctionne mais uniquement dans ce cas de figure

Tu peux ajouter des retours visuels sur la Led (LED_BUILTIN ou pin 13) pour savoir si telle ou telle partie de ton code s'exécute. Mais la première chose à vérifier, c'est ton alim (ou tes alims) : masse et V+.

Nouvelle version (non testée) avec clignotements :

// Horizon artificiel avec le MPU6050 https://forum.arduino.cc/t/horizon-artificiel-avec-le-mpu6050/1207076/3

/*MPU6050 sensor with servo control.
https://srituhobby.com
*/

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <Servo.h>

#define LED_BLINK_RATE 250

Servo servo;
Adafruit_MPU6050 srituhobby;
uint64_t LedBlinkTime;

void setup(void) {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  servo.attach(3);
  Wire.begin();
  srituhobby.begin();
  servo.write(90);

  srituhobby.setAccelerometerRange(MPU6050_RANGE_8_G);  //2_G,4_G,8_G,16_G
  srituhobby.setGyroRange(MPU6050_RANGE_500_DEG);       //250,500,1000,2000
  srituhobby.setFilterBandwidth(MPU6050_BAND_21_HZ);

  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);
  servo.write(90 + 60);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  servo.write(90);
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);
  servo.write(90 - 60);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  servo.write(90);
  delay(500);
  LedBlinkTime = millis();
}

void loop() {

  if (millis() > LedBlinkTime)  // Blink the LED
  {
    LedBlinkTime += LED_BLINK_RATE;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }


  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  srituhobby.getEvent(&a, &g, &temp);

  int value = a.acceleration.y;

  value = map(value, -10, 10, 180, 0);
  servo.write(value);
  Serial.flush();  // Attend que le buffer de sortie série soit vide avant de poursuivre
  Serial.println(value);
  //delay(10);
}

Ça clignote lentement à l'initialisation puis 2 fois plus rapidement pendant l’exécution (de la boucle principale).

me sens un peu bête sur l'histoire du dysfonctionnement quand je suis sur alimentation externe..je tournais sur un adaptateur usb 230v> 5v mais l'intensité délivrée était trop faible contrairement à celle du pc.. >>incident corrigé, pour ton script c'est excellent !! sans vouloir trop abusé comment je pourrai retardé la phase d'initialisation car mon vumètre (couplé au servo) à la mise sous tension illumine ses 7 led pendant 3s ce qui tombe pile poil pendant la révolution gauche/droite du servo, j'ai bien essayé de corrigé la valeur "delay(500);" sur la ligne 31 mais rien n'y fait apparemment.


C'est bien cette valeur ligne 31 que tu dois augmenter. Le maxi est 65535, soit un peu plus de 65 secondes. Avec 4000, ça fait 4 secondes...

oui effectivement j'ai passé à 5000 et c'est ok, ç'est fort agréable de bénéficier d'un coup de pouce quand on débute, ..par contre un autre petit souci concernant la vitesse du servo pendant l'initialisation, n’étant pas un adepte du "tout cuit" je bataille depuis un moment pour insérer ces quelques lignes pour y parvenir mais je pense pas les copier au bon endroit car quand je compile c'est ..tchernobyl :

saisisseint pos = 0;     //Position initiale du servo
#define PAUSE 2000 //Symbolise la pause en ms entre chaque mouvements du servo
#define MIN  500 // Position 0° en microseconde 
#define MAX  2500 // Position 180° en microseconde





     servo.write(0);    // on va à 0°
    delay(PAUSE);       // On attend 2000ms = 2s ( voir valeur du define PAUSE 2000 )
    servo.write(180);  // on va à 180°
    delay(PAUSE);       // On attend 2000ms = 2s ( voir valeur du define PAUSE 2000 )
}

Pour changer la vitesse de déplacement du servo, c'est assez compliqué car il faut lui donner toute une série de positions intermédiaires plutôt que seulement la position finale.

Mais si c'est la durée des delay(x); que tu veux changer grâce à une constante nommée PAUSE_SERVO (car PAUSE, c'est trop court donc ambigu), c'est un peu comme tu proposes mais sans les fautes de frappe :

...
#include <Servo.h>

#define LED_BLINK_RATE 250
#define PAUSE_SERVO   2000  // Pause de 2 secondes entre chaque mouvement du servo à l'initialisation


Servo servo;
...

puis un peu plus bas, tu remplaces chaque delay(500); par un delay(PAUSE_SERVO);

Tu peux même faire des calculs : pour une pause plus longue, delay(PAUSE_SERVO * 2);

cool !! je vais cesser de t’embêter et synthétiser tout ceci, j'ai désormais les bases pour en concocter la recette et je te remercie de ton attention, plus qu'a travailler :sweat_smile: car on n'a rien sans rien, je trouve toutefois compliqué ces avalanches de variables mais suis confiant, à cette issue je posterai le script final et un lien vidéo car ça vaut mille mots :wink:

Et comme tes accessoires sont disponibles en simulation sur Wokwi, j'ai fait ça :

Pour faire varier l'accélération Y, tu lances le simulateur (bouton PLAY) puis tu cliques sur le MPU6050 pour faire apparaître son "tableau de bord" dont tu peux bouger les curseurs !

Grâce au simulateur, j'ai pu remarquer que le servo ne bougeait que pour certaines valeurs de l'accélération latérale et qu'en plus, il bougeait par bonds => Sais-tu ce qu'est un nombre flottant (float) et la différence avec un entier (int) ?

Je pense qu'il serait grand temps d'aller faire un tour sur les tutos d'Eskimon
https://eskimon.fr/

Excellente idée ! En as-tu un à lui conseiller en particulier ?

Je me suis mélangé, j'ai cru que c'était une question d'@Etienne_74 .
La liste des tutos est sur la page d'accueil.

..la cerise sur le gâteau que tu m'apportes là :ok_hand: ça va soulager mon Uno car je commençais par user le curseur téléversement :laughing: ..en ce qui concerne ta question sur la différence entre un nombre flottant et celui d'un entier je sais qu'il y a une histoire de virgule pour celui qui flotte et pas l'autre du moins c'est ce que mon prof de math il y a une quarantaine d’années tentait de m'inculquer en m'étirant l'oreille...