336 lines
8.9 KiB
C++
336 lines
8.9 KiB
C++
#include "REG.h"
|
|
#include "wit_c_sdk.h"
|
|
|
|
// #define ACC_UPDATE 0x01
|
|
// #define GYRO_UPDATE 0x02
|
|
// #define ANGLE_UPDATE 0x04
|
|
// #define MAG_UPDATE 0x08
|
|
// #define READ_UPDATE 0x80
|
|
|
|
// char s_cDataUpdate = 0;
|
|
// const uint32_t c_uiBaud[8] = {0, 4800, 9600, 19200,
|
|
// 38400, 57600, 115200, 230400};
|
|
|
|
// float fAcc[3], fGyro[3], fAngle[3];
|
|
|
|
// bool setup_ok = true;
|
|
|
|
// static void SensorUartSend(uint8_t *p_data, uint32_t uiSize);
|
|
// static void SensorDataUpdate(uint32_t uiReg, uint32_t uiRegNum);
|
|
// static void Delayms(uint16_t ucMs);
|
|
// static void AutoScanSensor();
|
|
|
|
// void setup() {
|
|
// Serial.begin(115200);
|
|
// WitInit(WIT_PROTOCOL_NORMAL, 0x50);
|
|
// WitSerialWriteRegister(SensorUartSend);
|
|
// WitRegisterCallBack(SensorDataUpdate);
|
|
// WitDelayMsRegister(Delayms);
|
|
// AutoScanSensor();
|
|
|
|
// // Ensure the setting for the sensor is the default
|
|
// if (WitSetBandwidth(BANDWIDTH_256HZ) != WIT_HAL_OK) {
|
|
// Serial.print("Set Bandwidth Error\r\n");
|
|
// setup_ok = false;
|
|
// return;
|
|
// }
|
|
|
|
// // if (WitSetUartBaud(WIT_BAUD_115200) != WIT_HAL_OK) {
|
|
// // Serial.print("Set baud error\r\n");
|
|
// // setup_ok = false;
|
|
// // return;
|
|
// // } else {
|
|
// // Serial1.begin(115200);
|
|
// // }
|
|
|
|
// if (WitSetOutputRate(RRATE_1HZ) != WIT_HAL_OK) {
|
|
// Serial.print("Can't set report rate to 10Hz!\r\n");
|
|
// setup_ok = false;
|
|
// return;
|
|
// }
|
|
|
|
// if (WitSetContent(RSW_ACC | RSW_GYRO | RSW_ANGLE | RSW_MAG) != WIT_HAL_OK)
|
|
// {
|
|
// Serial.print("Set RSW Error\r\n");
|
|
// setup_ok = false;
|
|
// return;
|
|
// }
|
|
// }
|
|
|
|
// void loop() {
|
|
// while (Serial1.available()) {
|
|
// WitSerialDataIn(Serial1.read());
|
|
// }
|
|
|
|
// // if (s_cDataUpdate) {
|
|
// // for (int i = 0; i < 3; i++) {
|
|
// // fAcc[i] = sReg[AX + i] / 32768.0f * 16.0f; // Unit: g(9.8m/s^2)
|
|
// // fGyro[i] = sReg[GX + i] / 32768.0f * 2000.0f; // Unit: deg/s
|
|
// // fAngle[i] = sReg[Roll + i] / 32768.0f * 180.0f; // Unit: deg
|
|
// // }
|
|
|
|
// // if (s_cDataUpdate & ACC_UPDATE) {
|
|
// // Serial.print("acc:");
|
|
// // Serial.print(fAcc[0], 3);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fAcc[1], 3);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fAcc[2], 3);
|
|
// // Serial.print("\r\n");
|
|
// // s_cDataUpdate &= ~ACC_UPDATE;
|
|
// // }
|
|
// // if (s_cDataUpdate & GYRO_UPDATE) {
|
|
// // Serial.print("gyro:");
|
|
// // Serial.print(fGyro[0], 1);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fGyro[1], 1);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fGyro[2], 1);
|
|
// // Serial.print("\r\n");
|
|
// // s_cDataUpdate &= ~GYRO_UPDATE;
|
|
// // }
|
|
// // if (s_cDataUpdate & ANGLE_UPDATE) {
|
|
// // Serial.print("angle:");
|
|
// // Serial.print(fAngle[0], 3);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fAngle[1], 3);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(fAngle[2], 3);
|
|
// // Serial.print("\r\n");
|
|
// // s_cDataUpdate &= ~ANGLE_UPDATE;
|
|
// // }
|
|
// // if (s_cDataUpdate & MAG_UPDATE) {
|
|
// // Serial.print("mag:");
|
|
// // Serial.print(sReg[HX]);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(sReg[HY]);
|
|
// // Serial.print(" ");
|
|
// // Serial.print(sReg[HZ]);
|
|
// // Serial.print("\r\n");
|
|
// // s_cDataUpdate &= ~MAG_UPDATE;
|
|
// // }
|
|
// // s_cDataUpdate = 0;
|
|
// // }
|
|
// }
|
|
|
|
// static void SensorUartSend(uint8_t *p_data, uint32_t uiSize) {
|
|
// Serial1.print("Sensor says: ");
|
|
// Serial1.write(p_data, uiSize);
|
|
// Serial1.flush();
|
|
// };
|
|
|
|
// static void SensorDataUpdate(uint32_t uiReg, uint32_t uiRegNum) {
|
|
// int i;
|
|
// for (i = 0; i < uiRegNum; i++) {
|
|
// switch (uiReg) {
|
|
// case AZ:
|
|
// s_cDataUpdate |= ACC_UPDATE;
|
|
// break;
|
|
// case GZ:
|
|
// s_cDataUpdate |= GYRO_UPDATE;
|
|
// break;
|
|
// case HZ:
|
|
// s_cDataUpdate |= MAG_UPDATE;
|
|
// break;
|
|
// case Yaw:
|
|
// s_cDataUpdate |= ANGLE_UPDATE;
|
|
// break;
|
|
// default:
|
|
// s_cDataUpdate |= READ_UPDATE;
|
|
// break;
|
|
// }
|
|
// uiReg++;
|
|
// }
|
|
// Serial.println(s_cDataUpdate);
|
|
// };
|
|
|
|
// static void Delayms(uint16_t ucMs) { delay(ucMs); }
|
|
|
|
// static void AutoScanSensor() {
|
|
// int i, iRetry;
|
|
|
|
// for (i = 0; i < sizeof(c_uiBaud) / sizeof(c_uiBaud[0]); i++) {
|
|
// Serial1.begin(c_uiBaud[i]);
|
|
// Serial1.flush();
|
|
// iRetry = 2;
|
|
// s_cDataUpdate = 0;
|
|
// do {
|
|
// WitReadReg(AX, 3);
|
|
// delay(200);
|
|
// while (Serial1.available()) {
|
|
// WitSerialDataIn(Serial1.read());
|
|
// }
|
|
// if (s_cDataUpdate != 0) {
|
|
// Serial.print(c_uiBaud[i]);
|
|
// Serial.print(" baud find sensor\r\n\r\n");
|
|
// return;
|
|
// }
|
|
// iRetry--;
|
|
// } while (iRetry);
|
|
// }
|
|
// Serial.print("can not find sensor\r\n");
|
|
// Serial.print("please check your connection\r\n");
|
|
// }
|
|
|
|
/*
|
|
Test on MEGA 2560. use WT901CTTL sensor
|
|
|
|
WT901CTTL MEGA 2560a
|
|
VCC <---> 5V/3.3V
|
|
TX <---> 19(TX1)
|
|
RX <---> 18(RX1)
|
|
GND <---> GND
|
|
*/
|
|
|
|
#define ACC_UPDATE 0x01
|
|
#define GYRO_UPDATE 0x02
|
|
#define ANGLE_UPDATE 0x04
|
|
#define MAG_UPDATE 0x08
|
|
#define READ_UPDATE 0x80
|
|
static volatile char s_cDataUpdate = 0, s_cCmd = 0xff;
|
|
|
|
static void CmdProcess(void);
|
|
static void AutoScanSensor(void);
|
|
static void SensorUartSend(uint8_t *p_data, uint32_t uiSize);
|
|
static void SensorDataUpdata(uint32_t uiReg, uint32_t uiRegNum);
|
|
static void Delayms(uint16_t ucMs);
|
|
const uint32_t c_uiBaud[8] = {0, 4800, 9600, 19200,
|
|
38400, 57600, 115200, 230400};
|
|
|
|
int i;
|
|
float fAcc[3], fGyro[3], fAngle[3];
|
|
|
|
void setup() {
|
|
// put your setup code here, to run once:
|
|
Serial.begin(115200);
|
|
WitInit(WIT_PROTOCOL_NORMAL, 0x50);
|
|
WitSerialWriteRegister(SensorUartSend);
|
|
WitRegisterCallBack(SensorDataUpdata);
|
|
WitDelayMsRegister(Delayms);
|
|
AutoScanSensor();
|
|
|
|
if (WitStartAccCali() == WIT_HAL_OK) {
|
|
Serial.print("Start Calibri");
|
|
delay(1000);
|
|
Serial.print("Stop calibri");
|
|
WitStopAccCali();
|
|
} else {
|
|
Serial.print("Cannot start calibri acc\r\n");
|
|
}
|
|
|
|
if (WitSetUartBaud(WIT_BAUD_9600) != WIT_HAL_OK)
|
|
Serial.print("\r\nSet Baud Error\r\n");
|
|
else {
|
|
Serial1.begin(c_uiBaud[WIT_BAUD_9600]);
|
|
Serial.print(" 115200 Baud rate modified successfully\r\n");
|
|
}
|
|
}
|
|
void loop() {
|
|
while (Serial1.available()) {
|
|
WitSerialDataIn(Serial1.read());
|
|
}
|
|
if (s_cDataUpdate) {
|
|
for (i = 0; i < 3; i++) {
|
|
fAcc[i] = sReg[AX + i] / 32768.0f * 16.0f * 9.8f; // Unit: m/s^2
|
|
fGyro[i] = sReg[GX + i] / 32768.0f * 2000.0f; // Unit: deg/s
|
|
fAngle[i] = sReg[Roll + i] / 32768.0f * 180.0f; // Unit: deg
|
|
}
|
|
if (s_cDataUpdate & ACC_UPDATE) {
|
|
Serial.print("acc:");
|
|
Serial.print(fAcc[0], 3);
|
|
Serial.print(" ");
|
|
Serial.print(fAcc[1], 3);
|
|
Serial.print(" ");
|
|
Serial.print(fAcc[2], 3);
|
|
Serial.print("\r\n");
|
|
s_cDataUpdate &= ~ACC_UPDATE;
|
|
}
|
|
if (s_cDataUpdate & GYRO_UPDATE) {
|
|
Serial.print("gyro:");
|
|
Serial.print(fGyro[0], 1);
|
|
Serial.print(" ");
|
|
Serial.print(fGyro[1], 1);
|
|
Serial.print(" ");
|
|
Serial.print(fGyro[2], 1);
|
|
Serial.print("\r\n");
|
|
s_cDataUpdate &= ~GYRO_UPDATE;
|
|
}
|
|
if (s_cDataUpdate & ANGLE_UPDATE) {
|
|
Serial.print("angle:");
|
|
Serial.print(fAngle[0], 3);
|
|
Serial.print(" ");
|
|
Serial.print(fAngle[1], 3);
|
|
Serial.print(" ");
|
|
Serial.print(fAngle[2], 3);
|
|
Serial.print("\r\n");
|
|
s_cDataUpdate &= ~ANGLE_UPDATE;
|
|
}
|
|
if (s_cDataUpdate & MAG_UPDATE) {
|
|
Serial.print("mag:");
|
|
Serial.print(sReg[HX]);
|
|
Serial.print(" ");
|
|
Serial.print(sReg[HY]);
|
|
Serial.print(" ");
|
|
Serial.print(sReg[HZ]);
|
|
Serial.print("\r\n");
|
|
s_cDataUpdate &= ~MAG_UPDATE;
|
|
}
|
|
s_cDataUpdate = 0;
|
|
}
|
|
}
|
|
|
|
static void SensorUartSend(uint8_t *p_data, uint32_t uiSize) {
|
|
Serial1.write(p_data, uiSize);
|
|
Serial1.flush();
|
|
}
|
|
static void Delayms(uint16_t ucMs) { delay(ucMs); }
|
|
static void SensorDataUpdata(uint32_t uiReg, uint32_t uiRegNum) {
|
|
int i;
|
|
for (i = 0; i < uiRegNum; i++) {
|
|
switch (uiReg) {
|
|
case AZ:
|
|
s_cDataUpdate |= ACC_UPDATE;
|
|
break;
|
|
case GZ:
|
|
s_cDataUpdate |= GYRO_UPDATE;
|
|
break;
|
|
case HZ:
|
|
s_cDataUpdate |= MAG_UPDATE;
|
|
break;
|
|
case Yaw:
|
|
s_cDataUpdate |= ANGLE_UPDATE;
|
|
break;
|
|
default:
|
|
s_cDataUpdate |= READ_UPDATE;
|
|
break;
|
|
}
|
|
uiReg++;
|
|
}
|
|
}
|
|
|
|
static void AutoScanSensor(void) {
|
|
int i, iRetry;
|
|
|
|
for (i = 0; i < sizeof(c_uiBaud) / sizeof(c_uiBaud[0]); i++) {
|
|
Serial1.begin(c_uiBaud[i]);
|
|
Serial1.flush();
|
|
iRetry = 2;
|
|
s_cDataUpdate = 0;
|
|
do {
|
|
WitReadReg(AX, 3);
|
|
delay(200);
|
|
while (Serial1.available()) {
|
|
WitSerialDataIn(Serial1.read());
|
|
}
|
|
if (s_cDataUpdate != 0) {
|
|
Serial.print(c_uiBaud[i]);
|
|
Serial.print(" baud find sensor\r\n\r\n");
|
|
return;
|
|
}
|
|
iRetry--;
|
|
} while (iRetry);
|
|
}
|
|
Serial.print("can not find sensor\r\n");
|
|
Serial.print("please check your connection\r\n");
|
|
}
|