5714|5

530

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

机械臂手势跟踪以及声控系统设计 [复制链接]

  本帖最后由 传媒学子 于 2020-7-5 01:33 编辑

2020年ST MEMS传感器创意设计大赛

 

机械臂手势跟踪以及声控系统设计

by传媒学子

0.前言

    这次ST mems大赛,让我学到了很多知识,对于六轴传感器的认识变得深入;领略到了LSM6DOX中FSM和MLC的魅力,也见识到了骨传导传感器LIS25BA的灵巧。从对于FSM的迷惑,到得到论坛版主@littleshrimp@justd0等坛友的帮助,让我得以深入学习FSM状态机,让我真正掌握各个轴的对应情况,得以顺利完成FSM以及MLC的设计。论坛管理员@nmg,以及其他管理员对于我的鼓励,也让我有了前进的动力。非常感谢大家!

下文的结项内容和附件中的 《传媒学子_ST_MEMS大赛项目总结.pdf》(带书签)内容一致,大家可以阅览帖子,亦可查看pdf,附件中存放本次大赛各种数据和源代码。

 

下载附件  保存到相册

2020-7-5 00:37 上传

图3.1 LSM6DSOX实现手势控制系统原理图

该部分主要利用FSM和MLC识别特定手势,来控制机械臂。数据采集利用MK190V3母版,而Unico软件实现FSM配置和MLC配置。FSM配置了3个状态机:FSM1/FMS2分别识别向右、向左手势,控制机械臂向左或者向右;MLC配合FSM3识别翻转手势,控制舵机完成既定动作(向下抓取物品或者丢掉物品)。母板配合uncio发送中断,中断传送给STM32F429,STM32F429通过I2C控制驱动pca8965实现对舵机的控制。

下载附件  保存到相册

2020-7-5 00:38 上传

图3.2 LIS25BA实现声音震动控制系统原理图

    该部分主要利用利用MK190V3控制LIS25BA高精度骨传导传感器实现数据采集,上位机通过python实现对传感器的寄存器配置以及数据采集、算法实施和运动控制。

Python通过调用pyserial将配置数据写入LIS25BA,然后,通过特定算法,识别桌面震动,从而通过串口告知stm32f429,驱动I2C舵机驱动,从而实现特定动作。

 

下载附件  保存到相册

2020-7-5 00:42 上传

图4.1.1.1  向左划动状态机配置

图4.1.1.2  向左划动特征和对应中断输出

向左运动特征:X+轴数据先到达一个负极,然后接着有一个正极值;配置X+轴数据输出,当X+小于-1.5,则进入S1,S1检测数据是否大于1.5,然后设置T3=16个采样点;如果T3计时器时间中,X+轴数据没有大于1.5,则复位。通过调节T3定时器的数值,来调节识别间隔。

下载附件  保存到相册

2020-7-5 00:42 上传

图4.1.2.1  向右划动状态机配置

 

图4.1.2.2  向右划动特征和对应中断输出

下载附件  保存到相册

2020-7-5 00:42 上传

图4.1.3.1  机器学习内核up输出

图4.1.3.2  机器学习内核down输出

 

FSM3结合Z轴数据变动以及定时器等指令,实现左向右翻转手势识别。FSM3对应INT1和INT2均输出,STM32F429检测到两个信号同时输出时,驱动舵机完成翻转手势对应的动作。

图4.1.3.3  左向右翻转手势对应的FSM配置

图4.1.3.4  左向右翻转手势对应的特征和中断输出

    手势控制系统的中断与手势对应关系如下:

向左划动 - INT1

向右划动 - INT2

翻转手势 - INT1、INT2同时输出

后续,由STM32F429检测中断1和中断2的输出,驱动舵机,执行对应的手势动作。

 

下载附件  保存到相册

2020-7-5 00:42 上传

图4.2.1.1  整体上位机流程图

母板一个串口,用于配置LIS25BA传感器和获取传感器数据;另一个串口连接STM32F429,然后根据震动检测的算法的最终输出来控制舵机执行相应的动作;算法实施由python实施。

下载附件  保存到相册

2020-7-5 00:42 上传

处理后的数据(仅保留Z轴绝对值):

最终,通过串口2(对应代码中ser1)来输出舵机偏移值,实现对震动的检测。

下载附件  保存到相册

2020-7-5 00:47 上传

 

图5.1.1  MLC机器内核训练原始数据

 

  

下载附件  保存到相册

2020-7-5 00:47 上传

下载附件  保存到相册

2020-7-5 00:47 上传

 

  1. 声音震动控制部分

 

6.2 视频链接

https://training.eeworld.com.cn/course/5708/learn#lesson/26402

 

七、项目总结与分享汇总

7.1 项目总结

 

这次大赛是我第一次接触ST MEMS传感器,两块传感器LSM6DSOXLIS25BA都是业界高性能传感器。尤其是LSM6DSOX内部自带FSM有限状态机,并且布置了MLC机器学习内核,提供了一套完整的训练和配置flow, 大大简化了开发的难度。

本项目,通过对两款传感器的深入学习,结合MK109V3评估母板,基本实现了预定的项目规划:实现了对手势的控制和声音震动的控制。由于大赛时间限制,项目完成着重从评测角度和功能实现角度,基本达到了预期的目标。

