Raspberry PiでLEDを光らせてGPIOの使い方をマスターする!
この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
Raspberry Piを購入してまず行うことと言えば、”Lチカ”ですね。LEDがチカチカ光るのでLチカです。基本的な動作ですが、GPIO(汎用入出力、あとで詳しく説明します)の使い方がわかると、Raspberry Piで出来ることが大幅に増えます。
今回は、Lチカやスイッチを使って、GPIOの使い方を詳しく説明してきます。
それでは、早速詳しく説明してきます。
GPIOとは
GPIOとはGeneral Purpose Input/Outputの略で、日本語にすると汎用入出力となります。Raspberry Piの場合、下記写真の40ピン(青丸)のことです。
この40pinは、汎用入出力というだけあって、プログラムで設定することにより、各ピンを出力ピンにしたり、入力ピンしたりすることができます。ざっくり言うと以下のような動作になります。
- 出力ピンに設定:電圧をHigh(3.3V)にしたり、Low(0V)にしたりする
- High(3.3V) ⇒ LEDが光る
- Low(0V) ⇒ LEDが消える
- 入力ピンに設定:電圧を読み取る 3.3VならHigh(1)、0VならLow(0)
- スイッチオン(0V) ⇒ Low
- スイッチオフ(3.3V) ⇒ High
GPIOのピン配置と状態確認
GPIOの40pinには、5V電源ピンやGNDピン等もあります。ピン配置は下記のWebで確認することができます。ここで5V powerやSDA/SCL等、意味がわからないピンもあると思いますが、気にせず読み進めてください。GPIO26、GPIO16ピン、Groundピンを使いますので、その位置がわかればOKです。
また、ターミナルでgpio readall
とコマンドを打つと、ピン配置と現在のピンの状態を知ることができます。
青丸のピンの状態は以下のようになっています。
- GPIO26 (BMC:26)
- Mode:OUT ⇒ 出力設定
- V:1 ⇒ 3.3Vを出力している
- GPIO16 (BMC:16)
- Mode:IN ⇒ 入力設定
- V:0 ⇒ 0Vが入力されている
注意事項
- BCMの項目とwPiやNameの項目で番号が異なります。下記のpythonプログラムでは、BCMの番号を使いますので、ご注意ください。
Raspberry Pi 4でgpio readall
コマンド実行時に、Oops - unable to determine board type... model: 17
とエラーになる場合は、下記コマンドを実行して、wiringpiモジュールの最新版をインストールしてください。
$ wget https://project-downloads.drogon.net/wiringpi-latest.deb
$ sudo dpkg -i wiringpi-latest.deb
GPIOの基本を理解したところで、実際にLEDを光らせてみましょう。
電気回路の作成
まずは回路を考えて、電気回路を作成する必要があります。アプリ専門の方は、まずこの壁を乗り越えるのが大変だと思いますが、単にLEDを光らせる回路はそれほど難しくありません。LEDに流れる電流等が少なかったり多かったりしても大丈夫です。光の明るさは変わりますが、LEDは光ってくれます。
回路ですが、下記のようにGPIOピンと部品を接続します。
- GPIO26(37ピン)→330Ωの抵抗→LED→GND(39ピン)
GPIOの出力は3.3V、LEDの電圧降下(Vf)はだいたい2Vくらいとすると抵抗にかかる電圧は1.3Vとなります。あとはオームの法則で1.3/330 ≒ 0.004 (A)となり、4mAの電流がLEDに流れることになります。LEDに10mAくらい流そうと思っていましたが、手元に抵抗が330Ωしかなかったので、少しLEDの光が弱いかなぁと思いつつ、330Ωを付けました。
注意事項
- 抵抗は必ずつけてください、付けないと電流が理論的には無限に流れますので、LEDが焼き切れます。
Pythonコード:GPIO出力(Lチカ)
下記がLチカのサンプルコードになります。
import RPi.GPIO as GPIO # GPIOとtimeモジュールをインポート import time pin = 26 GPIO.setmode(GPIO.BCM) # pinの指定モードを選択 GPIO.setup(pin, GPIO.OUT) # 26番pinを出力に設定 while True: GPIO.output(pin, True) # アウトオン 3.3V出力 time.sleep(3) GPIO.output(pin, False) # アウトオフ 0V出力 time.sleep(3)
コードの説明ですが、コード上にコメントとして記載したので参考にしてください。3秒間隔でLEDが点灯と消灯を繰り返します。
それでは実際に動かしてみましょう。Raspberryのコンソールで、下記のコマンドを実行します。
$ python led.py
LEDが3秒ごとに点灯、消灯を繰り返せば成功です。Lチカができましたね。
Pythonコード:GPIO入力
今度はGPIOで入力を読み取る方法を紹介します。下記のようにスイッチを接続します。
- GPIO16(36ピン)→スイッチ→GND(34ピン)
下記がサンプルコードになります。
import RPi.GPIO as GPIO import time pin = 16 GPIO.setmode(GPIO.BCM) # pinの指定モードを選択 GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP) # 16番ピンを入力、プルアップに設定 while(True): val = GPIO.input(pin) # 16番ピンの入力を読み取り High = 1 , Low = 0 if val == 1: print("GPIO16とGNDがつながっていません!") else: print("GPIO16とGNDがつながっています!") time.sleep(3)
コードの説明ですが、コード上にコメントとして記載したので参考にしてください。16番pinに何も接続しないとHigh、GNDに接続するとLowになります。
プルアップ設定にする理由
GPIOの最も基本的な動作でしたが、ハードウェア制御ができましたね。次にやりたくなることは、スイッチが押されたときや、センサーが反応したときに即座に何か処理をするという動作だと思います。これは割り込みという機能で実現できます。難易度がぐっとあがりますが、割り込みについても下記ブログで紹介していますので、こちらもご覧ください。
今後、Raspberry Piを使っていろいろなことにチャレンジしていきましょう。