May 04, 2006

温度ドリフト

先日、MEMS加速度計(STMicroLIS3L02AS4、3軸1パッケージの加速度計)、ジャイロ(Analog DevicesADXRS150、1軸1パッケージのジャイロ)の恒温槽試験をしてきました。

MEMS_sensor_temperature.png
結果の一例。

例のプロトタイプをそのまま突っ込み、室温(15℃くらい)~-10℃~40℃~室温という温度プロファイルで静置してみました。結果が図のような感じ(横軸が温度のチャンネル、ADXRS150内蔵の温度センサを利用。あと、詳細な結果はPDF)なのですが、温度ドリフトってやっぱりあるようですね。しかも個体差がかなりあるようです。本格的に使う場合はやはりテーブルを作って補正をする必要があると思います。

23:57 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/483

May 07, 2006

英語コメントスパムへの対処

今までコメントスパムの対処方法として『HTMLタグを徹底的に認めない』『禁止IPに登録されたのをわからなくする』、『MD5等を使ってコメント欄を偽装する(こちらは記事にしていません)』などを行ってきましたが、先日等々大量の英語スパムに見回れました。仕方がないので、英語スパムを駆除する方法を考えることにしました。

方法としては、日本語の文字が入っていないものをはじく方法を採用することにしました。特定の人が投稿できなくなる可能性があることに抵抗があったため、今までやらなかったのですが、とうとう諦めることにしました。

どうやらこの手の対策はプラグインでできるようですが、それらのプラグインはMovableType 3を要求しているようです。このサイトは未だにMovableType 2.661で運営されているので、動作するかわかりません。

そこで、いつものことながらソースをハックします。
Perlには日本語モジュールのJcodeというものがあり、それを使用してコメントに日本語が含まれているかどうか判断することができます。

use Jcode;
my $str_encoding = getcode($str);
すると$str_encodingに英語のみの場合は'ascii'が、日本語が含まれる場合は'UTF-8'等が代入されます。詳しくはJcodeのマニュアルをどうぞ。
そこで以下の改造をしました。

/path/to/MT/lib/MT/App/Comments.pm(MT2.661だと162行目付近)に追加

use Jcode;
my $comment_encoding = getcode($q->param('text'));
if ($comment_encoding eq 'ascii') {
    return $app->redirect($entry->permalink);
}

これで英語コメントを無条件にはじけます。

00:02 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (4) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/484

May 09, 2006

竜ヶ崎の空

[Photo]

Ryugasaki0604.jpg

少し前に成田のそばにある竜ヶ崎飛行場で実験してきました。そのときに撮ったものです。実は飛行機が2台写っています。
デジカメ写真ですが、お気に入り。

02:42 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (4) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/485

May 14, 2006

好きな料理は何?

[Tips]

この間、『好きな料理は何?』という話になったのですが、その場では返答に困ってしまいました。小さい頃は、あれ食べたいとか、これ食べたいという欲求がとてもあったのに、今はどうして返答に困るほど食べたい物がないのだろう?、少し残念な気分になりました。これではいけない、何か食べたいものが絶対あるはずだと思い、普段の食生活を省みてみることにしました。

わかりました、僕の好きな食べ物。それは卵料理です。
中華屋に入るとまず間違いなく蟹玉を注文している僕がいました。蟹玉が単体でない場合は天心丼とか親子丼を第2の候補にしているようです。
あと、オムライスが好物らしいです。大学の近所のオムライス屋(チェーン店)が無くなったときには、そういえば少し悲しい思いをしました。ちなみに今日はたいめいけんのオムハヤシを食べてきました。卵がふわふわしていて濃厚な味わいで大満足でした。

これで好きな食べ物が見つかったものの、よく考えてみないと好きな食べ物って本当にわからないものなのでしょうか、実は少し心配です。脳年齢が衰えている疑惑も…。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/486

May 18, 2006

プロポとPCの接続

