はじめに
ここまでの記事で Raspberry Pi 4 に最初からついている LED を光らせることができました
ただし、センサーの値をクラウドに連携して何らかの処理、というようなことまでをやりたいので、以下の製品を購入しました
SunFounder Raspberry pi 用のスターター電子工作キット
Python のコードで動かせるようなので、「Python を Elixir に翻訳すればいけるのでは?」という甘い見積もりで早速発注
電子工作は学生の時以来なので、正直説明書なしで組むのは厳しいので、このようなキットは大変ありがたいです
今回実装したノートブックはこちら
実行環境
以前の記事と同様、 Nerves Livebook の環境で実行します
もちろん購入した工作キットには Raspberry pi OS のインストール手順などが記載されているのですが、私はあくまで Elixir でやりたいので無視して進めます
回路の組み立て
GPIO とは
General Purpose Input/Output の略で、汎用入出力のことです
Raspberry Pi 4 では画像の赤枠部分、40本のピンが GPIO になっており、ここからセンサーやボタンなどの外部装置に接続します
GPIO 拡張ボード
世の中にはブレッドボードという便利なものがあります
私のような不器用かつおっちょこちょいな人にとって、ハンダ付けは恐ろしい作業です(1敗:火傷)
ブレッドボードでは、ハンダ付けなしで、穴に部品の線を差し込むだけで回路が組めるようになっています
購入した工作キットには GPIO 拡張ボードがついていて、 Raspberry Pi のピンをブレッドボードから簡単に拡張できるようになっています
これなら子どもでも安心して回路を組むことができます
LED点滅用回路
公開されているオンライン説明書を見ながら回路を組み立てます
こんな感じになりました
Elixir で LED を光らせる
Circuits - GPIO
Nerves から GPIO を操作するためのモジュールです
「Nerves GPIO」で検索したら出てきたのでこれを使います
LED の点灯
Raspberry pi 上の Livebook で新しいノートブックを開き、以下のコードを実行します
{:ok, gpio} = Circuits.GPIO.open("GPIO17", :output)
本来であればこの時点では初期値 0 が設定されるので光らないと思っていたのですが、光ってしまいました
この状態で Circuits.GPIO.write(gpio, 1)
を実行すると LED が消えます
0 で光って 1 で消えるのは直観に反しています
実はオンライン説明書で提示されているコードは電流の向きが逆になっていて、もちろんこれでも点滅させる分には何の問題もないのですが、やはり気持ち悪いので組み替えます
3V3 の線を GND に差し替えて、 LED の向きを逆にしました
この回路であれば 1 で光って 0 で消えるようになります
以下のコードを実行することで LED が光ります
{:ok, gpio} = Circuits.GPIO.open("GPIO17", :output)
Circuits.GPIO.write(gpio, 1)
Circuits.GPIO.close(gpio)
また、毎回 open して処理実行して close というのが面倒な場合は write_one
関数で一回だけ処理することも可能です
以下のコードを実行すると LED が消えます
Circuits.GPIO.write_one("GPIO17", 0)
LED の点滅
これらを踏まえて、一定間隔で 0 1 を切り替えれば点滅できるということが分かります
以下のコードを実行すると、 LED を点滅させることができます
{:ok, gpio} = Circuits.GPIO.open("GPIO17", :output)
Enum.each(1..10, fn index ->
Circuits.GPIO.write(gpio, rem(index, 2))
Process.sleep(500)
end)
Circuits.GPIO.close(gpio)
まとめ
Nerves Livebook で GPIO 拡張ボードの LED を点滅させることができました
ブレッドボードであれば私でもどんどん回路を組めるので、何だか色々できるような気がしてきました