(23) 【連載1-3】マイコンで電子工作入門:LED点滅

投稿者: | 2018年5月2日

4,481 views

この記事は最終更新から 1790日 が経過しています。

1. やってみたいこと

(21) 【1-1】マイコンで電子工作入門:選定 では、「マイコンボードで電子工作」の作業環境として Raspberry Pi を使うと決めた。
(22) 【1-2】マイコンで電子工作入門:ラズパイ初期設定 ではラズパイを使えるようにセッティングした。

今回は、ラズパイを使って、ブレッドボード上に実装した LEDを点滅させてみたい。
いろいろなところでサンプルとして扱われている基本中の基本だ。

ラズパイの I/Oポートを弄る記念すべき第一歩だ。
ちゃんと記録しておきたい。

2. I/O

(1) I/Oポートとは?

I/Oは Input(入力)と Output(出力)の先頭 2文字を取って繋げたもの。
ポートは Port(港)のこと。

つまり…

I/Oポートとはマイコンと外部回路との間を物が入ったり出たりする港

ということ。

電子回路にとっては「出入りする物」とは情報(=デジタル信号やアナログ信号)のこと。
実際には I/Oの端子にかかる意味を持った電圧の大きさのこと。

デジタル信号であれば、繋がれた両者は、電圧のある閾値を境に High / Low と認識するし、
アナログ信号であれば、繋がれた両者は、電圧の値自体に意味を認識する。

(2) GPIOとは?

Global Purpose I/Oを略したもの。

つまり…
Global(汎用的な)Purpose(目的)で使う I/Oのこと。

つまり…
マイコンの I/O端子がマイコン内部で特定のコントローラ(シリアル通信コントローラ、ADコンバータ、メモリアクセスコントローラ等々)に繋がれているのではなく、

マイコン上で動作するソフトウェアで好きに使ってよいですよ

という汎用目的で用意されている I/Oポートのこと。

よって…
ここに LEDを繋げて点灯、消灯をソフトウェアで制御してよいのだ。

3. ブレッドボード上にLED点灯回路を実装

(1) LEDを点灯させる で組んだものを使用する。

4. ラズパイとブレッドボードを接続

(1) ラズパイ GPIOのどこと繋ぐ?

前述のように GPIOは「ソフトで自由に使ってよいよ」という I/Oなので、どこを使ってもよい。

ただし…
GPIO2は SDA1と兼用
のように、他の用途と兼用できる端子もあるので使い方に注意する。

