开源项目基于神念TGAM的脑波灯
Posted redeemer奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源项目基于神念TGAM的脑波灯相关的知识,希望对你有一定的参考价值。
本项目是基于STM32F103C8T6单片机,通过串口采集TGAM的脑波数据,对TGAM的脑波数据进行解析处理,来控制RGB灯的变化,从而反应脑波的注意力或放松度等级。即通过RGB灯的变化,反馈脑波的一种形式。来个效果图
本项目全部开源,嵌入式软件和硬件资料全部放在本文结束,欢迎大家一起学习交流!
话不多说,我们开始了解一下TGAM的基本工作原理
1、TGAM的资料介绍
TGAM默认的波特率是57600,大约每秒钟发送513个包,注意是“大约每秒钟”,意思就是发送包的个数是不会变
的,只是发送513个包所花费的时间是一秒左右。512个小包+1个大包,具体数据如下图:
1.1、TGAM发送的包有小包和大包两种:
1.1.1、小包格式
AA AA 04 80 02 xxHigh xxLow xxCheckSum
说明:前面的AA AA 04 80 02 是不变的,后三个字节是一只变化的,xxHigh和xxLow组成了原
始数据rawdata,xxCheckSum就是校验和。所以一个小包里面只包含了一个对开发者来
说有用的数据,那就是rawdata,可以说一个小包就是一个原始数据,大约每秒钟会有
512个原始数据。
那怎么从小包中解析出原始数据呢?
rawdata = (xxHigh << 8) | xxLow;
if(rawdata > 32768){ rawdata =65536; }
现在原始数据就这么算出来了,但是在算原始数据之前,我们先应该检查校验和。校验
和怎么算呢?
sum = ((0x80 + 0x02 + xxHigh + xxLow)^ 0xFFFFFFFF) & 0xFF
什么意思呢?就是把04后面的四个字节加起来,取反,再取低八位。
如果算出来的sum和xxCheckSum是相等的,那说明这个包是正确的,然后再去计算
rawdata,否则直接忽略这个包。
注意:丢包率在10%以下是不会对最后结果造成影响的。
1.1.2、大包格式
AA 同步
AA 同步
20 是十进制的32,即有32个字节的payload,除掉20本身+两个AA同步+最后校验和
02 代表信号值Signal
C8 信号的值
83 代表EEG Power开始了
18 是十进制的24,说明EEG Power是由24个字节组成的,以下每三个字节为一组
18 Delta 1/3
D4 Delta 2/3
8B Delta 3/3
13 Theta 1/3
D1 Theta 2/3
69 Theta 3/3
02 LowAlpha 1/3
58 LowAlpha 2/3
C1 LowAlpha 3/3
17 HighAlpha 1/3
3B HighAlpha 2/3
DC HighAlpha 3/3
02 LowBeta 1/3
50 LowBeta 2/3
00 LowBeta 3/3
03 HighBeta 1/3
CB HighBeta 2/3
9D HighBeta 3/3
03 LowGamma 1/3
6D LowGamma 2/3
3B LowGamma 3/3
03 MiddleGamma 1/3
7E MiddleGamma 2/3
89 MiddleGamma 3/3
04 代表专注度Attention
00 Attention的值(0到100之间)
05 代表放松度Meditation
00 Meditation的值(0到100之间)
D5 校验和
说明:那我们怎么拿信号强度Signal,专注度Attention,放松度Meditation,和8个EEG Power的值呢?就在第513个这个大包里面
04 代表专注度Attention
00 Attention的值(0到100之间)
05 代表放松度Meditation
00 Meditation的值(0到100之间)
解析EEG Power:
拿Delta举例,Delta 1/3是高字节,Delta 1/3是中字节,Delta 1/3是低
字节;高字节左移16位,中字节左移8位,低字节不变,然后将他们或运算,得到的结
果就是Delta的值。这些值是无符号,没有单位的,只有在和其他的Beta,Gamma等值
相互比较时才有意义。
TGAM不仅仅可以检测注意力和放松度,还可以检测眨眼信号。这样可玩性就更多了!
1.2、关于眨眼
1、TGAM芯片 本身是不会输出眨眼信号的,眨眼是用rawdata原始数据算出来的。表现在原始数据的波形上,眨眼就是一个很大的波峰。只要用代码检测这个波峰的出现,就可以找到眨眼的值了。
2、眨眼其实和脑电波一点儿关系都没有,眨眼只是眼睛动的时候在前额产生的肌(肉)电,混合在了脑波原始数据中。
2、项目介绍
本项目是通过蓝牙1接收的TGAM脑波数据,控制RGB的颜色;蓝牙2向外发送TGAM脑波数据,供上位机软件实时显示分析使用。
2.1、硬件原理图
2.2、软件设计
使用STM32的串口处理脑波数据,处理脑波数据代码如下:
void Serial_Deal(void)
{
uint8_t i=0;
uint16_t checksum = 0;//校验
if(Brain_DataStruct.receive_flag == 1)
{
over_time_counter = 0;
Brain_DataStruct.receive_flag = 0;
Brain_DataStruct.off_flag = 1;//脑波在线
checksum = 0;
for (i = 0;i < 32;i++)//连续读取32个字节
{
checksum += Brain_DataStruct.Brain_Data[i+3];//前面3位0xAA;0xAA;0x20不参与校验
}
checksum = (~checksum)&0xff;//获取校验
if (checksum == Brain_DataStruct.Brain_Data[35])
{
checksum = 0;
Brain_DataStruct.signal=Brain_DataStruct.Brain_Data[4];
Brain_DataStruct.attention=Brain_DataStruct.Brain_Data[32];
Brain_DataStruct.relax = Brain_DataStruct.Brain_Data[34];
if ((Brain_DataStruct.signal != 29) && (Brain_DataStruct.signal != 54) &&
(Brain_DataStruct.signal != 55) && (Brain_DataStruct.signal != 56) &&
(Brain_DataStruct.signal != 80) && (Brain_DataStruct.signal != 81) &&
(Brain_DataStruct.signal != 82) && (Brain_DataStruct.signal != 107)&&
(Brain_DataStruct.signal != 200))
{
Brain_DataStruct.wear_flag = 1;//正确佩戴
}
else//检测到脑波值,但是脑波值有问题
{
Brain_DataStruct.wear_flag = 0;//错误佩戴
}
}
}
else
{
if (over_time_counter >= 14)//1.4s
{
over_time_counter=0;
Brain_DataStruct.off_flag = 0;//脑波离线
}
}
}
3、项目开源
百度网盘链接:
https://pan.baidu.com/s/1RHTobmtOOW1WTvzRVDZR3Q
提取码:z5sv
结束
软件下载 | 学习视频 | 嵌入式书籍 | 项目资料 |公众号中持续更新….
以上是关于开源项目基于神念TGAM的脑波灯的主要内容,如果未能解决你的问题,请参考以下文章