Maker Faire Tokyo 2017 企画紹介
クレーン運転士免許を取ろう!-これが本当のクレーンゲーム-
(内容)
クレーン運転士免許の実技試験の合格率は約50%。もっと練習したい貴方に朗報です。クレーン運転士免許の実技試験を体感出来る設備をご用意しました。1/50のジブクレーン模型をRasberry Piで遠隔操作します。
巷に溢れるクレーンゲームは一線を画す体験を貴方に!
(図の説明)
去年はクレーンのみの展示でしたが、今年はゲーム性を取り入れ、実技試験環境を構築しました。参加者に操作を体験して遊んでもらえます。
高さなどのサイズは以下の通りです。
去年のMaker Faire Tokyo 2016のレポート記事
今年新規作成したRaspberry PI Zeroによる小型コントローラと操作ジョイスティック
Intel Edisonを使ったIMU(慣性計測装置)の作成
はじめに
クレーン模型の揺れ止め制御のため、IMUモジュールを作成しました。クレーンで吊られている貨物の中に入れて、揺れを止めるように自動制御させるために利用します。最初はマーカーを複数のUSBカメラで撮影して画像認識によって貨物の揺れを検出しようとしましたが、画像認識アルゴを作る手間とロバスト性、特に遅延の問題が懸念されたため断念し、代わりにMEMSジャイロを用いることにしました。
MEMSジャイロを用いる際に必要となった制限事項は、吊られている貨物に載せるわけですから、(1)無線通信かつ電源はバッテリー(2)通信量を減らすため、加速度から位置を算出する積分またはカルマンフィルター的な信号処理は、吊られているCPUモジュール内で行う、ということが必要となります。作るのは面倒になるかと思いきや、調べてみるとIntel EdisonにSparkFun Electronicsで販売されているモジュールを繋げるだけで、簡単にできてしまうことが分かりました。信号処理も自分で作るとけっこう面倒だなと思っていましたが、RTIMULibというライブラリをインストールするだけで簡単にできてしまうようです。ドローンやロボット関連で必要なのだと思いますが、慣性計測関連は機器・ソフトウェア共に充実していて助かります。
購入したもの
- Intel Edison
- SparkFun Block for Intel® Edison - 9 Degrees of Freedom
- SparkFun Block for Intel® Edison - Battery
- スチロールケース SK-2
- M2 黄銅スペーサー メネジオネジ 3mm <pps-537>
SparkFun社のものは、日本からはスイッチサイエンス社から購入できます。
組み立て
組み立ては非常に簡単です。Edisonと9DoFモジュールとバッテリーモジュールを順に繋げるだけです。ただ、コネクタで繋げただけだと衝撃で外れそうですから、ネジで固定します。Edisonと9DoFモジュール間は、Edison BreakoutBoard Kitに付属してきたネジを使って固定しました。9DoFモジュールとバッテリーとケース間は、M2の3mmスペーサーを利用します。(このネジはSparkFunでも売っていますが、Amazonで上記リンクのものを買ったほうが安いのでお勧めです)
ケースは秋月電子で売っている小さいものに穴を開けて利用します。ただし、バッテリーをケースに入れるとフタが閉まらなかったので、バッテリーだけ外に出しました。バッテリーは交換可能なようにコネクタをつけておきます。
使ってみて分かったのですが、このバッテリーモジュールは、USBからの電源供給時においてもバッテリーを繋いでおかないと Edisonに電源が供給されないようです。つまり、USBから給電するつもりでもバッテリーは常に取り付けておかなければ動作しません。
ソフトウェア
以下のサイトに書かれている通りにして、RTIMULibをインストールします。
つぎに、キャリブレーションを行います。
※今年以内にキャリブレーションの詳細を書く予定
現在、この程度のIMUの精度では滑車の揺れ止め制御はできないのではないか、という疑問が湧いてきているため、使えるかどうか検討中です
更新履歴
2016/10/18 初版
Raspberry Pi Zeroを使った模型コントローラ(Ver.2)の作成
はじめに
前回作成したEdisonによる模型コントローラ(Ver.1) よりも、小型のコントローラをRaspberry Pi Zeroを利用して作成しました。スペックは以下の通りです。
Ver.1のコントローラーを作成した後になってから、Raspberry Pi Zeroと新しいモータードライバの存在を知りまして、これを使えばもっと簡単に作れるじゃないか、ということに気づいたので作りました。
回路図
非常に簡単な回路構成で、買ってきたモジュール同士を線で繋いだだけで作れてしまいます。 必要なモジュールは以下の通り。
Pololu Step-Down Voltage Regulator D15V35F5S3
Pololu TB6612FNG Dual Motor Driver Carrier
Raspberry Pi Camera module v2.1
電源は、外部から6V~13Vの直流電源を接続します。これはそのままモータードライバへ入力されます。モータードライバTB6612FNGは、TA7291Pのように電圧の調整機能がなく、入力したモーター用電源電圧がそのままモーターに出力されるので、外部電源の電圧はモーターにかける電圧と一致させておきます。モータードライバは1つのICで2チャネル、基盤全体で合計4チャネルあります。
Raspberry Pi Zeroへの電源を供給するために、5V/3.5AのDC-DCコンバータを使っています。USBに無線LANドングルを挿したり、デバッグ時にはキーボードなども繋ぐため、少々大きめの電源にしています。D15V35F5S3という電源は、今回使う部品の中で2番目に高価なものです。(1番高いのはカメラモジュール)
ADコンバータは、ポテンショメーターからの位置取得用に利用されます。MCP3008は8チャネルありますが、今回は3チャネル分しかコネクタを取り付けていません。SPI通信でRaspberry Pi Zeroと接続します。このADコンバータはRaspberry Piとの組み合わせでよく使われるようで、検索すれば使い方を説明しているサイトが多く出てきます。
モータードライバの制御用電源とADコンバータの電源は、Raspberry Pi Zeroの基板上で作られている3.3Vの電圧を利用します。GPIOの電圧と一致させて、ロジックレベルの変換を不要とするためです。何mAくらい使っていいのかよく分かりませんでしたが、この回路構成で問題なく動いています。
以前(Ver.1)の基盤では、ドライバへの入力がプルダウンされておらず、OSが起動するまで不定値となってしまい、電源投入後にモーターが動いてしまうという問題がありました。このモータードライバはIC内部でプルダウンされているので、外付けでプルダウンを追加する必要はありません。
このモータードライバは、正転・反転・停止・ブレーキの4種類の動作があります。停止というのは、単に電源供給を停止してモーター端子の間に電流を流れなくします。この場合、モーターは慣性で回り続け、徐々に止まっていきます。一方、ブレーキというのは、モーター端子を短絡させた状態とさせることを意味しており、この場合はモーターは発電機として働き、その回転は電気エネルギーとして端子間を流れて熱に変換されて消費されていきます。そのため、停止にするよりも即時に完全停止します。ブレーキ状態のときにモーターの軸を外部から回転させようとしても、発電機として働いて非常に大きな負荷が接続されている状態なので、非常に回しにくくブレーキの効いた状態になります。
モータードライバとDC-DCコンバータは、スイッチサイエンス社から通販で購入できます。Raspberry Pi Zeroは日本ではまだ売ってないため、Pimoroni社から通販で購入します。海外からですが2週間程度で届きました。
Raspberry Pi Zeroと作成した基盤は、GPIO用40ピンヘッダーで接続します。40ピンヘッダーから電源のやりとりも行えます。5V電源の供給は2,4番ピンから行って問題ないようです。
基盤はTNF34-124というのをカッターで切断して利用しました。Raspberry Pi Zeroの基盤の大きさとほぼ同じ大きさに詰め込めました。
モータードライバのピッチ変換基盤の下に配線を入れてしまったので、いったんモータードライバ基盤をはんだ付けしてしまうと、間違っていた時に修正がめんどくさくなる構成になってしまいました。取り付け前に配線が間違っていないか念入りに確認しておきます。
実は基盤が完成した後で、規格外のモーターを接続してモータードライバを壊してしまいまして、そのときは修理が大変でした。ピッチ変換基盤を取り外そうとしましたが、基盤がスルーホールではんだを完全に取るのが大変だったのであきらめました。その代わりに、SOPのTB6612FNGをカッターナイフで取り外し、単体で購入してはんだ付けしなおしました。SOPのICは、足を壊していいなら取り外すのは結構簡単です。カッターで切断して取り外し、残った足は、はんだごてとはんだ吸収線で簡単に除去できます。
ソフトウェア
無線LANドングル
左がWLI-UC-GNM、右がOfficial Raspberry Pi WiFi dongle
Raspberry Pi Zeroを無線LANに接続するのは、けっこうハマりました。いろいろ必要な部品がセットになっていたので、Pi Zero CCTV Kit (Little Bro) - Pimoroniというセットを買ったのですが、これに付属していたOfficial Raspberry Pi WiFi dongleが、どうやっても自宅の無線LANルーターと接続できませんでした。ハードウェアは正しく認識されて、ルータのSSIDは表示され、パケットも少しはやり取りできているはずなのに、DHCPのアドレスが取得できず通信できませんでした。固定IPにしても無理でした。そこで、ネット上で動作報告のあった、バッファローのWLI-UC-GNMを試しに買ってきて接続してみたら、一発で動作しました。無線LANに詳しくないので原因はさっぱりわからずじまいでしたが、この件で2日ほど無駄にしました。
カメラからの動画取得
最初は、CCTVキットを動作させる方法を説明している「Make a Raspberry Pi CCTV security system | Expert Reviews」の通りにすれば、すぐに画像が出ると思っていたのですが、motion-mmalcamを動作させるためのライブラリがインストールできないものがあり、すぐに暗礁に乗り上げてしまいました。
OSには、Raspbian JessieのVersion May 2016を使っていたのですが、この環境だとうまくいかないのかもしれません。検索してみると、以下のサイトで書いてあるのと全く同じ状況になっており、mjpg-streamerを使うと動いたと書いてありましたので、その通りにしたらすんなり動きました。大変感謝です!
ソフトウェアPWM
ソフトウェアPWMには、最初はpigpio libraryを利用しようとしましたが、うまく動きませんでした。PWMだけでなく、普通のIO制御も全くできませんでした。ライブラリにはZeroでも対応していると書いてあるため、Raspbian Jessieだと、現時点で正常に動かないだけなのかもしれません。代わりに、RPi.GPIOでもソフトウェアPWMに対応しているようだったので、使ったらすんなり動きました。
ただし、ソフトウェアPWMはCPUの負荷が高いようなので、mjpg-streamerと同時に動かすとモーターの音が乱れます。Zeroはシングルコアなので余計に負荷の影響を受けるのかもしれません。対策として、動画のフレームレートを落とすと影響が少なくなるようなので、画像サイズ640x480にて5~10FPSに設定しています。
Ver1.0のコントローラ基盤との大きさ比較
奥のものがVer1.0の基盤です。部品点数が大幅に減って小型化しました。また、配線が楽になって大幅に作りやすくなりました。コスト的には、高かったEdisonが安いRaspberry Pi Zeroに置き換わったうえ、部品点数も減ったのでトータルでは少し安くなっていますが、海外からの送料などもあるので、大幅に安くなってはいないです。
ちなみに、Pimoroniで売っているPibow Zero Case for Raspberry Pi Zero version 1.3に入れると以下の写真のようになります。webに組み立て図があるのを知らずにパズルのように部品を組み立てたら、どの層のパーツなのか分からなくて迷って結構大変でした。取り付けると結構大きくなってしまうので残念ながら取り外し予定。
PC側の操作アプリケーション
以上によって、無線LAN経由でカメラとモーターと位置センサの情報が取得できるようになりましたので、次は操作するクライアントアプリケーションを作成します。前回(Ver.1)ではpythonでTornado(webサーバ)を起動させて、webブラウザから制御できるようにしたため、webブラウザさえあれば操作できました。この方法ではスマホ等からでも操作できるという利点はあったのですが、スクロールバーで操作するのは使いにくかったため、今回は専用のWindowsアプリケーションを作成することにしました。
クライアントアプリ(操作アプリ)は、.Net Framework (C#)で作成します。ユーザーインターフェイスはWPFを使うことにしました。通信はソケットを利用した文字列によるコマンド/データの送受信を行います。メインスレッドからインターバルタイマーによる一定周期にてRaspberry Piへのコマンド送信を行い、別スレッドにてRaspberry Piからの受信を行います。別スレッドからWPFのUI描画を直接行う際には、Dispatcher.BeginInvoke()を利用するのを忘れてはなりません。
(※画像はデザイン時用のハメコミです)
ジョイスティックによる操作
ジョイスティックによるモーター操作をできるようにしました。X,Y軸の倒れとPoVボタンの上下方向をZ軸として使っています。写真のジョイスティックではZ軸の回転も取得できるのですが、これは用途が思い付かなかったので利用していません。
ジョイスティックを使うのはDirectInputを使えばいいことは分かっていたのですが、.Netからどのように使うのか分かりませんでした。調べたところ、DirectXのmanagedラッパークラスライブラリである「SharpDX.DirectInput」を使えば楽なようです。(これは個人の方が開発されたものです。Microsoftが提供しているライブラリは探したけどありませんでした。)NugetのPackage Manager Consoleから「Install-Package SharpDX.DirectInput」と打ち込むだけでOKです。DirectX SDKのインストールは必要ありません。具体的な利用方法は、「Taking input from a joystick with C# .NET - Stack Overflow」のページに書かれています。基本的な使い方として、定期的にジョイスティックログを読みだして、注目する種類のログのタイムインデックスにおける最新の値のみを適用します。過去のタイムインデックスは、おそらく操作の速度を知りたい場合などに必要となりそうです。
Motion JPEG (mjpg)ストリームの表示
mjpeg-streamerには、画像スナップショットをhttpで1枚1枚読み出す方法が提供されているので、それ経由で画像を取得してからWPFのImageに表示させて、DownloadCompletedのタイミングでまた次の画像を取りに行く(javascriptではそうやって表示させている)という方法を最初に試しましたが、画像の更新が遅すぎて断念しました。検索してみると、「MJPEG Decoder」というライブラリを見つけたので、使ったらすんなりと滑らかに画像が表示されました。使い方はこちらのページなどに書かれています。
ソースコード/インストール方法
ここで公開予定です。
履歴
2016/9/3 初版
2016/9/19 PC側アプリを追加
2016/9/23 Pibow Zero Caseの写真を追加
遠隔制御タワークレーン(JCC-V720S) 1/50模型 Maker Faire 2016出展報告
Maker Faire 2016出展報告
2016年8月6,7日に東京ビッグサイトで開かれた、Maker Faire 2016での展示の様子を報告いたします。
展示の様子
右側のパソコンでwebブラウザから操作できるようになっています。ブラウザのスクロールバーをタッチパッドで動かすのは操作しずらかったので、次回はジョイスティックや自動操縦などに変更することを考えています。
左側のパソコンには、模型作成の上で参考とした撮影写真を表示しました。また、部品を手に取って眺めていただけるようにしました。
模型アップ
スケール比較用の人形を配置しました。
制御基盤は操作室がある部分に設置しました。USBカメラはアーム部分に固定してあります。1日目は無線の接続がよく切れて大変でしたが、2日目は一度も問題は起こりませんでした。
Maker Faireでの出展は初めてだったのですが、想像以上に多くの方々に見に来ていただきました。ありがとうございました。
今回展示した重機模型については、好評な意見を多くいただきました。大変励みになりますので、次回は完成品を展示できるように頑張りたいと思います。制御に関しては、今回はwebカメラ程度のことしかできませんでしたが、面白いことができるとよいという感想を多くいただきましたので、次回に向けてアイディアを出しています。全体的な傾向として、Maker Faireでは弱電系というか、マイコンなどを使った電子工作系の展示が多い感じがしますので、制御系にも力を入れていきます。
参考リンク
更新履歴
2016/9/2 初版
遠隔制御タワークレーン(JCC-V720S) 1/50模型 参考資料
Maker Faire Tokyo 2016 (8月6日(土)、7日(日)東京ビッグサイト)への出展が決定いたしました!
まだ制作中の資料を掲載します。
タワークレーン(型番:JCC-V720S)の精密なオリジナル模型に、Intel Edisonを利用したモーター制御装置やUSBカメラを実装しました。これにより、重機模型業界では初となる(当方調べ)、インターネット経由でのスマホetcによる遠隔操作が可能です。模型は外見だけでなく構造も忠実で、実機と同様に分解・搬送が可能です。また、コンテナ振れ止め制御などのアプリケーションも検討しました。
左側が展示予定の模型の一部です。
大きさの概要
電装系の概要
Intel Edisonを使った模型コントローラの作成
はじめに
切手サイズ(より少し大きい)Linuxマシンである、IntelのEdisonを用いて、模型のコントローラを作成しました。模型自体は共同制作者が作成しますので、私は電装系担当です。必要な電装系のスペックは次の通りです。
要するにネットワークカメラのようなものです。無線LAN経由でスマホetcから制御できたらいいと思ったので、Edisonを使って作ることにしました。Edisonを使ってネットワークカメラを作成した例では、以下のnewralassemblyさんの記事を参考にしました。
neuralassemblyのメモ: Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた
ただ、今回作りたいものは、上記記事の構成とは少々違っていて、マイクロサーボではなくてDCモーターである点が最大の違いです。
回路図
DCモーターのためのモータードライバはTA7291Pを使いました。回路図中の赤い点線で囲ってある部分がモータードライバで、合計4つあります。TA7291Pでは、正転か反転かでPWM信号をIN1に入れるかIN2に入れるのかを切り替えなくてはならないため、切り替えのためにANDゲート×2を使っています。
モータードライバーへの入力電圧は12Vで、Vrefの電圧をボリュームで調整して、モーター端子の電圧を調整できるようにしてあります。モーターは6Vかけることを想定しているので、降圧が大きくて発熱するだろうなと思いましたが、実際やってみるとモーター次第ですが、大電流を流すとかなり熱くなります。しかし、今回利用するモーターを利用する限りはほとんど発熱しなかったため、このまま使っています。
ADコンバータはMCP3002というのを利用しましたが、これはポテンショメーターに繋がれて、模型の位置取得に使われます。
Edisonのコネクタとそのまま接続するのは大変なので、ピッチ変換基盤が必要です。秋月電子で売っているものとBreakout Board Kitを比べて、前者のほうが安かったのですが、今回はサイズ制限の都合でBreakout Board Kitを使いました。
また接続に関してですが、Edisonの端子のロジックレベルは1.8Vなのですが、これを他ICのロジックレベルである5Vに変換する必要があります。昇圧側の14本は、FXMA108というICを使いました。これはピッチ変換基盤といっしょに、秋月電子で8ビット双方向ロジックレベル変換モジュールという名前で売っています。降圧側の1本(SPI接続の受信用)は、抵抗で分圧しています。
ソフトウェア
USBカメラのストリーミング
newralassemblyさんの記事を参考に、mjpg-streamerを利用しました。
モータードライバ制御 / ADCデータ取り込み
Pythonでプログラムを書きました。mraaというライブラリをインポートするだけで簡単に使えます。
Webブラウザによる操作
newralassemblyさんの記事では、Node.jsを使ってWebSocketを利用した例が紹介されています。 今回はPythonを使いたかったので、webサーバとしてTornade、クライアント側はjavascriptという構成にしました。TornadeでWebSocketを利用したサンプルは、REM web developmentさんの記事を参考にしました。
ここにアップロード予定
改良点など
コンテナの防振制御などを予定していましたが、Maker Faire 2016には間に合いませんでした。次回以降に開発予定です。また、webブラウザのスクロールバーによる操作というのは実際やってみるとやりにくいものなので、次回はゲーム用ジョイスティックで操作できるようにする予定です。Maker Faire 2016での出展の様子は以下リンクにあります。
ハードウェア的な問題としては、モータードライバへの入力がLinuxが起動するまでの数十秒間、ハイインピーダンスで不定入力になってしまったせいで、起動時にモーターが動きっぱなしになってしまい、模型の一部を壊す問題を起こしてしまいました。プルダウンなどの対策を入れる必要があります。また、基盤のサイズ自体も当初の計画の範囲内に入っていないため、より小型化したRaspberry Pi Zeroによる制御基盤Ver.2を作成予定です。(Maker Faire 2016でも、見に来ていただいた方からパイゼロ使えばいいのではとアドバイスをいただきました)
Raspberry Pi Zeroの方が、Edisonよりも基板サイズはかなり大きいのですが、これでなぜ小型化できるのかというと、EdisonではGPIO電圧が1.8Vだったのですが、これをモータードライバやADCと接続するのにロジックレベル変換が必要となり、そのための部品を載せるスペースが必要でした。一方、Raspberry Pi Zeroは3.3Vであるため、モータードライバやADCにそのまま接続できます。さらに、今回のEdisonではハードウェアPWMを使ったのですが、モータードライバと接続するためにロジックICが必要でした。Raspberry PiにはソフトウェアPWMのライブラリが多くあるようなので、(Edisonでも探せばありそうですが)余計なロジックなしにそのままモータードライバと直結でき、部品数が減らせます。ついでに、Raspberry Pi用のカメラはUSBカメラよりも小型なので、さらに省スペースになりそうです。Pi Zeroによるコントローラの作成詳細は以下リンクにあります。
更新履歴
2016/5/5 初版
2016/9/2 更新
2016/9/3 更新