Leer hoe patronen variatie creëren in StrokeEngine-beweging door trapeziumvormige bewegingsparameters te genereren
Patronen onderscheiden StrokeEngine van andere bewegingssystemen. Elk patroon is een klein programma dat de volgende set trapeziumvormige bewegingsparameters genereert: doelpositie, snelheid en versnelling.
Beschikbare patronen
De OSSM-firmware onthult 7 patronen (indices 0-6): Simple Stroke, Teasing or Pounding, Robo Stroke, Half'n'Half, Deeper, Stop'n'Go en Insist. Jack Hammer en Stroke Nibbler zijn beschikbaar in de StrokeEngine-bibliotheek, maar zijn momenteel niet geïmplementeerd in de OSSM-firmware.
OSSM-patronen (0-6)
Creëert een trapeziumvormig slagprofiel met 1/3 versnelling, 1/3 beweging met constante snelheid en 1/3 vertraging.
De Sensation-parameter heeft geen effect op dit patroon.
Past de snelheidsverhouding tussen in- en uitbewegingen aan met behulp van de Sensation-waarde:
- Positieve Sensation (> 0): Maakt de inwaartse beweging sneller (tot 5x) voor een hard bonzend gevoel
- Negatieve Sensation (< 0): Maakt de uitwaartse beweging sneller voor een meer plagend gevoel
De totale slagtijd blijft constant en hangt alleen af van de globale snelheidsparameter.
Regelt de slagversnelling via de Sensation-waarde:
- Positieve waarden: Verhoogt de versnelling totdat de beweging met constante snelheid verloopt (voelt robotachtig aan)
- Neutraal (0): gelijk aan Simple Stroke (1/3, 1/3, 1/3 profiel)
- Negatieve waarden: Vermindert de versnelling tot een driehoeksprofiel
Vergelijkbaar met Teasing or Pounding, maar elke tweede slag bereikt slechts de helft van de diepte.
- Positieve Sensation (> 0): Maakt de inwaartse beweging sneller (tot 5x) voor een hard bonzend gevoel
- Negatieve Sensation (< 0): Maakt de uitwaartse beweging sneller voor een meer plagend gevoel
De slagtijd blijft voor alle slagen hetzelfde, ook voor halve diepteslagen.
Verhoogt geleidelijk de inbrengdiepte met elke slag totdat het maximum wordt bereikt, wordt vervolgens gereset en opnieuw gestart.
De Sensation-waarde bepaalt hoeveel slagen één rampcyclus voltooien.
Voegt pauzes in tussen een reeks slagen. Het aantal slagen loopt op van 1 naar 5 en weer terug.
De Sensation-waarde regelt de pauzeduur tussen slagreeksen.
Vermindert de effectieve slaglengte terwijl de slagsnelheid constant blijft. Hierdoor ontstaan trillingspatronen bij hogere Sensation-waarden.
- Positieve Sensation: slagen dwalen naar voren
- Negatieve Sensation: slagen dwalen naar achteren
Patronen die alleen in de bibliotheek beschikbaar zijn
Deze patronen zijn beschikbaar in de StrokeEngine-bibliotheek, maar zijn momenteel niet geïmplementeerd in de OSSM-firmware. Ze worden hier gedocumenteerd voor ontwikkelaars die aangepaste firmware of andere op StrokeEngine gebaseerde projecten bouwen.
Creëert een trillingspatroon dat trilt bij het naar binnen gaan en in één beweging soepel naar buiten trekt.
De Sensation-waarde stelt de trillingsamplitude in van 3 mm tot 25 mm.
Voegt een trillende laag toe aan de slagen, die zowel bij het in- als uitgaan trilt.
De Sensation-waarde stelt de trillingsamplitude in van 3 mm tot 25 mm.
Aangepaste patronen maken
U kunt uw eigen patronen maken door in het header-only bestand pattern.h een subklasse van Pattern te maken.
Maak een subklasse van Pattern
Maak een nieuwe klasse die Pattern uitbreidt. Zie SimpleStroke voor een minimale implementatie:
class SimpleStroke : public Pattern {
public:
SimpleStroke(const char *str) : Pattern(str) {}De constructor slaat de tekenreeks met de weergavenaam van het patroon op.
Overschrijf set-functies indien nodig
Implementeer set-functies opnieuw wanneer u aangepaste berekeningen nodig hebt:
void setTimeOfStroke(float speed = 0) {
// In & Out have same time, so divide by 2
_timeOfStroke = 0.5 * speed;
}Implementeer de nextTarget-functie
Dit is de kernfunctie die StrokeEngine na elke slag aanroept om de volgende bewegingsparameters te verkrijgen.
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;
}De parameter index begint bij 0 wanneer het patroon voor het eerst wordt aangeroepen en wordt na elke slag met 1 verhoogd. Gebruik dit om patronen te creëren die in de loop van de tijd variëren.
Voeg foutopsporingsuitvoer toe
Kapsel Serial.print()-instructies in met preprocessor-richtlijnen, zodat ze kunnen worden omgeschakeld:
#ifdef DEBUG_PATTERN
Serial.println("TimeOfInStroke: " + String(_timeOfInStroke));
Serial.println("TimeOfOutStroke: " + String(_timeOfOutStroke));
#endifRegistreer het patroon
Voeg een exemplaar van uw patroonklasse toe aan de patternTable[]-array onderaan het bestand:
static Pattern *patternTable[] = {
new SimpleStroke("Simple Stroke"),
new TeasingPounding("Teasing or Pounding"),
new YourNewPattern("Your Pattern Name") // Add your pattern here
};Patroonvereisten
Diepte- en slaggrenzen
Patronen moeten slagposities retourneren binnen het interval [0, stroke]. StrokeEngine bewaakt alle geretourneerde motionParameter-waarden en kapt posities buiten [depth - stroke, depth] af om letsel te voorkomen.
Diepte- en slagwaarden die zijn ingesteld in StrokeEngine zijn axiomatische grenzen. Uw patroon definieert het bewegingsbereik dat het binnen deze limieten gebruikt. Dezelfde veiligheidsbeperkingen zijn van toepassing op de snelheid via timeOfStroke.
Soepele parameterwijzigingen
Uw patroon moet parameterwijzigingen correct verwerken. Wanneer de diepte- of slagwaarden tijdens het gebruik veranderen, moet het patroon:
- te allen tijde binnen het interval
[depth, depth - stroke]blijven - overdrachtsbewegingen met dezelfde snelheid als normale bewegingen uitvoeren
- grillig gedrag vermijden
Test uw patroon grondig op parameterwijzigingen, vooral op diepte- en slagwijzigingen waarvoor mogelijk extra slagafstanden nodig zijn.
Met behulp van de indexparameter
De parameter index biedt belangrijke statusinformatie:
- Wordt teruggezet naar 0 wanneer
StrokeEngine.setPattern(int)ofStrokeEngine.startMotion()wordt aangeroepen - Wordt na elke succesvol uitgevoerde beweging verhoogd
- Door
index == _indexte vergelijken wordt bepaald of dit een update van de huidige slag is en geen nieuwe slag
Sla de laatste index op in _index voordat de functie terugkeert, om de slagstatus bij te houden.
Pauzes implementeren
Patronen kunnen pauzes tussen slagen invoegen. Wanneer de doelpositie is bereikt, pollt StrokeEngine om de paar milliseconden op nieuwe bewegingsopdrachten.
Om een pauze te implementeren, retourneert u _nextMove.skip = true vanuit uw nextTarget()-functie. StrokeEngine pollt later opnieuw in plaats van een nieuwe beweging te starten.
De basisklasse Pattern biedt drie hulpfuncties voor pauzebeheer:
| Functie | Beschrijving |
|---|---|
_startDelay() | Start de vertragingstimer |
_updateDelay(int delayInMillis) | Stelt de pauzeduur in milliseconden in (kan op elk moment worden bijgewerkt) |
_isStillDelayed() | Retourneert true als de geplande tijd niet is bereikt |
Als een slag te laat is, wordt deze onmiddellijk uitgevoerd. Zie het Stop'n'Go-patroon voor een voorbeeldimplementatie.
Patronen bijdragen
Nadat u uw patroon grondig hebt getest, dient u een pull request in met uw bijgewerkte pattern.h-bestand.