Raspberry Pi, PythonでLチカ 第1回:部品調達とLピカ

Raspberry Pi, PythonでLチカ 第1回:部品調達とLピカ

はじめに

「電子工作界のHelloWorld」と言われているLチカ(LEDチカチカ)を試していきます。
大学入試以来の電気なので知識に不安もありますが、調べながら進めていきます。

ラズパイにはGPIOという出力があり、3.3Vの電圧のオンオフを簡単に切り替えられます。
ラズパイを使った電子工作はほぼGPIOを使うことになるので、
まずはこれを使ってLチカできる様になる必要があります。

今回はRaspberryPi 3 model B+を使用します。
ラズパイのGPIOについては公式サイトのこの辺が参考になると思います。
英語なのでかいつまんでまとめると

  • 最近のラズパイならピンの配置は同じ。Pi 1 Model B+ (2014)以前は異なる。
  • Rasberry Pi ZeroとZero Wも異なる。
  • コマンドラインで”pinout”と入力すればPIN配置がわかる。(下図参照)

pinoutはラズパイの図も出てきてわかりやすいです。
下の方に1~40の数字で書いてあるのがそれぞれのピンの役割です。

3V3はDC3.3Vの電源、5VはDV5Vの電源、GNDはグランド(アース)、GPIOは切り替え可能なDC3.3V出力をあわらしています。

図とリストで色が対応しているので、90°ずれていますが位置は把握できると思います。

部品選定

それでは、Lチカに使うLED・抵抗器を選定していきます。
Lチカくらいなら特に気にせず適当に選んでもうまくいきそうな気がしますが、
今後の開発能力向上のため、そして何よりラズパイを壊したくないので一応計算してみます。

先に結論を書くと、今回は下記の部品を選定しました。(いずれも秋月電子通商で購入)

LED(OSHR5111A-TU)
VF:2.1V
連続最大電流:50mA

抵抗器(CF25J100RB)
抵抗値:100Ω
定格電力:1/4W

さて、計算するときには「過電流」「過電圧」「消費電力」に注意します。

前項で書いた通りラズパイのGPIOの出力は3.3Vです。(これ以上電圧かからないようにする)
また、定格電流は1pinあたり16mA、合計50mAとなっています。(これ以上電流出ないようにする)

部品の選定順序は

  1. LED選定
  2. 抵抗で落ちる電圧算出
  3. 抵抗器の抵抗値算出
  4. 抵抗器の定格電力決定

となります。

1.LED選定

LEDはとりあえず安いのを選びました。
赤と緑の二色くらいは持っておいた方が今後の役に立ちそうな気がするので
同様のスペックのものをそれぞれ買いました。

スペックは
VF:2.1V
連続最大電流:50mA
です。

VFはLEDを点灯させるために必要な電圧のことです。
ラズパイの出力は3.3Vなので、少し電圧をかけ過ぎということになります。
電流につては50mAも流そうものなら先にラズパイが死ぬはずなので気にする必要なさそうです。

2.抵抗で落ちる電圧

というわけで、3.3VではLEDにとって負荷が大きすぎるので、
抵抗を使って適正な電圧にしていきましょう。

中学理科レベルの電気の知識はあるものとして書き進めます。
流水モデル
オームの法則(V[V]=I[A]R[Ω])
電力の式(P[w]=I[A]V[V])
の復習が必要な方はこの辺りをご参照ください。

それでは計算を進めます。
抵抗器とLEDを直列で繋ぐので、

(抵抗器の電圧)+(LEDの電圧)=(ラズパイの電圧)

となります。LEDの電圧は2.1V、ラズパイの電圧は3.3Vなので

(抵抗器の電圧)+2.1=3.3
⇔ (抵抗器の電圧)=3.3-2.1=1.2[V]

と求まります。

3.抵抗器の抵抗値算出

オームの法則から、1.2V(上記計算式参照),16mA(ラズパイの限界)を出すためには

R=V/I=1.2/0.016=75[Ω]

の抵抗を使えば良いと求まります。

ただ様々な誤差などを考えると、16mAぴったりを目指すのは危ないです。
なので16mAよりも若干小さな電流を流すのが一般的です。
電圧が一定の場合、電流を小さくするためには抵抗値が大きい抵抗器を使えば良いです。

