Raspberry Piで7セグメントLEDを簡単に点灯させよう (1) LEDの点灯方法

LEDの点灯方法には二通りある

 マイコンを使ってLEDを1個点灯させるには、2通りの接続方法があります。

  • 電流吸い出し型 (ソース)
  • 電流吸い込み型 (シンク)



電流吸い出し型

 ラズパイにはいずれのモデル(初期型を除く。今、入手はできない)にも、GPIOと呼ばれる40ピンのI/O端子が用意されています。図のように、同じピンに複数の名称が付けられているので、最初はわかりずらいです。中央部分のPin#が物理的なピン番号ですが、プログラミングにはこの番号はあまり使われません。よく使われるのが、外側に書かれているGPIOxxという名称です。

 プリント基板の裏側を見ると、1か所だけ、はんだ付けするパターンであるランドの形状が四角形です。ほかは丸いですね。四角形は、一般に1番ピンだということを示しています。全部丸い形状のランドばかりのプリント基板を見ることもあります。下の図は、プリント基板の表面から見た配置です。

 実験に使うGPIOのピンはどれでもよいのですが、ここではGPIO17を使います。

 LED(LED1)と電流制限抵抗(R1)を物理的なピン番号の11番=GPIO17につなぎます。電流吸い出し型の接続では、LEDの電流はマイコンのGPIO17から流れ出すと点灯します。したがって、GPIO17がHigh(1)のときに点灯します。ラズパイのマイコンは3.3Vで動いているので、High=3.3VがGPIO17に出ます。したがって、電流制限用抵抗に330Ωを直列に入れ、赤色のLEDの順方向電圧が1.7Vであれば、電流はオームの法則から、次の電流が流れます。

  電流 = (3.3-1.7) / 330 = 4.8mA

 GND=グラウンド・ピンはたくさんあるので、GPIO17に近いところを選んで配線します。LEDは、アノードは回路上の電圧が高いほうにつながります。アノードは足が長いほうです。逆にカソードは電位が低いのほう、ここではグラウンドなので、0Vにつながります。通常、グラウンドは0Vです。

 上の図のブレッドボードには、+3.3Vを配線しています。この回路では利用していません。ブレッドボードの両端には、赤色と青色のラインが引かれています。赤色は+の記号、青色はーの記号が印刷されています。今回のように単一電源(+3.3VとGNDの一組という表現)を使うときは、赤色に+の電源、青色のどこかにGNDをつないでおきます。

 回路の規模が大きいときは、両端の赤色同士、青色同士をジャンパ・ワイヤで最初から接続していると、全体の配線がしやすくなります。

 アナログ回路のようにプラス、マイナス、GNDの2電源が必要なときは、両端にある電源ラインをうまく振り分けます。

 プラスの電源は赤色のジャンパ・ワイヤ、GNDは黒色のジャンパ・ワイヤを使う習慣をつけておくと、勘違いをなくせます。配線を確認する際も、赤色がGNDにつながっていると、直感的にミスを見つけられます。

コラム 40ピンもあるのだからどこを使ってもいいでしょう

 ラズパイの利用では、センサなどをつなぐときに、I2CとSPIと呼ばれるシリアル通信を利用します。なので、最初からそれらのピンを避けておきます。I2Cは3,5番です。SPIは19、21、23、24、26番です。調歩同期式と呼ばれるシリアル通信UARTは8、10番ピンです。いずれも物理的ピン番号です。

 27~40番までは、初期モデルに存在しなかったので、古い解説書の使用例で登場しなかったため、みんなが使っていないというのが現実です。

電流吸い込み型

 GPIO17がLow(0)のときにLEDが点灯します。

 ラズパイでは、どちらの接続でもかまいません。どちら向きに電流が流れても5mA程度はI/Oポートの規格内です。プリント基板の実装では電源やグラウンドの引き回しなどでレイアウト上メリットの大きいほうが使われます。最近のICではどちらの方法でも同じくらいの電流を流せます。

 gpioコマンドを使って確かめます。電流吸い出し型で配線しました。

gpio -g mode 17 out #GPIO17 を出力に設定する
gpio -g write 17 1  #GPIO17に1=Highを出力する

 -gはBCMという名称でピンを指定するスイッチです。-gを省略するとWiringpiのピン番号の呼び方になります。Wiringpiは、ここで使っているソフトウェアの名称です。gpioコマンドの説明を参照してください。

プログラムでコントロールする

 PythonのプログラムでLEDチカを書きます。

 テキスト・エディタを起動します。

 エディタにプログラムを入れて、保存します。

 プログラムです。インデントはないです。文頭から書き始めます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wiringpi
