読者です 読者をやめる 読者になる 読者になる

3Dプリンター QIDI TECH I をTMC2100で静音化してみた

3Dプリンター QIDI TECH I

はじめに

TMC2100チップを搭載したサイレント・ステップ・スティックと呼ばれるドライバモジュールを使ってQIDI TECH Iを静音化してみました。

f:id:hammm:20170318115531j:plain:w100 f:id:hammm:20170318115633p:plain:w150

先に結論を書いておきます。

  • メリット

    音量は明らかに下がる。「意外な音」はしなくなり、普通に機械が動いているという感じになる。

  • デメリット

    今までにはなかったシュー、シャー、ピャーというような高周波的なノイズが追加され、3Dプリンターの近くにいたり、他にノイズ源のない静かなところでは、この高周波が結構気になる可能性がある。

ちょっとザワついたオフィスのような場所では十分有効な静音化になると思います。なお、作業には多少のはんだ付け能力が必要です。

背景

一般的なプラスチックを積層するタイプ(FDM)方式の3Dプリンターといえば、動作時の特徴的な「変わった音」が印象的です。まるで昔のゲーム音楽のようなその音は、楽しい気分になることもありますが、意外なメロディーが発生するため「気になる」存在感を放ち、近くで動いているとノイズをなかなか意識の外に追いやれないのも事実です。ちょっとしたものを作る場合でも数時間以上になることが一般的のため、設置場所を選ぶ感じがあります。日本では、家庭にしろオフィスにしろ、十分な広さがとれないことも多く、静音化が求められているといえましょう。

他の静音化手法

ドライバモジュールを変更することのほかに、以下の静音化方法があります。

  • プリント速度を下げる

    プリント時にヘッドが動作する速度を下げることで、結構ノイズレベルは低下します。スライサーソフト側の設定で対処する必要があります。

  • ファンを交換する

    冷却用のファンが騒音源である場合は静音なものに交換するという手があります。

  • 防音箱に入れる

    3Dプリンタ全体を防音箱に入れる手があります。

QIDI TECH Iについて

今回のターゲットはQIDI TECH Iなので、簡単に紹介しておきます。

特徴

お安いわりに機能的には全部入りでちゃんと動く中華3Dプリンターです。サポートも丁寧なのがポイント。ただし日本語対応はカタコト。 MakerBot社が3Dプリンタの設計をオープンソースにしていたために、派生したクローン製品の一つです。 こういう経緯のため、おおよそMakerBot/FlashForgeの資産や知識も利用できるというメリットがあります。

その他特徴

  • 造形物の最大サイズ 23cm x 15cm x 15cm
  • ベッドの加熱が可能のため、一般的なPLA/ABSおよび他の素材も利用できる
  • 金属製でがっしりしている
  • そこそこ密閉されておりABSでの造形に有利、ノイズ的にも有利
  • エクストルーダ(押出機)2つ搭載

系譜

  • MakerBot Replicator系の血をひいています。今回は、メイン基板が"MightyBoard"(マイティボード)と呼ばれる系統であることを意識する必要があります。
MakerBot社のReplicator Dual
  ↓ クローン
FlashForge Creator Pro
  ↓ クローン
QIDI TECH I

QIDI X-Oneは?

同じQIDI社のX-OneはTECH Iと同様に、安価かつ評判も良いものですが、だいぶ系統の異なる中身の3Dプリンタです。特に今回やろうとしているドライバモジュールの交換についてですが、X-Oneではメイン基板に直接はんだ付けされているため、交換不可能ですのでご注意ください。

続きを読む

高解像度Motion JPEGストリーミングを低遅延で再生するAssetをプレビュー公開しました。

Unity3D

これは何?

このAssetを使うと、GearVR などで FullHDなどのMotion JPEG ストリーミングを低遅延(おおよそ0.2~0.4秒以内)で再生できます。ということは、THETA SのUSB/HDMIライブビューなんかをRaspberryPiやPC経由でWi-Fiで飛ばしてGearVRで一人称視点で眺める、つまりテレイグジスタンスっぽいことができるかも!です。あるいは、リアルタイム性を活かして、Raspberry Piとラズパイカメラを載せたラジコンから映像を飛ばしてFPV(一人称視点操作)なども可能です。

発端

