ラベル OctoPrint の投稿を表示しています。 すべての投稿を表示
ラベル OctoPrint の投稿を表示しています。 すべての投稿を表示

2019年7月8日月曜日

OctoPrint の API で Python で 3D プリンターの位置情報を取得

はじめに

OctoPrint の API を使って Python で 3D プリンターの現在位置を取得したいのですが、素直には取得できませんでした。

現在位置を取得する G-code M114 を OctoPrint の API から 3D プリンターの Marlin ファームウェアに送っても結果は API には返ってこず、OctoPrint の Terminal に以下のような位置情報が表示されるだけでした。

Recv: X:-10.00 Y:-15.00 Z:0.00 E:0.00 Count X:-1000 Y:-1500 Z:0

そこで、OctoPrint の PositionUpdate イベントを使って OctoPrint が M114 の結果を受け取った時に位置情報をファイルに書き出すようにしてみました。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • Python 3.5.3
  • OctoPrint 1.3.9
  • 3D プリンター Alunar M508
  • Marlin 1.1.1

現在位置をファイルに書き出すスクリプト準備

以下の内容の /some/where/get-3dp-pos.py を設置しました。

#!/usr/bin/env python3

import argparse
import json

POS_FILE = '/tmp/3dp-pos'

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--now'  , type=str)
    parser.add_argument('--data' , type=str)
    parser.add_argument('-x'     , type=str)
    parser.add_argument('-y'     , type=str)
    parser.add_argument('-z'     , type=str)
    parser.add_argument('-e'     , type=str)
    parser.add_argument('-t'     , type=str)
    parser.add_argument('-f'     , type=str)
    args = parser.parse_args()

    with open(POS_FILE, 'w') as f:
        f.write('{}\n'.format(json.dumps(vars(args), sort_keys=True, indent=4)))

if __name__ == '__main__':
    main()

ファイルに実行権限を付けました。

$ sudo chmod +x /some/where/get-3dp-pos.py

OctPrint にイベントを登録

OctoPrint の設定ファイル config.yaml に PositionUpdate イベントを登録しました。

$ diff -U 0 config.yaml{.org,}
--- config.yaml.org     2019-07-08 17:33:42.532568347 +0900
+++ config.yaml 2019-07-08 17:33:42.512568302 +0900
@@ -58,0 +59,7 @@
+events:
+  enabled: true
+  subscriptions:
+  - event: PositionUpdate
+    command: /some/where/get-3dp-pos.py --now '{__now}' --data '{__data}' -x {x} -y {y} -z {z} -e {e} -t {t} -f {f}
+    type: system
+

動作確認

config.yaml を変更したので、まずは OctoPrint を再起動しました。

位置情報を取得する G-code M114 を 3D プリンターに送ると以下のようにファイルに位置情報が書き込まれました。

$ cat /tmp/3dp-pos
{
    "data": "{reason: None, e: 0.0, t: 0, f: 200.0, y: 45.0, x: 30.0, z: 0.0}",
    "e": "0.0",
    "f": "200.0",
    "now": "2019-07-08T19:26:16.670214",
    "t": "0",
    "x": "30.0",
    "y": "45.0",
    "z": "0.0"
}

なお、ヘッドが移動中に M114 を送った場合は OctoPrint のターミナルに

Recv: echo:busy: processing

と表示され、ヘッドの移動が完了した時に位置情報がファイルに書き込まれました。

2019年5月2日木曜日

Python で OctoPrint で Marlin でステッピングモーター開放

#!/usr/bin/env python3

import urllib.request
import json

url = 'http://octoprint:5000/api/printer/command'
json_data = json.dumps(
    {
        'command': 'M18 X Y Z',
    }
).encode("utf-8")

with open('api-key') as f:
    api_key = f.read().rstrip()

req = urllib.request.Request(url)
req.add_header('X-Api-Key', api_key)
req.add_header('Content-Type', 'application/json')
req.data = json_data

with urllib.request.urlopen(req) as f:
    print(f.read().decode())

2019年4月29日月曜日

OctoPrint の API を試しに使ってみました

環境

API サーバー (OctoPrint) 側

  • Raspberry Pi 3 Model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • OctoPrint, version 1.3.9