室内飛行機の航法系を検討していましたが、その中でビデオカメラを用いて位置や姿勢の同定を行うというプランがあります。
ところで、実際に室内飛行機を飛ばすためには航法系の上位にある制御系を構築し、画像処理の結果を制御に反映する必要があるのですが、そのための方法として画像処理を行ったPCからラジコン用のプロポを制御するということを考えてみました。プロポというのはラジコンを飛ばすために必要な通常は人間が操縦する無線の送信機のことで、プロポから送信された電波を飛行機内の受信機が受信しサーボやスピードコントローラを制御することによって、ラジコン飛行機は飛んでいます。
今回はこのプロポを、人間ではなく、画像処理に用いたPCが操縦することによって、飛行機を自律制御することを考えてみました、という話題です。

このプロポですが、ある機種にはトレーナー機能というものがあります。これはラジコン初心者が上級者と共に操縦の練習をするための機能で、いってみれば自動車教習のようなシステムです。すなわち、初心者と上級者の2台のプロポをトレーニングケーブルと呼ばれるケーブルで繋ぎ、初心者がおかしな操縦をしたな、と上級者が判断した場合に、上級者の操縦が上書きされるようにするシステムです。つまり、今回はトレーナーケーブルを流れる信号を模擬して入力してやることにより、人間でなくともプロポによる操縦が可能となるわけです。

以下、続きをどうぞ。

※その後、接続が完了しました。

続きを読む "プロポとPCの接続"
19:57 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (6) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/487

May 21, 2006

MeCab-0.91をCygwin Rubyで

日本語の文章をコンピュータで解析する形態素解析というツールがあります。ちょっと使う用途がでてきたので色々と触ってみているのですが、そのツールをRubyから使うためのバィンディングがうまく動いてくれません。

事の発端は以前Chasenを使っていたのですが、Chasenはあまり早くないのでより早いMeCabを使ってみることにしました。最終的にはおそらくどこかのサーバになるので、実行する環境は*NIX系のOSを想定すればいいのでしょうが、とりあえず実験環境ということでWindows+Cygwin上にMeCab-0.91をインストールしてみることにしました。

MeCab本体のインストール自体はMeCabのインストールページにあるとおりでうまくいったのですが、MeCabをRubyからコントロールするためのバィンディングがうまく動いてくれません。バィンディングのインストールは数箇所修正することでコンパイルが通っているのですが、いざサンプルコードを動かしてみようとするとコアを吐いて落ちます。

続きをどうぞ。

続きを読む "MeCab-0.91をCygwin Rubyで"
23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/488

May 27, 2006

PIC 16F648Aと闘う日々

プロポとPCを接続するためのマイコン入りアダプタを作っていました。

このアダプタを作ることが最終目的では全くないので、お金と時間は惜しむことにしました。
チップは秋月電子で200円で売っていた安いながらも比較的高性能なPIC 16F648Aを、開発環境はそこら辺に転がっていたMicrochipのIDEであるMPLABCCS社のC言語の有償コンパイラ(バージョンが多少古く(3.174)、最新版(3.249)ではありません)を使用して、さくさくとやってしまうつもりでいたのですが、これが鬼門でした。どうやらCコンパイラのバクに遭遇してしまったようなのです。

とりあえず前回の記事にあるとおり、プロポに送るパルスをマイコンで作り、PCからそのパルス幅をコントロールすることができれば、目的を達成できます。今回はパルス幅の精度が命なのでタイミングにはこだわることにし、パルスを生成するためのタイマー、PCとシリアル通信するための機構であるUSARTはすべて割り込みを使って処理することにしました。

タイマーの割り込みについてはすんなりと動きました。ところがです、USARTの割り込みが全く動きません。CCS社のC言語規約によれば

#use RS232(baud=9600, rcv=PIN_B1 xmit=PIN_B2)

#INT_RDA
void invoked_by_sci_recieved(){ /* do some operation */}

void main(){
    enable_interrupt(INT_RDA);
    enable_interrupt(GLOBAL);

    while(TRUE);
}

