Skip to content

rolandostar/google-meet-yapper

Repository files navigation

Yapper for Google Meet - ESP32 BLE HID Telephony Controller

A dual-mode HID telephony device using an ESP32-S3 microcontroller that combines USB HID keyboard functionality with multi-client Bluetooth Low Energy for status updates. Designed for seamless integration with video conferencing applications like Google Meet.

Learn more about the design of this project in this blog post: No More ‘Sorry, I Was on Mute’: How I built a DIY hardware solution for Google Meet with ESP32-S3

USB Telephony HID Implementation

For developers interested in building their own telephony HID implementations, this project includes a usb_telephony_quick_start.ino file that demonstrates how to use telephony descriptors with HID. This simplified example provides a foundation for creating custom telephony control devices using standard USB HID telephony usage pages.

Yapper for Google Meet

Features

  • Dual-Mode HID Connectivity: USB HID for sending commands and BLE HID for receiving status updates
  • Multi-Client Bluetooth: Connect to multiple host devices simultaneously via BLE
  • Universal Compatibility: Works with Windows, macOS, Linux, and mobile devices
  • Multiple Input Methods: Touch sensor, mechanical buttons, and rotary encoder
  • Visual Status Feedback: RGB LED strip indicates mute status with customizable brightness
  • Smart State Management: Internal mute state tracking when no Bluetooth devices connected
  • Auto-Reconnection: Automatically reconnects to previously paired devices

Control Mappings

Button Functions

  • Left Button (GPIO 13):
    • Single click: Send Ctrl+Shift+F1 keyboard command (Used by Chroome extension to focus on the call tab)
    • Long press: Send hang up/drop call command
  • Right Button (GPIO 14): Send Ctrl+Alt+H keyboard command

Rotary Encoder Functions

  • Rotation Left: Previous slide (Left Arrow key) / Volume Down
  • Rotation Right: Next slide (Right Arrow key) / Volume Up
  • Single Click: Toggle between volume control and slides control
  • Double-Click: Toggle push-to-talk mode
  • Long Press: Activate Bluetooth pairing mode

LED Status Indicators

MUTED UNMUTED
Muted Unmuted

Dependencies

  • PlatformIO development platform
  • Arduino framework for ESP32

Installation and Setup

Prerequisites

  1. Install Visual Studio Code
  2. Install the PlatformIO extension

Building and Flashing

  1. Clone this repository:
    git clone <repository-url>
    cd google-meet-yapper
  2. Open the project in VS Code with PlatformIO
  3. Connect your ESP32-S3 device via USB
  4. Build and upload:
    • Press Ctrl+Shift+P and run "PlatformIO: Upload"
    • Or use the PlatformIO toolbar buttons

Usage Instructions

Bluetooth Pairing

  1. Enter Pairing Mode: Long press the rotary encoder to enable BLE advertising
  2. On Host Device:
    • Go to Bluetooth settings
    • Search for new devices
    • Look for "ESP32 Mute Control" in the device list
    • Select and pair
  3. Multi-Device Support: Repeat the pairing process for additional host devices

Operation

  • Mute Control: Use touch sensor in toggle or push-to-talk mode
  • Call Control: Use mechanical buttons for various telephony functions
  • Brightness Adjustment: Send serial commands to adjust LED brightness
  • Volume/Slide Control: Use rotary encoder to adjust volume or navigate slides
  • Mode Switching: Single click on rotary encoder to switch between volume and slide control
  • Push-to-Talk: Double-click rotary encoder to enable/disable push-to-talk mode
  • Calibration: Send serial command to calibrate touch sensor sensitivity
  • Status Feedback: LED strip provides visual confirmation of mute status

Pin Configuration & Wiring

Component Function Pin/Terminal ESP32-S3 GPIO Notes
Left Button Mute Toggle Terminal 1 GPIO 13 Internal pull-up enabled
Terminal 2 GND
Right Button Call Drop/Hang Up Terminal 1 GPIO 14 Internal pull-up enabled
Terminal 2 GND
Rotary Encoder Channel A (CLK) CLK GPIO 5 Internal pull-up enabled
Channel B (DT) DT GPIO 6 Internal pull-up enabled
Push Switch SW GPIO 7 Internal pull-up enabled
LED Strip (APA102) Data Line DI GPIO 11 SPI Data
Clock Line CI GPIO 12 SPI Clock
Touch Sensor Touch Input Signal GPIO 4 Touch-capable pin

Development

Project Structure

ESP32BLEHID/
├── src/                   # Source code
│   ├── main.cpp           # Main application logic
│   ├── communication/     # Bluetooth and HID handlers
│   ├── core/              # Device controller logic
│   └── hardware/          # Hardware abstraction layer
└── include/               # Header files
    ├── config.h           # Configuration constants
    ├── hidmap.h           # HID key mappings
    └── logger.h           # Logging utilities

Hardware Resources

  • Button Label Icons: For custom button labels and hardware modifications, refer to the Google Docs file with button icons that includes printable icons and labels for the various control functions.
  • 3D Models: For 3D printable models of the enclosure and keycaps, check out the thingiverse and OnShape links in the Attributions section below.

Key Configuration Files

  • platformio.ini - PlatformIO project configuration
  • include/config.h - Hardware pin definitions and constants
  • include/hidmap.h - HID key mapping definitions

Contributing

We welcome contributions to improve the project! Please follow these guidelines:

  1. Fork the Repository: Create your own fork of the project
  2. Create a Feature Branch:
    git checkout -b feature/your-feature-name
  3. Make Changes: Implement your improvements
  4. Test Thoroughly: Ensure your changes work across different scenarios
  5. Follow Code Style: Maintain consistency with existing code
  6. Submit Pull Request: Include a clear description of changes

Reporting Issues

  • Use the GitHub Issues tracker
  • Include hardware configuration details
  • Provide steps to reproduce any bugs
  • Include relevant log output when possible

License

This project is released under the BSD 3-Clause License. See the LICENSE file for details.

For information about third-party dependencies and their licenses, see THIRD_PARTY_LICENSES.md.

Attributions

This project builds upon inspiration and code from various open-source projects:

Contact & Support

You can find me on Steam, Discord, LinkedIn and Reddit!

If you like this project, please consider a small donation.

Donate with PayPal button

Made with ❤️

About

ESP32-S3 dual-mode mute button controller: Send mute commands via BLE GATT Compliant "USB" HID and receive status from multiple Bluetooth devices simultaneously. Perfect for video calls with physical mute control and LED status indicator.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors