STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include "main.h"
2
3#include <Arduino.h>
4#include <SPI.h>
5#include <STAR_ISM330DH.h>
6
8static SPISettings ismSpiSettings(ISM330_SPI_HZ, MSBFIRST, SPI_MODE3);
11
12static volatile bool g_intFlag = false;
13
14void IRAM_ATTR onInt1Isr() {
15 g_intFlag = true;
16}
17
18void setup() {
19 Serial.begin(115200);
20 while (!Serial)
21 delay(10);
22 delay(50);
23
24 // Idle every CS on the shared SPI bus HIGH so only the IMU answers.
25 const uint8_t otherCs[] = {0 /*MX25_CS*/, 1 /*ADC_CS*/, 17 /*ACCEL_CS*/};
26 for (uint8_t pin : otherCs) {
27 pinMode(pin, OUTPUT);
28 digitalWrite(pin, HIGH);
29 }
30
33
34 // --- GPIO sanity test (run BEFORE SPI.begin) ---
35 // Burst 50 square-wave pulses on each of SCLK / MOSI / CS so a logic
36 // analyzer can confirm the pins physically toggle.
37 Serial.println("GPIO toggle test starting...");
38 const uint8_t testPins[] = {ISM330_SCLK_PIN, ISM330_MOSI_PIN,
40 for (uint8_t pin : testPins) {
41 pinMode(pin, OUTPUT);
42 Serial.printf(" toggling GPIO%u\r\n", pin);
43 for (int i = 0; i < 50; i++) {
44 digitalWrite(pin, HIGH);
46 digitalWrite(pin, LOW);
48 }
49 digitalWrite(pin, HIGH); // leave idle high (safe for CS / SCK mode 3)
50 }
51 Serial.println("GPIO toggle test done.");
52
54
55 // Raw WHO_AM_I probe — 0x6B means the chip is talking to us correctly.
56 // 0x00/0xFF means MISO is dead / wrong CS / wrong mode / no power.
57 SPI.beginTransaction(ismSpiSettings);
59 SPI.transfer(0x0F | 0x80);
60 uint8_t whoami = SPI.transfer(0x00);
62 SPI.endTransaction();
63 Serial.printf("WHO_AM_I = 0x%02X (expect 0x6B)\r\n", whoami);
64
65 if (!imu.begin(SPI, ismSpiSettings, ISM330_CS_PIN)) {
66 Serial.println(
67 "ERROR: ISM330DHCX not found. Check SPI wiring / CS / power.");
68 while (true)
69 delay(1000);
70 }
71
72 imu.deviceReset();
73 while (!imu.getDeviceReset())
74 delay(1);
75 delay(100);
76
77 imu.setDeviceConfig(true);
78 imu.setBlockDataUpdate(true);
79
80 imu.setAccelDataRate(ISM_XL_ODR_104Hz);
81 imu.setAccelFullScale(ISM330_ACCEL_FS);
82 imu.setGyroDataRate(ISM_GY_ODR_104Hz);
83 imu.setGyroFullScale(ISM_500dps);
84
85 imu.setAccelFilterLP2(true);
86 imu.setAccelSlopeFilter(ISM_LP_ODR_DIV_100);
87 imu.setGyroFilterLP1(true);
88 imu.setGyroLP1Bandwidth(ISM_MEDIUM);
89
90 if (!imu.configureWakeUpOnInt1(ISM330_WKUP_THS, ISM330_WAKEUP_DUR,
92 Serial.println("ERROR: configureWakeUpOnInt1 failed.");
93 while (true)
94 delay(1000);
95 }
96
97 // Active high on INT1 (use RISING on the MCU)
98 imu.setPinMode(false);
99
101 attachInterrupt(digitalPinToInterrupt(ISM330_INT1_PIN), onInt1Isr, RISING);
102
103 Serial.println();
104 Serial.println("ISM330DHCX test (ISM330DH)");
105 Serial.printf(
106 "Accel FS: %.0f g wake-up threshold: %.2f g WK_THS LSBs: %u "
107 "wake_dur: %u\r\n",
109 static_cast<unsigned>(ISM330_WKUP_THS),
110 static_cast<unsigned>(ISM330_WAKEUP_DUR));
111 Serial.printf("INT1 GPIO: %d\r\n", ISM330_INT1_PIN);
112 Serial.println("ax_g,ay_g,az_g,gx_dps,gy_dps,gz_dps");
113}
114
115void loop() {
116 if (g_intFlag) {
117 g_intFlag = false;
119 if (imu.serviceWakeUpInterrupt(&wu)) {
120 Serial.print("[INT] Wake-up axes:");
121 if (wu.axisX)
122 Serial.print(" X");
123 if (wu.axisY)
124 Serial.print(" Y");
125 if (wu.axisZ)
126 Serial.print(" Z");
127 Serial.println();
128 }
129 }
130
131 if (imu.checkStatus()) {
132 if (imu.getAccel(&accelData) && imu.getGyro(&gyroData)) {
133 Serial.print(accelData.xData / 1000.0f, 4);
134 Serial.print(",");
135 Serial.print(accelData.yData / 1000.0f, 4);
136 Serial.print(",");
137 Serial.print(accelData.zData / 1000.0f, 4);
138 Serial.print(",");
139 Serial.print(gyroData.xData / 1000.0f, 4);
140 Serial.print(",");
141 Serial.print(gyroData.yData / 1000.0f, 4);
142 Serial.print(",");
143 Serial.println(gyroData.zData / 1000.0f, 4);
144 }
145 }
146
147 delay(10);
148}
static SerialStub Serial
Definition Arduino.h:128
#define INPUT
Definition Arduino.h:21
#define HIGH
Definition Arduino.h:19
void pinMode(int, int)
Definition Arduino.h:46
#define OUTPUT
Definition Arduino.h:22
#define LOW
Definition Arduino.h:20
void delayMicroseconds(unsigned int)
Definition Arduino.h:58
void digitalWrite(int, int)
Definition Arduino.h:48
#define ISM330_INT1_PIN
Definition main.h:14
#define ISM330_SPI_HZ
Definition main.h:18
#define ISM330_WAKEUP_DUR
Definition main.h:28
#define ISM330_MOSI_PIN
Definition main.h:9
#define ISM330_ROUTE_DRDY_TO_INT1
Definition main.h:31
#define ISM330_CS_PIN
Definition main.h:11
#define ISM330_SCLK_PIN
Definition main.h:8
#define ISM330_MISO_PIN
Definition main.h:10
#define ISM330_ACCEL_FS_G
Definition main.h:22
#define ISM330_ACCEL_FS
Definition main.h:21
#define ISM330_WAKEUP_THRESHOLD_G
Definition main.h:25
void delay(int ms)
SPI driver for ISM330DHCX.
static constexpr uint8_t ISM330_WKUP_THS
Definition config.h:68
void setup()
Definition main.cpp:142
void loop()
Definition main.cpp:201
void IRAM_ATTR onInt1Isr()
Definition main.cpp:14
static volatile bool g_intFlag
Definition main.cpp:12
static SPISettings ismSpiSettings(ISM330_SPI_HZ, MSBFIRST, SPI_MODE3)
static ISM330DH_SPI imu
Definition main.cpp:7
static sfe_ism_data_t gyroData
Definition main.cpp:10
static sfe_ism_data_t accelData
Definition main.cpp:9
#define ISM_GY_ODR_104Hz
#define ISM_MEDIUM
#define ISM_LP_ODR_DIV_100
#define ISM_500dps
#define ISM_XL_ODR_104Hz
Filled by serviceWakeUpInterrupt() when INT1 was a wake-up (high-accel) event.