ダヴィンチMini wを購入

Raspberry PiArduinoで作ったデバイスを納めるケースを作るために3Dプリンタを買ってみました。

買ったのはXYZプリンティング社のダヴィンチMini wでAmazonで41,000円、合わせてブラックとホワイトのフィラメントも約3,200円と約4,400円で購入しました。

jp.xyzprinting.com

組み立て&テスト印刷

ほぼできた状態で来ますが少しだけ組み立てが必要です。

f:id:LocaQ:20170122234218j:plain:w300

組み立てといっても最初に内部の固定材を取り、プリントモジュールとフィラメントを装着するだけですが、付属していた紙の組み立てマニュアルが白黒かつ粗い印刷で写真に何が写ってるか分からない状態だったので、少し苦労しつつ組み立てました。ただ後で気付いたんですが、XYZプリンティングのサイトからカラーのマニュアルをダウンロードできるので、先にダウンロードしておくといいと思います。一緒にXYZwareというアプリもダウンロードしてインストールしておきます。

組み立てが終わったら電源入れてUSBケーブルをPCに繋いでXYZwareを起動します。

f:id:LocaQ:20170123000518p:plain:w300

起動したらマニュアルに印刷の手順が書いてある(画面が実際と違ったりしますが)のでその通りにやってみます。

が、左上の"↓"というアイコンをクリックするとダイアログが表示されてサンプルデータが6つ表示されますが全て別のダヴィンチシリーズのプリンタ用のファイルらしく、開けますがダヴィンチMini wで印刷できません。意味が分からない。
[2017/1/31 追記]
XYZwareのメニューの設定ボタンをクリックするとダイアログが開き、そこの"プリンター"というタブにある"サンプルファイルを開く"というボタンがあります。そのボタンをクリックするとちゃんと印刷可能なデータがありました。

幸いXYZプリンティングのサイトにたくさんデータが公開されているので小さめの物を選んでダウンロードします。私はこれを選びました。

サンプルデータを開いたらフィラメントのロードを行ってから印刷をします。最初なので品質は普通(3つの内一番低い品質)にしました。

印刷中はそこそこ音がします。

だいたい15分くらいで出来上がりました。

f:id:LocaQ:20170123002351j:plain:w300 f:id:LocaQ:20170123002929j:plain:w300

文字の輪郭部分が所々崩れてたり全体が反ってたりしますが印刷品質設定を普通にしたからなのかは分かりません。質感は硬いプラスチックで手で折れないくらい硬く、重さは軽い感じです。

次は印刷品質を非常に良い、レイヤの高さ(層の厚さ)を最も薄い0.1mmに設定して印刷してみます。

f:id:LocaQ:20170123003855j:plain:w300

時間は約30分でさっきの倍の時間がかかりましたがさっきより文字の輪郭部分が崩れてます。層は確かに薄くなっていて、さらに全体的に角がしっかりしている(品質が普通のやつは角に少し丸みがある)ので、何か他の設定に原因があるのかもしれません。

Wifiの設定

ダヴィンチMini wにはWifi機能が付いているので設定してみましたが仕様がかなり不便です。

まずダヴィンチMini wのWifiの設定をするにはUSBケーブルをつなぐ必要があり、その状態でXYZwareからSSIDとパスワードを設定します。その後USBケーブルを抜ていもWifiで繋がっているので印刷ができます。

ただしWifiの設定はプリンタの電源を切ると消えてしまうようで、Wifi設定をした後に電源を抜いて移動させることができません。なのでPCとUSBケーブルがつながる範囲に設置することになります(もしかしたら別のノートPCでWifi設定をすれば離れた場所のPCから使えるかもしれませんが未検証です)。これが結構不便で、せめてスマホUSBメモリを使ってプリンタのWifi設定ができればWifi機能が活きるんじゃないかと思いました。

最後に

思ってたほどうまく印刷できなかったので色々検証する必要がありそうでした。

