3DプリンターでLチカ
2017/07/26
  • このエントリーをはてなブックマークに追加

Lチカがしたいです

はじめまして カブクのJenkinsおじさん 大橋です。
普段はKabuku MMSというサービスの開発をしたり、Jenkinsおじさんしたり、3Dプリンターを直したりしています。

ところでLチカしたいですね!
夏になるとLチカしたくなりますよね
でも手元にあるのはオフィスの棚で見つけたRaspberry Piだけです。LEDがありません。
でも弊社には3Dプリンター(Ultimaker3)があります。そして3DプリンターにはLEDがついています。
そこで今回はRaspberry Piと3DプリンターでLチカしてみたいと思います。

用意するもの

  • Raspberry Pi (なんのモデルでもおk)
    • 下記のUltimaker3と同一ネットワークに接続してください。
  • 3Dプリンター
    • 弊社ではUltimaker3という3Dプリンターを使っています。
      • 今回の記事におけるFirmwareは 3.6.2.20170322 です。

Ultimaker3のAPIとLED制御

Ultimaker3にはネットワーク経由でUltimaker3を制御するためのREST APIがあります。
REST APIのドキュメントはSwagger形式で記述されており、以下のURLで参照できます。
http://{Ultimaker3のIPアドレス}/docs/api



このドキュメントはSwagger UIと呼ばれるもので、このドキュメント上から直接APIを叩くことが出来ます。
なおSwagger JSONは以下から取得できます。
http://{Ultimaker3のIPアドレス}/docs/api/api_documentation.json
もし手元にUltimaker3がなくてドキュメントだけ見たい場合は、以下から参照ができます。

http://software.ultimaker.com/jedi/api/

ただし、Ultimaker3のファームウェアによってAPIが若干違うので、可能であれば実機のドキュメントを参照してください。
※今回Swaggerについての詳細は記述しません。

APIの認証方式

APIの認証方式は2段階あります。

  1. ultimaker3へハードウェア上での認証を利用してユーザ名を登録し、ID/KEYを取得
  2. ID/KEYを利用してHTTP Digest認証
なおUltimeker3のステータスや、現在のプリント状況の取得など、Ultimaker3から情報を取得するAPIを叩く場合は、1. のみ必要で、2.のHTTP Digest認証は必要ありません。
手順については後ほど詳しく記載します。

Ultimaker3のLED API

上記のSwagger UIの中に Printer > /printer/led/printer/led/blink というAPIがあり、これらがLED制御に関するAPIです。
/printer/led は現在のLED設定の取得と更新が行なえます。
LEDの情報はJSON形式の色情報(HSV値)で取得/更新することが出来ます。
なお現在、弊社のUltimaker3のfirmwareでは若干このSwaggerの記述に誤りがあり、
ドキュメント上では、valueというプロパティがありますが、実際にはbrightnessになります。

  • LED APIのパラメータ
    • hue
      • HSV色空間のHue(色相)の値 0~254の数値
    • saturation
      • HSV色空間のSaturation(彩度)の値 0-100の数値
    • brightness
      • HSV色空間のbrighness(明度)の値 0-100の数値
        swagger定義上はvalueになっているが実際はbrightness

GETメソッドにより値を取得、PUTメソッドにより値を更新できます。
注意点として、ハードウェア上で明るさやLEDのON/OFFを設定している場合、そちらの設定が勝ち、
更新を行っても反映はされるが、LEDがつかなかったり、実際の明度よりかも落ちた状態で点灯します。

/printer/led/blinkはLEDを点滅することができます。
このAPIには周波数(frequency)と点滅回数(count)を設定でき、それにより点滅する長さと、間隔を設定できます。

  • Blink APIのパラメータ
    • frequency
      • 周波数(hz)
    • count
      • 点滅回数

なお色については上記のLED APIで設定された値が利用されます。
今回の記事中ではこのAPIは扱いません。

LED APIを叩いてみる

では実際にLED APIを叩いていきたいと思います。

Swagger UI

まずは簡単に試すことができるSwagger UI上から以下の手順で実施していきます。
  1. 認証
    1. ユーザ登録 & ハードウェア認証
      • Digest認証は実際にAPIを叩く際に行います。
  2. LED API
    1. 現在のLED設定を取得
    2. Lチカ

認証(ユーザ登録 &ハードウェア認証)

ユーザ登録とハードウェア認証を行うにはAuthenticationにあるPOST /auth/request APIを利用します。
applicationuser input formに任意の値を入れて、Try it outボタンをクリックします。