のように記述すれば、USARTからのデータ受信割り込みを認識し、処理が行えるとのことです。しかしこのように記述しても全く動く気配がありません。

Webでこのような症状を調べてみると、次の2点が重要のようです。

  • データ受信割り込みはシリアル通信をUSART(ハードウェア)を利用して行うときのみ有効となる
  • use RS232を使用した際、送受信のピン(xmit, rcvで指定する)をUSARTのTX/RXに割り当てることにより、コンパイラが自動的にUSARTを使ったルーチンを生成する。さもなくば割り込みを使用することはできないが、シリアル通信をソフトウェア的に実現するためのルーチンが生成される。
僕のコードを見返してみると、確かにuse RS232のxmit、rcvは16F648A内蔵USARTのTX、RXに割り当てられています。

さらに調査をすすめてみると、同じ現象に遭遇している人がいました。CCS社のユーザーフォーラムによると、古いバージョンのコンパイラでは16F628に対してuse RS232がうまく働いていないようです。
16F628というのは、16F648Aと同じ18ピンマイコンで、親戚のようなものです。USARTを持っているコンベンショナルなPICは、PORT_Cにこの機能が割り当てられています。ところが、16F628や848Aは比較的新しいものであり、PORT_Bに割り当てられています。従って、古いバージョンのコンパイラでは、628や648Aに対しては、間違って内蔵USARTを使用しないソフトウェア的ルーチンを生成してしまっているものと思われます。このことはコンパイラが吐き出すアセンブラ(*.LST)を見てみるとわかります。

そういうわけで、コンパイラのバージョンをあげることを検討していますが、CCS社のコンパイラは購入後30日しかアップデートを受けられないようです。有償のソフトウェアなのだから、無償でアップデートできて当然(しかもバグなわけで)だと思うのですが、いわゆ保守の一環ということで駄目なのでしょう。

横着せずにフリーのコンパイラを使っていればよかったと反省しています。仕方がないので、別のコンパイラを使うことにしました。
またPICは安いなりに問題が発生するようで、H8とかSHの素晴らしさが改めて実感できるようになりました。PICで製品を作るというのは、よほど勇気が必要な気がします。

07:50 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (3) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/489

May 31, 2006

プロポとPCの接続完了

propo2pc_sch.gif

プロポとPCを接続する話ですが、コンパイラのバグに遭遇するなど不運な事態に遭遇したものの、ようやく完成しました。回路図(EPS版)と使用したPIC(16F648A)に焼きこむためのバイナリ(HEXフォーマット)PCからのコントロールライブラリ(C++ヘッダファイル)をおいておきます。

propo2PC.jpg
完成したハードウェア。

コンパイラのバグですが、結局バージョンをあげる(3.174->3.249)ことで解消されました。バグと戯れている間にPICのアセンブラが読めるようになったので、その成果がプログラムにも反映されているかと思います。
例えば、CCSのC言語コンパイラにはタイマのカウント値を設定したり読み込んだりするための関数、set_TIMERX()やget_TIMERX()があるのですが、これらを使って

set_TIMER1(get_TIMER1());
などとすると、思ったとおりの動作が実現できず、タイムラグが発生します。これはタイマー1が16bitタイマーであるのに対し、PIC16には16bit操作命令が存在しないため、8bit命令を駆使して実行されます。そのためタイマー1のカウント値を読み込んだ直後にカウント値が設定されることはなく、タイムラグが生じているようです。

そのようなことを踏まえて、今回のソースを書きました。一部書き方が素のC言語のようになっている部分がありますが、その部分がタイミングシビアな部分です。あと、結局バグが生じていたINT_RDAはバージョンをあげることにより解消したものの、今回は使用しないことにしました。

現在快適にプロポのコントロールができています。室内飛行機の自律制御に向けて、次は機体搭載機器の検討をしてみる予定です。

※その後、接続部分を基板化しました。

22:21 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/490