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)
Crée un profil de course trapézoïdal avec 1/3 d'accélération, 1/3 à vitesse constante et 1/3 de décélération.
Le paramètre Sensation n’a aucun effet sur ce motif.
Ajuste le rapport de vitesse entre les mouvements d'entrée et de sortie en utilisant la valeur de Sensation :
- Sensation positive (> 0) : Rend le mouvement d'entrée plus rapide (jusqu'à 5x) pour une sensation de frappe intense
- Sensation négative (< 0) : Rend le mouvement de sortie plus rapide pour une sensation plus taquine
Le temps de course global reste constant et dépend uniquement du paramètre de vitesse global.
Contrôle l'accélération du mouvement via la valeur de Sensation :
- Valeurs positives : augmente l'accélération jusqu'à ce que le mouvement atteigne une vitesse constante (sensation robotique)
- Neutre (0) : Équivaut à Simple Stroke (profil 1/3, 1/3, 1/3)
- Valeurs négatives : réduit l'accélération jusqu'à obtenir un profil triangulaire
Semblable à Teasing or Pounding, mais une course sur deux n’atteint que la moitié de la profondeur.
- Sensation positive (> 0) : Rend le mouvement d'entrée plus rapide (jusqu'à 5x) pour une sensation de frappe intense
- Sensation négative (< 0) : Rend le mouvement de sortie plus rapide pour une sensation plus taquine
Le temps de course reste le même pour toutes les courses, y compris celles à mi-profondeur.
Augmente progressivement la profondeur d'insertion à chaque course jusqu'à atteindre le maximum, puis se réinitialise et redémarre.
La valeur de Sensation contrôle le nombre de courses qui effectuent un cycle de rampe.
Insère des pauses entre une série de courses. Le nombre de courses varie de 1 à 5 et inversement.
La valeur de Sensation contrôle la durée de pause entre les séries de courses.
Réduit la longueur de course effective tout en maintenant la vitesse de course constante. Cela crée des motifs vibratoires à des valeurs de Sensation plus élevées.
- Sensation positive : Les courses dérivent vers l’avant
- Sensation négative : Les courses dérivent vers l’arrière
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ée un motif vibratoire qui vibre lors de l'entrée et se retire en douceur en un seul mouvement.
La valeur de Sensation définit l'amplitude de vibration de 3 mm à 25 mm.
Ajoute une couche vibratoire aux courses, qui vibre à la fois à l’entrée et à la sortie.
La valeur de Sensation définit l'amplitude de vibration de 3 mm à 25 mm.
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));
#endifEnregistrez 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)ouStrokeEngine.startMotion()est appelé - S’incrémente après chaque mouvement exécuté avec succès
- La comparaison de
index == _indexdé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 :
| Fonction | Description |
|---|---|
_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.
Bibliothèque StrokeEngine
Créez des mouvements de course polyvalents avec des moteurs pas à pas ou des servomoteurs sur ESP32 pour les machines à entraînement de position linéaire DIY
Conception et câblage de la carte
Schémas de câblage et brochages GPIO pour le PCB OSSM officiel et les configurations alternatives