廊下の電灯を自動でOn / OffするデバイスのプログラムをF#で書き直した

前にRaspberry Piで動くデバイスのプログラムをF#で書き直した。

locaq.hatenablog.com

locaq.hatenablog.com

ソースコードは上の記事にリンクがあるのでそこから見られる。

理由

自分はどうも動的型付け言語は苦手みたいで中々モチベーションが湧かなくて静的型付け言語で書き直したくなったのが理由で、F#を選んだのは関数型言語を勉強したかったのと、Visual Studioで開発ができるから。

.NETからGPIOを扱うためのライブラリもいくつかあるので要求は今のところ満たせてる。

locatw/WiringPi.Net · GitHub

raspberry-sharp (Raspberry#) · GitHub

Raspberry#はオブジェクト指向な設計になっていてC#と馴染む感じだけれど開発があまり活発でないのが気になる。raspberry-sharp-ioはPWMをまだサポートしていない(将来される予定らしい)ので自分がやりたいことができるか確認してから使うのがいい。raspberry-sharp-systemはRaspberry Piのモデルの種類やファームウェアのバージョンなんかのシステム情報が取得できるので、ライブラリを作るときに便利なんじゃないかと思う。

自分が作ったデバイスはサーボを動かすのにPWMを使っているので今回はWiringPi.Netを使った。ただ、こっちも開発がほぼ止まっていて(最近のissueに返信はあったけど)ビルドエラーが出て使えない状態だったので、フォークして修正したものを公開した。

Qiitaに記事を書いたので詳しくはそっちを参照。

qiita.com

感想

GPIOなんかのRaspberry Piに依存する部分以外はWindowsで実行できるので、Intellisenseやデバッグが快適で気に入ってる。(PythonVisual Studio用の拡張があって状況は同じはずなんだけど、いまいちうまく動かなくてあまり快適ではなかった。)

気になるのは、数あるセンサーを使うときに.NET用のライブラリが提供されるのは少なそうなところ。C言語用のライブラリがあればラッパーを書けるので.NETからでも使えるけど、ラッパーを書く分の手間はかかるので、そこはPythonとかの方が有利かなぁと思う。

あと、F#はまだ身についたわけではないから正しいか分からないけれど、デバイス用のプログラムを書くのに適しているかというと内容によるかなーという感じ。デバイスの状態を扱うならオブジェクト指向言語の方が適しているかもしれない。ただ、F#でも当然状態は扱える(クラスも書ける)し、関数型言語はロジックを書くのに適してる(と現時点では思ってる)ので、その比重が高くなれば特徴が生かせるんじゃないかと思う。

とはいえF#とC#だったらできないことの差はないので好きな方を使うのが一番快適だと思う。

それとPythonについては自分は使うのをやめることにしたけど、言語の優劣ではなく自分との相性と開発環境周りが理由なのでPython好きな人は気を悪くしないでほしい。自分でもこんなに相性や開発環境の影響があるとは思ってなかったのでびっくりしてる。

今後

F#で書き直したので今度はAzureのIoT Hubを使ってみようかと思って今勉強中&構成を考えてる。Azureなので.NET系言語との相性は良さそう。

廊下の電灯を自動でOn / OffするデバイスをRaspberry Piで作った(センサー側)

今回はこの記事のセンサー側について。今回のデバイスを作成した動機や全体の詳しい説明もこっちに書いてある。

設計

全体の構成を再掲。今回は左側の青い枠の部分の話。

f:id:LocaQ:20150124174637p:plain

ハードウェア

ハードウェアはシンプルで、Raspberry Piと人感センサー、Wifiアダプタという構成。人感センサーはParallax社のPIRセンサーを使った。人が動くとセンサーの信号線からHIGHが出力されるので簡単に使える。

Raspberry PiとPIRセンサーをそれぞれモールドケースに入れた。

f:id:LocaQ:20150201134012p:plain

使ったもの

PIRセンサーとケース以外はスイッチ操作側と同じものを使って作った。

回路図

回路はこんな感じで作成した。PIRセンサーのVCCと3.3V、GND同士、信号線とGPIO17を繋いでいる。 信号線とGPIO17の間には220Ωの抵抗を挟んでいる。

f:id:LocaQ:20150201134841p:plain

(図のRaspberry PiはModel A+がなかったのでB+のものを使った。)

ソフトウェア

コードはスイッチ側と同じくPythonで書いた。

PIRセンサーの出力を一定間隔で読み込んで、LOW→HIGH(人の動きを検知した)になったらスイッチ操作側のRaspberry PiのREST APIスイッチ操作側参照)にアクセスして、廊下の電灯をOnにする。

