ラズパイによるLED点滅(まずは最初に誰もがやってみる基本的な事) | そう備忘録

ラズパイによるLED点滅(まずは最初に誰もがやってみる基本的な事)

始めに

RaspberryPiによるLEDの点滅は通称「Lチカ」と言って大抵の書籍に載っている一番基本的といっても良い操作だ。

今更Lチカの記事?とも思ったのだが最近知人からラズパイの電子工作について聞かれる事が多くて、自分の記事もいきなりPythonでの自宅用監視カメラ作成からの記事だったので基本的な部分も残しておけば誰かに役に立つのではと思い直して記事に残しておくことにした。

その際に自分にとって忘れてはならないのが下記の書籍だ。

RaspberryPiで学ぶ電子工作

自分のラズパイとの出会いは2019年3月に金丸隆志さんの「Raspberry Piで学ぶ電子工作」の書籍が始まりである。

上記はRaspberry Pi 3向けの書籍で、Raspberry Pi 4対応の書籍も出版されているの紹介しておく。

電子工作は始めての経験でプログラミングは10年以上前にやった事があったがPythonは始めてという状態から1年ちょっとで(自分なりに)まぁまぁ出来るになったのは、最初にきちんと基本から学べた書籍のおかげだったと感謝している。

なので今回のLチカも上記の書籍の内容に沿って説明したいと思う。

試した環境

環境は以下の通り。

本体

Raspberry Pi 3 B+

OS

Raspbian Version:June 2019

必要なモノ

まずはLED点滅をやるにあたって必要なモノを用意する。

Raspberry Pi

自分はRaspberry Pi 3 B+を購入したのだが、今購入するのならRaspberry Pi 4だと思う。

必要なものは本体、SDカード、電源コード、ヒートシンク、ケース(任意)なのだが最初に購入する時は別々に購入するよりもセットを購入した方が簡単なのではないか。

USBキーボード

既に持っていれば不要だが自分は下記の商品とは型が違うがEwinのキーボードを持っている。

このキーボードで本格的にタイピングをするのはキツイのでパソコン上でコーディングをしてWinSCPでソースコードをラズパイにコピーしてプログラムを実行している。

では何のためにラズパイのキーボードが必要かと言うと最初の設定の時やVNCを繋げる前にIP Addressを確認したい時、VNCが何らかの原因でハングしてしまった時などちょいちょい出番がある。

なので小型で持ち運びが出来て、ちょっとしたキー入力とマウス操作ができるEwinの小型キーボードは重宝している。

モニター

既に持っていれば不要だがHDMI入力のあるモニター。

HDMI入力をサポートしているTVもあるのでTVで代用する事もできる。

また下記のようなRaspberry Pi用のタッチモニターを使用する事も可能だ。

ブレッドボード

自分は上記書籍で紹介されていた秋月電子通商の「Raspberry Piで学ぶ電子工作 パーツセット」でブレッドボード、抵抗、LED、ジャンパーワイヤーなどを揃えたが1点ずつ購入することも出できる。

LED、抵抗

3mmLEDと抵抗(330Ω)。

ジャンパーワイヤー

今回のLED点滅の為だけにはメスーオスがあれば良いのだが、メス-オスやメスーメスもいずれ必要になるのでまとめて揃えておくほうが良いと思う。

OSインストール

SDカードにOSをインストールする。

パソコンを用意してSDカードにラズパイ用のOS(Raspbian)をインストールする。

こちらの記事がRaspberry Pi ImagerでOSをインストールした時の記事となるので参考にして欲しい。

またこちらの記事ではRaspberry Piの公式サイトからOSのイメージコピーをダウンロードしてWin32 Disk Imagerを使ってSDカードにOSをコピーしている。

いずれかの方法でSDカードにOSをインストールした後、ラズパイ本体にSDカードを差し込んで起動する。

回路図

LEDを点滅させる為の回路図は以下の通り。