すると、APIよりidkeyが返却されます。
これらの値は後でDigest認証を行う際に利用しますので、どこかにメモしておいてください。

またUltimaker3上で以下のようにAPIアクセスをしても良いかの確認が表示されますので、ALLOWを選択、決定してください。


これで認証は完了です。

現在のLED設定を取得(GET /printer/led)

次にLED設定を状態を取得してみたいと思います。
PrinterにあるGET /printer/led APIを開き、Try it outボタンをクリックしてください。 このAPIにはパラメータはありません。
すると以下のように現在のLEDの値が取得できるはずです。

{
  "blink": {},
  "brightness": 1,
  "hue": 0,
  "saturation": 0
}

Lチカ(PUT /printer/led)

いよいよ3DプリンターでLチカをしてみたいと思います。
LチカをするにはPrinterにあるPUT /printer/led APIを利用します。
hueパラメータのvalue欄に以下を設定し、Try it outボタンをクリックします。
この時、Digest認証を一度も行っていない場合はusername/passwordを聞かれるダイアログが表示されるので、
それぞれ先程取得したID/KEYを設定します。

{
    "hue": 0,
    "saturation": 100,
    "brightness": 100,
}
どうですか? Ultimaker3が赤色に光りましたか?
もし光っていない場合は、ハードウェア上で認証を行ったか、ハードウェア上のLED設定が点灯する設定になっているかなどを確認してください。

Raspberry Piから叩く

ここまでくればRaspberry PiからLチカするのも簡単です。
今回は簡単にshellを利用してLチカを行ってみたいと思います。
認証周りは面倒なのでSwagger UI上で行い、ID/KEYを控えておいてください。
また今回はDigest認証が簡単に行えるのでcurlを利用してAPIを叩きます。

まず Raspberry Piにsshなどで入ります
$ ssh pi@raspberrypi.local
以下のスクリプトのUM_IPUM_IDUM_KEYを設定、viなどでを作成し、実行権限を追加します。

lchika.sh
#!/bin/bash

UM_IP="" # UltimakerのIP
UM_ID="" # /auth/request APIで取得したID
UM_KEY="" # /auth/request APIで取得したKEY

if [[ "${UM_IP}" = "" || "${UM_ID}" = "" || "${UM_KEY}" = ""  ]]; then
    echo "UM_IP、UM_ID、UM_KEYを設定してください"
    exit 1
fi

LED_API_URL="http://${UM_IP}/api/v1/printer/led"

## APIを叩く (赤→青→黄)*3→消す
HSV_COLORS=(
    '0 100 100' # 赤
    '240 100 100' # 青
    '60 100 100' # 黄
    '0 100 100' # 赤
    '240 100 100' # 青
    '60 100 100' # 黄
    '0 100 100' # 赤
    '240 100 100' # 青
    '60 100 100' # 黄
    '0 0 0' # 消す
)

for hsv in "${HSV_COLORS[@]}"
do
    hsvVal=(${hsv[@]})
    curl --digest -u $UM_ID:$UM_KEY \
         -H "Accept: application/json" \
         -H "Content-type: application/json" \
         -X PUT -d "{\"hue\":${hsvVal[0]},\"saturation\":${hsvVal[1]},\"brightness\":${hsvVal[2]}}" \
         $LED_API_URL
    sleep 0.1
done

echo finish
$ vi ~/lchika.sh
$ chdmoe +x ~/lchika.sh
起動してみましょう
$ ./lchika.sh


いかがですか? Lチカ出来ましたか?

まとめ


今回は3Dプリンターを利用して、Lチカを行いました。 Lチカが出来てスッキリしましたね。

Ultimaker3にはLED以外にも実際にプリントを行ったり、ファンを回したり、ビープ音を出すAPIなどもあり、
またそれらがSwagger形式で書かれていることにより、Swagger Generatorなどを利用して、
簡単にAPIクライアントライブラリを作成しすることが出来ます。

また今回のケースではぶっちゃけRaspberry Piは何も必要じゃなかったですが、
実際に弊社では余ったRaspberry PiとこのAPIを利用して、Ultimaker3の状態を監視し、プリントが始まったらタイムラプスを作成するなどのことを行っています。
※この話はまた別の機会にブログに上げたいと思います。

3DプリンターにAPIがあることでとても楽しいLチカが出来ましたね
では良いLチカライフを