This is part 5 of the new award winning development IoT kit from Nordic NRF54LM20-DK Nordic Semiconductor ASA | Development Boards, Kits, Programmers | DigiKey
Please refer to the previous articles Part 2 and Part 3 in order to properly setup this gesture demo. This application demonstrates a gesture-based remote control device using Nordic Edge AI Lab solution.
For this gesture recognition demo we will using the following Bosch BMI270 IMU Sparkfun Evaluation Board available at DigiKey.
and via (point to point with these cables) from its 4 wire SPI interface shown below (also the 3.3V and ground for powering it)
to the 4 wire SPI interface connected to the new award winning development IoT kit from Nordic NRF54LM20-DK Nordic Semiconductor ASA | Development Boards, Kits, Programmers | DigiKey connected to the following interface (P17)
defined in the Zephyr RTOS overlay file (relevant SPI Interface area shown only below)
spi21_default: spi21_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 3, 3)>,
<NRF_PSEL(SPIM_MISO, 3, 1)>,
<NRF_PSEL(SPIM_MOSI, 3, 0)>;
};
};
spi21_sleep: spi21_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 3, 3)>,
<NRF_PSEL(SPIM_MISO, 3, 1)>,
<NRF_PSEL(SPIM_MOSI, 3, 0)>;
low-power-enable;
};
};
};
&gpio3 {
status = "okay";
};
&spi21 {
compatible = "nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi21_default>;
pinctrl-1 = <&spi21_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio3 2 GPIO_ACTIVE_LOW>;
bmi270: spi-dev-bmi270@0 {
compatible = "bosch,bmi270";
status = "okay";
reg = <0>;
spi-max-frequency = <DT_FREQ_M(8)>;
};
};
the following summarizes the required point to point connections between them,
- 3.3V - P17-1 (orange)
- GND- P17-2 (brown)
- MOSI - P17-9 (gray)
- MISO - P17-10 (green)
- SPI CS - P17-13 (yellow)
- SPI CLK - P17-14 (purple)
with arbitrary cable colors used in this particular case.
In order to build this demo proceed as follows in the python virtual environment (see Part 2 and Part 3)
(venv) ~/DigiKey_Coffee_Cup/Nordic$ nrfutil sdk-manager toolchain launch --ncs-version v3.3.0-preview2 --shell
then using the shell,
(v3.3.0-preview2) ~/DigiKey_Coffee_Cup/Nordic$ west build -p always -b nrf54lm20dk/nrf54lm20b/cpuapp edge-ai/applications/gesture_recognition/
...
[376/376] Linking C executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
FLASH: 490200 B 925552 B 52.96%
RAM: 41428 B 511 KB 7.92%
IDT_LIST: 0 GB 32 KB 0.00%
...
and proceed to flash as normially is done for Zephyr RTOS framework,
(v3.3.0-preview2) ~/DigiKey_Coffee_Cup/Nordic$west flash
...
...
-- runners.nrfutil: Connecting to probe
-- runners.nrfutil: Programming image
-- runners.nrfutil: Verifying image
-- runners.nrfutil: Reset
-- runners.nrfutil: Board(s) with serial number(s) 1051861371 flashed successfully.
Open a minicom terminal and the following information shoud be displayed if the sensor was detected properly for this demo,
*** Booting MCUboot v2.3.0-dev-3dfaa012cf34 ***
*** Using nRF Connect SDK v3.3.0-preview2-ede152ec210b ***
*** Using Zephyr OS v4.3.99-4b6df5ff11b1 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Boot source: none
I: Image index: 0, Swap type: none
I: Bootloader chainload address offset: 0x10000
I: Image version: v0.0.0
I: Jumping to the first image slot
*** Booting nRF Connect SDK v3.3.0-preview2-ede152ec210b ***
*** Using Zephyr OS v4.3.99-4b6df5ff11b1 ***
[00:00:00.050,671] <inf> fs_nvs: 8 Sectors of 4096 bytes
[00:00:00.050,678] <inf> fs_nvs: alloc wra: 0, fa0
[00:00:00.050,682] <inf> fs_nvs: data wra: 0, 30
[00:00:00.050,761] <inf> bt_sdc_hci_driver: SoftDevice Controller build revision:
ac 6c cb 12 2a 45 63 97 7c ba aa bd 8d 8f d0 9b |.l..*Ec. |.......
c2 c9 23 ea |..#.
[00:00:00.052,910] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
[00:00:00.052,925] <inf> bt_hci_core: HW Variant: nRF54Lx (0x0005)
[00:00:00.052,938] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 172.52076 Build 1665477138
[00:00:00.053,138] <inf> bt_hci_core: No ID address. App must call settings_load()
[00:00:00.053,153] <inf> ble_hid: Bluetooth initialized
[00:00:00.053,511] <inf> bt_hci_core: HCI transport: SDC
[00:00:00.053,611] <inf> bt_hci_core: Identity: F3:93:F9:A8:5C:40 (random)
[00:00:00.053,630] <inf> bt_hci_core: HCI: version 6.2 (0x10) revision 0x3073, manufacturer 0x0059
[00:00:00.053,648] <inf> bt_hci_core: LMP: version 6.2 (0x10) subver 0x3073
[00:00:00.055,972] <inf> ble_hid: Advertising successfully started
[00:00:00.056,019] <inf> main: nRF Edge AI Gestures Recognition Demo:
[00:00:00.056,029] <inf> main: nRF Edge AI Runtime Version: 2.2.0
[00:00:00.056,047] <inf> main: nRF Edge AI Lab Solution id: 36038
[00:00:22.525,021] <inf> main: Predicted class: DOUBLE THUMB, with probability 76 %
[00:00:53.594,756] <inf> main: Predicted class: DOUBLE THUMB, with probability 82 %
etc etc
[00:00:04.015,501] <inf> main: Predicted class: DOUBLE THUMB, with probability 88 %
[00:00:08.312,211] <inf> main: Predicted class: DOUBLE SHAKE, with probability 84 %
[00:00:09.303,819] <inf> main: Predicted class: ROTATION RIGHT, with probability 89 %
[00:00:09.634,333] <inf> main: Predicted class: ROTATION RIGHT, with probability 92 %
[00:00:16.245,012] <inf> main: Predicted class: DOUBLE THUMB, with probability 100 %
[00:00:17.567,062] <inf> main: Predicted class: DOUBLE SHAKE, with probability 99 %
[00:00:18.889,219] <inf> main: Predicted class: DOUBLE THUMB, with probability 92 %
[00:00:19.880,790] <inf> main: Predicted class: DOUBLE SHAKE, with probability 80 %
[00:00:21.864,775] <inf> main: Predicted class: DOUBLE SHAKE, with probability 91 %
[00:00:23.847,158] <inf> main: Predicted class: DOUBLE THUMB, with probability 91 %
[00:00:24.838,732] <inf> main: Predicted class: DOUBLE THUMB, with probability 98 %
[00:00:25.830,311] <inf> main: Predicted class: DOUBLE THUMB, with probability 80 %
[00:00:26.821,886] <inf> main: Predicted class: DOUBLE THUMB, with probability 98 %
[00:00:30.457,718] <inf> main: Predicted class: DOUBLE SHAKE, with probability 88 %
[00:00:37.068,271] <inf> main: Predicted class: DOUBLE SHAKE, with probability 99 %
[00:00:38.720,966] <inf> main: Predicted class: DOUBLE SHAKE, with probability 83 %
If the message like this one is displayed in the minicom terminal,
[00:00:00.014,050] <err> main: Failed to initialize IMU sensor, error = 2
is observed, then the connections are not correct and need to be revised.
Please stay tuned for our next article where we will conclude this demo. This has partially completed the gesture demo for this new Axon Neural Processing Unit (NPU) using the Axon NPU driver directly, in this innovative Nordic IoT platform. This new Embedded World 2026 award winning Nordic IoT NRF54LM20-DK development kit is available at DigiKey.
This article is available in spanish here.
Este articulo esta disponible en español aquí.



