4.Raspberry Pi B+でフィジカルコンピューティング(デジタル/PWM)


 4.Raspberry Pi B+でフィジカルコンピューティング(デジタル/PWM)

これから、デジタルのPWMを使います。PWMで圧電スピーカを動かして、ブザー音、ドレミファ等の音を出すことができます。
また、PWMでRCサーボモータを動かして、回る角度をコントロールすることもできます。
今回は、行いませんがPWMとHブリッジ回路を組み合わせてDCモータの回転スピード、回転方向等をコントロールすることも出来ます。

 4.1 PWMでブザーを鳴らそう

PWMを使って圧電スピーカでをブザー音を出します。
PWMは周波数を変えることが出来ますので、ドレミ等の音を出すことも出来ます。

(1) ブザーの回路を作ろう

①組立

下の配線図、回路図をみて、回路を組立て下さい。

raspi_4.1_1s raspi_4.1_2s

(2) ブザーを鳴らそう

①電源を入れます。

RaspberryPiB+にACアダプタを繋ぎ、電源を入れます。

②ログインします。

Raspbianが立ち上がったら、ログインして下さい。

③「nano」エディター立ち上げます。

「nano rpi_bp_pwm_bz1_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

サンプルプログラム1

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) # use GPIO Number

BZ1 = 13 # BZ1 –> GPIO13
GPIO.setup(BZ1, GPIO.OUT) # set GPIO13 output

buzzer = GPIO.PWM(BZ1, 1000) # set BZ1 1000 Hz

buzzer.start(50) # start BZ1 duty 50%
print(” buzzer 1000 Hz ,duty 50 %”)
time.sleep(5)

buzzer.ChangeFrequency(500) # change frequency 500 Hz
print(” change 500 Hz “)
time.sleep(5)

buzzer.ChangeDutyCycle(10) # change duty cycle 10 %
print(” duty 10 % “)
time.sleep(5)

buzzer.stop() # stop buzzer
GPIO.cleanup()

④入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

⑤入力したプログラムを実行します。

「sudo python rpi_bp_pwm_bz1_1.py」を実行します。

*ブザーが最初は1KHzでなります。約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1b done」のメッセージが出ます。

raspi_code_4.1_1

(2) 部品を作ろう

ブザーの初期化、開始、停止、周波数変更、デューティ変更を部品(関数)にします。

①「nano」エディター立ち上げます。

「nano rpi_bp_pwm_bz1a_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

②プログラムを入れます

サンプルプログラム2

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

def tone_init(bz):
GPIO.setup(bz, GPIO.OUT) # set GPIO bz output
buzzer = GPIO.PWM(bz, 1000) # set bz 1000 Hz
return buzzer

if __name__ == (“__main__”) :

#start
GPIO.setmode(GPIO.BCM) # use GPIO Number

BZ1 = 13 # BZ1 –> GPIO13
tone1=tone_init(BZ1)

tone1.start(50)
print(” buzzer 1000 Hz ,duty 50 %”)
time.sleep(5)

tone1.ChangeFrequency(500) # change frequency 500 Hz
print(” change 500 Hz “)
time.sleep(5)

tone1.ChangeDutyCycle(10) # change duty cycle 10 %
print(” duty 10 % “)
time.sleep(5)

tone1.stop() # stop tone
GPIO.cleanup()

入力を終わります。

③「ctrl+X」を実行します。

次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。

「sudo python rpi_bp_pwm_bz1a_1.py」を実行します。

*ブザーが最初は1KHzでなります。
約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1a done」のメッセージが出ます。

raspi_code_4.1_2

(3) モジュールを使おう

(2)で作った部品(関数)の入ったファイルをモジュールとして使います。

①「nano」エディター立ち上げます。

「nano rpi_bp_pwm_bz1b_1.py」コマンドを実行して下さい。
画面が「nano」エディターの画面に変わります。

②プログラムを入れます

サンプルプログラム3

 #! /usr/bin/env python

import RPi.GPIO as GPIO
import time

from rpi_bp_pwm_bz1a_1 import *

if __name__ == (“__main__”) :

#start
GPIO.setmode(GPIO.BCM) # use GPIO Number

BZ1 = 13 # BZ1 –> GPIO13
tone1=tone_init(BZ1)

tone1.start(50)
print(” buzzer 1000 Hz ,duty 50 %”)
time.sleep(5)

tone1.ChangeFrequency(500) # change frequency 500 Hz
print(” change 500 Hz “)
time.sleep(5)

tone1.ChangeDutyCycle(10) # change duty cycle 10 %
print(” duty 10 % “)
time.sleep(5)

tone1.stop() # stop tone
GPIO.cleanup()

③入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。

「sudo python rpi_bp_pwm_bz1b_1.py」を実行します。
*ブザーが最初は1KHzでなります。
約3秒後に500Hzに変わります。
最後にデューティが10%になり音色が変わります。
その後に、「bz1b done」のメッセージが出ます。

raspi_code_4.1_3

(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
import time

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=tone_init(BZ1)

tone1.start(50)

for freq in doremi:
print(freq)
tone1.ChangeFrequency(freq)
time.sleep(1)

tone1.stop() # stop tone
GPIO.cleanup()

入力を終わります。

③「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。
「sudo python rpi_bp_pwm_bz1c_1.py」を実行します。

raspi_code_4.1_4

(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
import time

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,\
“La”:370.0, “Si”:415.3, “Do_”:440.0 }

cyocyo = [“Sol”, “Mi”, “Mi”,”Fa”,”Re”,”Re”]
GPIO.setmode(GPIO.BCM) # use GPIO Number

BZ1 = 13 # BZ1 –> GPIO13
tone1=tone_init(BZ1)

tone1.start(50)

for scale in cyocyo:
print(scale)
freq = doremi[scale]
tone1.ChangeFrequency(freq)
time.sleep(1)

tone1.stop() # stop tone

③入力を終わります。

「ctrl+X」を実行します。
次に、「y/n」は「enter」を入れます。

④入力したプログラムを実行します。

「sudo python rpi_bp_pwm_bz1d_1.py」を実行します。

raspi_code_4.1_5

⑤電源をきります。

「sudo shutdown -h now」を入力して下さい。

*ステータスLEDの点滅が終わり、消えてからマイクロUSBのDC5Vを抜いて下さい。

raspi_code_4.1_6

Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です