An open API service indexing awesome lists of open source software.

https://github.com/berg0162/ble-steering-server

An open-source project that explores various human interface devices (HID) for steering control in virtual cycling platforms.
https://github.com/berg0162/ble-steering-server

cycling esp32 open server steering virtual

Last synced: about 1 month ago
JSON representation

An open-source project that explores various human interface devices (HID) for steering control in virtual cycling platforms.

Awesome Lists containing this project

README

          

# ESP32 Icon Open Virtual Steering - BLESteeringServer
The **Romans** knew it already **`"Sterzare Necesse Est"`** (free after Plutarch) and it is still valid in a **virtual cycling world**.

What it means

The phrase is a playful remix of the Latin saying **"Navigare Necesse Est"** ("To sail is necessary"). Replacing _Navigare_ with [**Sterzare**](https://en.wiktionary.org/wiki/sterzare) β€” the Italian verb for _steering_ β€” reflects the project’s goal: enhancing interaction through alternative Human Interface Devices (HIDs).

+ More autonomy: increased user-experience
+ Ride the optimal line through a corner
+ Turn left or right at intersections
+ Tactical positioning in a group

**Open Virtual Steering (OVS)** is an open-source project that explores interfacing with various **Human-Interface-Devices (HID)** for the **use case of steering control** in **virtual cycling platforms**.
It provides examples of alternative input methods for **navigating and positioning a cycling avatar** in a virtual world.

## πŸ“¦ What Is This?

**BLESteeringServer** is an open-source, Arduino-compatible C++ library that provides a **reusable Bluetooth Low Energy (BLE) server** implementation for transmitting **steering data** to virtual cycling platforms, for use with the **Espressif ESP32 SoC's** and the **arduino-esp32 core**.

It is designed as a **shared backend** for projects in the **Open Virtual Steering** ecosystem and supports pairing with BLE clients that recognize a known **steering profile** used in commercial platforms.

![Open Virtual Steering Diagram](/media/OpenVirtualSteering_Overview.png)

## πŸ“š Related OVS Repositories

This project allows users to explore a range of input devices for **steering control in virtual cycling worlds**. The emphasis is on **enhancing interactivity and user experience** through both **accessible** and **innovative** control methods.

| HID Focus | Bluedroid/NimBLE Repository | Bluefruit Repository |
|-----------|-------------------|----------------------|
| Buttons, Joysticks, Rotary Encoders | [`OVS-DiscreteHIDs`](https://github.com/Berg0162/Open-Virtual-Steering-DiscreteHID) | [`OVS-DiscreteHIDs-Bluefruit`](https://github.com/Berg0162/Open-Virtual-Steering-DiscreteHID-Bluefruit) |
| Turn & lean-based steering with MPU6050 | [`OVS-MotionIMU`](https://github.com/Berg0162/Open-Virtual-Steering-MotionIMU) | [`OVS-MotionIMU-Bluefruit`](https://github.com/Berg0162/Open-Virtual-Steering-MotionIMU-Bluefruit) |
| Voice-activated steering with TinyML | [`OVS-VoiceControl`](https://github.com/Berg0162/Open-Virtual-Steering-VoiceControl) | ℹ️ |
> ℹ️ The **VoiceControl** project is tightly coupled to the **XIAO ESP32S3 Sense**, which includes a built-in microphone and supports only **ESP32 BLE-Hosts**. A Bluefruit version is not applicable.

## ℹ️ nRF52 Bluefruit-Host Support
**Bluefruit** is Adafruit's branding for its line of development boards and firmware built around Nordic Semiconductor's nRF52 family of Bluetooth Low Energy (BLE) chips. This line is **also** supported by the **Open Virtual Steering** project. See: [Bluefruit-Steering-Server](https://github.com/Berg0162/Bluefruit-Steering-Server)

## πŸͺ„ ESP32 BLE Hosts

The ESP32 platform supports two different Bluetooth LE host stacks:

- **ESP-Bluedroid**
Supports both **Classic Bluetooth** and **Bluetooth Low Energy**.
Larger memory footprint, but more complete feature set.

- **ESP-NimBLE**
Supports **Bluetooth Low Energy only**.
Much lighter on heap and flash usage, preferred on newer chips (ESP32-S3, ESP32-C3, …).

πŸ” **This library auto-detects which host is enabled (Bluedroid or NimBLE) at compile time.**
There is no user configuration needed β€” it selectively compiles the correct implementation for the board and Arduino-ESP32 core you are using.

## ❓ What is ESP-Bluedroid?
**Espressif** has in the past modified a version of the native Android Bluetooth stack and called it: **ESP-Bluedroid**. It is the official Bluetooth stack developed by Espressif, part of the ESP-IDF (Espressif IoT Development Framework). It implements full BLE and Classic Bluetooth functionality.
**ESP32 BLE for Arduino** is an Arduino wrapper around the **Bluedroid stack**, maintained by Espressif in the **arduino-esp32 core**. It provides an **Arduino-friendly BLE API**, allowing users to work with BLE using C++ classes like `BLEServer`, `BLECharacteristic`, etc.
The Arduino BLE classes (e.g., `BLEServer`, `BLECharacteristic`) internally call and depend on the **Bluedroid stack** to manage all Bluetooth operations. So, the Arduino library is a higher-level interface that uses **Bluedroid** under the hood.

+ API references:

+ [Arduino-ESP32 BLE for Arduino](https://github.com/espressif/arduino-esp32/tree/master/libraries/BLE)

## πŸ”§ How the code works

With the **BLESteeringServer** library installed, developers can easily create applications that act as **dedicated BLE steering controllers** for use with **virtual cycling platforms**.

The user application is responsible for interfacing with a **Human Interface Device (HID)** β€” such as buttons, a joystick, an IMU, or voice input β€” and regularly passing steering data to the BLESteeringServer.

Once paired with a BLE client, the application uses `BLESteeringServer::updateSteeringValue()` to transmit real-time **steering angle data** over Bluetooth.

To ensure **interoperability**, the library implements a known **BLE Steering Profile**, which defines a consistent structure of services and characteristics used in commercial BLE steering devices. BLE profiles serve as an **application-layer contract** between the controller (peripheral) and the receiving client (central), ensuring compatibility across devices and platforms.

πŸ” More Info

[Introduction on BLE profiles, services, characteristics, device roles and network topology](https://embeddedcentric.com/lesson-2-ble-profiles-services-characteristics-device-roles-and-network-topology/)

## 🧱 Dependencies

+ [Arduino core for ESP32](https://github.com/espressif/arduino-esp32)

+ **Supported MCU's** with **Bluedroid**
- On older ESP32 chips (ESP32, ESP32-S2), Bluedroid is traditionally enabled.
- On newer chips (ESP32-S3, ESP32-C3, ESP32-C6), Espressif moved toward NimBLE by default (lower memory footprint, better performance).

## πŸš΄β€β™‚οΈ Quick start?

+ Install the **BLESteeringServer library** from this repository. Download as `.zip` and extract to `Arduino/libraries` folder, or
in Arduino IDE from `Sketch menu` -> `Include library` -> `Add .Zip library`

+ Select one of the _**Related Repositories**_ that apply this **shared backend** and offer you **ready-to-use exemplary access** to a selection of different **Human-Interface-Devices**.

## ⚠️ Disclaimer

πŸ’‘ Research & Independence
This project is not affiliated with, endorsed by, or associated with any commercial virtual cycling platform or steering device manufacturer. It is a research and interoperability initiative designed to explore alternative human interface methods in the context of indoor cycling. All development is conducted independently for educational and experimental purposes.

βœ… Compliance & Responsibility
This repository does not include or promote any circumvention of technological protection measures, reverse engineering of proprietary software, or unauthorized access to restricted systems. Users are solely responsible for ensuring that their use of this code complies with local laws, software licenses, and platform terms of service.

πŸ” Copyright & Contact
If you are a rights holder and believe that this project includes content that violates your intellectual property rights, please open an issue on this repository to initiate a respectful review. We are committed to responding promptly and, if appropriate, taking corrective action.

## πŸ§ͺ Testing & Validation
The functionality of **Open Virtual Steering with BLESteeringServer** was tested using **standard BLE debugging tools** to ensure proper communication and responsiveness. One of the primary tools used was **nRF Connect for Mobile**, a widely available application for **scanning, connecting, and interacting with BLE devices**. This allowed for **verification of characteristic read/write operations, response timing, and general stability** of the BLE communication.

## πŸ”§ Basic Usage

```cpp
#include

void setup() {
BLESteeringServer::getInstance().begin();
}

void loop() {
float angle = getSteeringAngleFromHID();
BLESteeringServer::getInstance().updateSteeringValue(angle);
}
```
---

βš–οΈ Legal Notice (EU Context)

This project is developed and published in accordance with **EU directives** that recognize the right to study, test, and develop software components for the purpose of achieving **interoperability** (e.g., Directive 2009/24/EC on the legal protection of computer programs, Article 6).

No part of this project is intended to **infringe upon intellectual property rights** or violate technological protection measures. All content is shared in good faith under the belief that it falls within the bounds of **legitimate research, reverse engineering for interoperability, and fair use under EU law**.

Users must ensure their own compliance with **national implementations of EU directives**, and are responsible for how they apply or modify this code.

---