Skip to content

Commit a82d297

Browse files
committed
samples: tdk_robokit1: Poll the magnetometer
While an asynchronous transfer is on going for the 6 axis imu, concurrently read the magnetometer with its blocking fetch call. In the future it'd be nice to have the magnetometer also work with RTIO driven by a timer. In fact having all the sensors read on a timer would be incredibly nice to showcase. Signed-off-by: Tom Burdick <[email protected]>
1 parent c291c35 commit a82d297

File tree

2 files changed

+86
-39
lines changed

2 files changed

+86
-39
lines changed

samples/boards/tdk_robokit1/prj.conf

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ CONFIG_LOG_MODE_DEFERRED=y
1111
CONFIG_SPI=y
1212
CONFIG_I2C=y
1313
CONFIG_GPIO=y
14+
CONFIG_THREAD_NAME=y
15+
CONFIG_DEBUG_THREAD_INFO=y
16+
1417
CONFIG_LOG_PROCESS_THREAD_STACK_SIZE=8192
1518
CONFIG_MAIN_STACK_SIZE=2048
1619
CONFIG_ISR_STACK_SIZE=2048
17-
CONFIG_ICM42688_THREAD_STACK_SIZE=768
1820

1921
# config sensors
2022
CONFIG_DMA=y
@@ -25,13 +27,20 @@ CONFIG_SPI_LOG_LEVEL_DBG=y
2527
CONFIG_ICM42688_RTIO=y
2628
CONFIG_RTIO=y
2729
CONFIG_SPI_SAM_DMA=y
28-
#CONFIG_RTIO_SUBMIT_SEM=n
30+
CONFIG_RTIO_SUBMIT_SEM=n
2931
CONFIG_RTIO_CONSUME_SEM=y
3032

3133

32-
# SystemView Tracing
34+
# Tracing
3335
CONFIG_TRACING=y
3436
CONFIG_TRACING_TIMER=y
3537
CONFIG_TRACING_SYSCALL=n
36-
CONFIG_SEGGER_SYSTEMVIEW=y
37-
CONFIG_SEGGER_SYSVIEW_RTT_BUFFER_SIZE=65536
38+
39+
# SystemView
40+
#CONFIG_SEGGER_SYSTEMVIEW=y
41+
#CONFIG_SEGGER_SYSVIEW_RTT_BUFFER_SIZE=65536
42+
43+
# Threadalyzer Tracing
44+
45+
# Percepio
46+
CONFIG_PERCEPIO_TRACERECORDER=y

samples/boards/tdk_robokit1/src/main.c

