北方 发表于 2017-9-22 13:00

体感手套 #5 项目综合调试

本帖最后由 北方 于 2017-9-22 13:09 编辑

1. 在项目中增加了串口的输出,选择UART2,即P3_1和P3_0作为串行输出,把采集的位置信号传输到蓝牙模块// Hardware serial port over UART2
Serial btlink(P3_1, P3_0); // serial(Tx,Rx); UART2
2. 在项目中,输出量化采集的信号。
      c = xyDirection;
      btlink.putc(c);
3. 代码如下
#include "mbed.h"
#include "max32630fthr.h"
#include "bmi160.h"

#define xyTHRESHOLD 0.1   //THRESHOLD for x-y gyroDATA
uint8_t xyDirection;
void sendingBY(uint8_t xyDirection);

void dumpImuRegisters(BMI160 &imu);
void printRegister(BMI160 &imu, BMI160::Registers reg);
void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg);

// Hardware serial port over UART2
Serial btlink(P3_1, P3_0); // serial(Tx,Rx); UART2

int main()
{
    //MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
   
    DigitalOut rLED(LED1, LED_OFF);
    DigitalOut gLED(LED2, LED_OFF);
    DigitalOut bLED(LED3, LED_OFF);
   
    I2C i2cBus(P5_7, P6_0);
    i2cBus.frequency(400000);
    BMI160_I2C imu(i2cBus, BMI160_I2C::I2C_ADRS_SDO_LO);
   
    printf("\033[H");//home
    printf("\033[0J");//erase from cursor to end of screen
   
    uint32_t failures = 0;
    int c;

   
    if(imu.setSensorPowerMode(BMI160::GYRO, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
    {
      printf("Failed to set gyroscope power mode\n");
      failures++;
    }
    wait_ms(100);
   
    if(imu.setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR)
    {
      printf("Failed to set accelerometer power mode\n");
      failures++;
    }
    wait_ms(100);
   
   
    BMI160::AccConfig accConfig;
    //example of using getSensorConfig
    if(imu.getSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
    {
      printf("ACC Range = %d\n", accConfig.range);
      printf("ACC UnderSampling = %d\n", accConfig.us);
      printf("ACC BandWidthParam = %d\n", accConfig.bwp);
      printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
    }
    else
    {
      printf("Failed to get accelerometer configuration\n");
      failures++;
    }
   
    //example of setting user defined configuration
    accConfig.range = BMI160::SENS_4G;
    accConfig.us = BMI160::ACC_US_OFF;
    accConfig.bwp = BMI160::ACC_BWP_2;
    accConfig.odr = BMI160::ACC_ODR_8;
    if(imu.setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR)
    {
      printf("ACC Range = %d\n", accConfig.range);
      printf("ACC UnderSampling = %d\n", accConfig.us);
      printf("ACC BandWidthParam = %d\n", accConfig.bwp);
      printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
    }
    else
    {
      printf("Failed to set accelerometer configuration\n");
      failures++;
    }
   
    BMI160::GyroConfig gyroConfig;
    if(imu.getSensorConfig(gyroConfig) == BMI160::RTN_NO_ERROR)
    {
      printf("GYRO Range = %d\n", gyroConfig.range);
      printf("GYRO BandWidthParam = %d\n", gyroConfig.bwp);
      printf("GYRO OutputDataRate = %d\n\n", gyroConfig.odr);
    }
    else
    {
      printf("Failed to get gyroscope configuration\n");
      failures++;
    }
   
    wait(1.0);
    printf("\033[H");//home
    printf("\033[0J");//erase from cursor to end of screen
   
    if(failures == 0)
    {
      float imuTemperature;
      BMI160::SensorData accData;
      BMI160::SensorData gyroData;
      BMI160::SensorTime sensorTime;
      
      while(1)
      {
            xyDirection = 0;
            imu.getGyroAccXYZandSensorTime(accData, gyroData, sensorTime, accConfig.range, gyroConfig.range);
            imu.getTemperature(&imuTemperature);
            
            //printf("ACC xAxis = %s%4.3f\n", "\033[K", accData.xAxis.scaled);
            //printf("ACC yAxis = %s%4.3f\n", "\033[K", accData.yAxis.scaled);
            //printf("ACC zAxis = %s%4.3f\n\n", "\033[K", accData.zAxis.scaled);
            
            printf("GYRO xAxis = %s%5.1f\n", "\033[K", gyroData.xAxis.scaled);
            printf("GYRO yAxis = %s%5.1f\n", "\033[K", gyroData.yAxis.scaled);
            printf("GYRO zAxis = %s%5.1f\n\n", "\033[K", gyroData.zAxis.scaled);
            
            //printf("Sensor Time = %s%f\n", "\033[K", sensorTime.seconds);
            //printf("Sensor Temperature = %s%5.3f\n", "\033[K", imuTemperature);
            
            if (gyroData.xAxis.scaled > 1*xyTHRESHOLD) {
                xyDirection=6;}
                else if (gyroData.xAxis.scaled < (-1)*xyTHRESHOLD) {
                  xyDirection=4;}
                  else if (gyroData.yAxis.scaled > 1*xyTHRESHOLD) {
                        xyDirection=8;}
                        else if (gyroData.yAxis.scaled < (-1)*xyTHRESHOLD) {
                            xyDirection=2;}
                           
            printf("xyDirection = %s%x\n", "\033[K", xyDirection);
            sendingBY(xyDirection); //Sending xyDirection to bluetooth via UART


            
            printf("\033[H");//home
            gLED = !gLED;
            

      c = xyDirection;
      btlink.putc(c);

      }
    }
    else
    {
      while(1)
      {
            rLED = !rLED;
            printf("Fail to read. CHECK the wiring.");//Fail and check.
            wait(0.25);
      }
    }
}


//*****************************************************************************
void dumpImuRegisters(BMI160 &imu)
{
    printRegister(imu, BMI160::CHIP_ID);
    printBlock(imu, BMI160::ERR_REG,BMI160::FIFO_DATA);
    printBlock(imu, BMI160::ACC_CONF, BMI160::FIFO_CONFIG_1);
    printBlock(imu, BMI160::MAG_IF_0, BMI160::SELF_TEST);
    printBlock(imu, BMI160::NV_CONF, BMI160::STEP_CONF_1);
    printRegister(imu, BMI160::CMD);
    printf("\n");
}


//*****************************************************************************
void printRegister(BMI160 &imu, BMI160::Registers reg)
{
    uint8_t data;
    if(imu.readRegister(reg, &data) == BMI160::RTN_NO_ERROR)
    {
      printf("IMU Register 0x%02x = 0x%02x\n", reg, data);
    }
    else
    {
      printf("Failed to read register\n");
    }
}


//*****************************************************************************
void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg)
{
    uint8_t numBytes = ((stopReg - startReg) + 1);
    uint8_t buff;
    uint8_t offset = static_cast<uint8_t>(startReg);
   
    if(imu.readBlock(startReg, stopReg, buff) == BMI160::RTN_NO_ERROR)
    {
      for(uint8_t idx = offset; idx < (numBytes + offset); idx++)
      {
            printf("IMU Register 0x%02x = 0x%02x\n", idx, buff);
      }
    }
    else
    {
      printf("Failed to read block\n");
    }
}


//******sendingBY(xyDirection)***************
void sendingBY(uint8_t xyDirection)
{
    //printf("Sending direction OK, which is %u",xyDirection);

    printf("\n");
}
附件:
MBED所build的可执行文件FTHR_Gloove_MAX32630FTHR.bin







okhxyyo 发表于 2017-10-2 15:39

汇总贴在此:
体感手套—by 北方
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=564975&fromuid=536508
(出处: 电子工程世界-论坛)
页: [1]
查看完整版本: 体感手套 #5 项目综合调试