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.
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"
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.
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.
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.
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.
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.
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