API クライアント 側

  • Windows 10 Home 64Bit
  • Windows Subsystem for Linux: Ubuntu 18.04.2 LTS

まずは API キー無しでアクセスしてみた

OctoPrint と 3D プリンターの接続情報は今回の環境では以下の URL で取得できるようです。

http://octoprint:5000/api/connection

curl コマンドで API キー無しでこの URL にアクセスすると。。。

$ curl http://octoprint:5000/api/connection
No API key provided

というように、API キーが無いので取得できませんでした。

API キーを確認

ブラウザから OctoPrint の URL http://octoprint:5000/api にアクセスしました。

画面上部のスパナアイコンの Settings をクリックしました。

API タブで API キーを確認しました。今回は C14B4FA3BE854CAAA740A43BEAFD6FB3 でした。

API キーを指定してアクセスしてみた

以下のように curl コマンドで API キーを指定すると以下のように取得できました。 (今回は OctoPrint と 3D プリンターを接 続していないので "state": "Closed" となっていると思われます)

$ curl --header 'X-Api-Key: C14B4FA3BE854CAAA740A43BEAFD6FB3' http://octoprint:5000/api/connection
{
  "current": {
    "baudrate": null,
    "port": null,
    "printerProfile": "_default",
    "state": "Closed"
  },
  "options": {
    "baudratePreference": null,
    "baudrates": [
      250000,
      230400,
      115200,
      57600,
      38400,
      19200,
      9600
    ],
    "portPreference": null,
    "ports": [],
    "printerProfilePreference": "_default",
    "printerProfiles": [
      {
        "id": "_default",
        "name": "Default"
      }
    ]
  }
}

念のため、使用した API キーを無効化しておく

本来 API キーは公開せず秘密にしておくものですが、このブログで公開してしまったので無効にしておきます。

ブラウザで API キーを確認した画面で、更新のアイコンの Generate new API Key をクリックして新しい API キーを生成しました。これで今まで使っていた API キーは使えなくなるようです。

試しに更新前の API キーで API にアクセスしてみたところ。。。

$ curl --header 'X-Api-Key: C14B4FA3BE854CAAA740A43BEAFD6FB3' http://octoprint:5000/api/connecion
Invalid API key

というように期待通り情報を取得できませんでした。

参考

  • http://docs.octoprint.org/en/master/api/

2019年4月16日火曜日

Raspberry Pi 起動時に OctoPrint も自動起動

Raspberry Pi で OS 起動時に OctoPrint も自動で起動するように設定しました。といっても、 https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian/2337 に書いてあることをほぼそのまま実施しただけです。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • OctoPrint version 1.3.9

テンポラリなディレクトリに以下のファイルをダウンロードしました。

$ wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.init
$ wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.default

ダウンロードした octoprint.default を以下のように修正しました。

$ diff -u octoprint.default{.org,}
--- octoprint.default.org       2019-04-13 20:46:49.355866063 +0900
+++ octoprint.default   2019-04-13 20:58:54.984395654 +0900
@@ -13,7 +13,7 @@
 PORT=5000

 # Path to the OctoPrint executable, you need to set this to match your installation!
-#DAEMON=/home/pi/OctoPrint/venv/bin/octoprint
+DAEMON=/home/pi/OctoPrint/venv/bin/octoprint

 # What arguments to pass to octoprint, usually no need to touch this
 DAEMON_ARGS="--port=$PORT"

octoprint.default の以下の項目はコメントアウトしたままにしてます

  • #BASEDIR=/home/pi/.octoprint
  • #CONFIGFILE=/home/pi/.octoprint/config.yaml

スクリプトのオーナーを root に変更しました。

$ sudo chown root:root octoprint.default
$ sudo chown root:root octoprint.init

スクリプトをインストールしました

$ sudo mv octoprint.init /etc/init.d/octoprint
$ sudo mv octoprint.default /etc/default/octoprint

/etc/init.d/octoprint に実行権限を付与しました

$ sudo chmod +x /etc/init.d/octoprint

オートスタートに登録しました

$ sudo update-rc.d octoprint defaults

OctoPrint を起動しました

$ sudo service octoprint start

OS 起動時に OctoPrint も自動的に起動しました。

2018年12月5日水曜日

Raspberry Pi で OctoPrint で WebCam で 3D プリンタを遠隔チェック