以前の記事で、Raspberry PiからMotion JPEGでGearVRに配信するということを行いました。

hammmm.hatenablog.com

AVI Player with Playmaker actions というAssetの中のMovie Streamerを利用しましたが、遅延が数秒以上になることと、fpsが低いという問題がありました。

また、HLSでの配信も試しましたが、こちらは遅延が数十秒と、リアルタイム性に大きな問題をかかえていました。

そんなときにのしぷさんの記事

noshipu.hateblo.jp

を拝見して、Motion JPEGのデコード方法がわかったので、これだ!と思ってGearVRで動かそうとしてみましたが、ソースが高解像度の場合、単純な実装では安定動作しないことがわかりました。高画質で低遅延を実現するには、以下の問題をクリアする必要がありました。

  • 遅延(読み取りが遅く、未読み取りのフレームがサーバー側に貯まる問題)
  • 遅延(読み込み済みの後のキューが伸びてしまう問題)
  • ネットワーク読み込み速度の問題
  • メインスレッド負荷の問題

これらに対策を打った結果が今回のAssetになります。結果的にそれなりの規模の実装になってしまいました。ついでにAsset Store掲載を画策しているところです。

のしぷさんと、サンプルプロジェクトを作られた伊藤さん(@warapuriさん)に感謝しています!

特徴

www.youtube.com

  • スレッドを利用して、最大限サーバーの出力に追いつくように実装しています。
  • JPEGデコードはlibjpeg-turboを利用して高速化しています。
  • バックグラウンドスレッドでデコードするようにしています。これにより、メインスレッドに大きな負荷をかけず、スムーズな描画を阻害しません。
  • バッファの再利用により、メモリ使用/確保量もできるだけ抑えるようにしています。

ダウンロードについて

プレビュー版ということで、しばらくの間無料配布いたします。なお、もし商用利用されたいというような場合がありましたらお問い合わせください。

こちらからダウンロードできます。キーは mjpg です。

[Unity] MJStreamingPlayer Asset - BowlRoll

対応プラットフォーム

現状、Android (GearVR) および Windows 32/64bit 対応です。 Unityはちょっと古いですがバージョン5.3.4で確認しています。

利用可能なサーバープログラムの例(確認済み)

組み込み方法

  1. 本Asset (MJStreamingPlayer.unitypackage)をプロジェクトにインポートしてください。
  2. 再生対象マテリアルを持つGameObjectに、MJStreamingPlayerコンポーネントを追加してください。
    • 現在の仕様では、メインのマテリアルが持つメインのテクスチャとして、動画テクスチャがセットされます。
    • 特にこだわりがなければ、シェーダは Unlit/Texture にしてください。デフォルトの Standard シェーダも利用可能です。
  3. MJStreamingPlayerコンポーネントを設定してください。
    • ServerUrl: MJPGストリーミングサーバーのストリーミングURLをセットしてください。
    • PlayAutomatically: 自動で再生開始する場合はONにしてください。OFFの場合は、スクリプトからStartStreaming() を呼ぶ必要があります。
  4. 上記GameObjectが見えるようにCameraを設定し、UnityでPlayしてください。

組み込み例

  • 前項の方法で、以下の記事のプロジェクト(Oculus RiftでTHETA画像を表示)にも組み込めます! hammmm.hatenablog.com

  • 設定例

    WebCamDrawerは無効化して、かわりにMJStreamingPlayerを追加しています。 f:id:hammm:20161214210934p:plain

  • 動作例

    ※ここでは、Unityと同じPCで GMax IP Camera を動かし、THETA S のHDMI出力を FEBON178 経由でUSBウェブカメラ扱いで入力しています。 さらに、Android向けにして、osig, bundle-id等を設定するとGearVRでの動作も可能でした。 f:id:hammm:20161214230528j:plain

動作

  • フレームレートはサーバーが送信する速度および描画速度に依存します。
  • 無駄なデコードを避けるため、表示可能なフレームレート以上のデコードは行わず、スキップします。
  • テクスチャサイズはサーバーが送信するMJPGの画像サイズに依存します。