Lines changed: 72 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,65 @@ struct fifo_header {
4141
#define ICM42688_FIFO_BUF_LEN 2051
4242
static uint8_t icm42688_fifo_bufs[N_BUFS][ICM42688_FIFO_BUF_LEN];
4343

44+
const struct device *icm42688 = DEVICE_DT_GET_ONE(invensense_icm42688);
45+
const struct device *akm09918 = DEVICE_DT_GET_ONE(asahi_kasei_akm09918c);
4446

45-
void fifo_stream(const struct device *icm42688, struct rtio *r, uint32_t n_bufs)
47+
void poll_imu(void)
48+
{
49+
uint32_t cycle_start, cycle_end;
50+
struct sensor_value accel[3];
51+
struct sensor_value gyro[3];
52+
struct sensor_value imu_temp;
53+
54+
/* Fetch everything */
55+
cycle_start = k_cycle_get_32();
56+
sensor_sample_fetch_chan(icm42688, SENSOR_CHAN_ALL);
57+
cycle_end = k_cycle_get_32();
58+
59+
sensor_channel_get(icm42688, SENSOR_CHAN_ACCEL_XYZ, accel);
60+
sensor_channel_get(icm42688, SENSOR_CHAN_GYRO_XYZ, gyro);
61+
sensor_channel_get(icm42688, SENSOR_CHAN_DIE_TEMP, &imu_temp);
62+
63+
LOG_INF("ICM42688: Fetch took %u cycles", cycle_end - cycle_start);
64+
LOG_INF("ICM42688: Accel (m/s^2): x: %d.%06d, y: %d.%06d, z: %d.%06d",
65+
accel[0].val1, accel[0].val2,
66+
accel[1].val1, accel[1].val2,
67+
accel[2].val1, accel[2].val2);
68+
LOG_INF("ICM42688: Gyro (rad/s): x: %d.%06d, y: %d.%06d, z: %d.%06d",
69+
gyro[0].val1, gyro[0].val2,
70+
gyro[1].val1, gyro[1].val2,
71+
gyro[2].val1, gyro[2].val2);
72+
LOG_INF("ICM42688: Temp (C): %d.%06d",
73+
imu_temp.val1, imu_temp.val2);
74+
}
75+
76+
void poll_mag(void)
77+
{
78+
uint32_t cycle_start, cycle_end;
79+
struct sensor_value magn[3];
80+
81+
/* Fetch everything */
82+
cycle_start = k_cycle_get_32();
83+
sensor_sample_fetch_chan(akm09918, SENSOR_CHAN_ALL);
84+
cycle_end = k_cycle_get_32();
85+
86+
sensor_channel_get(akm09918, SENSOR_CHAN_MAGN_XYZ, magn);
87+
88+
LOG_INF("AKM09918: Fetch took %u cycles", cycle_end - cycle_start);
89+
LOG_INF("AKM09918: Mag (Gauss): x: %d.%06d, y: %d.%06d, z: %d.%06d",
90+
magn[0].val1, magn[0].val2,
91+
magn[1].val1, magn[1].val2,
92+
magn[2].val1, magn[2].val2);
93+
}
94+
95+
void fifo_stream(struct rtio *r, uint32_t n_bufs)
4696
{
4797
struct rtio_iodev *iodev;
4898
struct rtio_sqe *sqe;
4999

50100
LOG_INF("FIFO with RTIO context %p, context size %u", r, sizeof(*r));
51101

52-
/* obtain reference the stream */
102+
/* obtain reference to the stream */
53103
(void)sensor_fifo_iodev(icm42688, &iodev);
54104

55105
LOG_INF("Setting up RX requests");
@@ -107,11 +157,12 @@ void fifo_stream(const struct device *icm42688, struct rtio *r, uint32_t n_bufs)
107157
}
108158

109159

110-
if (i % 128 == 0) {
111-
printk("Slow mode on iteration %d, underflows (sensor overflows) %u, buf "
112-
"%lu, data int status %x, result %d\n",
160+
if (i % 64 == 0) {
161+
LOG_INF("Poll Mag: Iteration %d, Underflows (sensor overflows) %u, Buf "
162+
"%lu, int status %x, result %d\n",
113163
i, overflows, buf_idx, buf[0], result);
114-
k_busy_wait(4000);
164+
poll_mag();
165+
k_busy_wait(1000);
115166
}
116167

117168
/* Now to recycle the buffer by putting it back in the queue */
@@ -134,53 +185,40 @@ void fifo_stream(const struct device *icm42688, struct rtio *r, uint32_t n_bufs)
134185
LOG_INF("DONE! FIFO should be DISABLED");
135186
}
136187

188+
137189
void main(void)
138190
{
139-
const struct device *icm42688 = DEVICE_DT_GET_ONE(invensense_icm42688);
140-
struct sensor_value accel[3];
141-
struct sensor_value gyro[3];
142-
struct sensor_value temp;
143-
144-
145191
LOG_INF("TDK RoboKit1 Sample");
146192

147-
148193
if (!device_is_ready(icm42688)) {
149194
LOG_INF("%s: device not ready.", icm42688->name);
150195
return;
151196
}
152197

153-
LOG_INF("Fetch + Read");
154-
155-
/* A few polling readings */
156-
for (int i = 0; i < 10; i++) {
198+
if (!device_is_ready(akm09918)) {
199+
LOG_INF("%s: device not ready.", akm09918->name);
200+
return;
201+
}
157202

158-
/* Fetch everything */
159-
sensor_sample_fetch_chan(icm42688, SENSOR_CHAN_ALL);
203+
struct sensor_value sample_freq = { .val1 = 10, .val2 = 0 };
160204

161-
sensor_channel_get(icm42688, SENSOR_CHAN_ACCEL_XYZ, accel);
162-
sensor_channel_get(icm42688, SENSOR_CHAN_GYRO_XYZ, gyro);
163-
sensor_channel_get(icm42688, SENSOR_CHAN_DIE_TEMP, &temp);
205+
sensor_attr_set(akm09918, SENSOR_CHAN_MAGN_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY,
206+
&sample_freq);
164207

165-
LOG_INF("ICM42688: Accel (m/s^2): x: %d.%06d, y: %d.%06d, z: %d.%06d",
166-
accel[0].val1, accel[0].val2,
167-
accel[1].val1, accel[1].val2,
168-
accel[2].val1, accel[2].val2);
169-
LOG_INF("ICM42688: Gyro (rad/s): x: %d.%06d, y: %d.%06d, z: %d.%06di",
170-
gyro[0].val1, gyro[0].val2,
171-
gyro[1].val1, gyro[1].val2,
172-
gyro[2].val1, gyro[2].val2);
173-
LOG_INF("ICM42688: Temp (C): %d.%06d\n",
174-
temp.val1, temp.val2);
208+
LOG_INF("Fetch + Read");
175209

210+
/* A few polling readings */
211+
for (int i = 0; i < 10; i++) {
212+
poll_imu();
213+
poll_mag();
176214
k_sleep(K_MSEC(100));
177215
}
178216

179217
LOG_INF("Showing under/over flows with 1 buffer queue");
180-
fifo_stream(icm42688, &r1, 1);
218+
fifo_stream(&r1, 1);
181219

182220
LOG_INF("Showing no under/over flows with 4 buffer queue");
183-
fifo_stream(icm42688, &r4, 4);
221+
fifo_stream(&r4, 4);
184222

185223
LOG_INF("Done!");
186224

0 commit comments

Comments
 (0)