サイコロをつくる(Elixir, Nerves)
はじめに
- サイコロをつくってみます
- もちろんNervesを使います
- ボタンを押している間はガチャガチャ表示して、離したら適当な数字を1つ表示します
- 配線が、ガチャガチャしています
前提記事
- Nervesを使ってタクトスイッチを押したらLEDを光らせる(Elixir)
-
@MzRyuKaさんのはてなブログに投稿しました
RaspberryPiのピンの役割を確認するのに便利なサイト「http://pinout.xyz」 - みずりゅの自由帳 https://mzryuka.hatenablog.jp/entry/2020/01/28/073204 #はてなブログ
- こちらで紹介されているpinout.xyをみてGPIOを選びました(特定の役割が割り当てられていないものを選び直しました)
- ありがとうございます!
ソースコード
ソースコード抜粋
- 関連コミット
lib/hello_nerves/led/seven_seg.ex
defmodule HelloNerves.Led.SevenSeg do
@a_led_pin Application.get_env(:hello_nerves, :a_led_pin, 26)
@b_led_pin Application.get_env(:hello_nerves, :b_led_pin, 6)
@c_led_pin Application.get_env(:hello_nerves, :c_led_pin, 5)
@d_led_pin Application.get_env(:hello_nerves, :d_led_pin, 16)
@e_led_pin Application.get_env(:hello_nerves, :e_led_pin, 23)
@f_led_pin Application.get_env(:hello_nerves, :f_led_pin, 25)
@g_led_pin Application.get_env(:hello_nerves, :g_led_pin, 22)
alias Circuits.GPIO
require Logger
def clear do
[@a_led_pin, @b_led_pin, @c_led_pin, @d_led_pin, @e_led_pin, @f_led_pin, @g_led_pin]
|> Enum.map(&gpio(&1))
|> Enum.map(&turn_off(&1))
end
def show do
fun = random_fun()
1..3
|> Enum.each(fn _ ->
fun.()
Process.sleep(50)
clear()
Process.sleep(25)
end)
fun.()
end
def random do
fun = random_fun()
fun.()
end
def random_forever do
random()
50..75
|> Enum.random()
|> Process.sleep()
random_forever()
end
def one do
clear()
[@b_led_pin, @c_led_pin] |> flush()
end
def two do
clear()
[@a_led_pin, @b_led_pin, @g_led_pin, @e_led_pin, @d_led_pin] |> flush()
end
def three do
clear()
[@a_led_pin, @b_led_pin, @g_led_pin, @c_led_pin, @d_led_pin] |> flush()
end
def four do
clear()
[@f_led_pin, @g_led_pin, @b_led_pin, @c_led_pin] |> flush()
end
def five do
clear()
[@f_led_pin, @g_led_pin, @c_led_pin, @d_led_pin, @a_led_pin] |> flush()
end
def six do
clear()
[@f_led_pin, @e_led_pin, @d_led_pin, @c_led_pin, @g_led_pin] |> flush()
end
defp flush(pins) do
pins
|> Enum.map(&gpio(&1))
|> Enum.map(&turn_on(&1))
end
defp turn_on(gpio) do
GPIO.write(gpio, 1)
end
defp turn_off(gpio) do
GPIO.write(gpio, 0)
end
defp gpio(pin) do
{:ok, output_gpio} = GPIO.open(pin, :output)
output_gpio
end
defp random_fun do
[&one/0, &two/0, &three/0, &four/0, &five/0, &six/0]
|> Enum.random()
end
end
- 一画ずつGPIOがひもづいていて、それらをONやOFFすることで数字を表しています
- 特に
random_fun/0
がうまくかけたんじゃないかとおもっています
defp random_fun do
[&one/0, &two/0, &three/0, &four/0, &five/0, &six/0]
|> Enum.random()
end
- 関連コミット
lib/hello_nerves/led/seven_seg.ex
defmodule HelloNerves.Led.SevenSeg do
@a_led_pin Application.get_env(:hello_nerves, :a_led_pin, 26)
@b_led_pin Application.get_env(:hello_nerves, :b_led_pin, 6)
@c_led_pin Application.get_env(:hello_nerves, :c_led_pin, 5)
@d_led_pin Application.get_env(:hello_nerves, :d_led_pin, 16)
@e_led_pin Application.get_env(:hello_nerves, :e_led_pin, 23)
@f_led_pin Application.get_env(:hello_nerves, :f_led_pin, 25)
@g_led_pin Application.get_env(:hello_nerves, :g_led_pin, 22)
alias Circuits.GPIO
require Logger
def clear do
[@a_led_pin, @b_led_pin, @c_led_pin, @d_led_pin, @e_led_pin, @f_led_pin, @g_led_pin]
|> Enum.map(&gpio(&1))
|> Enum.map(&turn_off(&1))
end
def show do
fun = random_fun()
1..3
|> Enum.each(fn _ ->
fun.()
Process.sleep(50)
clear()
Process.sleep(25)
end)
fun.()
end
def random do
fun = random_fun()
fun.()
end
def random_forever do
random()
50..75
|> Enum.random()
|> Process.sleep()
random_forever()
end
def one do
clear()
[@b_led_pin, @c_led_pin] |> flush()
end
def two do
clear()
[@a_led_pin, @b_led_pin, @g_led_pin, @e_led_pin, @d_led_pin] |> flush()
end
def three do
clear()
[@a_led_pin, @b_led_pin, @g_led_pin, @c_led_pin, @d_led_pin] |> flush()
end
def four do
clear()
[@f_led_pin, @g_led_pin, @b_led_pin, @c_led_pin] |> flush()
end
def five do
clear()
[@f_led_pin, @g_led_pin, @c_led_pin, @d_led_pin, @a_led_pin] |> flush()
end
def six do
clear()
[@f_led_pin, @e_led_pin, @d_led_pin, @c_led_pin, @g_led_pin] |> flush()
end
defp flush(pins) do
pins
|> Enum.map(&gpio(&1))
|> Enum.map(&turn_on(&1))
end
defp turn_on(gpio) do
GPIO.write(gpio, 1)
end
defp turn_off(gpio) do
GPIO.write(gpio, 0)
end
defp gpio(pin) do
{:ok, output_gpio} = GPIO.open(pin, :output)
output_gpio
end
defp random_fun do
[&one/0, &two/0, &three/0, &four/0, &five/0, &six/0]
|> Enum.random()
end
end
- 一画ずつGPIOがひもづいていて、それらをONやOFFすることで数字を表しています
- 特に
random_fun/0
がうまくかけたんじゃないかとおもっています
defp random_fun do
[&one/0, &two/0, &three/0, &four/0, &five/0, &six/0]
|> Enum.random()
end
Author And Source
この問題について(サイコロをつくる(Elixir, Nerves)), 我々は、より多くの情報をここで見つけました https://qiita.com/torifukukaiou/items/5577f7c79c0723f514d8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .