test angle measurement LSM6DS3
Dependencies: ESC IMUfilter LSM6DS3 mbed
main.cpp
- Committer:
- rsmits
- Date:
- 2018-01-17
- Revision:
- 1:0e63617e1965
- Parent:
- 0:a606f47629c3
- Child:
- 2:405f8e1a01d3
File content as of revision 1:0e63617e1965:
#include "mbed.h" #include "esc.h" #include "LSM6DS3.h" #include "IMUfilter.h" // refresh time. set to 500 for part 2 and 50 for part 4 #define REFRESH_TIME_MS 100 //Gravity at Earth's surface in m/s/s #define g0 9.812865328 //Convert from degrees to radians. #define toRadians(x) (x * 0.01745329252) const int LSM6DS3_ADDRESS = 0xD4; int PERIOD = 20; //float MOTOR_PRINT; Serial pc(SERIAL_TX, SERIAL_RX); ESC MOTOR(PA_8, PERIOD); AnalogIn PRESSURE_SENSOR(PA_0); //Ticker UpdateScreen; LSM6DS3 imu(PF_0, PF_1, LSM6DS3_ADDRESS); IMUfilter imuFilter(REFRESH_TIME_MS/1000, 10); //Init Serial port and LSM6DS3 chip void setup() { // Use the begin() function to initialize the LSM9DS0 library. // You can either call it with no parameters (the easy way): // SLEEP // uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G, // imu.G_POWER_DOWN, imu.A_POWER_DOWN); // LOWEST // uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G, // imu.G_ODR_13_BW_0, imu.A_ODR_13); // HIGHEST // uint16_t status = imu.begin(imu.G_SCALE_2000DPS, imu.A_SCALE_8G, // imu.G_ODR_1660, imu.A_ODR_6660); uint16_t status = imu.begin(imu.G_SCALE_245DPS, imu.A_SCALE_2G, imu.G_ODR_1660, imu.A_ODR_6660); //Make sure communication is working pc.printf("LSM6DS3 WHO_AM_I's returned: 0x%X\r\n", status); pc.printf("Should be 0x69\r\n"); } int main() { //MOTOR.setThrottle(0.0); bool started = false; while (true){ if(PRESSURE_SENSOR > 0.9){ if (not started){ setup(); //Setup sensor and Serial pc.printf("\r\n------ LSM6DS3 Demo -----------\r\n"); started=true; } // imu.readTemp(); // pc.printf("Temp:\r\n"); // pc.printf("TC: %2f\r\n", imu.temperature_c); // pc.printf("TF: %2f\r\n", imu.temperature_f); // imu.readAccel(); // pc.printf("Accel:\r\n"); // pc.printf("AX: %2f\r\n", imu.ax); // pc.printf("AY: %2f\r\n", imu.ay); // pc.printf("AZ: %2f\r\n", imu.az); // imu.readGyro(); // pc.printf("Gyro:\r\n"); // pc.printf("GX: %2f\r\n", imu.gx); // pc.printf("GY: %2f\r\n", imu.gy); // pc.printf("GZ: %2f\r\n\r\n", imu.gz); // radians = (degrees*pi)/180 double rx = (imu.gx*PI)/180; double ry = (imu.gy*PI)/180; double rz = (imu.gz*PI)/180; // m/(s^2) = g0*g double mx = g0*imu.ax; double my = g0*imu.ay; double mz = g0*imu.az; imuFilter.updateFilter(rx, ry, rz, mx, my, mz); imuFilter.computeEuler(); pc.printf("%f, %f, %f\r\n\r\n", imuFilter.getRoll(), imuFilter.getPitch(), imuFilter.getYaw()); wait_ms(REFRESH_TIME_MS); } else { started=false; imuFilter.reset(); } } }