Zephyr RTOS 〜 Lチカのその先へ 〜

# 1. 対象
RTOS である Zephyr に興味はあるけど「どこから始めたらいいの？」や「Lチカはやったけどその後何すればいいの？」って方を対象にしています。

参考：[Zephyr RTOS の公式手順](https://docs.zephyrproject.org/latest/develop/getting_started/index.html) [^1]

# 2. 背景と目的
下記のような「困り事」を解消できればと思い、実装・運用事例集としてリポジトリを公開しました。

**Zephyr RTOS 〜 Lチカのその先へ 〜(今の記事)**[^2]

* サンプルのLチカするまではすんなり行けた　で、そのあとは…？
* そもそもさくっと動かせる環境がほしい
* コードエディタのコード補完や定義元ジャンプ、ステップ実行なども利用したい！

**Zephyr RTOS 〜 GPIO を叩く！ 〜** [^3]

* GPIO へのアクセス手段が色々方法あるけど、結局どうすりゃいいの？
* 移植性なども考慮したいけど、どんなディレクトリ構成にすれば？

**Zephyr RTOS 〜 チーム開発を見据えた管理方法 〜** [^4]

* せっかくの移植性の高さを活かしたいけど、すべて管理すると膨大すぎて困る
* 開発中は Zephyr 本体のバージョンを、チーム内で固定・統一化して運用したい

**予定**

* マルチスレッドや排他処理などの管理方法はどうしよう
* DeviceTree や CMake / Kconfig の構成など考えることがたくさん！
* 実際に Zephyr を利用していく中で得られるバッドノウハウ集

絶対的な答えではなく、これを足掛かりにしてカスタムしてもらえると幸いです。
(さらにフィードバックもあると幸甚です)


# 3. 公開リポジトリ

リポジトリ：[ZephyrOpsPlaybook](https://github.com/Corgeek/ZephyrOpsPlaybook) [^5]

上記 README.md に従って進めていけば、vscode(要別途インストール) 上で開発できるようになっています。
いろんな入出力機器が標準で付いている micro:bit v2 であれば、ドライバ制御のサンプルも動かすことが可能です。

↓は vscode を使って micro:bit v2 向けに build 〜 flash 〜 debug までを行った様子。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38092/30a379ca-d03e-44f3-86c7-396c7e7accca.gif" width=95%>

:::note info

* Nordic 系と micro:bit、STM32 系のボードを対象に絞り込んでいます(解説は別記予定)。
* Zephyr のバージョンは、v4.1.0 で固定しています(解説は別記予定)。
* Windows / Linux どちらでも動作確認できている [bbc_microbit_v2](https://docs.zephyrproject.org/4.1.0/boards/bbc/microbit_v2/doc/index.html) [^6] がお勧めです。
    * 単体でLED、ブザーやボタンなどの入出力や、複数のセンサー、BLEによる無線通信などが利用でき、JTAG などの追加ハードウェア不要で break を張ってステップ実行までできるのでかなりお得！

:::

:::note warn

* micro:bit v2 の BLE は他の機能と干渉しやすく、BLE を有効にすると~~磁気センサー~~(← 初期化の順番で解消)、BLE 有効中のデバッグは機能せず、最適化レベルを下げてもうまく動作していません。そのため現時点ではデフォルトで drv_init_bleperiph() を呼ばないようにしており、BLE 利用の際はこのコメントアウトを外してください。
* 一部スクリプトを用意していますが、不慣れなコマンドプロンプトに引っ張られて .sh 側の機能も控えめにしています(改善点あればぜひ)。

:::

# 4. 機能の説明

<details open><summary>micro:bit v2 であれば以下の機能が動作しています(2024/12現在)</summary>

* UART 入出力
    * baudrate 115200
    * Linux だと /dev/ttyACM0 を指定
* ビープ
    * 後述のボタン操作によるビープ音
    * 後述のコマンド操作によるビープ音
* LED(テキスト表示)
    * drv_disp_print() を呼ぶことで任意のテキストをLEDに表示
    * 後述のコマンドによる随時実行
* 加速度センサー
    * 後述のコマンド操作による随時取得
* 磁気センサー
    * 後述のコマンド操作による随時取得
* ボタン
    * Aボタンで音階を下げてビープ音を鳴らす
    * Bボタンで音階を上げてビープ音を鳴らす
* BLE
    * ペアリングのみ
        * 有効にする場合は drv_init_bleperiph() のコメントアウトを外してください
        * 各種サービスはサンプルを随時実装予定
* UART 経由でコマンド操作(shell)によるドライバテスト
    * LED に文字列表示
        * exec print playbook 500 で LED に "playbook" を 500msec 間表示
    * ビープ
        * exec beep play でビープ音再生
        * exec beep raise でビープ音の音階を上げる
        * exec beep lower でビープ音の音階を下げる
    * 加速度センサー
        * exec accel 5 で加速度センサーで得た数値を5回表記(数字省略で3回)
    * 磁気センサー
        * exec magnet 5 で磁気センサーで得た数値を5回表記(数字省略で3回)

</details>

<details><summary>micro:bit 用の機能 (v2との差分) </summary>

* ビープ
    * 標準装備されていませんが、KittenBot IOBIT に繋ぐと v2 と同様鳴動することを確認できています
* ボタン
    * Aボタンで音階を下げてビープ音を鳴らす(要KittenBot IOBIT)
    * Bボタンで音階を上げてビープ音を鳴らす(要KittenBot IOBIT)
* BLE
    * Zephyr だと BLE を有効にすると RAM が足りずに動作不可

</details>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38092/abb5a263-8a8a-d509-750e-dd44c0d78b94.gif" width=45%> 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38092/d8da3693-7b49-0edf-7ca3-0cc9cc98f36a.gif" width=45%>

helloworld 表示(左)と、実機を振りながら加速度センサーと、磁気センサーの値を表示した様子(右)

# 5. 今後入れておきたい機能
* マルチスレッドやIPCのサンプル実装
* Kconfig の活用
    * リポジトリには導入済み
* micro:bit の各種センサー類の有効化
* 公式にはないI2Cデバイスの有効化
    * 投稿しました！[^8]
* 内蔵FLASHへの読み書き
* Test や静的解析ツールのサンプル導入(実はまだ手探り)

[^1]: Zephyr RTOS の公式手順 (公式ドキュメント)
https://docs.zephyrproject.org/latest/develop/getting_started/index.html
[^2]: この記事 (Qiita記事)
https://qiita.com/Corgeek/items/ca4c515ccf556551562f
[^3]: Zephyr RTOS 〜 GPIO を叩く！ 〜 (Qiita記事) 
https://qiita.com/Corgeek/items/122a00e430ad0d9c297a
[^4]: Zephyr RTOS 〜 チーム開発を見据えた管理方法 〜 (Qiita記事) 
https://qiita.com/Corgeek/items/b879637a6c25027af318
[^5]: ZephyrOpsPlaybook リポジトリ(github)
https://github.com/Corgeek/ZephyrOpsPlaybook
[^6]: BBC Micro:bit v2 個別情報
https://docs.zephyrproject.org/4.0.0/boards/bbc/microbit_v2/doc/index.html
[^7]: Nucleo F401RE 個別情報
https://docs.zephyrproject.org/4.0.0/boards/st/nucleo_f401re/doc/index.html
[^8]: Zephyr RTOS 〜 I2C 通信の方法と VL53L4CD の移植 〜 (Qiita記事)
https://qiita.com/Corgeek/items/ac211cd48a54971d9b17