0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイ4で歩行者用信号(押ボタン式)を作る

Last updated at Posted at 2025-01-03

目的

歩行者用信号を作ることで、

  • LEDの光らせ方
  • ボタンの入力の受け取り方

を学習します。

注意

 製作にはこのキットに含まれている、T型GPIO拡張ボード、40ピンケーブルを使用しています。LEDやケーブルなども、このキットに含まれているものです。
 回路に関しての知識が未熟なため、配線が最適でないかもしれません。壊れても責任はおいかねます。

使用するもの

  • 2 * LED
  • 2 * Resistor(220R)
  • 1 * Resistor(10KR)
  • 1 * Button

目次

  1. LEDを光らせる
  2. ボタンの入力を受け取る
  3. 歩行者用信号を作る
  4. 総括
  5. 参考

補足

 実行する際は、コードをファイルに書いて、次のように実行します。

$ sudo python3 ファイル名.py

1. LEDを光らせる

 GPIO17と18を、赤と緑のLEDに接続します。このとき、LEDのピンの短い方(カソード)であることに気をつけます。長い方(アノード)には、Resistor(220R)を接続します。
01.drawio (1).png

 接続できたら次のコードで、LEDを点滅させます。

import RPi.GPIO as GPIO
import time

# 番号をわりあてる
LedPin = 17
GreenPin = 18

def setup():
   # モードを出力にして、初期値をHIGHにする
   GPIO.setmode(GPIO.BCM)
   GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH)
   GPIO.setup(GreenPin, GPIO.OUT, initial=GPIO.HIGH)

def main():
   while True: # 1秒間隔で光る
   	# 光る
   	print("光る")
   	GPIO.output(LedPin, GPIO.LOW)
   	GPIO.output(GreenPin, GPIO.LOW)
   	time.sleep(0.2)
   	# 消える
   	print("消える")
   	GPIO.output(LedPin, GPIO.HIGH)
   	GPIO.output(GreenPin, GPIO.HIGH)
   	time.sleep(1.0) # 1秒待つ
   	
def destroy():
   # 終了時にLEDを消す
   GPIO.output(LedPin, GPIO.HIGH)
   GPIO.output(GreenPin, GPIO.HIGH)
   GPIO.cleanup()

if __name__ == "__main__":
   setup()
   try:
   	main()
   except KeyboardInterrupt:
   	destroy()

 setup()の後に、main()が実行されます。main()では、1秒間隔で光らせています。ctrl + Cで停止すると、destroy()が実行されます。destroy()では、光を消した後、使用したピンの記録を消しています。

2. ボタンの入力を受け取る

 GPIO27をButtonに接続します。さらに、ButtonにはResistor(10KR)とGNDも接続します。
02.drawio (1).png

 接続できたら次のコードで、Buttonを押したときにメッセージを表示させます。

import RPi.GPIO as GPIO
import time

# 番号をわりあてる
ButtonPin = 27

def setup():
   GPIO.setmode(GPIO.BCM)
   GPIO.setup(ButtonPin, GPIO.IN)

def push(ev=None):
   print("押された")

def main():
   GPIO.add_event_detect(ButtonPin, GPIO.FALLING, callback=push)
   while True:
   	time.sleep(1)
   	
def destroy():
   GPIO.cleanup()

if __name__ == "__main__":
   setup()
   try:
   	main()
   except KeyboardInterrupt:
   	destroy()

 ボタンが押されると、push()が呼び出されます。pushではコメントを表示するため、ボタンを押すたびに、「押された」と表示されます。
 実行した時にFailed to add edge detectionというエラーが出るかもしれません。その時は、次のコマンドを入力します。

$ sudo apt remove python3-rpi.gpio
$ sudo apt update
$ sudo apt install python3-rpi-lgpio

3. 歩行者用信号を作る

 先ほど学んだことを応用して、歩行者用信号を作ります。仕様は次のように定義します。

  1. 起動時は、赤が光って、緑が消えている
  2. ボタンが押されると以下の内容が実行される
    • 赤が消えて、緑が光る
    • 緑が点滅する
    • 緑が消えて、赤が光る

 先ほど作成した回路(LEDとButton)をそのまま使用します。次のコードで、歩行者用信号が動きます。

import RPi.GPIO as GPIO
import time

LedPin = 17
GreenPin = 18
ButtonPin = 27

def setup():
   GPIO.setmode(GPIO.BCM)
   GPIO.setup(LedPin, GPIO.OUT, initial=GPIO.HIGH)
   GPIO.setup(GreenPin, GPIO.OUT, initial=GPIO.HIGH)
   GPIO.setup(ButtonPin, GPIO.IN)

def changeGreen(ev=None):
   print("ボタンが押されました")
   time.sleep(2.0)
   # 赤が消えて、緑が光る
   GPIO.output(LedPin, GPIO.HIGH)
   GPIO.output(GreenPin, GPIO.LOW)
   time.sleep(2.0)
   # 緑が点滅する
   for i in range(0,5):
   	GPIO.output(GreenPin, GPIO.LOW)
   	time.sleep(0.2)
   	GPIO.output(GreenPin, GPIO.HIGH)
   	time.sleep(0.2)
   # 緑が消えて、赤が光る
   GPIO.output(GreenPin, GPIO.HIGH)
   GPIO.output(LedPin, GPIO.LOW)

def main():
   GPIO.output(LedPin, GPIO.LOW) # 最初は赤を光らせる
   GPIO.add_event_detect(ButtonPin, GPIO.FALLING, callback=changeGreen)
   while True:
   	time.sleep(1)
   	
def destroy():
   GPIO.output(LedPin, GPIO.HIGH)
   GPIO.output(GreenPin, GPIO.HIGH)
   GPIO.cleanup()
   
   
if __name__ == "__main__":
   setup()
   try:
   	main()
   except KeyboardInterrupt:
   	destroy()

 起動時は赤が光っています。ボタンが押されると、changeGreen()が呼び出されます。changeGreen()では、緑だけを光らせた後5回点滅させて、再び、赤だけ光らせます。

4. 総括

 今回は、LEDの光らせ方と、ボタンの入力について学びました。回路を使うプログラミングは、Webと全く異なります。

5. 参考

 勉強には、キットについていた、オンラインドキュメントを使いました。キットに含まれるものを使って、開発ができます。電子工作の初心者である筆者には、非常に参考になりました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?