Go Down

Topic: augmenter de 10 degrés l'inclinaison du servomoteurs à chaques envoie (Read 5347 times) previous topic - next topic

lesaccrosduvol

Bonjours à tous

Après un Échec total  :smiley-sweat:  je me relance dans mon projet sous un nouvelle angles voilà pour le moment j'ai fais ce code

Code: [Select]
// --- Déclaration des constantes ---

// --- Inclusion des librairies ---

#include <Servo.h> // librairie pour servomoteur


// --- Déclaration des constantes utiles ---

//--- Constantes utilisées avec le servomoteur
int angle;

const int angleMin  = 0;
const int angleMax = 180;

// --- Déclaration des constantes des broches E/S numériques ---

const int broche_servo=2; // Constante pour la broche 2
// --- Déclaration des constantes des broches analogiques ---


// --- Déclaration des variables globales ---

int octetReception=0; // variable de stockage des valeurs reçues sur le port Série
long nombreReception=0; // variable de stockage du nombre  reçu sur le port Série
long nombreReception0=0; // variable de stockage du dernier nombre  reçu sur le port Série
String chaineReception=""; // déclare un objet String vide pour reception chaine
int position_servo=0;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

//--- Création objet servomoteur
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur


// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---

// ------- Initialisation fonctionnalités utilisées ------- 

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

//--- Initialisation Servomoteur
mon_servo.attach(broche_servo, angleMin, angleMax);  // attache l'objet servo à la broche de commande du servomoteur


// ------- Broches en sorties numériques ------- 
pinMode (broche_servo,OUTPUT); // Broche broche_servo configurée en sortie

// ------- Broches en entrées numériques ------- 
mon_servo.write(position_servo);
// ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- 

// ------- Initialisation des variables utilisées ------- 

}
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()


// --- ici instructions à exécuter par le programme principal ---

//---- code type réception valeur sur le port série ---

if (Serial.available()>0) { // si un octet en réception

octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
     

         if (octetReception=='Q') { // si Octet reçu est le Q
         mon_servo.write(0) ; // positionne le servo à l'angle voulu en fonction des valeurs min/max 
         delay(200);
         }
         if (octetReception=='H') { // si Octet reçu est le H
          mon_servo.write(30) ; // positionne le servo à l'angle voulu en fonction des valeurs min/max 
          delay(200);
}





} // fin si octet réception


} // fin fonction recevoirNombre


// ////////////////////////// Fin du programme ////////////////////


// ////////////////////////// Mémo instructions ////////////////////
// ////////////////////////// Fin Mémo instructions ////////////////////



Donc pour le moment j'envoie la commande par le moniteur série "Q" pour mettre le servomoteur à 0 Degrés
et "H" pour qu'il se positionne à 30 Degrés

Mais ce que je voudrai c'est que quand j'envoie "H" dans le moniteur série le servomoteur bouge de +10 Degrés à chaque fois, puis encore +10 Degrés quand je renvoie "H" et ainsi de suite

Merci d'avance

Reynosa

Bonjour,

Une solution pourrait être ceci

Code: [Select]
void loop()
{ // debut de la fonction loop()
static uint8_t i = 0;
static uint8_t angleCourant = 0;
// --- ici instructions à exécuter par le programme principal ---

//---- code type réception valeur sur le port série ---

if (Serial.available() > 0)
{
// si un octet en réception
octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable

if (octetReception=='Q') // si Octet reçu est le Q
{
angleCourant = 0; // positionne le servo à l'angle voulu en fonction des valeurs min/max
i = 0;
}

if (octetReception=='H' && i==0) // si Octet reçu est le H et que c'est la première fois
angleCourant += 30;  
else if (octetReception=='H' && i>0)
angleCourant += (angleCourant <= angleMax) ? 10 : 0;

mon_servo.write(angleCourant);
delay(200);
i++;
}

}  


Si c'est ce n'est pas ce que tu souhaites dis le ! :)

Bon courage

lesaccrosduvol

Bonsoir

merci c'est parfait  : )

Et si je veut faire la même chose avec "Q" mais en faisant -10 degrés à chaque fois. C'est possible ?

Cordialement

fdufnews


Bonsoir
Et si je veut faire la même chose avec "Q" mais en faisant -10 degrés à chaque fois. C'est possible ?

