Nerves Livebook でパッシブブザーを演奏しドレミの歌を奏でる

## はじめに

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

[SunFounder Raspberry Pi 用のスターター電子工作キット](https://amzn.asia/d/04vHhGKQ)

これまでの記事

- [Nerves Livebook で Raspberry Pi 4 のLチカ](https://qiita.com/RyoWakabayashi/items/8119260ceeea462d6b7b)
- [Nerves Livebook + Delux で簡単Lチカ](https://qiita.com/RyoWakabayashi/items/281afab89249dbf68cd5)
- [MacBook 上の Livebook から Raspberry Pi 上の Livebook に接続してLチカする](https://qiita.com/RyoWakabayashi/private/844da38ff24efa3b923c)
- [Nerves Livebook から GPIO 拡張ボードの LED を点滅させる](https://qiita.com/RyoWakabayashi/private/bda56ee6987b30857266)
- [Nerves Livebook から RGB LED を制御する（ソフトPWMもやってみる）](https://qiita.com/RyoWakabayashi/private/143fda67a1798bd788b7)
- [Nerves Livebook から LED 棒グラフを制御する](https://qiita.com/RyoWakabayashi/items/a6e8b712388d68bdca44)
- [Nerves Livebook でボタンとLEDを連動させる](https://qiita.com/RyoWakabayashi/items/9bf9475d3c5d65cdfa4e)
- [Nerves Livebook で 7 セグメントディスプレイに文字を表示する](https://qiita.com/RyoWakabayashi/items/d13d86d91c86e816d899)
- [Nerves Livebook で 4 桁 7 セグメントディスプレイに文字を表示する](https://qiita.com/RyoWakabayashi/items/32edd890ade613cb4e37)
- [Nerves Livebook で LED ドットマトリックスにアニメーションを表示する](https://qiita.com/RyoWakabayashi/private/16f110cdd4febd0aedc1)
- [Nerves Livebook でアクティブブザーを鳴らす](https://qiita.com/RyoWakabayashi/private/b932c04c3050c22b373f)

この記事ではアクティブブザーを鳴らします

また、必要なモジュールを追加するため、 Nerves Livebook をカスタマイズします

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

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/nerves_livebook/passive_buzzer.livemd

## パッシブブザー

与えられた電気の周波数によって音程が変化します

![IMG_1622.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f1d81a21-7b96-237d-fb63-e182dd821a4b.jpeg)

## 回路の組み立て

オンライン説明書の通りに回路を組みます

https://docs.sunfounder.com/projects/davinci-kit/ja/latest/1.2.2_passive_buzzer.html

## Nerves Livebook のカスタマイズ

Raspberry Pi 4 を使っている場合、音階 = 周波数を操作する必要があるため、 PWM を実行する必要があります

以下の記事に従って、 PWM を実行するための [Pigpiox](https://github.com/tokafish/pigpiox) を Nerves Livebook に追加してください

https://qiita.com/RyoWakabayashi/items/9df8d216d6ffeca8c6d5

:::note info
Raspberry Pi 0 〜 3 の場合は改造する必要がありません
:::

## ノートブックの実装

Nerves Livebook を開き、以降のコードを実行していきます

### 使用するピン

Raspberry Pi 4 では GPIO12 と GPIO13 が PWM に対応しているようです

https://pongsuke.hatenablog.com/entry/2019/12/03/101747

今回は GPIO12 を使います

### ブザーを鳴らす

まずは特定の周波数（音階）で音を鳴らしてみます

`Pigpiox.Pwm.hardware_pwm` の引数は以下の通りです

- ピンの番号
- 周波数
- デューティー比（0 〜 1,000,000）

デューティー比を `1000_000` にしたときが 100% 出力で、 `500_000` を指定すれば 50% 出力になります

デューティー比によって音量が調節できます

```elixir
gpio = 12
# 50%
Pigpiox.Pwm.hardware_pwm(gpio, 440, 500_000)
```

デューティー比を `0` にしたときが 0% 出力なので、音が止まります

```elixir
# 0%
Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
```

### 音階を鳴らす

3 オクターブ分のドレミファソラシに対応した周波数を用意します

```elixir
codes = [
  131,
  147,
  165,
  175,
  196,
  211,
  248,
  262,
  294,
  330,
  350,
  393,
  441,
  495,
  525,
  589,
  661,
  700,
  786,
  882,
  990
]
```

`scales` に何番目の音階を鳴らすかを指定します

```elixir
scales = [7, 8, 9, 10, 11, 12, 13, 14]
```

`beats` に各音の長さ（八分音符何個分伸ばすか）を指定します

```elixir
beats = [1, 1, 1, 1, 1, 1, 1, 1]
```

以下のコードを実行すると、ドレミファソラシドが演奏できます

```elixir
scales
|> Enum.zip(beats)
|> Enum.map(fn {code_index, beat} ->
  code = Enum.at(codes, code_index)
  Pigpiox.Pwm.hardware_pwm(gpio, code, 500_000)
  Process.sleep(beat * 500)
end)

Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
```

<iframe width="437" height="776" src="https://www.youtube.com/embed/iypybz_7NpA" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### ドレミの歌を演奏する

演奏を関数化し、任意の音階、リズムで演奏できるようにします

```elixir
play = fn gpio, scales, beats ->
  scales
  |> Enum.zip(beats)
  |> Enum.map(fn {code_index, beat} ->
    code = Enum.at(codes, code_index)
    Pigpiox.Pwm.hardware_pwm(gpio, code, 500_000)
    Process.sleep(beat * 250)
  end)

  Pigpiox.Pwm.hardware_pwm(gpio, 440, 0)
end
```

以下のコードを実行すると、ドレミの歌の冒頭部分が演奏されます

```elixir
scales = [7, 8, 9, 7, 9, 7, 9, 8, 9, 10, 10, 9, 8, 10]
beats = [2, 1, 2, 1, 2, 2, 4, 2, 1, 1, 1, 1, 1, 8]
play.(gpio, scales, beats)
```

<iframe width="437" height="776" src="https://www.youtube.com/embed/ihVPWqwaBu0" title="パッシブブザーでドレミの歌" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## まとめ

パッシブブザーを使うことで、メロディーを奏でることができました

また、 Nerves Livebook をカスタマイズすることもできたため、これから色々応用できそうです