memorandums

日々の作業ログです。

Gainerで遊んでみた

Software Design 3月号に掲載されていたGainerを購入して遊んでみました。Gainerの詳細は開発元のこちらのサイトをご覧ください。キットの価格は11,000円でトリガーデバイスさんからオンラインで購入できました。トリガーデバイスさんは、納品書や領収書の対応がきっちりできていて大学からの購入も容易でした。キットの組み立てには半田付けが必要です。久しぶりだったのでイモはんだばかりになってしまいましたが、説明書が親切で20分程度で完成しました。


雑誌記事を参考に3色LEDをFlashから点灯させたりしました。ついでにキットに付属してきた3軸加速度センサーを利用して増井さんの鬼ごっこゲームを操作するプログラムなんかも作ってみました(センサー値を平滑化しないと細かい操作ができませんが。。。)。

以下、ちょっと戸惑ったところをあげておきます。

  • COMポートの探し方
    • gspサーバを起動するときに、各ユーザの環境によってCOMポート番号をあわせこむ必要があります。この番号の調べ方です。[スタート]-[コントロールパネル]-[管理ツール]-[コンピュータの管理]-[デバイスマネジャ]-[ポート(COMとLPT)]で表示されるツリーのUSB Serial Port(COM?)の?番号が皆さんの環境のCOMポート番号になります。
  • 例題1のボタンの意味
    • 私の早とちりなのですが、例題1のFlashを起動すると何も変化しません。実は、ボタンというのはFlashのボタンではなく、Gainer基盤上のボタンだったんですねぇ。「あれ?」と30秒くらい迷いました。
  • Processingの環境設定
    • 雑誌記事は全てFlashなので、Processingの環境構築に少し手間取りました。
    • gainer.ccからprocessingのソフトウェアライブラリ最新版をダウンロードします。
    • gainer_lib_processing_v1-0-1.zipの圧縮ファイルを展開します。
    • 展開されたlibraries、examples、referenceの各フォルダをprocessingのフォルダ(私はC:\processing-0124)の中に上書きコピーします。これでprocessingのメニューからサンプルプログラムにアクセスすることができるようになります。
  • Processingではgspが不要なこと
    • 最初、Processingでもgspが必要なのかと勘違いして、gspを起動して、processingのサンプルプログラムを起動するとエラーがでて。。。結局のところ、Processingではgspの起動は必要ないのです。

■鬼ごっこのソース(変更箇所:/**/)

                                • -

//
// 「ビルゲイツの入社試験」に出てきた問題をProcessingで作ってみたもの。
//

import processing.gainer.*; /**/
Gainer gainer; /**/

int MARGIN = 50;
int RADIUS = 200;
float centerx,centery;
float oposx, oposy; // 鬼の位置
float posx, posy; // 人の位置
float ospeed = 4.0; // 鬼の速度
float speed = 1.0; // 人の速度

void setup(){
gainer = new Gainer(this,"COM8"); /**/
size((RADIUS+MARGIN)*2,(RADIUS+MARGIN)*2);
centerx = RADIUS + MARGIN;
centery = RADIUS + MARGIN;
oposx = 0.0;
oposy = RADIUS;
posx = 0.0;
posy = 0.0;
}

//void loop(){
void draw(){
float oangle,odelta;
float angle,delta;
float mangle;
float mx, my;
background(200,140,255);
fill(200,200,200);
// ellipse(centerx-RADIUS,centery-RADIUS,RADIUS*2,RADIUS*2);
ellipse(centerx,centery,RADIUS*2,RADIUS*2);

// 鬼の角度
oangle = atan2(oposy,oposx);
// ヒトの角度
angle = atan2(posy,posx);
delta = angle - oangle;
if(delta < 0) delta += PI * 2;
odelta = ospeed / RADIUS;
if(delta > PI) odelta = -odelta;

oangle += odelta;
oposx = cos(oangle) * RADIUS;
oposy = sin(oangle) * RADIUS;
fill(255,255,0);
rect(centerx+oposx-5,centerx+oposy-5,10,10);

gainer.peekAnalogInput(); /**/
float ax = gainer.analogInput[1]; /**/
float ay = gainer.analogInput[0]; /**/

// mx = mouseX - centerx;
// my = mouseY - centery;
mx = (RADIUS+MARGIN)*2*(ax-128)/128; /**/
my = (RADIUS+MARGIN)*2*(ay-128)/128; /**/
fill(255,0,255);
rect(centerx+mx-5,centerx+my-5,10,10);
mangle = atan2(my-posy,mx-posx);
posx += cos(mangle) * speed;
posy += sin(mangle) * speed;
fill(0,0,255);
rect(centerx+posx-5,centerx+posy-5,10,10);
}

                                • -