Servomoteur, débutant

Bonjour, je débute avec Arduino et je recherche à programmer un servomoteur de tel sorte à ce qu'il s'allume pendant x secondes, toute les quart d'heure par exemple. J'ai pris comme base un des exemples nommé Sweep (fichier>Exemple>Servo>Sweep) mais je n'arrive pas à modifier le code pour avoir ce que je veux (je suis un pur débutant...).
Est-ce que quelqu'un pourrait m'aider ?

Merci d'avance,

Noé

Salut,

idéalement utiliser les interruptions temporelles : [Tutorial] Les interruptions temporelles avec Arduino | B@ttoMicro - Microcontrôleurs et compagnie !

Après répéter dans l'interruption un simple myservo.write(pos);

Yep!

Les solutions non bloquantes sont à privilégier.

L'exempledu logiciel Arduino /Exemples/02.Digital/BlinkWithoutDelay est plutôt parlant et à faire.

@+

Zoroastre.

Excusez moi mais je suis vraiment un vrai débutant et je n'arrive pas en remplacer dans le code pour le servo moteur. Si quelqu'un pourrait me donner un peu + d'infos pour que j'y arrive...

roboazert:
je suis vraiment un vrai débutant

Peut être commencer par faire des choses simples, comme "blink" et ensuite modifier quelques paramètres et évoluer comme ça...

Donne un début de code. Même si il est mal fait, on aura plus envie de corriger un effort fournit que rien du tout.

@+

Zoroastre.

J'ai suivi vos conseils et voilà le résultat. Il y a encore des erreurs ... Si quelqu'un saurait m'aider à corriger, ce serait vraiment sympa.

Merci d'avance

Servo myservo;      

myservo.write(pos);
long previousMillis = 0;        


long interval = 1000;           

void setup() {
  
myservo.attach(9);      
}

void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
  
    previousMillis = currentMillis;   


    if (myservo.write == LOW)
      myservo.write = HIGH;
    else
      myservo.write = LOW;

  
  }
}

Bonjour,

Ca ne marche pas ou bien tu as des erreurs de compilation ?
Dans le second cas, peux-tu les poster ?

voilà les erreurs :

BlinkWithoutDelay:2: error: 'Servo' does not name a type
BlinkWithoutDelay:4: error: expected constructor, destructor, or type conversion before '.' token
BlinkWithoutDelay.ino: In function 'void setup()':
BlinkWithoutDelay:12: error: 'myservo' was not declared in this scope
BlinkWithoutDelay.ino: In function 'void loop()':
BlinkWithoutDelay:25: error: 'myservo' was not declared in this scope

en voilà une autre :

      myservo.write = HIGH;

et la correction : Servo - Arduino Reference

d'où as-tu inventé ça? tu n'as pas suivi nos conseils : tu vas trop vite... Les gens n'imaginent pas le temps que l'on perd à vouloir griller des étapes...

Excusez moi, je me suis renseigné mais apparemment pas assez ...
J'ai du mal a débuter et c'est pour cela que je vous demande votre aide. Pour que vous expliquiez mes erreurs et pour
que je puisse progresser. Si cela ne vous convient pas alors tan pis ....

Bonsoir,

roboazert:
voilà les erreurs :

BlinkWithoutDelay:2: error: 'Servo' does not name a type

BlinkWithoutDelay:4: error: expected constructor, destructor, or type conversion before '.' token
BlinkWithoutDelay.ino: In function 'void setup()':
BlinkWithoutDelay:12: error: 'myservo' was not declared in this scope
BlinkWithoutDelay.ino: In function 'void loop()':
BlinkWithoutDelay:25: error: 'myservo' was not declared in this scope

Il faut peut être déclarer ta bibliothèque Servo dans le début de ton programme et avant Servo myservo, genre #include <Servo.h>

Bonjour,

J'ai recorrigé mon code et des erreurs persistent ...

Je sais que je me trompe dans à la fin du code et que je dois déclarer "pos" mais je n'arrive pas à le faire même avec le lien de Super_Cinci.

#include <Servo.h>
Servo myservo;      


long previousMillis = 0;        


long interval = 1000;           

void setup() {
  
myservo.attach(9);
myservo.write (180);
}

void loop()
{
 
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
  
    previousMillis = currentMillis;   


    if (myservo.write = (pos)
      myservo.write = (pos);
    else
      myservo.write (pos);

  
  }
}

et voila le nouveau rapport d'erreurs :

