PythonとpigpioでGPIOのinputを使ってみる
前回はpigpioとPythonのコードでGPIOをPWM制御することで周波数を変え、2種類の音でパッシブブザーを鳴らしてみた。ふと思ったのだが、これまでラズパイのGPIOから電圧を出力してLEDやブザーを動作させてきたが、GPIOから入力を受け取って何かする処理は、まだやっていなかった。
というわけで今回は前回のパッシブブザーの回路とPythonのコードを少し改造し、GPIOからボタン(タクトスイッチ)の入力を受けて、ボタンが押されている間だけブザーから音を鳴らすようにしたいと思う。ちなみにタクトスイッチはいつものごとく以下のキットに入っていたものを使う。
ボタンの型番などはわからなかったが、Sunfounderのチュートリアルページにボタンの構造は書いてある。中身はいたって普通のタクトスイッチになっている。
https://docs.sunfounder.com/projects/davinci-kit/ja/latest/2.1.1_button.html
実行環境
Raspberry Pi 4 Model B
Raspberry Pi OS (Bullseye)
pigpio 1.79-1+rpt1
Python 3.9.2
ブレッドボードに回路をつくる
前回つくったブザーの部分は丸々流用する。今回はここにボタンを追加して、GPIO27に接続している。10kΩの抵抗をつけて3.3Vでプルアップしているので、GPIO27への入力は、ボタンを押していないときはHIGH、ボタンを押していないときはLOWとなる。
ブレッドボードでは以下のように接続した。ブザーについては前回と微妙に3.3Vの接続方法を変えているが(電源への接続が増えたのでブレッドボードボードの端の電源用ラインに3.3Vを接続した)、ほぼ流用なので説明は省略。ボタンは縦横で接続方向を間違えないように注意。
実際に接続したのが以下の写真。スイッチやブザーの形状が上の図と少し異なるが、接続関係は同じ。
Pythonのコードを書く
今回の以下のpigpio_buzzer_button.pyという名前で以下のようなコードを書いた。
#!/usr/bin/env python3 import pigpio import time pwm_freq = 500 pwm_duty = 30 buzzer_gpio = 19 button_gpio = 27 gpio = pigpio.pi() gpio.set_mode(button_gpio, pigpio.INPUT) while True: while gpio.read(button_gpio) == 0: gpio.hardware_PWM(buzzer_gpio, pwm_freq, pwm_duty * 10000) time.sleep(0.1) gpio.hardware_PWM(buzzer_gpio, pwm_freq, 0) time.sleep(0.5) gpio.hardware_PWM(buzzer_gpio, pwm_freq * 2, pwm_duty * 10000) time.sleep(0.1) gpio.hardware_PWM(buzzer_gpio, pwm_freq, 0) time.sleep(0.5) gpio.hardware_PWM(buzzer_gpio, pwm_freq, 0)
ブザーを鳴らす処理は前回と同じなので省略。今回はGPIO27を入力として使うので
gpio.set_mode(button_gpio, pigpio.INPUT)
でbutton_gpio変数で指定したGPIO27をinputとして設定している。
また、whileボタンを押している間はブザーが鳴り続けて、ボタンを離すとブザーが鳴らないようにしている。
※ただし、このコードだと4回音が鳴るまではボタンを離してもブザーは鳴り続ける。ボタンを離してすぐに音を止めたい人は頑張って工夫してください(丸投げ)
先程も書いているようにボタンの入力は押されているときがLOW(0)、押されていないときがHIGH(1)になる点に注意。
pigpiodを起動して実行
いつものお約束だが、まずpigpiodを起動する。
sudo pigpiod
あとはコードが置いてあるディレクトリで実行すればOK。
sudo python pigpio_buzzer_button.py
これでボタンを押したときだけ、2種類の音でブザーを鳴らすことができた。今回は動画は撮り忘れたので割愛。ボタン押したらブザー鳴るだけなので前回の動画とほぼ同じような感じだし…。
回路を組んでから気づいたのだが、Raspberry Pi(というより搭載されているSoC)には内部プルアップ抵抗がついているので、Python上で設定してやれば、ブレッドボード上でボタンを3.3Vにプルアップしている抵抗を削減することができる。
内部プルアップの設定方法は次回の記事で書きたいと思う。
日記まとめ
ラズパイで遊んでみた軌跡を以下でまとめてます。