はじめに

Raspi にインストールした OctoPrint に WebCam の設定をしてプリント中の 3D プリンタを遠隔から監視できるようにしてみました。

なお Raspi に OctoPrint はすでにインストールされ、カメラもすでに使える状態になっているところから始めています。

環境

  • Raspberry Pi 3 model B
  • Raspbian GNU/Linux 9.4 (stretch)
  • オフィシャル Raspi カメラ V2.1
  • OctoPrint Version 1.3.9

Raspi のカメラが使えることを確認

以下のコマンドを実行。

$ raspivid -o ./test.h264

Raspi カメラで 5秒間程度動画撮影し、カレントディレクトリに動画ファイル test.h264 ができました。

このままでは Windows で再生できなのでフォーマットを変換します。

まずは必要なパッケージをインストール。

$ sudo apt install gpac

フォーマットを変換。

$ MP4Box -add ./test.h264 ./test.mp4

カレントディレクトリにできた test.mp4 を Windows に移動して再生できることを確認しました。

MJPG-Streamer コンパイル

必要なパッケージインストール

$ sudo apt install \
subversion \
libjpeg62-turbo-dev \
imagemagick \
ffmpeg \
libv4l-dev \
cmake

MJPG-Streamer をダウンロードしてコンパイル

$ cd ~
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ export LD_LIBRARY_PATH=.
$ make

試しに WebCam サーバー起動

MJPG-Streamer をコンパイルしたディレクトリに移動

$ cd ~/mjpg-streamer/mjpg-streamer-experimental

MJPG-Streamer を実行 - オフィシャル Raspi カメラでない場合はコマンドが異なるようです

$ ./mjpg_streamer \
-i './input_raspicam.so -fps 5' \
-o './output_http.so'

ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream

Ctrl + C で MJPG-Streamer を停止

OctoPrint で WebCam サーバーを起動/停止できるようにスクリプト設置

以下のファイルを設置しました。

/home/pi/scripts/webcam

#!/bin/bash
# Start / stop streamer daemon

case "$1" in
    start)
        /home/pi/scripts/webcamDaemon >/dev/null 2>&1 &
        echo "$0: started"
        ;;
    stop)
        pkill -x webcamDaemon
        pkill -x mjpg_streamer
        echo "$0: stopped"
        ;;
    *)
        echo "Usage: $0 {start|stop}" >&2
        ;;
esac

/home/pi/scripts/webcamDaemon

#!/bin/bash

MJPGSTREAMER_HOME=/home/pi/mjpg-streamer/mjpg-streamer-experimental
MJPGSTREAMER_INPUT_USB="input_uvc.so"
MJPGSTREAMER_INPUT_RASPICAM="input_raspicam.so"

# init configuration
camera="auto"
camera_usb_options="-r 640x480 -f 10"
camera_raspi_options="-fps 10"

if [ -e "/boot/octopi.txt" ]; then
    source "/boot/octopi.txt"
fi

# runs MJPG Streamer, using the provided input plugin + configuration
function runMjpgStreamer {
    input=$1
    pushd $MJPGSTREAMER_HOME
    echo Running ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
    LD_LIBRARY_PATH=. ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
    popd
}

# starts up the RasPiCam
function startRaspi {
    logger "Starting Raspberry Pi camera"
    runMjpgStreamer "$MJPGSTREAMER_INPUT_RASPICAM $camera_raspi_options"
}

# starts up the USB webcam
function startUsb {
    logger "Starting USB webcam"
    runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $camera_usb_options"
}

# we need this to prevent the later calls to vcgencmd from blocking
# I have no idea why, but that's how it is...
vcgencmd version

# echo configuration
echo camera: $camera
echo usb options: $camera_usb_options
echo raspi options: $camera_raspi_options

# keep mjpg streamer running if some camera is attached
while true; do
    if [ -e "/dev/video0" ] && { [ "$camera" = "auto" ] || [ "$camera" = "usb" ] ; }; then
        startUsb
    elif [ "`vcgencmd get_camera`" = "supported=1 detected=1" ] && { [ "$camera" = "auto" ] || [ "$camera" = "raspi" ] ; }; then
        startRaspi
    fi

    sleep 120
done

