インストール - RPi.GPIO
概要
RPi.GPIOモジュールは、Raspberry PiのGPIOピンを制御するための基本的なPythonモジュールである。
このモジュールを使用することにより、LEDの点灯、スイッチの入力検知、センサからのデータ読み取り等、GPIO (汎用入出力) ピンを通じて外部の電子部品と通信できる。
このモジュールのメリットは、簡便な構文でありながら、デジタル入出力、PWM出力、割り込み処理等、多岐にわたる機能を提供していることである。
ビギナーでも扱いやすく、高度な制御も可能なバランスの取れたモジュールとなっている。
同時に、高度な制御も可能で、複雑なプロジェクトにも対応できる柔軟性を備えている。
また、豊富なドキュメントやサンプルコードが提供されており、ビギナーでも学習しやすい環境が整っている。
まず、重要な概念として、ピン番号の指定方法がある。
BCMモードとBOARDモードという2つの方式が存在しており、多くの開発者は理解のしやすさからBCMモードを採用している。
- BCMモード
- GPIO番号を使用
- BOARDモード
- 物理的なピン番号を使用する。
GPIOピンの設定には、入力と出力の2つの基本モードがある。
- 入力モード
- スイッチの状態読み取りやセンサからのデータ取得などが可能である。
- 入力ピンには、プルアップやプルダウン抵抗の設定もできる。
- 出力モード
- LEDの点灯や電子部品の制御等ができる。
実際の制御においては、出力ピンではHIGH (オン) と LOW (オフ) の2つの状態を制御できる。
入力ピンでは、接続された部品の状態 (ON / OFF) を読み取ることができる。
より高度な機能として、イベント検出機能 (割り込み検出) がある。
これは、ピンの状態変化を監視して、変化が発生した時に特定の処理を実行する機能である。
例えば、特定の物理スイッチが押下された時、特定の関数を呼び出すことが可能である。
また、PWM (パルス幅変調) 出力にも対応しており、LEDの明るさを段階的に制御したり、モータの速度を制御したりすることも可能である。
プログラム終了時には、使用したGPIOピンを適切に解放することが重要である。
これにより、次回使用時に問題が発生することを防ぐことができる。
RPi.GPIOモジュールのインストール
まず、Raspberry Pi OSのアップデートを行う。
sudo apt update sudo apt upgrade
次に、pipのインストールを行う。
sudo apt install python3-pip
Python3のRPi.GPIOモジュールをインストールする。
sudo apt install python3-rpi.gpio # または sudo pip3 install RPi.GPIO
確認
Python 3を使用して、モジュールをインポートできることを確認する。
このとき、import RPi.GPIOコマンドは出力を返さなければ成功である。(モジュールが正常にインポートされたことを意味する)
python3
import RPi.GPIO
GPIOのピン番号の指定
まず、プログラムの冒頭で以下に示すようにモジュールをインポートする。
import RPi.GPIO as GPIO
GPIOにはピン番号の指定方法として2つのモードがある。
多くの開発者はBCMモードを使用することが多い。
- BCMモード
- GPIO番号 (例: GPIO18) を使用する。
- BOARDモード
- 物理的なピン番号を使用する。
GPIO.setmode(GPIO.BCM) # BCMモードを使用
# または
GPIO.setmode(GPIO.BOARD) # BOARDモードを使用
入出力ピンの設定
GPIOピンの入力 / 出力を明確に指定する必要がある。
# 出力ピンの設定例 (LED接続等)
GPIO.setup(18, GPIO.OUT)
# 入力ピンの設定例 (スイッチ接続等)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
// 使用例 (LEDのON / OFF 制御)
# LEDを点灯
GPIO.output(18, GPIO.HIGH)
# LEDを消灯
GPIO.output(18, GPIO.LOW)
// 使用例 (入力の読み取り)
# スイッチの状態を読み取る
switch_state = GPIO.input(23)
イベント検出 (割り込み制御)
イベント検出 (割り込み制御) を使用することにより、特定の物理スイッチが押下された場合等の状態変化を検知して、特定の関数を実行できる。
def button_pressed(channel):
print(f"ボタンが押されました!ピン:{channel}")
GPIO.add_event_detect(23, GPIO.FALLING, callback=button_pressed, bouncetime=200)
GPIOのクリーンアップ
以下に示す理由から、プログラム終了時には、必ずGPIOのクリーンアップを行うことが推奨されている。
特に、電子工作やハードウェア制御を行う場合は、安全性の観点からも非常に重要な処理である。
- 安全性の確保
- クリーンアップを行わない場合、GPIOピンが前回の状態を保持したままになる可能性がある。
- これは接続されている電子部品に予期せぬ電流が流れ続けることを意味しており、部品の損傷やショートの原因となりかねない。
- 特に、LEDやモータ等のアクティブな部品が接続されている場合、この問題は重要である。
- メモリ・リソースの解放
- GPIOの設定はシステムメモリ内に保持される。
- クリーンアップを行わない場合、これらの設定が不要になった後もメモリを占有し続けることになる。
- 長時間稼働するシステムや複数のプログラムを実行する環境では、このメモリの効率的な利用が重要である。
- <br.
- 次回起動時の問題回避
- クリーンアップを行わずにプログラムを終了した場合、次回のプログラムを実行した時に「このピンは既に使用されている」というようなエラーが発生する可能性がある。
- これは、特に開発時のデバッグを困難にする要因となる。
- 割り込み処理の適切な終了
- イベント検出等の割り込み処理を使用している場合、クリーンアップによってこれらの処理が適切に終了される。
- これにより、システムリソースの無駄な消費を防ぎ、次回の実行時に問題が発生することを防ぐことができる。
- システムの安定性維持
- Raspberry Piは組み込みシステムとして使用されることが多く、長期的な安定性が求められる。
- 適切なクリーンアップを行うことにより、システム全体の安定性が向上して、予期せぬ動作を防ぐことができる。
GPIO.cleanup()
RPi.GPIOを使用したサンプルコード
# Import necessary modules
import RPi.GPIO as GPIO
import time
# Set up GPIO pins
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
pins = [17,18]
for pin in pins:
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,1)
# Set variables (change these to change behaviour as desired)
runcycles = 2
ontime = 45 # minutes
offtime = 20 # minutes
# Convert run times from minutes to seconds for sleep function
ontime *= 60
offtime *= 60
# Run furnace on cycle
cycle = 0
try:
while cycle < runcycles:
cycle += 1
GPIO.output(17,0)
print("Furnace turned on for %d seconds. Cycle %d of %d." %(ontime, cycle, runcycles))
time.sleep(ontime)
GPIO.output(17,1)
if cycle == runcycles:
break
print("Furnace paused for %s seconds. %s heat cycles remaining." %(offtime, runcycles - cycle))
time.sleep(offtime)
except KeyboardInterrupt: # if Ctrl C is pressed...
GPIO.output(17,1) # shut off the boiler
print("Program stopped and furnace shut off.") # print a clean exit message
print("Heat cycles completed.")