LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

Raspberry Pi4 で信号機もどきを作ってみた (Python編)

Lチカの応用として、信号機の動きを再現してみました。

準備するもの

  • Raspberry Pi 4 Model B
  • ブレッドボード(1台)
  • ジャンパー線 オスーオス(3本)
  • ジャンパー線 オスーメス(6本)
  • 330Ω の抵抗(3つ)
  • LED(3個)
  • 光拡散キャップ(任意)
  • タクトスイッチ(1個)
  • 信号機もどきのフレーム  記事の最後の部分にあります。ご活用ください。

1. 歩行者用信号機 をLチカさせる

横断歩道に付いている信号機を再現します。
" RGB LED "を使ってやってみます。

配線

  1. ジャンパー線のオスーメスケーブルを”GPIO”の 11番ピン (左の上から6番目)につなげる。
  2. ブレッドボードに反対側を差し込む。
  3. 抵抗の片足をジャンパー線と同じ横列に差し込む。
  4. " RGB LED "(光拡散キャップを着けてから)の赤アノード側を、抵抗の反対の足と同じ横列に差し込む。

 < RGB LEDって? >
 カラーを表現できる4本足のLEDです。
 赤、緑、青を基本に、スイッチを使って紫、黄、水色も出せます。
 今回は、" RGB LED "を主に使用しています。
 足の長さで役割が変わるので注意してください。
IMG_3809.jpg

5.ジャンパー線のオスーオスケーブルをRGB LEDのカソードと同じ横列に差し込む。反対側はマイナスレーンに差し込む。
6. 1~5の工程をもう1セット分作る。
 なおこのとき、ジャンパー線のオスーメスケーブルを”GPIO”の 13番ピン (左の上から6番目)につなげる。
また、RGB LEDの青アノード側を、抵抗と同じ横列に差し込みます。
7. ジャンパー線のオスーメスケーブルをマイナスレーンに差し込み、反対側は、”GPIO”の 39番ピン (左の下から1番目)につなげる。
8. "信号機もどきのフレーム"の中から"1.歩行者用信号機"を切り、LEDにはめる。

このような感じで配線します。
IMG_3805.jpg

プログラム

$ sudo nano walk_shingo.py

その中に、以下を記入

walk_shingo.py
import RPi.GPIO as GPIO
import time, sys

GPIO.setmode(GPIO.BCM)

PORT_L = 27 #赤色
PORT_R = 17 #青色
GPIO.setup(PORT_L, GPIO.OUT)
GPIO.setup(PORT_R, GPIO.OUT)

try:
    while True:
        GPIO.output(PORT_L, GPIO.LOW) #青信号
        GPIO.output(PORT_R, GPIO.HIGH)
        time.sleep(5)

        for i in range(10): #青信号点滅
            GPIO.output(PORT_R, GPIO.HIGH)
            time.sleep(0.2)
            GPIO.output(PORT_R, GPIO.LOW)
            time.sleep(0.2)

        GPIO.output(PORT_L, GPIO.HIGH) #赤信号
        GPIO.output(PORT_R, GPIO.LOW)
        time.sleep(5)

except KeyboardInterrupt:
    GPIO.cleanup()
    sys.exit()

" control " + " X "を押下後、" y "を押してEnterで保存します。

$ python walk_shingo.py

で信号機を作動させます。
終了したい時は、" control " + " C "を押します。
このプログラムでは、青信号5秒 → 青信号点滅0.2秒間隔×10回 → 赤信号5秒を繰り返します。" time.sleep( ) "から、自由にカスタマイズしてください。

2.押ボタン式の歩行者用信号機 をLチカさせる

ここでは、タクトスイッチを押ボタンに見立てて、押ボタン式の歩行者用信号機を再現してみます。

配線

上記1の配線にタクトスイッチとジャンパー線をプラスします。

  1. 1番ピン (左の上の1番目)に、ジャンパー線のオスーメスケーブルを差し込む。反対側をブレッドボードに差し込む。
  2. タクトスイッチのブレッドボードの真ん中にある溝を挟むようにして差し込む。このとき、足の1本が1番ピンにつながっているジャンパー線と同じ横列に来るようにします。
  3. 7番ピン (左の上の1番目)に、ジャンパー線のオスーメスケーブルを差し込む。反対側はタクトスイッチのもう片足と同横列に差し込む。
  4. "信号機もどきのフレーム"の中から"2.歩行者用信号機(押ボタン式)"を切り、LEDにはめる。

このような感じで配線します。
IMG_3804.jpg

