2010年5月20日木曜日

'Sensor Board With Motor'をやってみた.

動機
1.こちらのPOSTをみつけた.(感謝!)


やってみた
0.その前にこちら(Scratch+Arduino)を読んでおくといいかもしれません.
1.同POSTにあるSensorBoardWithMotor.zipをダウンロード
2.SensorBoardWithMotor.pdeファイルをArduinoのSDKでArduinoにUPLOAD
3.上記POST中のモータ制御についての解説ページ(Arduino 小型DCモータ/TA7291P)から,Arduinoのデジタル3番がPWMの信号とのこと
4.デジタル3番とGNDとをLEDにつなぐ
5.SensorBoardWithMotor.imageを起動
6.'Sensing'カテゴリの'[slider] sensor value'上でコンテクストメニューを出す

7.'show ScratchBaoard watcher'を選択.ArduinoのTX/RXのLEDが点滅を始める.

8.コードを用意.メニュー/'Edit'/'Show Motor Blocks'を選択. 'Motion'カテゴリにMotor制御用のBlockが現れる


9.コードを書く.(変数valは作ってください.)

10.実行 (ArduinoとLEDが映るのは1:00以降です)

2010年5月16日日曜日

Scratchに外から値を送ってみた(Cocoa編)

動機
1: JavaでScratchに外から値をあたえたけどCocoaでできるかな?
2: CocoaのSocket通信(クライアント)ってオブジェクト指向っぽくないんだなぁ.
3: へーAsyncSocketってのがあるのかぁこれだとOOっぽい?AsyncSocket
4:やってみるか


やったこと
1. cocoaasyncsocketよりCertTest.zipをダウンロード
2. AsyncSocket.h .mを取り出し, 新規プロジェクトに追加
3. コードをサンプルを参考に適当な場所に追加(AsyncSocket.hはimportしておく):
 NSString *host= @"localhost";
UInt16 port= 42001;
NSMutableString *message= [NSMutableString stringWithString:@"sensor-update"];
int i;
for(i= 0; i<255; i++) {
[message appendFormat:@" key%d 値%d", i, i];
}

AsyncSocket *socket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error = nil;
if (![socket connectToHost:host onPort:port error:&error]) {
NSLog(@"Error connecting to server: %@", error);
return;
}

NSData *data= [message dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *writeData= [NSMutableData data];
char *c= malloc(4);
unsigned n= [data length];
c[0]= (char)((n>>24) & 0xFF);
c[1]= (char)((n>>16) & 0xFF);
c[2]= (char)((n>>8) & 0xFF);
c[3]= (char)(n & 0xFF);
[writeData appendBytes:c length:4];
[writeData appendData:data];
[socket writeData:writeData withTimeout:-1 tag:0];
free(c);

4: Scratch側の準備は以前のものどおり.
5: 実行

値は日本語も送れるみたいね.(そのためのUTF8でのエンコードなんですけどね)

LegoNXTRemoteのサンプルアプリを試す

動機
1: NXTをBluetoothで接続と言えばそんなCocoaのframeworkあっていじったことあったな.LegoNXTRemote
2: 試し直してみるか.


やってみた
1: コード取得 参考
> svn checkout http://legonxtremote.googlecode.com/svn/trunk/ legonxtremote-read-only


2: Xcode
2.1: アクティブSDKを10.6,アクティブターゲットをLegoNXTRemoteにする(LegoNXT.frameworkも前処理としてできる).
2.2: ビルドと実行.


3:試す
3.1: NXT側: Bluetooth>On/Off>Onで左上にBluetoothマークを出す
3.2: LegoNXTRemote側: ビルドと実行, Connectボタンを押す. ダイアログが出る.しばらくするとNXTを見つけてくるのでSelectボタンで選択.

3.3: 初めての接続の場合, NXT側とペアリングする.NXT側でブザーがなり4桁の数字が出ている.おそらくここで数字を編集するんだろうけどとりあえずそのままチェックマークを選択する.LegoNXTRemote側のダイアログが新しくでて数字入力が促される.先ほどの数字を入れる.

3.4: 接続完了

3.5: 'Tachometer'のPollを実行.とりあえずAのPollボタンを押す.

3.5: Aモータを自分でまわす(タイヤでもつけるとまわしやすい).値が変わる.

3.6: AモータをRemote側からまわす.'Servo Control'のAのPowerチェックボックスにチェックを入れ,スライダで値を与える.

モータがまわる.


ちょっと改造
LegoNXTRemote.m
コード中のそれぞれで以下のようにPollのIntervalが与えられているので1を0.1とかにすると値がすこし素早く切り替わるようになる.
[_nxt pollUltrasoundSensor:port interval:1];


[_nxt pollSensor:port interval:1];


[_nxt pollServo:port interval:1];