4 デジタル出力

今回の講義の目的は、マイコンボードの回路・ブレッドボードの回路について理解することと、先週少し触れたGPIOのデジタル出力の使い方をマスターすることです。

  • 4.1 マイクロコントローラの基礎
  • 4.2 デジタル信号・アナログ信号
  • 4.3 GPIO
  • 4.4 デジタル出力
  • 4.5 電圧・電流・抵抗を計測する
  • 4.6 実習

4.1 マイクロコントローラの基礎

まず、マイコンについて基本的なことを説明しておきます。マイコンは、一般に以下の写真のような見た目をしています。

写真のマイコンは、細長い形をしていて両側に足が出ていますが、形状はいろいろなものが存在します。多くの場合、黒いプラスティックのパッケージになっています。このプラスティックのパッケージの中に、マイコン本体が封入されています。よって、マイコン本体は、もっと小さなものです。

マイコンからは、ゲジゲジの足のようなものが出ています。これをピン(pin)、あるいは端子と呼びます。マイコンは、このピンを通じて電源供給を受けたり、他の部品と連携したりします。

Raspberry Pi に搭載されているマイコンは、以下の写真に示す場所にあります。

マイコンからは小さなピンが出ていますが、ものすごく小さくてプロトタイプを作る際には使いづらいことが多いです。そのため、マイコンボードは、ピンから配線を延ばして回路を作りやすい形状にしているのです。実際の製品にするときには、マイコンボードは使わずに、よりコンパクトな基板にすることが多いです。

Raspberry Pi 3 Model A+ に搭載されているマイコンは、Broadcom社のBCM2837B0です。BCM2837B0はクアッド(4)コア/クアッドスレッドです。

  • メモリ: 512MB
  • CPUクロック: 1.4GHz

マイクロコントローラには、メモリ、CPU、GPU、通信モジュールなどがセットになって入っています。こういうLSIを SoC (System On Chip) と呼びます。

4.2 デジタル信号・アナログ信号

電気の世界における信号とは、時間とともに変化する電圧によって情報を表すことです。デジタル信号とは、2つの電圧によって0と1を表現したもので、例えば、0Vが0で3.3Vが1のように表現します。

実際の電子回路では、1.5V未満なら0、1.5V以上なら1のように、ある閾値(しきいち)を定めて判断しています。閾値とは境界となる値のことで、この場合は1.5Vが閾値ということです。しかし、今は、そこまで意識する必要はありません。

アナログ信号の場合には、電圧の大きさで何かの大きさや量を表現します。例えば、部屋の明るさの場合には、光量を知りたいですよね。陽が昇れば徐々に明るくなり、陽が暮れれば徐々に暗くなります。夜中に電気をつければ突然明るくなったりもします。部屋の明るさを光センサを使って連続的に計測して電圧の変化に変換したもの、それがアナログ信号です。

4.3 GPIO

前回、Raspberry PiのGPIOについて簡単に説明しました。ここでは、デジタル入出力・アナログ入出力という観点からもう少し詳しく説明します。以下にGPIOのピン配置図を再掲します。

GPIO 0 から GPIO 27 までは、入出力に使える汎用的なピンであると前回説明しましたが、 Raspberry Pi の場合、これらの汎用的なピンはそのままではデジタル出力とデジタル入力しか行えません。今日のところは、デジタル出力について扱います。デジタル入力は来週のテーマです。

アナログ出力とアナログ入力を使用するためには、ひと工夫必要であったり配付した別の部品を使う必要があったりします。これらのことについては、あとの回で説明します。

ピン配置図をみると、 GPIO 2(SDA) のように番号の後ろにカッコ書きでキーワードが記されているピンがあります。これらは、汎用の入出力ピンであるとともに、特殊な役割を持ったピンということになります。特殊な役割についても今日は説明しません。ひとまず、そのようなピンもデジタル出力を行うGPIOとして使えると思って大丈夫です。

4.4 デジタル出力

