MTobjects: couteau suisse

Bonjour,

Je viens de remettre en ligne ma bibliothèque MTobjects qui permet de gérer divers objets sous interruption: boutons, horloges, pwm, servo, pas à pas pour l'instant.
Elle ne fonctionne que pour les AVR (Uno, Nano, Mega) car elle utilise les timers interne. Le principe serait utilisable pour d'autre microcontrôleurs.

Passant par interruptions:
− il est possible de gérer plusieurs actions qui semblent indépendantes
− il n'y a pas d'appel régulier à faire dans loop (genre MTobjects.run(); ).
− on peut parfaitement faire tourner un pas, faire clignoter une sortie pendant un delay du programme principal. On peur avoir un programme bloquant et rajouter un bouton qui sera pris en compte.

Pour la catégorie, "Projets fini" est ambigu car je pourrais m'arrêter là, mais je pense utiliser des accélérations pour pas à pas et gérer deux pas à pas ensembles (pour faire des droites inclinées et des arcs de cercles sur une table XY).

Supposons que nous ayons un programme classique "blink with delay":

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite( LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite( LED_BUILTIN, HIGH); 
  delay(1000);
}

Et supposons que l'on veuille rajouter un pas à pas qui ferait un tour à chaque appui sur un bouton, il suffit d'écrire:

// *************** Rajout ********************
#include <MTobjects.h> // V1.0.3 Voir http://arduino.dansetrad.fr/MTobjects
const uint8_t PIN_BOUTON = A0;
MTstepStepper Stepper(pin_Step 2, pin_Dir 5, pin_EN 8);
void tourne(void) // Un tour commplet
{
  Stepper.move(Stepper.getMicroStepsPerTurn());
}
MTbutton Bouton(PIN_BOUTON, tourne);



//**************** l'ancien programme ************
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite( LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite( LED_BUILTIN, HIGH); 
  delay(1000);
}

vous avez testé la stabilité avec des bibliothèques qui utilisent aussi des timers ou interruptions (SoftwareSerial, FastLed / Neopxiel, ...) ?

Effectivement, n'utilisant pas ces bibliothèque, je n'y ai pas pensé!
Il va falloir que j'analyse ces bibliothèques pour voir comment elles fonctionnent puis faire des essais.
Merci.

Finalement la réponse est compliquée. Je ne crois pas que SoftwareSerial, FastLed et Neopxiel fournissent leurs exigences et donnent leurs performances.

Pour SoftwareSerial, j'ai eu du mal à récupérer le code et ils utilisent une interruption différente de celle qui me sert. On peut donc partager le temps. Pour le test, il faudrait que je crée deux liaisons sérier, que j'envoie à partir de la première des données que je récupère sur la deuxième dans loop par exemple tout en faisant tourner un pas à pas en même temps hors loop. Mais cela n'est qu'un test parmi tant d'autres, et rien ne dit que si ce test fonctionne les autres marcheront.

Pour FastLed / Neopxiel, c'est plus compliqué n'ayant pas de leds programmables. Je pourrais tester avec l'analyseur et mesurer les signaux, mais ce n'est pas très sûr.

Quoi qu'il en soit, toutes les bibliothèque s'accommodent de l'interruption système (remise à l'heure de l'horloge pour les fonction delay, millis...) qui prends au moins 6,1µs (toutes les 1,024ms).
En fonction des objets utilisés les temps pris par les interruptions ne sont pas le mêmes, et il faut voir si on bloque l'Arduino pendant ce temps va ou non modifier suffisamment les signaux des autres bibliothèques pour les rendre inutilisables.
Ce que je peux dire c'est si j'ai un seul bouton, je monopolise le microcontrôleur pendant 17,5µs maximum en permanence toutes les ms et à chaque changement 25,5µs.
Avec un seul moteur pas à pas tournant à 10000 pas/s, je monopolise le micro pendant 16,6µs toutes les 100µs.

Si on utilise SofwareSerial à 9600 bauds, un bit dure 100µs, et avec un quart de bit de djitter, cela peut passer. A priori, si on passe à 115200 bauds, un bit dure 8µs et à cause des 6,1µs de l'horloge système, cela ne devrait pas fonctionner du tout, sauf si on désactive l'horloge. Je ne sais pas si les tests ont été faits.
Ce qui est prévisible, c'est que si j'utilise 8 pas à pas tournant à 10000pas/s, je consomme 92,9µs dans mon interruption et SofwareSerial à 9600 bauds ne peut plus passer.

