GRiSP2ボードでElixirとNervesを使う



[GRiSP 2]: https://www.grisp.org
[IoT]: https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88
[nerves-project/nerves_system_grisp2]: https://github.com/nerves-project/nerves_system_grisp2
[grisp/grisp_demo]: https://github.com/grisp/grisp_demo/tree/sylane/make-image
[eMMC]: https://en.wikipedia.org/wiki/MultiMediaCard#eMMC
[microSD]: https://simple.wikipedia.org/wiki/MicroSD
[Erlang]: https://www.erlang.org
[ベアメタル]: https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A2%E3%83%A1%E3%82%BF%E3%83%AB
[はんだ付け]: https://ja.wikipedia.org/wiki/%E3%81%AF%E3%82%93%E3%81%A0%E4%BB%98%E3%81%91
[C言語]: https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E
[ブートローダ]: https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88
[Nerves]: https://hexdocs.pm/nerves/getting-started.html
[elixir-circuits/circuits_quickstart]: https://github.com/elixir-circuits/circuits_quickstart
[elixir-circuits/circuits_quickstart/releases]: https://github.com/elixir-circuits/circuits_quickstart/releases
[nerves-project/nerves_system_grisp2]: https://github.com/nerves-project/nerves_system_grisp2
[Nerves getting started guide]: https://hexdocs.pm/nerves/getting-started.html
[FAT]: https://ja.wikipedia.org/wiki/File_Allocation_Table
[Elixir]: https://elixir-lang.org/

## [GRiSP 2]とは

- [ベアメタル]Erlang仮想マシン
- [はんだ付け]や[C言語]が不要
- [Erlang]で[IoT]プロジェクトを実現可能
- [GRiSP 2 Guides](https://github.com/grisp/grisp/wiki)
- [GRiSP 2]が[Nerves]に適しているのかどうかは賛否両論あり

![GRiSP2_board](https://user-images.githubusercontent.com/7563926/201105122-a648c0e2-03ef-4d55-8e9a-2ee1b2a8b2fb.png)

## 工場出荷状態

- 工場出荷状態では[grisp/grisp_demo]がインストールされている
- [Erlang]を使える人はそのまま遊べそう

## とりあえず起動してみる

- [ブートローダ]は[eMMC]に保存される
- 起動時に[eMMC]に保存された[ブートローダ]が読み込まれる
- [microSD]から直接のブートはできないっぽい
- 詳しくは[grisp/grisp_demo]のREADME.md参照

## USBシリアルポートへ接続

### ホストPCにUSBケーブルで接続

- USBケーブルにはデータ転送用と充電専用があるので注意（ここではデータ転送用が必要）

![GRiSP2_board--serial-console-connector](https://user-images.githubusercontent.com/7563926/201108882-42855469-6610-4a83-817e-50e684e73eb8.png)

### 仮想端末を起動

- `screen`コマンド、`picocom`コマンド等を使用し仮想端末を起動

macOSの例

```
$ screen /dev/tty.usbserial-0<GRiSP Serial Number>1 115200
```

Linuxの例

```
$ screen /dev/ttyUSB1 115200
```

![Initial erlang shell](https://user-images.githubusercontent.com/7563926/196830101-e06e2cd9-46d8-4627-b49f-cac5d4ea21fa.png)

## [Nerves]を使う

- [GRiSP 2]用のNervesシステムは[nerves-project/nerves_system_grisp2]
- Nervesファームウエアの初期化には[elixir-circuits/circuits_quickstart]を使うと便利
- 他のNerves対象ボードと手順が異なるのでNervesに慣れている人は特に注意が必要

### [GRiSP 2]デモアプリの再インストール方法を読んでおく

- 現時点では[Nerves]のGRiSP 2へのサポートは実験的で限定的なので、念の為に[GRiSPのデモアプリの再インストール方法][grisp/grisp_demo]を読んでおくこと
- 正直いうと僕はこれをよく理解していませんが、[Nerves]しか使わないので「ま〜いっか」と思ってます

### Nerveファームウエアを準備

- [elixir-circuits/circuits_quickstart/releases]から`circuits_quickstart_grisp2.img.gz`ダウンロード
- もちろん慣れている人はご自身で[Nervesのドキュメント][Nerves getting started guide]に沿ってNervesファームウエアを作ってもよし

#### [microSD]を[FAT]でフォーマットする

この手順はひょっとしたらいらないのかも :thinking_face: 

macOSの例

![CleanShot 2022-11-10 at 19 10 33@2x](https://user-images.githubusercontent.com/7563926/201232791-f71ab689-1c3a-462e-9361-2d3ef656486b.png)


#### Nerveファームウエアを[microSD]にコピーする

- 前項で[FAT]でフォーマットした[microSD]にNerveファームウエア（`circuits_quickstart_grisp2.img.gz`）をコピーする

![](https://user-images.githubusercontent.com/7563926/201233390-337a646c-91f1-42c5-a8d9-f1bc0e303853.png)

#### [microSD]を[GRiSP 2]ボードに挿入する

![CleanShot 2022-11-10 at 19.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/cfc33bfb-58d7-88fb-7c2f-272c9ba90188.png)

そして、[USBシリアルポートへ接続](#USBシリアルポートへ接続)

### bareboxシェルを開く

#### [GRiSP 2]のリセットボタンを押す

![CleanShot 2022-11-10 at 19.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/7ce129d3-631a-7bfa-d3e4-d63e3a6240b9.png)

#### 3秒以内にホストPCのMキーを押す

するとメインメニューが出てくるので、「Shell」を選択

![](https://user-images.githubusercontent.com/7563926/196830111-dd735668-2de7-452e-8d31-c8de173e6b39.png)

![](https://user-images.githubusercontent.com/7563926/196830118-c0a69158-4174-4046-aaf2-324bd4069b69.png)

### Nerveファームウエアを[microSD]から[GRiSP 2]の[eMMC]へ書き込む

以下の2つのコマンドを打つ（Nerveファームウエアはご自身のものに読み替えてください）

```bash
barebox@GRiSP2:/ uncompress /mnt/mmc/circuits_quickstart_grisp2.img.gz /dev/mmc1
```

```bash
barebox@GRiSP2:/ reset
```

![CleanShot 2022-11-10 at 19.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/6371e34b-6a44-3805-560b-120929e0200b.png)

:tada:

エラーが一個出ますが、詳しい人に確認したところ無視して問題ないそうです

### WiFiの設定（任意）

```elixir:IEx
iex> VintageNetWiFi.quick_configure("ssid", "password")
```

ちゃんと設定できたか確認

```elixir:IEx
iex> VintageNet.info()

iex> tree "/data/vintage_net"
```

あとは普通に[Elixir]と[Nerves]ができるはずです