BlinkWithoutDelay.ino: In function 'void loop()':
BlinkWithoutDelay:27: error: 'pos' was not declared in this scope
BlinkWithoutDelay:28: error: expected `)' before 'myservo'

Je serais vraiment très reconnaissant si vous saviez m'aidez à corriger ...

Bonjour,
Déjà pour commencer, il faut corriger cela :
if (myservo.write = (pos)
par
if (myservo.write = (pos))

Le compilateur ne comprend pas "pos"
Cette variable n'est pas déclarer dans ton programme et elle n'a pas de valeur (n'existe pas)
@+

[EDIT] Il faut lire les messages du compilateur dans les 3 erreurs tu avais la solution

icare:
Bonjour,
Déjà pour commencer, il faut corriger cela :
if (myservo.write = (pos)
par
if (myservo.write = (pos))

Le compilateur ne comprend pas "pos"
Cette variable n'est pas déclarer dans ton programme et elle n'a pas de valeur (n'existe pas)
@+

[EDIT] Il faut lire les messages du compilateur dans les 3 erreurs tu avais la solution

En fait dans la ligne il y a 2 erreurs

 if (myservo.write = (pos)

il manque la parenthèse fermante
et le = est une affectation et non une comparaison.
le code correcte serait plutôt:

 if (myservo.write == (pos))

Maintenant dans le contexte où est placée cette ligne,

    if (myservo.write = (pos)
      myservo.write = (pos);
    else
      myservo.write (pos);

que la syntaxe soit bonne ou pas le résultat et le même puisque les 2 branches du if sont équivalentes

Pour la déclaration de pos tu as déjà 2 variables déclarées au début de ton programme donc il suffit de reproduire.
Selon la doc de servo write attend un paramètre de type int donc tu déclares au début du programme

int pos=90; postionne le servo à 90 degrés

Après, à toi de faire évoluer cette valeur dans ton code pour faire ce que tu veux.

Re,
Autant pour moi, j'ai la vue qui baisse !!! :grin:

Rebonjour,

Après avoir abandonné ce projet durant quelques semaines, j'ai décidé de m'y remettre.

J'aimerais y arriver de moi même mais malheureusement, je ne sais pas où chercher pour faire ce que je veux :

Je souhaiterais donc que ce bout de code :

#include <Servo.h>

Servo myservo;
/

int pos = 0;

void setup()
{
myservo.attach(9);
}

void loop()
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
for(pos = 180; pos>=1; pos-=1)
{
myservo.write(pos);
delay(15);
}
}

s'exécute tout les 10 seconde (par exemple)

En suivant vos conseils précédents, je suis arriver à cela :

#include <Servo.h>
Servo myservo;
int pos=90;

long previousMillis = 0;

long interval = 1000;

void setup() {

myservo.attach(9);
myservo.write (180);
}

void loop()
{

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {

previousMillis = currentMillis;

if (myservo.write = (pos))
myservo.write = (pos);
else
myservo.write (pos);

}
}

Malheureusement il y a encore des erreurs :

sketch_dec31a.ino: In function 'void loop()':
sketch_dec31a:26: error: invalid use of member (did you forget the '&' ?)
sketch_dec31a:27: error: invalid use of member (did you forget the '&' ?)

Je n'arrive pas à bien combiner les deux codes. Pourriez vous me mettre sur la piste et / ou me donner des adresses qui me permettraient d'avancer dans ce projet.

Merci d'avance,

Noé

Je trouve dommage que tu ne lises pas tout. Nous t'avons pourtant expliqué (rapidement) le principe du signe '='.

Donc

#include <Servo.h>
Servo myservo;      
int pos=90;
long previousMillis = 0;        
long interval = 1000;          

void setup() {
  myservo.attach(9);
  myservo.write (180);
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  

    if (myservo.write = (pos))
      myservo.write = (pos);
    else
      myservo.write (pos);  
  }
}

ne marchera jamais.

#include <Servo.h>

Servo myservo;      
int pos=90;
long previousMillis = 0;        
long interval = 1000;          

void setup() {
  myservo.attach(9);
  myservo.write (180);
}

void loop(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    myservo.write (pos);  
  }
}

saurais-tu expliquer la différence entre les deux codes? (c'est un exercice qu'il serait bon de faire si tu souhaite avancer...

Merci de votre implication,

Dans le premier code il y a deux if ouverts donc cela ne va pas. Et je pense que ceci :

if (myservo.write = (pos))
myservo.write = (pos);
else
myservo.write (pos);

Ne signifie pas grand chose vu que la valeur "pos" ne change pas.
Alors que dans le deuxième code vous déterminez la valeur de "pos" en faisant la différence de deux valeurs. (je ne vois pas bien ce qu'elles représentent)

Il faudrait alors rajouter un "else" dans le deuxième code pour faire bouger le servomoteur.

Pourriez vous me dire si mon résonnement est bon ?

Encore merci,

Noé

void loop(){
  unsigned long currentMillis = millis();    // relever la valeur actuelle du temps
  if(currentMillis - previousMillis > interval) {    // si le temps écoulé depuis la dernière action sur le servo est supérieur à 1000 ms :
    previousMillis = currentMillis;                               // Remettre "à zéro" le compteur de temps
    myservo.write (pos);                                              //  mettre le servo à jour
  }                                                // fin si
}

je ne vois pas où je détermine la valeur de "pos" en faisant la différence de deux valeurs, d'ailleurs, si personne ne modifie la valeur de "pos", ben ça va pas changer grand chose dans le monde... mais mon code marche.