Skip to content

Commit 0440fae

Browse files
committed
[nRF52] add SC7A20H accelerometer function for M3 / M8
1 parent 4fe4d84 commit 0440fae

1 file changed

Lines changed: 102 additions & 87 deletions

File tree

  • software/firmware/source/SoftRF/src/platform

software/firmware/source/SoftRF/src/platform/nRF52.cpp

Lines changed: 102 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ ui_settings_t *ui;
333333
#if !defined(EXCLUDE_BHI260)
334334
#include <SensorBHI260AP.hpp>
335335
#include <bosch/BoschSensorDataHelper.hpp>
336+
#include <Adafruit_LIS3DH.h>
336337

337338
#if defined(USE_BHI260_RAM_FW)
338339
#if SENSORLIB_VERSION == SENSORLIB_VERSION_VAL(0, 3, 1)
@@ -349,7 +350,10 @@ ICM_20948_I2C imu_2;
349350
QMA6100P imu_3;
350351
#if !defined(EXCLUDE_BHI260)
351352
SensorBHI260AP imu_4;
353+
#endif /* EXCLUDE_BHI260 */
354+
Adafruit_LIS3DH imu_5;
352355

356+
#if !defined(EXCLUDE_BHI260)
353357
#if SENSORLIB_VERSION == SENSORLIB_VERSION_VAL(0, 3, 1)
354358
SensorXYZ bhi_accel(SensorBHI260AP::ACCEL_PASSTHROUGH, imu_4);
355359
// SensorXYZ bhi_gyro(SensorBHI260AP::GYRO_PASSTHROUGH, imu_4);
@@ -1155,7 +1159,8 @@ static void nRF52_setup()
11551159
}
11561160
}
11571161
}
1158-
} else if (nRF52_board == NRF52_ELECROW_TN_M3) {
1162+
} else if (nRF52_board == NRF52_ELECROW_TN_M3 ||
1163+
nRF52_board == NRF52_ELECROW_TN_M8) {
11591164
Wire.beginTransmission(SC7A20H_ADDRESS_H);
11601165
nRF52_has_imu = (Wire.endTransmission() == 0);
11611166
}
@@ -1861,9 +1866,15 @@ static void nRF52_setup()
18611866
break;
18621867

18631868
case NRF52_ELECROW_TN_M3:
1864-
/* TBD */
1865-
hw_info.imu = ACC_SC7A20H;
1866-
IMU_Time_Marker = millis();
1869+
case NRF52_ELECROW_TN_M8:
1870+
Wire.begin();
1871+
imu_5 = Adafruit_LIS3DH(&Wire);
1872+
if (imu_5.begin(SC7A20H_ADDRESS_H, 0x11)) {
1873+
imu_5.setRange(LIS3DH_RANGE_4_G);
1874+
1875+
hw_info.imu = ACC_SC7A20H;
1876+
IMU_Time_Marker = millis();
1877+
}
18671878
break;
18681879

18691880
case NRF52_LILYGO_TIMPULSE_PLUS:
@@ -2561,54 +2572,68 @@ static void nRF52_loop()
25612572
#endif /* USE_WEBUSB_SETTINGS */
25622573

