TL;DR
This project isn’t done. It’s not a review. It’s not a how-to. It compares what mmWave sensor modules that I have on hand (and actually work).
Intro
The original goal was for this project was a number of tight battles, a close finish between DIY mmWave sensor modules. There are a lot of them out there, so the opening gauntlet had to be challenging. Yet few contenders actually qualify. This might not be a fair fight…
Contenders
- DIY/ESPHome contenders only.
- presence sensors only (aka “static motion” or “breathing” type)
- a useful static/presence detection range ( <4M isn’t all that useful ) motion range is not what we are testing
A few thoughts on contenders
Coming from the world of PIR, where walking or waving your arms will trigger them. We are not considering mmWave sensors that work in this fashion. Many differentiate between this type of motion (walking/waving) and micro-motion (standing still/sitting/sleeping). We will be looking at the micro-kinesis aspect here and delving deeper into the differences of standing still, sitting still and sleeping (still ).
It is important to understand that many sensor manufacturers advertise a combined detection distance, where micro-motion is mere fraction of can be “seen” by the sensor.
MicRadar do a very good job at depicting this;
The Heavyweight: DFRobot / Leapmmw
Luck of the draw has this sensor being the favorite. With four deployed in production 6+ months; this is the module to dethrone.
Benefits include commonality across three sensors for varying FOV with clear and accurate documentation.
Constraints include price and lack of support from the ODM (Leapmmw).
The Wildcard: Hi-Link
Are these the sensor modules of your dreams? Inexpensive and readily available on AliExpress?
These sensors vary wildly in capability and all suffer from extremely poor documentation. Said documentation is only provided upon request from Hi-Link; a suspicious start. And don’t count on it being particularly readable or accurate. They have confirmed errata based on my testing feedback do other people actually use these??.
LD1115H
This model appears at first to be analogous to the DFRobot. But appearances are skin deep. The lack of any distance configuration parameters will hamper this sensor.
At least is has the typical 2.54mm header spacing.
LD2410
The smallest form factor makes this an interesting sensor module. A narrow FOV also makes this useful for targeted applications. Along with distance configuration parameters, we may have a contender here. But with 1.27mm header spacing, good luck soldering!
LD1125H
This sensor arrived DOA and HLK failed to provide useful support. This is unfortunate because it might have been a better alternative to the LD1115H.
Failed to Qualify
SeeedStudio 24Ghz Human Presence Sensor.
This sensor suffers from extreme sensitivity. I have experienced it detecting motion 50+ feet away and directionality cannot be controlled without a metal box. In order to qualify, a sensor needs to report no motion detection in scenarios where people might be present in other rooms. The SeeedStudio fails this benchmark.
Failed to Consider
Any sensor with <4M presence/static* detection range*check the datasheets folks…
- SeeedStudio 60Ghz Respiratory Heartbeat or Fall Detection sensors.
- MicRadar R60AFDx
Qualifying Gauntlet
In order to qualify for the mmWave Wars, each sensor must prove that it can, not only be sensitive, but reliable. This will be demonstrated using the hardest test for a presence sensor; sleeping.
Why Sleeping?
All presence sensors that rely upon physical movement (PIR/mmWave) must have a target to track. Sleeping generally infers an obscured target with minimal movement. In order to detect this, a sensor must be exceptionally sensitive. Yet being too sensitive means it might not “turn off”. Hence the engineering challenge for any manufacturer.
Some ODM’s might opt for a narrow FOV/distance (looking at you 60Ghz SeeedStudio). Others might choose to refine their detection FFT algorithms. We are here to determine who have performed the latter and to what degree they work in this use-case.
Qualifying Test Setup
LD1115H, LD2410 & DFRobot mounted on a shelf facing the bed. 16" from the foot of the bed and 8’ to the head of the bed.
None of the sensors pass this test with stock settings. The following were used;
DFRobot Qualifying Settings
Minimal settings change necessary. Increase in default sensitivity from 7 to 8.
Since this sensor controls WLED lighting, distance has been increased since it has been determined that its placement will catch you arriving into the room (45° angle from placement). Bonus point goes to the DFRobot.
LD2410 Qualifying Settings
This sensor is much more intuitive to tune as there is a direct correlation between TargetEnergy
and the sensitivity_threshold
. They are the same value. Customized code deployed for a simplified configuration and report of presence (below).
Testing is currently down to single digit % changes in the hopes of finding the sweet-spot.
LD1115H Qualifying Settings
This one gets a little complicated. The LD1115H does not report distance, yet the th3
parameter is “long distance” according to HLK. I have set that value to very low sensitivity as this sensor can otherwise see you coming from a long way away.
It would appear that it triggers presence based on the mov_SNR_target
which is also very sensitive. So this setting is configured for reduced sensitivity as false positives are still present. More tuning needed.
Lastly there is the occ_SNR_target
which maintains presence on micro motion detection. Testing is slow, I only sleep once a day!
Customized code deployed for a simplified configuration and report of presence (below).
Qualifying Results (to date)
Test #1 - presence while sleeping
- A pass should be a continuous report of presence.
Test #2 - no presence while away (I walked in three times)
- A pass should be no false positives when the room is empty
As you can see, the LD2410 & LD1115 are not quite there yet with the LD2410 being much closer to the target.
The LD1115 has been particularly challenging since the sensitivity is already so low that going below 50 appears to be going below the “noise floor” for the deployment. Therefore occ_sn
settings are still being tested as these are not well documented.
Let the Wars Begin?
Not so fast. In the process of getting the various sensors to work, it came to light that they all worked in different ways.
Unlike a PIR where you typically have sensitivity and delay configuration parameters, these sensors may have far more options and they all operate in disparate manners.
For some sensor modules, these configuration parameters are clear-cut. The DFRobot/Leapmmw are this way. You get three knobs; distance, latency and sensitivity. These three knobs control the GPIO detection. That’s it.
For others, you might have a sole sensitivity option that does little; “Seeeeeeeeed”
And then there is Hi-Link. Not only does each sensor have a variety of settings, many are not documented. And each different module operates them in different ways. There is no contenuity in the product lineup much less in how they report movement and static presence as separate thingswhy do I want this? It either sees something or it doesn’t. Am I right…!?.
I have taken existing code and simplified it in order to present a more uniform interface to the sensor module. It detects or it doesn’t. While maintaining global configuration parameters.
Considering that a mere two-wire UART connection can confuse people I believe the global configuration with a single reporting mechanism for movement is best for the testing moving forward.
Let the Wars Begin
TODO: the rest of the post isn’t written yet… …I need a solid third contender first
I see no point in testing unreliable sensor modules. So once we find the top three, we shall see how they hold up to their marketing in the following categories;
Methodology
The competition will;
- be in a clean environment with no fans, not cats, no people.
- test default settings to start.
- tweak settings when they start to fail a test.
- have different sized targets
- that will be tested at different distances
- use a precise servo to move them at varying degrees of movement.
Targets
My thoughts to dates on targets are;
- a head sized target (aka you are in bed with covers up to chin)
- a “obscured torso” sized target (aka, you are at a desk)
- an adult sitting sized target
- an adjust standing sized target
Hypothesis
People assume that that max range listed by the manufacturer means that it has to detect presence when they are in bed, across the room, with a thousand covers. I expect this to be proven incorrect.
I expect that small targets, further away will no be detected and I want to find out at what threshold this occurs for each sensor. And how hard it is to “adjust settings” to alter this behavior.
Marketing vs Reality
SAMPLE DATA - SAMPLE DATA - SAMPLE DATA - SAMPLE DATA - SAMPLE DATA
Sensor | TargetSize | Dist | Angle | 5° | 10° | 15° | 25° | Settings | Notes |
---|---|---|---|---|---|---|---|---|---|
DFRobot | 10x15cm | 1M | 0° | PASS | PASS | PASS | PASS | Default | |
DFRobot | 10x15cm | 2M | 0° | PASS | PASS | PASS | PASS | Default | |
DFRobot | 10x15cm | 3M | 0° | FAIL | FAIL | FAIL | PASS | Default | |
DFRobot | 10x15cm | 3M | 0° | FAIL | FAIL | FAIL | PASS | Sensitivity 9 | No change |
DFRobot | 10x15cm | 1M | 45° | PASS | PASS | PASS | PASS | Default | |
DFRobot | 10x15cm | 2M | 45° | FAIL | FAIL | FAIL | FAIL | Default | |
DFRobot | 30x20cm | 3M | 0° | FAIL | PASS | PASS | PASS | Default | |
DFRobot | 30x20cm | 3M | 0° | FAIL | PASS | PASS | PASS | Sensitivity 9 | No change |
SAMPLE DATA - SAMPLE DATA - SAMPLE DATA - SAMPLE DATA - SAMPLE DATA
Distance
You thought that because it marketed 9M that you could be sleeping 9M away ? lol
Angle
See above comment…
Deployment Flexibility
Does wide-angle or narrow FOV work best? Let’s find out…
FOV
Is narrow better for beds/desks? Are they better for fans or other disruptive influences? Let’s test that!
Configuration Parameters
Oh so confusing sometimes… …is there a hidden formula?
Appendix:
FAQ:
- what about [this other sensor module]?
** I don’t have it therefore I didn’t test it. - what about the FP1/2?
** see the Contenders section - what is ‘angle’ in the comparison?
** angle is the number of degrees that the target offset from perpendicular - what are those “5°|10°|15°|25°” listed in the chart?
** that is the amount of degrees the servo “wiggles” the target back and forth. The lower number representing very little movement which will be harder to detect. Just like waving your arms is easier to detect, so is 25° - what is the “10x15cm” target size?
** this is what I had laying around to represent a “head-sized” target - what is the “30x20cm” target size?
** this is what I had laying around to represent a “obscured-torso-sized” target you have cadavers laying around!? you sicko! /s
My mmWave Projects
Tracking Radar
mmWave Presence Detection
Low-Latency DFRobot+PIR
mmWave Wars: one sensor (module) to rule them all