This repo describes my current understanding of the Bluetooth packet format the Muse S Athena (MS-03) uses. To my knowledge I'm the first to document the new packet format it uses so I'm open sourcing this in hopes that someone else might find this useful for further work and because the project this was originally meant for has taken a new direction so unfortunately I'm unlikely to continue work on this.
Run athena_main.py to see the accelerometer and gyro data graphed in real-time. The other parsed data is also there, just not graphed. There might be unexpected values in the output, my best guess is that this is caused by the packet ID being accidentally found in an region of the packet that is not parsed, thus leading to corrupt data. I think with a few checks for if all the subpackets were decoded (the last next byte is the end of the packet) or if there were unknown IDs in the packet, it should be possible to filter them out.
Tested with Python 3.12.2
<length in bytes><packet counter><unknown 7 bytes> <packet id byte - detailed later> <unknown 4 bytes, first one likely a counter><samples tightly packed> <other subpackets in the same format>
0= frequency not valid1= 256 Hz2= 128 Hz3= 64 Hz4= 52 Hz5= 32 Hz6= 16 Hz7= 10 Hz8= 1 Hz9= 0.1 Hz
0= not valid1= EEG, 4 channels2= EEG, 8 channels3= DRL/REF4= Optics, 4 channels5= Optics, 8 channels6= Optics, 16 channels7= Accelerometer + Gyroscope8= Battery
Note: This leaves quite a few types of data unaccounted for. In practice, with preset 1045, I was only able to identify EEG, Optics, IMU and battery packets.
Packets I was able to identify and how to decode them (all of them use msb and little-endian):
- EEG: 2 samples, 8x14 bit integers,
eeg_int* (1450 / 16383) - IMU: 3 samples, 6x12bit integers,
gyro_int*-0.0074768,acc_int*0.0000610352 - OPTICAL: 3 samples, 4x20bit integers,
optical_int/32768
Note: The conversions are to the values the SDK gives, they might not be the final conversion.
Presets for different optics setups (more might exist, not sure what else they contain):
- 4ch high - 1046
- 4ch low - 1045 - default in MindMonitor
- 8ch high - 1044
- 8ch low - 1043
- 16ch high - 1042
- 16ch low - 1041
I included a quick parser script as reference as well.
Others in the community might fill in the missing pieces, I would look at these repos to check if they support the Athena:
- https://github.com/alexandrebarachant/muse-lsl
- https://github.com/Amused-EEG/amused-py
- https://github.com/kowalej/BlueMuse
The connection script in particular is based on based on the one found in amused-py by Adrian Belmans, linked above.
I would also like to thank Alexandre Barachant, Adrian Belmans again and others in the OpenBrainTalk and NeuroTechX Slacks for their earlier explorations into the device which served as an important jumping off point in my research.