Motifs

Découvrez comment les motifs créent de la variété dans le mouvement StrokeEngine en générant des paramètres de mouvement trapézoïdal

Les motifs sont ce qui distingue StrokeEngine des autres systèmes de mouvement. Chaque motif est un petit programme qui génère l'ensemble suivant de paramètres de mouvement trapézoïdal : position cible, vitesse et accélération.

Motifs disponibles

Le micrologiciel OSSM expose 7 motifs (indices 0 à 6) : Simple Stroke, Teasing or Pounding, Robo Stroke, Half'n'Half, Deeper, Stop'n'Go et Insist. Jack Hammer et Stroke Nibbler sont disponibles dans la bibliothèque StrokeEngine mais ne sont actuellement pas implémentés dans le micrologiciel OSSM.

Motifs OSSM (0-6)

Motifs disponibles uniquement dans la bibliothèque

Ces motifs sont disponibles dans la bibliothèque StrokeEngine mais ne sont pas actuellement implémentés dans le micrologiciel OSSM. Ils sont documentés ici pour les développeurs créant un micrologiciel personnalisé ou d'autres projets basés sur StrokeEngine.

Création de motifs personnalisés

Vous pouvez créer vos propres motifs en sous-classant la classe Pattern dans le fichier d'en-tête pattern.h.

Sous-classer la classe Pattern

Créez une nouvelle classe qui étend Pattern. Voir SimpleStroke pour une implémentation minimale :

class SimpleStroke : public Pattern {
    public:
        SimpleStroke(const char *str) : Pattern(str) {}

Le constructeur stocke la chaîne de nom d'affichage du motif.

Remplacer les fonctions de définition (setters) si nécessaire

Réimplémentez les fonctions de définition (setters) lorsque vous avez besoin de calculs personnalisés :

void setTimeOfStroke(float speed = 0) {
    // In & Out have same time, so divide by 2
    _timeOfStroke = 0.5 * speed;
}

Implémenter la fonction nextTarget

Il s'agit de la fonction principale que StrokeEngine appelle après chaque course pour obtenir les paramètres de mouvement suivants.

motionParameter nextTarget(unsigned int index) {
    // Maximum speed of the trapezoidal motion
    _nextMove.speed = int(1.5 * _stroke/_timeOfStroke);

    // Acceleration to meet the profile
    _nextMove.acceleration = int(3.0 * _nextMove.speed/_timeOfStroke);

    // Odd stroke moves out
    if (index % 2) {
        _nextMove.stroke = _depth - _stroke;

    // Even stroke moves in
    } else {
        _nextMove.stroke = _depth;
    }

    _index = index;
    return _nextMove;
}

Le paramètre index commence à 0 lorsque le motif est appelé pour la première fois et s'incrémente de 1 après chaque course. Utilisez-le pour créer des motifs qui varient dans le temps.

Ajouter une sortie de débogage

Encapsulez les instructions Serial.print() avec les directives du préprocesseur afin qu'elles puissent être activées ou désactivées :

#ifdef DEBUG_PATTERN
    Serial.println("TimeOfInStroke: " + String(_timeOfInStroke));
    Serial.println("TimeOfOutStroke: " + String(_timeOfOutStroke));
#endif

Enregistrez le motif

Ajoutez une instance de votre classe de motifs au tableau patternTable[] au bas du fichier :

static Pattern *patternTable[] = {
    new SimpleStroke("Simple Stroke"),
    new TeasingPounding("Teasing or Pounding"),
    new YourNewPattern("Your Pattern Name")  // Add your pattern here
};

Exigences des motifs

Limites de profondeur et de course

Les motifs doivent renvoyer les positions de course dans l'intervalle [0, stroke]. StrokeEngine surveille toutes les valeurs motionParameter renvoyées et tronque les positions en dehors de [depth - stroke, depth] pour éviter les blessures.

Les valeurs de profondeur et de course définies dans StrokeEngine sont des limites axiomatiques. Votre motif définit l'enveloppe qu'il utilise dans ces limites. Les mêmes contraintes de sécurité s'appliquent à la vitesse via timeOfStroke.

Modifications fluides des paramètres

Votre motif doit gérer les changements de paramètres avec fluidité. Lorsque les valeurs de profondeur ou de course changent en cours d'opération, le motif doit :

  • rester dans l’intervalle [depth, depth - stroke] à tout moment
  • exécuter les mouvements de transfert à la même vitesse que les mouvements normaux
  • éviter les comportements erratiques

Testez minutieusement votre motif par rapport aux changements de paramètres, en particulier aux modifications de profondeur et de course qui peuvent nécessiter des distances de course supplémentaires.

Utilisation du paramètre index

Le paramètre index fournit des informations d'état importantes :

  • Se réinitialise à 0 lorsque StrokeEngine.setPattern(int) ou StrokeEngine.startMotion() est appelé
  • S’incrémente après chaque mouvement exécuté avec succès
  • La comparaison de index == _index détermine s'il s'agit d'une mise à jour de la course actuelle plutôt que d'une nouvelle course

Stockez le dernier index dans _index avant le retour de la fonction pour suivre l’état de la course.

Implémentation de pauses

Les motifs peuvent insérer des pauses entre les courses. Lorsque la position cible est atteinte, StrokeEngine interroge le motif toutes les quelques millisecondes pour obtenir de nouvelles commandes de mouvement.

Pour implémenter une pause, renvoyez _nextMove.skip = true à partir de votre fonction nextTarget(). StrokeEngine interrogera à nouveau plus tard au lieu de démarrer un nouveau mouvement.

La classe de base Pattern fournit trois fonctions d'assistance pour la gestion des pauses :

FonctionDescription
_startDelay()Démarre le temporisateur
_updateDelay(int delayInMillis)Définit la durée de la pause en millisecondes (peut être mise à jour à tout moment)
_isStillDelayed()Renvoie true si l’échéance programmée n’a pas été atteinte

Si une course est en retard, elle est exécutée immédiatement. Voir le motif Stop'n'Go pour un exemple d'implémentation.

Contribuer des motifs

Après avoir minutieusement testé votre motif, soumettez une pull request avec votre fichier pattern.h mis à jour.

Sur cette page