前回に引き続き、GPIOを使ってLEDをプログラムから点灯させたり消灯させたりしてみましょう(点灯制御)。

以下の回路図のような回路を作って、Pythonのプログラムを実行すれば、LEDの点灯制御ができるのでした。まずは回路を組み立てて、先週のプログラムを実行してみましょう。(まだ終わっていない場合は、先に先週の実習を行う必要があります。)

ソース電流・シンク電流

先ほどの例では、 GPIO 17 をオン、すなわち3.3VにするとLEDが点灯しました。これを、ソース電流(source current)を使った接続と言います。LEDを点灯させるには、もう1つ方法があります。

3.3Vの電源は、 Raspberry Pi の1番ピンからとります。

こちらは、シンク電流(sink current)を使った接続と言います。電流の流れる向きに注意してください。この回路は、3.3V→抵抗→LED→GPIO 17という向きに電気が流れます。

LEDを点灯させるには、以下のようなプログラムを書きます。ファイル名は、led_chika02.pyにしましょう。

先週のled_chika01.pyとの違いが分かりづらいですが、以下の部分が違います。

LED(17)としたときには、active_high=Trueとなっています。このときにはonでピンに3.3Vかかります。active_high=Falseを指定すると、onで0V、offで3.3Vかかるようになります。(このことを Active Low とも言います。 On (Active) のとき 0V (Low) という意味です。)

GPIO 17に3.3Vかかっているときには、LEDの両端は0Vを基準として同じ3.3Vになります。このとき、この3.3Vを0Vを基準とした電位といいます。電位が同じ場所には電流は流れません。GPIO 17が0Vになると片方の電位は3.3V、もう片方の電位は0Vとなります。電位に差が生まれて電流が流れます。この差のことを電位差と呼びます。

LEDと電流

LEDの使い方は、意外と簡単だと思いませんか?しかし、それは、LEDの数が少ない場合です。複数のLEDを光らせるのは、結構難しいことなのです。GPIOのピンは、流せる電流の最大値が、1ピンあたり16mA、ボード全体で50mAと決まっています。この講義では、以下の制限を設けることにします。これを超えてLEDを繋いだ場合には、電流が供給できずにLEDが思ったように光らなかったり、場合によってはボード側の電力が不足してOSが再起動してしまったりする可能性があります。

  • 1つのデジタルピンで制御できるLEDは1つだけ(5mA)
  • マイコン全体に接続できるLEDは8個まで(5mA x 8個 = 合計40mA)

8個以上のLEDを制御したい場合には、LED用の外部電源(電池など)を用意する必要があります。これに関しては、途端に難しくなりますので、別の機会に説明します。

ただし、この制限は、LEDだけをRaspberry Piにつないでいるときの話です。他のデバイスが繋がっている場合には、それを含めて考えなければいけません。

なお、複数LEDがある場合には、リストを使って管理すると便利でしょう。

4.5 電圧・電流・抵抗を計測する

マルチメータの使い方

マルチメータ(multimeter)は、電子回路に関係した様々な計測器を1つの筐体にまとめたものです。一般的には、テスターという呼び名の方が通じやすいかもしれません。

製品によって、どのような計測が出来るかは、まちまちですが、普通は以下のようなことができます。

  • 電圧測定: 交流電圧(ACやACVと表記)と直流電圧(DCやDCVと表記)のどちらも測れます。
  • 抵抗測定: 抵抗器の大きさを測れます。
  • 通電テスト: 2点間に電流が流れるかどうかのテストができます。

その他に、電流測定ができたり、コンデンサ容量測定ができるものなどがあります。この講義では、電圧測定、抵抗測定、通電テストしか使いません。

大学で用意しているマルチメータは以下のような外見をしています。

赤と黒の2本の線がありますが、この線はリードと呼ばれます。赤いリードはプラス側、黒いリードはマイナス(グランド)側につなぎます。マルチメータとリードをつなぐときには場所と色に注意してください。

