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

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

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

#1. 歩行者用信号機 をLチカさせる
横断歩道に付いている信号機を再現します。
" RGB LED "を使ってやってみます。
###配線
1. ジャンパー線のオスーメスケーブルを”GPIO”の **<font color=Red>11番ピン** (左の上から6番目)につなげる。
2. ブレッドボードに反対側を差し込む。
3. 抵抗の片足をジャンパー線と同じ横列に差し込む。
4. " RGB LED "(光拡散キャップを着けてから)の**赤アノード側**を、抵抗の反対の足と同じ横列に差し込む。

　**< RGB LEDって？ >**
　カラーを表現できる4本足のLEDです。
　赤、緑、青を基本に、スイッチを使って紫、黄、水色も出せます。
　今回は、" RGB LED "を主に使用しています。
　足の長さで役割が変わるので注意してください。
![IMG_3809.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/6804cf6b-fbcd-aa3a-9e79-293ae9384312.jpeg)

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

このような感じで配線します。
![IMG_3805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/b9695e65-3341-3ec9-7fd7-178e178d8295.jpeg)

###プログラム

```
$ sudo nano walk_shingo.py
```

その中に、以下を記入

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

このような感じで配線します。
![IMG_3804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/41ff3a9c-279b-0879-5014-cb10f9e96735.jpeg)

###プログラム

```
$ sudo nano push_shingo.py
```

その中に、以下を記入

```python: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. **<font color=purple>15番ピン** (左の上の8番目)に、ジャンパー線のオスーメスケーブルを差し込む。反対側は抵抗と同横列に差し込む。
2. 抵抗は、" RGB LED "の**青アノード**と同横列に差し込みます。
3. ジャンパー線のオスーオスケーブルを**カソード**と同じ横列から、マイナスレーンへ接続する。
4. "信号機もどきのフレーム"の中から"3.車両用信号機"を切り、LEDにはめる。

このように配線をします。
![IMG_3811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/bc248903-b807-028d-f66c-74590e75e820.png)

###プログラム

```
$ sudo nano car_shingo.py
```

その中に、以下を記入

```python: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を使って、ジオラマや鉄道模型の世界の中に組み込んでみると、よりリアルに楽しめそうです。

#信号機もどきのフレーム
信号機っぽく見せるためのフレームです。
A４でページに合わせて印刷をするとちょうど良いサイズになります。
これを使ってよりリアルに楽しんでください。
<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/abe8d6f0-3994-9e28-7bcf-6f53f50e12dd.jpeg">