この文章は、ZephyrRTOS Advent Calendar 2024の21日目のエントリとして書かれました。
はじめに
今回の同人誌では、Zephyr RTOS 〜 Lチカのその先へ 〜などでWindowsやUbuntuでの開発環境の構築に関して、詳しく説明されています。
ここでは、macOSとmicro:bitで試してみたので、報告してみたいと思います。
環境構築に関しては、公式ドキュメントの紹介だけですが、micro:bitでデモを動かす部分を参考にして下さい。
Zephyr開発環境の準備
Getting Started Guideで、macOSタブを選択して表示される手順で問題なく開発環境が構築できます。
というわけで、ここでは詳細は説明しません。
micro:bitをJ-Link用にする
SDKでは、J-Linkを経由した書き込みが必要です。
このため、J-Link用のデバイス(J-Link Eduなど)が必要になるのですが、micro:bitには以下のようなJ-Link化するファームウエアが用意されています。
-
BBC micro:bit J-Link Upgrade Upgrading the BBC micro:bit DAPLink to J-Link
導入は、このページの説明の通りに行えば大丈夫です。
ただし、ここで提供されているファームウエアはv.2.2では使えないようです。v.1.5かv.2.0を用意してください。
概略は以下の通りです。
- micro:bitをメンテナンスモードで起動します。
- リセットボタンを押しながら、電源を投入します。
ファームウエアのHexファイル(JLink_OB_BBC_microbit_22-11-16.hex
(v.1.5用),JLink_OB_BBC_microbitV2_22-11-15.hex
([* v.2.0用])を現れたMAINTANANCEフォルダーにコピーします。
- リセットボタンを押しながら、電源を投入します。
micro:bit用デモのBuildと実行
micro:bit専用のデモがZephyr SDKの中に3つ含まれています。
- display: 5x5 LED画面に数字、文字、パターンなどを表示します
- sound: 音を出し、その周波数をボタンで変更します
- pong: pongゲームで、マルチプレーヤーにも対応しています。
ボードの定義を確認するには、以下のようにwest boards
コマンドを使います。
micro:bitに関しては、bbc_microbit
(v.1.5)とbbc_microbit_v2
(v.2系)が利用可能です。
$ west boards|grep -i micro
micromod
sparkfun_pro_micro_rp2040
bbc_microbit
bbc_microbit_v2
以下のコマンドでは、micro:bit v.1.5系のコマンドラインで説明しますが、v.2系の場合は-b
オプションのbbc_microbit
をbbc_microbit_v2
に読み替えて下さい。
以下のコマンドで、micro:bitの5x5 LEDに数字や文字、パターンを表示するデモがbuildできます。
$ west build -p always -b bbc_microbit samples/boards/bbc/microbit/display
また、以下のコマンドで、音を出すデモが構築できます。こちらのデモは、スピーカーのないv.1.5では意味がありません。
$ west build -p always -b bbc_microbit samples/boards/bbc/microbit/sound
pongゲームは以下のコマンドで構築できます。
一人用とBluetoothで接続するマルチプレーヤー用を選択して遊べます。
$ west build -p always -b bbc_microbit samples/boards/bbc/microbit/pong
buildが終わった後、ボードに書き込むには、以下のコマンドを実行します。
$ west flash
blinkyデモを動かす
micro:bit専用のデモは、何も変更しなくても問題なく動作します。
一番基本のBlinkyデモは、led0
に関する定義などがないため、そのままでは動作しません。
そこで、動作するように変更してみました。
以下の二つのファイル(main.c
とprj.conf
)をdiff
の差分通りに更新することで、buildと実行ができるようになります。
--- samples/basic/blinky/src/main.c.org 2024-12-20 12:43:01.000000000 +0900
+++ samples/basic/blinky/src/main.c 2024-12-20 12:53:29.000000000 +0900
@@ -7,38 +7,32 @@
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
+#include <zephyr/device.h>
+
+#include <zephyr/display/mb_display.h>
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
-/* The devicetree node identifier for the "led0" alias. */
-#define LED0_NODE DT_ALIAS(led0)
-
/*
- * A build error on this line means your board is unsupported.
- * See the sample documentation for information on how to fix this.
- */
-static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
+ Blink for microbit
+*/
+void blink(bool led_state){
+ struct mb_display *disp = mb_display_get();
+ struct mb_image pixel = {};
+
+ if(led_state) {
+ pixel.row[0] = BIT(0);
+ }
+ mb_display_image(disp, MB_DISPLAY_MODE_SINGLE, 250,&pixel, 1);
+}
int main(void)
{
- 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) {
- ret = gpio_pin_toggle_dt(&led);
- if (ret < 0) {
- return 0;
- }
+ blink(led_state);
led_state = !led_state;
printf("LED state: %s\n", led_state ? "ON" : "OFF");
--- samples/basic/blinky/prj.conf.org 2024-12-20 12:55:38.000000000 +0900
+++ samples/basic/blinky/prj.conf 2024-12-20 12:55:55.000000000 +0900
@@ -1 +1,3 @@
CONFIG_GPIO=y
+CONFIG_DISPLAY=y
+CONFIG_MICROBIT_DISPLAY=y
おわりに
macOSで、Zephyr SDKを使ってmicro:bitでデモを動作させてみました。
VSCodeを使った解説の記事nRF Connect SDK FundamentalsでZephyrを試してみる: micro:bit編と合わせて読んでいただけると幸いです。