電圧測定と抵抗測定の際には、真ん中のダイアルをそれぞれの場所にすれば良いだけですが、通電テストの時には少し手順が違います。通電テストを行う時には、ダイアルを通電テストの場所に合わせ、さらにファンクションキーを押して液晶ディスプレイに音のマークが表示されるようにします。

それでは、導通テストの機能を使用して、ブレッドボードの穴同士の接続関係を確認しましょう。以下の図のように、硬くて短いワイヤの片側だけをブレッドボードに挿して、飛び出ているワイヤにリードを当てるとよいです。ワイヤの色は、何色でも構いません。

縦横、間隔が広いところ、溝の手前と奥のように、いろいろな場所で試して、どことどこがつながっていて、どことどこがつながっていないのかを確認してください。

マルチメータは使い終わったら必ず電源をoffにしておきます。←重要!

4.6 実習

実験1 マルチメータで抵抗値を図る

授業では330Ω、1KΩ、10KΩの3種類の抵抗器を配りました。マルチメータを抵抗を測るモードにして、3種類の抵抗器の値を測りましょう。測った結果を実験レポートで報告してください。330Ω、1KΩ、10KΩとは少し違った値になることもあります。誤差があるということです。近い値であればOKです。

実験2 マルチメータでLEDの順方向電圧降下を測定する

LEDの順方向電圧降下がどのくらいなのかを、マルチメータを使って実際に測定してみましょう。先週の実験1のLEDを常時点灯させる回路を使います。どことどこにリードを当てて測定すればよいかを考えて、予想と結果をレポートしてください。

また、抵抗の値を変えるとどうなるでしょうか?これも、予想と結果をレポートしてください。

実験3 シンク電流を使ってLEDを点滅させる

シンク電流を使って、1つのLEDを点滅させてみましょう。1番ピンを電源とします。先週の実験3で考えた点滅パターンを、シンク電流の回路で実現させてください。レポートには回路の配線がわかる写真とプログラムのコードを必ず示してください。

実験4 光りかたを予測する

先週のサンプルプログラムを少し変更した以下のプログラムを実行するとどうなるでしょうか。予想と結果をまとめてうえで、なぜそうなるのかを考察してください。

実験5 LEDを使って4ビットまでの2進数を表現する

変数xに正の整数が代入されているとしましょう。xを2進数で表現した際のビット列をLEDの点灯消灯で表してみましょう。今、LEDは4つしかありませんから、整数は0から15までしか表現できません。xに代入されている値が16以上の場合には、下位4ビットだけ使うことにします。

x = 5 の場合を考えてみましょう。5を2進表現すると0101です。0101が2進表現であることを明示するために0b0101と書くことにしましょう。この時は、左から2番目と4番目のLEDを点灯させ、1番目と3番目のLEDは消灯させます。

x = 25 の場合を考えてみましょう。25を2進表現すると0b11001です。この場合には、下位4ビットを使いますから、1001の部分だけをLEDで表現します。左から1番目と4番目のLEDを点灯させ、他の2つは消灯させます。

最初は変数xに固定の値が入っているものとして、プログラムを書き換えていろいろと変数xの値を変えながら試してみましょう。それができたら、0.5秒おきに、変数xの値が増えてLEDの光りかたも変わるというようにしてください。ビット数は違いますが、参考動画を示します。

実験5の参考動画

さらにそれができたら、関数を作ってプログラムを分割して、見通しのよいプログラムに変えてみましょう。いまはまだたいしたことをしていないですが、このさきどんどんプログラムが複雑になるので、関数を使って処理を小分けにして整理しておくとやりやすいです。例えば、引数で指定した数値の2進数のとおりにLEDを光らせる関数bin_led()などを作るとよいでしょう。

10の2進数表現を光らせたい場合に、この関数を呼び出す時には、以下のようにするということです。

— by 飯田 周作、沼 晃介、石井 健太郎 専修大学ネットワーク情報学部