C'est donc une réponse de normand, p'ête bin qu'oui, p'ête bin qu'non.

Pour ma bibliothèque seule j'indique que l'on peut avoir:
− 1800 boutons maximum (si le code le permettait)
− 8 pas à pas tournant à 10000 pas/s
− 1 seul pas à pas tournant à 58000pas/s (plutôt 58000micros-pas/s)
Au delà ma bibliothèque n'est plus compatible avec elle même

1 Like

Ok - en pratique faut tester

Pour les leds les 2 bibliothèque suspendent les interruptions pendant l’affichage, pour 200 LEDs ça fait un peu plus de 6 ms. Je me demandais si une telle durée aller affecter vos algos.

Pour software serial c’est du pin change interrupt en réception et bloqué pendant l’émission d’un octet

De toutes façons à ce debut Software serial n’est pas fiable donc généralement on reste à 9600 bauds.

Si on bloque les interruptions pendant 6ms, il ne peut y avoir aucune bibliothèque capable de faire tourner un pas à pas pendant de temps. C'est donc incompatible avec toutes les bibliothèque dont la mienne. Ce qui se passe alors, et je suppose que c'est pareil avec toutes les bibliothèques, les pas sont suspendus pendant ce temps, et reprennent après. Il y a un trou dans la vitesse, mais la position finale sera bonne.
C'est pareil pour les PWM soft et pour les avances lentes des servos.
Pour ce qui est des boutons, cela ne change rien, le temps de suppression des rebonds est au moins de 16ms

OK - oui ça impacté tout (y compris le code « normal ») - je le demandais juste si vous aviez des dépendances par rapport à la régularité de vos interruptions. Ça ne semble pas être le cas ➜ cool :+1:

Nouvelle version avec seulement 3 fichiers au lieu de 20
Modification pour avoir des accélérations/décélérations pour les pas à pas. Cela ralentit un peu et on est limité maintenant à 50000 pas/s.

Vous avez comparé avec les mobatools qui a une approche aussi fondée sur une interruption pour traiter les éléments en tâche de fond ? (Elle est utilisée / référencée notamment sur le forum allemand)

mobatools est intéressant et a une approche assez similaire effectivement. Les différences principales que je vois (et qui m'on conduit à écrire ma bibliothèque) sont (sous réserve d'une étude plus complète):

− mobatool est multiplateforme, ce que je ne sais pas faire sans acheter les différentes cartes pour faire les essais. Je n'en ai pas l'utilité, ce serait pour moi un exercice de maths pur, et je pratique plus la danse, la randonnée, et le bricolage que l'informatique.

− mobatool utilise complètement le timer 1 sur Uno et le timer 3 sur Mega, alors que j'ai préféré le timer 0. Je ne connais pas de bibliothèque qui utilise le timer 0. Ainsi MTobjects est compatible avec Servo qui utilise le timer 1. Je n'ai pas la liste des bibliothèque utilisant le timer 1.

− pour les boutons, mobatool semble avoir une approche sans interruption. Il faut scanner les boutons par myButtons.processButtons(); dans loop ce qui oblige à écrire un programme non bloquant et une boucle rapide (on ne peut pas utiliser delay(1000) par exemple). Mobatool semble gérer les boutons SPI (pas d'intérêt pour moi), les matrices de boutons (faudra que j'y pense), et les appuis courts/longs (faudra que j'y songe).

− pour les pas à pas mobatool n'a pas de fonctions callbak et si on veut qu'un moteur fasse des allers/retours, il faut le scanner dans loop. L'avance n'est pas bloquante, mais il faut un programme non bloquant. MTobjects permet les fonctions Caalback en fin de mouvements.
Par défaut la limitation de vitesse est de 2500 pas/s sur Uno, ce qui correspond à moins de 0,8tr/s avec un hybride en 16 micros pas. MTobjects passe à 10000pas/s. Le maxi de mobatool semble être 16000pas/s (5tr/s), MTobject monte à 50000 impulsions/s

− pour les temporisateurs, mobatool n'a pas de fonctions callback


En gros MTobjects permet d'écrire plusieurs programme indépendants, car on peut se passer la plupart du temps de loop. Ce qui permet de rajouter des boutons et des LED/servos/pas à pas sans modifier le programme initial, ou très peu. Par exemple avec un programme déjà écrit, je voudrais faire un warning quand un moteur tourne, jouer un air de musique (avec un PWM) .

1 Like

Merci pour cette réponse détaillée !

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.