#概要
Raspberry Pi(以下、ラズパイ)を使ってLEDの明るさを変えてみたり、スイッチでLEDをON/Offしてみたりといった簡単な電子工作を行いたいと思います。
#参考文献
日経BPラズパイマガジン2019年6月号
#環境
前提条件として、Raspbianインストール済みのラズパイを用意。
この記事で紹介するプログラムはPython3.7で動作確認を行なっています。
##ライブラリ
ラズパイから電子パーツを制御するために「pigpio」というライブラリを利用します。まず、常駐プログラムのpigpiodを動作させておく必要があります
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
もし、pigpioがインストールされていない場合は、
sudo apt-get install pigpio python-pigpio python3-pigpio
でインストールしてください。
上記のコマンドを1度実行しておけば、次のラズパイの起動時からは自動的にpigpioの常駐プラグラムが実行されます、
#サンプル1:PWMでLEDの明るさを変えてみる
チュートリアル等でよく見かけるLEDをチカチカさせるプログラムに少し手を加えてみました。以下のプログラムを実行するとON/OFFの2段階だけではなく、明るさを少しずつ変えていくことができます。
import pigpio
import time
# 使用するGPIOピンの定義
PIN = [17, 27]
pi = pigpio.pi()
# GPIOピンの設定
for i in range(2):
pi.set_mode(PIN[i], pigpio.OUTPUT)
pi.write(PIN[i], pigpio.LOW)
pi.set_PWM_frequency(PIN[i], 50)
pi.set_PWM_range(PIN[i], 100)
# デューティー比が上限値もしくは下限値に達した場合に、増減を切り替えるための関数
def get_increment(duty, increment):
if (duty == 5 and increment < 0)or (duty == 95 and increment > 0) :
increment = increment * -1
return increment
# デューティー比の初期値
duties = [5, 95]
# デューティー比の増減幅
increments = [5, 5]
while True:
for i in range(2):
increment = get_increment(duties[i], increments[i])
duty = duties[i] + increment
pi.set_PWM_dutycycle(PIN[i], duty)
# デューティー比と増減幅を上書き
duties[i] = duty
increments[i] = increment
time.sleep(0.1)
サンプル2:スイッチでLEDのON/OFFを切り替える
タクトスイッチを使ってLEDのON/OFFを切り替えてみたいと思います。今回スイッチの接続にプルアップ抵抗を使用しているため、入力値としては常時1、スイッチが押された時に0となります。
import pigpio
import time
# 使用するGPIOピンの定義
LED_RED = 27
LED_YEL = 17
SW_RED = 22
SW_YEL = 23
# 現在のLEDの状態を保持する変数
red_state = 0;
yel_state = 0;
pi = pigpio.pi()
# GPIOピンの設定と初期化
pi.set_mode(LED_RED, pigpio.OUTPUT)
pi.set_mode(LED_YEL, pigpio.OUTPUT)
pi.set_mode(SW_RED, pigpio.INPUT)
pi.set_mode(SW_YEL, pigpio.INPUT)
pi.set_pull_up_down(SW_RED, pigpio.PUD_UP)
pi.set_pull_up_down(SW_YEL, pigpio.PUD_UP)
pi.write(LED_RED, pigpio.LOW)
pi.write(LED_YEL, pigpio.LOW)
while True:
# スイッチのピンの読み取り
sw_red = pi.read(SW_RED)
sw_yel = pi.read(SW_YEL)
# スイッチが押されたらLEDのON/OFFを切り替える
if sw_red == 0:
if red_state == 0:
pi.write(LED_RED, pigpio.HIGH)
red_state = 1
else:
pi.write(LED_RED, pigpio.LOW)
red_state = 0
if sw_yel == 0:
if yel_state == 0:
pi.write(LED_YEL, pigpio.HIGH)
yel_state = 1
else:
pi.write(LED_YEL, pigpio.LOW)
yel_state = 0
time.sleep(0.5)
回路
最終的な回路はこんな感じになります