Raspberry PiのGPIOへのアクセスはWiringPi2-Pythonを使った。

WiringPi2-Python

ソースコード

ソースコードgithubで公開している。

locatw/autonek-hamtor · GitHub

設置

センサーを壁に取り付けた様子。壁美人っていう壁に開けた穴が目立たないフックがあったので、ケースの裏側に開けた穴に引っ掛ける形で取り付けた。リード線が見苦しいのでうまく隠す方法を探してるけど、まだ見つかっていないのでそのまま。

f:id:LocaQ:20150201132342p:plain f:id:LocaQ:20150201132348p:plain f:id:LocaQ:20150201134007p:plain

Raspberry Pi側は洗濯機がある所に洗剤と一緒に適当に置いてる。


実際に動作してる様子はこちら。(スイッチ操作側と同じ動画)

廊下の電灯を自動On / Offするデバイス - YouTube

Intel Edison勉強会に参加してきた

2015年1月30日に行われたIntel Edison勉強会に参加してきた。

現時点で公開されている発表資料はこちら。

[2015/02/09追記]

勉強会のページで発表資料が公開されていました。

Intel Edison勉強会 - 資料一覧 - connpass

個人的に勉強になったことのまとめ

個人的に面白かったり気になったりしたことをまとめておこうと思う。自分は今Edisonを持ってなくて、今回はどんなものか知りたかったのが参加した目的。

※注意:当日のメモを元に書いているので内容はあまり正確ではないと思う。正確な情報は各自調べるようにしてください。

R2ファームウェア

Intelの中の人の発表によると、近いうちにR2というEdisonの新しいバージョンのファームウェアが出るようだ。

R2ではオーディオ再生やMCU用のSDKBluetoothのプロファイル追加などの機能追加があるみたい。

今までBluetooth対応だと聞いていたけど、まだ完璧ではなかったらしい。でも今回みたいに色々な機能が増えたり強化されたりするということは、今後のバージョンアップでも面白そうなことができるようになったりしそうで期待できそうだ。

EdisonにはAtomとQuarkの2つのプロセッサが載ってる

ずっとEdisonはデュアルコアAtomが載ってるだけだと思ってたけど、それとは別にMCUとしてQuarkプロセッサが載ってるようだ。QuarkではリアルタイムOSが動作するらしい。

上で書いたようにR2ファームウェアMCUSDKが含まれる予定で、これを使ってQuarkプロセッサ用の処理が書けるようになるようだ。リアルタイム処理が書けるようになるみたいだけど、どの程度書けるかは実際に公開されたものを使ってみて検証する必要がありそう。

mBaaS

mBaaSはニフティさんのモバイルバックエンドサービス。

mBaasとEdisonなどのIoTデバイスを組み合わせたメリットの話が勉強になった。

IoTデバイスは常時電源を使えるとは限らないし、メモリーやストレージが小さいので常時全てのデータを保存しておくことはできないから、適宜データを捨てる必要がある。また、大量のデバイス1つ1つにスマホからアクセスするのは現実的じゃない。けれどmBaaSをデバイスとスマホの間に置けば、データの保存やアクセス処理が簡単にできるようになるし、デバイスの管理もできるよ、ということだった。