サーバーURL設定例

  • mjpg_streamerの場合
  • GMax IP Camera (MJPG版)の場合
  • webcamxp 5の場合
  • ホストのIPアドレス、ポート番号の求め方
    • LAN内の場合
      • IPアドレス サーバープログラムを実行しているPCのLAN上でのIPアドレスを取得します。
      • ポート番号 サーバープログラムによって、デフォルトのポート番号は異なります。サーバープログラムのドキュメントを参照してください。
    • インターネット上のサーバーの場合
      • IPアドレス、ポート番号 ネットワークの知識がなければなかなか難しいことですが、mjpegサーバーとなるPCが、グローバルIP経由でアクセスできる状況を作成してください。 上記サーバーにアクセスできるグローバルIPと、サーバープログラムが動作しているポート番号を利用します。

☠ データ通信料金に関するご注意 ☠

本Assetでは、MJPGストリーミング時だけでなく、大容量ファイルが置かれたURLを接続先に指定したケースなど、大量のデータ転送を発生させる可能性があり、特に従量課金制のネットワークをご利用の場合、課金が高額となる恐れがありますのでご注意ください。

今後の修正点

  • ターゲットマテリアルを変更できる機能は早々に実装するつもりです。

悩み

Unityで自前のスレッド利用時、まともにプロファイリングできないためにボトルネックがよくわからない、というのが悩みです。Unityのプロファイラは自前ワーカースレッドの負荷を別のスレッドにつけかえて表示してしまう印象があり、あまり役にたたない気がしています。

最後に

是非使ってみてください!

Raspberry Pi 3 にシャットダウン/リブート/再開ボタンを追加する

f:id:hammm:20161114224346j:plain:w200

概要

Raspberry Pi 3にシャットダウン、およびその他のボタンを追加してみました。 この記事での自動起動の設定方法は、Ubuntu MATE16.04およびRaspbian Jessie(要はsystemdのある環境)に対応しています。それより以前のバージョンのOSであれば、rc.local という設定ファイルを使う手法のほうが有効かとおもいます。なお、pythonスクリプトそのものは他のバージョンにも対応すると思います。

※自分はUbuntu MATEで試しています。Raspbian Jessieについては未確認でして、動作しない場合はお知らせください。

twitter.com

https://twitter.com/hammmm/status/797662568697344000

なぜシャットダウンボタンが必要なのか?

Raspberry Piを外に持ち出して使おうと思ったときの1つの問題点として、「シャットダウンできない」という問題があります。

いきなり電源ケーブル(マイクロUSB)を抜けば良くない?

ラズパイをシャットダウンせずに電源を抜くと、SDカードが壊れて動かなくなる可能性が一定(利用状況にもよりますが数%程度)あります。 ラズパイのOSであるLinuxは絶えずファイルシステムにデータを読み書きしており、特に書き込みが中途半端な状態で突然電源が切れると、SDカードのデータの状態そのものが不安定となり、読み込みできない状態になってしまうことがあります。

なお、いきなり電源ケーブルを抜いても問題ないようにする方法が一応あり、それはファイルシステムをREAD ONLY(書き込み不可)にするというものです。書き込みできなければ破壊も起こりません。場合によってはそれもアリですが、そうすると後から編集等もしづらくなりますので、良し悪しかと思います。

一般的なシャットダウン方法について

一般的に、シャットダウンする方法は以下の方法があります。

方法 説明 接続するもの 重量
GUI マウス操作でGUIメニューから HDMIモニタ,USBマウス/キーボード 1kg
CUI ターミナルで sudo shutdown -h now等 HDMIモニタ,USBキーボード 800g
ssh ネットでつないでsudo shutdown -h now 等 wifiアクセスポイント(テザリング等)、ノートPC 1.5kg

重さもありますが、いろいろ接続したり準備も必要です。 そこで、今回の方法ならほとんど重さの追加もなく、ボタン一発で簡単にシャットダウンできるようになります!

今回のシャットダウンボタンの実装方法について

Raspberry Piには、「GPIO」という、電気工作などに使える汎用の入力ピンがありますが、ここにボタンなどを接続すると、プログラムからボタンのON/OFFを読み取ることができます。 そこで、常時実行しているプログラムで、ボタンの状態を監視してあげて、ボタンが押されたらシャットダウンコマンドを発行するようにしてあげます。

再開ボタンについて

シャットダウンボタンと再開ボタンは全く異なる仕組みで動作します。