今回は100Ωの抵抗器を使うことにします。

4.抵抗器の定格電力決定

この場合、電流値は

I=V/R=1,2/100=0.012[A]

となります。
消費電力は

P=VI=1.2×0.012=0.0144[W]

となります。
この電力に対応している抵抗器を選定しましょう。

といっても一般的に売っている抵抗器はせいぜい1/4Wや1/6Wなので、
十分定格電力には余裕があります。

Lチカの前にLピカ

いきなりコードをゴリゴリ書いてLEDの制御を行う前に、
まずは、単純に回路を作ってLEDがつくことを確認しましょう。

pinoutコマンドで確認した通り、1チャンネルが3.3V、6チャンネルがGNDになっているので、
この二つを使って次の図の様に回路を組みましょう。

3.3Vでラズパイから出た電流はまず、抵抗を通って1.2V降下して2.1Vになります。
抵抗器には向きがないので好きな向きにつけて構いません。

その後LEDで2.1V降下して0V (=GND)となります。
抵抗器とは異なり、LEDには向きがあります。
足が長方が+で、高電位側(=GNDに繋がっている側じゃない側)に繋ぐ必要があるので注意してください。

無事LEDは点灯しましたか?
これでLチカの準備が整いました。

いよいよLチカ

お待たせしました。
やっとPythonが登場します。

Pythonを使ってGPIOを制御するときには、RPi.GPIOというパッケージが必要になるので予めインストールしておいてください。

$ pip install RPi.GPIO

PythonのインストールやRPi.GPIOのインストールについて詳しく知りたい方はこちらの記事をご覧ください。

コードはこんな感じになります。

flash_led.py

#GPIOを制御するためにRPi.GPIOをインポート
import RPi.GPIO as GPIO
#チカチカの時間をコントロールするためにtimeをインポート
import time


def main():
    #①GPIOのチャンネルの選び方を設定する
    GPIO.setmode(GPIO.BOARD)
    #②今回使うGPIOを選択する
    GPIO.setup(3,GPIO.OUT)

    #10回チカチカさせる
    for i in range(10):

     #③出力を切り替える
        GPIO.output(3,True)
        time.sleep(1)
        GPIO.output(3,False)
        time.sleep(1)
        print(str(i+1)+"回目")

#この辺はpythonの決まり文句です。
#わからない方は気にしないかググってください!
if __name__ == '__main__':
    main()

コードの中でポイントになるところを解説します。

①GPIO.setmode

ここではGPIOのチャンネルの指定方法を設定します。
説明のためにこの記事の前半で紹介した$pinoutコマンドの実行結果をもう一度載せます。

これを見ると、GPIOには二種類の数字が紐づけられています。

1つは1〜40の数字がピンの通し番号で、
もう一つはGPIOxxというGPIOのみの通し番号です。

GPIO.setmodeではこの二つのうちどちらの番号を使ってGPIOを制御するのかをしています。
GPIO.BOARDにすると、1〜40のPINの通し番号を使用することになり、
GPIO.BCMにすると、GPIOのみの通し番号を使うことになります。

どちらを使用しても全く問題ありませんが、慣れるまではBOARDの方がピンの刺し間違えなどが減らせそうなのでBOARDを選択しています。

②GPIO.setup

ここでは使用するチャンネルと、使用用途を設定します。

今回は3番目のピンを使うことにします。(第一引数)
2つ目の引数にGPIO.OUTを設定し、GPIOを出力として使うことにします。

複数のピンを使用する場合は、それぞれのピンに対してGPIO.setupを行います。

実はGPIOは3.3V電圧の出力だけではなく、入力端子としても使うことができます。
その場合はGPIO.INを設定します。(今回は関係ありません)

③GPIO.output

ここで3.3V電圧のオンオフを切り替えます。
第一引数にチャンネルを設定し、第二引数にオン/オフ(True/False)を設定します。

Lピカの時には1chに+側端子を接続していましたが、
3chに変更すれば準備完了です。

それではpythonで実行してみましょう。

$ python flash_led.py

正しくコーディングができていればこんな感じになると思います。