2016年1月8日金曜日

RaspberryPi で PWM の制御をしてみた

概要

PWM (パルス幅変調) はある一定周期の間隔で動的に変化するパルスを送信することができる仕組みです
モーターの制御や光の強弱の変化などに使われます
RaspberryPi でも PWM が使えるようなので LED を使って試してみました

環境

  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+
  • WiringPi
  • wiringpi2 (Python) 1.1.1

事前準備

今回は WiringPi を使って PWM 制御を行うので事前にインストールしておいてください

wiringpi2 のインストール

wiringpi2 は WiringPi 用の Python ライブラリです
pip を使えば簡単にインストールできます

  • sudo pip install wiringpi2

今回は Python スクリプトから PWM を制御します

配線

今回は LED の調光を PWM で変化させてみます
なので、L チカ配線をしてください
L チカ配線の方法はこちらを参考にしてください
wiring_bread_board.png

一点ポイントとしては RaspberryPi 上で PWM の信号を送信するためには GPIO 18 番を使う必要があります
なので、アノード ( + ) 側の GPIO は 18 番に接続するようにしてください

PWM 送信用スクリプトのデプロイ

  • cd work/
  • mkdir python_wiringpi_pwm
  • cd python_wiringpi_pwm
  • vim controls_pwm.py
import wiringpi2 as wiringpi
import time

OUTPUT = 2
PWM_PIN = 18
SLEEP_TIME = 0.03

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(PWM_PIN, OUTPUT)

for i in range(0, 1024, 16):
    print(i)
    wiringpi.pwmWrite(PWM_PIN, i)
    time.sleep(SLEEP_TIME)

for i in range(1024, 0, -16):
    print(i)
    wiringpi.pwmWrite(PWM_PIN, i)
    time.sleep(SLEEP_TIME)
  • sudo python controll_pwm.py

で実行すると LED が明るくなった後に徐々に暗くなると思います

ポイント

wiringPiSetupGpio で 18 番の GPIO を初期化します
実は初期化の方法には 3 通りあり他に「wiringPiSetup」「wiringPiSetupSys」があります
前者で初期化した場合は 1 番を指定する必要があり、後者で初期化した場合は 12 番を指定する必要があります
どれを使って初期化しても同じ GPIO を指すことになりますが、コールするメソッドによって初期化する GPIO の番号が違うので注意してください

range で 0 から 1024 の範囲でパルス幅を変化させています
RaspberryPi の場合指定できるパルス幅の範囲が 0 から 1024 のためそうしています
他のマイコンボードなどではもっと広い範囲の指定ができる場合があり、その場合にはより精度の高い制御ができます

二つ目の for 文は LED の明るさを暗くするために用意しています

最後に

紹介は以上です
PWM を使うと、このような動的な制御がプログラム上でできるようになります
PWM の王道といえばおそらくサーボモータだと思うので次回はサーボモータの制御をしてみたいと思います

0 件のコメント:

コメントを投稿