本项目利用的三个LSM6DSOX有限状态机结合机器学习内核,实现了3种基本运动手势的识别,并且三种手势合在一起可完成一套组合的物品抓取演示过程。最后,利用python控制串口实现对LIS25BA的基本配置和数据获取,并实现声音震动识别算法实施,从而控制舵机运动。

 

7.2 帖子汇总

八、致谢

       首先,感谢EEwold论坛和ST公司举办这次大赛,让我能接触到高性能的MEMS传感器。

       其次,也感谢论坛版主littleshrimpjustd0等坛友的帮助,以及论坛管理员柠檬哥等的帮助和鼓励。通过这次大赛,串起了我用python控制串口、以及尝试通过C#获取windows窗口数据的知识碎片,让我自己的能力得到了提升。再次感谢EEworld论坛和ST公司。

传媒学子_ST_MEMS大赛项目总结.pdf

1.06 MB, 下载次数: 13

项目文档以及代码数据整理_传媒学子.rar

1022.42 KB, 下载次数: 16

最新回复

可惜了没参与这块活动,现在看好像很有意思的样子。   详情 回复 发表于 2020-8-3 16:29
点赞 关注
 
 

回复
举报

310

帖子

5

TA的资源

一粒金砂(中级)

沙发
 
赞一个,楼主

点评

谢谢..  详情 回复 发表于 2020-7-5 12:24
 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

板凳
 
宋元浩 发表于 2020-7-5 09:56
赞一个,楼主

谢谢..
 
 
 

回复

682

帖子

1

TA的资源

一粒金砂(高级)

4
 

能做出来,不简单,牛人!

 
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

5
 
本帖最后由 传媒学子 于 2020-7-27 00:31 编辑

大赛评奖虽然已经结束,无意间看到还有人关注这个帖子,为此花了一些时间,将一些上述部分内容做了优化。近期,发现一些不太好的现象和不和谐的言论,这里还是希望大家能静下心来,享受技术进步带来的乐趣,不要被社会上部分浮躁的情绪所左右。

 

回归本项目:

我将在main.c中处理中断1/2的程序换成了EXTI3/4 中断处理,似乎更加稳定。

然后,又用unico将FSM和MLC的.ucf文件合成了一个文件;我的理解.ucf中就是传感器的寄存器配置文件,按照我帖子中提到的方法,可以脱离unico,利用串口写入评测板中。

附件是合成后的.ucf 文件,上传上来,供有缘者参考。

 

改为中断接收并处理来自评测板的中断源1和中断源2,共三种情形:

stm32f4xx_it.c 中断配置如下:

extern int result;//main.c中定义
void EXTI3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI3_IRQn 0 */

  /* USER CODE END EXTI3_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
  /* USER CODE BEGIN EXTI3_IRQn 1 */
  result=1;
  /* USER CODE END EXTI3_IRQn 1 */
}

/**
  * @brief This function handles EXTI line4 interrupt.
  */
void EXTI4_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI4_IRQn 0 */

  /* USER CODE END EXTI4_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  /* USER CODE BEGIN EXTI4_IRQn 1 */
   result=2;
  /* USER CODE END EXTI4_IRQn 1 */
}

 

 

main.c

while(1)代码如下:

while(1)
{		
//case1 Intr1 turn left
		//case2 Intr2 turn right
		//case3,Intr1 and Intr2, turn around
		if(result==1) //case1
		{
			delay_1ms(1);
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == 1)
			{
				result = 3;
			}
			else {
				value -= 1;	 
				pca9685_set_channel_pwm_times(&handle, 0, 0, 4096*0.5*value/200);		
				result=0;	
			}
			
		}
		if(result==2)//case2
		{
			delay_1ms(1);
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 1){
				result = 3;
			}
			else {
				value += 1;	 
				pca9685_set_channel_pwm_times(&handle, 0, 0, 4096*0.5*value/200);		
				result=0;	
			}				
		}
		if(result==3)
		{
			  //down
				pca9685_set_channel_pwm_times(&handle, 2, 0, 4096*0.5*32/200);//down
				pca9685_set_channel_pwm_times(&handle, 3, 0, 4096*0.5*40/200);//open claw
				delay_1ms(300);
				pca9685_set_channel_pwm_times(&handle, 3, 0, 4096*0.5*32/200);//close claw
			  delay_1ms(300);
				pca9685_set_channel_pwm_times(&handle, 2, 0, 4096*0.5*50/200);//up
				//pca9685_set_channel_pwm_times(&handle, 3, 0, 4096*0.5*32/200);
			  result=0;
		}

		
		if(value<8) 
		{
			value=53;
		}
		if(value>53)
		{
			value=8;
		}
}

 

main.c其它代码如下:


void delay_1ms(int x) //sys_180MHz
{
	int j;
	while(x--){
		 j=180000;
		 while(j--);
	}
}
static void MX_GPIO_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
	
/*
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3 | GPIO_PIN_4, GPIO_PIN_RESET);

  GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 */
   /*Configure GPIO pins : PA3 PA4 */
  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

   /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

  HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);
	
}

 

0_merge_all_MLC_and_FSM.ucf

2.8 KB, 下载次数: 2

 
 
 

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

6
 

可惜了没参与这块活动,现在看好像很有意思的样子。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表