http://elinux.org/RPI_safe_mode によれば、GPIO3をGNDに落とすと(GPIO3とGNDを一時的に接続すると)、シャットダウン後の状態から再起動させることができるそうですので、これを利用してみます。

ただし、注意として、GPIO3はデバイスとのI2C通信に利用するピンと同じピンなので、I2Cデバイスと共存させたい場合は分岐させるなど工夫が必要と思います。

なお、シャットダウンボタンと違い、再開ボタンについては、動作のためにソフトウェアのインストールは不要です。

材料

  • Raspberry Pi 3 (2やタイプBなどでもいけると思いますが、未テストです)
  • ボタン: aitendoの薄膜スイッチ 3ボタンタイプ www.aitendo.com
  • ケーブル: aitendoのオス-メス ジャンパワイヤ 4本分 www.aitendo.com
  • OS: Ubuntu MATE (16.04) または Raspbian Jessie

ワイヤ接続

各ボタンの役割は以下のように割り当てました。

  • 赤: シャットダウン
  • 黄: リセット
  • 緑: 再開

そこで、以下のようにつなぎます。

  • GNDをボタンの共通ピン(1)に接続
  • GPIO3に再開ボタン(2)をつなぐ
  • GPIO19にリセットボタン(3)をつなぐ
  • GPIO26にシャットダウンボタン(4)をつなぐ

f:id:hammm:20161114021702j:plain

Raspberry PiのGPIOピンの役割はこれを見ると良いです。

https://www.element14.com/community/servlet/JiveServlet/showImage/102-78055-1-227625/1.jpg

コード

監視スクリプト

nano ~/shutdown_by_button.py
または
vi ~/shutdown_by_button.py

ファイルの内容は以下のようにします。

#!/usr/bin/env python

import RPi.GPIO as GPIO
import os, time

GPIO.setmode(GPIO.BCM)

# GPIO19 : reset button
GPIO.setup(19, GPIO.IN, pull_up_down = GPIO.PUD_UP)
# GPIO26 : shutdown button
GPIO.setup(26, GPIO.IN, pull_up_down = GPIO.PUD_UP)

def shutdown(channel):
  os.system("sudo shutdown -h now")

def reboot(channel):
  os.system("sudo reboot")

GPIO.add_event_detect(26, GPIO.FALLING, callback = shutdown, bouncetime = 2000)
GPIO.add_event_detect(19, GPIO.FALLING, callback = reboot, bouncetime = 2000)

while 1:
  time.sleep(100)
$ chmod 755 ~/shutdown_by_button.py
  • 実行してみる
$ ~/shutdown_by_button.py

ここで、ボタンを押して、動作を確認してみてください。

動かない場合は結線など確認してみてください。 たとえばPythonスクリプト内(GPIO.setmodeより後の行)で print GPIO.input(26) とすればGPIO26の状態(1か0)を出力できるので、ボタンの状態を取得できているかどうか調べてみてください。

上記スクリプト自動起動するための方法

ユーザー名が pi という名前になっているケースになります。他のユーザー名の場合は、 /home/pi となっているところを /home/ユーザー名 と読み替えてください。

  • 設定ファイルを追加する
