Programmation Multi tâche

Salut tout le monde,

Mon problème est le suivant, je voudrais faire en sorte que mes 2 servos moteurs ainsi que mon capteur de mouvement agissent en même temps, c'est à dire que lorsque mes servos moteur tourne tous les 20 degrés, mon capteur de mouvement soit actif, j'ai donc réalisé deux programmes, une pour le capteur et l'autre pour les servos moteur, les deux programme marche bien séparément, il y a aucun problème, cependant et je suppose que c'est normal, quand je fusionne les deux programme en un, mes servos fonctionne mais pas la capteur ou alors il y a quelque bug vite fait dans le fonctionnement.

Je voudrais donc un petit coup de main pour faire fonctionner tous cela, apparemment il faut utilisé la libraire "ordonnancer.h", je l'est installé mais les exemple sont pas facile pour moi aha.

Merci d'avance :slight_smile:

Tu trouveras ici plus d'infos sur la bibliothèque ordonnanceur de Bricoleau

sinon dans le forum anglais il y a un intervenant qui a présenté sa librairie fibre (multitâche coopératif --> wikipedia)

c'est un peu le marteau pour écraser une mouche dans ce cas mais pour ceux qui ont des besoins avancés ça peut être sympa (au moins intellectuellement)

Bonjour

La bibliothèque ordonnanceur.h est particulièrement adaptée lorsque l'on souhaite faire "plusieurs choses à la fois" à des cadences différentes.

Comme par exemple actualiser l'affichage d'un LCD une fois par seconde, tout en gérant un servo toutes les 20 ms.
Et elle est encore plus utile quand on veut faire "beaucoup de choses à la fois", car elle permet de monitorer l'ensemble.

Par contre elle n'est d'aucun secours s'il s'agit de fusionner deux bouts de code qui comportent des delay.

Là il n'y a pas de miracle : pris séparément, chaque bout de code doit être restructuré pour s'exécuter en petites séquences rapides. C'est là que l'on est souvent amené à utiliser une machine à états.

Et si chaque partie de code doit avoir le même cadencement de déclenchement, pas la peine de s'embêter avec un ordonnaceur.h.
autant écrire directement les fonctions principales comme cela

void setup() {
  setup1();
  setup2();
}

void loop() {
  loop1();
  loop2();
}

à toi de coder les setupx() et loopx() pour qu'ils ne comportent plus de delay ou de while trop long.

L’approche fibre permet de remplacer l’appel à delay() par la coopération entre threads légers (mais bon, une bonne vieille machine à états fait le job)

Peut être qu'en allant regarder l'exemple "blink without delay", vous pouvez vous en inspirer pour

Dans le setup ou en variables globales initialisées:

a) mettre des echéances à vos tâches (ex: servir le moteur 1 toutes les 15 ms; servir le moteur 2 toutes les 30 ms). Ce seront des variables globales

Dans le loop
b) si une echéance doit être honorée, (ie : il s'est passé 15 ms pour le moteur 1)
b1) l'honorer
b2) mettre à jour la date à laquelle il faudra l'honorer de nouveau (ajouter 15 ms au nombre de millisecondes écoulées depuis le début et le mettre dans son échéancier de variables globales)

Très bien merci à tous pour votre aides :slight_smile: