Raspberry Pi の GPIO を使って LED を ON/OFF する Python のプログラムについてまとめておきます。LED を4つとし、USB バッテリー駆動としています。LED が1つでも、そのまま動きます。
以下の環境で動作確認をしています。
環境: Raspberry Pi 3 (bullseye)、USB バッテリー(単3電池×4本)、Windows 10 パソコン、Wi-Fi ネットワーク(Raspberry Pi のリモート操作のため)
背景
Raspberry Pi の特徴として、汎用の入出力ピン(GPIO、general purpose input/output) が簡単に扱えるという点があります。
たとえば、GPIO を使った同様の制御や機能を、PIC マイコンなどの従来の電子回路で実現しようとすると、環境を整えるだけでもとても煩雑です。
Raspberry Pi で GPIO が扱えると、接続する先の電子回路だけ準備すれば、すぐに動かすことができます。
Raspberry Pi で GPIO を使う Python のスクリプトについては、このサイトでは扱っていませんでした。そこで、コピー&ペーストしてすぐに使える程度にポイントをまとめておくことにします。
具体的には、Raspberry Pi の Python プログラミングで、4つの LED を(2個ずつ)順次、ON/OFF します。
スクリプトは、4個の LED を点滅する例としていますが、LED が1個だけでも動きます。個数を増やすことも/減らすことも可能です。
同スクリプトを転用することで、ステッピングモータなどを動かすことが可能です。
なお、Raspberry Pi 自体の基本的な設定(OS のインストール、リモートデスクトップなどの設定)は、すでに完了していることを前提としています。完了していない場合は、下記の関連リンクを参照してみてください。
必要なものの一例
・ LED ×4個(赤、橙、黄、緑)
・ 1kΩ 程度の抵抗(茶黒赤金)×4個(40Ω 以上程度であれば使用可)
・ ブレッドボード
・ 配線用のジャンパーワイヤ(赤×4本、黒×1本)
設定
① Raspberry Pi の GPIO に電気部品を接続し、LED の回路を作ります。(上の写真と回路図参照。)
② 以下に挙げたサンプルスクリプトを led1.py 等の名前で、Raspberry Pi に保存します。
③ Raspberry Pi 上で、②のスクリプトを実行します。
→ LED が2つずつ、順次、点灯します。
説明
ハードウェア構成について
・ 電源やハードウェア構成は、Raspberry Pi が正常に動作するのであれば、どのようなものであってもよいです。上記の写真では、市販の USB バッテリー(黒色)を使っており、バッテリーケースにエネループ4本が入っています。
・ Raspberry Pi には、Wi-Fi ネットワーク経由で、Windows パソコンからリモートデスクトップでアクセスしています。Python のスクリプトも、リモートで実行しています。
★ このような構成にすると、外部とは物理的な配線をすることなく、Raspberry Pi で構成したシステムをリモートで操作することができ、とても便利です。LED の ON/OFF 程度であれば、ワイヤレスで操作できます。また、モーター用のバッテリーなどを追加してロボットなどを作れば、構成したシステムをワイヤレスで遠隔制御できることになります。
電子回路について
回路の外観は上の写真、回路図は、以下を参照してください(一例)。
・ Raspberry Pi のピン番号と、GPIOの番号の対応は、Raspberry Pi のターミナルを起動し、”pinout” + [enter] と入力すると確認できます。このピンアウトを見ながら、接続していきます。
・ Raspberry Pi の 39番ピン(GND)(または、34番ピン)をグランドとしています。
・ 4つの LED1, 2, 3, 4 に対応するように、32番ピン(GPIO12)、 36番ピン(GPIO16)、38番ピン(GPIO20)、40番ピン(GPIO21)を使っています。これらのピンのそれぞれに、1kΩ の抵抗(茶黒赤金)と LED を直列で順次つなぎ、GND に接続しています。
・ ブレッドボードに刺してあるため写真では見えませんが、LED の足の長いほう(アノード側)が、Raspberry Pi の出力信号(+3.3V)側に、足の短いほう(カソード側)が、Raspberry Pi の GND (0V) 側に対応するよう接続しています。
・ 写真で接続を説明すると、左から(ラズパイの GPIO 出力 3.3V or 0V) – (赤色のジャンパーワイヤー)- (1kΩの抵抗 茶黒赤金) – (LEDのアノード端子 – LED本体 – LEDのカソード端子)- (黒色のジャンパーワイヤー) – (ラズパイの GPIO の GNDピン)の順となるよう接続しています。
・ 4つの LED1, 2, 3, 4 は、虹の七色順に、赤、橙、黄、緑としています。それぞれ、GPIO12, 16, 20, 21 に対応させています。
・ Raspberry Pi の新旧などによりピン配置が異なる場合は、pinout コマンドを実行し、ソフトウェア上での GPIO の番号と、実際のピンの位置関係を確認してください。また、使いたいピン番号を変えたい場合など、必要により、サンプルスクリプトを編集し、GPIO の番号を修正してください。
スクリプトについて
・ 冒頭の import 文は、GPIO を使うためです。
・ import time は、点滅の時間調整のために使います。回路の検討中/デバッグ中であれば、tm1.sleep() 内の数値を長めに、うまく動いたら短くするなど調整してください。
・ gpio01 = 12, …, gpio04 = 21 としているところで、40 本ある Raspberry Pi のピンのうち、どれを使うのかを決めています。
Raspberry Pi のターミナルで pinout コマンドを実行し、サンプルコードでは、あまり使っていない右下のピンを使うことにしています。うまく動いたら、使いたいピンに変更する/使うピンを増減するなど、カスタマイズしてみてください。
・ 出力信号を決めているのが、p1 ~ p4 です。
最初、p1 と p2 だけを 1 (ON) 、他の p3, p4 を 0(OFF)としています。
あとは、for ループを回すところで、バケツリレーのように、この値を受け渡していきます。具体的には、p2 と p3 のみ ON、p3 と p4 のみ ON、… となるように値を受け渡しています。
・ こうして決めた ON/OFF の信号を、for ループを回すごとに GPIO1.pinout に渡すことで、GPIO で出力しています。
・ 点灯(点滅)させる時間は、for ループ内の tm1.sleep( 1 ) で設定しています。うまく動いたら、数値を変えてみてください。
・ サンプルスクリプトでは、同時に2つの LED を ON にしています。うまく動いたら、1つだけ ON にしてみる、3つを ON にしてみる、など変更してみてください。
・ 4つのうち2つの LED を ON にしているのは、ステッピングモータの回転などに使う場合でも、GPIO 1つを制御する場合であっても、コピー&ペーストするだけで、すぐに応用できるようにしているためです。
その他 ~ 電流・電圧関連のポイントまとめ等
・ 実際の Raspberry Pi の GPIO のピンの電圧としては、0V ⇔ 3.3V に変化します。
・ 電流、電圧の仕様を見積もる一例として、秋月電子の赤色 LED の仕様を参照すると、順方向降下電圧 Vf = 2.1V、標準電流値 I1 = 30mA となっています。
・ そこで、バラツキは無視し、LED と抵抗 R1 (電流制限抵抗)を直列でつなぎ、これらに流す電流を 30mA としてみます。すると、抵抗値 R1 は、R1 = (3.3V – 2.1V) / 0.03 A = 40Ω となります。
抵抗値がこの値より大きければ、過電流が流れることはなく特に問題はない、ということになります。
たまたま、手元に、330Ω (橙橙黒金)と 1kΩ (茶黒赤金)の抵抗があります。上記の事例では、LED の明るさが多少暗くなっても、バッテリーの消費を小さくしたほうがよいため、1kΩ の抵抗を4つ使っています。
・ また写真で、Raspberry Pi についている赤色の基板は、時刻を保持するためのリアルタイムクロックです。リアルタイムクロック(RTC)については、過去、何種類か使っています。ポイントを以下の関連リンクにまとめていますので、関心のある方は参照してみてください。
まとめ
ベーシックな内容ですが、Raspberry Pi の GPIO を使って、LED を ON/OFF するスクリプトと関連する事項についてまとめました。
これで、GPIO の出力も可能です。同スクリプトを流用することで、ステッピングモータなどを動かすことも可能です。これについては別途、まとめることにします。
なお、今回の回路図は、関連リンクでまとめている SVG 形式で作成してみました。ベクター画像ですので拡大しても画像がジャギーにならず、Python を使って、かなりのことができることがわかりました。が、もう少し洗練させたいところです。。
関連リンク
・ Raspberry Pi にリモートデスクトップで接続する
・ リアルタイムクロックに関するまとめ 【Raspberry Pi】
・ 起動用SDカードを設定する 【Raspberry Pi】
・ Python で回路図を描画する 【HTML & SVG】
・ サーボモーターを動かす 【Raspberry Pi】
・ WordPress に JavaScript を埋め込む
外部リンク
・ 秋月電子 赤色LED OSR5JA3Z74A
サンプルスクリプト
import RPi.GPIO as GPIO1
import time as tm1
gpio01 = 12
gpio02 = 16
gpio03 = 20
gpio04 = 21
GPIO1.setmode( GPIO1.BCM )
GPIO1.setup( gpio01, GPIO1.OUT )
GPIO1.setup( gpio02, GPIO1.OUT )
GPIO1.setup( gpio03, GPIO1.OUT )
GPIO1.setup( gpio04, GPIO1.OUT )
p1 = 1
p2 = 1
p3 = 0
p4 = 0
for i1 in range( 100 ):
print( str( p1 ) + " " + str( p2 ) + " " + str( p3 ) + " " + str( p4 ) )
GPIO1.output( gpio01, p1 )
GPIO1.output( gpio02, p2 )
GPIO1.output( gpio03, p3 )
GPIO1.output( gpio04, p4 )
tm1.sleep( 1 )
p0 = p4
p4 = p3
p3 = p2
p2 = p1
p1 = p0
tm1.sleep( 1 )
GPIO1.cleanup( gpio01 )
GPIO1.cleanup( gpio02 )
GPIO1.cleanup( gpio03 )
GPIO1.cleanup( gpio04 )