ラベル lego の投稿を表示しています。 すべての投稿を表示
ラベル lego の投稿を表示しています。 すべての投稿を表示

2008年7月21日月曜日

LEGO MINDSTORM NXTを操作するiアプリを作……れなかった

我武者羅に作ってきましたが、全部無駄だったと分かりました。

iアプリで、GPSやBluetoothやメール機能などなどのセキュリティ的に危うい部分にアクセスするには、iモードのコンテンツ提供業者として認可されないといけないみたいです。認可を受けるとTrustedAPIDというのが発行されて、そいつをADF設定に突っ込むことでBluetooth機能などがiアプリから制御可能になるということです。
下調べって重要ですね orz

あぁ……Smartphone買っちまうかなぁ……



それと、今日買ってきた参考書↓

Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)Linuxの教科書―ホントに読んでほしいroot入門講座 (IDGムックシリーズ)
高町 健一郎

アイ・ディ・ジー・ジャパン 2007-10-06
売り上げランキング : 3878

Amazonで詳しく見る
by G-Tools

お勉強のために買ってみた。何分、にわかLinuxユーザなのもので……

たまたま持ってたUbuntu本の裏表紙にこの本の広告が載ってて、初心者なおいらにぴったりだろう、と思って購入してみた。
電車の中なんかで読みたいと思ってたのだけど、いざ書店に行ってみたらA4サイズだったのでちょっと逡巡したが結局買ってしまった。

そしてブログに書いておこうと思い、リンクを張るためにAmazonの商品ページに行ったらレビューで高評価だったので読む前から満足しちゃってる俺。つか、買う前にちったあ調べるべきだったよなァ

2008年7月20日日曜日

LEGO MINDSTORM NXTを操作するiアプリを作りたい3

とりあえず、Bluetooth接続まわりのコードを少しずつ書いてます。

とりあえず、Bluetooth接続してNXTとのメッセージ送受信を行うNXTCommクラスを作成中。
メソッドの名前とか定数名とかはRuby-NXTまんまにしとくのが分かり易いかな。

public class NXTComm implements BTStateListener{

static Bluetooth bt = null;
static RemoteDevice rd = null;
static SPPConnection connection = null;
static OutputStream output = null;
static InputStream input = null;

//Constructer
public NXTComm() {
Dialog dialog = null;

//Bluetooth initialize
//Connect NXT
try{
bt = Bluetooth.getInstance();
rd = bt.searchAndSelectDevice();
if(bt.isConnectable(Bluetooth.SPP) == false
|| rd.isAvailable(Bluetooth.SPP) == false){
throw new Exception("Cannot use SPP");
}
connection = (SPPConnection)rd.connect(Bluetooth.SPP);
connection.setBTStateListener(this);
output = connection.openOutputStream();
}catch(Exception e){
dialog = new Dialog(Dialog.DIALOG_ERROR,"Bluetooth");
dialog.setText("ERROR:" + e);
if(rd == null){
dialog.setText("ERROR:" + e + ",RemoteDevice:null");
}
dialog.show();
IApplication.getCurrentApp().terminate();
}
} //end of Constructer

//BTStateLisntener interface's abstract method
//call when Bluetooth connection state changes.
//ex:Disconnected.
public void stateChanged(int state){
Dialog dialog = new Dialog(Dialog.DIALOG_ERROR,"Bluetooth");
if(state == DISCONNECT){
dialog.setText("ERROR:Disconnected.");
}else{
dialog.setText("ERROR:" + Integer.toString(state));
}
dialog.show();
IApplication.getCurrentApp().terminate();
}

その他メソッドなどなど、、、工事中

}


ともかく動けば良い精神でテキトーに書き進めてるので、気づくと美味しいスパゲッティになってるんだろうなぁ。。。

2008年7月17日木曜日

LEGO MINDSTORM NXTを操作するiアプリを作りたい2

何でお前ソフトバンクユーザなのにiアプリ作ろうとしてるんじゃい。というご意見はもっとですが、単にコンテンツアグリゲータに登録するのが面倒なだけです orz
何か作品を公開しようっていうわけじゃないし。このアプリを作ったらもう使わなくなるだろうし。。。
それに、iアプリは以前にコンテストに出場しようとした事があるので、作成経験があるのです。

んで、本題。
どうやら、iアプリ製作ツール標準のエミュレータでBluetooth機能も使えるらしいんだけど、その設定方法が分からない。
そもそも、全世界で日本のNTTドコモだけが使っている仕様だけに関する資料が少ない orz
APIリファレンスがあるからコーディングは出きるだろうけど、そのテストが出来ないんじゃなぁ。。。
MIDP羨ましい。。。
Willcom 03買ってMIDPで作っちまおうかとか考えてるくらいです。

