1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Piで電子工作【LED + スイッチ】

Last updated at Posted at 2021-07-07

#概要
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)

回路

最終的な回路はこんな感じになります

IMG_20190630_212246.jpg

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?