それと、M2M(Machine to Machine)ではデバイスが多種類あるとプロトコルを合わせるのが難しいけども、間にクラウドサービスを挟む(M2C2M(Machine to Cloud to Machine))とクラウドプロトコル変換を行えるので楽になるという話だった。デバイス上でたくさんのプロトコルを実装するのはスペックの制約があるしデバイスのリソースも奪うので大変だったり難しいけども、間にmBaaSを挟むことで、mBaaSで対応しているプロトコルを使ったりリソースが豊富なサーバーでプロトコルを処理できるから楽になるってことだと理解した。

クラウドサービスに詳しくないので具体的な使い方が分かって勉強になった。mBaaSはある程度は無料で使えるみたいなので、試してみると面白そうだ。

mBaaSとは | ニフティクラウド mobile backend

Amazon SQSとEdisonを組み合わせたデモ

Amazon SQSとEdisonを組み合わせたデモが面白かった。Amazon SQS(調べたらスケーラブルで高可用なキューサービスらしい)にメッセージを送ると、3台のEdisonのどれか1台がそのメッセージを処理するというもので、Edisonに接続されたLEDを光らせたりブザーを鳴らしたりしていた(電気ショックもあった)。

普通はデバイス側がデータを送る方だけど、今回は逆にデバイスでデータを処理するという発想で、自分が思いつかなかった考え方なのもあって面白いなと思った。

こういうアイデアを出せるようになるには実際に色々作ってみる必要があるのかなと思ったので良い刺激になった。

Henry

今のところEdisonでUSBカメラを使うにはカーネルを自分でビルドし直さないといけないが、Henryという拡張ボードを使うとUSBコネクタにUSBカメラを繋げるだけですぐに使えるらしい。

FRISKケースに入るEdison用ベース基板 Henry - ランニングエレクトロニクス

フリスクケースに入る大きさで9軸モーションセンサーを載せているようだ。他にもEdisonの使い勝手を良くする機能が載ってるみたい。

日本語の情報が少ない

発表者の人がEdisonの日本語情報が少なくてすごく苦労したと言っていた。Edisonユーザー会が出来たのも、日本語の情報を集約したりして情報を共有するのが目的の1つだと言っていた。

その他

他にも色々話を聞いたので簡単に載せておく。

  • 開発環境
  • ubilinuxというEdisonで動くDebianがある。
  • Edisonにはinit.dはないのでsystemdを使う。
  • configure_edisonという設定スクリプトがある。
  • opkgというEdison用のパッケージマネージャがある。
    • 初期状態だとリポジトリが少ないので追加すると良い。
  • Intel Edison Kit for ArduinoのPWM Swizzlerは、EdisonのPWM出力(4本)を拡張ボードのPWM出力(6本)のどこに振り分けるかを決める。
  • ピンマルチプレックス
    • EdisonのピンマルチプレックスについてはIntelから情報がほとんど出てないけれど、代わりにEmutex社というところが詳しい情報を公開している。
    • EdisonとIntel Edison Kit for Arduinoの両方でマルチプレックスしている。
    • MRAAなどのライブラリを使うほうが楽らしい。
  • EdisonのGPIOは1.8Vで大抵のセンサーを繋げるには電圧の変換が必要だけど、変換はそんなに難しくないらしい。(後で調べたら変換する部品が数百円で売ってたので挑戦してもいいかも。)
  • MRAAはEdisonだけでなくRaspberry Piなどにも対応しているので、勉強しておくと他のデバイスを使う時でも役立つ。
  • MRAAは「ムラー」と発音するようだ。
  • EdisonはIntelがフルカスタマイズで作ったものなので完成度が高い。

感想

Edisonのソフトウェア環境はまだまだ開発中らしくバグも多いけど、開発が活発にされてるのでアップデートも頻繁に行われていて楽しそうだ。

Intelの中の人や実際にEdisonを使って勉強してる方達の話だったので、実際に役立ちそうな情報がたくさんあったと思うし、Edisonに限らずサーバーとの組み合わせとかの勉強になったり開発のモチベーションも上がったりしてとても良い勉強会だった。