2008年7月16日水曜日

LEGO MINDSTORM NXTを操作するiアプリを作りたい

目標はタイトルの通り。

言わずもがな、iアプリはJavaで作るわけだけども(正確にはiアプリ向けのプロファイルDoja)、JavaでNXTを動かすAPIは既に存在してる。
LeJOS, Java for Lego Mindstorms - http://lejos.sourceforge.net/

でも、これがDojaで、実機のFOMAで、動作するかはまったく分からない。そもそもiアプリ製作ツール付属のエミュレータってBluetooth機能を試すときはどうするんだ? その前に対応してるのか?

というわけで、まぁDoja標準のBluetoothの機能を使うなら確実だろうから、それを使うことになったときのためにまとめておく。

com.nttdocomo.device.Bluetooth
http://www.rcdtokyo.com/man/doja/api/com/nttdocomo/device/Bluetooth.html
端末のBluetooth 機能を表すクラスを定義します。このクラスでは、端末の Bluetooth 機能を呼び出して、 外部機器の検索、機器選択、機器登録、各種設定などを行います。 外部機器が選択されると、その外部機器に対応したRemoteDeviceクラスのオブジェクトを取得します。

com.nttdocomo.device.RemoteDevice
http://www.rcdtokyo.com/man/doja/api/com/nttdocomo/device/RemoteDevice.html
Bluetoothで端末と接続される外部機器を表すクラスを定義します。外部機器との接続は、 i アプリから接続要求(connect(int profile))を出すか、 もしくはその外部機器からの接続要求を受け付けること(accept(int profile))で行います。同じ Bluetooth アドレスを持つ有効なインスタンスが複数存在することはありません。

com.nttdocomo.device.BTStateListener
http://www.rcdtokyo.com/man/doja/api/com/nttdocomo/device/BTStateListener.html
Bluetoothの接続状態の変化に関するイベントのリスナを定義します。

com.nttdocomo.device.BTConnection
http://www.rcdtokyo.com/man/doja/api/com/nttdocomo/io/BTConnection.html
Bluetoothの接続を定義します。

com.nttdocomo.device.SPPConnection
http://www.rcdtokyo.com/man/doja/api/com/nttdocomo/io/SPPConnection.html
Serial Port Profile (SPP)で通信を行う場合の接続を定義します。 Serial Port Profile (SPP)を使ったデータの入出力のためのストリームを取得します。 端末がサスペンドし、レジュームした際、サスペンド前に取得済みのストリームを利用することができます。

そしてこの辺りを参考にすれば実装できるんじゃないかと思う。
http://bearmini.net/blog/View.aspx?bid=1&aid=133&cid=13


だが、最大の問題は俺がソフトバンクユーザなことだ。

2008年7月15日火曜日

Bluetooth接続でLEGO MINDSTORM NXTを動かした

昨日のエントリからの続き。


機体を改造して最終的に出来たのが写真のもの。(奥にあるのは先生が作った見本機。俺は男のロマンを追求してキャタピラにしたが)

元々、授業中の「ライントレースを行う」という課題のために作ったので、前に光センサx2とか付けていたりする。ただし、昨日のエントリで書いたスクリプトは単純に走行用のモータを制御するだけだ。

写真だと分かりづらいが、機体上部にロケットパンチ(?)みたいなのを付けてみた。3つ目のモータが回転するとクランクで力を伝えてスイッチを押し、ロケットパンチを発射する。(ちなみにロケットパンチはNXTの拡張キットにしか入ってないらしい)
ロケットパンチを発射するためのスクリプトも書いてみた。次のコードを昨日のエントリのコードに追記して、ENTERキーが押されたときにcanon_fireメソッドを呼び出すようにメインループにもコードを書き加えた。
@motor_canon = NXTComm::MOTOR_C

def canon_fire
@nxt.set_output_state(
@motor_canon,
100,
NXTComm::MOTORON,
NXTComm::REGULATION_MODE_IDLE,
0,
NXTComm::MOTOR_RUN_STATE_RUNNING,
360
)
end

@nxt.set_output_stateメソッドで、@motor_canon(ポートCのモータとして初期化)を360回転させるようにしている。
クランク部分や、実際の動作時の映像とかを撮っておけばよかったなぁ orz

