开源项目基于神念TGAM的脑波灯

Posted redeemer奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源项目基于神念TGAM的脑波灯相关的知识,希望对你有一定的参考价值。

本项目是基于STM32F103C8T6单片机,通过串口采集TGAM的脑波数据,对TGAM的脑波数据进行解析处理,来控制RGB灯的变化,从而反应脑波的注意力或放松度等级。即通过RGB灯的变化,反馈脑波的一种形式。来个效果图

在这里插入图片描述

本项目全部开源,嵌入式软件和硬件资料全部放在本文结束,欢迎大家一起学习交流!

话不多说,我们开始了解一下TGAM的基本工作原理

1、TGAM的资料介绍

TGAM默认的波特率是57600,大约每秒钟发送513个包,注意是“大约每秒钟”,意思就是发送包的个数是不会变
的,只是发送513个包所花费的时间是一秒左右。512个小包+1个大包,具体数据如下图:

【开源项目】基于神念TGAM的脑波灯
TGAM数据流

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的值(0100之间)
05 代表放松度Meditation
00 Meditation的值(0100之间)
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的脑波灯的主要内容,如果未能解决你的问题,请参考以下文章

实时脑波和眼动连通性分析 python-

最强大脑-高效记忆方法

手电筒片段 Android Studio

开源项目到底归谁管?

STC单片机VSCode PlatformIO Led呼吸灯示例程序

基于TINY4412的Andorid开发-------简单的LED灯控制