4.Raspberry Pi B+でフィジカルコンピューティング(デジタル/PWM)
これから、デジタルのPWMを使います。PWMで圧電スピーカを動かして、ブザー音、ドレミファ等の音を出すことができます。
また、PWMでRCサーボモータを動かして、回る角度をコントロールすることもできます。
今回は、行いませんがPWMとHブリッジ回路を組み合わせてDCモータの回転スピード、回転方向等をコントロールすることも出来ます。
4.1 PWMでブザーを鳴らそう
PWMを使って圧電スピーカでをブザー音を出します。
PWMは周波数を変えることが出来ますので、ドレミ等の音を出すことも出来ます。
(1) ブザーの回路を作ろう
①組立
下の配線図、回路図をみて、回路を組立て下さい。
(2) ブザーを鳴らそう
①電源を入れます。
RaspberryPiB+にACアダプタを繋ぎ、電源を入れます。
②ログインします。
Raspbianが立ち上がったら、ログインして下さい。
③「nano」エディター立ち上げます。
「nano rpi_bp_pwm_bz1_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。
サンプルプログラム1
#! /usr/bin/env python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # use GPIO Number BZ1 = 13 # BZ1 –> GPIO13 buzzer = GPIO.PWM(BZ1, 1000) # set BZ1 1000 Hz buzzer.start(50) # start BZ1 duty 50% buzzer.ChangeFrequency(500) # change frequency 500 Hz buzzer.ChangeDutyCycle(10) # change duty cycle 10 % buzzer.stop() # stop buzzer
|
④入力を終わります。
「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。
⑤入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1_1.py」を実行します。
*ブザーが最初は1KHzでなります。約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1b done」のメッセージが出ます。
(2) 部品を作ろう
ブザーの初期化、開始、停止、周波数変更、デューティ変更を部品(関数)にします。
①「nano」エディター立ち上げます。
「nano rpi_bp_pwm_bz1a_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。
②プログラムを入れます
サンプルプログラム2
#! /usr/bin/env python import RPi.GPIO as GPIO def tone_init(bz): if __name__ == (“__main__”) : #start BZ1 = 13 # BZ1 –> GPIO13 tone1.start(50) tone1.ChangeFrequency(500) # change frequency 500 Hz tone1.ChangeDutyCycle(10) # change duty cycle 10 % tone1.stop() # stop tone
|
入力を終わります。
③「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。
④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1a_1.py」を実行します。
*ブザーが最初は1KHzでなります。
約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1a done」のメッセージが出ます。
(3) モジュールを使おう
(2)で作った部品(関数)の入ったファイルをモジュールとして使います。
①「nano」エディター立ち上げます。
「nano rpi_bp_pwm_bz1b_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。
②プログラムを入れます
サンプルプログラム3
#! /usr/bin/env python import RPi.GPIO as GPIO from rpi_bp_pwm_bz1a_1 import * if __name__ == (“__main__”) : #start BZ1 = 13 # BZ1 –> GPIO13 tone1.start(50) tone1.ChangeFrequency(500) # change frequency 500 Hz tone1.ChangeDutyCycle(10) # change duty cycle 10 % tone1.stop() # stop tone
|
③入力を終わります。
「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。
④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1b_1.py」を実行します。
*ブザーが最初は1KHzでなります。
約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1b done」のメッセージが出ます。
(4) ドレミをならそう
ドレミファの周波数をリストを使って作ります。
*Pythonの新しい命令を使います。
*リスト
*書き方
変数名=[要素0、要素1、…、]
使用例:
doremi = [220.0, 246.9, 277.2, 293.7, 329.6 ,370.0, 415.3, 440.0]
*変数名に使える文字は「アルファベット」、「数字」、「_」の3種類の半角文字になります。
また、最初の文字はは「アルファベット」、のみです。
①「nano」エディター立ち上げます。
「nano rpi_bp_pwm_bz1c_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。
②プログラムを入れます
サンプルプログラム4
#! /usr/bin/env python import RPi.GPIO as GPIO from rpi_bp_pwm_bz1a_1 import * if __name__ == (“__main__”) : #start doremi = [220.0, 246.9, 277.2, 293.7, 329.6, 370.0, 415.3, 440.0] GPIO.setmode(GPIO.BCM) # use GPIO Number BZ1 = 13 # BZ1 –> GPIO13 tone1.start(50) for freq in doremi: tone1.stop() # stop tone
|
入力を終わります。
③「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。
④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1c_1.py」を実行します。
(5) 記号でドレミをならそう
辞書型を使って、”Do”,”Re”,”Mi”で演奏が出来るようにします。
*Pythonの新しい命令を使います。
*辞書型
*書き方
変数名={キー0:要素0、キー1:要素1、…}
使用例:
doremi = {“Do”:220.0, “Re”:246.9, “Mi”:277.2, “Fa”:293.7, “Sol”:329.6 ,”La”:370.0, “Si”:415.3, “D0_”:440.0}
*変数名に使える文字は「アルファベット」、「数字」、「_」の3種類の半角文字になります。
また、最初の文字はは「アルファベット」、のみです。
①「nano」エディター立ち上げます。
「nano rpi_bp_pwm_bz1d_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。
②プログラムを入れます
サンプルプログラム5
#! /usr/bin/env python import RPi.GPIO as GPIO from rpi_bp_pwm_bz1a_1 import * if __name__ == (“__main__”) : #start doremi = {“Do”:220.0, “Re”:246.9, “Mi”:277.2, “Fa”:293.7,”Sol”:329.6,\ cyocyo = [“Sol”, “Mi”, “Mi”,”Fa”,”Re”,”Re”] BZ1 = 13 # BZ1 –> GPIO13 tone1.start(50) for scale in cyocyo: tone1.stop() # stop tone
|
③入力を終わります。
「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。
④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1d_1.py」を実行します。
⑤電源をきります。
「sudo shutdown -h now」を入力して下さい。
*ステータスLEDの点滅が終わり、消えてからマイクロUSBのDC5Vを抜いて下さい。