ラズパイ(Raspberry Pi)は小型のマイコンボードですが、その機能はLinuxを搭載したパソコンと大きな違いはありません。そのため、Pythonなどの慣れ親しんだプログラミング言語を使えば、ラズパイに接続したハードウェアも制御できます。
今回は、圧電ブザーと呼ばれるスピーカーに似た音を出すデバイスとプッシュボタンをラズパイに取り付け、キーボード(電子楽器)を作成してみましょう。
デバイスの制御には、Pythonと、GPIO Zeroと呼ばれるPython用のライブラリーを使用するため、難易度は高くありません。本記事の解説は、一つの鍵盤を作るだけですが、拡張すれば本格的なキーボードを作ることもできます。
さらに、Pythonで音楽をプログラミングするヒントも紹介します。
目次
- GPIO Zeroは初心者でも簡単にGPIOを操作できるPythonのライブラリー
- GPIO Zeroのインストールとインポート
- 鍵盤が一つだけのキーボードを作ろう
- 3.1. 準備
- 3.2. 圧電ブザーの接続
- 3.3. Pythonから音を出す
- 3.4. Pythonで音楽をプログラミング
- 3.5. ボタンの接続
- まとめ
1. GPIO Zeroは初心者でも簡単にGPIOを操作できるPythonのライブラリー
ラズパイのGPIOピンを制御するプログラム作るなら、PythonとGPIO Zeroライブラリーの組み合わせをお勧めします。
この組み合わせなら、初心者でも簡単に扱うことができます。
だからといって、このライブラリーの機能が、ほかと比べて劣るわけではありません。
それでは、GPIO Zeroの概要を紹介しましょう。
Pythonでは、「ライブラリー」のことを「モジュール」と呼びます。正しくは、Pythonのコマンドが並んだファイルを「モジュール」と呼び、それをいくつか集めて配布するのが「ライブラリー」ですが、明確に使い分けられていないケースが多いようです。
1.1. GPIO Zeroで既存のライブラリーを使いやすくする
GPIO Zeroが公開されるまで、GPIOピンの制御は、RPi.GPIOを使うのが一般的でした。ほかにはPiGPIOやRPIOも、よく利用されます。
これらPython用のライブラリーを使えば、C言語などのハードウェアを直接操作するプログラミング言語よりも、手軽にGPIOピンの制御ができます。
それでも、GPIOピンを制御するには、プルアップ/プルダウン抵抗の扱いなどの、ハードウェアの知識が必要となります。
実を言うと、GPIO Zeroも内部では、古くから使われているこれらのライブラリーを利用しています。GPIO Zeroは、つまずきやすいハードウェアの扱いを、あらかじめまとめて実装することで、初心者でも簡単にGPIOピンを制御できるようにしています。
次の例を見てください。
pir = MotionSensor(4) pir.when_motion = myFunction
1行目は、赤外線センサーなどの人感センサーが、GPIO4に接続されていることを意味します。これ以降、ソースコードの中ではpirと書くことで、接続するデバイスにアクセスできます。
2行目は人感センサーが反応した時の動作を定義しています。この例では、センサーの反応があった場合、自動的にmyFunction関数を呼び出すようにしています。
このように、簡単なソースコードで、GPIOピンの入力に合わせて、特定の処理を自動的に呼び出すことができます。
1.2. よく使われるデバイスはオブジェクトとして定義済み
GPIO Zeroは、GPIOピンに接続して使用されるデバイスの制御方法を、Pythonのクラスという機能を使用して、あらかじめ準備しています。
信号を読み取ることができるデバイスはInput Devices(英語)を、信号の書き込みに対応するものはOutput Devices(英語)を確認してください。
GPIO ZeroはON/OFFを制御する単純な入出力デバイスだけではなく、シリアル通信を使用して信号をやり取りするデバイス、SPI Devices(英語)にも対応しています。
また、Generic Classes(英語)を使用して、あらかじめ用意されていないデバイスに対応する、独自のクラスを作成することもできます。
このテクニックを使いこなすためには、前もってオブジェクト指向の考え方をマスターすることが必須です。ただし、あらかじめ用意されているデバイスのクラスを使用するだけなら、それほど難しくありません。
これらのクラスは、「接続したデバイスに合ったオブジェクトを作成する」というPythonの構文で使用できます。
2. GPIO Zeroのインストールとインポート
GPIO Zeroは、Raspbian(ラズパイのOS)にインストールされています。もしRaspbian Liteなど、ほかのOSを使用している場合、公式マニュアルのInstalling GPIO Zero(英語)を参考に、前もってインストールしておいてください。
Pythonのプログラム内でGPIO Zeroを使用するには、最初にインポートが必要です。
import gpiozero
GPIO Zeroがあらかじめ用意しているクラスを使用(オブジェクトを作成)するには、クラス名の前に「gpiozero.」と書きます。
button = gpiozero.Button(11) greenLED = gpiozero.LED(13) pir = gpiozero.MotionSensor(15)
使用したいクラスが前もって決まっている場合は、以下のように、特定のクラスのみインポートする方が便利です。
from gpiozero import Button, LED, MotionSensor
これにより、ソースコード中では、クラス名の前に「gpiozero.」を書く必要がなくなります。
button = Button(11) greenLED = LED(13) pir = MotionSensor(15)
この3行は、先ほどの3行のソースコードと同じ意味を持ちます。こちらの方がスッキリして、ソースコードが読みやすくなるでしょう。
3. 鍵盤が一つだけのキーボードを作ろう
GPIO Zeroを使って、GPIOピンに接続したプッシュボタンに合わせ、圧電ブザーから音が出る、鍵盤が一つだけのキーボードを作ります。
3.1. 準備
以下のものを準備してください。
ラズパイ本体
ブレッドボード
GPIO拡張基板
スイッチサイエンス製(互換可)
GPIO拡張基板はAdafruit製(海外)やスイッチサイエンス製(国内)が入手しやすそうです。
ほかにもさまざまな製品が販売されているので、ご自身で使いやすいものを探してみるのも良いでしょう。
上記に加えて、次のものも必要です。
3.2. 圧電ブザーの接続
GPIO拡張基板をブレッドボードに接続してください。
ラズパイのGNDピンを、ブレッドボードの電源ライン(-)に接続します。
圧電ブザーの筐体から赤・黒のリード線が出ています。赤のリード線はプラス側、黒のリード線はマイナス側です。
最初に、圧電ブザーのリード線に、ブレッドボード用のジャンパワイヤを接続します。
ジャンパワイヤを接続し、圧電ブザーのリード線を延長した状態が写真で確認できるでしょう。
こうすることで、ブレッドボードに配線しやすくなります。リード線を延長したジャンパワイヤを、ブレッドボードに挿した状態が以下の写真です。
圧電ブザーの赤のリード線がラズパイのGPIOピンに、黒がブレッドボードの電源ライン(-)につながるように配線してください。今回は、GPIO13を使用します。
3.3. Pythonから音を出す
プッシュボタンをラズパイに接続する前に、Pythonから音を出力するプログラミングを学習しましょう。
ラズパイのターミナルを起動して、Pythonのコマンド入力状態(Pythonインタプリタ)にします。コマンド入力状態にするには以下をターミナル上で入力します。
python3
GPIO Zeroは、圧電ブザーの接続に対応しています。このクラスを使用するにはモジュールをインポートして、オブジェクトを作成します。
圧電ブザーを操作するクラスは、BuzzerとTonalBuzzerの2つが用意されています。
Buzzerは単純な一音を出すためのクラスです。一方、TonalBuzzerは音階を表現できます。
今回はTonalBuzzerを使用します。以下の2行を入力してください。
from gpiozero import TonalBuzzer piezo = TonalBuzzer(13)
1行目はクラスをインポートします。
インポート後は、TonalBuzzerクラスを使用(オブジェクトを作成)することができます。
2行目で、TonalBuzzerクラスを使ってオブジェクトを作成しています。オブジェクトの作成時にラズパイのGPIOピンと関連付けます。
圧電ブザーはGPIO13に接続したので、引数に13を指定します。
音を出す準備は完了です。以下のコマンドを入力してください。
piezo.play('A4')
圧電ブザーから音が出ましたか?
音は、stop関数を呼び出すまで鳴り続けます。
piezo.stop()
今回は圧電ブザーを操作するクラスにTonalBuzzerを選択したので、音階を変えることができます。以下のコマンドを順に入力してください。
piezo.play('C4') piezo.play('D4') piezo.play('E4')
キーボードを作成する場合は、鍵盤に対応した音階を指定します。
最後に、stop()関数を呼び出して音を止めます。
piezo.stop()
3.4. Pythonで音楽をプログラミング
あとはプッシュボタン(鍵盤)の動作に合わせて、決まった音階が出るように関連付けるだけですが、一音だけでは簡単すぎるので、音楽を再生できるようにします。
音楽を再生するには、一定の間隔で音階を変化させることが必要です。
そこで、音を出した後に、sleep()関数を使って、一定の時間プログラムの動作を停止します。最初にインポートしておきます。
from time import sleep
「特定の音を出す・一時停止・音を止める」の一連のコマンドをまとめて、独自の関数playTone()を作成します。
def playTone(pitch): piezo.play(pitch) sleep(1) piezo.stop()
この関数は、引数に音階を受け取り、その音階を1秒間再生した後に終了します。
Pythonインタプリタで独自関数の入力を終了するには、カーソルが先頭にある状態で「エンターキー」を押します。
関数の動作をテストしましょう。
playTone('A4') playTone('C4')
「ラ」「ド」がそれぞれ1秒間再生されるはずです。
再生されない場合は、入力したコマンドを確認してください。
Pythonは大文字、小文字を区別します。また、コマンドの前に空白がある行がありますが、これはインデントと呼ばれる大切なものです。インデントは半角スペース4個を入力します。
それでは、音楽を再生するための関数を作成します。以下のように入力してください。
def playTones(): playTone('A4') playTone('D4') playTone('E4')
2行目から4行目は、それぞれ「ラ」「レ」「ミ」を出すコマンドです。普通のキーボードを作成する場合は、鍵盤にあった一音を指定する行だけで構いません。
独自関数の入力を終了するには、カーソルが先頭にある状態で「エンターキー」を押してください。
作った関数をテストします。
playTones()
「ラ」「レ」「ミ」と鳴ったはずです。
3.5. ボタンの接続
最後に、ラズパイにプッシュボタンを接続して、動作に合わせて音楽が再生されるようにします。
ブレッドボードの空いたスペースにプッシュボタンを挿してください。ブレッドボードの中央にある溝をまたぐように挿すと配線が簡単です。
ジャンパワイヤを使ってプッシュボタンのどれか一つの端子と、ブレッドボードの電源ライン(-)を接続します。
プッシュボタンの対角線上の端子とGPIOピンを接続します。今回はGPIO12を使用します。
このプッシュボタンの状態をPythonから読み取るには、GPIO ZeroのButtonクラスを使用します。
以下のようにインポートして、オブジェクトを作成します。プッシュボタンを接続したGPIOピンの番号、12を指定します。
from gpiozero import Button button = Button(12)
次に、プッシュボタンが押された時の処理を関連付けます。先ほど作った関数を指定します。
button.when_pressed = playTones
それではプッシュボタンを押してください。
圧電ブザーから「ラ」「レ」「ミ」と音が出たはずです。
4. まとめ
GPIO Zeroを使えば、圧電ブザーやプッシュボタンの制御も簡単にプログラムできることが、キーボードの電子工作を通して伝わったと思います。
実を言うと、たったこれだけの電子工作でも、プルアップ/プルダウン抵抗や正論理/負論理、PWM(Pulse Width Modulation)などの知識が必要ですが、GPIO Zeroが、初心者がつまずきやすい点をカバーしてくれます。
さらに、GPIO Zeroは、本格的なオブジェクト指向にも対応しているので、定義されていないデバイスを制御するクラスを作ることもできます。
GPIO Zeroは、初心者だけでなく実用的な電子デバイスを作ろうと考えている方にも、力強い味方になるでしょう。