import Tabs depuis '@theme/Tabs' ; import TabItem depuis '@theme/TabItem' ;
Guide de démarrage du stylet VerseGrip
VerseGrip ajoute une fonctionnalité de suivi de la posture aux modèles « Inverse3», « Inverse3X » et « MinVerse ». Cet article présente les étapes de configuration du stylet VerseGrip ainsi que ses fonctionnalités.
Stylet VerseGrip
Le stylet VerseGrip utilise une technologie exclusive de communication sans fil à haut débit et offre des fonctionnalités de suivi de la posture ainsi que des fonctions d'entrée/sortie (E/S) en mode portable. Conçu pour s'adapter à de nombreux scénarios d'utilisation, il présente une grande polyvalence.
Les principales fonctionnalités sont les suivantes :
- 2 boutons de saisie,
- 1 bouton d'étalonnage,
- 1 bouton d'alimentation/veille
- 2 voyants d'état
- Port de recharge USB-C
- La vitesse de communication sans fil peut atteindre 1 kHz
- Autonomie de la batterie : 10 à 12 heures
- Il est possible d'appairer jusqu'à 8 stylos VerseGrip avec un seul récepteur (dongle) sur une même bande.

Service client
Si vous avez des questions ou des inquiétudes concernant l'appareil ou son fonctionnement, veuillez contacter notre équipe d'assistance pour obtenir de l'aide. Le stylet VerseGrip intègre une technologie sans fil propriétaire complexe. L'ouverture de l'appareil entraînera l'annulation de la garantie et pourra rendre l'appareil inutilisable. Afin d'éviter des délais de livraison prolongés et des frais de réparation élevés,veuillez ne pas ouvrir l'appareil.
Configuration et étalonnage du stylet VerseGrip
Cette section décrit les étapes à suivre pour insérer le récepteur, mettre en marche le stylet VerseGrip et procéder à son étalonnage.
Paramètres
- Branchez le récepteur sur un port USB de l'ordinateur.
- Placez la manette sur une surface plane et stable, les boutons vers le haut et le connecteur sphérique tourné vers l'écran.
Mise en marche et étalonnage
- Appuyez une fois sur le bouton d'alimentation. Le voyant d'état passe d'abord au rouge, puis au jaune, ce qui indique que l'IMU intégrée à l'appareil est en cours d'auto-étalonnage.
- Une fois l'étalonnage automatique terminé, le Stylus sera connecté à l'ordinateur.
- Lorsque le Stylus est correctement connecté et qu'il transmet des données sans fil, le voyant d'état clignote en vert.
- Si le niveau de charge de la batterie est très faible, le stylet VerseGrip s'éteindra automatiquement toutes les 2 minutes ;veuillez le recharger immédiatement.
Réétalonnage
Le processus d'étalonnage réinitialise le système de coordonnées du VerseGrip, de sorte que l'orientation de l'appareil au moment de l'étalonnage devient le nouvel axe de référence.
- Pour procéder à un nouvel étalonnage, maintenez le Stylus dans la position que vous souhaitez étalonner, puis maintenez le bouton d'étalonnage enfoncé pendant trois secondes ou jusqu'à ce que la position dans la simulation change.
L'illustration ci-dessous compare le comportement de l'appareil lorsqu'il n'est pas calibré et lorsqu'il l'est. Lors de la démonstration, le VerseGrip doit d'abord conserver la position indiquée sur l'illustration, puis être calibré.