Faudrait quand même faire un petit effort.
On vient de te donner un code qui fonctionne pour H avec déplacement en positif. Même sans être une bête en programmation ce n'est pas très compliqué de copier la partie concernée, de changer la lettre qui déclenche l'action et de modifier le signe du déplacement.

lesaccrosduvol

Bonsoir

Et bien oui figure toi que si je pose la question c'est qu'il y avait une raison à cela
Je suis peut être vraiment plus nul que la plus part des gens ici,  mais j'ai quand même pensé à essayer avant de poster quelques choses comme avant tout messages d'ailleurs . Et parfois j'ai même parfois honte de ce que j'ai fait comme encore ici
Code: [Select]
void loop()
{ // debut de la fonction loop()
static uint8_t i = 0;
static uint8_t angleCourant = 0;
// --- ici instructions à exécuter par le programme principal ---

//---- code type réception valeur sur le port série ---

if (Serial.available() > 0)
{
// si un octet en réception
octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable

if (octetReception=='Q') // si Octet reçu est le Q
{
angleCourant = 0; // positionne le servo à l'angle voulu en fonction des valeurs min/max
i = 0;
}

if (octetReception=='H' && i==0) // si Octet reçu est le H et que c'est la première fois

            angleCourant += 30;   
else if (octetReception=='H' && i>0)
angleCourant += (angleCourant <= angleMax) ? 10 : 0;


              if (octetReception=='A' && i==0) // si Octet reçu est le H et que c'est la première fois
angleCourant -= -30;   
else if (octetReception=='A' && i<180)
angleCourant -= (angleCourant >= angleMin) ? -10 : -0;

mon_servo.write(angleCourant);
delay(200);


}
}


Où j'ai encore fait une erreur des plus stupides mais j'ai déjà lu toute les documentation en français qui existe sur le sujet de l'arduino et à chaque fois j'ai l'impression que c'est du chinois.

Donc oui cela peut paraître stupide de continuer alors que je ne comprend presque rien mais je veux faire aboutir mon projet et je veux qu'il fonctionnent même si il faut faire tout les forum qui existe.

Peut être " fdufnews" ne voulais tu pas me faire ressentir , le faite d'être carrément incapable mais c'est le sentiment que j'ai ressentit. Mais je te remercie encore du mal que tu tes donné sur mon autre TOPIC qui était sur le même sujet mais j'ai complétement décroché et c'est pour cela que j'ai décidé de recommencer sous un nouvelle angle et si il le faut je recommencerai encore et encore

Cordialement

fdufnews

Je ne te traite pas d'incapable mais ta manière de poser la question donne à penser que tu n'as rien fait de ton coté.
Si tu as un code, même qui ne fonctionne pas comme attendu, tu le joins à ton post, tu expliques ce que tu voulais faire, tu détailles ce que tu obtiens et on t'aidera à la mettre au point.

Donc, ton code ne semble pas ridicule, qu'est-ce qui ne va pas dans son exécution.

B@tto

Déjà aucun des if ne va pouvoir fonctionner correctement, il manque les accolades pour la plupart
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fdufnews


Déjà aucun des if ne va pouvoir fonctionner correctement, il manque les accolades pour la plupart

Les accolades sont obligatoires lorsqu'il y a un bloc d'instruction de plusieurs lignes.
Du point de vue de la syntaxe pure, cette écriture est bonne
Code: [Select]
if (octetReception=='H' && i==0) // si Octet reçu est le H et que c'est la première fois
      angleCourant += 30;   
else if (octetReception=='H' && i>0)
      angleCourant += (angleCourant <= angleMax) ? 10 : 0;

lesaccrosduvol

Bonsoir

C'est vrai que tout de même il faut l'avouer vous donnez de votre temps libre sur ce forum pour aidez les personnes en difficulté , Et pour cela on ne vous remerciera jamais assez ...  :D

