はじめに
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 棒グラフを制御する
- Nerves Livebook でボタンとLEDを連動させる
- Nerves Livebook で 7 セグメントディスプレイに文字を表示する
- Nerves Livebook で 4 桁 7 セグメントディスプレイに文字を表示する
この記事では LED ドットマトリックスにアニメーションを表示します
実装したノートブックはこちら
LED ドットマトリックス
LED の点(ドット)が 8 * 8 の行列(マトリックス)状に並んでいます
16本の足があり、各行、各列に対応しています
回路の組み立て
オンライン説明書の通りに回路を組みます
74HC595 を行と列で二つ使います
ノートブックの実装
Nerves Livebook を開き、以降のコードを実行していきます
準備
ビット演算のために Bitwise
を読み込みます
import Bitwise
ピンを開く
GPIO の各ピンを出力用に開きます
シフトレジスタ 74HC595 に信号を送るためのピンを開きます
{:ok, sdi} = Circuits.GPIO.open("GPIO17", :output)
{:ok, rclk} = Circuits.GPIO.open("GPIO18", :output)
{:ok, srclk} = Circuits.GPIO.open("GPIO27", :output)
関数の定義
前回までと同じ、shift_out
関数を定義します
シフトレジスタに指定した信号を順次送ってから並列伝送する関数です
shift_out = fn data, sdi, rclk, srclk ->
for bit <- 0..7 do
bit = data <<< bit &&& 0x80
Circuits.GPIO.write(sdi, bit)
Circuits.GPIO.write(srclk, 1)
Process.sleep(1)
Circuits.GPIO.write(srclk, 0)
end
Circuits.GPIO.write(rclk, 1)
Process.sleep(1)
Circuits.GPIO.write(rclk, 0)
end
指定した行、列を光らせる
列と行に指定した2進数の各桁の値によって、どう光るかが変わります
列に 0 、行に 1 が指定されているドットだけが光ります
# 1 行目だけが光る
shift_out.(0b00000000, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b00000001, sdi, rclk, srclk) # 行は 1 が光る
# 2 行目だけが光る
shift_out.(0b00000000, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b00000010, sdi, rclk, srclk) # 行は 1 が光る
# 1 列目だけが光る
shift_out.(0b11111110, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る
# 1 列目と 2列目が光る
shift_out.(0b11111100, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る
# 全部光る
shift_out.(0b00000000, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る
# 真ん中だけ光る
shift_out.(0b11000011, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b00111100, sdi, rclk, srclk) # 行は 1 が光る
アニメーションを表示する
順番に光らせることでアニメーションになります
指定した行列を順番に光らせる関数を用意します
animate = fn code_row, code_col, sdi, rclk, srclk, sleep ->
code_row
|> Enum.zip(code_col)
|> Enum.map(fn {row, col} ->
shift_out.(col, sdi, rclk, srclk)
shift_out.(row, sdi, rclk, srclk)
Process.sleep(sleep)
end)
end
行を順番に光らせるアニメーションを作ります
code_row = [
0b00000001,
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000
]
code_col = [
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
]
0..5
|> Enum.map(fn _ ->
animate.(code_row, code_col, sdi, rclk, srclk, 1)
animate.(code_row |> Enum.reverse(), code_col |> Enum.reverse(), sdi, rclk, srclk, 1)
end)
列を順番に光らせるアニメーションを作ります
code_row = [
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111
]
code_col = [
0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111
]
0..5
|> Enum.map(fn _ ->
animate.(code_row, code_col, sdi, rclk, srclk, 1)
animate.(code_row |> Enum.reverse(), code_col |> Enum.reverse(), sdi, rclk, srclk, 1)
end)
ピンを閉じる
遊び終わったらピンを閉じておきます
Circuits.GPIO.close(sdi)
Circuits.GPIO.close(rclk)
Circuits.GPIO.close(srclk)
まとめ
LED ドットマトリックスで単純なアニメーションを作ることができました
複雑なものは作れませんが、ちょっとした遊びとしては面白いですね