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


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

これは #NervesJP Advent Calendar 2020 の24日目です。昨日は @zacky1972 さんの mix_tasks_upload_hotswap の Hexライブラリ版を試す でした。

はじめに

階段の上でも下でも電灯を点けたり消したりする

この記事の作り方

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

作業記録

  • 17:00 ごろ 職場に行って材料を取って自宅に帰る(後で足りないものが出そうでこわい)
  • 18:50 ごろ この記事の initial commit をする
  • なにかは見とかないと色々間違いそうなので、アドベントカレンダー2日目の ウェブチカでElixir/Nervesに入門する(2020年12月版) を開いて横においてく
  • 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

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
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 の25日目のトリの記事は我らが @takasehideki センセの Nervesな2020年を #NervesJP 的に?? ふりかえる です。お楽しみに!

謝辞

参考文献