軽く webcamDaemon スクリプトを読んでみたところ、camera="auto" となっているので USB カメラか Raspi カメラ かを自動判定しているようです。camera="usb" とすると USB カメラ (接続されて使えるようになっていれば) を指定でき、camera="raspi" とすると Raspi カメラを指定できるようです。

また、/boot/octopi.txt が存在すれば source コマンドで読み込むので、webcamDaemon スクリプトを修正しなくてもこのファイルで camera 変数の値を変更することができそうです。

作成したスクリプトに実行権限付与

$ chmod +x /home/pi/scripts/webcam
$ chmod +x /home/pi/scripts/webcamDaemon

設置したスクリプトで WebCam サーバーの起動/停止ができることを確認

まずは起動していないことを確認

$ ps -efwww | grep mjpg_streamer | grep -v grep
$

なにも表示されないので起動していないことが確認できました。

WebCam サーバー起動

$ /home/pi/scripts/webcam start
/home/pi/scripts/webcam: started

$ ps -efwww | grep mjpg_streamer | grep -v grep
pi        4759  4751  2 00:10 pts/2    00:00:00 ./mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -fps 10

mjpg_streamer プロセスが起動しているのがわかります。

また、プロセスの引数が -i input_raspicam.so となっているのでカメラの自動認識で Raspi カメラを認識できていることがわかります。

ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream

WebCam サーバー停止

$ /home/pi/scripts/webcam stop
/home/pi/scripts/webcam: stopped

$ ps -efwww | grep mjpg_streamer | grep -v grep
$

なにも表示されないので停止したことが確認できました。

OctoPrint システムメニューで WebCam サ ーバーを起動/停止できるように設定ファイル修正

/home/pi/.octoprint/config.yaml の最後に以下追加 - 今まで一度も OctoPrint を起動していない場合はこの .octoprint/ ディレクトリは まだ作成されていないかもしれません

system:
  actions:
    - action: streamon
      command: /home/pi/scripts/webcam start
      confirm: false
      name: Start video stream
    - action: streamoff
      command: /home/pi/scripts/webcam stop
      confirm: false
      name: Stop video stream

参考ページでは command: sudo /home/pi/scripts/webcam stop というように停止時は sudo により root 権限で stop させる ようになっています。これは別ユーザーが WebCam サーバーを起動した場合でも OctoPrint から WebCam サーバーを停止できるようにするためだと思われますが、パスワード無しで sudo できることが前提です。Raspbian のデフォルトでは確かパスワード無しで sudo できたはずですが、私の Raspi は sudo 時にパスワードが必要なように設定を変更しています。このため sudo をつけると OctoPrint から WebCam サーバーを停止で きないので command: /home/pi/scripts/webcam stop というように sudo を付けないように変更しています。別ユーザーが起動し た WebCam サーバーは OctoPrint で停止できませんが、私の使い方ではそのような状況にはならないかなと考えています。

OctoPrint で WebCam サーバー起動/停止

/home/pi/.octoprint/config.yaml を修正したので OctoPrint が起動している場合は念のため OctoPrint 再起動

ブラウザで OctoPrint にアクセスし、電源アイコン (System) のプルダウンから Start video stream を選択して WebCam サーバー起動

ブラウザで以下の URL にアクセスすると Raspi カメラで撮影されたストリーミング動画を見ることができました。 - http://<your Raspi's IP>:8080/?action=stream

電源アイコン (System) のプルダウンから stop video stream を選択して WebCam サーバー停止

OctoPrint の画面で WebCam のストリーミングを確認できるよ うにする

WebCam サーバーが起動していない場合は起動

スパナのアイコン (Settings) をクリック

WebCam & Timelapse をクリック

Stream URL に http://<your Raspi's IP>:8080/?action=stream を設定

参考ページには Stream URL に /webcam/?action=stream を設定するようにと書かれていましたが、私の環境ではこれではだめ でした。

Test をクリックして WebCam のストリーム動画が表示されることを確認

Save をクリック

OctoPrint を再起動し、ブラウザのキャッシュをクリアし、OctoPrint ページをリロード

WebCam サーバーを起動

Control タブに WebCam のストリーミング画像が表示されるようになりました。

参考

  • https://discourse.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian/2337
  • https://www.raspberrypi.org/documentation/usage/camera/raspicam/raspivid.md