主催者の方と発表者の方々ありがとうございました。

廊下の電灯を自動でOn / OffするデバイスをRaspberry Piで作った(スイッチ操作側)

自分が住んでる部屋の廊下の電灯はスイッチは玄関側に付いていて、部屋から廊下の電灯を付けるのにわざわざ玄関まで行く必要があって面倒だった。 とくに仕事から帰ってきたときが面倒で、

  1. 玄関から入ってすぐの廊下の電灯を点ける
  2. 廊下の先まで行って部屋の電灯を点ける
  3. 玄関まで戻って廊下の電灯を消す
  4. 部屋に行く

と、廊下を1.5往復する必要があった。

そこでセンサーを使って廊下に人がいるのを検知して、電灯スイッチを操作できるシステムをRaspberry Piで作ってみた。 今回は廊下の電灯スイッチを操作する側について書く。(センサー側は後日書く予定。)

設計

構成はこんな感じにした。

f:id:LocaQ:20150124174637p:plain

人の動きを検知するセンサーを、スイッチのある場所から離れた所に設置する必要があったので、センサー側と電灯のスイッチを操作する側を分けて構成した。

今回は右の赤い枠の部分の話。

廊下に入ったことをセンサー側のRaspberry PiからHTTPで通知されたら電灯をOnにする。ただし既にOnならそのまま維持して、一定時間経ったら自動で電灯をOffにする。

ハードウェア

HTTPで通知を受けるのにLANケーブルを引っ張りたくはなかったのでWifiアダプタを使った。スイッチの切替は構成図にある通りサーボで行う。

それとマイコンとサーボ剥き出しだと常用するには見た目が良くないので、モールドケースというのがスイッチカバーと同じ大きさで高さもちょうどよく、安かったので使うことにした。


f:id:LocaQ:20150125114016j:plain f:id:LocaQ:20150125113542j:plain f:id:LocaQ:20150125113415j:plain

左はRaspberry Piを取り付ける前。モールドケース(のフタ側)に電灯のスイッチとが入る大きさの穴を開けて、そこに合わせてプラ版でサーボを固定した。サーボは1個で電力に余裕があるのでRaspberry Piと直接接続した。高さを抑えるためにGPIOピンを横向きにするピンソケットを使ってケーブルが横に出るようにしている。

真ん中はRaspberry Piをプラ版に取り付けた後。小さいのでケースにギリギリ入る大きさ。

右は裏側の様子。この面が壁と接する。上下の穴は壁にあるスイッチカバー取り付け用のネジ穴に合わせて開けたネジ穴。


f:id:LocaQ:20150125233752p:plain f:id:LocaQ:20150125233759p:plain

左は斜めから見た様子。ケースの高さに収まるようにRaspberry Piを上下逆さまに取り付けてる。

右はケースに収めた状態。Raspberry Pi自体はケースにギリギリ収まったけど、USBの電源コネクタがModel A+は横(HDMIコネクタと同じ辺)についてるのでケースに収まらなかったのでケースに穴を開けてUSBケーブルを接続してる。

