LoginSignup
2
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-20

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でページに合わせて印刷をするとちょうど良いサイズになります。
これを使ってよりリアルに楽しんでください。

2
3
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
2
3