本帖最后由 jinglixixi 于 2025-8-14 09:43 编辑
#申请原创#
对于听力障碍人群来说,在意外来临前将感知的危险信息传递给他们是件非常重要的事情。那么如何来解决这个问题呢? 我们可以将采集到的危险信息以触觉的方式来传递给他们,如在火焰传感器感知到危险时,可以无线通讯的方式传递到配有触觉振动效果的手镯上来停止他们。 为简化信息传递过程,这里先以串行通讯的方式来控制触觉马达的振动。 1. 触觉马达控制 1)触觉马达 在泰坦触觉TITAN Core开发套件中,提供了一块基于ESP32的高度集成度触觉评估板和4个不同型号的触觉马达,见图1和图2所示。别看该开发套件不起眼,它可是能进行蓝牙播放音乐的。 图1 开发板
图2 触觉马达
其触觉评估板的引脚排列如图3所示,它支持以串口通讯的方式来控制触觉马达。 图3 引脚排列
对于4个触觉马达来讲,其特点如下: 低频马达 (LF):非常适用营造深沉的超低音震感 中频马达 (MF):适用于通用的触觉反馈 高频马达 (HF):专为呈现高频质感和发出提醒设计 低频冲击马达 (LFi):结合了低频响应与冲击式振动
2)控制测试 利用STM32U385开发板的串行通讯功能,可以控制触觉马达的振动效果。 为便于控制,可将不同振动效果的指令存放到数组中。 以触觉指令"pulse 0.5 50 0.5;"为例,其字节内容为:70 75 6C 73 65 20 30 2E 35 20 35 30 20 30 2E 35 3B 对于触觉指令"tick 0.5 50 1.0;",其字节内容为:74 69 63 6B 20 30 2E 35 20 35 30 20 31 2E 30 3B 对于触觉指令"vibrate 250 1 10 0.5 1;"的字节内容则为:76 69 62 72 61 74 65 20 32 35 30 20 31 20 31 30 20 30 2E 35 20 31 3B 相应的指令数组如下 // "pulse 0.5 50 0.5;" uint8_t :CJMD_1[17]={0X70,0X75,0X6C,0X73,0X65,0X20,0X30,0X2E,0X35,0X20,0X35,0X30,0X20,0X30,0X2E,0X35,0X3B}; // "tick 0.5 50 1.0;" uint8_t CJMD_2[16]={0X74,0X69,0X63,0X6B,0X20,0X30,0X2E,0X35,0X20,0X35,0X30,0X20,0X31,0X2E,0X30,0X3B}; // "vibrate 250 1 10 0.5 1;" uint8_t CJMD3[23]={0X76,0X69,0X62,0X72,0X61,0X74,0X65,0X20,0X32,0X35,0X30,0X20,0X31,0X20,0X31,0X30,0X20,0X30,0X2E,0X35,0X20,0X31,0X3B};
此外,为进行字符串指令向为字节形式的转换,可先发送字符串指令,然后再以十六进制的方式来显示接收到的内容。见图4所示。 图4 指令形式转换
2. 触发信号源 1)传感器触发 以火患预防为例,可使用火焰传感器来感知周围环境的火患情况,当检测到数据变化异常后,就通过串口发送相应的触觉提示指令以告知服务对象。 2)按键触发 出使用传感器感知异常情况外,还可以通过按键将感知的异常情况告知服务对象,即按键触发提示指令的发出。 实现按键触发的主程序为: - int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- BSP_LED_Init(LD2);
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- MX_ICACHE_Init();
- KEY_Config();
- while (1)
- {
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_SET)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_2, 16, 0xFFFF);
- }
- BSP_LED_Toggle(LD2);
- HAL_Delay(500);
- }
- }
图5 触发测试
在使用串口通讯控制触觉马达时,使用的串口引脚为: Tx Pin----PA9 Rx Pin----PA10
所用接口及引脚如图6所示,与触觉马达的连接如图7所示。 图6 所用接口及引脚
图7 连接及测试
实现传感器及按键触发提示的主程序为: - int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_ICACHE_Init();
- BSP_LED_Init(LD2);
- MX_USART1_UART_Init();
- KEY_Config();
- if (HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ADC_Start(&hadc1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
- {
- Error_Handler();
- }
- I2C_CONFIG();
- HAL_Delay(50);
- while (1)
- {
- uhADCxConvertedData = HAL_ADC_GetValue(&hadc1);
- uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_SET)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_2, 16, 0xFFFF);
- }
- if(uhADCxConvertedData_Voltage_mVolt >xz )
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_3, 23, 0xFFFF);
- }
- BSP_LED_On(LD2);
- HAL_Delay(LED_BLINK_SLOW);
- BSP_LED_Off(LD2);
- HAL_Delay(LED_BLINK_SLOW);
- }
- }
在采用界面化管理的情况下,其界面如图图8所示。
图9 按键所用接口及引脚
图10 器件连接
在采用界面化管理的情况下,其界面如图图11所示。
图11 界面形式
软键盘所用引脚连接关系为: K1------PC10 K2------PC11 K3------PC12 K4------PD2
软键盘所用引脚初始化函数为: - void KEY_Config(void)
- {
- static GPIO_InitTypeDef GPIO_InitStruct;
- __HAL_RCC_GPIOC_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- __HAL_RCC_GPIOD_CLK_ENABLE();
- GPIO_InitStruct.Pin = GPIO_PIN_2;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- }
实现多键值分析处理的主程序为: - int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_ICACHE_Init();
- BSP_LED_Init(LD2);
- if (HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ADC_Start(&hadc1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
- {
- Error_Handler();
- }
- HAL_Delay(50);
- SPI_CONFIG();
- tft_Init();
- LCD_Clear(RED);
- BACK_COLOR=RED;
- POINT_COLOR=WHITE;
- LCD_ShowString(240,10," 8:30:00");
- show_tbh(20,45,7);
- show_tbh(97,45,0);
- show_tbh(174,45,5);
- show_tbh(250,45,6);
- show_tbh(20,145,1);
- show_tbh(97,145,2);
- show_tbh(174,145,4);
- show_tbh(250,145,3);
- POINT_COLOR=YELLOW;
- LCD_DrawLine(0, 32, 319,32);
- showhanzi16h(90,10,0,0);
- showhanzi16h(110,10,1,0);
- showhanzi16h(130,10,2,0);
- showhanzi16h(150,10,3,0);
- showhanzi16h(170,10,4,0);
- showhanzi16h(190,10,5,0);
- showhanzi16h(210,10,6,0);
- showhanzi16h(255,110,7,0);
- showhanzi16h(275,110,8,0);
- showhanzi16h(180,110,9,0);
- showhanzi16h(200,110,10,0);
- showhanzi16h(102,110,11,0);
- showhanzi16h(122,110,12,0);
- showhanzi16h(27,110,13,0);
- showhanzi16h(47,110,14,0);
- showhanzi16h(255,210,15,0);
- showhanzi16h(275,210,16,0);
- showhanzi16h(180,210,17,0);
- showhanzi16h(200,210,18,0);
- showhanzi16h(102,210,19,0);
- showhanzi16h(122,210,17,0);
- showhanzi16h(27,210,20,0);
- showhanzi16h(47,210,19,0);
- KEY_Config();
- MX_USART1_UART_Init();
- HAL_UART_Transmit(&huart1, (uint8_t *)CJMD3, 23, 0xFFFF);
- while (1)
- {
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==GPIO_PIN_RESET)
- {
- showhanzi16h(255,210,15,1);
- showhanzi16h(275,210,16,1);
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_1, 16, 0xFFFF);
- }
- else
- {
- showhanzi16h(255,210,15,0);
- showhanzi16h(275,210,16,0);
- }
-
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_11)==GPIO_PIN_RESET)
- {
- showhanzi16h(180,210,17,1);
- showhanzi16h(200,210,18,1);
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_2, 16, 0xFFFF);
- }
- else
- {
- showhanzi16h(180,210,17,0);
- showhanzi16h(200,210,18,0);
- }
-
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12)==GPIO_PIN_RESET)
- {
- showhanzi16h(102,210,19,1);
- showhanzi16h(122,210,17,1);
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_3, 16, 0xFFFF);
- }
- else
- {
- showhanzi16h(102,210,19,0);
- showhanzi16h(122,210,17,0);
- }
- if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)
- {
- showhanzi16h(27,210,20,1);
- showhanzi16h(47,210,19,1);
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_4, 16, 0xFFFF);
- }
- else
- {
- showhanzi16h(27,210,20,0);
- showhanzi16h(47,210,19,0);
- }
- uhADCxConvertedData = HAL_ADC_GetValue(&hadc1);
- uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_12B);
- if(uhADCxConvertedData_Voltage_mVolt > xz)
- {
- HAL_UART_Transmit(&huart1, (uint8_t *)&CJMD_5, 23, 0xFFFF);
- }
- HAL_Delay(LED_BLINK_SLOW);
- }
- }
经程序的编译及下载,使用按键操作的效果如图12所示,即在按下按键时所选的功能会呈反白显示效果。 图12 操作测试
由于时间的原因,目前暂未完成以无线通讯的方式来发送提示指令。若完成该功能,则可摆脱线路连接的制约,从而达到佩戴式的应用。
|