import Tabs aus '@theme/Tabs'; import TabItem aus '@theme/TabItem';
Erste Schritte mit dem VerseGrip-Stylus
VerseGrips erweitern „ Inverse3 “, „Inverse3X“ und „ MinVerse “ um Funktionen zur Orientierungserfassung. Dieser Artikel beschreibt die Einrichtung des VerseGrip-Stylus sowie dessen Funktionen.
VerseGrip-Stift
Der VerseGrip Stylus nutzt eine proprietäre Hochgeschwindigkeits-Funktechnologie, um die Erfassung der Ausrichtung sowie die Ein- und Ausgabe in der Hand (I/O) zu ermöglichen. Er ist vielseitig einsetzbar und für eine Vielzahl von Anwendungen konzipiert.
Zu den wichtigsten Funktionen gehören:
- 2 Tasten zur Benutzereingabe,
- 1 Kalibrierungstaste,
- 1 Ein-/Standby-Taste
- 2 Status-LEDs
- USB-C-Ladeanschluss
- Funkkommunikation mit bis zu 1 kHz
- 10-12 Stunden Akkulaufzeit
- Bis zu 8 VerseGrip-Stifte können über ein Band mit einem Dongle gekoppelt werden

Kundensupport
Bei Fragen oder Anliegen zu Ihrem Gerät oder dessen Betrieb wenden Sie sich bitte an unser Support-Team. Der VerseGrip Stylus enthält komplexe, proprietäre Funktechnik. Das Öffnen des Geräts führt zum Erlöschen Ihrer Garantie und kann dazu führen, dass das Gerät nicht mehr funktioniert. Um längere Versandzeiten und teure Reparaturen zu vermeiden, ÖFFNEN SIE DAS GERÄT NICHT.
Einrichtung und Kalibrierung des VerseGrip-Stifts
In diesem Abschnitt werden die Schritte zum Einstecken des Dongles, zum Einschalten des VerseGrip Stylus und zur Kalibrierung beschrieben.
Einrichtung
- Stecken Sie den Dongle in einen USB-Anschluss Ihres Computers.
- Legen Sie den Griff auf eine ebene Fläche, auf der er nicht verrutscht, wobei die Tasten nach oben zeigen und der Kugelanschluss zum Bildschirm gerichtet ist.
Einschalten und Kalibrierung
- Drücken Sie einmal die Ein-/Aus-Taste. Die Statusanzeige leuchtet zunächst rot und wechselt dann zu Gelb, was anzeigt, dass die IMU im Gerät eine Selbstkalibrierung durchführt.
- Nach der Selbstkalibrierung stellt der Stylus eine Verbindung zum Computer her.
- Sobald der Stylus erfolgreich verbunden ist und Daten drahtlos überträgt, blinkt die Statusleuchte grün.
- Wenn der Akku fast leer ist, schaltet sich der VerseGrip Stylus alle 2 Minuten automatisch aus; laden Sie ihn bitte sofort auf.
Neukalibrierung
Der Kalibrierungsvorgang setzt das Koordinatensystem von VerseGrip zurück, sodass die Richtung, in der das Gerät während der Kalibrierung gehalten wird, zur neuen Referenzachse wird.
- Um eine Neukalibrierung durchzuführen, halten Sie den Stylus in der Position, auf die Sie ihn neu kalibrieren möchten, und drücken und halten Sie die Kalibrierungstaste drei Sekunden lang oder bis sich die Ausrichtung in der Simulation ändert.
Im Folgenden wird eine Demonstration gezeigt, in der das Verhalten des Geräts im unkalibrierten und im kalibrierten Zustand verglichen wird. Für unsere Demonstrationen muss VerseGrip vor der Kalibrierung in der abgebildeten Konfiguration gehalten werden.