尚、配線時はラズパイの電源を落としておく。

LED点滅回路図

ブレッドボードは縦のラインは繋がっており、ラズパイ側からいくとGPIO4→抵抗(330Ω)→LED(アノード)→LED(カソード)→GNDの順に接続している。

尚、前述の書籍だとGPIO25に接続しているのだがGPIO25は22番ピンで中央付近にあり、数え間違いで隣に指してしまう事も(自分は)ままあるので数えやすい端にあるGPIOをよく使っている。

LED点滅配線図

抵抗の計算の仕方

電子工作初心者がよく分からないのが抵抗の計算の仕方(自分がそうだった)。

ラズパイのGPIO(3.3Vの電圧)から直接LEDに繋げると今回のLEDでは電流が流れすぎてしまう。

その為、LEDに流れる電流(アンペアで表現される)を少なくする為に抵抗が必要という事は何となく分かるのだが、一体どれぐらいの抵抗(オームで表現される)を付ければ良いのかが全く分からなかった。

まず秋月電子で購入したLEDのスペックを確認してみる。

  • 順方向電圧降下:2.0V
  • 最大順電流:30mA
  • テスト電流:20mA

次に中学で習ったオームの法則

  • V(電圧)=I(電流)×R(抵抗)

これはうっすら覚えていた。

今回求めたいのはR(抵抗)なのでR=V÷Iに式を変換する。

抵抗の両端のV(電圧、両端の電位差)を求めるのだが、

  • GPIOの電圧(3.3V)-LEDの両端の電圧(2.0V)=1.3V

で求める事ができる。

次にI(電流)は最大が30mAまで大丈夫な様だが余裕を見て20mA(テスト電流)とする。

20mA=0.02Aなので、

  • 1.3÷0.02=65Ω

65Ω以上の抵抗を付ければ良いことになる。

今回接続するのは330Ωの抵抗なのでI=V÷Rで計算すると

  • 1.3÷330=0.0039≒0.004 A

となり、4mAの電流しかLEDに流れない事になる。

しかし少ない分にはLEDの点灯がちょっと暗くなるだけなので問題ない。

LEDと抵抗

LEDは両端の長さが違う。

LEDと抵抗

長い方がアノードでプラス側に接続する、短いほうがカソードでマイナス側に接続する。

方向を間違えるとLEDは壊れてしまうので注意が必要だ。

一方、抵抗は方向は気にしなくてもよい。

また購入時のままだと写真の通り、端子が長目なのでカットした方が扱いやすいし沢山の部品をブレッドボードに配置した際に長いと干渉してしまう。

電工ペンチで適当な長さにカットするのだがLEDの場合はアノードとカソードがあるので間違えないようにカットした後も長さを変えておく。

電工ペンチでカット

上記の写真はフジ矢の万能電工ペンチで車整備の時と兼用している。

しかし電子工作の場合はもう少し小さいサイズの方が扱いやすいのでエーモンの電工ペンチを使うことも多い。

ちなみにエーモンの電工ペンチはグリップが使っているうちに抜けてしまうので瞬間接着剤で固定した。

アマゾンでも同様の現象の書き込みが多数あったのでこの工具特有の問題なのだと思う。

プログラム

ソースコード

LED点滅のプログラムは以下の通り。

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 31 21:50:13 2020

