2015年10月24日土曜日

飛行船型ドローンを作った

飛行船ドローン。写真の人物は私ではないです。

概要


 高専の研究室のメンバーで全長2m程度の飛行船を作成して課題部門に出展した。無事企業賞をいただいた。発案とプロジェクトリーダ、電子ハードウェア、機体制御の開発を担当した。


製作の理由


 講義の一環として研究室で何か作るということになっていてその過程で製作した。課題部門の課題が災害対策ということでブレインストーミングを行ったところ見事私の『火の用心ドローン』が採用され、もう少しまともな感じにプロジェクトをまとめつつ製作を行った。

 最初の案は文字どおり、「火の用心!マッチ一本火事の元!」と大音量で流しながら住宅地を飛び回り地域住民の皆様に火の用心してもらうというものだったが、ネタに走りすぎているのと割と精神的健康を疑われそうなので案に改善を加えた。

 役割としては防災無線(街中にあるスピーカーのようなもの)の電池が切れた状況で、何かしらの通告をして街を回るというものである。通信ができればコントロール用のコンピュータから文字列を受け取り、決めた航路でその文言を喋って回る。

 飛行船は現実的にはかなり厳しいが、飛行船ドローンという概念が珍しかったのかウケた(ちなみに数ヶ月後、パナソニックだったかが屋内用飛行船ドローンを発表していた。課題部門なので屋外非常時向けとしたが、やはり広告業界向けだったのかもしれない)。



苦労したこと


 まず情報が非常に少ない。飛行船ドローン自体が見当たらないのはともかく、小型の飛行船を作ろうということは海外を含めてかなり事例が少なかった。理由はおそらく、ヘリウムが高価であることと気密を保った構造を作るのが難しいからだと思う。

 次に苦労したのは前述の気密を保った気嚢(バルーン)を製作することだった。まず、ヘリウムを逃さないためにアルミ蒸着フィルムを入手するのが難しい。風船屋が随分なサイズのロールを売っているのを見つけそれを買った。そしてそれをアイロンで溶着していくのだがそれもまた難しい。アイロンを当てる時間が長いとフィルムは溶けて穴が開き、当てる時間が短いとうまく溶着せずヘリウム漏れが起こる。つまり、適度のスピードで重ねたフィルムの上をバルーンの線に従いながら溶着する必要がある。完全に職人の技と化していた。「飛行船職人の朝は早い」などと茶化しながら作業した。



技術的な事

 システム構成は単純に機体制御にArduino、通信にXBee、音声合成には専用のICを用いた(この記事はずいぶん後に書いているので型番を覚えていないがどう見てもATmegaだった。秋月電子で購入出来る)。

 見出しに技術などと書いたが、大した技術は載っていない。強いて言うなら劣悪な通信環境下で音声を送信するために音声合成を使っている程度で、調べればいくらでも出てくる話である。



なぜ飛行船か


 一般的にドローンというとクアッドコプターが有名であるが、飛行速度が速すぎるのと、滞空時間が短すぎる、プロペラが高速回転し危険という問題をはらんでいる。飛行機型は滞空時間は長いが同様の危険がある。結果としてのんびり飛行して浮くために電気を使わないので滞空時間も伸ばせる飛行船が最適であると考えた(実際には屋外で風を受けると制御不能に陥る問題が存在する)。



トラブル


 当日会場に辿り着くと尾翼の部品がなかった。どこかで置き忘れたのか真相は闇の中……ともかく、見た目を整えるために寒い夜の街を練り歩き、無事引率教員に怒られた。



最後に


 あれほど苦労したのに画像がほとんど無いのが残念だった。チームの誰もが疲れで謎のテンションの下に作業していたから写真を撮る奴がほぼいなかったんだと思う。

 企業賞は嬉しかった。数の問題があったので多少もめたのと、地元企業の賞だったので会場がざわついたこと以外は問題無かった。

 プロジェクトをまとめることは非常に難しかった。各個人の技能と水準に差があり、性格も影響した。人を扇動することは簡単かもしれないが、人を使うことは本当に難しいと実感した。特に、上司と部下のような明確な立場の差をつけられない場では、口のきき方一つでもチームのやる気に大きく影響することを再認識させられた。

2015年5月21日木曜日

【Tips】JavaFXのImageクラスで画像を読み込む方法

JavaFXでFXMLを使った開発中につまづいたのでメモします。こんな感じのコードでつまづいた。

 gc.drawImage(new Image(getClass().getResouces("/test.png").getPath), 0, 0);

gcはGraphicContext、drawImageは画像, x座標, y座標の順に引数をとって、その座標に画像を描画します。画像には新しいImageのインスタンスを作りつつ入れます。


事の始まり


JavaFXのライブラリ(javafx.scene.image.Image)を使って、resourceフォルダに入れた画像をCanvasに表示しようとしたところ、試しに読み込んだ(と思っていた)画像が表示されない。Imageのコンストラクタは画像ファイルのパスを受け取るのに、パスの画像が表示されない。読み込みに入ると「そのパスにその画像はないよ(いわゆるぬるぽ)」で止まってしまう。

