Arreter la fonction simple timer

Bonjour,

Connaissez vous l'équivalent de la fonction timer.run() dans la librairie SimpleTimer pour arrêter de faire fonctionner le timer? Le but est que je puisse l'appeler que quand le robot marche droit pour l'asservissement des roues puis après l'arrêter si le robot s'arrête.

Merci

Il existe disable :

// disables the specified timer
   void disable(int numTimer);

ou toggle :

    // enables the specified timer if it's currently disabled,
    // and vice-versa
    void toggle(int numTimer);

Merci pour votre retour mais c'est quoi le numéro dans l'argument? car moi j'ai juste déclarer simpletimer timer mais pas de numéro.

Merci.

Il y a peut-être plusieurs bibliothèques ayant le même nom... Poste ton code et indique qu'elle bibliothèque tu utilises. Merci

Edit :
Tu dois utiliser quelque part setTimer ou setTimout ou setInterval. Voici comment connaître le numéro :

numTimer = timer.setTimeout(1000, fonction);

J'utilise cette bibliotheque:

#include <SimpleTimer.h>
SimpleTimer timer;

timer.setInterval(1000/freq_ech, asservissement); // toutes les 100ms, on appelle la fonction "asservissement"

void loop()
{
timer.run();

code
.
.
Ici je veux stopper le timer
}

Merci

Alors tu fais

int numTimer = timer.setInterval(1000/freq_ech, asservissement);

Et tu te sers de ce numTimer pour disable ou toggle

timer.toggle(numTimer) ;

J'ai fais dans le setup:

int numTimer=timer.setInterval(1000/freq_ech, asservissement); // toutes les 100ms, on appelle la fonction "asservissement"

et le reste dans la loop, mais j'ai le message d'erreur suivant:

numTimer was not declared in this scope.

Merci

C'est ce qu'on appelle la portée des variable. Une variable peut être globale si tu la déclares dans l'en-tête du programme, avant le setup, ou locale dans tous les autres cas. Locale signifie qu'elle n'est connue qu'à l'intérieur du bloc où elle est déclarée, c'est à dire entre les accolades.
Dans ton cas, numTimer est déclarée dans le setup, elle n'est pas connue ailleurs.

Fais
int numTimer =0;avant le setup, et dans le setup, justenumTimer=timer.setInterval(1000/freq_ech, asservissement); // toutes les 100ms, on appelle la fonction "asservissement"sans le "int"

Un grand merci pour vos lumières, en compilant pas d'erreur :slight_smile:

Je vais tester demain, mais deux dernières questions concernant le simpletimer:

  1. Quelle est la différence entre faire enable et timer.run pour le simpletimer?

  2. A chaque fois que j'active le simpletimer avec enable par ex, je dois mettre le timer.run?

Merci.

Je n'ai jamais utilisé cette bibliothèque, mais je pense que run est obligatoire au début. Disable doit permettre de désactiver un timer temporairement, pour le réactiver ensuite lorsque tu en as de nouveau besoin

Regarde les exemples ici, run() doit être appelé dans loop le plus souvent possible. C'est la fonction principale qui vérifie si un élément à atteint une limite temporelle et si la fonction associée doit être exécuté. Plus run() est appelé souvent plus les temporisations sont précises, ce qui interdit l'utilisation de delay() dans le code.

Il faut faire attention à la terminologie qui est ambiguë. Dans la librairie, il n'y a qu'un seul "timer" générique, une horloge globale, qui est créé lorsqu'on instancie SimpleTimer et il y a des "interval" (fonctions qui se répètent régulièrement), des "timeout" (fonction appelé une seule fois), des "timer" (aïe la source de l'embrouille, fonctions qui se répètent régulièrement un nombre fini de fois). Lors de leur création, les "interval", "timeOut" et "timer" retournent un numéro qui permet de les manipuler avec enable(), disable(), toggle(), restart(),...

Je pense que pour la clarté du code, l'instance de SimpleTimer devrait être nommée, par exemple, clock ou horloge pour éviter de s'embrouiller dans les termes.

Bonjour,

J'avais remarqué qu'avec le SimpleTimer il faut lancer timer.run dans le loop, or pour mon application, je n'est besoin de lancer timer que quand je veux lancer mes moteurs, en essayant quelques tentatives à lancer le timer que quand je lance mes moteurs (et donc dans la fonction du lancement des moteurs), les résultats ne sont pas satisfaisant, avez vous des suggestions?

Le problème est que si je mets timer.run dans la loop, elle va lancer les moteus quand j'en ai pas besoin.

Merci

Bonjour,

Comme déjà indiqué par fdufnews, tu arrêtes le timer par disable()

C'est fait et ce problème est résolu, maintenant je cherche à intégrer l'asservissement dans l'algorithme global. c'est pour ça que j'ai besoin d'utiliser le timer que dans des endroits précis du code.

Il faut tout lire et bien comprendre le fonctionnement de la librairie.

