MR60BHA1 60GHz mmWave Radar Sensor

I recently bought an MR60BHA1 radar sensor for heartrate monitoring. I intend to use the device with Arduino as the controller. I am having trouble communicating with the board. The “protocol” description document is cryptic and I was unable to exchange even basic commands (e.g. read the board information).
I am using a 3.3V Arduino (teensy 3.2) with TX(radar) connected to RX(Arduino) and RX(radar) connected to TX(Arduino). On the Arduino, I use Serial1 (pins 0 and 1).
The radar is constantly transmitting random data and is not responding to my “Serial1.print” commands. The data seems random. I can’t detect any frame headers (0x53, 0x59) in the data transmitted by the radar.
Does anyone have working examples or sample code for this product?
Thank you,

I would also like to learn of there is an example showing how to interface this board with an Arduino.
Hopefully the Seeed team will have time to help the community with that.

You can find a protocol definition at
But, beware, it is full of differences from the data you will actually see from the device. And, the default baud rate is 115200, not 9600. If you just connect the thing up and connect to a ‘terminal’ program via a UART to USB ‘dongle’, you will be able see the data flow immediately. You don’t have to send data to the device, just parse the data coming from it. English was not the first language of the guy who wrote the document:)

I’ve implemented a simple parsing program (see at example mm Wave monitor for Seeed · GitHub - you may need to replace out the ROS-specific parts) following the protocol as posted (, but there are several changes in the protocol (which @cybersteve alluded to above), such as a new control char value of 0x85, plus the checksum isn’t a simple XOR-sum. Is there any chance at getting an updated manual or ability to get the waveform data?

Below is how I see the messages from the ‘radar’…

(Also, the checksum is not a XOR-sum, it is a sum mod 256.)

“Human presence data”
0x80, 0x01 Human found - Not yet available
(you can identify if human is NOT found by frames [0x81,0x08] if equal to 0 cm and
[0x81,0x09] if equal to 90 degrees
[0x80,0x02] Represents the level of human activity. If you move rapidly in front of the device, you can sometimes get it to out put a 3 = “disorderly”, followed by a 0 when it is happy again.
[0x80, 0x03] Body motion parameter indicates the amplitude of human movement. The greater the amplitude of human movement, the greater the value obtained.
[0x80, 0x04] No longer used

“Respiratory heartrate data”
.[0x81,0x01] 1Byte heart rate status (0x01:normal 0x02:too fast 0x03:too slow)
[0x81,0x02] 1Byte heart rate value in beats per minute
[0x81,0x03] 1Byte heart rate waveform(Not currently available, still under development)
[0x81,0x04] 1Byte breathing status(0x01:normal 0x02:too fast 0x03:too slow)
[0x81,0x05] 1Byte breathing rate value in breaths per minute
[0x81,0x06] 1Byte breathing rate waveform(Not currently available, still under development)
[0x81,0x07] 1Byte Location Alert(0x01:out of range 0x00: within range)
[0x81,0x08] 2Byte Distance to human at rest value in centimetres
[0x81,0x09] 2Byte Angle to human at rest value in degrees - straight ahead is 90.

Ah, thanks for the heads-up about the checksum. I’m not getting very useful HR or RR values (or even person detection) and would like to work with the raw waveforms. Is there a way to bypass the processing and get the raw waveforms off the other pins?

ebee…your code shows this…if command_chr==0x01:
print(’ HR: ‘, int(str(data[7])), ‘, qual (1==normal)=’, int(str(data[6])))
elif command_chr==0x02:
print(’ RR: ', int(str(data[7])), ‘, qual (1==normal)=’, int(str(data[6])))

I get HR from data[6] if command_char==0x02


RR from data[6] if command_char==0x05

rather different?