普通に付属のソフトウェアで、動作ルーチンのプログラムも勿論組んだ。というか、授業ではそちらがメイン。俺だけだ、リモートコントロールなんてしてるのは。
そのプログラムでは、機体上部にモータと共に設置した超音波センサによって、前方に障害物があるとロケットパンチを発射する様にしたりしたw


さて、次はiアプリでコントロール出来るようにするか。

2008年7月14日月曜日

Bluetooth接続でLEGO MINDSTORM NXTを動かすRubyスクリプト

ヨドバシでBluetoothドングルを購入し、そのまま大学へ。
買ったのはPCIのBT-MicroEDR2
買った後に、先生から「MINDSTORMのBluetoothは相性キツいよ」と言われたが、問題なく繋がった。

んで、色々参考にしながら書いたのが下のRubyスクリプト。実行環境はUbuntu 8.04。
require 'sdl'
require 'rubygems'
require 'nxt_comm'

# control motors methods
# com is boolean. true/false = go/stop
def motor_right(com, pow)
if com
@nxt.set_output_state(
@motor_right,
pow,
NXTComm::MOTORON,
NXTComm::REGULATION_MODE_IDLE,
0,
NXTComm::MOTOR_RUN_STATE_RUNNING,
0
)
else
@nxt.set_output_state(@motor_right, 0, 0, 0, 0, 0, 0)
end
end

def motor_left(com, pow)
if com
@nxt.set_output_state(
@motor_left,
pow,
NXTComm::MOTORON,
NXTComm::REGULATION_MODE_IDLE,
0,
NXTComm::MOTOR_RUN_STATE_RUNNING,
0
)
else
@nxt.set_output_state(@motor_left, 0, 0, 0, 0, 0, 0)
end
end

#MoveMethods
def goAhead(com)
if com
puts "goAhead"
motor_right(true, -100)
motor_left(true, -100)
else
puts "goAhead stop"
motor_right(false, 0)
motor_left(false, 0)
end
end
def goBack(com)
if com
puts "goBack"
motor_right(true, 100)
motor_left(true, 100)
else
puts "goBack stop"
motor_right(false, 0)
motor_left(false, 0)
end
end
def rotateRight(com)
if com
puts "rotateRight"
motor_right(true, 85)
motor_left(true, -85)
else
puts "rotateRight stop"
motor_right(false, 0)
motor_left(false, 0)
end
end
def rotateLeft(com)
if com
puts "rotateLeft"
motor_right(true, -85)
motor_left(true, 85)
else
puts "rotateLeft stop"
motor_right(false, 0)
motor_left(false, 0)
end
end

#main

begin
@nxt = NXTComm.new("/dev/rfcomm0")
@motor_right = NXTComm::MOTOR_A
@motor_left = NXTComm::MOTOR_B
rescue
puts "Bluetooth Connection failed"
exit
end

puts "Connected to NXT"

SDL.init(SDL::INIT_VIDEO)
screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)

puts "press ESC to exit"

while true
begin
case event = SDL::Event2.poll
when SDL::Event2::Quit
exit
when SDL::Event2::KeyDown
if event.sym == SDL::Key::UP
goAhead(true)
end
if event.sym == SDL::Key::DOWN
goBack(true)
end
if event.sym == SDL::Key::RIGHT
rotateRight(true)
end
if event.sym == SDL::Key::LEFT
rotateLeft(true)
end
when SDL::Event2::KeyUp
if event.sym == SDL::Key::UP
goAhead(false)
end
if event.sym == SDL::Key::DOWN
goBack(false)
end
if event.sym == SDL::Key::RIGHT
rotateRight(false)
end
if event.sym == SDL::Key::LEFT
rotateLeft(false)
end
if event.sym == SDL::Key::ESCAPE
puts "bye"
exit
end
end
rescue
puts "Error"
exit
end
end

exit
余計な部分もあるが、まだ少し弄くろうと思ってるので分かり易さ重視。

