Nerves Livebook で Raspberry Pi 4 の L チカ

## はじめに

同僚が使っていない Raspberry Pi 4 を貸してくれるということで、いよいよ Nerves デビューかと思い、やってみました

@torifukukaiou さんの記事を参考に L チカ（LED をチカチカ光らせる）まで実行できたので、手順を記事に残します

https://qiita.com/torifukukaiou/items/91441a14dcf66472af39

Nerves Livebook を利用します

https://github.com/nerves-livebook/nerves_livebook

https://livebook.dev/

## Nerves とは

Nerves は Elixir の IoT デバイス向けプラットフォームです

Elixir の知識さえあればすぐに IoT を始められます

https://nerves-project.org/

## ホストマシン

MacBook Pro 13-inch

macOS 14.5

## 利用するデバイス

Raspberry Pi 4 Model B

https://www.raspberrypi.com/products/raspberry-pi-4-model-b/

基盤に書いてあった FCC ID で確認しました

![IMG_1517.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/35b67db2-27a5-409e-f71d-fdd673b2e6db.jpeg)

## 準備

### fwup のインストール

ファームウェアを micro SD に書き込むため、 fwup をインストールします

https://github.com/fwup-home/fwup

```sh
brew install fwup
```

### WiFi 情報の確認

ホストマシンが接続している WiFi の SSID とパスワードを控えておきます

## ファームウェアの書込

### ファームウェアのダウンロード

Nerves Livebook のリリースページから対象デバイス用の `.fw` ファイルをダウンロードします

Raspberry Pi 4 の場合は `nerves_livebook_rpi4.fw` です

https://github.com/nerves-livebook/nerves_livebook/releases

![スクリーンショット 2024-06-16 21.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/2e6d3f53-72d4-699f-3462-53283ab42fa8.png)

### microSD の挿入

ホストマシンに microSD を差し込みます

私の場合はホストマシンにポートがないため、変換アダプタを使用しました

### 書込の実行

以下のコマンドを実行します

:::note info
ダウンロードした `.fw` ファイルが `~/Downloads` にある場合のコマンドです
:::

```sh
sudo NERVES_WIFI_SSID='<WiFiのSSIS>' NERVES_WIFI_PASSPHRASE='<WiFiのパスワード>' \
  fwup ~/Downloads/nerves_livebook_rpi4.fw
```

WiFiの接続情報を渡しておくことで、 Raspberry Pi 起動時に自動的に WiFi に接続してくれます

以下のようなメッセージが表示された場合、 `y` を入力します

```sh
Use 15.93 GB memory card found at /dev/rdisk2? [y/N]
```

書込が完了するのを待ちます

```sh
100% [====================================] 58.41 MB in / 68.85 MB out
Success!
Elapsed time: 2.837 s
```

## Raspberry Pi への接続

### microSD カードの差込

書き込んだ microSD カードをホストマシンから引き抜き、 Raspberry Pi に差し込みます

### 電源の接続

Raspberry Pi の電源を入れます

この時点で Raspberry Pi 上で Livebook が起動されます

### Livebook への接続

ブラウザで `nerves.local` にアクセスします

パスワードを求められるので `nerves` と入力し、 `Authenticate ->` ボタンをクリックします

![スクリーンショット 2024-06-16 21.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f00b216e-bbf6-3293-5599-ac197f6c0786.png)

認証できれば、 Raspberry Pi 上で動作している Livebook に接続できます

![スクリーンショット 2024-06-16 21.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fb0409b9-1b14-8669-e0d2-632022d74a38.png)

## L チカの実行

Welcome to Nerves Livebook のカードをクリックします

![スクリーンショット 2024-06-16 21.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0da3d9bd-558e-3325-107c-92c2c052a81a.png)

開いたノートブックの中から `LEDs` のリンクをクリックします

![スクリーンショット 2024-06-16 21.54.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b9f6eaa4-1574-67da-1d29-834ea9b65d93.png)

L チカ用のノートブックが表示されます

![スクリーンショット 2024-06-16 21.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/33d23d42-4f28-4f91-0064-d0a97f471170.png)

以下のコードを実行します

```elixir
led_base_path = "/sys/class/leds"
File.ls!(led_base_path)
```

実行結果として、 Raspberry Pi で利用可能な LED の一覧が表示されます

```elixir
["ACT", "PWR", "mmc0::"]
```

次のセル内の `"led0"` の部分を `"ACT"` に変更します

ACT の LED （黄緑色）が以後のセルで使われることになります

```elixir
led = Path.join(led_base_path, "ACT")
```

実行結果

```elixir
"/sys/class/leds/ACT"
```

LED の状態をリセットします

ACT の LED は点灯状態だったのが消灯状態になります

```elixir
File.write(Path.join(led, "trigger"), "none")
File.write(Path.join(led, "brightness"), "0")
```

LED のディレクトリー配下にあるファイル一覧を取得します

```elixir
File.ls!(led)
```

実行結果

```elixir
["uevent", "brightness", "power", "device", "trigger", "subsystem", "max_brightness"]
```

このうち `brightness` ファイルに `1` を書き込むことで、 LED を点灯させます

```elixir
File.write(Path.join(led, "brightness"), "1")
```

![IMG_1518.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c54ee3bd-2855-db61-d233-36fdee3d6ce5.jpeg)

`brightness` ファイルに `0` を書き込むことで、 LED を消灯させます

```elixir
File.write(Path.join(led, "brightness"), "0")
```

![IMG_1519.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0b556645-1dca-243a-cf65-5a2b19bcb9a4.jpeg)

`trigger` に `timer` を書込み、 `delay_on` と `delay_off` に `250` を書込みます

これにより、 250 ms 間隔で LED が点滅します

```elixir
File.write(Path.join(led, "trigger"), "timer")
File.write(Path.join(led, "delay_on"), "250")
File.write(Path.join(led, "delay_off"), "250")
```

![led.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/12d13b09-7f41-f4aa-4d0c-3a736d8b3a52.gif)

`trigger` に `none` を書込み、リセットします

```elixir
File.write(Path.join(led, "trigger"), "none")
File.read!(Path.join(led, "trigger"))
```

`none` を書き込んだ状態で `trigger` を読み込むと、他に設定可能なトリガーの一覧が表示されます

```elixir
"[none] rfkill-any rfkill-none timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on transient input panic pattern mmc1 mmc0 rfkill0\n"
```

## まとめ

Livebook から Raspberry Pi の LED を操作することができました

色々参照しながらでも 30 分程度で L チカまで辿り着きました

Nerves を使うことで、簡単に IoT 体験ができます

次に何をするかは色々な記事を見て検討します