Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry PiでLEDを光らせてGPIOの使い方をマスターする!

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ピン(青丸)のことです。

raspberry pi gpio

この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です。

www.raspberrypi.org

また、ターミナルでgpio readallとコマンドを打つと、ピン配置と現在のピンの状態を知ることができます。

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ピンと部品を接続します。

led on/off circuit

  • 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になります。

プルアップ設定にする理由

スイッチオフの時、ピンに何も繋がっていない状態になります。この時、電位が固定されないためHighになったりLowになったりしてしまいます。プルアップをすると、ピンに何も繋がっていない時に、電圧を3.3V(High)に固定することができます。

GPIOの最も基本的な動作でしたが、ハードウェア制御ができましたね。次にやりたくなることは、スイッチが押されたときや、センサーが反応したときに即座に何か処理をするという動作だと思います。これは割り込みという機能で実現できます。難易度がぐっとあがりますが、割り込みについても下記ブログで紹介していますので、こちらもご覧ください。

www.raspberrypirulo.net

www.raspberrypirulo.net

今後、Raspberry Piを使っていろいろなことにチャレンジしていきましょう。

ラズパイ ハードウェアに戻る
トップページに戻る