VNC環境とRaspberry Piで簡単電子工作(3)
はじめに
前回は、Raspberry Piでデジタル入出力によるLEDの制御について解説しました。主にLEDの点滅やスイッチを使ったLEDのON/OFFを行いました。
今回は、前回から回路を1つ(回路2)追加で作成し、主にモーター等を制御するPWM出力をテーマに解説します。PWM(Pulse Width Modulation:パルス幅変調)とは、疑似的なアナログ信号を出力として生成することです。パルス幅のHIGHとLOWの比(デューティー比)を変化させることで、任意の電圧を出力として生成できます。
今回は、LEDとブザー、サーボモーターを用いてPWM出力で段階的に制御します。LEDについては前回作成した回路1を用い、ブザーとサーボモーターについては新たに作成する回路2を用います。
用意するもの
回路2を作るために、下記のパーツを準備します。
- Raspberry Pi 3B
- microSDカード(OSインストール済みのもの。第1回を参照)
- PC
- 圧電ブザー(KPE-242)
- サーボモーター(SG90)
- ジャンパーワイヤ オス-メス
- ブレッドボード
また、前回作成した回路1は、下記のパーツを使用しました(詳細は前回を参照)。
- LED
- 押しスイッチ
- ブレッドボード
- ジャンパーワイヤ オス-メス
- 抵抗抵抗(330Ω×2:LED側/10kΩ:スイッチ側)
PWM出力の制御
シミュレーションをしてみよう
まずは、シミュレーションをしてみましょう。fritzingを起動して、以下のような配線図を作成します(fritzingのダウンロードとインストール、使い方については第1回を参照)。
電子工作をしてみよう
配線図で正しくシミュレーションができたら、電子工作を行います。配線図や下記の全体図を参考にやってみてください。第2回の内容に付け加える形で組み立てていきます。
プログラミングをしてみよう①~LEDのPWM制御~
電子工作ができたら、PWM制御のプログラミングを行っていきます。まず、以下の手順でVNC環境を立ち上げましょう(詳細は第1回を参照してください)。
- Raspberry PiにmicroSDカードを挿入し、LANをつないで電源を入れる
- PC上でTera Termを起動させ、ホスト名にIPアドレスを入力する
(※この時、上手く接続できない場合はIPアドレスが変わっている可能性があるため、IPアドレスを確認してください) - 認証画面が表示されたらユーザー名:Pi、パスワード:raspberryを入力する
- ターミナルが表示されたら、以下のコマンドでVNCサーバを立ち上げる
$ tightvncserver
- UltraVNC Viewerを起動し、IPアドレスとポート番号を入力する。「connect」ボタンを押して第1回で設定した8文字以下のパスワードを入力する
VNC環境が立ち上がったら、プログラミングを進めて行きます。今回のLEDのPWM制御では、段階的に明るくなるように電圧を制御します。また、第2回で用いたスイッチを組み合わせた制御も行います。
まず、nanoエディタを立ち上げます。
$ nano led4.py
nanoエディタ上で以下のプログラムを入力し、[Ctrl]+[X]で保存します。
from gpiozero import PWMLED
from time import sleep
led = PWMLED(17)
while True:
led.value = 0
sleep(1)
led.value = 0.5
sleep(1)
led.value = 1
sleep(1)
ターミナル画面に戻った後、以下のコマンドを入力するとLEDが光ります。
$ sudo python led4.py
プログラムを終了するときは、[Ctrl]+[C]を入力してください。この入力で、LEDが消えます。
LEDのPWM制御では「PWMLED」というモジュールを使います。段階的にLEDの明るさを制御するために、ON(led.value = 1)とOFF(led.value = 0)に中間(led.value = 0.5)を加えてプログラミングしています。
次に、スイッチを組み合わせた制御を行います。nanoエディタを立ち上げます。
$ nano led5.py
nanoエディタ上で以下のプログラムを入力し、[Ctrl]+[X]で保存します。
from gpiozero import PWMLED, Button
from time import sleep
from signal import pause
led = PWMLED(17)
button = Button(2)
def led_on():
if button.when_pressed:
led.value = 0
sleep(1)
led.value = 0.5
sleep(1)
led.value = 1
sleep(1)
button.when_pressed = led_on
button.when_released = led.off
pause()
ターミナル画面に戻った後、以下のコマンドを入力すると、スイッチを押している間はSLEDが段階的に光ります。
$ sudo python led5.py
今回使用したスイッチのプログラムは第2回で用いたプログラムをベースにしています。また、LEDを段階的に出力する関数(led_on)を定義していますが、実行プログラムを簡潔するために途中で関数として定義しておくと便利です。
実機をお持ちでない方のために、実際の動作を確認できる動画を用意しました。ぜひこちらを参考にイメージしていただければと思います。
プログラミングをしてみよう②~ブザーのPWM制御~
圧電ブザーは、電圧をかけると変形する性質(圧電効果)を応用しています。電圧の印加により圧電セラミックス等を振動させることで音波を発生させています。今回のブザーのPWM制御では、段階的に音が大きくなるように電圧を制御します。
まず、nanoエディタを立ち上げます。
$ nano buzzer1.py
nanoエディタ上で以下のプログラムを入力し、[Ctrl]+[X]で保存します。
from gpiozero import Buzzer
from time import sleep
bz = Buzzer(24)
while True:
bz.on()
sleep(1)
bz.off()
sleep(1)
ターミナル画面に戻った後、以下のコマンドを入力すると音が鳴ります。
$ sudo python buzzer1.py
このプログラムは、第2回で使ったLED点滅のプログラムをベースに、ブザーのモジュールに変更しています。
次に、段階的に音が鳴るプログラムを作ります。これまではgpiozeroのライブラリに含まれるモジュールを使っていましたが、今回はモジュールとして含まれていない内容になるためモジュールを作るところから行います。
以下のような流れで作成します。
- ライブラリが定義されているファイルにモジュール名を追加する
- モジュールが定義されているファイルにモジュールのプログラムを追加する
まずgpiozeroライブラリの場所を調べ、nanoエディタでファイルを作り、以下のプログラムを記載します。
import gpiozero
print gpiozero.__file__
プログラムを実行すると、以下の場所にファイルが作成されます。
/usr/lib/python2.7/dist-packages/gpiozero/__init__.pyc
以下のコマンドでgpiozeroのフォルダまで移動し、ファイルを編集します。
cd ..:1つ上の階層に移動
cd /usr:「/usr」のフォルダに移動
ファイルの編集は管理者権限で行います。下図のように、PWMBuzzerのモジュール名を追加してください。
$ sudo nano __init__.py
続いて、モジュールが定義されているファイルにプログラムを追加します。outputo_devicesというファイルに各モジュールが定義されているので、そのファイルを編集します。
$ sudo nano output_devices.py
PWMLEDの後に以下のプログラムを追加します。
class PWMBuzzer(PWMOutputDevice):
pass
PWMBuzzer.beep = PWMBuzzer.blink
def _bz_property(index, doc=None):
def getter(self):
return self._bzs[index].value
def setter(self, value):
self._stop_blink()
self._bzs[index].value = value
return property(getter, setter, doc=doc)
これでPWMBuzzerというモジュールが定義され使えるようになりました。なお、プログラムの詳細は本編の範囲を越えるため割愛します。
このように、必要なモジュールを自由に追加できることもpythonの特徴です。
さらにnanoエディタでファイルを作り、以下のプログラムを記載します。
from gpiozero import PWMBuzzer
from time import sleep
bz = PWMBuzzer(24)
while True:
bz.value = 0
sleep(1)
bz.value = 0.5
sleep(1)
bz.value = 1
sleep(1)
プログラムはPWMLEDの内容をベースにしています。このプログラムの実行結果は、動画を参照してください。
プログラミングをしてみよう③~サーボモーターのPWM制御~
サーボモーターは回転角度と回転速度を制御するモーターで、ロボットでよく使用されています。今回は、段階的に回転角度を制御するプログラムを行います。
nanoエディタでファイルを作り、以下のプログラムを記載します。
from gpiozero import Servo
from time import sleep
servo = Servo(22)
while True:
servo.min()
sleep(1)
servo.mid()
sleep(1)
servo.max()
sleep(1)
今回のプログラムでは、サーボの位置を最小(min)、中間(mid)、最大(max)の位置に動かしています。このプログラムの実行結果も動画を用意しました。実際の動作を確認してみてください。
おわりに
いかがでしたか? 電子工作を通じて、オブジェクト指向の特徴を感じていただけたのではないでしょうか。今回は、PWM出力ということで、LEDとブザーとサーボを使って段階的に制御してみました。
次回は、アナログ入力をテーマに、センサーを使っていきたいと思います。お楽しみに!