Standby und Ausschalten
- Drücken Sie die Ein-/Aus-Taste einmal, um in den Standby-Modus zurückzukehren. Die Statusanzeige beginnt weiß zu blinken, und die Datenübertragung wird beendet.
- Um den VerseGrip Stylus auszuschalten, halten Sie die Ein-/Aus-Taste 5 Sekunden lang gedrückt und lassen Sie sie dann los. Nach dem Loslassen sollte die Statusanzeige erlöschen, und es wird nichts mehr angezeigt. Die Datenübertragung wird dabei beendet.
Laden
- Schließen Sie den VerseGrip Stylus über den USB-C-Ladeanschluss an die Stromversorgung an.
- Die Ladezustandsanzeige leuchtet bei angeschlossener Stromversorgung dauerhaft blau und erlischt, sobald der Akku vollständig geladen ist.
- Ist der Stylus ausgeschaltet, schaltet er sich automatisch ein, sobald Sie ihn an die Stromversorgung anschließen.
WARNUNG: Bei VerseGrip Stylus-Geräten, die zwischen August und Dezember 2024 ausgeliefert wurden, lassen Sie den Akku nicht vollständig entladen. Sobald der Akku leer ist, kann er unter Umständen keine Ladung mehr halten. In diesem Fall funktioniert der VerseGrip Stylus weiterhin, solange er angeschlossen ist. Wenden Sie sich an den Haply-Support, um die Firmware-Update-Datei zur Behebung dieses Problems zu erhalten.
Zustände und Leuchtanzeigen
| Farbe | Lichtsequenz | Beschreibung |
|---|---|---|
| Gelb | Schnelles Ein-/Ausblenden | Automatische Erstkalibrierung der Sensorreferenz (VerseGrip bewegungslos auf den Tisch legen) |
| Schnelles Blinken | Ausrichtungs- und Kalibrierungstaste gedrückt, Kalibrierungsvorgang gestartet | |
| Dauerhaft | Ausrichtungs- und Kalibrierungstaste gedrückt, Kalibrierung abgeschlossen | |
| Rot | Schnelles Ein-/Ausblenden | Adapter getrennt, kein Signal vom Host |
| Schnelles Blinken | Ein-/Aus-Taste gedrückt, Abschaltvorgang gestartet | |
| Grün | Ein-/Ausblenden | Adapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus |
| Dauerhaft | Adapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus, USB-Stromversorgung angeschlossen | |
| Weiß | Ein-/Ausblenden | Adapter angeschlossen, VerseGrip im Leerlauf-/Standby-Modus ohne Datenübertragung |
| Dauerhaft | Adapter angeschlossen, VerseGrip im Leerlauf-/Standby-Modus ohne Datenübertragung, USB-Stromversorgung angeschlossen | |
| Orange | Blitz (verschachtelt) | Warnmeldung bei niedrigem Akkustand, Benachrichtigung im aktuellen Zustand verschachtelt |
| Doppelblitz (verschachtelt) | Warnmeldung bei kritisch niedrigem Akkustand, Benachrichtigung im aktuellen Zustand verschachtelt | |
| Türkis | Ein-/Ausblenden | Firmware-Update-Modus des Geräts |
| (Heller) | Dauerhaft | Benutzertasten gedrückt, aktuelle Anzeigefarbe ist dauerhaft und heller |
| Aus | Keine Leuchte | Herunterfahren, Ausschalten |
| Farbe der Ladeanzeige | Lichtsequenz | Beschreibung |
|---|---|---|
| Blau | Dauerhaft | Laden |
| Schnelles Blinken | Ladevorgang fast abgeschlossen | |
| Aus | Keine Leuchte | Ladevorgang abgeschlossen |
Frühere Zustände und Leuchtanzeigen
Die folgenden Statusleuchten entsprechen älteren Zuständen und Farben, die in früheren Versionen des VerseGrip Stylus (Firmware 1.10 und älter) vorkamen.
| Farbe | Lichtsequenz | Beschreibung |
|---|---|---|
| Rot | Dauerhaft | Initialisierung der Komponenten steht noch aus |
| Blinken | Standby-Modus. Keine Datenübertragung | |
| Blau | Dauerhaft | Automatische Erstkalibrierung der Sensorreferenz (VerseGrip bewegungslos auf den Tisch legen) |
| Grün | Blinken | Adapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus |
| Aus | Keine Leuchte | Herunterfahren, Ausschalten |
| Farbe der Ladeanzeige | Lichtsequenz | Beschreibung |
|---|---|---|
| Blau | Dauerhaft | Laden |
| Schnelles Blinken | Ladevorgang fast abgeschlossen | |
| Aus | Keine Leuchte | Ladevorgang abgeschlossen |
Beispielcode
Hier ist ein einfaches Beispiel dafür, wie Sie den VerseGrip Stylus mit C++ verwenden können.
#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);
}
}