25632574
#if !defined(EXCLUDE_IMU)
2564-
if (hw_info.imu == IMU_MPU9250 &&
2565-
(millis() - IMU_Time_Marker) > IMU_UPDATE_INTERVAL) {
2566-
if (imu_1.update()) {
2567-
float a_x = imu_1.getAccX();
2568-
float a_y = imu_1.getAccY();
2569-
float a_z = imu_1.getAccZ();
2570-
2571-
IMU_g = sqrtf(a_x*a_x + a_y*a_y + a_z*a_z);
2572-
}
2573-
IMU_Time_Marker = millis();
2574-
}
2575+
if ((millis() - IMU_Time_Marker) > IMU_UPDATE_INTERVAL) {
2576+
float a_x = 0;
2577+
float a_y = 0;
2578+
float a_z = 0;
25752579

2576-
if (hw_info.imu == IMU_ICM20948 &&
2577-
(millis() - IMU_Time_Marker) > IMU_UPDATE_INTERVAL) {
2578-
if (imu_2.dataReady()) {
2579-
imu_2.getAGMT();
2580+
switch (hw_info.imu)
2581+
{
2582+
case IMU_MPU9250:
2583+
if (imu_1.update()) {
2584+
a_x = imu_1.getAccX();
2585+
a_y = imu_1.getAccY();
2586+
a_z = imu_1.getAccZ();
2587+
}
2588+
break;
25802589

2581-
// milli g's
2582-
float a_x = imu_2.accX();
2583-
float a_y = imu_2.accY();
2584-
float a_z = imu_2.accZ();
2585-
#if 0
2586-
Serial.print("{ACCEL: ");
2587-
Serial.print(a_x);
2588-
Serial.print(",");
2589-
Serial.print(a_y);
2590-
Serial.print(",");
2591-
Serial.print(a_z);
2592-
Serial.println("}");
2593-
#endif
2594-
IMU_g = sqrtf(a_x*a_x + a_y*a_y + a_z*a_z) / 1000;
2595-
#if defined(USE_OLED)
2596-
IMU_g_x10 = (int32_t) (IMU_g * 10);
2597-
#endif /* USE_OLED */
2598-
}
2599-
IMU_Time_Marker = millis();
2600-
}
2590+
case IMU_ICM20948:
2591+
if (imu_2.dataReady()) {
2592+
imu_2.getAGMT();
2593+
2594+
// milli g's
2595+
a_x = imu_2.accX() / 1000;
2596+
a_y = imu_2.accY() / 1000;
2597+
a_z = imu_2.accZ() / 1000;
2598+
}
2599+
break;
2600+
2601+
case ACC_QMA6100P:
2602+
{
2603+
outputData data;
26012604

2602-
if (hw_info.imu == ACC_QMA6100P &&
2603-
(millis() - IMU_Time_Marker) > IMU_UPDATE_INTERVAL) {
2604-
outputData data;
2605+
imu_3.getAccelData(&data);
2606+
imu_3.offsetValues(data.xData, data.yData, data.zData);
26052607

2606-
imu_3.getAccelData(&data);
2607-
imu_3.offsetValues(data.xData, data.yData, data.zData);
2608+
a_x = data.xData;
2609+
a_y = data.yData;
2610+
a_z = data.zData;
2611+
}
2612+
break;
2613+
2614+
#if 0 /* TODO */ // !defined(EXCLUDE_BHI260)
2615+
case IMU_BHI260AP:
2616+
imu_4.update();
2617+
2618+
if (bhi_accel.hasUpdated()) {
2619+
a_x = bhi_accel.getX(); /* TBD */
2620+
a_y = bhi_accel.getY(); /* TBD */
2621+
a_z = bhi_accel.getZ(); /* TBD */
2622+
}
2623+
break;
2624+
#endif /* EXCLUDE_BHI260 */
2625+
2626+
case ACC_SC7A20H:
2627+
imu_5.read();
2628+
a_x = imu_5.x_g;
2629+
a_y = imu_5.y_g;
2630+
a_z = imu_5.z_g;
2631+
break;
2632+
2633+
default:
2634+
break;
2635+
}
26082636

2609-
float a_x = data.xData;
2610-
float a_y = data.yData;
2611-
float a_z = data.zData;
26122637
#if 0
26132638
Serial.print("{ACCEL: ");
26142639
Serial.print(a_x);
@@ -2618,35 +2643,21 @@ static void nRF52_loop()
26182643
Serial.print(a_z);
26192644
Serial.println("}");
26202645
#endif
2646+
26212647
IMU_g = sqrtf(a_x*a_x + a_y*a_y + a_z*a_z);
2622-
IMU_Time_Marker = millis();
2623-
}
26242648

2625-
#if 0 /* TODO */ // !defined(EXCLUDE_BHI260)
2626-
if (hw_info.imu == IMU_BHI260AP &&
2627-
(millis() - IMU_Time_Marker) > (IMU_UPDATE_INTERVAL / 10)) {
2628-
// Update sensor fifo
2629-
imu_4.update();
2630-
2631-
if (bhi_accel.hasUpdated()) {
2632-
float a_x = bhi_accel.getX();
2633-
float a_y = bhi_accel.getY();
2634-
float a_z = bhi_accel.getZ();
26352649
#if 0
2636-
Serial.print("{ACCEL: ");
2637-
Serial.print(a_x);
2638-
Serial.print(",");
2639-
Serial.print(a_y);
2640-
Serial.print(",");
2641-
Serial.print(a_z);
2642-
Serial.println("}");
2650+
Serial.print("G load: ");
2651+
Serial.print(IMU_g);
2652+
Serial.println();
26432653
#endif
2644-
IMU_g = sqrtf(a_x*a_x + a_y*a_y + a_z*a_z); /* TBD */
2645-
}
2654+
2655+
#if defined(USE_OLED)
2656+
IMU_g_x10 = (int32_t) (IMU_g * 10);
2657+
#endif /* USE_OLED */
26462658

26472659
IMU_Time_Marker = millis();
26482660
}
2649-
#endif /* EXCLUDE_BHI260 */
26502661
#endif /* EXCLUDE_IMU */
26512662

26522663
if ((nRF52_board == NRF52_SEEED_T1000E ||
@@ -2689,25 +2700,29 @@ static void nRF52_fini(int reason)
26892700
#endif /* ARDUINO_ARCH_MBED */
26902701

26912702
#if !defined(EXCLUDE_IMU)
2692-
if (hw_info.imu == IMU_MPU9250) {
2693-
imu_1.sleep(true);
2694-
}
2695-
2696-
if (hw_info.imu == IMU_ICM20948) {
2697-
imu_2.sleep(true);
2698-
// imu_2.lowPower(true);
2699-
}
2700-
2701-
if (hw_info.imu == ACC_QMA6100P) {
2702-
imu_3.enableAccel(false);
2703-
}
2704-
2705-
#if !defined(EXCLUDE_BHI260)
2706-
if (hw_info.imu == IMU_BHI260AP) {
2707-
/* TBD */
2708-
// imu_4.deinit();
2709-
}
2703+
switch (hw_info.imu)
2704+
{
2705+
case IMU_MPU9250:
2706+
imu_1.sleep(true);
2707+
break;
2708+
case IMU_ICM20948:
2709+
imu_2.sleep(true);
2710+
break;
2711+
case ACC_QMA6100P:
2712+
imu_3.enableAccel(false);
2713+
break;
2714+
#if 0 /* TODO */ // !defined(EXCLUDE_BHI260)
2715+
case IMU_BHI260AP:
2716+
/* TBD */
2717+
// imu_4.deinit();
2718+
break;
27102719
#endif /* EXCLUDE_BHI260 */
2720+
case ACC_SC7A20H:
2721+
/* TBD */
2722+
break;
2723+
default:
2724+
break;
2725+
}
27112726
#endif /* EXCLUDE_IMU */
27122727

27132728
switch (nRF52_board)

0 commit comments

Comments
 (0)