The UNO Q EchoGlow is an AI-powered desktop light controlled by voice commands. It detects the keywords "Warmer-light", "Cooler-light", "Dimmer", and "Brighter" through an analog microphone connected directly to the Arduino UNO Q, and controls a NeoPixel strip connected via the onboard Qwiic port. These commands are trained on Edge Impulse’s platform and uploaded to the Arduino UNO Q inside the EchoGlow. Be sure to visit the project every now and then to check for updates and downloads:
This setup uses the analog microphone input of the Arduino UNO Q instead of a USB microphone (unlike the standard keyword-spotting example), requiring a one-time board configuration before launching the app.
https://hackaday.io/project/205386-arduino-uno-q-echoglow
keyword_spotting— detects sound patterns and triggers an event when a keyword is matched.
- Arduino® UNO Q
- SupplyFrame analog microphone board (connected to the analog mic input)
- SupplyFrame NeoDriver I2C board (address
0x60) with NeoPixel strip, connected to the Qwiic port
- Arduino App Lab
- One-time board setup — see Setup below
This step is required once per board. It configures the ALSA audio subsystem, creates the device symlink expected by
arduino-app-cli, and patches the Docker image to support the analog microphone.
Clone the repository on the Arduino UNO Q and run the setup script:
sudo git clone https://github.com/ElectronicCats/Qualcomm-Arduino-Edge-WS2026
cd Qualcomm-Arduino-Edge-WS2026
sudo Software/setup-arduino-q-mic-applab.shAfter the script completes, reboot the board:
sudo rebootThe script copies this example to /home/arduino/ArduinoApps/ automatically. If you need to re-deploy it manually:
sudo Software/setup-arduino-q-mic-applab.sh --deploy-exampleWhen running this firmware, only the analog microphone is available (no USB microphone). To revert this, format the UNO Q.
- Connect the analog microphone board to the analog mic input of the Arduino UNO Q.
- Connect the SupplyFrame NeoDriver I2C board to the Qwiic port on the Arduino UNO Q.
- Connect a NeoPixel strip to the NeoDriver (up to 5 pixels supported out of the box).
-
Open Arduino App Lab and connect to the board using Network Mode.
-
Open this example and click the Play button in the top right corner.
-
Wait for the app to launch.
-
Say one of the voice commands into the microphone.
| Keyword | Action |
|---|---|
| Warmer-light | Sets NeoPixel color to warm white (RGB 255, 194, 138) |
| Cooler-light | Sets NeoPixel color to cool white (RGB 144, 213, 255) |
| Brighter | Increases brightness by 40% |
| Dimmer | Decreases brightness by 40% |
The keyword_spotting Brick continuously monitors the analog microphone input. When a keyword is detected, it calls the microcontroller via the Bridge, which adjusts the NeoPixel strip accordingly. The NeoPixel starts at neutral white (RGB 255, 255, 255) at boot.
The Arduino UNO Q uses a Qualcomm QRB2210 SoC with a Qualcomm LPASS audio DSP (Q6ASM). This DSP resets all ALSA mixer controls to off every time an audio capture session closes. The setup script:
- Configures the ALSA mixer and installs a systemd service that re-applies the configuration at boot.
- Creates the
/dev/snd/by-iddevice symlink expected byarduino-app-clito detect the microphone. - Patches the Docker image used by
arduino-app-cliso that its PythonMicrophoneclass re-runs the mixer setup before opening each PCM session, and uses the full ALSA device name (plughw:CARD=ArduinoImolaHPH,DEV=2) required inside containers.
Python side (python/main.py):
spotter = KeywordSpotting()— initializes the audio listener on the analog mic input.spotter.on_detect("Warmer-light", ...)— registers a callback for each keyword.Bridge.call("warmer_light")— notifies the microcontroller which keyword was detected.
Microcontroller side (sketch/sketch.ino):
seesaw_NeoPixel strip(..., &Wire1)— the NeoDriver is onWire1, which maps to the Qwiic port on the UNO Q.Bridge.provide("warmer_light", warmer_light)— registers the handler called by the Python side.warmer_light()/cooler_light()— set the NeoPixel color to warm or cool white.brighter()/dimmer()— increase or decrease the global brightness by 40%.

