はじめに
Nerves Livebook で Raspberry Pi 用スターター電子工作キットを楽しんでいます
SunFounder Raspberry Pi 用のスターター電子工作キット
これまでの記事
- Nerves Livebook で Raspberry Pi 4 のLチカ
- Nerves Livebook + Delux で簡単Lチカ
- MacBook 上の Livebook から Raspberry Pi 上の Livebook に接続してLチカする
- Nerves Livebook から GPIO 拡張ボードの LED を点滅させる
- Nerves Livebook から RGB LED を制御する(ソフトPWMもやってみる)
- Nerves Livebook から LED 棒グラフを制御する
この記事では、ボタンを押すと LED が光るように制御します
こちらの記事を参考にしました
実装したノートブックはこちら
回路の組み立て
今回使うのはこのボタンです
オンライン説明書を見ながら回路を組みますが、例によって電流の向きを逆にするため 3V3 と GND を入れ替えます
ピンを開く
GPIO の各ピンを開きます
GPIO17 が LED 、 GPIO18 がボタンに繋がっています
{:ok, led} = Circuits.GPIO.open("GPIO17", :output)
{:ok, btn} = Circuits.GPIO.open("GPIO18", :input)
GPIO17 は出力に使うので、第2引数 direction
(方向)に :output
を指定します
GPIO18 は入力に使うので、第2引数に :input
を指定します
LED の点灯
LED のピンに 1
を書き込むと LED が光り、 0 を書き込むと LED が消えます
Circuits.GPIO.write(led, 1)
Circuits.GPIO.write(led, 0)
ボタンのON/OFF入力
ボタンのピンを読んだとき、押されていれば 1 、押されていなければ 0 が返ってきます
Circuits.GPIO.read(btn)
ピンを閉じる
一旦、ピンを閉じます
Circuits.GPIO.close(led)
Circuits.GPIO.close(btn)
ボタンとLEDの連動
ボタンを押している間だけ LED が光るようにします
また、ノートブック上に用意したフレームにボタンの状態が出力されるようにしています
defmodule LEDButton do
use GenServer
require Logger
alias Circuits.GPIO
@btn "GPIO18"
@led "GPIO17"
def start_link(frame) do
GenServer.start_link(__MODULE__, %{frame: frame}, [])
end
def init(state) do
{:ok, btn} = GPIO.open(@btn, :input, pull_mode: :pullup)
GPIO.set_interrupts(btn, :both)
{:ok, led} = GPIO.open(@led, :output)
{:ok, %{btn: btn, led: led, frame: state.frame}}
end
def handle_info({:circuits_gpio, @btn, _timestamp, value}, state) do
Kino.Frame.render(state.frame, value) # フレームの値を更新
GPIO.write(state.led, value) # LED の状態を更新
{:noreply, state}
end
def handle_info(:stop, state) do
Circuits.GPIO.close(state.led)
Circuits.GPIO.close(state.btn)
{:stop, "stopped", state}
end
end
フレームを用意します
frame = Kino.Frame.new()
連動プロセスを開始します
{:ok, pid} = LEDButton.start_link(frame)
ボタンを押すと LED が光り、フレーム内の値も 1 になっています
ボタンを離すと LED が消え、フレーム内の値も 0 になりました
遊び終わったらプロセスを止めておきます
GenServer.stop(pid)
まとめ
ボタン入力による制御が実装できました
Livebook を使うことで、ブラウザ上の表示ともキレイに連携させることができます