Drone

Bonsoir à tous,

je suis actuellement en train de réaliser (ou plutot tenter de réaliser) un projet sur un drone, dont le but est d’assurer plus ou moins sa stabilité. Pour cela, je base mon système sur 2potentiomètres qui permettent de déterminer l’angle que fait mon drone par rapport à l’horizontale (désolé je présente juste succintement…). Il faut donc aussi que je crée un programme sur ma carte arduino leonardo, pour que en fonction de l’angle fait par mon drone, et donc la valeur en sortie de mon potentiomètre (que j’appelle val), un servomoteur soit activé et modifie la position du centre de gravité pour stabiliser le drone. Seulement, je suis relativement nul en programmation (je débute). J’ai la “base” de mon programme, mais quelque soit val, mon servo moteur tourne ds le sens trigo jusqu’a sa position maximale, puis tourne ds le vide (normal puisqu’il est au max). Mais même quand je crée un programme à part pour tester la rotation de mon servo moteur, celui-ci fait pareil. Voilà mon programme (une esquisse) :

#include <Servo.h>

int pot_1=A1;
int pot_2=A2;
int val_0=0;
int val_1;
int val_2;
Servo servo1;
Servo servo2;

void setup()
{
Serial.begin(9600);
servo1.attach(10,1000,2000);
servo2.attach(11,1000,2000);
}

void loop()
{
val_1=analogRead(pot_1);
val_2=analogRead(pot_2);
if (val_1>val_0)

{
servo1.writeMicroseconds(1750);
}
else if (val_1<val_0)

{
servo1.writeMicroseconds(1250);
}
else if (val_2>val_0)

{
servo2.writeMicroseconds(1750);
}
else if (val_2<val_0)

{
servo2.writeMicroseconds(1250);
}

}

Pourriez-vous m’aider svp ? Je suis vraiment en galère et ne comprend pas pourquoi mon servomoteur fait ça …
Merci à ceux qui vont me répondre!

** Désolé je me suis trompé de section pour mon 1er post au départ je pense … **

outch, c’est du grand nimporte quoi ton code…

prend exemple sur le code ServoMoodIndicator du starter kit :

/*
  Arduino Starter Kit example
 Project 5  - Servo Mood Indicator
 
 This sketch is written to accompany Project 5 in the
 Arduino Starter Kit
 
 Parts required:
 servo motor 
 10 kilohm potentiometer 
 2 100 uF electrolytic capacitors
 
 Created 13 September 2012
 by Scott Fitzgerald
 
 http://arduino.cc/starterKit
 
 This example code is part of the public domain 
 */

// include the servo library
#include <Servo.h>

Servo myServo;  // create a servo object 

int const potPin = A0; // analog pin used to connect the potentiometer
int potVal;  // variable to read the value from the analog pin 
int angle;   // variable to hold the angle for the servo motor 

void setup() {
  myServo.attach(9); // attaches the servo on pin 9 to the servo object 
  Serial.begin(9600); // open a serial connection to your computer
}

void loop() {
  potVal = analogRead(potPin); // read the value of the potentiometer
  // print out the value to the serial monitor
  Serial.print("potVal: ");
  Serial.print(potVal);

  // scale the numbers from the pot 
  angle = map(potVal, 0, 1023, 0, 179);

  // print out the angle for the servo motor 
  Serial.print(", angle: ");
  Serial.println(angle); 

  // set the servo position  
  myServo.write(angle);

  // wait for the servo to get there 
  delay(15);
}

Et quand tu met du code, met des blises code, dans l’éditeur de texte du forum c’est le bouton #

Pour ton projet, je n’ai pas compris ce que tu veux faire, met une photo :wink:

Merci de ta réponse, je vais regarder le code après pour essayer de le comprendre.

Mes photos sont pas sur ce pc, j'essayerai d'en mettre une plus tard pour présenter mon système. Et en gros pour le code, j'aimerai que par exemple si la valeur analogique donnée par mon potentiomètre soit supérieure (resp. inférieure) à une constante fixée (qui est le cas ou mon drone est horizontal), alors le servomoteur se mette à tourner dans le sens trigo (resp. horaire; ou inversement) jusqu'a ce que la valeur analogique soit égale à la constante. Mais je ne vois pas comment mettre en forme mon code, puisqu'une boucle "if" paraît inapplicable dans mon cas, et je suis vraiment pas calé en programmation .. ^^

eazier: Merci de ta réponse, je vais regarder le code après pour essayer de le comprendre.

Mes photos sont pas sur ce pc, j'essayerai d'en mettre une plus tard pour présenter mon système. Et en gros pour le code, j'aimerai que par exemple si la valeur analogique donnée par mon potentiomètre soit supérieure (resp. inférieure) à une constante fixée (qui est le cas ou mon drone est horizontal), alors le servomoteur se mette à tourner dans le sens trigo (resp. horaire; ou inversement) jusqu'a ce que la valeur analogique soit égale à la constante. Mais je ne vois pas comment mettre en forme mon code, puisqu'une boucle "if" paraît inapplicable dans mon cas, et je suis vraiment pas calé en programmation .. ^^

bonjour, il y a la solution switch case pour remplacer les if dans ce cas.

Bonjour,
l’option switch/case différencie des cas non ? Jusque là c’est cohérent, mais est-ce que mes servomoteurs arrêteront de tourner dès lors que la valeur constante sera atteinte ? Et si jamais la valeur analogique devient inférieure (en étant supérieure juste avant par exemple), le servomoteur va-t-il se mettre a tourner dans l’autre sens?

Re-post: ah non pardon, je pense que si je ne mets pas “break;”, la arduino vérifiera les conditions en continue

tu peux mettre des void dans les case justement on vérifie une valeur X ou une communication switch case valide : on va dans le void mise a zero break; case invalide : on va dans le void continue break;

mise a zero fait une opération

continue fait une autre opération

je base mon système sur 2potentiomètres qui permettent de déterminer l'angle que fait mon drone par rapport à l'horizontale

C'est archaïque ton système :astonished: il y a des unités de mesure inertielle pour cela