「インストール - RPi.GPIO」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
56行目: 56行目:
<br>
<br>
  import RPi.GPIO
  import RPi.GPIO
<br><br>
== GPIOのピン番号の指定 ==
まず、プログラムの冒頭で以下に示すようにモジュールをインポートする。<br>
<br>
<syntaxhighlight lang="python">
import RPi.GPIO as GPIO
</syntaxhighlight>
<br>
GPIOにはピン番号の指定方法として2つのモードがある。<br>
多くの開発者はBCMモードを使用することが多い。<br>
* BCMモード
*: GPIO番号 (例: GPIO18) を使用する。
* BOARDモード
*: 物理的なピン番号を使用する。
<br>
<syntaxhighlight lang="python">
GPIO.setmode(GPIO.BCM)    # BCMモードを使用
# または
GPIO.setmode(GPIO.BOARD)  # BOARDモードを使用
</syntaxhighlight>
<br><br>
== 入出力ピンの設定 ==
GPIOピンの入力 / 出力を明確に指定する必要がある。<br>
<br>
<syntaxhighlight lang="python">
# 出力ピンの設定例 (LED接続等)
GPIO.setup(18, GPIO.OUT)
# 入力ピンの設定例 (スイッチ接続等)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
</syntaxhighlight>
<br>
<syntaxhighlight lang="python">
// 使用例 (LEDのON / OFF 制御)
# LEDを点灯
GPIO.output(18, GPIO.HIGH)
# LEDを消灯
GPIO.output(18, GPIO.LOW)
</syntaxhighlight>
<br>
<syntaxhighlight lang="python">
// 使用例 (入力の読み取り)
# スイッチの状態を読み取る
switch_state = GPIO.input(23)
</syntaxhighlight>
<br><br>
== イベント検出 (割り込み制御) ==
イベント検出 (割り込み制御) を使用することにより、特定の物理スイッチが押下された場合等の状態変化を検知して、特定の関数を実行できる。<br>
<syntaxhighlight lang="python">
def button_pressed(channel):
    print(f"ボタンが押されました!ピン:{channel}")
GPIO.add_event_detect(23, GPIO.FALLING, callback=button_pressed, bouncetime=200)
</syntaxhighlight>
<br><br>
== GPIOのクリーンアップ ==
以下に示す理由から、プログラム終了時には、必ずGPIOのクリーンアップを行うことが推奨されている。<br>
特に、電子工作やハードウェア制御を行う場合は、安全性の観点からも非常に重要な処理である。<br>
<br>
* 安全性の確保
*: クリーンアップを行わない場合、GPIOピンが前回の状態を保持したままになる可能性がある。
*: これは接続されている電子部品に予期せぬ電流が流れ続けることを意味しており、部品の損傷やショートの原因となりかねない。
*: 特に、LEDやモータ等のアクティブな部品が接続されている場合、この問題は重要である。
*: <br>
* メモリ・リソースの解放
*: GPIOの設定はシステムメモリ内に保持される。
*: クリーンアップを行わない場合、これらの設定が不要になった後もメモリを占有し続けることになる。
*: 長時間稼働するシステムや複数のプログラムを実行する環境では、このメモリの効率的な利用が重要である。
*: <br.
* 次回起動時の問題回避
*: クリーンアップを行わずにプログラムを終了した場合、次回のプログラムを実行した時に「このピンは既に使用されている」というようなエラーが発生する可能性がある。
*: これは、特に開発時のデバッグを困難にする要因となる。
*: <br>
* 割り込み処理の適切な終了
*: イベント検出等の割り込み処理を使用している場合、クリーンアップによってこれらの処理が適切に終了される。
*: これにより、システムリソースの無駄な消費を防ぎ、次回の実行時に問題が発生することを防ぐことができる。
*: <br>
* システムの安定性維持
*: Raspberry Piは組み込みシステムとして使用されることが多く、長期的な安定性が求められる。
*: 適切なクリーンアップを行うことにより、システム全体の安定性が向上して、予期せぬ動作を防ぐことができる。
<br>
<syntaxhighlight lang="python">
GPIO.cleanup()
</syntaxhighlight>
<br><br>
<br><br>



2024年11月12日 (火) 18:30時点における版

概要

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.")