【電子工作】Python + pigpioでボタン(タクトスイッチ)を押したらブザーが鳴るようにする(Raspberry Pi 4で遊ぼう日記 その15)

投稿日:2022年6月3日
最終更新日:2022年12月18日

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にプルアップしている抵抗を削減することができる。

内部プルアップの設定方法は次回の記事で書きたいと思う。

 

日記まとめ

ラズパイで遊んでみた軌跡を以下でまとめてます。

【電子工作】Raspberry Pi 4で遊ぼう日記 まとめ

 


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください