2008-11-19[n年前へ]
■Rubyで「シリアル通信スレッドクラス」を作る
Rubyで「(Rubyシリアル通信ライブラリ(Windows用)TEXCELL を使った)シリアル通信スレッドクラス」を作りました。ソースコードとサンプルはここに置いておきます。”Microsoft Windows VISTAではほとんど見捨てられているような”シリアルポートでの送受信をRubyでスレッドを使って行うクラスです。Queueにデータを突っ込めば「シリアル通信スレッドクラス」から自動的に送信されます。また、受信した文字列が「(指定した改行コードで)一行になるたびに」receiveイベントが呼ばれるので(また、その際にQueueを指定しておけば受信行が自動的にそのQueueに追加されていきます)、読み込みのタイミング・必要な情報がまだ途中までしか読み込まれていない場合などの処理を気にすることなく使いたい、と考えながら作ってみた「シリアル通信スレッドクラス」です。
たとえば、COM3で受信した内容をコンソールに出力するだけであれば、このようなコードで動くはずです。
require 'comThread' receiveComThread=ComThread.new({:icomno=>3}) receiveComThread.start({:receive=>true, :receiveMonitor=>true}) sleep 60 receiveComThread.stopシリアル通信モニタプログラム(シリアルポート間で送受信されている内容を眺めるプログラム)も、多分10行くらいで書けると思います。チェックせずに書いてしまうと、こんな感じになると思います。
require 'comThread' q=Queue.new receiveComThread=ComThread.new({:icomno=>3,:rq=>q}) sendComThread=ComThread.new({:icomno=>4,:sq=>q}) receiveComThread.start({:receive=>true, :receiveMonitor=>true}) sendComThread.start({:send=>true}) sleep 60 sendComThread.stop receiveComThread.stop
「計測・解析ソフトウェア/ハードウェアのハック」が実験系技術者の一番のLifeHackかもしれない…と思っています。その思いを逆に言うならば、実験系技術者が費やす多くの時間を、計測・解析処理が消費していると思っているからです。そして、一番時間を消費している部分の高速化をすることが、全体の高速化に効果的だろう、と思っているわけです。というわけで、先週末はこの「Perlでシリアル通信とユーザインターフェース自動制御のやり方を整理しておくことにしました」の部分を「Rubyでシリアル通信とユーザインターフェース自動制御を書いて整理しておくことにしました」ということをしてみたわけです。この「シリアル通信クラス」と「ユーザインターフェース自動制御」があると、結構便利な実験屋さんもいるかもしれません。
そんなこんなで、何を今更…という、Perlで「シリアル通信とユーザインターフェース自動制御」のやり方を整理しておくことにしました。なぜかというと、経験的に(既成機器をを使わざるえないことが多い)「計測・解析ソフトウェア/ハードウェアのハック」は、シリアル通信制御とユーザインターフェース自動制御でほとんどの場合対応できる、からです。
2008-12-03[n年前へ]
■ハードウェア要らず?の遠隔リモコン制御
「汎用赤外線リモコンI/Fが使えないエアコンを外出先からオン・オフするにはどうしたらいいか?」ということが話題になっていました。
使える材料として「遠隔操作できるPC」がある、ということなので、「(新たに追加する)ハードウェア要らず?の遠隔リモコン制御」を私も考えてみました。それは「CDトレイをソフト制御してエアコンのリモコンのオン・オフをする」という、実に原始的メカニカルな「アイデア」&「実装」です。
思いついたらやってみよう!というわけで、ソフトウェアを仕立て、万力でエアコンのリモコンを固定して、hirax.netが稼働しているサーバのCDドライブを外に引っ張り出し、実際に検証してみた結果が下に貼り付けた動画です。ケータイで撮影した動画ではわかりづらいかもしれませんが、CDトレイの角でリモコンのボタンがきちんと押されて、エアコンがピピッと鳴り、そしてエアコンからの送風が始まりました。
ちなみに、書いたコードはwin32GuiTest.rbを使ったので、こんな具合になります。「書いた」というほどのものでは、ないことが丸わかり…です。
require 'win32GuiTest' sleep 5 gui=Win32GuiTest.new gui.cdAudioDoorOpen動作としては、CDトレイが開き、リモコンのボタンを押し、何かにぶつかったことをCDドライブが検知し、CDドライブのトレイが(勝手に)自動で閉まる・・・という具合です。こういう動作をするスクリプトを外出先からPCを起動させる時に動かせば、あるいは、常時動いているhttpサーバからでも呼んでやれば、遠隔リモコン動作システムのできあがり、ということになります。
というわけで、今日作ってみたガラクタは「ハードウェア要らず?の遠隔リモコン制御システム」です。
2008-12-04[n年前へ]
■LEGO Mindstorms NXT で作ったイメージ・スキャナ
「 LEGO Mindstorms NXTで作ったイメージ・スキャナ」が面白い。MATLAB/Simulink でLEGO Mindstorms NXTを操作し、「紙送り」と「先端をピンホール加工した光量センサ」をサーボモータで移動制御させ、Mindstormの光量センサから得られたデータに対して、「ピンホール光学系」のボケ補正のデコンボリューション補正処理をする、という仕組みになっている。
そんな動作機構・実装方法を考えるのも楽しいが、それが動くさまを眺めてみるのも、やはり面白い。そして、さらに動作機構と「自分ならこう作ってみたい」と考えてみたりするのが、何より楽しい。
2008-12-06[n年前へ]
■格安ロボットアームで遠隔リモコン制御
「ハードウェア要らず?の遠隔リモコン制御」のポリシーは、「リモコンにハードウェア改造をしない」「コストをできる限りかけない」というポリシーのもとにない知恵を絞って作成してみました。その結果、実装も見た目もが実に「行き当たりばったり感」に満ちてしまい、遠隔操作システムというよりピタゴラスイッチのようなものになってしまいました。
そこで、「リモコンにハードウェア改造をしない」という前回と同じ方針のもとに、けれど、「コストをできる限りかけない」という「縛り」部分を少しゆるめて、格安ロボットアーム「MR-999 」と「シリアル接続I/Oボード:RBIO-2U」を使いエアコンのリモコン遠隔操作をすることができるか、ロボットアームの先っぽで、リモコンの電源オン・オフを押すことができるか、という検証実験に挑戦してみました。
RBIO-2U (USB-シリアル通信-リレー)I/Fユニットを使うと、シリアル通信経由で命令コマンドを送信するだけで、簡単に、100ms単位でロボットアーム MR-999 の各関節や、可動部を駆動制御することができます。・・・で、挑戦してみた結果、リモコンのスイッチを押すことはできたのですが、残念なことに、(関節モータの遊び量が多いことと、いつの間にか動かないモーターが増えてしまい)何度も動作させることができませんでした。
そこで、検証実験中のようすを撮影したものを貼り付けておきます。しかし、この写真を見ても、「見た目」もどうも今ひとつ「原始的」ですし、「安っぽさ」をぬぐい去ることが全くできていないような気がします。技術のぎ「ギ」の字も感じない割に、ローテク感だけは満ちているように思えるところが実に哀しいところです。
2009-01-19[n年前へ]
■続々:Simulinkで経済循環モデルを作ってみる
「Simulinkで経済循環モデルを作ってみる」「続:Simulinkで経済循環モデルを作ってみる」というように、教科書を読みながらマクロ経済学のイロハを学ぼうとしています。
というわけで、まずは「スティグリッツ入門経済学 <第3版><第3版>」を読み、これが文庫本だったら持ち歩くのに・・・と思ったり、「早わかり経済学入門―経済学のイロハから最新理論まで、一気にわかる。」を読み、変な例えでの説明が出てこないせいか、個別の項目に関してはとてもわかりやすいなぁ、と感じたりしました。
とはいえ、まだまだ自分できちんと教科書に書いてある経済循環モデルを「教科書通りに動く」ようににすることができません。数え切れないくらい色々な点について勘違いしている感じです。今日はとりあえず、下の図のようなモデルを作ってみたのですが、やはり自分で眺めてみても教科書とは違う変な感じになってしまいました。・・・自習で学ぼうとすると、実に難しいものですね。