@author: Souichirou Kikuchi
"""

import RPi.GPIO as GPIO
from time import sleep

PIN = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

try:
    print('--- start program ---')
    while True:
        GPIO.output(PIN, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(PIN, GPIO.LOW)
        sleep(0.5)
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
    print('--- stop program ---')

補足説明

モジュールの読み込み

8行目でGPIOを制御するのに必要なモジュールをGPIOという名前で読み込んでいる。

定数の定義

11行目はGPIOの番号をプログラム中で指定する箇所が複数箇所あるので接続するGPIO番号を変更した際にプログラム修正が一箇所で済むようにPINという定数を定義している。

Pythonでは定数は全て大文字とアンダースコアで書くのがコーディングルールとの事。

例外処理

16行目のtryと23行目のexceptはペアで、このプログラムはCtrl+Cで強制終了をして停止させるのだが、その際に例外をexceptで拾って異常終了させない為の記述。

つまりプログラムの実行中にCtrl+Cを押すと23行目のexceptに飛んでくる。

KeyboardInterrupt(キーボード割り込み、Ctrl+CやDelete)の例外の際は24行目のpassで何もエラー処理をしない。

そして25行目のfinallyには必ず実行する処理を記述するのでGPIOのクリーンアップ、print文が実行される。

GPIO.cleanup()を行わないと次回にプログラムを実行する際にGPIO4が使用中とのワーニングメッセージが表示されてしまうのでクリーンアップを行っている。

メインループ

また18行目~22行目でループを繰り返している。

while True: なので無限ループになっており、Ctrl+Cで強制終了をするしか無い仕様なので、前述のtry~exceptが必要になってくる。

19行目でGPIO4をHIGH(3.3Vの電圧)、21行目でLOWを0.5秒間隔で繰り返している。

20行目のsleep(0.5)は何もせずに0.5秒待機の命令になるのでここの秒数を変更すれば点滅の間隔が変わる。

開発環境

プログラムはラズパイ上では無く以下の環境のWindowsパソコンで書いている。

OS

Windows10 Home バージョン1903

パソコン

DELL G7 15

開発環境

Spyder3.3.6(Anaconda Navigator 1.9.7)

Python

Python 3.6.8

実行環境

Windows環境で作成したPythonのプログラムソースをWinSCPを使ってラズパイにコピーをしてVNC Viewerで接続をしているのだが、事前にラズパイ側ので以下の設定を変更しておく必要がある。

ラズパイ設定変更

ラズパイのメニューから”設定”、”Raspberry Piの設定”をクリックする。

ラズパイ設定変更

インターフェースタブでSSHとVNCを有効にする。

尚、開発が終了したらSSHとVNCは無効にしておく方がセキュリティは向上する。

sshとVNCを有効にする

WinSCPで接続

WinSCPでラズパイに接続してプログラムソースをコピーしている様子。

WinSCPでコピー

今回は /opt/mytest にディレクトリを作成してコピーしているがLED点滅(Lチカ)のプログラムを動かすだけであれば /home/pi/ 配下に適当なディレクトリを作成してコピーすれば良い。

実行

ラズパイ上でのPythonのプログラムの実行は幾つかの方法があるのだが上記の書籍ではPython3(IDEL)から実行している。

しかし、ある時からラズパイの標準OSのRaspbianにPython IDLEが標準でインストールされないようになってしまった。

その為、今回はThonny Python IDEから実行する事にする。

Thonny IDEを起動する

「Load」ボタンでPythonのスクリプトを読み込む。

ファイルをLoadする

プログラムソースが表示されるので「Run」ボタンを押すとプログラムが実行される。

プログラムを読み込んだ

プログラムが実行されるとLEDが0.5秒間隔で点滅するのが確認できる。

またプログラムを停止したい時はCtrl+Cで終了させる。

※Stopボタンで停止するとexcept以降の処理が実行されなかった

Debugモードで実行

1行づつ実行するDebugモードで実行する。

Debugモードで実行

実行されている行が黄色くハイライト表示されるので次の行に行きたい時は「Over」ボタンをクリックする。

ステップ実行

下記の様に複数行ハイライト表示されている時には「Over」を押さずに「Into」を押すと次のステップにいける。

また右側に現在の変数の値が表示されている。

Intoと変数の表示

Python3(IDEL)のインストール方法

一応、Python3 IDLEのインストール方法も書いておく。

LXTerminalから以下のコマンドを実行する。

sudo apt-get install idle-python3.7

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。