この記事を読み進める前に、Nordicの nRF54L15-DK 開発キットに関する以前のインストール手順を参照してください。ここでは、この nRF54L15-DK 開発キットをDigikeyから入手可能なIoT用のLSM6DSO I2C センサに接続する手順を説明します。以下の図は、両者をどのように接続しているかを示しています。
まず、Zephyr OSのdevファイルに関連する以下のディレクトリ構造を作成します。
|-- CMakeLists.txt
|-- nrf54l15dk_nrf54l15.overlay
|-- prj.conf
`-- src
`-- main.c
CMakeLists.txtは以下のとおりです。
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)
target_sources(app PRIVATE src/main.c)
proj.confファイルは以下のように示されます(CONFIG_CBPRINTF_FP_SUPPORT は浮動小数点印刷のサポートを提供するために使用されます)。
CONFIG_GPIO=y
CONFIG_I2C=y
CONFIG_CBPRINTF_FP_SUPPORT=y
そして最も重要なのは、以下のオーバーレイファイルです。これにより、I2Cインターフェース経由で LSM6DSO センサを、Digikeyから入手可能なNordicの nRF54L15-DK 開発キット上で動作するmain.c Zephyr「RTOS」アプリケーションに接続することができます。このオーバーレイファイルでは、I2Cインターフェースのマスター周波数を100KHz、I2Cスレーブアドレスを0x6Bに設定しています。
&i2c22 {
status = "okay";
pinctrl-0 = <&i2c22_default>;
pinctrl-1 = <&i2c22_sleep>;
clock-frequency = <100000>;
pinctrl-names = "default", "sleep";
mysensor: mysensor@6b{
compatible = "i2c-device";
status = "okay";
reg = < 0x6b >;
};
};
&pinctrl {
/omit-if-no-ref/ i2c22_default: i2c22_default {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
<NRF_PSEL(TWIM_SDA, 1, 12)>;
};
};
/omit-if-no-ref/ i2c22_sleep: i2c22_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 11)>,
<NRF_PSEL(TWIM_SDA, 1, 12)>;
low-power-enable;
};
};
};
main.cは以下のようになります。
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/sys/printk.h>
#define I2C_NODE DT_NODELABEL(mysensor)
static const struct i2c_dt_spec dev_i2c = I2C_DT_SPEC_GET(I2C_NODE);
#define WHOAMI 0x0F
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
int main(void)
{
if (!device_is_ready(dev_i2c.bus)) {
printk("I2C bus %s is not ready!\n\r",dev_i2c.bus->name);
return -1;
}
int ret;
bool led_state = true;
if (!gpio_is_ready_dt(&led)) {
return 0;
}
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return 0;
}
while (1) {
uint8_t id = 0;
uint8_t regs[] = {WHOAMI};
int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);
if (ret != 0) {
printk("Failed to read register %x \n", regs[0]);
return -1;
}
if (id != 0x6C) {
printk("Invalid chip id! %x \n", id);
return -1;
}
else {
printk("Found WHOAMI = %x\n", id);
}
ret = gpio_pin_toggle_dt(&led);
if (ret < 0) {
return 0;
}
led_state = !led_state;
printf("LED state: %s\n", led_state ? "ON" : "OFF");
k_msleep(SLEEP_TIME_MS);
//Read and print values
uint8_t values[65];
ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);
if (ret != 0) {
printk("Failed to read registers %x \n", 0x00);
return;
}
int i = 0;
while(i < 64)
{
printk("Register %x = %x\n", i, values[i]);
i = i + 1;
}
}
return 0;
}
このmain.cは、WHOAMIレジスタを読み出すと同時にLEDを点滅させ、センサのASIC内の65個のレジスタアドレスの自動インクリメント(バースト)読み取りを実行します。これらの I2C トランザクションは以下のとおりです。
int ret = i2c_write_read_dt(&dev_i2c, regs, 1, &id, 1);
ret = i2c_burst_read_dt(&dev_i2c, 0x00, values, 64);
上記は、Zephyr OSのAPIと適切なマクロを介して実行したものです。これをコンパイル(ビルド)するには、以下のステップを実行します。
(venv) $ west build -p always -b nrf54l15dk/nrf54l15/cpuapp -- -DEXTRA_DTC_OVERLAY_FILE=nrf54l15dk_nrf54l15.overlay
次に、 Nordic nRF54L15-DK を以下のようにプログラムします。
(venv) $ west flash
プログラミングが完了したら、以下のセットアップを使用して、SparkFunの6軸センサ LSM6DSO 用ブレークアウト基板を使用して、このI2C通信機能のデモを行います。
この動画では、I2Cインターフェースが LSM6DSO センサと通信している間、LEDが点滅している様子が確認できます。同時に、Techforumの記事で以前ご紹介したSparkfunの8チャンネルUSBロジックアナライザが、I2C通信をキャプチャしています。
IoT用 nRF54L15-DK 開発キットはUSB経由でホストに接続されています。SparkfunのチャンネルUSBロジックアナライザがI2Cのトランザクションをキャプチャし、以下のように正しく動作していることを確認できます。
このコマンドを使ってminicomターミナルを開いてください。
minicom -D /dev/ttyACM1
以下に示すように、SparkFunの6軸センサ LSM6DSO 用ブレークアウト基板のWHOAMIレジスタから取得したNordic nRF54L15-DK からの受信したデータを監視します。
Found WHOAMI = 6c
LED state: ON
Register 0 = 0
Register 1 = 0
Register 2 = 3f
Register 3 = 0
Register 4 = 0
Register 5 = 0
Register 6 = 0
Register 7 = 0
Register 8 = 0
Register 9 = 0
Register a = 0
Register b = 0
Register c = 0
Register d = 0
Register e = 0
Register f = 6c
Register 10 = 0
Register 11 = 0
Register 12 = 4
Register 13 = 0
Register 14 = 0
Register 15 = 0
Register 16 = 0
Register 17 = 0
Register 18 = e0
Register 19 = 0
Register 1a = 0
Register 1b = 0
Register 1c = 0
Register 1d = 0
Register 1e = 0
Register 1f = 28
Register 20 = 0
Register 21 = 0
Register 22 = 0
Register 23 = 0
Register 24 = 0
Register 25 = 0
Register 26 = 0
Register 27 = 0
Register 28 = 0
Register 29 = 0
Register 2a = 0
Register 2b = 0
Register 2c = 0
Register 2d = 0
Register 2e = 0
Register 2f = 0
Register 30 = 0
Register 31 = 0
Register 32 = 0
Register 33 = 0
Register 34 = 0
Register 35 = 0
Register 36 = 0
Register 37 = 0
Register 38 = 0
Register 39 = 0
Register 3a = 0
Register 3b = 0
Register 3c = 0
Register 3d = 0
Register 3e = 0
Register 3f = 0
Found WHOAMI = 6c
LED state: OFF
この記事では、Digikeyから入手可能なNordic nRF54L15-DK 開発ボードにI2C経由でセンサを接続する方法を説明しました。Digikeyでは、このIoT用Nordicの nRF54L15-DK 開発キットに取り付けることができる多くのI2 センサ を取り扱っています。ここで説明した手順を使用して多くのIoTプロジェクトを行うことができます。良い一日をお過ごしください!
この記事はスペイン語でここからからご覧いただけます。
Este artículo está disponible en lenguaje español aquí.

