Raspberry Pi で電子工作をする場合 GPIO を使うことが多いと思います。というか殆どの場合、必須ですよね。例えば GPIO に接続したセンサーの状態で GPIO に接続したアクチュエーターを制御するといったことです。そこでまずは最も単純なセンサーとしてタクトスイッチをアクチュエーターとしてLEDを使います。
GPIOと40-pinのピンヘッダー
GPIO を使うにはGPIOがどんなピン配置をしているか知る必要があります。以下の図は Raspberry Pi の GPIO ピンの機能を示した図です。○で囲まれた番号はピンヘッダーの物理的なピン番号です。
この図からわかるように、GPIO ピンの番号付けは番号順ではありません。 GPIO ピン 0 と 1 はボード上に存在しますが (物理ピン 27 と 28)、EEPROMアクセス用のI2Cインターフェースのために予約されています 。また、図には記載されていませんが、GPIO ピン 2 と3 は基板上でプルアップ抵抗が接続されています。
ターミナルから pinout コマンドを実行することでGPIOのピン番号と物理ピン番号との対応や Raspberry Pi の基板の情報が確認できます。
pi@raspberrypi:~ $ pinout
回路図
回路図です。GPIO27 は物理ピンの13、GPIO17 は物理ピンの11そしてGNDは物理ピンの9を使います。
回路の実装
回路をブレッドボードに実装した様子です。
スイッチの状態によってLEDを点灯
スイッチが押されている間LEDが点灯するといったプログラムです。コードは Raspberry Pi OS に ssh でログインして直接 nano エディタを使って書いています。ファイル名を test1.py として以下のコマンドを実行します。
pi@raspberrypi:~ $ nano test1.py
コードの内容は以下になります。
#!/usr/bin/python import RPi.GPIO as GPIO # RPi.GPIOモジュールをGPIOとして使用 gpio_led = 17 # LEDピンのGPIO番号を定義 gpio_sw = 27 # スイッチピンのGPIO番号を定義 GPIO.setmode(GPIO.BCM) # GPIO番号で指定する設定 GPIO.setup(gpio_led, GPIO.OUT) # LEDピンを出力に設定 GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) # スイッチピンを入力、プルアップに設定 try: # 例外の捕捉 while True: # 繰り返し if GPIO.input(gpio_sw) == GPIO.LOW: # スイッチが押されていた場合 GPIO.output(gpio_led, 1) # LED点灯 else: # スイッチが押されていない場合 GPIO.output(gpio_led, 0) # LED消灯 except KeyboardInterrupt: # ctrl+cで例外の発生 GPIO.cleanup() # GPIOを解放
Raspberry PiでGPIO の制御には、RPi.GPIO ライブラリーを使います。ここで
GPIO.setmode(GPIO.BCM)
とは、GPIO のピンをGPIO 番号で指定することを設定しています。指定方法は他に
GPIO.setmode(GPIO.BOARD)
とすることで GPIO コネクタのピン番号で指定することができます。
Ctl+oで保存して、Ctr+xでnanoを終了します。
スイッチの状態によってLED点滅の周期を変える
次にスイッチが押されていない間は1秒毎に点灯・消灯を繰り返し、スイッチが押されている間は100ミリ秒毎に点灯・消灯を繰り返すプログラムです。ファイル名を test2.py としています。
pi@raspberrypi:~ $ nano test2.py
コードは以下です。
#!/usr/bin/python import RPi.GPIO as GPIO # RPi.GPIOモジュールを使用 import time # timeモジュールの読み込み gpio_led = 17 # LEDピンのGPIO番号を定義 gpio_sw = 27 # スイッチピンのGPIO番号を定義 GPIO.setmode(GPIO.BCM) # GPIO番号で指定する設定 GPIO.setup(gpio_led, GPIO.OUT) # LEDピンを出力に設定 GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) # スイッチピンを入力、プルアップに設定 try: while True: if GPIO.input(gpio_sw) == GPIO.LOW: # スイッチが押されていた場合 GPIO.output(gpio_led, 1) # LED点灯 time.sleep(0.1) # 100ミリ秒のウェイト GPIO.output(gpio_led, 0) # LED消灯 time.sleep(0.1) # 100ミリ秒のウェイト else: GPIO.output(gpio_led, 1) time.sleep(1) GPIO.output(gpio_led, 0) time.sleep(1) except KeyboardInterrupt: GPIO.cleanup() # GPIOを解放
time モジュールは時間を扱うモジュールで、ここでは一定時間処理を停止するのに使っています。
スイッチの状態によってフワフワ点灯の周期を変える
フワフワ点灯とはLEDが徐々に明るく点灯しその後徐々に暗くなるのを繰り返す様を言います。昔、機器が省エネ状態になった時に電源LEDをこのように制御していたのを「フワフワLED」と呼んでいました。
スイッチが押されていない間はフワフワの周期を4秒として、押されている場合は2秒とするプログラムです。ファイル名は test3.py としています。
pi@raspberrypi:~ $ nano test3.py
コードは以下です。
#!/usr/bin/python import RPi.GPIO as GPIO # RPi.GPIOモジュールをGPIOとして使用 import time # timeモジュールの読み込み gpio_led = 17 # LEDピンのGPIO番号を定義 gpio_sw = 27 # スイッチピンのGPIO番号を定義 GPIO.setmode(GPIO.BCM) # GPIO番号で指定する設定 GPIO.setup(gpio_led, GPIO.OUT) # LEDピンを出力に設定 GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) # スイッチピンを入力、プルアップに設定 pw = GPIO.PWM(gpio_led, 1000) # LEDピンを1kHz周期のPWMで制御する設定 pw.start(0) # PWMのデューティー比を0%で開始 try: while True: for duty in range(0, 101, 5): # 変数dutyを0から101まで5づつ増やす pw.ChangeDutyCycle(duty) # デューティー比を変更 if GPIO.input(gpio_sw) == GPIO.HIGH : # スイッチが押されていない場合 time.sleep(0.1) # 100ミリ秒のウェイト else : # スイッチが押されていた場合 time.sleep(0.05) # 50ミリ秒のウェイト for duty in range(100, -1, -5): # 変数dutyを100から-1まで5づつ減らす pw.ChangeDutyCycle(duty) if GPIO.input(gpio_sw) == GPIO.HIGH : time.sleep(0.1) else : time.sleep(0.05) except KeyboardInterrupt: pw.stop() # PWM制御の停止 GPIO.cleanup() # GPIOを解放
LEDの明るさを変えるにはPWM制御を使います。PWMのデューティー比を上げる事でLEDは明るくなり、下げることで暗くなります。
2つのfor文の最初のfor文では、PWMのデューティーを0から100%まで5%ステップで20段階で増やしています。そしてif文中のif節では100ミリ秒毎にデューティー比を変えているので消灯(デューティー比が0%)から全点灯(デューティー比100%)までは2秒かかることになり、else節で50ミリ秒毎にデューティー比を変えているので消灯から全点灯までは1秒かかることになります。2つ目のfor文では、PWMのデューティー比を100から0%まで5%ステップで20段階で減らしています。
ということで消灯→全点灯→消灯の1周期はスイッチが押されていない場合は4秒で、押されている場合は2秒に変化することになります。
プログラムの実行
プログラムを実行するには以下のコマンドを入力します(test3.py を実行する例)。
pi@raspberrypi:~ $ python test3.py
また、別の方法としてファイル名を直接指定して実行させることができます。この場合はコードの1行めに
#!/usr/bin/python
と記述しておきます。そして以下のコマンドで実行権限を付与しておきます。
pi@raspberrypi:~ $ chmod +x test3.py
そして以下のように直接ファイルを指定して実行します。
pi@raspberrypi:~ $ ./test3.py