使ったもの

  • マイコン:Raspberry Pi Model A+
  • サーボ:Tower Pro SG90
  • Wifiアダプタ:BUFFALO 無線LAN子機 WLI-UC-GNM
  • microSDカード:東芝 microSDHC 16GB(Class10 30MB/s UHS-I 防水 耐X線
  • ケース:テイシン モールドケース TB54B
  • その他:
    • USBケーブル
    • Raspberry Pi用 L字ピンソケット2×13(26P)
    • リード線
    • Qiコネクタ
    • 熱収縮チューブ
    • プラバン
    • ネジ
    • ナット
    • スペーサー

回路図

回路はこんな感じで作成した。サーボのVCCと5V、GND同士、信号線とGPIO18を繋いでいる。

GPIO18はPWM出力をできるピンだ。

f:id:LocaQ:20150123191059p:plain

(図のRaspberry PiはModel A+がなかったのでB+のものを使った。)

ソフトウェア

HTTPで通知を受けるためのサーバーはflask-restfulというPythonのライブラリを使って実装した。

flask-restful

flask-restfulは簡単にREST APIのサーバーを書けるフレームワークで、今回もサーバー部分はAPIが少ないのもあって20行程度でサクッと実装できた。 マイコンで動かすサーバープログラムは小規模なもので済むものも多いだろうからこれくらいサクッと書けるのはうれしい。

また、サーボの制御はWiringPi2-Pythonを使った。

WiringPi2-Python

サーボの制御は拙著でまとめてる(言語はC++だけども)ので、そのままのやり方で行った。

RaspberryPiとWiringPiでサーボを動かす - Qiita

REST API

APIは今のところスイッチのOn / Off状態の取得と設定を行うものだけ定義した。

スイッチをOnにするときは、

[URL] http://example.com/Switch
[POSTデータ] {'state': 'on'}

というリクエストを送るとサーボがスイッチをOnにして電気が点いて、自動Offまでのタイマーをスタートする。 ただし既にOn状態ならサーボは動かさず、自動Offまでのタイマーをリスタートする。 また、'on'を'off'にすればスイッチをOffにして電気が消える。

スイッチの状態を取得するときは、

[URL] http://example.com/Switch

というリクエストを送ると {'state': 'on'} というJSONデータが返ってくる。

ソースコード

ソースコードgithubで公開している。

locatw/autonek-halitch · GitHub

設置

f:id:LocaQ:20150125235820p:plain f:id:LocaQ:20150125235826p:plain f:id:LocaQ:20150125235843p:plain

光が入らないので少し暗いけど、設置した様子はこんな感じ。

廊下の電灯のスイッチカバーを外した所と、設置してケースを被せる前と、ケースを被せて電源ケーブルを接続した所。

(スイッチカバーを外した状態がずいぶん雑だったんだけど、どこの家もこんなものなのか気になる。)


実際に動作してる様子。

廊下の電灯を自動On / Offするデバイス - YouTube

課題

動作音が意外と大きい

ケースに入れててもサーボの動作音とスイッチの切り替え音が結構大きくて少し気になる。ケースを密閉したりして防音する方法もあるかもしれないけど、Raspberry Piが出した熱が籠もってしまう。

ただRaspberry Pi Model A+は発熱が少なめで、ヒートシンクをつけた旧式のModel Bはアイドル状態でも触ると結構熱いけど、Model A+はヒートシンクなしでも40℃で温かい程度だった。夏はどうなるか分からないけど熱対策はやりやすそう。

REST API以外のインターフェースがない

実際に24時間動かして使ってみたら、料理したりするために台所に立つと、まだいるのに自動で電灯がOffになったり、動くとまたOnになったりして十数回スイッチが切り替わってしまってうるさかった。

人感センサーは動いた人間を検知するものなので、じっと立ってるだけだど検知しないのが原因。なので常時点灯モードみたいなのを作って切り替える機能を付ければ解決できるんだけど、この装置には現状HTTPアクセスしないと操作できないのでスマホかPCからアクセスする以外に方法がないが、わざわざスマホやPCを操作するのは少し面倒だ。

解決策として物理ボタンを付ける、タッチディスプレイをつける(PiTFTとか)、音声認識やジェスチャー認識機能をつけるとかが思いつく。

Raspberry Piの長期運用の対策

上の2つの課題があるけれどうまく動いてるのでずっと動かしておくつもり。けど、そうするとmicroSDカードの寿命が気になってくる。Linuxが動いているのでmicroSDカードにログが書き込まれるから、セルの書き換え寿命が来たらmicroSDカードを交換しないといけない。

対策としてRAMディスクを作ったり、ファイルシステムをリードオンリーにしたりする方法があるみたいなので、これもその内やっておきたい。