この文書では,小型センサロガーに備わるLEDをRaspberry Pi zero(RPi)で点灯と消灯をさせるプログラムの作成方法について説明しています.
回路構成
LEDにはアノードとカソードがあります(下図).一般的にリード(針金)が長いほうがアノード,短いほうがカソードです.アノードに電圧の高いほうを,カソードに電圧の低いほうを接続するとLEDは点灯します.今回の回路では,アノードには抵抗器を挟んで3.3[V]がつながっており,カソードにはRPiの38番端子が接続されています.従って,38番端子を出力端子にしてLow(=0[V])にすればLEDが点灯し,反対にHigh(=3.3[V])にすると電位差が発生しないため電流が流れず消灯します.なお,こちらにある回路図も参照してください.
プログラム
ではプログラムでLEDを点灯および消灯させてみましょう.Pi4JによりRPiの端子を操作するのは初めてなので,なるべく詳しく説明していきます.なお,RemoteVMを用いてeclipseによる開発をパソコン上で行うこととしますので,RemoteVMのインストールと設定をしておいてください.また,RPiにPi4Jのインストールと初期設定を行っておいてください.
まず新たに開発用パソコンでeclipseによりJavaプロジェクトを新規作成します.このとき,Pi4Jライブラリを使用するのでプロジェクトにそれを追加する必要があります.プロジェクトの作成とPi4Jライブラリの追加方法はこちらをご覧ください.今回作成するプロジェクトは「TurnOnOffLED」です.先ほど示したプロジェクトの新規作成例と同じになっています.下図はPi4JライブラリとRemoteVMクライアントライブラリが追加されている様子を示します.なお,これらのライブラリがビルドバスに追加されています.
では新しくJavaコードを追加しましょう.下の図のようにsrcフォルダを右クリックし,新規⇒クラスを選択します.
ここではクラス名をLedとします.また,パッケージ名をjp.ac.nagano_nct.ashida_lab.sensor_loggerとします.
新たに作成されたLedクラスは下のようになります.
このクラスにmainメソッドを追加していきます.下記のようにします.今回,InterruptedExceptionがthrows句に追加されています.これは後ほど用いるThreadクラスのsleepメソッドから発生しうる例外に対応するためです.
public static void main(String[] args) throws InterruptedException{ }
次にGpioFactoryクラスよりGpioControllerのインスタンスgpioを得ます.このようにGpioControllerクラスのインスタンスはnewを使わずにGpioFactoryクラスのスタティックなメソッドgetInstanceを用います.
final GpioController gpio = GpioFactory.getInstance();
次に38番ピンに接続された端子をディジタル出力端子としてインスタンスを得ます.それにはgpioのメソッドであるprovisionDigitalOutputPinを用います.このメソッドは,Pi4Jで定義されたピン番号,ピンの説明をする文字列,初期状態を引数に持ちます.LEDのカソードが接続された38番ピンはこちらの表にあるように,Pi4JではGPIO_28と定義されていますので,第一引数はこれにします.Pi4JのピンはRaspiPinクラスにstatic finalとして定義されていますので,RaspiPin.GPIO_28となります.ピンの説明をする文字列は何でも良いのでここではMyLEDとしました.最後に初期状態をHighに指定するにはPinStateクラスに定義されたHIGHを用います.以上のことを踏まえると,下に示すプログラムになります.
final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, "MyLED", PinState.HIGH);
LEDを制御できるインスタンスpinを得ましたので,このメソッドを使ってLEDを制御します.今回作成するプログラムでは,点灯→2秒待つ→消灯→2秒待つ→点灯→2秒待つ→消灯とします.点灯もしくは消灯をさせるにはいくつかのメソッドがGpioPinDigitalOutputクラスに用意されていますが,その中でsetStateメソッドを今回は使用します.例えばLowを出力するには下記のようになります.引数にPinState.LOWを入れることでLowを出力できます.
pin.setState(PinState.LOW);
n秒間待つにはThreadクラスのsleepメソッドを用います.例えば2[s]=2000[ms]待つには下記のようになります.
Thread.sleep(2000);
ピンの操作を終了しましたら,Pi4Jではshutdownを行います.下に示すプログラムを最後に追加してください.
gpio.shutdown();
まとめますと下記のようなプログラムになります.
package jp.ac.nagano_nct.ashida_lab.sensor_logger; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; public class Led { public static void main(String[] args) throws InterruptedException { /* GPIOコントローラのインスタンスを得る */ final GpioController gpio = GpioFactory.getInstance(); /* LEDのアノードと接続されているピンのインスタンスを得る */ final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, "MyLED", PinState.HIGH); /* 点灯する */ pin.setState(PinState.LOW); /* 2秒待つ */ Thread.sleep(2000); /* 消灯する */ pin.setState(PinState.HIGH); /* 2秒待つ */ Thread.sleep(2000); /* 点灯する */ pin.setState(PinState.LOW); /* 2秒待つ */ Thread.sleep(2000); /* 消灯する */ pin.setState(PinState.HIGH); /* すべての操作を終了したのでシャットダウンする */ gpio.shutdown(); } }
以上のプログラムができましたら実行を行います.Raspberry Pi上でRemoteVMサーバを動作させたうえで,RemoteVM下で実行するにはこちらをご覧ください.