対象読者
IoTに興味があり、電子工作とJavaScriptの基本的な知識がある方を対象とします。電子工作のごく初歩的な説明は割愛しているので、「ラズベリーパイをつかったセンサープログラミング超入門」の記事なども併せて参照してください。
はじめに
前回の連載「Tessel 2ではじめるお手軽IoT」では、ワンボードマイコンTessel 2に、専用の気候センサーモジュールやUSBカメラを接続する方法を紹介しました。この連載では、そのような専用のハードウェアモジュールではなく、ブレッドボードと呼ばれる基板を使ってTessel 2にセンサーを接続してみます。第1回は、LEDとタクトスイッチの接続です。
Tessel 2のGPIO
Tessel 2の本体には、ハードウェアモジュール拡張用に2つのポート(10pin)がついています。実はこのポート、いわゆるGPIO(General Purpose Input/Output、汎用入出力)ポートになっているので、専用のモジュールを接続するだけでなく、汎用的に利用することができます。GPIOはソフトウェアによって信号の入力や出力に利用することができる端子で、Tessel 2でもソフトウェアで制御可能です。
ピンの構成
ポートAは、次のようなピンの構成になっています。
10ピン端子のうち2つは+3.3Vの電源とGNDで、残りの8つは全てデジタルのIOポートとして利用できます。
デジタルのIOポートとは、その端子で2つの値(High/Low)の出力、入力の制御ができるという意味です。GPIOの場合、このHigh/Lowは電圧で決まります。ある値以上の電圧ならHigh、それ以下であればLowということです。
また、電圧のアナログ入力や、割り込み(interrupt)用の入力端子としても利用可能なものがあります。これらの端子については、この連載の中で別途説明します。その他の端子の詳細については、公式のドキュメント内にあるハードウェアAPIの項目を参照してください。
LEDの点灯
まずは、GPIOの出力を使って、LEDを点灯させてみましょう。
LEDとは
日常生活においてもおなじみとなったLED(発光ダイオード)は、ダイオードと呼ばれる素子の一種で、電圧を加えると発光する半導体素子です。
LEDには極性があり、足の長いほうのアノード(プラス)からカソード(マイナス)に対して電圧を加えるようにします。ただし、電圧が規定より低い場合はあまり電流が流れず、発光もしません。LEDは、規定のある電圧を超えると急激に電流が流れるようになり、電流量に応じた強さで光るようになります。この規定の電圧のことを、順方向電圧(VF)と呼びます。
順方向電圧と順方向電流
順方向電圧はLEDの種類によって変わり、赤や黄色などは2V程度、白や青などは3.5Vぐらいが一般的です。また、順方向電流とはLEDに流れる電流のことで、LEDによって流すことのできる最大の電流値が定められています。規定以上の電流を流し続けるとLEDが破損してしまうため、LEDの回路ではLEDに流れる電流を制限する必要があります。
電流制限抵抗
Tessel 2のGPIOでは、端子をHighにした場合、3.3Vの電圧が出力されます。これを利用してLEDを点灯させてみましょう。ただし、GPIOの出力を直接LEDに接続すると電流が流れ過ぎるので、何らかの方法で電流を制限する必要があります。今回はLEDに対して直列に抵抗を接続することで、電流を制限するようにしました。この抵抗のことを電流制限抵抗といい、オームの法則を使って次のような式で求められます。
電流制限抵抗(Ω)=( 電源電圧(V)- 順方向電圧(V))/ 順方向電流(A)
順方向電流は、LEDの最大許容電流以下になるようにします。ただし、GPIO自体も制限なく電流を流すことはできません。Tessel 2では、どこまで許容されるか不明ですが、10mA以下に制限すればいいでしょう。なお、この10mAは一般的なLEDの最大許容電流よりも小さな値です。そのため、GPIOの出力をそのまま利用した場合は、LEDによってはあまり明るく光りません。
ここでは、ごく普通の赤色LEDを想定して、順方向電圧を2Vで計算してみます。
(3.3V - 2V)/ 10mA * 0.001 = 130Ω
したがって、130Ω程度以上の抵抗を接続すれば良いことになります。
回路図
手持ちのパーツに130Ωの抵抗がなかったので、今回は次の回路図のように200Ωの抵抗を使いました。この場合は、オームの法則で計算すると、1.3V/200Ω=6.5mA程度の電流が流れることになります。
ポートAの0番ピンを、抵抗とLEDに接続します。実際のブレッドボードとTessel 2との接続は、次のようになります。
Tessel 2のピンとブレッドボード間は、両端がオスのジャンパーコードで接続します。
ブレッドボードの両端にあるプラスマイナスの穴は、内部で横方向(前述の図の向きで)につながっていて、通常電源に接続します。中央の穴は縦方向につながっていて、ここに電子パーツを配置します。
GPIOを制御する
次にGPIOを制御するコードを書いてみましょう。最初にt2 initコマンドで、ひな形を作成しておきます。そして作成されたindex.jsを、次のように書き換えます。これは、0.5秒ごとにLEDが点滅するサンプルコードです。
const tessel = require('tessel'); // ポートAの0番ピンのオブジェクト(1) const pin = tessel.port.A.pin[0]; let v = 0; pin.output(v); // ポートをoffにする(2) setInterval(function () { v = v ^ 1; // 1と0を交互に求める(3) pin.output(v); }, 500);
tesselモジュールには、GPIOにアクセスするためのライブラリが含まれているので、コードもシンプルに記述することができます。ピンに対応するオブジェクトは、ピン番号での配列になっていて、ここでは0番ピンを指定しています(1)。ピンのオブジェクトのoutputメソッドで、GPIOの出力値を設定します(2)。outputメソッドの引数に0または1を設定することで、High/Lowが切り替えられます。ここでは初期値0を1とXORすることで、0.5秒ごとに0と1の値を交互に取得し(3)、設定することで、LEDの点灯のON/OFFを行っています。