体感手套 #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
汇总贴在此:
体感手套—by 北方
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=564975&fromuid=536508
(出处: 电子工程世界-论坛)
页:
[1]