import time

# initialize
wiringpi.wiringPiSetupGpio()
GPIO17 = 17

OUTPUT = 1
LOW = 0
HIGH = 1

# initialization
print("Initialization...")
wiringpi.pinMode(GPIO17, OUTPUT)

#main
print(" LED ON")
wiringpi.digitalWrite(GPIO17, HIGH)
time.sleep(5)
print(" LED OFF")
wiringpi.digitalWrite(GPIO17, LOW)
print("done")

 LEDchika.pyという名前で保存します。実行できるようにchmodでファイルの属性を変更し、ルート権限で実行します。

 5秒間LEDが点灯した後消えます。

●7セグメントLEDの中にはLEDが8個入っている

 7セグメントLEDには、LEDが8個入っています。大型だとLEDが1セグメント当たり複数個使われていることもあります。

 配線しやすいように、LEDの極性のどちらかをまとめてしまった製品がほとんどです。まとめ方で、アノード・コモンとカソード・コモンの2種類があります。コモンとは共通という意味で、LEDのどちらかの端子が共通=つながっている状態を表します。

 外形は同じなので、購入後は混じらないように管理します。

 アノード・コモンの接続です。

 カソード・コモンの接続です。数字はピン番号です。a、b、c...は、LEDの光る場所(セグメント)を示しています。

 1番ピンは、表示面からみて、dp(ドット)を右下に見えるようにしたとき、下段の左端が1ピンです。反時計回りにピン番号が振られています。ピンのリード線は裏側に隠れています。

  数字の”1”を表示するには、b、cの二つのLEDを点灯します。

  数字の”7”であれば、a、b、cの三つのLEDを点灯すればいいですね。

 プログラムで、1と7を交互に表示させるには、b、cは点灯のまま、aをブリンクさせると実現できます。

数字以外も表示できる

 点灯するLEDの場所(セグメント)によって、A、b、C、d、E、Fも表現できるので、7セグメントLEDは16進表示もできます。セグメントgだけだとマイナスになりますね。dpは小数点を表現できます。

 このように、任意の数字や特定の文字を表示するためには、ラズパイとすべてのセグメントを配線しなければなりません。配線数は9本+コモンの10本です。配線数が多いので、間違えそうですね。さらに、ラズパイのGPIO端子をたくさん使ってしまいますし、一つのLEDセグメント1個につき1本の電流制限抵抗も必要なので、できれば、もっと少ない配線で何とかならないかと考えます。

 温度なら2桁、電圧の表示なら4桁がほしいです。桁というのは7セグメントLEDを1個と数えます。2桁以上になると、GPIOピンからそれぞれ配線していてはピン数が足りません。配線は大変ですし、プログラムも扱うI/Oが多くて間違える確率は高いです。

シリアル通信が主流

 前半でもI2C、SPIというシリアル通信の名称が出てきました。I2Cは2本の信号線で数十個のセンサや表示デバイスをつなげられます。SPIは3本の信号線で通信を行い、ラズパイではデバイスを選択する信号がGPIOに2本出ています。

 PCが最初に世の中に出てきたとき、プリンタをつなげるI/Oとして50ピンのコネクタが使われました。今はありません。拡張ボードを挿すスロットはPCIバスと呼ばれますが、最初はパラレル・バスでしたが、今はシリアル・バスに変わっています。周辺機器をつなげるUSBもシリアル・バスです。信号線が2本とあとは電源です。

 このように、シリアルが主流になっています。7セグメントLEDもシリアルでデータをコントロールできれば、配線がきっと楽になります。

コラム GPIOをコントロールするPythonライブラリをインストール

 Arduinoライクな命令が利用できるWiringPiがあります。GPIOをC言語で制御する際に便利に使えます。このPython版をインストールします。

 ソースが置いてあるサイトに移動します。下方にある説明を読みます。githubは、プログラムを開発するときに、プログラムを保存するサーバを置いているサイトです。複数の開発者がソース・プログラムを更新作業する際にトラブルがないように調停してくれる機能があります。

https://github.com/WiringPi/WiringPi-Python

 Quick Buildに書かれている3行を実行するとswing2がないというエラーが出ます。swing2をインストールします。

sudo apt-get install python-dev python-setuptools swig


 そのあと、Quick Buildの3行を実行します。

git clone --recursive https://github.com/WiringPi/WiringPi-Python.git
cd WiringPi-Python
./build.sh

コラム 7セグメントLEDのリード線

 昔のピンは左右にリードが並んでいました。

 最近は上下のピン配置になった製品も増えています。