【実写版】階段の上でも下でも電灯を点けたり消したりする（ライブ編集中だからリンクするなよ）

今日はアドベントカレンダーの記事をライブで書きます。どんどん追加されていきます。本日中にどこまで出来るのかやってみます。このパラグラフが消え去るまでは、未完成ですので、良きに計らってください。

これは [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp) の24日目です。昨日は [@zacky1972](https://qiita.com/zacky1972) さんの [mix_tasks_upload_hotswap の Hexライブラリ版を試す](https://qiita.com/zacky1972/items/f0b47eded7c902008871) でした。


# はじめに


[階段の上でも下でも電灯を点けたり消したりする](https://qiita.com/kikuyuta/items/632496c527fcd7c158d5)

## この記事の作り方
アドベントカレンダーの 2020.12.24 を予約してまして、当日に鳴ってしまったので、ダッシュで書いてます。で、その様子をセミライブで、書いては公開・書いては公開、を繰り返します。

### 作業記録
- 17:00 ごろ 職場に行って材料を取って自宅に帰る（後で足りないものが出そうでこわい）
- 18:50 ごろ この記事の initial commit をする
- なにかは見とかないと色々間違いそうなので、アドベントカレンダー2日目の [ウェブチカでElixir/Nervesに入門する（2020年12月版）](https://qiita.com/kentaro/items/e8df79aa93b9fe9a567e) を開いて横においてく
- 19:11 `mix nerves.new way343` をやる
- 19:19 ページ更新
- 19:29 とりあえず MIX_TARGET=rpi0 で作ったファームウェアがターゲットで起動するのを確認
- 19:30 microSD カードが足りないのに気づいて、イオンに行ってる家族に LINE で調達要請をだす
    - 19:35 了解した旨の返事をもらう
- 19:40 RPI0 に家の WiFi 経由で ssh nerves.local できることを確認 10.0.1.39/24
- 19:49 3つの rpi0 が全部起動することを確認。でも複数あると nerves.local できない
- 20:03 ファームウェアに Circuits.GPIO を突っ込んで RPI0 & OLED_bonnet がデジタル入出力出来るのを確認 GPIO 4, 5, 6
- 20:05 家族から「SunDisk と謎ブランドとどっちが良い？」とLINE。謎ブランドのは 32GB で1000円切るのでそちらを2枚買ってもらった。SunDisk は2倍以上する。
- 「あれ？入れない、入れない」と思ったら `ssh nerves.new` ってやってた。落ち着け。
- 20:24 Rpi0 & Grove コネクタ拡張HAT で GPIO を試す
    - GPIO 12, 20 は入力のインタラプトが取れるが、GPIO 14 は取れない
    - GPIO 13, 15, 21 は Grove ボタンの NC 側につながってるので何も反応がない
- 20:45 `export MIX_TARGET=bbb` で BeableBone Green のファームウェアが動くことを確認
    - ExiCape の GPIO 60, 50, 51, 4, 5, 48, 31, 30 が :output で LED 点灯するのを確認
- 21:02 BBG の Ethernet に固定IPアドレスがふれることを確認
- 21:10 家族が私の餌を持って帰宅したので夕食にする。
- 21:51 食事から戻る。夕食は海鮮ちらし寿司、チキンから揚げ、モンブランのケーキ
- 22:30 お腹が一杯でやる気がでないのでネットサーフしてた
- 22:59 WiFiのRPi0でも固定アドレスで立ち上がるのを確認。にしても眠すぎる。
- 23:17 同じ config/target.exs に eth0 と wlan0 とで個別の IP アドレスを振る設定にしておいて、eth0 しかない bbb と wlan0 しかない rpi0 とに同じソースコードのファームを突っ込んでみると、それぞれ持っている IF の IP しか有効にならないので異なるアドレスで立ち上がることを確認
- 23:46 どの実装にしようか迷いマクローリン展開。走行するうちに昔の記事にバグを見つけて修正
- 00:33 日が変わった。bbb と rpi0 とに自動 Node.connect と Syn2 の pub/sub を入れて、両方とも稼働することを確認
- 00:34 眠すぎて無理。寝る。
- 07:25 寝坊。娘を叩き起こして朝食を食べさせて慌てて出勤。スクールバスに間に合うか。
- 08:10 WiFiルータを研究室から持ち出し、スクールバスで香美キャンパスから永国寺キャンパスへ
- 09:00 会議室で作業開始
- 10:00 FreeSpot 用の WiFiルータだとLAN側同士のホストがつながらない。つながるように設定もできない。普通のルータを持ってきてもらうように kochi.ex メンバに依頼
- 12:00 次々に通常業務が入って来るのでそちらを処理。某サーバの証明書が2月に切れることがわかり憂鬱
- 12:30 kochi.ex メンバと昼食へgo、今日はスンドゥブ
- 13:30 昼食終了
- 14:00 持ってきてもらったルータで上手いこと BBG が Ethernet 経由でつながる
- 14:42 RPi0 が wireless でどうしてもつながらず… psk が間違ってることを指摘され…
- 14:44 つながる… orz... 忘年会は 16:00 から。後1時間だ。
- 15:00 Syn v2.1 の pub/sub に実装する方針に決定
- 15:52 忘年会に行かなくてはならない。残念だ ← イマココ


# 基本構成を仕込む

## Circuis.GPIO の確認

### Rpi0 に OLED Bonnet

https://pinout.xyz/pinout/oled_bonnet

```exs
iex(1)> {:ok, gpio4} = Circuits.GPIO.open(4, :input)
{:ok, #Reference<0.3098086349.268566535.58965>}
iex(2)> {:ok, gpio5} = Circuits.GPIO.open(5, :input)
{:ok, #Reference<0.3098086349.268566535.58966>}
iex(3)> {:ok, gpio6} = Circuits.GPIO.open(6, :input)
{:ok, #Reference<0.3098086349.268566535.58967>}
iex(4)> Circuits.GPIO.set_interrupts(gpio4, :both)
:ok
iex(5)> Circuits.GPIO.set_interrupts(gpio5, :both)
:ok
iex(6)> Circuits.GPIO.set_interrupts(gpio6, :both)
:ok
iex(7)> flush
{:circuits_gpio, 4, 88351231557, 1}
{:circuits_gpio, 5, 92067507046, 1}
{:circuits_gpio, 6, 94870610033, 1}
:ok
iex(8)> Circuits.GPIO.set_interrupts(gpio6, :both)
:ok
iex(9)> flush                                     
{:circuits_gpio, 4, 105007832077, 0}
{:circuits_gpio, 4, 105189346680, 1}
:ok
iex(10)> flush
{:circuits_gpio, 5, 115037522115, 0}
{:circuits_gpio, 5, 115203268624, 1}
:ok
iex(11)> flush
{:circuits_gpio, 6, 118212275742, 0}
{:circuits_gpio, 6, 118364134197, 1}
:ok
```

```exs
iex(1)> {:ok, gpio14} = Circuits.GPIO.open(14, :input)
{:ok, #Reference<0.1671892300.268566531.234311>}
iex(2)> {:ok, gpio15} = Circuits.GPIO.open(15, :input)
{:ok, #Reference<0.1671892300.268566531.234312>}
iex(3)> Circuits.GPIO.set_
set_direction/2     set_interrupts/2    set_interrupts/3    
set_pull_mode/2     
iex(3)> Circuits.GPIO.set_interrupts(gpio14, :both)
{:error, :hal_apply_interrupts}
iex(4)> Circuits.GPIO.set_interrupts(gpio15, :both)
{:error, :hal_apply_interrupts}
iex(5)> flush
:ok
iex(6)> flush
:ok
iex(7)> flush
:ok
iex(8)> flush
:ok
iex(9)> {:ok, gpio14} = Circuits.GPIO.open(12, :input)
{:ok, #Reference<0.1671892300.268566531.234315>}
iex(10)> {:ok, gpio14} = Circuits.GPIO.open(14, :input)
{:ok, #Reference<0.1671892300.268566531.234316>}
iex(11)> {:ok, gpio12} = Circuits.GPIO.open(12, :input)
{:ok, #Reference<0.1671892300.268566531.234317>}
iex(12)> {:ok, gpio13} = Circuits.GPIO.open(13, :input)
{:ok, #Reference<0.1671892300.268566531.234318>}
iex(13)> {:ok, gpio20} = Circuits.GPIO.open(20, :input)
{:ok, #Reference<0.1671892300.268566531.234319>}
iex(14)> {:ok, gpio21} = Circuits.GPIO.open(21, :input) 
{:ok, #Reference<0.1671892300.268566531.234320>}
iex(15)> Circuits.GPIO.set_interrupts(gpio12, :both)   
:ok
iex(16)> Circuits.GPIO.set_interrupts(gpio13, :both)
:ok
iex(17)> Circuits.GPIO.set_interrupts(gpio14, :both)
{:error, :hal_apply_interrupts}
iex(18)> Circuits.GPIO.set_interrupts(gpio15, :both)
{:error, :hal_apply_interrupts}
iex(19)> Circuits.GPIO.set_interrupts(gpio20, :both)
:ok
iex(20)> Circuits.GPIO.set_interrupts(gpio21, :both)
:ok
iex(21)> flush
{:circuits_gpio, 12, 261130576887, 0}
{:circuits_gpio, 13, 263824013398, 0}
{:circuits_gpio, 20, 285571669648, 0}
{:circuits_gpio, 21, 288806394018, 0}
:ok
iex(22)> flush
:ok
iex(23)> flush
:ok
iex(24)> flush
{:circuits_gpio, 12, 299253040435, 1}
{:circuits_gpio, 12, 299433046418, 0}
{:circuits_gpio, 12, 299535605408, 1}
{:circuits_gpio, 12, 299714417391, 0}
:ok
iex(25)> flush
:ok
iex(26)> flush
:ok
iex(27)> flush
{:circuits_gpio, 20, 330622386627, 1}
{:circuits_gpio, 20, 330810957611, 0}
{:circuits_gpio, 20, 330989729596, 1}
{:circuits_gpio, 20, 331119557585, 0}
:ok
```

- GPIO60
- GPIO50
- GPIO51
- GPIO4
- GPIO5
- GPIO48
- GPIO31
- GPIO30

# まとめ
きょうは、をしました。

さて、明日の [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp) の25日目のトリの記事は我らが [@takasehideki](https://qiita.com/takasehideki) センセの [Nervesな2020年を #NervesJP 的に?? ふりかえる](https://qiita.com/takasehideki/items/198b5f6425890c181eaf) です。お楽しみに！

## 謝辞


# 参考文献

- [階段の上でも下でも電灯を点けたり消したりする](https://qiita.com/kikuyuta/items/632496c527fcd7c158d5)
- https://pinout.xyz/pinout/oled_bonnet