プログラム

$ sudo nano push_shingo.py

その中に、以下を記入

push_shingo.py
import RPi.GPIO as GPIO
import time, sys

GPIO.setmode(GPIO.BCM)

SWITCH = 4 #タクトスイッチ
PORT_L = 27 #赤色
PORT_R = 17 #青色
GPIO.setup(PORT_L, GPIO.OUT)
GPIO.setup(PORT_R, GPIO.OUT)
GPIO.setup(SWITCH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
         if (GPIO.input(SWITCH) == GPIO.LOW): #赤信号
            GPIO.output(PORT_L, GPIO.LOW)
            GPIO.output(PORT_R, GPIO.HIGH)
         if (GPIO.input(SWITCH) == GPIO.HIGH): #青信号
            GPIO.output(PORT_L, GPIO.LOW)
            GPIO.output(PORT_R, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(PORT_L, GPIO.HIGH)
            GPIO.output(PORT_R, GPIO.LOW)
            time.sleep(5)
            for i in range(10): #青信号点滅
                GPIO.output(PORT_L, GPIO.HIGH)
                time.sleep(0.2)
                GPIO.output(PORT_L, GPIO.LOW)
                time.sleep(0.2)

except KeyboardInterrupt:
    GPIO.cleanup()
    sys.exit()

保存をして…

$ python push_shingo.py

で実行!
基本は赤信号で、スイッチがonになると、青信号5秒 → 青信号点滅0.2秒間隔×10回になります。
また、スイッチを押してから1秒後に信号を変えることで、実機に近い形にしています。

3.車両用信号機 をLチカさせる

次に、車道についている信号機を再現します。
今回は赤と青色を" RGB LED "で、黄色は市販の黄色LEDを使用しています。
白色LEDにマーカーで色を塗ったりするなどしても良いと思います。

配線

上記2の配線から、タクトスイッチをはずします。
そこに、もう1セットLEDなどを追加します。

(0. 黄色LEDを使用する場合…
  " PORT_R "の方の" RGB LED "を黄色LEDに差し替える。
  このとき、LEDの両足の横に1マス分空けておく。)
1. 15番ピン (左の上の8番目)に、ジャンパー線のオスーメスケーブルを差し込む。反対側は抵抗と同横列に差し込む。
2. 抵抗は、" RGB LED "の青アノードと同横列に差し込みます。
3. ジャンパー線のオスーオスケーブルをカソードと同じ横列から、マイナスレーンへ接続する。
4. "信号機もどきのフレーム"の中から"3.車両用信号機"を切り、LEDにはめる。

このように配線をします。
IMG_3811.png

プログラム

$ sudo nano car_shingo.py

その中に、以下を記入

car_shingo.py
import RPi.GPIO as GPIO
import time, sys

GPIO.setmode(GPIO.BCM)


PORT_L = 17 #赤色
PORT_C = 27 #黄色
PORT_R = 22 #青色
GPIO.setup(PORT_L, GPIO.OUT)
GPIO.setup(PORT_C, GPIO.OUT)
GPIO.setup(PORT_R, GPIO.OUT)

try:
    while True:
        GPIO.output(PORT_L, GPIO.LOW) #青信号
        GPIO.output(PORT_C, GPIO.LOW)
        GPIO.output(PORT_R, GPIO.HIGH)
        time.sleep(4)
        GPIO.output(PORT_L, GPIO.LOW) #黄信号
        GPIO.output(PORT_C, GPIO.HIGH)
        GPIO.output(PORT_R, GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(PORT_L, GPIO.HIGH) #赤信号
        GPIO.output(PORT_C, GPIO.LOW)
        GPIO.output(PORT_R, GPIO.LOW)
        time.sleep(4)

except KeyboardInterrupt:
    GPIO.cleanup()
    sys.exit()

undefined

保存して、下のコマンドで光らせてみます。

$ python car_shingo.py

このプログラムでは、青信号4秒 → 黄信号0.5秒 → 赤信号4秒を繰り返しています。

もっと応用!

信号機の中には、センサーで車を感知して、動いているものもあります。
ラズパイにセンサーを取り付けて、やってみるのもいいかもしれません。
また、もう少し小さいLEDを使って、ジオラマや鉄道模型の世界の中に組み込んでみると、よりリアルに楽しめそうです。

信号機もどきのフレーム

信号機っぽく見せるためのフレームです。
A4でページに合わせて印刷をするとちょうど良いサイズになります。
これを使ってよりリアルに楽しんでください。

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
What you can do with signing up
3