Fox Red Labs / Builds / Edge AI
Detect a smoke alarm's beep pattern on the LP-MSPM0G5187
It has heard only recorded alarm sounds from a laptop speaker and over USB; a real alarm was not tested.
HardNo wiring1 evening
Parts and steps
You need
- LP-MSPM0G5187 LaunchPad development kit the listener: microphone, NPU and buttons on one board
- A smoke or CO alarm with a test button the alarm it learns
- A Mac build, flash and the notification
Set up your computer once: 1 step. Done already? Start at step 2.
Install the tools in the list above, then get a copy of this repository.TERMINAL
To fetch only the board folder, use the sparse-checkout line in its README. The trained model is already compiled for the NPU in
mspm0g5187/alarm/model/nnc_g5187_npu/, so no training is needed.You should see:
ls mspm0g5187/alarm/model/nnc_g5187_npulistsmod.aandtvmgen_default.h.
Build the listener.TERMINAL
The script copies one of TI's SDK examples for its makefile and puts the listener's code in. It links the NPU model and CMSIS-DSP, and builds in a scratch folder under your home folder.
Replace <repository folder> before you run this.
cd <repository folder> APP=detect bash mspm0g5187/alarm/build.shYou should see: A size line with text 80608 and bss 30417, which is 78.7 kB of flash and 29.7 kB of RAM, then
image: mspm0g5187/alarm/out/alarm_detect.out.Plug the board into the Mac and read its probe serial number: it is the text after usbmodem without the last digit.BENCH
ls /dev/cu.usbmodem*You should see: Two lines with the same text, ending in 1 and 4, for example
/dev/cu.usbmodem<probe serial>1and/dev/cu.usbmodem<probe serial>4.Flash it.TERMINAL
Make a copy of the connection file with your probe serial number in its name and inside it. The command below does both; replace
<probe serial>with yours from step 3. Then load the image with UniFlash's command line. This is the board README's tested flash command with the listener's image in place of the blink.Replace <probe serial> and <template serial> before you run this.
PROBE=<probe serial> sed "s/<template serial>/$PROBE/g" mspm0g5187/MSPM0G5187_<template serial>.ccxml > mspm0g5187/MSPM0G5187_$PROBE.ccxml /Applications/ti/uniflash_9.6.0/dslite.sh --mode flash -c mspm0g5187/MSPM0G5187_$PROBE.ccxml -e -f -v -u mspm0g5187/alarm/out/alarm_detect.outYou should see: The flash ends without an error in about 5 s, and the green LED gives a short blink every 2 seconds, which means the board is listening. The LED lines are in
detect.h, in the main loop.Start the listener's Mac script on the first serial port, the one ending in 1.TERMINAL
It logs every line and turns an alarm into a Mac notification. Leave it running.
Replace <probe serial> before you run this.
PROBE=<probe serial> python3 mspm0g5187/alarm/host/listen.py --port /dev/cu.usbmodem${PROBE}1 --log ~/alarm.logYou should see: The terminal stays quiet while the room is quiet.
tail -f ~/alarm.login a second window shows oneI n=... cls=otherline a second.Put the board beside your alarm, where it will stay.BENCH
Press S2 once and the blue LED blinks fast. Then press and hold the alarm's test button until it has sounded for about 10 seconds. Ear protection helps; smoke alarms are loud up close.
You should see:
LEARNED cls=smoke f0=... L0=... savedin the terminal and the blue LED stops; the record is kept through a power cut. Not done with a real alarm: in these runs the learn step used alarm sound sent over USB. The 10 seconds is the expected time: four inferences that hear the pattern. It is not a measured time.Press the alarm's test button again.BENCH
Then press S2 once to clear the alarm.
You should see:
ALARM smoke from the learned alarmand the red LED on. Expected about 10 s after the sound starts; measured 9.4 s with a laptop speaker and nothing learned. The script also raises a Mac notification; these runs did not record one. S2 printsCLEARED.
Or hand it to a coding assistant
Paste this in a terminal. It hands off to an AI assistant.
git clone --depth 1 --filter=blob:none https://github.com/Fox-Red-Labs/fox-red-labs.git && cd fox-red-labs
./start.sh mspm0g5187 alarm-listener --assistant claudegit clone --depth 1 --filter=blob:none https://github.com/Fox-Red-Labs/fox-red-labs.git && cd fox-red-labs
py start.py mspm0g5187 alarm-listener --assistant claudeIt runs the steps above and reports what it saw.
Not Claude Code? Copy this prompt instead.
If something goes wrong
mod.a is missing | The clone did not bring the model; it is tracked in the repository, so clone again. |
It cannot find spi_controller_echo_interrupts or tiarmclang | The SDK or CCStudio is not in its default folder; the two paths are at the top of build.sh. |
| Nothing listed | The cable or adapter is charge-only; swap it. |
| DSLite cannot find the probe | The serial number in the .ccxml does not match yours. |
| `ModuleNotFoundError | No module named 'serial'`: install pyserial, as in the list above. No lines in the log: check that the port ends in 1 and not 4. |
More troubleshooting
| `LEARN FAILED | No smoke or CO pattern heard in 45 s: hold the test button longer, or move the board closer. To start over, hold S2 for 5 s until FORGOT: generic mode`. |
| `IGNORED | Too quiet` means the board is farther from the alarm than when it learned; learn again in its final place (FAQ). |
What to build next
Every build. The code for all of them is in the GitHub repository.
Evidence and limitsThe MSPM0 G5187 reported a smoke alarm pattern from a laptop speaker 9.4 s after it started, through its own microphone, and gave 0 alarms in 3.4 hours of a quiet room. Learning has run only on audio sent over USB; a real alarm's horn is the test still to run. Ran on 1 board. Results, sources, timing and limits.
Expected result: Expected from the speaker and USB runs, and not seen with a real alarm: your alarm's test sound is reported as smoke, or as CO for a CO alarm, about 10 s after it starts. Beeping from a TV, a kettle, a whistle, a phone or an oven timer is not reported. Neither is the same alarm pattern played quieter or at another pitch.
What this shows
- A 13.8k-parameter model runs on the MSPM0G5187's NPU, on its own microphone, once a second. It takes 20.2 ms per inference in the self-test and 32.4 ms median live, and keeps up in real time.
- With nothing learned it reported a smoke alarm pattern from a laptop speaker 9.4 s after it started, and stayed silent through 3.4 hours of a quiet room, 12.1k inferences.
- With an alarm learned, on audio streamed over USB and no sound played, it ignored 18 of 18 look-alike sounds. These were oven timers, backup beepers, whistles, a kettle, ringtones, speech and music. It also ignored the same alarm 31 dB quieter, and the same pattern at 3,600 Hz instead of 3,150 Hz.
- The learned-alarm rules were applied afterwards to the board's logged answers from the speaker run. They silenced all 16 look-alikes and the same alarm about 22 dB quieter, and still passed the alarm. It was a replay of logged answers; nothing was decided live.
- It tells smoke (three beeps) from CO (four short pulses) on the same horn.
What this does not establish, and limits
What this does not establish
- That it learns a real smoke alarm's horn: every alarm sound was synthetic, from a laptop speaker or sent over USB. A real horn has harmonics and sometimes a warble that the training never heard.
- False alarms over weeks in a busy house: 3.4 hours of a quiet room and 2 hours of held-out synthetic scenes are what was measured.
- Doorbells: there is no standard doorbell pattern, and none was built.
- That it replaces a connected or monitored alarm. It is a demonstration and is not a listed safety device.
Limits to keep in mind
- On this board PB10 and PB11 are both the microphone's clock lines and the BP-CC1407P radio's reset and interrupt wires. The listener and that radio cannot share J20 as wired here.
- The Mac script is the notification path in this version; the board on its own only lights its red LED.
- Placement matters: it learns how loud the alarm is where the board sits, and ignores anything more than 10 dB quieter. Move the board and learn again.
Sources
Why this board
The MSPM0 G5187 is the one board here with a microphone, an audio converter and a neural network accelerator on it, so the listener needs no extra parts.
Versions, sizes and timing
| Model | Five-layer 1-D CNN, 13.8k parameters, 8-bit quantization-aware training, compiled with TI's NNC for the TinyEngine NPU; 16 inputs by 128 frames (8.3 s); answers other, smoke, CO once a second | the data |
|---|---|---|
| Inference | 20.2 ms per inference in the self-test (6 of 6 classes matched onnxruntime); 32.4 ms median over 443 inferences in the live run | |
| Audio | Onboard ICS-40720 microphone into the PCM1809, I2S at 47,619 Hz, filtered to 15,873 Hz; 13 features every 64.5 ms from two 512-point FFTs (CMSIS-DSP) | README notes |
| Decision | 6 of the last 8 answers agree, the NFPA 72 timing check passes, and once learned the tone is within 4 % and the level no more than 10 dB below the learned one | README notes |
| Image | 78.7 kB of flash of 128 kB, 29.7 kB of RAM of 32 kB, from tiarmsize on the 2026-10-13 build | |
| Tools | MSPM0 SDK 2.11.00.07, TI Arm Clang 5.1.1.LTS, SysConfig 1.26.3, UniFlash 9.6.0, Intel Mac, macOS 15.7 | MSPM0G5187 alarm listener notes |
Evidence
- On 2026-10-13 a laptop speaker beside the board played 16 look-alike sounds and a smoke alarm pattern through the board's own microphone. The pattern was reported as smoke 9.4 s after it started; 14 of the 16 look-alikes stayed silent with nothing learned. Nothing was learned live in this run.
- Audio was streamed over USB onto real room sound, with no sound played. The board learned a smoke alarm, saved it and alarmed on it. It ignored 18 of 18 look-alikes, the same alarm 31 dB quieter, another pitch and a CO pattern.
- The two look-alikes that alarmed were CO-like patterns; after a fix to the CO timing check both stay silent, and a CO pattern from the learned horn is reported as CO.
Other boards
- MSPM0G3507, CC2340R5could work
- MSPM0L1306, F2800137not assessed
What the status words mean
Works ran here and did what it shouldCould work some of it ran; real porting effort is left; hover for whatNot for this chip the chip or its vendor software cannot; hover for why
Result grid
Works ran here and did what it shouldShould work it builds; only naming, packaging or build glue is in the way; hover for whichCould work some of it ran; real porting effort is left; hover for whatNot for this chip the chip or its vendor software cannot; hover for why
Experiments (1)
| Status | What was tried | Result |
|---|---|---|
| Can the LP-MSPM0G5187's NPU learn your smoke or CO alarm by ear and ignore every other sound? MSPM0 G5187, 2026-10-13 | A 13.8k-parameter model on the MSPM0 G5187's NPU, listening through the onboard microphone, reported a smoke alarm pattern from a laptop speaker 9.4 s after it started, kept 14 of 16 look-alike sounds silent with... |
Source files
Code brought from elsewhere
This project uses code that was written for other chips or tools. Each links to how to get it running.
- Matter smoke and CO alarm over Thread on the LP-EM-CC2755P10 Works TI's Matter lighting app rebuilt as a smoke and CO alarm boots on the CC2755P10, exposes the smoke alarm cluster and changes state from a UART line 20 of 20 times.
- Zigbee smoke and CO alarm on the LP-EM-CC2340R5 Works A Zigbee smoke and CO alarm joins Home Assistant as one device on the CC2340R5, with no custom Home Assistant code.
Get the code and tell us how it wentThe clone command, the board folder with its AGENTS.md, reports from others, and the three report forms.
Get the code
Clone the repository and open the board's folder below. AGENTS.md is a plain text file of notes for AI coding assistants, and llms.txt at the root indexes the site for one.
git clone https://github.com/Fox-Red-Labs/fox-red-labs.git
- LP-MSPM0G5187: folder
mspm0g5187/.- README: the board's lab notebook (what was run, in order)
- Notes for an AI coding assistant working in this repository: notes for an AI assistant; copy it into your own project if you use one
- FAQ: errors and fixes
Code is BSD-3-Clause, writing is CC BY 4.0; third-party folders keep their own licenses.
Built it? Tell us
Built this, or got stuck? Report it on GitHub with a few short answers. Your report shows here in your words, marked as yours. A failure that repeats on the bench gets its fix here.