パスがおかしいのかと思ってSystem.out.println()で表示してみても、ちゃんとフルパスが表示されている。


問題の解決

結果的には、Imageクラスのコンストラクタが、入力したパスを勝手にresourceからの相対パスとしてみることが判明した。なので、

 new Image("/test.png");

とすると、"プロジェクトのフォルダ/src/main/resources/test.png"のファイルを読み込む。つまり、フルパスを入れるとresourcesフォルダのパスにフルパスがひっついて動かない。


その他

 あまり関係ないが、GraphicContextはdraw◯◯という名前のメソッドをほとんど持っていない。最初は戸惑ったが、線を描くときはstroke◯◯みたいなメソッドを使う。四角はquad()。このネーミングってProcessingみたいだけど、中はJavaFXとかなんだろうか。普通のJavaでSwingだとdrawLineとかになりそうだけど...調べるほどではないけど気にはなる。




2015年5月8日金曜日

【Tips】Coda 2.5でEmmetを使う方法

こんにちは。aoicaです。
早速ですが、Coda 2.5でEmmetを使おうとしてハマったのでメモです。
前置き飛ばす人はこちら


CodaとEmmet

一応、Codaとはなんぞや、Emmetってなんぞやという人のために説明しておきます。

Coda

CodaはPanic.Incが販売しているWebサイト制作アプリです。おしゃれで使い易い外観にもかかわらず、データベースとの接続やリアルタイムなプレビュー、高速な動作、インテリジェンス、プラグイン機能といった非常に高機能なアプリケーションでMacでWeb制作をするのに必要な機能が一通り揃ってます。aoicaはAdobe DreamWeaverから乗り換えました。

Emmet

Emmetはhtmlやcssといった言語を高速で書けるようにするスクリプトの一種です。以前はZencodingと呼ばれてました。あらかじめ登録されている文字列をショートカットで展開することでスニペットのようなものを高速で記述することが可能です。


Coda 2.5でEmmetを使う


Emmetはgithubで公開されていて、Codaのプラグインとして自動でビルドされたものをダウンロードできるようになっています。が、そのままダウンロードしたプラグインはなぜか動きません。どうもバグがあるらしくPanicが止めてたとか何とか。

解決法

GithubのここからダウンロードできるバージョンのEmmetプラグインが使えます。aoicaの執筆時点でのCodaのバージョンは2.5.8ですがちゃんと動いてます。


以上です。

2015年5月7日木曜日

STM32 F401RE Nucleoで倒立振子 - その1

こんにちはこんばんは。aoicaです。
記念すべきWeb回路Coder最初の記事...何をするか考えました。

 ...倒立振子です。ずっと「とうりつふりこ」だと思ってましたが「とうりつしんし」と読むようです。倒立振子とは、平たく言って振子を逆さにしたもので要するにセグウェイがそれ。
振子の端につけた加速度センサー等を使って、足となるモーターを制御することで立たせることができます。簡単そうで意外に難しいらしく、よく制御プログラミングの練習として使われてます。
制御の入門ということで、まずはこの倒立振子を作っていきたいと思います。




部品

 まず揃えたのがこちら。
タミヤのギアボックス。どこにでもある、そして何にでも使われる便利な子。
某所から借りてきました。

タミヤのギアボックス

 次に制御基板。基板には巷で流行りのSTM32 F401 Nucleoを採用します。このマイコンボードにはARM Cortex M4シリーズを乗せたSTM32 F401が載っていて、秋月電子でお値段1500円。その上クロック84MHz・64Pin・Flash 512KB・SRAM 96KB...etcというコストパフォーマンスに優れ過ぎているおそるべき開発ボードです。書き込みに使用するST-LINK/V2-1も基板に実装されているので、Mini USBで繋ぐだけで開発が開始できます。Arduinoのピン配置にも対応しており、mbedも使える...低価格帯では恐らく無敵のマイコンボードです。
一時期Atmel社のチップを使ってオリジナルボードを作ろうと考えてましたがこれを見てやめました。
 左上の赤いやつはMMA7361というアナログ加速度センサです。重力加速度を取ることができるので、角度を図ることもできます。ちょっと前までよく使われてました。最近はI2Cとかで繋ぐデジタルタイプの方が主流な気もしますが、安くていい感じなのでチョイスしました。STM32と繋ぐときにはSTM32でA/D変換をかけてやります。

加速度センサMMA7361とSTM32 F401 Nucleo

 バッテリーはこちら。何の変哲も無いSilicon Powerのモバイルバッテリー。
5V2.1Aの良くあるバッテリーです。2.1Aもあるのでモーターの電源も共有できそう。

珍しくもないモバイルバッテリー

 以上が今回のメインの部品になります。他にモータードライバとかも必要ですが、まだ準備できてないので手に入り次第紹介します。筐体は例によって段ボールとか100円均一のプラケースとかになる予定。