今回は、他と兼用されていない GPIO No.17(=Pin #11)を使うことにする。
この端子は High状態で 3.3Vを出力するので乾電池 2個分と思えばよい。

この端子を出力ポート(=マイコン → 外部回路の輸出方向で使用)として設定し、ソフトウェアでこのポートの電圧の High/Low を切り替えることにより、LEDの点灯/消灯を制御するのだ。

https://www.raspberrypi.org/documentation/usage/gpio/README.md

GPIOのピン配置をプリントして手元に置いておかなければ!

って思ったけど、
GPIOのピン配置は Terminalで pinout コマンドを実行すると見られる。

(2) 接続

ジャンパー線(オス-メス)x 2本使い、ラズパイとブレッドボードを繋ぐ。
・1本目(赤色): Pin#11(GPIO17)- ブレッドボード(電源ライン)
・2本目(黒色): Pin#6(GND) - ブレッドボード(グラウンドライン)

5. まずは Python Shell上で練習

Raspberry Piの Piは Python の Pi
というルーツだそうなので、プログラミング言語 Pythonで書く。

Pythonは Python Shell上で 1行ずつコマンドを実行させることができる。
まとまったプログラムを書いて一気に実行するのではなく、まずは 1行ずつ実行して練習する。

(1) ターミナルを起動し、Python3を実行する。

python3

(2) 必要な Pythonモジュール(=パッケージ)を読み込む。

ラズパイの GPIOを制御してくれる Pythonモジュールはいろいろあるが、ここでは Raspbian OSに最初から入っている RPi.GPIO を使う。使用する度に「RPi.GPIO」と書くと長いので、alias(短い名前)として GPIOを宣言しておく。

import RPi.GPIO as GPIO

(3) GPIOを初期化する。

GPIO制御関数で制御対象のピンを指定する際に、ピン番号ではなく GPIO番号を指定することにする。
・ピン番号指定: GPIO.BOARD
・GPIO番号指定: GPIO.BCM

GPIO.setmode(GPIO.BCM)

GPIO17を出力ポートとして使用する。

GPIO.setup(17, GPIO.OUT)

(4) LEDを点灯 / 消灯する。

点灯する。(電圧 3.3V)

GPIO.output(17, GPIO.HIGH)

消灯する。(電圧 0V)

GPIO.output(17, GPIO.LOW)

まとめると…
たったの 5行の命令で LEDの点灯/消灯ができてしまった。

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
GPIO.output(17, GPIO.LOW)

ラズパイ公式ページでは、GPIO制御モジュールとして GPIO Zero が紹介されている。

これを使うともっと簡単に書けるようだけれども、過剰サービスと言うか、GPIOを隠しすぎている感じがしたので使わなかった。因みに上の 5行の命令を GPIO Zeroを使って書き換えると以下のようになる。

from gpiozero import LED
led = LED(17)
led.on()
led.off()

まぁ好みの問題だな…

6. LEDを点滅(=周期的に点灯/消灯)させる。

上の Python Shellで実行したものを周期的に実行させればよいだけ。

(1) まずは Python Shell上で実行

今回は、周期処理の実現手段として、プロセスをスリープ状態にさせる time.sleep() を使用する。

今度は RPi.GPIOは Aliasを使わずに書いてみる。
個人的には Aliasを使わない方が所属がわかって見やすいので好きだ。(case by caseだけれども…)

LEDの点灯消灯を 1秒間隔で 5回繰り返すプログラムを Python Shell上で書いてみる。

import RPi
import time

RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(17, RPi.GPIO.OUT)

for i in range(0,5):
    RPi.GPIO.output(17, RPi.GPIO.HIGH)
    time.sleep(1)
    RPi.GPIO.output(17, RPi.GPIO.LOW)
    time.sleep(1)

RPi.GPIO.cleanup()

LEDを点滅させることができた!

最後の
RPi.GPIO.cleanup()
では、このプログラムでセッティングした GPIOのパラメータをクリアしている。

(2) プログラムソースファイルに書いてシェルから実行

上記(1)のプログラムをテキストファイルに書く。
ここではラズパイ上の VIエディタで書いたが、テキストエディタなら何でもよい。

ターミナル上でこのプログラムを実行する。
python3コマンドの実行引数に、上で作成したプログラムファイルを指定すればよい。

python3 test23.py

できた!

7. 所感

ラズパイに期待した通り、とっても簡単な手順で GPIO経由で外部のデバイスを制御することが出来た。

でも…
とっても大切な部分が RPiモジュールに隠されていてブラックボックス感は否めない…

その辺りまで弄りたくなったらドライバを書けばよいのだ。
今回の目的は、マイコン制御を学ぶことではなく、I/Oポートの先に繋がっている電子工作物を動かすことだ。

よって

今はこれでよし!

と割り切る。

しかしとっても楽だ…
(12) LEDを点滅させる ではトランジスタとコンデンサと抵抗を組み合わせて LEDを点滅させた。
点滅周期を変えたければ容量の違うコンデンサを繋げたり、抵抗の大きさを変えたりしていた。

でも…
マイコンを使えば、LED点灯回路だけで点滅も出来てしまう。
ブレッドボード上のパーツ差し換えやノブ回転などをせずに、点滅周期を変えられてしまう。

電子回路を組み替えていろいろと制御しようとする気が失せてしまうくらいに楽だ…

だからソフトウェアがあちこちで使われるようになったのだなぁ

と改めて実感した。

参考情報

ありがとうございます。 m(_ _)m
https://qiita.com/masato/items/715e28e0c0c945a54297
https://tool-lab.com/make/raspberrypi-startup-22/

連載

Raspberry Piの初期設定から簡単な動作実験まで、以下はマイコン制御入門の連載です。
(21) 【連載1-1】マイコンで電子工作入門:選定
(22) 【連載1-2】マイコンで電子工作入門:ラズパイ初期設定
(23) 【連載1-3】マイコンで電子工作入門:LED点滅
(24) 【連載1-4】マイコンで電子工作入門:時報を作る ←次回
(26) 【連載1-5】マイコンで電子工作入門:サーボモーターを廻す
(27) 【連載1-6】マイコンで電子工作入門:合成音声で時報


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)