# 設定ファイルのディレクトリを作成 (※既にあればcannot create directory等と出ると思いますが気にしなくて良いです)
$ sudo mkdir /usr/lib/systemd/system```

# ファイル編集
$ sudo nano /usr/lib/systemd/system/shutdown_by_button.service
または
$ sudo vi /usr/lib/systemd/system/shutdown_by_button.service

ファイルの内容は以下のようにします。

[Unit]
Description=Shutdown/Reboot raspberry pi by GPIO button input
Wants=network.target

[Service]
ExecStart=/home/pi/shutdown_by_button.py
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target
  • 設定を反映する
# 上記設定ファイルを反映します
sudo systemctl daemon-reload
# スクリプトを開始します
sudo systemctl start shutdown_by_button
# スクリプトをLinux開始時に自動起動するようにします
sudo systemctl enable shutdown_by_button
  • サービスの状態を調べる
sudo systemctl status shutdown_by_button

f:id:hammm:20161114230814p:plain

実行結果のところに緑の丸がついていない場合は、なにか問題が発生していることになります。 最新のログも一緒に出るので参考にしてください。

※Terminalの文字色が出ていない場合は、 Active: active (running) となっているかどうかで判断してください。

参考

Theta Sやウェブカメラをラズパイ上のgstreamer+HLSでストリーミング配信してGearVRとかで再生

Raspberry Pi Gear VR Hypriot Theta S Unity
  • 概要
    • HLSとは?
      • 対応プレイヤー
    • HLS配信の難しいところ
  • 実装
    • 今回の手法
    • 前提
    • gstreamerをインストール
    • ストリーミング実行
      • Theta S向け
      • 解説
      • h.264対応USBウェブカメラ向け
      • その他のUSBウェブカメラ向け
      • gstreamer動作確認
    • ウェブサーバー(nginx)設定
      • ブラウザ再生向けhtmlファイル
  • 再生方法
    • Unity,VLC(ウェブブラウザ以外)
    • ウェブブラウザの場合
  • Tips
    • Theta S + gstreamerでのframerate指定がやばい
  • できなかったこと

概要

前回mjpegをmjpegストリーマーで配信する方法を紹介しましたが、少なくともUnity上ではfpsがあまり出ない欠点がありました。

hammmm.hatenablog.com

今回は、Raspberry Pi 2でWebCamやTheta S(live view)からの動画を、gstreamerというソフトウェアを使ってHLS(HTTP Live Streaming)方式でストリーミング配信する方法です。

  • メリット
    • http通信のみで実現できるので、再生環境が整いやすい
    • ラズパイ搭載h.264のハードウェアエンコーディングを使うため、フレームレートがそこそこ出る
    • 複数人への同時配信が可能
  • デメリット
    • 現状では録画時間と再生時間の間に30~60秒前後の大きなラグが生じる

前回と同じような構成で配信できます。 f:id:hammm:20160214191153j:plain:w400

HLSとは?

HTTP Live Streamingの略で、Appleが定めた、httpだけでストリーミングを行うための仕様です。> HTTP Live Streaming (HLS) - Apple Developer

以下は自分の今の認識ですが、仕様からするとおかしいところがあるかもしれません。

Apacheやnginxといった一般的なウェブサーバーで以下のファイルを配信することで、ストリーミング配信を実現できます。

  • .m3u8という拡張子のプレイリストファイル(1つ)

    • 中に実際のストリームファイルへのリンクURLが書いてある。
  • 連番のストリームファイル(stream00001.ts, stream00002.tsのような連番ファイル)

    • こちらに動画が数秒分ずつ入っている。

gstreamer等を使って、新しい連番ストリームファイルを生成して、ファイルを置くたびに.m3u8ファイルを書き換えていくことで、プレイヤーが最新の情報を取得できるようにしておきます。

これを再生する動画プレイヤー側は、まず.m3u8ファイルを読み込んで、ストリームファイルへのリンクを取得し、さらにリンクをたどってストリームを取得します。m3u8には複数のストリームファイルが書かれているので、順番に読んでいくことができます。定期的にm3u8ファイルを読み込み直すと、更新された情報を得ることができ、さらに新しい連番ストリームファイルを得ることができます。

対応プレイヤー

  • ブラウザ系 (htmlファイル)

    ブラウザ上で再生するためにはvideoタグが書かれたhtmlファイルも一緒においておく必要があります。

    • MacOS XではSafariが対応していそうですが、未検証。
    • Androidでは標準ブラウザで再生することができます。 (Android 5のGalaxy S6 edgeで確認)
    • iOSのMobile Safariでは成功していません。
    • WindowsChrome, Firefoxでは成功していません。
  • 直接起動

    • UnityではAndroid向けのEasy Movie Textureという有料AssetがHLSに対応しています。m3u8ファイルへのURLを指定することで再生できます。
    • iOSVLCアプリでm3u8ファイルへのURLを指定することで再生できました。
    • WindowsVLCアプリでも同様に再生できますが、しばらくすると勝手に停止する傾向がありました。

HLS配信の難しいところ

m3u8をネットから読めるようにウェブサーバーに置くまでは良いですが、.m3u8の中に書かれたストリームファイルのURLもちゃんと読める場所(ホスト、アドレス)を示している必要があります。 たとえばですが、Bonjourが有効な環境で読める なんとか.local といったアドレスを.m3u8 の中のURLに入れてしまうと、Bonjourが無効な環境では再生できなくなってしまいます。 なお、EasyMovieTextureでは、m3u8ファイル内のストリームURIについて、 /stream/stream00001.ts のようにホスト名を省略することが可能でした。他のプレイヤーでは対応していない可能性がありますが、一応仕様的にはアリっぽいです。(※後述「手法A」)

実装

今回の手法

  • gstreamerのhlssinkを利用して.m3u8ファイルと.tsファイル群を生成します。
  • 重い処理であるh.264へのエンコードに、OpenMaxアクセラレーションを利用するomxh264encを利用します。
  • nginxをdockerコンテナで起動し、HTTP配信を担わせます。

前提

以前の記事で書いたような、HypriotOSを入れた状態を想定していますが、通常のRaspbianからでも実行可能と思います。(dockerまわりは自分でなんとかする方向ということで)

gstreamerをインストール

sudo apt-get update
sudo apt-get install gstreamer1.0-*

ストリーミング実行

Theta S向け

  • 準備

    前回と同様、THETA SをLIVE VIEWモードで起動して、ラズパイにUSB接続してください。そこで、/dev/video0 というデバイスが現れているかどうかを確認してください。

  • 手法A : ストリームファイルをホスト名抜きのパス指定する方法

    最後のplaylist= のところがホスト名を除外したパスになっています。AndroidiOSVLCではこの方法でいけます。この時点でホスト名とか意識しなくて良い分、楽といえます。仕様上もPlaylist(m3u8)に対して相対指定ができると書いてあるので良さそうです。

mkdir /var/www/stream
sudo gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720 ! jpegdec ! omxh264enc target-bitrate=2000000 control-rate=variable ! video/x-h264,profile=baseline ! h264parse ! mpegtsmux ! hlssink max-files=8 target-duration=5 location=/var/www/stream/segment%05d.ts playlist-location=/var/www/stream/output.m3u8 playlist-root=/stream/
  • 手法B : ストリームファイルをURL指定する方法

    最後のplaylist= のところがホスト名を含むURLになっています。WindowsVLCではこちらの方法でないと動かないようです。

mkdir /var/www/stream
sudo gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720 ! jpegdec ! omxh264enc target-bitrate=2000000 control-rate=variable ! video/x-h264,profile=baseline ! h264parse ! mpegtsmux ! hlssink max-files=8 target-duration=5 location=/var/www/stream/segment%05d.ts playlist-location=/var/www/stream/output.m3u8 playlist-root=http://(ラズパイのホスト名またはIPアドレス)/stream/
続きを読む

THETA Sのmjpegをラズパイで受けてLANでUnityに配信する方法

Raspberry Pi Gear VR Unity Theta S Hypriot

はじめに

ラズパイでMJPG-Streamerを使って、THETA SのmjpgライブビューをLAN内に配信して、ブラウザやUnityでそれを受けて再生する話です。

RICOH THETA Advent Calendar 2015 LT大会!で以下のデモをした時の手法です。

とはいえ、今回の方式は以下の問題があり、実用的かというと微妙ではあります。

  • Unityでの利用時にfpsが低い(これはラズパイ側の問題ではなく、主に受信側Assetのデコードが遅いため)
  • 遅延が大きくなりがち(数秒程度)
  • Android(Gear VR)で動かす場合にIP指定になり、いちいちIPを調べたりと面倒

でも誰かの役に立つかなということで公開しておきます。

ラズパイでMJPG-Streamerを動かす (docker利用)

まず、前回記事の手順でRaspberry Pi 2でHypriotを動かした状態を前提とします。

※なお、Hypriotでなくても、dockerがインストール済みで、UVC(USBカメラ)のドライバが入っていれば良いはずです。標準raspbianからの動作は未確認です。

hammmm.hatenablog.com

そして、sshでラズパイに入ります。

$ ssh pi@pihost.local

以下の手順を実行してください。

  1. THETA SをLIVEモードで起動する
  2. THETA SをラズパイのUSBポートにつなぐ
  3. ls /dev として /dev/video0 というデバイス(カメラデバイス)ができているのを確認。なければTHETA Sの状態やUSB接続を確認する。
  4. docker run -p 8080:8080 -v /dev:/dev --privileged mhamanaka/rpi-mjpg-streamer-uvc:0.1 を実行する

すると、dockerイメージをダウンロードして、さらに自動的にmjpg-streamerが起動して配信がはじまります。

ラズパイのホスト名がpihost.localだとすると、ブラウザで

http://pihost.local:8080/

にアクセスすれば、このようなmjpg-streamer の操作画面が見られます。

f:id:hammm:20160204012521p:plain:w300

また、mjpeg配信のURLは

http://pihost.local:8080/?action=stream

のようになります。

※ なお、なんたら.localBonjourに対応していないと解決できないので、Bonjourの入っていないマシン(Windows,Android等)からアクセスする場合は、ホスト名のかわりにローカルIPで指定してください。(「ラズパイIPの調べ方」の項参照)

Docker Hubのrpi-mjpg-streamer-uvcページはこちら。

続きを読む

Hypriot(Raspberry Pi)でBUFFALO WI-U2-433DM (RealTekチップ) Wifiドングルを動かす方法

Hypriot Raspberry Pi

BUFFALO WI-U2-433DM は、Realtek8812AUを搭載しており、IEEE802.11ac,a,n,g,b に対応しているという、わりとハイスペックなUSB Wi-Fiドングルなのですが、これをHypriotなRaspberry Pi 2で動かそうとしてちょっと苦労したのでメモ。

ちなみに、 PLANEX GW-USNano2 であればHypriotのデフォルトで入っているので(この記事のような)面倒がないです。

概要

基本の流れはここに書かれています。 Realtek wireless chipset: install the right driver - Easy Linux tips project (Realtek RTL8812AU chipset (0bda:8812)の項)

こちらのリポジトリのドライバをインストールします。 GitHub - abperiasamy/rtl8812AU_8821AU_linux: rtl8812AU_8821AU linux kernel driver for AC1200 (801.11ac) Wireless Dual-Band USB Adapter

準備

$ sudo apt-get update
$ sudo apt-get install -y linux-headers-$(uname -r) build-essential git linux-image-rpi-rpfv linux-headers-rpi-rpfv dkms bc
$ cd
$ git clone https://github.com/abperiasamy/rtl8812AU_8821AU_linux
$ cd rtl8812AU_8821AU_linux/

Makefileの修正

Makefileを編集します。以下のような部分を見つけてください。

CONFIG_PLATFORM_I386_PC = y
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_JB_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
CONFIG_PLATFORM_ARM_S3C6K4 = n
CONFIG_PLATFORM_ARM_RPI = n
CONFIG_PLATFORM_MIPS_RMI = n
CONFIG_PLATFORM_RTD2880B = n

これを以下のようにしてください。

CONFIG_PLATFORM_I386_PC = n # y -> n に変更
CONFIG_PLATFORM_ANDROID_X86 = n
CONFIG_PLATFORM_JB_X86 = n
CONFIG_PLATFORM_ARM_S3C2K4 = n
CONFIG_PLATFORM_ARM_PXA2XX = n
CONFIG_PLATFORM_ARM_S3C6K4 = n
CONFIG_PLATFORM_ARM_RPI = y # n -> y に変更
CONFIG_PLATFORM_MIPS_RMI = n
CONFIG_PLATFORM_RTD2880B = n

make

$ make
make ARCH=arm CROSS_COMPILE= -C /lib/modules/4.1.12-hypriotos-v7+/build M=/home/pi/rtl8812AU_8821AU_linux  modules
make[1]: Entering directory '/usr/src/linux-headers-4.1.12-hypriotos-v7+'
  CC [M]  /home/pi/rtl8812AU_8821AU_linux/core/rtw_cmd.o
./scripts/recordmcount: 1: ./scripts/recordmcount: Syntax error: end of file unexpected
scripts/Makefile.build:258: recipe for target '/home/pi/rtl8812AU_8821AU_linux/core/rtw_cmd.o' failed
make[2]: *** [/home/pi/rtl8812AU_8821AU_linux/core/rtw_cmd.o] Error 2
Makefile:1384: recipe for target '_module_/home/pi/rtl8812AU_8821AU_linux' failed
make[1]: *** [_module_/home/pi/rtl8812AU_8821AU_linux] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.1.12-hypriotos-v7+'
Makefile:1049: recipe for target 'modules' failed
make: *** [modules] Error 2

あれ?エラーだ。 というわけで、対策します。 ちなみに、ここでエラーがなければ 「では、インストール。」の項目に進んでしまって構いません。

続きを読む

Docker海賊Hypriotを使ってRaspberry Pi上でゼロから任意アプリを15分で起動する方法

Raspberry Pi Docker Hypriot HypriotOS

概要

HypriotというLinux Distributionを15分ぐらいでラズパイにインストールして、Dockerで楽にアプリを動かしたり、環境構築したりしようっていう話です。 問題が発生しない限り、ラズパイにキーボードやディスプレイをつける必要もないです。

※15分かどうかはダウンロード速度に主に依存するので、15分ですまなくてもどうかお許しください。

用意するもの

  • Raspberry Pi 2
  • Wifiドングル(USB接続, Raspberry Piと互換性のあるもの)
  • Mac OS Xのマシン + マイクロSDカードリーダ・ライタ
  • SSID, パスワードがわかっているWifiアクセスポイント

Raspberry Pi 2 を動かしていて不満なポイントは?

以下のようなことです。

  • apt-get等でインストールにかかる時間が馬鹿にならない。
  • バージョンの問題等で失敗することも多く、ごそごそ修正する羽目になる
  • しばらく環境をいじっていると、どこをどういじったかわからなくなり、クリーンな状態からどうすれば、動かしたいアプリの実行環境になるのか、完全には把握できなくなる。
  • (きっちりシャットダウンせずに)電源抜き差しすることでSDカードが壊れやすく、壊れると上記理由で復活が面倒でガッカリする

Dockerの利用

上記の問題点は最近話題のDockerでおおかた解決可能なものです。環境セットアップをDockerfileの形で書いて残しておくこと、イメージをビルドしたら、docker hub等のリポジトリにアップロードしておくことが必要ですが、それさえできれば、以下のようなメリットが得られます。

  • dockerだけ入った素の環境から、 docker run 一発で高速、自動的にアプリの動作環境が再現できる
  • Dockerfileがあれば、どう作られたかは明らか
  • 公式を含む、他の人が作ったDockerイメージも流用、派生できるため、大きなモジュールのインストールに時間を割く必要もない。

便利!

残る課題

しかしながら、Dockerだけでは解決しない問題があります。それは、Dockerを動かす環境自体を作るところも結構面倒ということです。少なくとも、以下のようなものが必要でしょう。

  • Wi-Fi認識
  • 接続先SSID、パスワードを指定する
  • avahiのインストール(Bonjourで なんとか.local というアドレスでアクセスできるようにする)

面倒だ!

Hypriot! (はいぷらいおっと?はいぷりおっと?)

そこで、HypriotというLinux Distributionの出番です。

公式: Docker Pirates ARMed with explosive stuff · Docker Pirates ARMed with explosive stuff

f:id:hammm:20160105020216p:plain

Hypriotのとくちょう

  • ロゴがドクロマークで怖そう。
  • 公式サイトの構成がイマイチで情報を探しにくい(汗)
  • RaspberryPi (ARM)で動作するDebianLinuxディストリビューション (基本はRaspbianらしいです)
  • 余分なプログラムが入っておらずサイズが小さい
  • Wifi, Bonjour (avahi), ssh等がセットアップ済みのイメージが用意されており、Wifiドングルさえ挿しておけば起動後、即sshで外部からのコントロールが可能
  • 最新のDocker/Docker Machineが入っており、すぐにDockerを利用できる。

まあ、要するにDockerに最適化された楽ちんなRaspberry Pi向けLinuxです。

※ ちなみに、ドクロの下にでかでかと "Docker Pirates ARMed with explosive stuff" とか書いてありますが、直訳すると 「爆発物を装備(ARM)したDocker海賊」みたいな感じで、Dockerと、Raspberry PiのCPUアーキテクチャであるARMをうまくひっかけつつカッチョいい感じのイメージにしたかったという意思がひしひしと伝わってきます。一部タイトルに頂きましたw

Hypriotのインストール手順 (Mac OS X向け)

今回はflashという名前の、hypriotが用意したスクリプトを使います。 このスクリプトは、Mac OS XLinux向けになっています。

Windowsの場合は、残念ながらこのスクリプトは使えません。 別の方法でSDカードにイメージを書き込んで、occidentalis.txtを手動で修正するなどしてください。

GitHub - hypriot/flash: Command line script to flash SD card images for the Raspberry Pi

続きを読む