工程人员安全黑匣子
作者:sipower
随着中国“基建狂魔”称号的广为人知,越来越多的劳动者们从事到一些危险工作中,如高空,井下,隧道,工程车辆。为了保证这些施工者的安全,发生事故能及时得到救援,我设计了这个工程人员安全黑匣子。该设备能够采集工程施工人员的心率、周围环境的温度,湿度,识别运动状态,判断是否发生坠落,碰撞事故。通过网络传输给远程监控中心,监控人员一旦发现异常,可以立即组织救援。
该设备利用SensorTile.box上的传感器采集环境的温度,湿度,大气压力,利用惯性模块LSM6DSOX识别佩戴者运动状态。通过大气压力换算成海拔高度,高度的变化情况可以提醒远程监控人员关注佩戴者是否在进行高空作业。通过运动状态可以判断段佩戴者判断是否发生坠落,碰撞事故。从SensorTile.box上引出两个串口,一个接心率传感器,用来检测佩戴者生理参数。另一个串口连接通讯模块,用于上传数据。
最开始原计划使用《ST BLE Sensor》这个APP实现数据上传,经过一通研究和测试,发现不能满足我的设计要求,不能额外添加心率,远程平台也不够友好。最后决定本次作品使用WIFI模块上传数据,便于调试,实际应用可以换成GSM通讯模块,便于户外应用。远程监控平台采用的中国移动的onenet物联网平台,功能丰富,界面简洁直观,可以通过网页直接查看实时数据。最终显示效果如下图:
三、系统框图(图文结合)
整个系统主要分为四部分,主控为SensorTile.box模块,由于引出IO口为1.8V电平,我选用了一个圣邦微SGM4564电平转换评估板,将电平转为3.3V,方便与WiFi模块和心率模块相连。板上还预留一个USB-UART转接板接口,用于调试时监测收发数据是否正常。
四、各部分功能说明(图文结合)
下面介绍用到的两个模块。
心率传感器:
http://www.jingfantech.com/
JFH111是惊帆科技研发的多光谱生理数据测量模块,可准确测量脉搏波形、心率值、血氧值和血管微循环参数等信息。得益于获专利保护的前端传感器技术,模块灵敏度和信噪比在同类产品中得到大幅提升。模块结合惊帆特有的信号调理技术和算法,直接输出脉搏波形、心率值、血氧值和血管微循环参数,大大降低了系统复杂程度。用户系统只需通过串口即可和模块通信,并且直接获得测量结果。在精准易用的同时,JFH111模块还具备超小体积和超低功耗的特性,提升了智能穿戴设备的续航时间和外观设计的灵活性。
WiFi模块:
https://www.ai-thinker.com/product/esp8266
ESP-12S WiFi 模块是由安信可科技开发的,该模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA。ESP-12S WiFi 模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。ESP8266 是高性能无线 SOC,以最低成本提供最大实用性,为 WiFi 功能嵌入其他系统提供无限可能。
圣邦微SGM4564电平转换评估板
该评估板上焊接了一颗四通道电平转换芯片SGM4564,上面带电源和信号接口,正好满足两个串口的需求。旁边预留的其他型号焊盘,刚好能焊接心率传感器的接插件,另一边还有足够的空间焊接wifi模块,找到这个板子也算是恰到好处,一个板子把外接两个模块全搞定。下图是最终焊好的评估板。
电源改造方案:
由于SensorTileBox自身提供的3.3V电源只有150mA,达不到WiFi所需要的电流,我把供电主意打到了TF卡供电上,这个DC-DC采用的是STBB3J芯片,单电感支持buck-boost,板子标称电流可达400mA,是比较理想的选择,只是默认设置的是2.9V电压,稍显不足,我决定改造反馈电阻,整到3.3V。经查资料,在R45上并联一个680K电阻可以达到目的。通过改造就用这个给WiFi模块和心率传感器供电了。
下图是焊了一个电阻的图片。
调试全家福:
在全家福里,中间是主角 SensorTile.Box,右边是电平转换板和焊在上面的心率传感器、wifi模块。左边是st-link,上面是USB hub和USB-UART转换小板。心率模块用的串口1,从jtag接口那引出。wifi模块用的串口2,这个接口本来是连接蓝牙模块的,由于蓝牙实际用的spi,串口闲置,我就把电阻断开,连了wifi模块。
整个硬件改造用了2周的业余时间,手工不好,做的有点糙,好在用起来没问题。
五、作品源码和案例中处理的传感器数据
整个软件是基于官方例程BLEMLC基础上改造而来。目录如下:
STM32CubeFunctionPack_STBOX1_V1.1.0\Projects\STM32L4R9ZI-SensorTile.box\Applications\BLEMLC
首先是研究了LSM6DSOX传感器特点和参数,这个智能传感器通过配置参数可以实现自动检测运动状态,大大节省了单片机的操作复杂度,既能保证一致性,也能方便低功耗设计。我在学习了一番FSM和MLC配置和训练过程后,也尝试进行自己训练参数,发现还是有些难度,主要是理解深度不够,配置完的数据识别不是很准。由于时间有限,我直接采用了BLEMLC例程自带的训练好的数据,因为这个数据正好跟我的需求是一致的。传感器初始化函数如下:
/** @brief Initialize the LSM6SDOX MEMS Sensor for MLC
* @param None
* @retval None
*/
void Init_MEMS_MLC(void)
{
ucf_line_t *ProgramPointer;
int32_t LineCounter;
int32_t TotalNumberOfLine;
int32_t RetValue;
/* Init Accelero */
if (BSP_MOTION_SENSOR_Init(LSM6DSOX_0, MOTION_ACCELERO) == BSP_ERROR_NONE) {
STBOX1_PRINTF("OK Init Accelero Sensor\n\r");
} else {
STBOX1_PRINTF("Error Init Accelero Sensor\n\r");
Error_Handler();
}
/* Feed the program to Machine Learning Core */
/* Activity Recognition Default program */
ProgramPointer = (ucf_line_t *)lsm6dsox_activity_recognition_for_mobile;
TotalNumberOfLine = sizeof(lsm6dsox_activity_recognition_for_mobile) / sizeof(ucf_line_t);
STBOX1_PRINTF("-->Activity Recognition for LSM6DSOX MLC\r\n");
STBOX1_PRINTF("UCF Number Line=%ld\r\n",TotalNumberOfLine);
for (LineCounter=0; LineCounter<TotalNumberOfLine; LineCounter++) {
RetValue = BSP_MOTION_SENSOR_Write_Register(LSM6DSOX_0,
ProgramPointer[LineCounter].address,
ProgramPointer[LineCounter].data);
if(RetValue!=BSP_ERROR_NONE) {
STBOX1_PRINTF("Error loading the Program to LSM6DSOX [%ld]->%lx\n\r",LineCounter,RetValue);
Error_Handler();
}
}
STBOX1_PRINTF("Program loaded inside the LSM6DSOX MLC\n\r");
{
/* Enable interrupts from INT1 LSM6DSOX */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI2_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
STBOX1_PRINTF("Enabled LSM6DSOX INT1 Detection \n\r");
}
{
/* Enable interrupts from INT2 LSM6DSOX */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOE_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
STBOX1_PRINTF("Enabled LSM6DSOX INT2 Detection \n\r");
}
}
|
接下来就是移植环境传感器的功能。首先把例程
STM32CubeFunctionPack_STBOX1_V1.1.0\Projects\STM32L4R9ZI-SensorTile.box\Applications\BLESensors里面的传感器驱动文件移植过来,参见下图。
然后对代码进行修改,主要修改main.c和TargetPlatform.c,首先把蓝牙相关的初始化全部注释掉。然后从蓝牙初始代码里面提取需要的传感器初始化函数,直接放到while大循环前面。再进行查错和修改,就完成环境传感器数据和活动状态识别功能合体。最后把循环函数和回调函数里面的事件处理代码修改成串口输出,就大功告成。主要修改如下图。
接下来添加串口驱动,实现心率传感器读数和WiFi模块操作。首先是在TargetPlatform.c里面添加2个串口初始化代码
在主程序里面使能串口中断
定义串口收发参数
编写串口接收中断回调函数,针对比较简单的心率传感器数据包,直接就分好包,每收一个完整包,就产生一个标志,方便主程序处理。对于wifi模块,则移植了官方提供的串口中断处理代码,实现数据接收。
主程序里面对数据进行处理显示,我还是采用USB虚拟串口输出。
实现心率接收和wifi模块通讯后,只需下面一个函数就能完成和onenet平台的数据交互:
void ESP8266_Post_OneNet(char *devices_id,char *api_key,char *datastream_id,char *point_value)
{
char cStr [ 1500 ] = { 0 };
u16 length=0;
char post_str[100]={0};
char *post_p1=0;
char *post_p2=0;
char check[1]={0};
sprintf((char*)post_str,"{\"%s\":%s}",datastream_id,point_value);
length = strlen(post_str);
sprintf ( cStr,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\napi-key: %s\r\nHost: api.heclouds.com\r\nContent-Length: %d\r\n\r\n%s",devices_id,api_key,length,post_str );
if(ESP8266_Get_LinkStatus()==3)
{
// PC_Usart("\r\n发送数据......\r\n");
ESP8266_UnvarnishSend (); //透传发送
ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );
HAL_Delay ( 500 );
if((post_p1=(char*)strstr((const char*)strEsp8266_Fram_Record .Data_RX_BUF,"errno")),(post_p1!=NULL)) //寻找POST后OneNet返回的开始符
{
if((post_p2=(char*)strstr((const char*)post_p1,"}")),(post_p2!=NULL))//寻找POST后OneNet返回的结束符
{
post_p2=strtok((post_p1),":");
post_p2=(char*)strtok(NULL,",");
sprintf((char*)check,"%s",post_p2);
if(check[0]=='0')//判断OneNET是否接收到数据了,errno:0表示无错误,OneNET接收到数据
{
// PC_Usart("\r\nOneNET接收到数据!\r\n");
}
else
PC_Usart("\r\nOneNET没有接收到数据!\r\n");
}
}
ESP8266_ExitUnvarnishSend (); //退出透传
ESP8266_Cmd ( "AT+CIPMODE=0", "OK", 0, 200 );//关闭透传模式
}
else{
//
ESP8266_ExitUnvarnishSend (); //退出透传
ESP8266_Cmd ( "AT+CIPMODE=0", "OK", 0, 200 );//关闭透传模式
PC_Usart("重新连接。。。。");
while (!ESP8266_JoinAP ( User_ESP8266_ApSsid, User_ESP8266_ApPwd ) );
while ( !ESP8266_Link_Server ( enumTCP, User_ESP8266_TcpServer_IP, User_ESP8266_TcpServer_Port, Single_ID_0 ) );
}
}
|
实际输出效果如下图:
在活动类型输出上,onenet应用提供一个用图片表示状态的方式,不同的数值显示不同的图片。我设计了不同状态的图片,添加后如下图所示:
实际输出结果可以参见如下链接:
https://open.iot.10086.cn/iotbox/appsquare/appview?openid=ae3a82fa234ecb8be11a091200637fb0
六、视频演示(视频简介+链接)
视屏介绍了系统的组成,演示了作品如何工作,可以看到从环境、动作、心率信息采集到最终的输出到物联网平台,作品完整的实现了远程监测的要求。
七、项目总结(项目文字总结+帖子分享链接汇总)
通过本次大赛,首先是知道了ST竟然有这么NB的传感器,以前真是没怎么关注过。以后在设计中,当用到时就可以拿来就用,不用满世界乱找了。其次是对物联网了解了不少,既有通过ST的APP学到的知识,也了解了现在物联网现状。现在各个大的互联网公司都在抢占物联网高地,我也是进行了一圈对比,发现中移动的onenet对于初学者是最友好的,不但免费,文档代码也很齐全,有需要的同学不妨试试。最后就是给ST提点建议。这个套传感器套件功能挺全面很强大,但是配套的软件、文档感觉太教条化,虽然很丰富,但是用起来灵活度不够,也不够简单易懂,如果能提供一些基于Arduino这样开源平台的实例资源,估计大家评估起来会更省事省力。
下面是帖子汇总:
SensorTile.box的物联网相关应用(如何连上Microsoft Azure IoT云服务)
https://bbs.eeworld.com.cn/thread-1118522-1-1.html
SensorTile.box的物联网相关应用补充内容
https://bbs.eeworld.com.cn/thread-1119136-1-1.html
编程模式下,从USB虚拟串口输出传感器数据
https://bbs.eeworld.com.cn/thread-1121410-1-1.html
编程模式,实现活动状态识别和环境数据采集,并通过USB虚拟串口输出
https://bbs.eeworld.com.cn/thread-1121600-1-1.html
工程人员安全黑匣子的方案设计
https://bbs.eeworld.com.cn/thread-1122080-1-1.html
工程人员安全黑匣子之ESP8266连接OneNet云平台的方法
https://bbs.eeworld.com.cn/thread-1123040-1-1.html
工程人员安全黑匣子之主要功能完成
https://bbs.eeworld.com.cn/thread-1127604-1-1.html
八、其他
无。
工程人员安全黑匣子.docx
(1.6 MB, 下载次数: 5)
|