7905

  • 2020-07-05
  • 加入了学习《羽毛球训练监测器项目》,观看 【羽毛球训练监测器项目】-- 羽毛球训练监测模块挥拍检测测试

  • 加入了学习《2020 ST MEMS大赛总结》,观看 机械臂手势跟踪以及声控系统设计-2020年ST MEMS创意设计大赛

  • 回复了主题帖: 2020-7-5-腹式呼吸训练教练仪

    先发那次缺图不全的帖子最好请管理员帮忙删除哈,我没找到自删按钮

  • 回复了主题帖: 2020-7-5-腹式呼吸训练教练仪

    littleshrimp 发表于 2020-7-5 13:22 这张图片显示不正常
    我也发现先保存草稿就丢图的问题,没办法重新来一遍吧~希望其他朋友注意编辑好就直接点发表帖子否则可能会白做很多无用功

  • 发表了主题帖: 2020-7-5-腹式呼吸训练教练仪(因上一贴有丢图重发一遍)

      腹式呼吸训练教练仪                                                                    作者:7905 项目背景(100-200字)无论是古老的印度瑜伽还是佛教的观智禅定,再到中国道家的丹道胎息以及普通的气功练习,各种习练方法的入门技术里都能或多或少找到腹式呼吸训练的影子,腹式呼吸训练确实是辅助身心锻炼入门的好方法。可习练时人越想清静,意识就越发像洪水猛兽一样频繁无序的跳出来,意识思绪一跑路,呼吸锻炼的流程就时时打断,后续的练习进程也就无从谈起。所以想研制一种辅助电子设备,来实时引导和监控练习者进行科学合理的正确呼吸动作流程,一定会很有帮助作用和实用价值。 作品简介(100-200字)SensorTile.Box设置成专家模式的方向变化检测 (使用陀螺仪 ),贴近接触练习者的小腹部,通过内部陀螺仪实时感测呼吸过程中腹部起伏变化,再利用自制辅助的电路模块把采集到超过设定阈值时LED的闪光信号,以无线传输方式传递给中心主控电路;LIS25BA骨传导传感器对使用者鼻孔处呼吸状态的震动信号进行采集和识别,信号输出也连接到中心主控电路,对于监控整个练习动作过程中呼吸流程配合的优选合规性判别,和对应的语音提示信息播报都由中心主控电路做出。 三、系统框图(图文结合)系统整体框图如下: 由于系统本身的独特需求所至,不得不专门制作了三块自制电路板:1、鼻呼吸传感识别电路;2、光采集和信号发送电路;3、中心主控电路。其中中心主控电路需要佩戴在使用者的头上靠近耳朵处,所以还单独做了个配套3D打印的外壳,一起装配到闲置的耳麦夹子上;从中心主控电路引出电源和信号线到鼻呼吸传感识别电路,该电路正好利用原来耳麦上连接话筒麦克的蛇形穿线软管来做固定支撑,以便于装配有LIS25BA传感模组的鼻呼吸传感识别电路板,可以被随意便捷的用手摆置到正好对准使用者鼻孔下方。另外,通过仔细观察SensorTile.Box模组外壳内部空间的占用和剩余情况,专门设计了一小块光采集和信号发送电路,正好可以装配进原有外壳的空隙处,并且可以加引线连接利用原电路板的电池电源供电。该光采集和信号发送电路主要是利用SensorTile.Box模组的信号输出发光二极管的亮灭状态,以2.4G无线传输方式把信号发送给中心主控电路处理。中心主控电路负责读取SensorTile.Box模组和装配有LIS25BA传感模组的鼻呼吸传感识别电路实时送上来的两路信号,即对应人吸气时腹部起伏变化的时刻和间隔时间、鼻孔呼气的时刻和间隔时间,中心主控电路一方面控制提示练习人腹部起伏运动和鼻呼吸动作的开始时刻和延时,另一方面要判断两路信号之间的时间配合是否符合前人总结的优选节拍,监控是否由于锻炼者思绪意识跑偏、疏忽而造成约定的规范呼吸顺序节拍超时,进而及时发出对使用者相应的语音提醒,像教练一样帮助纠正练习者及时回归到正确的锻炼流程当中来。 四、各部分功能说明(图文结合)系统整体组装完成后的实际效果图如下:下面就各部分分别结合图示说明。 实际使用时我找了一个装手机或充电宝用的拉力弹性腰袋来把SensorTile.Box模组贴近腹部佩带,因模组自带电池、外壳结构简洁小巧,增加自制硬件电路改造后靠无线信号与主控电路通讯,很适合做这种运动姿态检测应用,实测表明能够可靠分辨出呼吸时腹部起、伏动作状态。 全家福照片正面 从这张正面照首先可以看到中心主控电路板的有显示数码管的一面,下边放了这一面没焊接元件的电路板空板,板这面放置的元件有单片机MSP430FR2433、2.4G收发芯片LT8920、一位8段微型数码管、触摸感应芯片TTP223及感应焊盘、锂电池充电管理IC-MCP73831、3.2V的LDO以及MINI USB母座还有一个PCB按钮焊盘、指示LED和阻容等。在SensorTile.Box模组下边是自制的鼻呼吸传感识别电路,这一面焊接了LIS25BA传感模组,同时放置有单片机STM32L053C8T6和一颗2.3V的LDO。在SensorTile.Box模组右边是自制的光采集和信号发送电路的PCB空板有元件的一面,板厚1毫米,焊上所有元件,整高最大处是那个微型的接线母座+1mm板厚一共是2.4毫米,正好可以放置进SensorTile.Box模组的电路板与其外壳间剩余的空间里,为保险起见我还是在两块板之间垫隔了一片纸做绝缘;板上焊接的芯片有MSP430FR2433、LT8920、微功耗比较器TLV3691、光敏二极管、3.0V的LDO、LED以及阻容等,板子供电通过微型的接线座公、母头连接到SensorTile.Box模组主板的锂电池正负极连通焊点上。最下边是已经使用的3D打印外壳——已经插装卡嵌到一个闲置的钢丝耳麦上的情形,图中另外一个未用外壳可以看到正面效果,上面放的红色被折断了管脚的发光二极管代替按钮使用,按下时能传递压力到板上PCB按钮焊盘上的金属弹片使开关导通。 全家福照片反面 从这张反面照首先可以看到中心主控电路板的有小型锂电池的一面,下边放的同一面电路板空板,板这面放置的元件有串口控制的硬解码语音芯片YX6100及其配套串口FLASH芯片W25Q128、音频功放TDA2822以及喇叭引出端子。光采集和信号发送电路的PCB板这一面不放置元件。鼻呼吸传感识别电路这一面焊接了一颗1.8V的LDO给LIS25BA骨传感模组供电,在这一面,利用原来耳麦夹子上蛇形穿线软管尽头的话筒外壳中心开孔,穿螺丝固定电路板。3D打印外壳的背面可以看到微型扬声器的音频开口以及卡嵌固定壳体用的开槽结构。   4、专门设计的光采集和信号发送电路装入原SensorTile.Box模组外壳内的样子:  这小块自制PCB板上的异形豁口都是为避开和原来电路板上尺寸较高元器件的空间冲突而专门设计的,同时还起到板框结构抵触定位的作用。 五、作品源码和案例中处理的传感器数据 本次参赛作品采用了两种单片机:一是中心主控电路和光采集信号发送电路中采用的MSP430FR2433单片机,另一个是鼻呼吸传感识别电路中使用的STM32L053C8T6单片机。先给出两种单片机的程序流程图。 中心主控电路MSP430FR2433主程序流程图:  STM32L053C8T6骨传感鼻呼吸检测程序流程图: 光采集和信号发送电路的程序只是一个循环检测IO口并通过无线发射少量协议字节出去的简单程序,不画流程图了,后边会给出主程序代码。其中主控电路MSP430FR2433主程序流程图中提到的:“呼气超时”的判据指的是鼻呼吸传感电路发来的IO口电平变化信号;“吸气超时”的判据指的是由SensorTile.Box模组内陀螺仪因用户腹部起伏变化引起输出数据值超过设定阈值点亮LED,再通过自制无线光采集和信号发送电路发来的无线信号。 中心控制电路MSP430FR2433主程序源码: int main(void) {     WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer     unsigned int i=0;     PM5CTL0 &= ~LOCKLPM5;                     // Disable the GPIO power-on default high-impedance mode                                              // to activate previously configured port settings     DIS_PIN_OUT;     P1DIR |= BIT4;     P1DIR &= ~BIT0;                           // P1.0 out low         P2DIR &= ~BIT0;     P2OUT |= BIT0;     P2REN |=BIT0;         P2DIR &= ~BIT5;     P2OUT |= BIT5;     P2REN |=BIT5;         // Configure UART pins     P1SEL0 |= BIT4 | BIT5;                    // set 2-UART pin as second function       // Configure UART     UCA0CTLW0 |= UCSWRST;                     // Put eUSCI in reset     UCA0CTLW0 |= UCSSEL__SMCLK;                   // Baud Rate calculation     UCA0BR0 = 104;//208;//8;  1000000/4800=208.3333, // 1000000/115200 = 8.68     UCA0MCTLW = 0x6b00;//0x6b00; //d600/2=6b00 // 1000000/115200 - INT(1000000/115200)=0.68      // 1000000/9600 =104.16                                       // UCBRSx value = 0xD6 (See UG)     UCA0BR1 = 0;     UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI     //UCA0IE |= UCRXIE;     // Enable USCI_A0 RX interrupt     __delay_cycles(100000);     ADC2433_ini();         RF_Init();         DIS_NO;         for(i=50000; i>0; i--);                 DIS_0;         for(i=50000; i>0; i--);                 DIS_1;         for(i=50000; i>0; i--);                 DIS_2;         for(i=50000; i>0; i--);                 DIS_3;         for(i=50000; i>0; i--);                 DIS_4;         for(i=50000; i>0; i--);                 DIS_5;         for(i=50000; i>0; i--);                 DIS_6;         for(i=50000; i>0; i--);                 DIS_7;         for(i=50000; i>0; i--);                 DIS_8;         for(i=50000; i>0; i--);                 DIS_9;         for(i=50000; i>0; i--);                 DIS_A;         for(i=50000; i>0; i--);                 DIS_NO;     __delay_cycles(100000);             DIS_ADC2433_P2();          __delay_cycles(600000);                   DIS_NO;     __delay_cycles(100000);     re_SELF_TEST:     Play_x(7);//"自检中"          //__delay_cycles(1000000);          __delay_cycles(3400000);            Play_x(4);//"吸"          __delay_cycles(3000000);          for (i = 0; i<10000; i++) {             if_LT8920_PKT_0           {           __delay_cycles(1000);           if_LT8920_PKT_1           goto RF_TEST; //goto SELF_TEST_OK;            } RF_TEST:                if_LT8920_PKT_1       {               __delay_cycles(50000);                LTReadReg(50);           __delay_cycles(1000000);                       LTReadReg(48); //Test CRC                     if((byt.adc[1]&0x80)==1)  //           {                          LTWriteReg(52, 0x8080); //清空 RXTX                       __delay_cycles(300000);                     DIS_A;           }                  __delay_cycles(100000);         LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                                // For debugger                 LTWriteReg(7, 0x0080);    //接收模式          __delay_cycles(100000);         while_LT8920_PKT_1;                         DIS_DN;         goto IO_TEST;        }//if_LT8920_PKT_0//检查是否接收到数据            } //for (i = 0; i<10000; i++)     goto NO_sensor;   IO_TEST: Play_x(3);//"呼"          __delay_cycles(1000000);              for (i = 0; i<10000; i++)     {             if_P20_0           {           __delay_cycles(1000);           if_P20_1           goto Sensor_OK;            }                     if_P20_1           {           __delay_cycles(1000);           if_P20_0           goto Sensor_OK;            }               }//for (i = 0; i<10000; i++)          goto NO_sensor;   Sensor_OK:       DIS_UP;       Play_x(5);//"正常请按键"     __delay_cycles(4000000);     DIS_NO; ///////////////////////////////////////////////////////////////////////////        while_P25_1;     //Play_x(8);//" ///////////////////////////////////////////////////////////////////////////    while (1) { re_IO_Test:   __delay_cycles(1000000);      Play_x(3);//"呼"          __delay_cycles(1000000);              for (i = 0; i<10000; i++)     {             if_P20_0           {           __delay_cycles(1000);           if_P20_1                   {                    DIS_UP;                    goto re_RF_Test;                   }           }                     if_P20_1           {           __delay_cycles(1000);                   if_P20_0                   {                    DIS_UP;                    goto re_RF_Test;                   }                     }               }//for (i = 0; i<10000; i++)                   Play_x(1);//"呼气超时"          __delay_cycles(4000000);            goto re_IO_Test; //re_RF_Test:      re_RF_Test:      LTWriteReg(52, 0x8080); //清空 RXTX      __delay_cycles(4000000);           Play_x(4);//"吸"          __delay_cycles(1000000);                  for (i = 0; i<10000; i++)        {             if_LT8920_PKT_0           {           __delay_cycles(1000);           if_LT8920_PKT_1           goto RF_TEST_LOOP;           } RF_TEST_LOOP:               if_LT8920_PKT_1      {               __delay_cycles(50000);                LTReadReg(50);           __delay_cycles(1000000);                       LTReadReg(48); //Test CRC                     if((byt.adc[1]&0x80)==1)            {                          LTWriteReg(52, 0x8080); //清空 RXTX                       __delay_cycles(300000);                     DIS_A;           }                  __delay_cycles(100000);         LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                                // For debugger                 LTWriteReg(7, 0x0080);    //接收模式          __delay_cycles(100000);         while_LT8920_PKT_1;                 //LTWriteReg(52, 0x8080); //清空 RXTX                  DIS_DN;         goto re_IO_Test;      }//if_LT8920_PKT_0//检查是否接收到数据             } //for (i = 0; i<10000; i++)     Play_x(2);//"吸气超时"          __delay_cycles(2000000);      goto re_RF_Test; //re_RF_Test:SELF_TEST }//while (1)           NO_sensor:                   Play_x(6);//"未检测到传感器"          __delay_cycles(3000000);      DIS_4;//                goto re_SELF_TEST; //re_RF_Test:SELF_TEST               while (1)     {       }       } STM32L053C8T6骨传感鼻呼吸检测主程序源码: int main(void) {   /* USER CODE BEGIN 1 */     /* USER CODE END 1 */     /* MCU Configuration--------------------------------------------------------*/     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */   HAL_Init();    unsigned char i,temp_hi,temp_lo;    unsigned int i2s_data16;      /* USER CODE BEGIN Init */     /* USER CODE END Init */     /* Configure the system clock */   SystemClock_Config();     /* USER CODE BEGIN SysInit */     /* USER CODE END SysInit */     /* Initialize all configured peripherals */   MX_GPIO_Init();   MX_TIM6_Init();   //MX_USART1_UART_Init();   //MX_ADC_Init();   //MX_DAC_Init();   MX_I2S2_Init();    HAL_Delay(2000);    GU_CE_ON;    PA5_ON;   /* USER CODE BEGIN 2 */     /* USER CODE END 2 */   HAL_Delay(2000); //GND450_OFF;//GND450_OFF     /* Infinite loop */ /*   */    SPI2->I2SPR |= 0x0202;//SPI2->SPI_I2SPR |= 0x0F00;    //hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;    SPI2->I2SCFGR |= 0x0F00;//SPI_I2SPR    //__HAL_I2S_ENABLE(&hi2s2);//&hi2s2//hi2s wDIS1P_LIS25BA(0x26,0x00);   wDIS1P_LIS25BA(0x2e,0x10);   wDIS1P_LIS25BA(0x2f,0x21);//0x21-AXISX_EN   HAL_Delay(1000);   //while_KEY_PC13; RED_ON;   GU_CE_OFF; HAL_Delay(1000);    while (1)   { repeat:    HAL_Delay(1);    wDIS1P_LIS25BA(0x2e,0x00);    //HAL_Delay(10);       HAL_I2S_Receive(&hi2s2, i2s_Data, 32, 100);       i2s_data16=i2s_Data[30];//28    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff));            if((temp_hi==0)&&(temp_lo==0))    goto repeat;       USART1->TDR = temp_hi;    //HE_delay_1ms(); /*        i2s_data16=i2s_Data[29];    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff));       i2s_data16=i2s_Data[30];    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff)); */      if(i2s_data16>GATE_UP)    {    GU_CE_ON;    PA5_ON;    }    if(i2s_data16<GATE_DN)   {    GU_CE_OFF;    PA5_OFF;        }         /*         #define H2bit 0x01         #define L2bit 0x00         #define Double_Bit 0x02         DIS_CH450_HEX(L2bit,0,0);         */    wDIS1P_LIS25BA(0x2e,0x80);      //HAL_Delay(500);    }     } 光采集和信号发送电路的主程序源码: int main(void) {       volatile uint32_t i;         // Stop watchdog timer     WDT_A_hold(WDT_A_BASE);       P2DIR &= ~BIT6;  //P1DIR &= ~(BIT3);                   // Configure P1.3 as input direction pin       P2OUT |= BIT6; // Configure P1.0 as pulled-up       P2REN |= BIT6;// P1.0 pull-up register enable              P3REN |=BIT1;                 P2REN |=BIT3;                 P3REN |=BIT0;                 P2REN |=BIT5;                 DIS_1306_RST0;             // Set P1.0 to output direction     GPIO_setAsOutputPin(         GPIO_PORT_P1,         GPIO_PIN0         ); P1OUT |=  0x01;       // Disable the GPIO power-on default high-impedance mode     // to activate previously configured port settings     PMM_unlockLPM5();   P2OUT|=BIT4; P2REN |=BIT4;    P2DIR&=~BIT4;// //P2REN |=BIT4; //for(i=30000; i>0; i--);                 P3OUT |= BIT2; // Configure P1.0 as pulled-up       P3REN |= BIT2;// P1.0 pull-up register enable       P3DIR &= ~BIT2;  //P1DIR &= ~(BIT3);       P2OUT|=BIT7; P2DIR|=BIT7; P2REN|=BIT7;   //DIS_1306_VDD_OFF;//#define DIS_1306_VDD_OFF P2OUT&=~BIT3 //DIS_1306_BAT_OFF;//#define DIS_1306_BAT_OFF P2OUT&=~BIT6    LED1_ON;   //__delay_cycles(2000); //DIS_1306_Power_up();   //__delay_cycles(500000); //set_time();       LT8920_RST_0;     LT8920_RST_o;     __delay_cycles(2000);                  LT8920_SS_o;     LT8920_SS_1; //LT8920_SS_0;         LT8920_RST_1;     __delay_cycles(200000);     LT8920_SS_0;      __delay_cycles(100000);           LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);             RF_Init();     __delay_cycles(10000);       LT8920_PKT_i;     LT8920_PKT_1;           LTWriteReg(7,0x0000);         LTWriteReg(52,0x8080);    __delay_cycles(200000);    LED1_OFF;// GRE_ON; //BLU_ON;   LED1_OFF;// _OFF;       //发送循环      P2IFG = 0;//P2IFG = 0;            P1DIR &= ~BIT4;  //P1DIR &= ~(BIT3);                   // Configure P1.3 as input direction pin    // P2OUT &= ~ BIT4; //  P1OUT |= BIT3;                      // Configure P1.3 as pulled-up     P1OUT |= BIT4; // &= ~ BIT4; // P1OUT |= BIT3;  // Configure P1.3 as pulled-up      //P1REN |= BIT4;//P1REN |= BIT3;                      // P1.3 pull-up register enable         //P1IES  |= BIT4;//&= ~ BIT6;//P1IES |= BIT3;  // Hi/Low edge       //Bit = 1: Respective PxIFG flag is set on a high-to-low transition       //Bit = 0: Respective PxIFG flag is set on a low-to-high transition                  P1IFG = 0;//P1IFG = 0;                          // Clear all P1 interrupt flags      //                    // P1.3 interrupt enabled                //while(P2IN & BIT6);// (P2IN & ~BIT7);//((P1IN & BIT4)||(P2IN & BIT7));            while (1)     {         while_HE_KEY_1;//#define while_HE_KEY_1 while(P2IN & BIT4)             LT8920_RST_1;     __delay_cycles(10000);     LT8920_SS_0;      __delay_cycles(200000);                                       LTWriteReg(50,0x0600);//6字节长度                                           LTWriteReg(50,0xABAB);                      LTWriteReg(50,0xCDCD);                 LTWriteReg(7,0x0100);//SPI_WriteReg(7, 0x01, 0x00);   //发送         //__delay_cycles(1000000);         while_LT8920_PKT_0;//#define while_LT8920_PKT_0 while(!(P1IN & BIT6))         //while_LT8920_PKT_1;//#define while_LT8920_PKT_1 while(P1IN & BIT6)         __delay_cycles(200000);         LTReadReg(52);//SPI_ReadReg(52);//判断是否收到对方自动应答信号         //UART_TX(byt.adc[1]);         //UART_TX(byt.adc[0]);                 if((byt.adc[1]& 0x3F)==0)//如果收到应答信号点亮本地对应的LED         {                    LED1_ON;// GRE_ON; //BLU_ON;            //__delay_cycles(2000000);         }                 __delay_cycles(10);//delay_us(10);           LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                 __delay_cycles(200000);//2019-12-21         LED1_OFF; //BLU_ON; //GRE_OFF;   LTWriteReg(35,0x8300);//(35,0xc300); __delay_cycles(100000);       //while_HE_KEY_1;// (P2IN & BIT7);       }//while (1)// //发送循环     } 关于处理传感器数据问题,由于SensorTile.Box模组本身的软硬件构成已经把传感器过程数据完全封装在了内部处理,只需采用其通过手机APP设定和输出的结果就可以了;鼻呼吸传感识别电路用到的LIS25BA骨震动传感模组的二次开发需要首先了解其传感器数据输出细节,相对于SensorTile.Box模组的应用来说有些难度,为了便于直观快速理解数据意义,特别编写了电脑上位机的数据图示化观察小软件和下位机软硬件电路配合,通过下位机驱动LIS25BA骨震动传感模组读取数据,并发送到电脑上直观观察,可以有效帮助理解其工作数据意义,便于进一步编制对数据处理的后续单片机程序。上位机程序界面从实际演示视频中截屏图片如下(用粉色棒条长短变化代表三个轴向加速度数据实时变化): SensorTile.Box模组通过手机APP上载固件设置成专家模式的方向变化检测 (使用陀螺仪 )模式,其手机端设置过程屏幕截图如下,已经用数字号码按从小到大前后排序,并且把数字序号放在靠近每一步操作按钮或区域的附近处便于查对识别。我截取的是主要的24个步骤,到第24步时就可以退出APP操作,正常使用陀螺仪的感测和LED发光指示功能了:   六、视频演示(视频简介+链接) 1、项目整体演示视频地址: https://v.youku.com/v_show/id_XNDczNTgxOTI2NA==.html?spm=a2hbt.13141534.0.13141534 视频中首先演示了正常开机上电到通过鼻呼吸传感器和腹部运动传感器的在线检测,即按照语音提示做一次“吸”、“呼”动作,其中吸气对应的腹部运动是用手轻微触碰一下SensorTile.Box模组来模拟,呼气对应的鼻孔处呼气震动我用了一个橡皮气囊吹气来代替,实际使用时放在鼻孔下的LIS25BA骨震动传感模组的反应会因真实鼻孔出气的持续时间比气囊长很多(虽然出气强度也相比气囊弱很多)而使识别效果更佳,因为手捏气囊出气无法实现均匀慢长的模拟,所以给人感觉似乎是需要很大、超过实际的出气效果。之后手按提示按键开始正常腹式呼吸训练,过程中模拟了一下偶尔没有鼻呼吸的“呼”动作,没有腹部运动的“吸”动作,以及“呼”动作不规范等情况发生,仪器的反应和给出提醒的情况;接着演示触摸感应开关,关机再开机,并且在新一轮传感器在线检测时分别模拟没有给出传感器相应动作回应时,仪器给出的语音提示;接下来还是一遍正常训练过程演示,之后关掉仪器,撤走支撑演示的水杯后,拿起整个头戴式训练仪在镜头前换角度展示一下,最后停止视频。因为仪器采用了微型扬声器,所以声音不是很大,视频中可能听得不很清楚,但实际使用中因为和佩戴耳麦一样喇叭是靠近耳朵的,所以声音实际效果还是很显大的。   2、骨震动传感器读取数据通过上位机图示观察视频: https://v.youku.com/v_show/id_XNDczNTk0MjcwOA==.html?spm=a2hbt.13141534.app.5~5!2~5!2~5~5~5!2~5~5!2~5!2~5!2~5~5~A 视频演示的是项目过程中为了直观形象理解骨震动传感器采集数据的实际意义而临时开发的上位机图示观察软件的运行情况,软件界面上左上角处有代表三个轴向加速度传感器数据变化的粉红色棒条,实时随着手拿传感器的位置变动而变化,借此帮助确定后续单片机读数和判断程序的编制。这段视频背景音有点混杂电视里动画片的声音。   3、专门制作的下位机骨振动测试电路完成演示视频: https://v.youku.com/v_show/id_XNDY4MDYyNjQwOA==.html?spm=a2hbt.13141534.0.13141534 这段视频是专门为测试LIS25BA骨震动传感器模组而设计的一块电路板,包括USB转串口+电源轨变换+本地LED显示,可以通过USB转串口把读取的传感器数据发给电脑端查看,板上采取了项目中将要用到的STM32L053C8T6单片机,确认能够正确读取传感器数据的程序,可以直接转移到后续正式作品上应用。   七、项目总结(项目文字总结+帖子分享链接汇总) 疫情当前,人们应该反思的有很多,其中之一就包括重新审视、重视自身健康锻炼和提升个人免疫力的重要性,个人免疫力的提升与身、心双健密切相关,身是外在体格锻炼,心是内在德行、心境的修养,二者统一锻炼最常见的入门方法之一就是腹式呼吸训练,这是个说来容易做起来难的课题:因为练习首先要求静心,而当人想要入静时,偏偏会出现心思反倒无序乱跑的情况。腹式呼吸具体还分为顺腹式呼吸和逆腹式呼吸两种,简单说来就是——顺腹式呼吸:用鼻吸气,嘴巴闭住,腹部要凸起,呼气腹部要收缩;逆腹式呼吸:用鼻吸气,嘴巴闭住,腹部要收缩,呼气腹部要凸起,最好配合一点行气意念的想象,总体要领就这些,而人们日常形成的自然呼吸习惯是不管腹部配合的,就是凭借胸廓自然运动的呼吸,几乎在“无意识下”就已经“自动”完成了。可腹式呼吸初步训练是在一次要求十几分钟或者半个多小时乃至更长的时间内让人们主动放弃自然呼吸模式,而改换成与自然习惯完全不同的呼吸方式,还要求韵律节奏合规,如果没有教练在跟前全程指导,普通人是很难快速熟悉掌握并运用自如的。而利用意法半导体这次活动提供的陀螺仪和加速度传感器监测这个呼吸运动配合过程,并编制相应微处理器控制程序来辅助提示练习者执行鼻呼吸和腹部的凸起、收缩起伏变化动作,既可以把动作节奏掌控得准确合拍,还能不知疲倦毫无怨言的连续不断语音指导,胜过任何真人教练的耐心。借助这个电子辅助设备,从此就可以实现象有个贴身教练一样自动执行优选教程,在每次练习过程中,中规中矩的按时发出语音提示防止(并且还能及时语音提示纠正)练习者精神溜号跑路,使合规的腹式呼吸练习进程得以顺利完成。 另外,技术人员做项目最好施行能一遍工作适应多种用途的考虑所有环节问题,以便尽量扩展所花费时间的价值,无论在设计硬件或是软件的过程中,这样尽量开放设计思维的初衷也是最大化实现模块重用思想的体现。本作品设计过程就实行了这样的想法,比如硬件不变,功能通过软件改换,这个作品轻易就可以转变成一个自制的小型头戴式MP3播放器,虽然存储空间是硬件FLASH芯片,存曲数量有限,但足以满足装下一己爱听的常用几首歌曲的目的了;一个按钮也可以凭“单双击”、“长短按”来区分上下首进、退或者暂停、继续等功能,另外程控语音播报+无线数据收发的硬件功能组合,也容易被改造成除MP3播放器以外其它实用功能的电子设备;结合了LIS25BA骨震动传感模组的鼻呼吸传感识别电路显然也可以以模块形式应用到其它需求的设计中去,包括3D打印外壳在设计时也照顾到了要可以放到其它项目中的可用性等等。 从始至终项目相关发帖汇总链接网址: http://home.eeworld.com.cn/space-uid-457089-2.html 各具体分网址: 1、2020-4-14--APP搜索不到 sensortile box是电池问题 http://bbs.eeworld.com.cn/thread-1117798-1-1.html 2、2020-4-14--验证版主建议结果 http://bbs.eeworld.com.cn/thread-1117901-1-1.html 3、2020-4-30--自制传感器测试板(骨振动)画完投板了 http://bbs.eeworld.com.cn/thread-1120746-1-1.html 4、2020-5-21--骨振动测试完成了 http://bbs.eeworld.com.cn/thread-1123653-1-1.html 5、2020-5-25--中心主控电路板PCB今天布完发给厂家制板了 http://bbs.eeworld.com.cn/thread-1124247-1-1.html 6、2020-6-23--抽空给作品画了个3D打印的外壳 http://bbs.eeworld.com.cn/thread-1129237-1-1.html   八、其他 出于易于快捷实现的原因,作品中使用的所有提示语音素材都是用电脑合成的女声效果,略显生硬,并不十分适用于人们需要清净舒缓氛围的运动练习项目,后续可以考虑采用更能契合、照顾项目内在主旨的真人录音代替。想起西方技术界流传过大意是这样的一句话“工程师应该是能用花1美元解决别人要花10美元才能解决问题的人”,我们可以理解其包含的意思应该有:要动脑寻求以至简的手段恰当达成设计意图的能力——以此与通道们共勉。                                                                                                                                                                                                         2020年7月5日星期日

  • 发表了主题帖: 2020-7-5-腹式呼吸训练教练仪

      腹式呼吸训练教练仪                                                                   作者:7905 项目背景(100-200字)无论是古老的印度瑜伽还是佛教的观智禅定,再到中国道家的丹道胎息以及普通的气功练习,各种习练方法的入门技术里都能或多或少找到腹式呼吸训练的影子,腹式呼吸训练确实是辅助身心锻炼入门的好方法。可习练时人越想清静,意识就越发像洪水猛兽一样频繁无序的跳出来,意识思绪一跑路,呼吸锻炼的流程就时时打断,后续的练习进程也就无从谈起。所以想研制一种辅助电子设备,来实时引导和监控练习者进行科学合理的正确呼吸动作流程,一定会很有帮助作用和实用价值。 作品简介(100-200字)SensorTile.Box设置成专家模式的方向变化检测 (使用陀螺仪 ),贴近接触练习者的小腹部,通过内部陀螺仪实时感测呼吸过程中腹部起伏变化,再利用自制辅助的电路模块把采集到超过设定阈值时LED的闪光信号,以无线传输方式传递给中心主控电路;LIS25BA骨传导传感器对使用者鼻孔处呼吸状态的震动信号进行采集和识别,信号输出也连接到中心主控电路,对于监控整个练习动作过程中呼吸流程配合的优选合规性判别,和对应的语音提示信息播报都由中心主控电路做出。 三、系统框图(图文结合)系统整体框图如下: 由于系统本身的独特需求所至,不得不专门制作了三块自制电路板:1、鼻呼吸传感识别电路;2、光采集和信号发送电路;3、中心主控电路。其中中心主控电路需要佩戴在使用者的头上靠近耳朵处,所以还单独做了个配套3D打印的外壳,一起装配到闲置的耳麦夹子上;从中心主控电路引出电源和信号线到鼻呼吸传感识别电路,该电路正好利用原来耳麦上连接话筒麦克的蛇形穿线软管来做固定支撑,以便于装配有LIS25BA传感模组的鼻呼吸传感识别电路板,可以被随意便捷的用手摆置到正好对准使用者鼻孔下方。另外,通过仔细观察SensorTile.Box模组外壳内部空间的占用和剩余情况,专门设计了一小块光采集和信号发送电路,正好可以装配进原有外壳的空隙处,并且可以加引线连接利用原电路板的电池电源供电。该光采集和信号发送电路主要是利用SensorTile.Box模组的信号输出发光二极管的亮灭状态,以2.4G无线传输方式把信号发送给中心主控电路处理。中心主控电路负责读取SensorTile.Box模组和装配有LIS25BA传感模组的鼻呼吸传感识别电路实时送上来的两路信号,即对应人吸气时腹部起伏变化的时刻和间隔时间、鼻孔呼气的时刻和间隔时间,中心主控电路一方面控制提示练习人腹部起伏运动和鼻呼吸动作的开始时刻和延时,另一方面要判断两路信号之间的时间配合是否符合前人总结的优选节拍,监控是否由于锻炼者思绪意识跑偏、疏忽而造成约定的规范呼吸顺序节拍超时,进而及时发出对使用者相应的语音提醒,像教练一样帮助纠正练习者及时回归到正确的锻炼流程当中来。 四、各部分功能说明(图文结合)系统整体组装完成后的实际效果图如下: 下面就各部分分别结合图示说明。 实际使用时我找了一个装手机或充电宝用的拉力弹性腰袋来把SensorTile.Box模组贴近腹部佩带,因模组自带电池、外壳结构简洁小巧,增加自制硬件电路改造后靠无线信号与主控电路通讯,很适合做这种运动姿态检测应用,实测表明能够可靠分辨出呼吸时腹部起、伏动作状态。 全家福照片正面 从这张正面照首先可以看到中心主控电路板的有显示数码管的一面,下边放了这一面没焊接元件的电路板空板,板这面放置的元件有单片机MSP430FR2433、2.4G收发芯片LT8920、一位8段微型数码管、触摸感应芯片TTP223及感应焊盘、锂电池充电管理IC-MCP73831、3.2V的LDO以及MINI USB母座还有一个PCB按钮焊盘、指示LED和阻容等。在SensorTile.Box模组下边是自制的鼻呼吸传感识别电路,这一面焊接了LIS25BA传感模组,同时放置有单片机STM32L053C8T6和一颗2.3V的LDO。在SensorTile.Box模组右边是自制的光采集和信号发送电路的PCB空板有元件的一面,板厚1毫米,焊上所有元件,整高最大处是那个微型的接线母座+1mm板厚一共是2.4毫米,正好可以放置进SensorTile.Box模组的电路板与其外壳间剩余的空间里,为保险起见我还是在两块板之间垫隔了一片纸做绝缘;板上焊接的芯片有MSP430FR2433、LT8920、微功耗比较器TLV3691、光敏二极管、3.0V的LDO、LED以及阻容等,板子供电通过微型的接线座公、母头连接到SensorTile.Box模组主板的锂电池正负极连通焊点上。最下边是已经使用的3D打印外壳——已经插装卡嵌到一个闲置的钢丝耳麦上的情形,图中另外一个未用外壳可以看到正面效果,上面放的红色被折断了管脚的发光二极管代替按钮使用,按下时能传递压力到板上PCB按钮焊盘上的金属弹片使开关导通。 全家福照片反面 从这张反面照首先可以看到中心主控电路板的有小型锂电池的一面,下边放的同一面电路板空板,板这面放置的元件有串口控制的硬解码语音芯片YX6100及其配套串口FLASH芯片W25Q128、音频功放TDA2822以及喇叭引出端子。光采集和信号发送电路的PCB板这一面不放置元件。鼻呼吸传感识别电路这一面焊接了一颗1.8V的LDO给LIS25BA骨传感模组供电,在这一面,利用原来耳麦夹子上蛇形穿线软管尽头的话筒外壳中心开孔,穿螺丝固定电路板。3D打印外壳的背面可以看到微型扬声器的音频开口以及卡嵌固定壳体用的开槽结构。   4、专门设计的光采集和信号发送电路装入原SensorTile.Box模组外壳内的样子:  这小块自制PCB板上的异形豁口都是为避开和原来电路板上尺寸较高元器件的空间冲突而专门设计的,同时还起到板框结构抵触定位的作用。 五、作品源码和案例中处理的传感器数据 本次参赛作品采用了两种单片机:一是中心主控电路和光采集信号发送电路中采用的MSP430FR2433单片机,另一个是鼻呼吸传感识别电路中使用的STM32L053C8T6单片机。先给出两种单片机的程序流程图。 中心主控电路MSP430FR2433主程序流程图:  STM32L053C8T6骨传感鼻呼吸检测程序流程图: 光采集和信号发送电路的程序只是一个循环检测IO口并通过无线发射少量协议字节出去的简单程序,不画流程图了,后边会给出主程序代码。其中主控电路MSP430FR2433主程序流程图中提到的:“呼气超时”的判据指的是鼻呼吸传感电路发来的IO口电平变化信号;“吸气超时”的判据指的是由SensorTile.Box模组内陀螺仪因用户腹部起伏变化引起输出数据值超过设定阈值点亮LED,再通过自制无线光采集和信号发送电路发来的无线信号。 中心控制电路MSP430FR2433主程序源码: int main(void) {     WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer     unsigned int i=0;     PM5CTL0 &= ~LOCKLPM5;                     // Disable the GPIO power-on default high-impedance mode                                              // to activate previously configured port settings     DIS_PIN_OUT;     P1DIR |= BIT4;     P1DIR &= ~BIT0;                           // P1.0 out low         P2DIR &= ~BIT0;     P2OUT |= BIT0;     P2REN |=BIT0;         P2DIR &= ~BIT5;     P2OUT |= BIT5;     P2REN |=BIT5;         // Configure UART pins     P1SEL0 |= BIT4 | BIT5;                    // set 2-UART pin as second function       // Configure UART     UCA0CTLW0 |= UCSWRST;                     // Put eUSCI in reset     UCA0CTLW0 |= UCSSEL__SMCLK;                   // Baud Rate calculation     UCA0BR0 = 104;//208;//8;  1000000/4800=208.3333, // 1000000/115200 = 8.68     UCA0MCTLW = 0x6b00;//0x6b00; //d600/2=6b00 // 1000000/115200 - INT(1000000/115200)=0.68      // 1000000/9600 =104.16                                       // UCBRSx value = 0xD6 (See UG)     UCA0BR1 = 0;     UCA0CTLW0 &= ~UCSWRST;                    // Initialize eUSCI     //UCA0IE |= UCRXIE;     // Enable USCI_A0 RX interrupt     __delay_cycles(100000);     ADC2433_ini();         RF_Init();         DIS_NO;         for(i=50000; i>0; i--);                 DIS_0;         for(i=50000; i>0; i--);                 DIS_1;         for(i=50000; i>0; i--);                 DIS_2;         for(i=50000; i>0; i--);                 DIS_3;         for(i=50000; i>0; i--);                 DIS_4;         for(i=50000; i>0; i--);                 DIS_5;         for(i=50000; i>0; i--);                 DIS_6;         for(i=50000; i>0; i--);                 DIS_7;         for(i=50000; i>0; i--);                 DIS_8;         for(i=50000; i>0; i--);                 DIS_9;         for(i=50000; i>0; i--);                 DIS_A;         for(i=50000; i>0; i--);                 DIS_NO;     __delay_cycles(100000);             DIS_ADC2433_P2();          __delay_cycles(600000);                   DIS_NO;     __delay_cycles(100000);     re_SELF_TEST:     Play_x(7);//"自检中"          //__delay_cycles(1000000);          __delay_cycles(3400000);            Play_x(4);//"吸"          __delay_cycles(3000000);          for (i = 0; i<10000; i++) {             if_LT8920_PKT_0           {           __delay_cycles(1000);           if_LT8920_PKT_1           goto RF_TEST; //goto SELF_TEST_OK;            } RF_TEST:                if_LT8920_PKT_1       {               __delay_cycles(50000);                LTReadReg(50);           __delay_cycles(1000000);                       LTReadReg(48); //Test CRC                     if((byt.adc[1]&0x80)==1)  //           {                          LTWriteReg(52, 0x8080); //清空 RXTX                       __delay_cycles(300000);                     DIS_A;           }                  __delay_cycles(100000);         LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                                // For debugger                 LTWriteReg(7, 0x0080);    //接收模式          __delay_cycles(100000);         while_LT8920_PKT_1;                         DIS_DN;         goto IO_TEST;        }//if_LT8920_PKT_0//检查是否接收到数据            } //for (i = 0; i<10000; i++)     goto NO_sensor;   IO_TEST: Play_x(3);//"呼"          __delay_cycles(1000000);              for (i = 0; i<10000; i++)     {             if_P20_0           {           __delay_cycles(1000);           if_P20_1           goto Sensor_OK;            }                     if_P20_1           {           __delay_cycles(1000);           if_P20_0           goto Sensor_OK;            }               }//for (i = 0; i<10000; i++)          goto NO_sensor;   Sensor_OK:       DIS_UP;       Play_x(5);//"正常请按键"     __delay_cycles(4000000);     DIS_NO; ///////////////////////////////////////////////////////////////////////////        while_P25_1;     //Play_x(8);//" ///////////////////////////////////////////////////////////////////////////    while (1) { re_IO_Test:   __delay_cycles(1000000);      Play_x(3);//"呼"          __delay_cycles(1000000);              for (i = 0; i<10000; i++)     {             if_P20_0           {           __delay_cycles(1000);           if_P20_1                   {                    DIS_UP;                    goto re_RF_Test;                   }           }                     if_P20_1           {           __delay_cycles(1000);                   if_P20_0                   {                    DIS_UP;                    goto re_RF_Test;                   }                     }               }//for (i = 0; i<10000; i++)                   Play_x(1);//"呼气超时"          __delay_cycles(4000000);            goto re_IO_Test; //re_RF_Test:      re_RF_Test:      LTWriteReg(52, 0x8080); //清空 RXTX      __delay_cycles(4000000);           Play_x(4);//"吸"          __delay_cycles(1000000);                  for (i = 0; i<10000; i++)        {             if_LT8920_PKT_0           {           __delay_cycles(1000);           if_LT8920_PKT_1           goto RF_TEST_LOOP;           } RF_TEST_LOOP:               if_LT8920_PKT_1      {               __delay_cycles(50000);                LTReadReg(50);           __delay_cycles(1000000);                       LTReadReg(48); //Test CRC                     if((byt.adc[1]&0x80)==1)            {                          LTWriteReg(52, 0x8080); //清空 RXTX                       __delay_cycles(300000);                     DIS_A;           }                  __delay_cycles(100000);         LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                                // For debugger                 LTWriteReg(7, 0x0080);    //接收模式          __delay_cycles(100000);         while_LT8920_PKT_1;                 //LTWriteReg(52, 0x8080); //清空 RXTX                  DIS_DN;         goto re_IO_Test;      }//if_LT8920_PKT_0//检查是否接收到数据             } //for (i = 0; i<10000; i++)     Play_x(2);//"吸气超时"          __delay_cycles(2000000);      goto re_RF_Test; //re_RF_Test:SELF_TEST }//while (1)           NO_sensor:                   Play_x(6);//"未检测到传感器"          __delay_cycles(3000000);      DIS_4;//                goto re_SELF_TEST; //re_RF_Test:SELF_TEST               while (1)     {       }       } STM32L053C8T6骨传感鼻呼吸检测主程序源码: int main(void) {   /* USER CODE BEGIN 1 */     /* USER CODE END 1 */     /* MCU Configuration--------------------------------------------------------*/     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */   HAL_Init();    unsigned char i,temp_hi,temp_lo;    unsigned int i2s_data16;      /* USER CODE BEGIN Init */     /* USER CODE END Init */     /* Configure the system clock */   SystemClock_Config();     /* USER CODE BEGIN SysInit */     /* USER CODE END SysInit */     /* Initialize all configured peripherals */   MX_GPIO_Init();   MX_TIM6_Init();   //MX_USART1_UART_Init();   //MX_ADC_Init();   //MX_DAC_Init();   MX_I2S2_Init();    HAL_Delay(2000);    GU_CE_ON;    PA5_ON;   /* USER CODE BEGIN 2 */     /* USER CODE END 2 */   HAL_Delay(2000); //GND450_OFF;//GND450_OFF     /* Infinite loop */ /*   */    SPI2->I2SPR |= 0x0202;//SPI2->SPI_I2SPR |= 0x0F00;    //hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;    SPI2->I2SCFGR |= 0x0F00;//SPI_I2SPR    //__HAL_I2S_ENABLE(&hi2s2);//&hi2s2//hi2s wDIS1P_LIS25BA(0x26,0x00);   wDIS1P_LIS25BA(0x2e,0x10);   wDIS1P_LIS25BA(0x2f,0x21);//0x21-AXISX_EN   HAL_Delay(1000);   //while_KEY_PC13; RED_ON;   GU_CE_OFF; HAL_Delay(1000);    while (1)   { repeat:    HAL_Delay(1);    wDIS1P_LIS25BA(0x2e,0x00);    //HAL_Delay(10);       HAL_I2S_Receive(&hi2s2, i2s_Data, 32, 100);       i2s_data16=i2s_Data[30];//28    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff));            if((temp_hi==0)&&(temp_lo==0))    goto repeat;       USART1->TDR = temp_hi;    //HE_delay_1ms(); /*        i2s_data16=i2s_Data[29];    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff));       i2s_data16=i2s_Data[30];    temp_hi=(unsigned char)(i2s_data16>>8);//(~(i2s_data16>>8));    temp_lo=(unsigned char)(i2s_data16&0x00ff);//(~(i2s_data16&0x00ff)); */      if(i2s_data16>GATE_UP)    {    GU_CE_ON;    PA5_ON;    }    if(i2s_data16<GATE_DN)   {    GU_CE_OFF;    PA5_OFF;        }         /*         #define H2bit 0x01         #define L2bit 0x00         #define Double_Bit 0x02         DIS_CH450_HEX(L2bit,0,0);         */    wDIS1P_LIS25BA(0x2e,0x80);      //HAL_Delay(500);    }     } 光采集和信号发送电路的主程序源码: int main(void) {       volatile uint32_t i;         // Stop watchdog timer     WDT_A_hold(WDT_A_BASE);       P2DIR &= ~BIT6;  //P1DIR &= ~(BIT3);                   // Configure P1.3 as input direction pin       P2OUT |= BIT6; // Configure P1.0 as pulled-up       P2REN |= BIT6;// P1.0 pull-up register enable              P3REN |=BIT1;                 P2REN |=BIT3;                 P3REN |=BIT0;                 P2REN |=BIT5;                 DIS_1306_RST0;             // Set P1.0 to output direction     GPIO_setAsOutputPin(         GPIO_PORT_P1,         GPIO_PIN0         ); P1OUT |=  0x01;       // Disable the GPIO power-on default high-impedance mode     // to activate previously configured port settings     PMM_unlockLPM5();   P2OUT|=BIT4; P2REN |=BIT4;    P2DIR&=~BIT4;// //P2REN |=BIT4; //for(i=30000; i>0; i--);                 P3OUT |= BIT2; // Configure P1.0 as pulled-up       P3REN |= BIT2;// P1.0 pull-up register enable       P3DIR &= ~BIT2;  //P1DIR &= ~(BIT3);       P2OUT|=BIT7; P2DIR|=BIT7; P2REN|=BIT7;   //DIS_1306_VDD_OFF;//#define DIS_1306_VDD_OFF P2OUT&=~BIT3 //DIS_1306_BAT_OFF;//#define DIS_1306_BAT_OFF P2OUT&=~BIT6    LED1_ON;   //__delay_cycles(2000); //DIS_1306_Power_up();   //__delay_cycles(500000); //set_time();       LT8920_RST_0;     LT8920_RST_o;     __delay_cycles(2000);                  LT8920_SS_o;     LT8920_SS_1; //LT8920_SS_0;         LT8920_RST_1;     __delay_cycles(200000);     LT8920_SS_0;      __delay_cycles(100000);           LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);             RF_Init();     __delay_cycles(10000);       LT8920_PKT_i;     LT8920_PKT_1;           LTWriteReg(7,0x0000);         LTWriteReg(52,0x8080);    __delay_cycles(200000);    LED1_OFF;// GRE_ON; //BLU_ON;   LED1_OFF;// _OFF;       //发送循环      P2IFG = 0;//P2IFG = 0;            P1DIR &= ~BIT4;  //P1DIR &= ~(BIT3);                   // Configure P1.3 as input direction pin    // P2OUT &= ~ BIT4; //  P1OUT |= BIT3;                      // Configure P1.3 as pulled-up     P1OUT |= BIT4; // &= ~ BIT4; // P1OUT |= BIT3;  // Configure P1.3 as pulled-up      //P1REN |= BIT4;//P1REN |= BIT3;                      // P1.3 pull-up register enable         //P1IES  |= BIT4;//&= ~ BIT6;//P1IES |= BIT3;  // Hi/Low edge       //Bit = 1: Respective PxIFG flag is set on a high-to-low transition       //Bit = 0: Respective PxIFG flag is set on a low-to-high transition                  P1IFG = 0;//P1IFG = 0;                          // Clear all P1 interrupt flags      //                    // P1.3 interrupt enabled                //while(P2IN & BIT6);// (P2IN & ~BIT7);//((P1IN & BIT4)||(P2IN & BIT7));            while (1)     {         while_HE_KEY_1;//#define while_HE_KEY_1 while(P2IN & BIT4)             LT8920_RST_1;     __delay_cycles(10000);     LT8920_SS_0;      __delay_cycles(200000);                                       LTWriteReg(50,0x0600);//6字节长度                                           LTWriteReg(50,0xABAB);                      LTWriteReg(50,0xCDCD);                 LTWriteReg(7,0x0100);//SPI_WriteReg(7, 0x01, 0x00);   //发送         //__delay_cycles(1000000);         while_LT8920_PKT_0;//#define while_LT8920_PKT_0 while(!(P1IN & BIT6))         //while_LT8920_PKT_1;//#define while_LT8920_PKT_1 while(P1IN & BIT6)         __delay_cycles(200000);         LTReadReg(52);//SPI_ReadReg(52);//判断是否收到对方自动应答信号         //UART_TX(byt.adc[1]);         //UART_TX(byt.adc[0]);                 if((byt.adc[1]& 0x3F)==0)//如果收到应答信号点亮本地对应的LED         {                    LED1_ON;// GRE_ON; //BLU_ON;            //__delay_cycles(2000000);         }                 __delay_cycles(10);//delay_us(10);           LTWriteReg(7,0x0000);//SPI_WriteReg(7, 0x00, 0x00);      //设定模式         LTWriteReg(52,0x8080);//SPI_WriteReg(52, 0x80, 0x80);     //清空接收、发送FIFO数据                 __delay_cycles(200000);//2019-12-21         LED1_OFF; //BLU_ON; //GRE_OFF;   LTWriteReg(35,0x8300);//(35,0xc300); __delay_cycles(100000);       //while_HE_KEY_1;// (P2IN & BIT7);       }//while (1)// //发送循环     } 关于处理传感器数据问题,由于SensorTile.Box模组本身的软硬件构成已经把传感器过程数据完全封装在了内部处理,只需采用其通过手机APP设定和输出的结果就可以了;鼻呼吸传感识别电路用到的LIS25BA骨震动传感模组的二次开发需要首先了解其传感器数据输出细节,相对于SensorTile.Box模组的应用来说有些难度,为了便于直观快速理解数据意义,特别编写了电脑上位机的数据图示化观察小软件和下位机软硬件电路配合,通过下位机驱动LIS25BA骨震动传感模组读取数据,并发送到电脑上直观观察,可以有效帮助理解其工作数据意义,便于进一步编制对数据处理的后续单片机程序。上位机程序界面从实际演示视频中截屏图片如下(用粉色棒条长短变化代表三个轴向加速度数据实时变化): SensorTile.Box模组通过手机APP上载固件设置成专家模式的方向变化检测 (使用陀螺仪 )模式,其手机端设置过程屏幕截图如下,已经用数字号码按从小到大前后排序,并且把数字序号放在靠近每一步操作按钮或区域的附近处便于查对识别。我截取的是主要的24个步骤,到第24步时就可以退出APP操作,正常使用陀螺仪的感测和LED发光指示功能了:   六、视频演示(视频简介+链接) 1、项目整体演示视频地址: https://v.youku.com/v_show/id_XNDczNTgxOTI2NA==.html?spm=a2hbt.13141534.0.13141534 视频中首先演示了正常开机上电到通过鼻呼吸传感器和腹部运动传感器的在线检测,即按照语音提示做一次“吸”、“呼”动作,其中吸气对应的腹部运动是用手轻微触碰一下SensorTile.Box模组来模拟,呼气对应的鼻孔处呼气震动我用了一个橡皮气囊吹气来代替,实际使用时放在鼻孔下的LIS25BA骨震动传感模组的反应会因真实鼻孔出气的持续时间比气囊长很多(虽然出气强度也相比气囊弱很多)而使识别效果更佳,因为手捏气囊出气无法实现均匀慢长的模拟,所以给人感觉似乎是需要很大、超过实际的出气效果。之后手按提示按键开始正常腹式呼吸训练,过程中模拟了一下偶尔没有鼻呼吸的“呼”动作,没有腹部运动的“吸”动作,以及“呼”动作不规范等情况发生,仪器的反应和给出提醒的情况;接着演示触摸感应开关,关机再开机,并且在新一轮传感器在线检测时分别模拟没有给出传感器相应动作回应时,仪器给出的语音提示;接下来还是一遍正常训练过程演示,之后关掉仪器,撤走支撑演示的水杯后,拿起整个头戴式训练仪在镜头前换角度展示一下,最后停止视频。因为仪器采用了微型扬声器,所以声音不是很大,视频中可能听得不很清楚,但实际使用中因为和佩戴耳麦一样喇叭是靠近耳朵的,所以声音实际效果还是很显大的。   2、骨震动传感器读取数据通过上位机图示观察视频: https://v.youku.com/v_show/id_XNDczNTk0MjcwOA==.html?spm=a2hbt.13141534.app.5~5!2~5!2~5~5~5!2~5~5!2~5!2~5!2~5~5~A 视频演示的是项目过程中为了直观形象理解骨震动传感器采集数据的实际意义而临时开发的上位机图示观察软件的运行情况,软件界面上左上角处有代表三个轴向加速度传感器数据变化的粉红色棒条,实时随着手拿传感器的位置变动而变化,借此帮助确定后续单片机读数和判断程序的编制。这段视频背景音有点混杂电视里动画片的声音。   3、专门制作的下位机骨振动测试电路完成演示视频: https://v.youku.com/v_show/id_XNDY4MDYyNjQwOA==.html?spm=a2hbt.13141534.0.13141534 这段视频是专门为测试LIS25BA骨震动传感器模组而设计的一块电路板,包括USB转串口+电源轨变换+本地LED显示,可以通过USB转串口把读取的传感器数据发给电脑端查看,板上采取了项目中将要用到的STM32L053C8T6单片机,确认能够正确读取传感器数据的程序,可以直接转移到后续正式作品上应用。   七、项目总结(项目文字总结+帖子分享链接汇总) 疫情当前,人们应该反思的有很多,其中之一就包括重新审视、重视自身健康锻炼和提升个人免疫力的重要性,个人免疫力的提升与身、心双健密切相关,身是外在体格锻炼,心是内在德行、心境的修养,二者统一锻炼最常见的入门方法之一就是腹式呼吸训练,这是个说来容易做起来难的课题:因为练习首先要求静心,而当人想要入静时,偏偏会出现心思反倒无序乱跑的情况。腹式呼吸具体还分为顺腹式呼吸和逆腹式呼吸两种,简单说来就是——顺腹式呼吸:用鼻吸气,嘴巴闭住,腹部要凸起,呼气腹部要收缩;逆腹式呼吸:用鼻吸气,嘴巴闭住,腹部要收缩,呼气腹部要凸起,最好配合一点行气意念的想象,总体要领就这些,而人们日常形成的自然呼吸习惯是不管腹部配合的,就是凭借胸廓自然运动的呼吸,几乎在“无意识下”就已经“自动”完成了。可腹式呼吸初步训练是在一次要求十几分钟或者半个多小时乃至更长的时间内让人们主动放弃自然呼吸模式,而改换成与自然习惯完全不同的呼吸方式,还要求韵律节奏合规,如果没有教练在跟前全程指导,普通人是很难快速熟悉掌握并运用自如的。而利用意法半导体这次活动提供的陀螺仪和加速度传感器监测这个呼吸运动配合过程,并编制相应微处理器控制程序来辅助提示练习者执行鼻呼吸和腹部的凸起、收缩起伏变化动作,既可以把动作节奏掌控得准确合拍,还能不知疲倦毫无怨言的连续不断语音指导,胜过任何真人教练的耐心。借助这个电子辅助设备,从此就可以实现象有个贴身教练一样自动执行优选教程,在每次练习过程中,中规中矩的按时发出语音提示防止(并且还能及时语音提示纠正)练习者精神溜号跑路,使合规的腹式呼吸练习进程得以顺利完成。 另外,技术人员做项目最好施行能一遍工作适应多种用途的考虑所有环节问题,以便尽量扩展所花费时间的价值,无论在设计硬件或是软件的过程中,这样尽量开放设计思维的初衷也是最大化实现模块重用思想的体现。本作品设计过程就实行了这样的想法,比如硬件不变,功能通过软件改换,这个作品轻易就可以转变成一个自制的小型头戴式MP3播放器,虽然存储空间是硬件FLASH芯片,存曲数量有限,但足以满足装下一己爱听的常用几首歌曲的目的了;一个按钮也可以凭“单双击”、“长短按”来区分上下首进、退或者暂停、继续等功能,另外程控语音播报+无线数据收发的硬件功能组合,也容易被改造成除MP3播放器以外其它实用功能的电子设备;结合了LIS25BA骨震动传感模组的鼻呼吸传感识别电路显然也可以以模块形式应用到其它需求的设计中去,包括3D打印外壳在设计时也照顾到了要可以放到其它项目中的可用性等等。 从始至终项目相关发帖汇总链接网址: http://home.eeworld.com.cn/space-uid-457089-2.html 各具体分网址: 1、2020-4-14--APP搜索不到 sensortile box是电池问题 http://bbs.eeworld.com.cn/thread-1117798-1-1.html 2、2020-4-14--验证版主建议结果 http://bbs.eeworld.com.cn/thread-1117901-1-1.html 3、2020-4-30--自制传感器测试板(骨振动)画完投板了 http://bbs.eeworld.com.cn/thread-1120746-1-1.html 4、2020-5-21--骨振动测试完成了 http://bbs.eeworld.com.cn/thread-1123653-1-1.html 5、2020-5-25--中心主控电路板PCB今天布完发给厂家制板了 http://bbs.eeworld.com.cn/thread-1124247-1-1.html 6、2020-6-23--抽空给作品画了个3D打印的外壳 http://bbs.eeworld.com.cn/thread-1129237-1-1.html   八、其他 出于易于快捷实现的原因,作品中使用的所有提示语音素材都是用电脑合成的女声效果,略显生硬,并不十分适用于人们需要清净舒缓氛围的运动练习项目,后续可以考虑采用更能契合、照顾项目内在主旨的真人录音代替。想起西方技术界流传过大意是这样的一句话“工程师应该是能用花1美元解决别人要花10美元才能解决问题的人”,我们可以理解其包含的意思应该有:要动脑寻求以至简的手段恰当达成设计意图的能力——以此与通道们共勉。                                                                                                                                                                                                                       2020年7月5日星期日

  • 2020-07-04
  • 加入了学习《羽毛球训练监测器项目》,观看 羽毛球训练监测器项目--功能测试

  • 2020-07-02
  • 加入了学习《作品展示-童姿提醒器》,观看 作品展示-童姿提醒器

  • 2020-06-24
  • 回复了主题帖: 2020-6-23-抽空给作品画了个3D打印的外壳

    qwqwqw2088 发表于 2020-6-24 07:33 在sw软件中这步叫做抽壳 楼主用的什么软件
    DesignSpark Mechanical.版主的帖子竟然是数以万计的!让两位数帖子数的人难以想象啊。

  • 2020-06-23
  • 发表了主题帖: 2020-6-23-抽空给作品画了个3D打印的外壳

  • 2020-06-09
  • 回复了主题帖: 颁奖:有奖直播:深入探讨迈来芯高可靠可编程霍尔开关

    谢谢EEWORLD   确认个人信息无误

  • 2020-05-25
  • 回复了主题帖: 中心主控电路板PCB今天布完发给厂家制板了

    谢谢夸奖

  • 发表了主题帖: 中心主控电路板PCB今天布完发给厂家制板了

    中心主控电路板PCB今天布完发给厂家制板了,按计划行事,对自己是个督促。

  • 2020-05-21
  • 回复了主题帖: 2020-5-21-骨振动测试完成了

    对了还有做到在发I2C通信命令前先准备好稳定的I2S三个时钟MCLK/BCLK/WCLK 

  • 回复了主题帖: 2020-5-21-骨振动测试完成了

    关于驱动LIS25BA过程需要注意的点: 挠性板上器件从地址选择焊点I2C_A0需要焊上,根据自己软件自行选择接高还是接地,我是选择了靠外边易于下烙铁的点。 注意LIS25BA数据手册第22页5.3节那句话:“The slave address is equal to 001100yx (TDM mode, where y = not(I2C_A0 pin)) or in case of writing or reading respectively.”--从地址命令字中x是读写位;软件中y位为I2C_A0引脚硬件配置结果的取反。 注意LIS25BA数据手册第23页6.2.1节图13下边那句话,准确读数前软件里要加入至少5.5毫秒延时。 每一次通信建立后要放弃3次采样结果,意味着数据页上17页4.4节的图7、图8中的每帧SLOT0~ SLOT7要放弃3帧,即取SLOT24(含)以后的轴数据字为有效字。 我是采用的I2S通信协议读取的数据。

  • 发表了主题帖: 2020-5-21-骨振动测试完成了

    骨振动测试完成了,视频中弹纸鼓动时绿灯点亮为检测到微风振动标志。视频地址:https://v.youku.com/v_show/id_XNDY4MDYyNjQwOA==.html?spm=a2hbt.13141534.0.13141534  

  • 2020-05-06
  • 加入了学习《直播回放: ST MEMS 传感器开发套件简介、了解内嵌“有限状态机和机器学习内核”的传感器》,观看 答疑记录

  • 2020-05-05
  • 回复了主题帖: 自制传感器测试板(骨振动)画完投板了

    poponianhua 发表于 2020-5-5 06:50 做好了贴片怎么搞?有机器?
    ST提供的骨传感器套件是已经贴好BGA的小片FPC,对外接线已经是2.54脚距的标准孔焊盘,不用使用者贴了

  • 2020-04-30
  • 回复了主题帖: 自制传感器测试板(骨振动)画完投板了

    不好意思各位跟帖无法及时回复啊,偶尔来看一下,主要在这给自己的进程留个笔记。貌似器件多,其实简单的USB转串口+电源轨变换+本地LED显示而已,板子小排的密显得好像复杂

  • 发表了主题帖: 自制传感器测试板(骨振动)画完投板了

    2020-4-30-今天把自制骨传感器测试电路板PCB投给厂家制板去了,告知五一以后才能投产了。

最近访客

< 1/2 >

统计信息

已有27人来访过

  • 芯币:11
  • 好友:--
  • 主题:8
  • 回复:24
  • 课时:--
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


liangtom125 2020-6-4
加个微信?
查看全部