timer.run() est une méthode qui à un instant donné compare l'état d'une référence temporelle (millis() en l'occurence) avec les paramètres d'une liste de tâche à effectuer. Les tâches en question sont activées ou désactivées quand tu le veux dans n'importe laquelle des parties de ton programme.
L'usage de cette librairie impose une certaine architecture à ton code:

  • timer.run() doit être exécuté très souvent et très régulièrement. Sa place devrait être dans loop() car c'est une boucle infinie et le programme normalement y passe le plus clair de son temps
  • Tu testes les demandes d'interactions du monde extérieur dans loop(). Si une commande arrive, ton code appelle une fonction qui va prendre la decision d'activer ou non une tâche (interval, timeout, timer). La fonction doit rendre la main le plus rapidement possible et ne surtout pas bloquer l'exécution.
  • Lorsque le code retourne dans loop() il va à un moment retomber sur l'instruction timer.run() et c'est dans cette méthode que la tâche sera lancée/arrêtée.

Dans ma réponse précédente, je t'ai mis un lien vers les exemples d'utilisation de la librairie. Étudies-les, la logique de fonctionnement est relativement simple.

Il faut bien comprendre que timer.run() ne met pas les moteurs en marche. timer.run() n'est qu'un mécanisme qui va lancer l'exécution de tâches que tu actives/désactives. Et ce sont ces tâches qui vont actionner les moteurs.

En fait, je ne comprends pas pourquoi tu utilises cette librairie. Je ne suis même pas certain qu'elle soit utile à ton besoin.
Elle est bien adaptée pour faire tourner des tâches asynchrones. Faire tourner des automates avec des tâches répétitives ou des tâches ponctuelles cadencées par le temps. Et je ne vois pas trop le rapport avec un asservissement de vitesse.

Bonjour,

Merci pour ce retour. En fait je travaille sur un robot qui interagit avec plusieurs éléments (capteur ultrason, servomoteur, et 2 moteurs pour fabriquer une voiture anti-collision dont le lien est ci dessous si ça vous intéresse. Généralement le robot doit avancer tant qu'il n’y pas d'obstacles pour cela j'ai besoin qu'il avance à vitesse constante grâce à l'asservissement que j'impose au moteurs. Pour ce faire, j'ai commencé par tester l’asservissement seul grâce au tutoriel en lien ci-dessous et c'est ici que le timer intervient à un interval régulier pour calculer l'angle fait par le moteur et apporter la correction nécessaire (le lien ci-dessous explique bien comment), maintenant que l'asservissement des moteurs seul est réussi je veux inclure l’asservissement dans antilogarithme global, la difficulté est donc de réussir à lancer la fonction de l'asservissement dans la fonction gérant les moteurs.

J'ai par conséquent intégré dans la fonction de lancement des moteur le "timer.run" comme ça, ça amorce l'asservissement dès que la fonction est appelée et donc la mise en marche des moteurs, et puis pour les arrêter, j'ai mis dans la fonction gérant l'arrêt des moteurs le fameux "disable". Malheureusement en testant hier ça n'a pas marché, je vais essayer d'investiguer en prenant en compte vos conseils.

Justement, le timer.run active la fonction d'asservissement et c'est pour ça que je ne peux pas la mettre dans le loop directement et n'importe ou, je l'ai donc mis dans la fonction de lancement des moteurs dans le loop. Autrement l'asservissement démarrerait à un instant non voulu.

Lien voiture autonomme:U=RI | La voiture automatisée anti-collision - YouTube
Lien asservissement moteurs:Asservissement en vitesse d’un moteur avec Arduino » Sciences et Techniques

Merci.

Ismaaiii:
Justement, le timer.run active la fonction d'asservissement et c'est pour ça que je ne peux pas la mettre dans le loop directement et n'importe où

Au risque de me répéter, Il faut bien comprendre que timer.run() ne met pas les moteurs en marche. timer.run() n'est qu'un mécanisme qui va lancer l'exécution de tâches que tu actives/désactives. Et ce sont ces tâches qui vont actionner les moteurs.
Donc tu initialises simpleTimer en créant une instance de celle-ci. Et tu déclares les identifiants des tâches à séquencer

SimpleTimer toto;
int moteur1;
int moteur2;

Dans le setup() tu déclares tes évènements liés au temps. Tu désactives les tâches si tu ne veux pas qu'elles soit actives au démarrage.

void setup(void){
    moteur1=toto.setInterval(1000,la_fonction_à_appeler1);
    moteur2=toto.setInterval(1000,la_fonction_à_appeler2);
    toto.disable(moteur1);
    toto.disable(moteur2);
 ....
}

Dans loop() tu fais un appel à toto.run() pour mettre à jour la gestion des évènements temporelles

void loop(void){
   toto.run();

...
le reste de ta gestion
...
}

et dans des fonctions distinctes par exemple dans celles qui gère ton asservissement tu actives/désactives des fonctions

void truc(void){
    toto.disable(moteur1);
    toto.enable(moteur2);
}

Merci beaucoup pour tes lumières, je vais tester avec ça et te tiens au courant.

Bonne journée.

Bonjour,

J'ai une question, quand tu dis "va lancer l'exécution de tâches que tu actives/désactives", tu parles bien en occurrence de "la_fonction_à_appeler1"? donc à chaque fois dans la loop que l'algorithme va rencontrer timer.run il va lancer la "la_fonction_à_appeler1"? Si ce n'est pas le cas alors je n'ai pas trop compris :frowning:

Merci.