2022/6/12 Zephyr OS v3.1ベースの説明にアップデートしました
2022/9/9 Seeeduino XIAOの書き込み方に関する説明を少し修正しました
前の記事で、IoTに向いたオープンソース組み込みOSを6種類も紹介しました。
その中でも個人的にいちばんオススメのZephyr OSを使ってみましょう✊
いろんなマイコンや開発ボードに対応しているし、いろんなメーカーのセンサードライバや、IoT向け無線ネットワーク、超軽量ファイルシステムなど、便利な機能が盛りだくさんで便利です😊
ただ、開発環境がやや独特なところがあり、最初のハードルが高いかもしれません。でも、このブログを読めばできるようになるかも!?
まずは、開発環境のインストールからやってみましょう!
準備するもの
開発用のマシンを用意します。WindowsやMacでももちろんOKですが、ここではUbuntu 22.04 LTSマシンで説明します。
あとは何かマイコン開発ボードがあるといいでしょう。例えばSeeeduino XIAOあたりが安くて便利です。1個600円くらいで買えます。
USB-Cポート付きで、ここからファームウェアの書き込みもできるので、これ1つあればOKです😆
インストール
インストールは以下の公式の手順に従えば簡単にできます。
公式ページにはUbuntu以外のインストール方法も載っています。
必要なパッケージのインストール
まずは必要なパッケージをインストールしましょう。
$ sudo apt install --no-install-recommends git cmake ninja-build gperf \ ccache dfu-util device-tree-compiler wget \ python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \ make gcc gcc-multilib g++-multilib libsdl2-dev
これで準備はOKです。Ubuntu 22.04ならこれで良いのですが、古いバージョンのUbuntuの場合、CMakeが古くてビルドできない場合があります。
$ cmake --version
で、バージョン情報を確認して、3.20.0以上ならOKです。
古いものが入っていた場合、CMakeの開発を主導しているKitware社のPPAから最新版を入れてください。
$ sudo apt remove cmake # いったん古いcmakeを削除 $ wget https://apt.kitware.com/kitware-archive.sh $ sudo bash kitware-archive.sh $ sudo apt update $ sudo apt install cmake
これで最新版のCMakeがインストールできます。
Zephyr OSのソースツリーインストール
続いて、Zephyr OSのソースツリーをインストールします。Zephyr OS開発では本体のソースツリーの他に、他のいろんなソースツリーを外部モジュールとして利用します。
Zephyr OS独自のコマンドラインツールwestを使うと、他のソースツリーも全自動で一気にダウンロードしてくれます。
westというツールの名前は、Zephyr OSの名前の由来となったギリシャ神話の神様ゼフィロス(Zephyros)が西(west)の風を司る神様であることに由来するそうです。
まずはwestをインストールしましょう。westはPythonでできたツールで、pipでインストールできます。
$ pip3 install --user -U west $ echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc $ source ~/.bashrc
ユーザーディレクトリにインストールされるので、パスを通して使えるようにしています。
続いてwestでZephpyr OSと外部モジュールのソースツリーをインストールします。
公式マニュアルに従い、必要なソースツリー一式を~/zephyrproject
にインストールしてみましょう。
次のコマンドでインストールできます。
$ west init --mr v3.1.0 ~/zephyrproject $ cd ~/zephyrproject $ west update
最初のwest init
で~/zephyrproject
にGitHubからZephyr OS v3.1.0のリポジトリをダウンロードします。
続いてwest update
で残りの外部モジュールをダウンロードします。
どんな外部モジュールをダウンロードするかはZephyr OSのリポジトリトップのwest.ymlファイルに記載されています。
なお、最初のwest init
の--mr v3.1.0
を省略すると、最新の開発版がダウンロードできます。
CMakeパッケージのエクスポート
Zephyr OSのビルドではCMakeがNinjaファイルを作成してビルドを行います。
ところでZephyr OSでは、Zephyr OSとは別の場所にアプリケーションのソースコードを置いてビルドできます。 アプリケーションだけを独立したGitリポジトリで管理できるなど、便利な機能です。
そのような外部プロジェクトのビルドができるように、Zephyr OSのCMakeボイラープレートを~/.cmake/package/Zephyr
にインストールします。
これも、次のようにするとwestが全自動でやってくれます。便利ですね☺️
$ west zephyr-export
こうしておくと、Zephyr OSと関係ないディレクトリにアプリのソースコードを置いても、CMakeLists.txt
にfind_package(Zephyr)
と書けば
Zephyr OSのソースツリー中のプロジェクトディレクトリと同じように開発ができます。
Python依存ライブラリのインストール
Zephyr OSのビルドシステムでは、Pythonスクリプトを多用しています。
ビルドシステムはなかなか複雑なことをしていて私も全貌はよくわかっていませんが…😅
このビルドシステムで使うPythonのライブラリをpipでインストールします。
pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt
これでZephyr OSソースツリーの準備は完了です。
ツールチェーン(Zephyr OS SDK)のインストール
ARM Cortex-MやRISC-VなどZephyr OSが対応する全てのアーキテクチャ用のコンパイラやQEMUなど、Zephyr OSのビルドに必要なツールチェーン一式をインストールします。
これら一式がZephyr SDKとしてまとめられていて、インストーラで簡単にインストールできます。 詳しい内容はこちらの公式マニュアルにあります。
まずはインストーラをダウンロードします。 記事執筆時点(2022/6)では0.14.2が最新のようです。
$ cd ~ $ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.14.2/zephyr-sdk-0.14.2_linux-x86_64.tar.gz
サイズが1.4GBもありました。大きなファイルですし、正しくダウンロードできたかチェックサムを確認しておきましょう。
wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.14.2/sha256.sum | shasum --check --ignore-missing
エラーが出なければ、展開してインストールしましょう。
$ tar xvf zephyr-sdk-0.14.2_linux-x86_64.tar.gz $ cd zephyr-sdk-0.14.2 Zephyr SDK 0.14.2 Setup ** NOTE ** You only need to run this script once after extracting the Zephyr SDK distribution bundle archive. Install host tools [y/n]? y Register Zephyr SDK CMake package [y/n]? y
質問が2つ出てきますが、両方ともy
にしておきましょう。
こうすると、自分のホームディレクトリ以下の~/zephyr-sdk-0.14.2
にクロスコンパイラ等がインストールされます。
PATHも通してくれますので、これで設定も終わりです。
ボードへのファームウェア書き込み用設定
続いて、Ubuntuマシンからマイコンのファームウェアを書き込みやすくできるよう、udevの設定をしておきましょう。
$ sudo cp ~/zephyr-sdk-0.14.2/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d $ sudo udevadm control --reload
これにより、多くのターゲット基板にsudoなしで書き込めるようになります。
お疲れ様でした!
ここまでで、~/zephyrproject
にZephyr OSおよび外部モジュールのソースツリー、
~/zephyr-sdk-0.12.4
にコンパイラツールチェーンがインストールできました。
これでファームウェアをビルドする準備が完了です!
サンプルプロジェクトのビルド
Zephyr OSにはいろんなサンプルプロジェクトが付属しています。 まずは一番単純なサンプルプロジェクト、LEDがチカチカ点滅するだけのプロジェクトをビルドしてみましょう。
~/zephyrproject/zephyr/samples/basic/blinky
にプロジェクトがあります。
移動して中身を見てみましょう。
$ cd ~/zephyrproject/zephyr/samples/basic/blinky $ tree . ├── CMakeLists.txt ├── prj.conf ├── README.rst ├── sample.yaml └── src └── main.c
tree
コマンドは今いるフォルダの中身をツリー形式で表示してくれるコマンドです。無ければsudo apt install tree
でインストールできます。
いくつかのファイルがありますが、これがZephyr OSのプロジェクトの一番単純な構成です。 中身の解説はこちらの記事でどうぞ!
今回はひとまずファームウェアをビルドしてみましょう。
プロジェクトフォルダの中にいる状態で、次のコマンドを実行します。
$ west build -b seeeduino_xiao
これでカレントフォルダのプロジェクトをビルドします。-b seeeduino_xiao
でターゲットボードを指定します。
インストールが正しくできていれば、エラーなくビルドが完了するはずです。
ビルドしてできたファームウェアや中間ファイルは、全てbuild
というフォルダが作られてその中に格納されます。
ファームウェアは、build/zephyr/zephyr.bin
というファイル名で保存してくれます。
ほかに同フォルダにzephyr.uf2
というファイルもでき、こちらはSeeeduino XIAO内蔵のブートローダーでUSB経由で書き込める形式です。
これをSeeeduino XIAOに書き込むには、Seeduino XIAOを書き込みモードにしてマシンに接続し、
$ west flash
とするだけです。たぶん…。というのも、私はUbuntuをリモートの仮想マシンで動かしていてSeeeduino XIAOが繋げないので、この方法が使えないのです。
WindowsでWSL上で開発環境を構築した場合も、west flash
は使えません。
なので、できたファームウェアを手動で書き込みます。
Seeeduino XIAOを書き込みモードにするとUSBメモリとして認識されるので、そこにzephyr.uf2
をドラッグ&ドロップで書き込みます。
すると、ファームウェアが書き換わって自動で再起動します。
このように、簡単にSeeeduino XIAOのファームウェアがビルドできました。
Zephyr OSはマルチスレッド対応ですし、UART、I2C、SPIなど各種ドライバもあります。 また、Seeeduino XIAOの場合はUSB-UART機能を単体で実現できます。 シェルやファイルシステムなどの便利な機能も豊富です。
いろんな機能をブログで紹介していきたいと思います。
ぜひ高機能な組み込みOSを使って、趣味の電子工作の幅を広げてみてください。