Zum Hauptinhalt springen

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​

FarbeLichtsequenzBeschreibung
GelbSchnelles Ein-/AusblendenAutomatische Erstkalibrierung der Sensorreferenz (VerseGrip bewegungslos auf den Tisch legen)
Schnelles BlinkenAusrichtungs- und Kalibrierungstaste gedrückt, Kalibrierungsvorgang gestartet
DauerhaftAusrichtungs- und Kalibrierungstaste gedrückt, Kalibrierung abgeschlossen
RotSchnelles Ein-/AusblendenAdapter getrennt, kein Signal vom Host
Schnelles BlinkenEin-/Aus-Taste gedrückt, Abschaltvorgang gestartet
GrünEin-/AusblendenAdapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus
DauerhaftAdapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus, USB-Stromversorgung angeschlossen
WeißEin-/AusblendenAdapter angeschlossen, VerseGrip im Leerlauf-/Standby-Modus ohne Datenübertragung
DauerhaftAdapter angeschlossen, VerseGrip im Leerlauf-/Standby-Modus ohne Datenübertragung, USB-Stromversorgung angeschlossen
OrangeBlitz (verschachtelt)Warnmeldung bei niedrigem Akkustand, Benachrichtigung im aktuellen Zustand verschachtelt
Doppelblitz (verschachtelt)Warnmeldung bei kritisch niedrigem Akkustand, Benachrichtigung im aktuellen Zustand verschachtelt
TürkisEin-/AusblendenFirmware-Update-Modus des Geräts
(Heller)DauerhaftBenutzertasten gedrückt, aktuelle Anzeigefarbe ist dauerhaft und heller
AusKeine LeuchteHerunterfahren, Ausschalten
Farbe der LadeanzeigeLichtsequenzBeschreibung
BlauDauerhaftLaden
Schnelles BlinkenLadevorgang fast abgeschlossen
AusKeine LeuchteLadevorgang 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.

FarbeLichtsequenzBeschreibung
RotDauerhaftInitialisierung der Komponenten steht noch aus
BlinkenStandby-Modus. Keine Datenübertragung
BlauDauerhaftAutomatische Erstkalibrierung der Sensorreferenz (VerseGrip bewegungslos auf den Tisch legen)
GrünBlinkenAdapter angeschlossen, VerseGrip im aktiven Datenübertragungsmodus
AusKeine LeuchteHerunterfahren, Ausschalten
Farbe der LadeanzeigeLichtsequenzBeschreibung
BlauDauerhaftLaden
Schnelles BlinkenLadevorgang fast abgeschlossen
AusKeine LeuchteLadevorgang 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);

}
}