Raspberry Pi+Spring Boot + Pi4J で 信号機 WebAPI を簡単に作成してみる

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Qiita初投稿です :smile:
よろしくお願いいたします :bow:

ひょんなきっかけでRaspberry Pi2(以下、ラズパイ)を購入したので「超入門」してみました。ラズパイはプログラミング言語にPythonを推奨しているようですが、あえてのJavaでさらにWebAPIを簡単に作るためにSpringBootを使ってみましたので共有できればと思います。

必要なもの

ラズパイと電子回路が必要です。OSは「Raspbian」を推奨します。「NOOBS」を利用すれば簡単にインストールできます。すべてAmazonでパーツをそろえましたが1万円以内で揃いました。

  • Raspberry Pi2 Model B (初めての方の場合はおすすめです)

    • ACアダプター(電源用:5V2A)
    • microUSBケーブル(電源用)
    • microSDカード(class10・8GB)
    • LANケーブル
    • USBキーボード・マウス
    • 液晶テレビ or 液晶ディスプレイ
    • HDMIケーブル
  • 電子回路

    • ブレッドボード
    • LED:3色(赤・黄・緑)
    • 抵抗(270Ω)
    • ジャンパーピン
  • OS

Pi4J とは

http://pi4j.com/
簡単に説明するとJava言語でRaspberryPiのI/O機能にアクセスするための実装ライブラリーを提供するOSSプロジェクトです。後に記述しますソースコードを見れば一目瞭然ですが、かなりライブラリが頑張ってくれます。

Pi4J から GPIO を制御する

Pi4Jを使ってGPIOを制御する場合に少し前提知識がいります。というのもRasberryPiが提供しているGPIOピンのマッピングと、Pi4Jで扱うGPIOピンのマッピングが若干違うからです。

http://pi4j.com/pins/model-2b-rev1.html

具体的にどういうことかというと「GPIO02」を操作したいと思って以下のコードを記述すると

Sample.java
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, "MyLED", PinState.HIGH) 

Raspberry Pi 上では「GPIO27」を操作することになってますのでハマらないように :sweat_drops:

(まだ編集中ですが)自分でマッピング表を作ってみたので、そちらも参照いただけると幸いです。ラズパイのプルアップ・プルダウンの状態や、抵抗の大きさについても記載していますが、この図を見ればなるほどそういうことかというのがわかると思います。

https://drive.google.com/open?id=15hzg1fWRkQKuPCRUUOyhkHw-qXyGv7J_h5MYUcQ6KlU

Pi2 GPIO.jpg

回路図

3色のLEDを光らせるのに必要な配線は以下の通りになります。回路図を作成するツールに「fritzing」を利用させていただきました。
無題.png

Spring Bootを使ったWebAPI作成

Pi4Jのおかげで記述するコード量はかなり少なくなります。

pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.pi4j</groupId>
            <artifactId>pi4j-core</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
TrafficLightController.java
import com.pi4j.io.gpio.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TrafficLightController {

    private GpioController gpio;

    private GpioPinDigitalOutput pinRed;
    private GpioPinDigitalOutput pinYellow;
    private GpioPinDigitalOutput pinGreen;

    /**
     * GPIOピン初期化処理
     */
    private void initialize() {
        if (gpio == null) {
            gpio = GpioFactory.getInstance();
            pinGreen = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_27, "GreenLED", PinState.LOW);
            pinYellow = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, "YellowLED", PinState.LOW);
            pinRed = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_29, "RedLED", PinState.LOW);
        }

        pinGreen.low();
        pinYellow.low();
        pinRed.low();
    }

    /**
     * 全灯:緑・黄・赤
     */
    @RequestMapping("/")
    public void all() {
        initialize();
        pinRed.high();
        pinYellow.high();
        pinGreen.high();
    }

    /**
     * 点灯:緑
     */
    @RequestMapping("/green")
    public void green() {
        initialize();
        pinGreen.high();
    }

    /**
     * 点灯:黄
     */
    @RequestMapping("/yellow")
    public void yellow() {
        initialize();
        pinYellow.high();
    }

    /**
     * 点灯:赤
     */
    @RequestMapping("/red")
    public void red() {
        initialize();
        pinRed.high();
    }

}

生成されたJarファイルをアップロードしてSpring Boot起動

作成されたjarファイルをラズパイ上に載せて起動します。piユーザーでログインしていると思いますので、sudoを付けて実行するのがポイントです。

$ sudo java -jar trafficlight-0.0.1-SNAPSHOT.jar

起動後、以下のURL (リモートであれば192.168…:8080など) をたたくと光ります。

最後に

これだけ簡単に信号機のWebAPIさえ作ることができれば、JenkinsのAPIをたたいてステータスを取得してLEDで表現したり、業務で利用しているメールのアラートを表現したり・・・などやりたいことが増えますね。

超入門で恐縮ですが、私の記事で入門する方が増えていくことを期待しています :kissing_closed_eyes: