{"id":31195659,"url":"https://github.com/berg0162/ble-steering-server","last_synced_at":"2026-05-19T14:33:22.501Z","repository":{"id":313617010,"uuid":"977023312","full_name":"Berg0162/BLE-Steering-Server","owner":"Berg0162","description":"An open-source project that explores various human interface devices (HID) for steering control in virtual cycling platforms.","archived":false,"fork":false,"pushed_at":"2025-09-07T09:50:31.000Z","size":1665,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-07T11:33:15.693Z","etag":null,"topics":["cycling","esp32","open","server","steering","virtual"],"latest_commit_sha":null,"homepage":"https://github.com/Berg0162/BLE-Steering-Server","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Berg0162.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-03T08:47:28.000Z","updated_at":"2025-09-07T09:50:34.000Z","dependencies_parsed_at":"2025-09-07T11:33:17.907Z","dependency_job_id":"ced9c353-f7f9-4bc9-8933-7384803facc1","html_url":"https://github.com/Berg0162/BLE-Steering-Server","commit_stats":null,"previous_names":["berg0162/ble-steering-server"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Berg0162/BLE-Steering-Server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Berg0162%2FBLE-Steering-Server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Berg0162%2FBLE-Steering-Server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Berg0162%2FBLE-Steering-Server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Berg0162%2FBLE-Steering-Server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Berg0162","download_url":"https://codeload.github.com/Berg0162/BLE-Steering-Server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Berg0162%2FBLE-Steering-Server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276042121,"owners_count":25574999,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cycling","esp32","open","server","steering","virtual"],"created_at":"2025-09-20T03:46:57.977Z","updated_at":"2025-09-20T03:46:59.072Z","avatar_url":"https://github.com/Berg0162.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cimg src=\"/media/ESP32_Icon.png\" width=\"110\" height=\"34\" align=\"bottom\" alt=\"ESP32 Icon\"\u003e Open Virtual Steering - BLESteeringServer\nThe **Romans** knew it already **`\"Sterzare Necesse Est\"`** (free after Plutarch) and it is still valid in a **virtual cycling world**.\u003cbr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWhat it means\u003c/summary\u003e\n  \nThe 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).\u003cbr\u003e\n\n+ More autonomy: increased user-experience\n  + Ride the optimal line through a corner\n  + Turn left or right at intersections\n  + Tactical positioning in a group\n\u003c/details\u003e\n\n**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**.\nIt provides examples of alternative input methods for **navigating and positioning a cycling avatar** in a virtual world.\n\n## 📦 What Is This?\n\n**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**.\n\nIt 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.\n\n![Open Virtual Steering Diagram](/media/OpenVirtualSteering_Overview.png)\n\n## 📚 Related OVS Repositories\n\nThis 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.\n\n| HID Focus | Bluedroid/NimBLE Repository | Bluefruit Repository |\n|-----------|-------------------|----------------------|\n| 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) |\n| Turn \u0026 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) |\n| Voice-activated steering with TinyML | [`OVS-VoiceControl`](https://github.com/Berg0162/Open-Virtual-Steering-VoiceControl) | ℹ️ |\n\u003e ℹ️ 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.\n\n## ℹ️ nRF52 Bluefruit-Host Support\n**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)\n\n## 🪄 ESP32 BLE Hosts\n\nThe ESP32 platform supports two different Bluetooth LE host stacks:\n\n- **ESP-Bluedroid**  \n  Supports both **Classic Bluetooth** and **Bluetooth Low Energy**.  \n  Larger memory footprint, but more complete feature set.\n\n- **ESP-NimBLE**  \n  Supports **Bluetooth Low Energy only**.  \n  Much lighter on heap and flash usage, preferred on newer chips (ESP32-S3, ESP32-C3, …).\n\n🔍 **This library auto-detects which host is enabled (Bluedroid or NimBLE) at compile time.**  \nThere is no user configuration needed — it selectively compiles the correct implementation for the board and Arduino-ESP32 core you are using.\n\n## ❓ What is ESP-Bluedroid?\n**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.\n**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.\nThe 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.\n\n+ API references:\u003cbr\u003e\n    + [Arduino-ESP32 BLE for Arduino](https://github.com/espressif/arduino-esp32/tree/master/libraries/BLE)\n\n## 🔧 How the code works\n\nWith the **BLESteeringServer** library installed, developers can easily create applications that act as **dedicated BLE steering controllers** for use with **virtual cycling platforms**.\n\nThe 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.\n\nOnce paired with a BLE client, the application uses `BLESteeringServer::updateSteeringValue()` to transmit real-time **steering angle data** over Bluetooth.\n\nTo 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.\n\n\u003cdetails\u003e\n\u003csummary\u003e🔍 More Info\u003c/summary\u003e\n    \n[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/)\n\n\u003c/details\u003e\n\n## 🧱 Dependencies\n\n+ [Arduino core for ESP32](https://github.com/espressif/arduino-esp32)\n\n+ **Supported MCU's** with **Bluedroid**\n    - On older ESP32 chips (ESP32, ESP32-S2), Bluedroid is traditionally enabled.\n    - On newer chips (ESP32-S3, ESP32-C3, ESP32-C6), Espressif moved toward NimBLE by default (lower memory footprint, better performance).\n\n## 🚴‍♂️ Quick start?\n\n+ Install the **BLESteeringServer library** from this repository. Download as `.zip` and extract to `Arduino/libraries` folder, or \u003cbr\u003ein \u003cb\u003eArduino IDE\u003c/b\u003e from `Sketch menu` -\u003e `Include library` -\u003e `Add .Zip library`\u003cbr\u003e\n+ 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**.\n\n## ⚠️ Disclaimer\n\u003cdetails\u003e\n\u003csummary\u003e 💡 \u003cb\u003eResearch \u0026 Independence\u003c/b\u003e\u003c/summary\u003e\nThis project is \u003cb\u003enot affiliated with, endorsed by, or associated with any commercial virtual cycling platform or steering device manufacturer\u003c/b\u003e. It is a \u003cb\u003eresearch and interoperability\u003c/b\u003e initiative designed to explore \u003cb\u003ealternative human interface methods\u003c/b\u003e in the context of indoor cycling. All development is conducted independently for \u003cb\u003eeducational and experimental purposes\u003c/b\u003e.\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e ✅ \u003cb\u003eCompliance \u0026 Responsibility\u003c/b\u003e\u003c/summary\u003e \nThis repository does \u003cb\u003enot include or promote any circumvention of technological protection measures\u003c/b\u003e, reverse engineering of proprietary software, or unauthorized access to restricted systems. Users are \u003cb\u003esolely responsible\u003c/b\u003e for ensuring that their use of this code complies with \u003cb\u003elocal laws, software licenses, and platform terms of service\u003c/b\u003e.\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e 🔍 \u003cb\u003eCopyright \u0026 Contact\u003c/b\u003e\u003c/summary\u003e\nIf you are a \u003cb\u003erights holder\u003c/b\u003e and believe that this project includes content that \u003cb\u003eviolates your intellectual property rights\u003c/b\u003e, please \u003cb\u003eopen an issue\u003c/b\u003e on this repository to initiate a respectful review. We are committed to responding promptly and, if appropriate, taking corrective action.\n\u003c/details\u003e\n\n## 🧪 Testing \u0026 Validation\nThe 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.  \n\n## 🔧 Basic Usage\n\n```cpp\n#include \u003cBLESteeringServer.h\u003e\n\nvoid setup() {\n    BLESteeringServer::getInstance().begin();\n}\n\nvoid loop() {\n    float angle = getSteeringAngleFromHID();\n    BLESteeringServer::getInstance().updateSteeringValue(angle);\n}\n```\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e⚖️ \u003cb\u003eLegal Notice (EU Context)\u003c/b\u003e\u003c/summary\u003e\n\nThis 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).  \n\nNo 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**.  \n\nUsers must ensure their own compliance with **national implementations of EU directives**, and are responsible for how they apply or modify this code.\n\n\u003c/details\u003e\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberg0162%2Fble-steering-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fberg0162%2Fble-steering-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberg0162%2Fble-steering-server/lists"}