12
3

はじめに

Nerves Livebook で Raspberry Pi 用スターター電子工作キットを楽しんでいます

SunFounder Raspberry Pi 用のスターター電子工作キット

これまでの記事

この記事では LED ドットマトリックスにアニメーションを表示します

実装したノートブックはこちら

LED ドットマトリックス

LED の点(ドット)が 8 * 8 の行列(マトリックス)状に並んでいます

IMG_1619.JPG

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 が光る

IMG_1611.JPG

# 2 行目だけが光る
shift_out.(0b00000000, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b00000010, sdi, rclk, srclk) # 行は 1 が光る

IMG_1612.JPG

# 1 列目だけが光る
shift_out.(0b11111110, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る

IMG_1613.JPG

# 1 列目と 2列目が光る
shift_out.(0b11111100, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る

IMG_1614.JPG

# 全部光る
shift_out.(0b00000000, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b11111111, sdi, rclk, srclk) # 行は 1 が光る

IMG_1615.JPG

# 真ん中だけ光る
shift_out.(0b11000011, sdi, rclk, srclk) # 列は 0 が光る
shift_out.(0b00111100, sdi, rclk, srclk) # 行は 1 が光る

IMG_1616.JPG

アニメーションを表示する

順番に光らせることでアニメーションになります

指定した行列を順番に光らせる関数を用意します

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)

rows.gif

列を順番に光らせるアニメーションを作ります

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)

cols.gif

ピンを閉じる

遊び終わったらピンを閉じておきます

Circuits.GPIO.close(sdi)
Circuits.GPIO.close(rclk)
Circuits.GPIO.close(srclk)

まとめ

LED ドットマトリックスで単純なアニメーションを作ることができました

複雑なものは作れませんが、ちょっとした遊びとしては面白いですね

12
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3