Mode veille et arrêt
- Appuyez une fois sur le bouton d'alimentation pour revenir en mode veille. Le voyant d'état se mettra à clignoter en blanc et le transfert de données s'arrêtera.
- Pour éteindre le stylet VerseGrip, maintenez le bouton d'alimentation enfoncé pendant 5 secondes, puis relâchez-le. Une fois relâché, le voyant d'état doit s'éteindre et aucun autre indicateur ne doit être visible. L'appareil cessera alors de transmettre des données.
Recharge
- Rechargez le stylet VerseGrip via le port de recharge USB-C.
- Lorsque l'appareil est branché, le voyant d'état de charge reste allumé en bleu ; il s'éteint une fois la charge terminée.
- Si le Stylus est éteint au moment de la mise sous tension, il s'allumera automatiquement.
Avertissement : si votre stylet VerseGrip a été expédié entre août et décembre 2024, veillez à ne pas laisser la batterie se décharger complètement. Une fois complètement déchargée, la batterie risque de ne plus pouvoir se recharger. Si cela se produit, le stylet VerseGrip continuera de fonctionner tant qu’il restera branché sur le secteur. Veuillez contacter l’équipe d’assistance à l’adresse Haply pour obtenir le fichier de mise à jour du micrologiciel permettant de résoudre ce problème.
États et voyants lumineux
| Couleur | Modes d'éclairage | Explication |
|---|---|---|
| jaune | Allumage/extinction progressive rapide | Calibrage initial automatique du capteur (en laissant le VerseGrip au repos sur une table) |
| Clignotement rapide | Le bouton de calibrage de la posture a été enfoncé ; le processus de calibrage a commencé. | |
| Allumage permanent | Le bouton de calibrage de la posture a été enfoncé. Le calibrage est terminé. | |
| Rouge | Allumage/extinction progressive rapide | L'adaptateur est déconnecté, l'ordinateur ne reçoit aucun signal |
| Clignotement rapide | Le bouton d'alimentation a été enfoncé ; la procédure d'arrêt a commencé. | |
| vert | Allumage progressif / Extinction progressive | L'adaptateur est connecté, le VerseGrip est en mode de flux de données actif |
| Allumage permanent | L'adaptateur est connecté, le VerseGrip est en mode de flux de données actif et l'alimentation par USB est activée. | |
| blanc | Allumage progressif / Extinction progressive | L'adaptateur est connecté, le VerseGrip est en mode veille/inactif, aucun flux de données n'est en cours de transmission |
| Allumage permanent | L'adaptateur est connecté, le VerseGrip est en mode veille/inactif, aucun flux de données n'est en cours de transmission, l'alimentation USB est connectée | |
| orange | Scintillement (entrelacement) | Avertissement de batterie faible : les notifications s'affichent en alternance selon l'état actuel |
| Feux de détresse (alternés) | Avertissement indiquant que la batterie est presque à plat ; la notification s'affiche en alternance selon l'état actuel | |
| Bleu | Allumage progressif / Extinction progressive | Modes de mise à jour du micrologiciel des appareils |
| (Plus lumineux) | Allumage permanent | Lorsqu'un bouton utilisateur est enfoncé, la couleur d'indication actuelle reste allumée en permanence et devient plus vive. |
| Fermer | sans lumière | Éteindre, couper le courant |
| Couleur du voyant de charge | Modes d'éclairage | Explication |
|---|---|---|
| Bleu | Allumage permanent | En cours de recharge |
| Clignotement rapide | Bientôt plein | |
| Fermer | sans lumière | Chargement terminé |
État et voyants de l'ancienne version
Les voyants d'état ci-dessous correspondent aux anciens modèles et à leurs couleurs, présents sur les premières versions du VerseGrip Stylus (firmware 1.10 et versions antérieures).
| Couleur | Modes d'éclairage | Explication |
|---|---|---|
| Rouge | Allumage permanent | Attente de l'initialisation du composant |
| Scintillement | Mode veille, pas de transfert de données | |
| Bleu | Allumage permanent | Calibrage initial automatique du capteur (en laissant le VerseGrip au repos sur une table) |
| vert | Scintillement | L'adaptateur est connecté, le VerseGrip est en mode de flux de données actif |
| Fermer | sans lumière | Éteindre, couper le courant |
| Couleur du voyant de charge | Modes d'éclairage | Explication |
|---|---|---|
| Bleu | Allumage permanent | En cours de recharge |
| Clignotement rapide | Bientôt plein | |
| Fermer | sans lumière | Chargement terminé |
Exemple de code
Voici un exemple simple d'utilisation du stylet VerseGrip en C++.
#include <external/libhv.h>
#include <nlohmann/json.hpp>
#include <chrono>
#include <cstdio>
#include <string>
using namespace hv;
using json = nlohmann::json;
// Procedure to get the first detected and available Wired VerseGrip Stylus device id
std::string get_first_verse_grip_device_id(const json &data) {
const auto& vgs = data["wireless_verse_grip"];
if (vgs.empty()) {
return "";
}
return vgs.items().begin().key();
}
int main() {
const auto print_delay = std::chrono::milliseconds(100);
auto current = std::chrono::high_resolution_clock::now();
bool first_message = true;
std::string device_id;
WebSocketClient ws;
ws.onmessage = [&](const std::string &msg) {
json data = json::parse(msg);
if (first_message) {
first_message = false;
const std::string first_id = get_first_verse_grip_device_id(data);
if (first_id.empty()) {
printf("no Wireless VerseGrip found.\n");
ws.close();
return;
}
device_id = first_id;
}
if (device_id.empty() || !data["wireless_verse_grip"].contains(device_id)) {
return;
}
const auto now = std::chrono::high_resolution_clock::now();
if (std::chrono::high_resolution_clock::now() > current + print_delay) {
current = now;
const json state = data["wireless_verse_grip"][device_id];
printf("Rotation : { x:%f, y:%f, z:%f, w:%f }, Hall:%i, Button : [%d, %d, %d], Battery: {%f}\n",
state["orientation"]["x"].get<float>(),
state["orientation"]["y"].get<float>(),
state["orientation"]["z"].get<float>(),
state["orientation"]["w"].get<float>(),
state["hall"].get<int8_t>(),
state["buttons"]["a"].get<bool>(),
state["buttons"]["b"].get<bool>(),
state["buttons"]["c"].get<bool>(),
state["battery_level"].get<float>());
}
};
ws.open("ws://localhost:10000");
printf("Press ENTER to stop...\n\n");
while (std::cin.get() != '\n') {
}
if (ws.isConnected()) {
ws.close();
}
return 0;
}
#include <string.h>
#include <chrono>
#include <iostream>
#include <iterator>
#include <string>
#include <thread>
#include "HardwareAPI.h"
int main(int argc, char* argv[])
{
char* portName;
if (argc < 2)
{
std::printf("Usage: %s <port>\n", argv[0]);
}
else
{
#if defined(_WIN32) || defined(_WIN64)
portName = _strdup(argv[1]); // argv1;
#endif
#if defined(__linux__)
portName = strdup(argv[1]); // argv1;
#endif
}
Haply::HardwareAPI::IO::SerialStream serial_stream(portName);
Haply::HardwareAPI::Devices::Handle handle(&serial_stream);
while (true)
{
Haply::HardwareAPI::Devices::Handle::VersegripStatusResponse data;
data = handle.GetVersegripStatus();
std::printf(
"device_id: %d battery_level: %f quaternion: %f %f %f %f buttons: "
"%d error_flags: %d\n",
data.device_id, data.battery_level, data.quaternion[0],
data.quaternion[1], data.quaternion[2], data.quaternion[3],
data.buttons, data.error_flag);
}
}