作ったのは戦車のような機体。
モータの回転力を与える部分で、前進させるのに-100と指定しているのは、機体のモータの向きを逆に付けてしまっているため。
超信地旋回では、少し回転力を弱くして(85)回りすぎないようにしている。初め、50に設定してみたが、弱すぎて動かず、ビープ音が(汗


事前にインストールしておくもの
  • libserialport-ruby
    Rubyで使うシリアルポートライブラリ。
  • rubygems
    ruby-nxt-0.8.1.gemをインストールするのに必要。gemはRubyでパッケージ/ライブラリを管理するコマンド。
  • ruby-nxt-0.8.1.gem
    RubyからNXTを使うためのライブラリ。aptではなく、直接DLしてきてgemでインストールする。sudo gem install ruby-nxt-0.8.1.gem。http://rubyforge.org/projects/ruby-nxt/
  • libsdl-ruby
    RubyからSDLを使うためのライブラリ。キー入力を取得するのに使った。
また、実行前にNXTとPCをBluetooth接続して、デバイスファイルを作っておく必要がある。そして、デバイスファイルのパスを、スクリプト中のNXTComm.newの引数として渡してやらなければならない。


デバイスファイルの作成方法は次の手順。

NXTのBluetoothをONにして、PCにBluetoothドングルを差した状態で
$ hcitool scan
を実行してNXTのMACアドレスを表示させる。
/etc/bluetooth/rfcomm.confを編集し、次の様にする。
rfcomm0 {
bind yes;
device MACアドレス;
channel 1;
comment "NXT";
}
Bluetoothデーモンを再起動。
/etc/init.d/bluetooth restart
PC側から、もしくはNXT側からBluetooth接続要求を出して接続をペアリングする。ペアリングは上のサ行の前にやっても良かったかもしれない。
これで、Bluetooth接続したNXTへのデバイスファイルが/dev/rfcomm0というパスで出来ている筈。


設定ファイルをいじらずにデバイスファイルを作成する方法が合ったので追記。
$ hcitool scan
で機器を検索し、MACアドレスを表示させる。

$ sudo rfcomm bind 1 MACアドレス チャンネル番号
で、MACアドレスで指定した機器への/dev/rfcomm1というデバイスファイルが出来る。チャンネル番号は省略して良い。省略すると自動で1が割り当てられる。

$ rfcomm
何もオプションを指定せずにrfcommコマンドを叩くと、現在登録している機器の情報が表示される。
rfcomm1: 01:23:45:67:89:10 channel 1 clean
という感じ。

登録機器を開放する場合は、
$ sudo rfcomm releace rfcomm1



これで、取り合えずは動いたのだが、キーを連打すると実際の動作が追いつかなかったり、左右のモータを同時に動かそうとしても少し時間差が出てしまったり、、、

<追記>
ってか、Rubyの標準ライブラリにCursesあるんじゃん。SDLいらんかった orz

2008年7月13日日曜日

Rubyコンチクショウ

昨日のエントリで言っていたBluetoothドングルは買いにいけなかった orz
まぁ、明日行けばいいや。

ともかく、MINDSTORMのための簡単なコントロールプログラムを書きたい。
とりあえず、リアルタイムで受け付けるキー入力に合わせてモータの回転を制御をする、というプログラムを書きたい。上キーが押されたら前転、下キーが押されれば逆転、という具合。

ちょうどRubyでモータの回転を制御するコードを載せている記事を見つけたので、あとはキー入力を判断する部分を書けばいいや、と思ったのだが躓いた orz

素のRubyに用意されている入力といったら、readlineメソッドくらい。つまり、キー入力→エンターキー、としなければ入力を受け付けてくれない。そんなのコントローラじゃねぇ!

適当なGUIツールを使ってやらなきゃいけないわけだが、このエントリを書いてる間にもう日付変わっちまうよオイ。
というわけで、明日へ続く。

メモ
SDLライブラリを使うのが手っ取り早そう。

2008年7月12日土曜日

LEGO MINDSTORM NXT

火曜日に大学でLEGO MINDSTORM NXTを使った授業があった。
いろいろいじくっていると、「おっ!これBluetooth使えるんじゃん」ということで色々試したくなった。

ググってみると、やはり先達が多くいらっしゃる様子。
lego mindstorm bluetooth control - Google 検索:

ようし、俺も……と思ったが、ちょっと待て。
俺Bluetoothのドングルって、以前に上海問屋で激安で買った粗悪品しか持ってないぞ。
XP以降のWindowsなら大抵のBluetooth機器はOS標準のドライバで動くはずだが、こいつの場合はBluesoleil使わないと何故か全く動作しないようになっている。
Amazon.co.jpでドングル買おうかと思ったが、次の授業までに届かないだろうし。。。

とりあえず、明日はドングル買いに行ってみようかな。

以下、使えそうな記事のメモ

Linuxを使ってLEGO Mindstorms NXTを動かす - れごぼく@1981s~2年目組込みエンジニアの奮闘記~ - 1981s:
http://born1981.g.hatena.ne.jp/skelton_boy/20061207/1165491354

Linux上のRubyからBluetooth経由でLEGO MINDSTORMS NXTを制御♪ - verus diary
http://d.hatena.ne.jp/verus/20080318/1205774233