Voilà ce que j'ai fais
Code: [Select]
void loop()
{ // debut de la fonction loop()
static uint8_t i = 0;
static uint8_t angleCourant = 0;
// --- ici instructions à exécuter par le programme principal ---

//---- code type réception valeur sur le port série ---

if (Serial.available() > 0)
{
// si un octet en réception
octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable

if (octetReception=='I') // si Octet reçu est le Q
{
angleCourant = 90; // positionne le servo à l'angle voulu en fonction des valeurs min/max
i = 90;
}

if (octetReception=='H' && i==0){ // si Octet reçu est le H et que c'est la première fois

                          angleCourant += 30; 
}
else if (octetReception=='H' && i>0){
angleCourant += (angleCourant <= angleMax) ? 10 : 0; //fait tourner de +10 Degrés le servomoteur
}

                 if (octetReception=='A' && i==0) {// si Octet reçu est le A et que c'est la première fois


                        angleCourant -= -30;   
                 }
else if (octetReception=='A' && i<180){
angleCourant = (angleCourant >= angleMin) ? -10 : -0; // Fait tourner de -10 Degrés le servomoteur

                 }
                mon_servo.write(angleCourant);
delay(200);
 

Problème quand je fais "A" le servomoteur bouge de +10 Degrés au lieu de -10 Degrés




Au passage j'en profite pour savoir si quelqu'un pouvait me dire si il y a des cours de programmation pour arduino En ILlE-ET-VILAINE  plutôt près de RENNES

Cordialement

Reynosa

Bonsoir,

Je ne suis pas certain de comprendre, tu veux appuyer Q pour remettre le servo à 0, H pour faire +10° et A pour faire -10° ? Mais tu veux aussi que le premier palier soit de 30° ? est-ce vrai pour A et H ?

Pour ta dernière question, je ne connais pas le déroulement de tes tests, mais dans ta dernière condition, tu réalises une affectation de valeur uniquement et non une opération sur la valeur qui est contenue par la variable. du coup tant que tu appuieras sur A et que tu auras reçu un nombre de fois strictement inférieur à 180 des lettres, tu ne feras que écrire 0 sur ton servo (on ne peut pas écrire de valeur d'angle < 0 , c'est automatiquement bloqué à 0).

En passant, ton angleCourant -= -30; est équivalent à angleCourant = angleCourant +30 , puisque tu effectues l'opération " - (- ) "

papybricol



Au passage j'en profite pour savoir si quelqu'un pouvait me dire si il y a des cours de programmation pour arduino En ILlE-ET-VILAINE  plutôt près de RENNES



A Rennes, voir les ateliers arduino au LabFab : http://www.labfab.fr/
...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

fdufnews

Tu devrais mettre sur le papier ce que tu veux que ton programme fasse.
Quand j'entre tel lettre le programme fait tel action si l'angle courant est de tant ou tel autre condition.
Et ainsi de suite pour toutes les commandes que tu veux envoyer.

Ton programme d'un point de vu de la syntaxe est bon mais il y a des complications inutiles qui embrouille tout.
Par exemple la variable i ne sert à rien. Elle n'est d'ailleurs pas mise à jour systématiquement. Si tu analyses ton besoin tu vois que i peut être remplacé par angleCourant ou alors j'ai mal compris la logique que tu veux appliquer.
Certaines conditions qui fonctionnent pour un test sont mal transposées pour un autre test.
Cette ligne va bloquer le servo à 180°
Code: [Select]
else if (octetReception=='A' && i<180){
quand tu appuies sur H le servo avance de 10 en 10 donc fatalement à un moment tu vas te trouver à 180° et le test ci-dessus exclu 180 donc tu ne pourras pas redescendre.
Il faut la remplacer par
Code: [Select]
else if (octetReception=='A' && angleCourant<=180){

Là il y a une erreur l'angle ne peut pas être négatif
Code: [Select]
        if (octetReception=='A' && i==0) {// si Octet reçu est le A et que c'est la première fois
              angleCourant -= -30;  
        }


C'est plus affaire de gout mais personnellement pour gérer des listes de commandes je trouve que le switch.. case... donne un code plus clair et moins alambiqué qu'une succession de if surtout que tu glisses des else if au milieu ce qui fais qu'assez vite on perd la logique de test.

Code: [Select]
if (Serial.available() > 0)
{
   // si un octet en réception
  octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable
  switch(octetReception){
       case 'I':
           angleCourant = 90; // positionne le servo à l'angle voulu en fonction des valeurs min/max
       break;
       case 'H':
           if (angleCourant ==0){ // si Octet reçu est le H et que c'est la première fois
              angleCourant = 30;
          } else {
              angleCourant += (angleCourant <= angleMax) ? 10 : 0; //fait tourner de +10 Degrés le servomoteur
          }
       break;
       case 'A':
              if (octetReception=='A' && i<180){
          angleCourant += (angleCourant >= angleMin) ? -10 : 0; // Fait tourner de -10 Degrés le servomoteur
              }
       break;
      }
}

lesaccrosduvol

#12
Jan 28, 2014, 09:52 pm Last Edit: Jan 28, 2014, 10:13 pm by lesaccrosduvol Reason: 1
Bonsoir

merci de m'avoir expliqué comment faire c'est bon ça marche parfait

Voici le code

Code: [Select]
// --- Déclaration des constantes ---

// --- Inclusion des librairies ---

#include <Servo.h> // librairie pour servomoteur


// --- Déclaration des constantes utiles ---

//--- Constantes utilisées avec le servomoteur
int angle;

const int angleMin  = 0;
const int angleMax = 180;

// --- Déclaration des constantes des broches E/S numériques ---

const int broche_servo=2; // Constante pour la broche 2
// --- Déclaration des constantes des broches analogiques ---


// --- Déclaration des variables globales ---

int octetReception=0; // variable de stockage des valeurs reçues sur le port Série
long nombreReception=0; // variable de stockage du nombre  reçu sur le port Série
long nombreReception0=0; // variable de stockage du dernier nombre  reçu sur le port Série
String chaineReception=""; // déclare un objet String vide pour reception chaine
int position_servo=0;

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

//--- Création objet servomoteur
Servo mon_servo;  // crée un objet servo pour contrôler le servomoteur


// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---

// ------- Initialisation fonctionnalités utilisées ------- 

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

//--- Initialisation Servomoteur
mon_servo.attach(broche_servo, angleMin, angleMax);  // attache l'objet servo à la broche de commande du servomoteur


// ------- Broches en sorties numériques ------- 
pinMode (broche_servo,OUTPUT); // Broche broche_servo configurée en sortie

// ------- Broches en entrées numériques ------- 
mon_servo.write(position_servo);
// ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- 

// ------- Initialisation des variables utilisées ------- 

}
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop()
{ // debut de la fonction loop()
static uint8_t i = 0;
static uint8_t angleCourant = 0;
// --- ici instructions à exécuter par le programme principal ---

//---- code type réception valeur sur le port série ---

if (Serial.available() > 0)
{
// si un octet en réception
octetReception=Serial.read(); // Lit le 1er octet reçu et le met dans la variable

if (octetReception=='I') // si Octet reçu est le Q
{
angleCourant = 90; // positionne le servo à l'angle voulu en fonction des valeurs min/max
i = 90;
}

if (octetReception=='H' && i==0){ // si Octet reçu est le H et que c'est la première fois

                          angleCourant += 10; 
}
else if (octetReception=='H' && i>0){
angleCourant += (angleCourant <= angleMax) ? 10 : 0; //fait tourner de +10 Degrés le servomoteur
}

                 if (octetReception=='A' && i==0) {// si Octet reçu est le A et que c'est la première fois


                        angleCourant -= 10;   
                 }
else if (octetReception=='A' && angleCourant<=180){
angleCourant -= (angleCourant >= angleMin) ? 10 : 0; // Fait tourner de -10 Degrés le servomoteur

                 }
                mon_servo.write(angleCourant);
delay(200);

}
}
// ////////////////////////// Fin du programme ////////////////////


// ////////////////////////// Mémo instructions ////////////////////
// ////////////////////////// Fin Mémo instructions ////////////////////


Je me lance maintenant dans la deuxième partie, Contrôler deux servomoteurs diffférents
c'est la que j'ai buté la dernière fois

Je vous tien au courant, Mais si quelqu'un à un conseil où des astuces elles seront le bien venu :)

Cordialement

PS : Merci pour l'info je ne connaissais pas " labfab" dommage que le cours sur l'arduino à été le 23 janvier . J’attend une nouvelle session

Reynosa

Bonsoir,

Je tiens à préciser que l'utilisation dont la variable " i " faisait l'objet premièrement, était de compter le nombre de fois que tu recevais la lettre 'H'. Je ne sais pas trop à quoi elle te sert maintenant, mais surement pas à compter quoi que ce soit... À quoi te sert elle maintenant ?

Autre chose, garde toujours tes commentaires à jour quand tu changes une partie de ton code.
Code: [Select]
if (octetReception=='I') // si Octet reçu est le Q

fdufnews


Je tiens à préciser que l'utilisation dont la variable " i " faisait l'objet premièrement, était de compter le nombre de fois que tu recevais la lettre 'H'. Je ne sais pas trop à quoi elle te sert maintenant, mais surement pas à compter quoi que ce soit... À quoi te sert elle maintenant ?

Manifestement elle ne sert à rien puisqu'elle n'est jamais modifiée

Go Up