はじめに
この文書では,RPiCarに備わるヘッドライトおよびテールライトを点灯・消灯させるプログラムを取り上げます.
環境
- OS: Raspberry Pi OS Bulleyes
- Java: OpenSDK Version 11
- GPIO Controller: Pi4J Version 2.2
- プログラミングを行うパソコン: Ubuntu 20.2
- IDE: Visial Studio Code Version 1.72.2
なお,すでに開発環境であるVisual Studio Code を使ってリモート開発ができる状態であることを前提としています.また,ファームウェアをダウンロードしていることを前提にしています.もしまだダウンロードをしていないようであれば,こちらにある記事を見て行ってください.
ヘッドライトとテールライト
ヘッドライトには2個の白色LED,テールライトにはブレーキライトとして2個の赤色LED,ウィンカとして2個の黄色LED,バックライトとして2個の白色LEDがあります.ウィンカ以外は2個とも同じ動作,すなわち点灯もしくは消灯をします.ウィンカのみ左右で異なる動きをするようになっています.
下にLedに関するクラスをまとめた図を示します.スーパクラスとしてLightクラスがあり,点灯(turnOn)と消灯(turnOff)するメソッドがあります.また,コンストラクタはprotectedであり,かつピン番号(pin_num)を仮引数として持つようになっています.これにより,サブクラスでも同様にピン番号を仮引数でも持つようになります.このように,サブクラス側で渡されたピン番号に対して点灯の命令,消灯の命令をLightクラス内で行う作りとなっています.
そのサブクラスのはHeadLight(ヘッドライト),BackLight(バックライト),BrakeLight(ブレーキライト),DirectionIndicator(ウィンカ)クラスがあります.さらにDirectionIndicatorにはサブクラスとしてRightDirectionIndicator(右ウィンカ)とLeftDirectionIndicator(ウィンカ)があります.末端に位置するいずれのクラスもシングルトンになっています.すなわち,コンストラクタがプライベート,staticでprivateなインスタンス(_instance),そのインスタンスを得るためのstaticなメソッド(getInstance)があります.同様に,末端に位置するいずれのクラスもstaticな定数_PIN_NUMがあります.この定数にはRaspberry Piに備わる端子番号が書かれており,コンストラクタでスーパクラスのコンストラクタへ端子番号を送ります.
DirectionIndicatorクラスは少し特徴的です.それは間欠に点灯と消灯を行う,いわゆるウィンクさせるためのメソッドとしてstartBlinkingがあります.このメソッドを呼び出すと,250ms間隔で点灯と消灯を繰り返します.stopBlinkingメソッドにより消灯させることができます.また,shutdownメソッドがDirectionIndicatorクラスにはあり,これをプログラムの最後に呼び出すと確実に停止させることができます.その結果としてプログラムが確実に止まるようになっています.
動作例
では実際に動作せてみましょう.そのためにはまずVS Codeを立ち上げ,プロジェクトフォルダを開きます.そして,Main.javaを開いてください.下の図はMain.javaを開いている様子です.
ヘッドライト
まずはヘッドライトを制御しましょう.ヘッドライトを制御するにはHeadLightクラスにあるturnOnメソッドとturnOffメソッドを使えばよさそうです.このクラスはシングルトンになっているので,getInstanceメソッドでインスタンスを取得したのち,turnOn/turnOffメソッドを呼び出しましょう.今回は10回,点灯と消灯を繰り返すようにしてみます.それには以下のようなプログラムになります.
public static void main(String[] args) throws Exception { for(int i=0; i<10; i++){ HeadLight.getInstance().turnOn(); Thread.sleep(1000); HeadLight.getInstance().turnOff(); Thread.sleep(1000); } Pi4J.newAutoContext().shutdown(); }
ではビルドします.ビルドするには下の図のようにinstallの右にある再生ボタンを押します.
その後,実行します.実行するにはターミナルにmvn antrun:cと打ち込みます.
どうでしょうか.ヘッドライトは光りましたか?
右ウィンカ
次に右ウィンカを動かしてみましょう.ウィンカの場合にもturnOn/turnOffメソッドを使えますが,基本的にウィンカは点滅するのが普通ですよね.そのためにあらかじめstartBlinking/stopBlinkingメソッドを用意しておきました.これらを使えば自分で点灯と消灯をする処理を書かなくても大丈夫です.今回は5秒間動作させ,終了するようなプログラムを書いてみましょう.下のようになります.最後のほうにRightDirectionIndicatorのshutdownメソッドを呼び出しています.これでプログラムが確実に終了されます.反対にこれがないといつまでたっても終了しないかと思います.その理由は,このクラス内部にあるThreadのためです.shutdownメソッドを呼び出すと内部のThreadを終わらせることができるようになっており,それなしにプログラムを終了しようとしてもまだThreadが動いているため,プログラム全体としてまだ停止してはいない状態になります.ということで刈らなず最後にshutdownを呼び出してください.なお,もし呼び出さずに止まらなくなってしまった場合にはCtrl+Cで強制終了してください.
public static void main(String[] args){ RightDirectionIndicator r = RightDirectionIndicator.getInstance(); r.startBlinking(); Thread.sleep(5000); r.stopBlinking(); r.shutdown(); Pi4J.newAutoContext().shutdown(); }