2008年9月29日

coldfireボードさん、ごめんなさい。。。

ちゃんと動かない理由がわかりました。
このボードは電流喰らいなんですね。
USB-シリアル変換モジュールから電源を供給していたのですが、足りなかったようです。
それも微妙に。なので中途半端に動いていたみたいです。
USB-シリアル変換モジュールを2連装して電源を供給したらちゃんと動くようになりました。それでもちょっと足りないことがあるかも。AD変換値がなぜかX軸方向に重力加速度がかかっているようにみえる。orz
ボードを疑って済みません。。。
このパターンが一番ハマリ系ですね−。さっきまでは、あまりの動かなさにホントにどよよ〜んと暗くなっていましたよ。(;;)
CPUは結構暖かくなります。こりゃ電池で動かすとすると、ちょっと流せるやつじゃないとダメだなー。

2008年9月28日

ColdFireボード、ファイルシステム脆弱過ぎ!

いじっている内にWEBサーバが動かない状態に。。。たぶんファイルシステムが脆弱なんだろうなぁ。存在しないファイルURLを指定すると"Not Found"がちゃんと出るからね。
デフラグ前の残りデータバイト数もちょっと信用できない。
弟から借りた基板からのリカバリすらまともに出来ないっす。
っていうか、借りた基板もWEBサーバが動かない。orz
これじゃColdFireコンテストに出す気になれないじゃん!
もう一個Interface誌を買う気にはなれないぞ。
どうすっか。。。

2008年9月27日

iPhoneラジコンの軽快な???走りを見よ。

ラジコンをiPhoneで走らせる快感は、やった人じゃなきゃわからないでしょうね。
だって、iPhoneがラジコンのプロポになるなんて、普通考えないでしょ?
この前の動画では、子供たちと戯れてしまうくらいコントローラブルじゃなかったですが、今回はかなりコントロール出来てますよ。(ホンマか?)
まぁ、いいや、とりあえず動画はこれ。ドライバはアマである私の弟です。ご苦労さん。

え、前とそんなに変わってないって?気のせいですってば。

2008年9月26日

LD(Lightweight Development)で組込み世界の変革時代だ!

雑誌Interface9月号に付属してきた、ColdFireマイコンベースの実験ボードキットを今日から動かし始めています。
このボードにはsilentCというC言語インタープリタ+WEBサーバ+telnet機能がついていて、手軽にアプリを開発できるところが肝です。もちろんGNU開発環境系でオリジナルのアプリの作成できますが、一番メリットを感じるのは、とにかく手軽に開発できることです。
今まで長いこと組込みの仕事をやってきましたが、それは重厚長大、つまり地味で重たく開発期間も長く、うんざりすることも多かったのです。それはGNU開発環境で開発を行うのと同じレベルの面倒くささです。
それがどうでしょう、C言語インタープリタで開発することの軽快さといったら!
あっという間に簡単なアプリを作って楽しむことが出来ます。
インタープリタ系言語のことを、開発効率の手軽さから"Lightweight Language:LL"ということが多いのですが、あたかも"Lightweight Development:LD"ということが出来るでしょう。
新しい波が組込みの世界にもやっと訪れる時代になったようです。
これからはLDが組込みを変革するのです。
今回のColdFireボードはsilentCという開発元オリジナルのスクリプト言語が実装されていたので、世界を広げる力は十分でないと思いますが、PythonやRuby、perl、PHPなどのLLで実装された組込みプラットフォームが出てくれば、本当に組込みの世界は次の世代を迎えることになるでしょう。
そこを狙って、私も変革の波に飛び込んでいこうと思っています。

2008年9月25日

ビデオカメラの時代は終わったよ。。。

とにかくこのビデオを見て欲しいです!
Without further ado: Reverie
キャノンから新発売された、HD動画がとれる一眼レフカメラ"EOS 5D MkII"による無修正映画です(もちろんカット割りはソフトでやってるでしょうけど)。
カメラでこんな映画が作れるなんて、すごい!!
カメラだからレンズも自由に変えられるし(この映画では11本のレンズを使ったそうです)、その効果は多大なるものになるでしょう。
だって、ビデオカメラじゃ、いくらHD動画でもレンズが変えられないですからね。こんなの撮れないですよ。
これからは一眼レフHD動画カメラの時代になりそうな予感。。。
きっと、すごい映画がそこら中からどんどん出てきますよ!

ロボコン世界大会:気合いと根性だけじゃ、勝てんのだよ。

先日、NHKでロボコン世界大会の様子を放送していました。
豊橋科学技術大学が日本代表として出ていて、予選でエジプトと当たり、惨敗するという結果でした。なんとか得失点で決勝トーナメントにも出られたものの、やっぱりエジプトに負けました。
エジプトなんて、ピラミッドと砂漠の国だと思っていたら、すごい技術力です。
たった2秒で高得点をGETするパフォーマンスを発揮します。同じ点を日本のマシンが得るには20秒かかるという。。。圧倒的ですね。
豊橋科学技術大学の学生は、とにかく相手を邪魔して押さえきる!と言っていましたが、気合いと根性だけでは、この力の差はどうにもできないです。
日本の技術は最先端を誇るあまり、守りに入ってしまっているのかもしれません。
もしくは技術の方向性を誤ったか。
この力量差は戦略的ビジョンが足りなかったと言えるでしょう。
大学ですら、こんな姿勢が蔓延しているとは、、、orz
がんばれ!ニッポン!!だけではダメなんです。
もっと新しい発想が出来る若者が出てこないと、淘汰されますよ!!!
そんなことが実感できた放送でした。ある意味、感無量。

2008年9月24日

Androidってこんなんかい!

GoogleのプラットフォームであるAndroid携帯端末がT-Mobileより発表されました。
HTCの端末だそうですが、ダサいですね〜。かっこ悪い。
スティーブジョブスだったら絶対NGだしますね。
言ってみれば、WindowsMobile端末そのままです。特に下に並んでいるボタンが。iPhoneのような潔さを感じませんね。HTCだからか?

やっぱiPhoneのような洗練されたUIはずっとUIにこだわってきたAppleだからこそできたのだなぁ、と実感しました。だって、こんな端末、人に見せびらかせたいと思わないでしょ?iPhoneは見せびらかせますからね。
まぁ、UIや端末のかっこ悪さはさておき、Android端末が出てきたことにうれしさを覚えます。
端末コンセプトがいままでのビジネスモデルと異なりますから。
基本、Google端末はクラウドコンピューティングの1形態ですから、ネット上にすべての情報を蓄えてしまう、というのがコンセプトなわけです。
AppleのMobileMeもそれに近い部分もありますが、アプリですらネットに依存するAndroidとは一線を画します。ただし、ここまでやるとするとHSDPAではまだ通信速度が苦しいですね。4GあるいはWiMaxが来ないと本領発揮は出来ないでしょう。
それでも、アプリの作成・インストールの解放、アプリプールの提供、SDKの解放度はAppleよりは自由になっているようですし、サードパーティで自由に改変も可能なところは、今までの携帯電話の世界の破壊的変革につながると思います。
そのうち、もっと洗練された端末が出てくることでしょう。
そこを楽しみにしたいと思います。
あぁ、それにしてもかっこ悪い端末を始めにリリースしましたねぇ。このアナログ時計といったら、まるで学校の教室に飾ってあるようなやつだし。
iPhoneの後だけに落差が大きすぎです。
プロモーション的には大失敗ですね。商用端末という位置づけも戦略的にはいまいちな気がします。

2008年9月22日

SBがなんと言おうと、iPhoneをモデムにしよう!

iPhoneは基本的にモデムにはならないのですが(ソフトバンク的にはですが)、それをモデムにしてしまうアプリを入れてみました。AppStoreでもNetShareというのがあったようですが、ソフトバンクの意向か、削除されてしまいました。
今回入れたのはJailbreak、つまり勝手アプリ系の iPhoneModemというやつです。
これにはなぜか2種類まったく別のアプリがあって、片方はもう一方を偽物と言っている、と書いてあるブログもありました。初めはいろいろなブログを見ていると全然UIが違っているようなので、なんじゃこりゃ、と混乱してしまいましたが。
ちなみに、本家を名乗るiPhoneModem zsrelayというほうから試してみました。結果は惨敗。まったく接続が出来ませんでした。こちらの方はI/F的にはかっこよくて、iPhoneの左上にちっちゃくアイコンが出て、一度設定を済ましてしまうと、Mac側アプリから接続するだけでよいのですが、つながらないのでは意味がありません。
なので、偽物呼ばわりされているiPhoneModemという方を入れてみました。初めは本家のセッティングが残っていた(IPアドレスを静的に設定とか。)ため、まったく接続できず、うーん、どっちもダメか〜。と思って色々やっていたら、DHCP設定のままでよかったんですね、そうしたら、やっと接続できました。
これで、外にMacを持って行ってもどんな場所でも(圏内なら、、、)ネットにつながる環境が出来ました。ただし、Macアプリしかないのと、Safariじゃないとダメ(FireFoxを愛用しているのですが。)なのが欠点ですかね。
まぁ、緊急時にしかこんなものは使わないでしょうし、あんまり使うとあっさり最高定額金まで到達してしまうので、仕方ないでしょうな。(^^;)
それにしても、このアプリを動かすとすぐにiPhoneが暖かくなります。こりゃ、すぐに電池切れですね〜。

2008年9月20日

iPhone(iPod touch)鉄道模型コントローラの技術情報

iPhone(iPod touch)鉄道模型コントローラの技術情報を記しておきます。
実はソフトはiPodラジコンと同じなので(単に1chで操作できるだけで、もう1chはつながないだけの話です。また、XBeeかUARTかもプログラム的には区別がないわけです。)、省略します。(^^;)

完成基板は、こんな感じです。この写真はiPhoneのカメラで撮ってみたんですが、いまいちですねぇ。すんません。


構成は、モータドライバICのTA7291P(秋月電子:300円)をiPhoneがGainer経由で制御するわけですが、iPhoneが3.3Vなのに対し、TA7291PとGainerは5Vなので、電圧レベルを合わせる技が必要なところがポイントです。
5V系の電圧は、鉄道模型のモータ電圧を得るために12VACアダプタを接続するのですが、ここからレギュレータ(TA4805S:秋月電子で100円)で生成します。
3.3V系はiPhoneから直接もらうことにします。
UART通信系の3.3V信号を5V信号に変換するのは、SparkFun社のレベルコンバータ基板(スイッチサイエンスから通販購入:250円)を使いました。
回路図は以下の通りです。

これもとてもシンプルな回路です。
Gainerがあるとほんとに便利です。

※追記:ちなみに、iPhoneとの通信に有線のUARTを使っていますが、これをそっくりXBeeに入れ替えるだけでワイヤレス鉄道模型コントローラが簡単に出来上がります。
なぜ、そうしないかって?すでにiPhoneラジコンでXBee使っちゃってるからです。もうお金がないっす。。。

2008年9月19日

弱まれキャリア、がんばれメーカ!

ドコモ、ソフトバンクに続いてイーモバイルもHTCのTouch Diamond端末を発売するようです。
今まではキャリア主導で端末を出していたわけですが、この現象はそれは弱まりメーカ主導に移り変わっていく様を映し出している気がします。
メーカ主導でなければ、オリジナリティのある端末は出てこないと思います。
この現象は大歓迎です。
iPhoneが斬り込み隊長だったわけですが、これからはどんどんこういう形が出てくることを祈ります。
ただし、自分的にはWindowsMobileは好きではないですけどね、どんなにiPhoneライクになっても。
自分的にはGoogleのAndroid端末がこれからを占う鍵になる気がしています。
ウチの会社は、こういうアプローチが出来る素質があるのかしら?
きっとないですね、残念ながら。

2008年9月18日

MAKE: Japan のブログに掲載されました。

鉄道模型の時は本家MAKE:のブログに掲載されましたが、iPodラジコンの方は日本のMAKE:Japanのブログに掲載されました。
うれしいもんですねー。
iPod touchでラジコン

iPodラジコン技術情報

作成したiPodラジコンのハードウェアの技術情報を記しておきます。
ソフトの方は、iPodのOSバージョン1.1.4版にしておきます。
2.1の方はなんかSDKのNDAとかあるし、なんとなく心配なので止めておきます。

買ってきたラジコンはTOMITECHのエアロRC:マツダRX-8(黒)です。
実売価格は1000円程度です。
このラジコンは、普通のラジコンと違って、サーボモータではなく、よくプラモデルで使われるマブチ130モータをステアリング×1、ドライブ×1の計2個を使用しています。ステアリングは1.5V、ドライブは3Vで動作させるようです。
今回の改造は、ステアリングもドライブも同じ3V系にしてしまいました。
Gainer君のアナログ出力のPWMを使ってモータ回転の速度と方向を制御します。



制作過程を下に載せておきます。

1.まず、ラジコンのメイン基板を取り外します。ボス穴3つに通して乗っかっているだけなので、簡単に外れます。もちろんモータケーブルも外してしまいます。この基板はこれで用無しです。ただし電池端子、スイッチ端子も兼ねていますので、それを後で、半田付けから外すことになります。



2.電池端子とスイッチ端子を半田付けから取り外しました。



3.今回は部品がたくさんあるので、1つの基板に収まり切りません。て、いうか載せきれるか?が勝負になりました。なので、2階建ての構造をとることになりました。まず、1階の基板をユニバーサル基板から切り出し、ボス穴に合わせて2mm穴をあけます。それから、電池端子用にも穴を作ります。この穴は丸くないので、ヤスリでしこしこと形状調整していきます。穴を開けたら半田付けしてしまいます。ぴったりとボディに収まりました。
注意点は、電池スイッチの接触をラジオペンチなどで再調整しないとうまくON/OFF出来ません。



4.この1階の基板にはモータドライバICを前後用に2つ載せます。ICはNECのμPD16805のSOP品です。SOPはそのままユニバーサル基板に載せるのは面倒なので、ピッチ変換基板を買ってきてそれに載せます。ちなみにICは秋葉原のツクモロボット館で購入しました。
2階との間の配線も行って、ピンコネクタで接続することになります。
また、この基板を固定するカバーはもともとの基板を固定するやつを使うのですが(前後のモータカバーの押さえも兼ねているので。)、2階基板との接続用に真ん中を切り落としてしまいます。なので、前後に分割してしまいます。これも一品物なのでヤスリで2階部品との干渉を避けながら、しこしこと作っていきます。



5.さて、2階基板の作成ですが、手持ちのユニバーサル基板が片面実装なので素直に部品面を上にすることができません(部品面には半田付けすることができないですから)。あー、両面基板のユニバーサル基板を用意すればよかった・・・と後悔しても始まらないので、スーパーテクニックで部品面を下にして(部品面を向かい合わせにする)、半田面側に部品を載せることにしました。
載せる部品は、
 ①Gainer(生PSoC(CY8C29466)に3.3V版でファームウェアを焼いたもの:秋月電子で500円也)
 ②XBeeモジュール(アルファ電子から通販購入:3480円/1個)
 ③2mm→2.54mmピッチ変換基板+2mmコネクタ(SparkFunから輸入購入:$2.95、$1.25×2)
 ④3V→3.3VDCDCコンバータ(GainerとXBeeが3.3V動作なので必要:ストロベリーリナックス社製AS1322A DC/DCコンバータモジュール(3.3V/5V) を通販購入:840円)
の4つです。すべて結構な面積があるので、RX-8のボディにうまく収まるように配置をよく検討しました。
ちなみにGainer君は部品面側に直接半田付けですので写真では裏に隠れて見えなくなってます。



5.次は、iPod側にXBeeモジュールをくっつけます。iPodドックコネクタ(千石電子:400円)から2mmピッチコネクタ(千石電子:400円)を経由してXBee君を固定します。
ドックコネクタは端子間隔が非常に狭く、また小さいので、配線が非常に大変です!
ピッチコネクタをどうくっつけたかですが、瞬間接着剤です。でもこれだけだと十分な面積が稼げなくてちゃんと付かなかったので、サポートの板を切り出して面積を稼いで貼りました。ふっー。



6.これでハードウェアの準備は出来ました。
ラジコン側の回路図はこんな感じです。



これが完成したiPod+XBeeラジコンです。



ソフトはこんな感じ、あんまり大したことないですよ。
使ってないコードも入っちゃってますけど、ご勘弁を。
あ、もちろん、PyGainerとPySerialが必要です。必要な方はググってみてください。
import objc
from _uicaboodle import UIApplicationMain
from objc import YES, NO, NULL
from PyGainer import PyGainer
import math

textView = None
#killSwitch = None
#killView = None
#speedCtrl = None

STOP = 0
FORWARD = 1
BACKWARD = 2
direction = STOP
STRAIGHT = 0
RIGHT = 1
LEFT = 2
turn = STRAIGHT
count = 0
values = [0, 0, 0, 0]

objc.loadBundle("UIKit", globals(), "/System/Library/Frameworks/UIKit.framework")
#objc.loadBundle("GraphicsServices", globals(), "/System/Library/Frameworks/GraphicsServices.framework")

class radiconApp(UIApplication):

@objc.signature("v@:@")
def applicationDidFinishLaunching_(self, unused):
global textView, killView
outer = UIHardware.fullScreenApplicationContentRect()
self.window = UIWindow.alloc().initWithFrame_(outer)
self.window.orderFront_(self)
self.window.makeKey_(self)
self.window._setHidden_(NO)

inner = self.window.bounds()
print inner
self.view = UIView.alloc().initWithFrame_(inner)
self.window.setContentView_(self.view)

textView = UITextView.alloc().initWithFrame_(((0,0),(320,40)))
textView.setEditable_(NO)
textView.setTextSize_(20)
textView.setText_("Sample text.")
self.view.addSubview_(textView)

self.killSwitch = UISwitchControl.alloc().initWithFrame_(((200,100),(320,40)))
self.killSwitch.setValue_(0)
self.killSwitch.addTarget_action_forEvents_(self, "kill:", 0x00000f00)
self.view.addSubview_(self.killSwitch)

self.killView2 = UITextView.alloc().initWithFrame_(((0,140),(100,40)))
self.view.addSubview_(self.killView2)

self.killView = UITextView.alloc().initWithFrame_(((0,100),(100,40)))
self.view.addSubview_(self.killView)

self.speedCtrl = UISliderControl.alloc().initWithFrame_(((0, 200),(320,40)))
self.speedCtrl.setMinValue_(-127)
self.speedCtrl.setMaxValue_(128)
self.speedCtrl.setValue_(0)
self.speedCtrl.setShowValue_(YES)
self.speedCtrl.setContinuous_(1)
self.speedCtrl.addTarget_action_forEvents_(self, "changeSpeed:", 0x00000f00)
self.view.addSubview_(self.speedCtrl)

self.pg = PyGainer()
print "try gainer."
self.pg.open("/dev/cu.iap", PyGainer.MODE1)
print "Gainer open."
self.pg.setHigh(0)
self.pg.setHigh(1)

def kill_(self):
global killView
print "test"
"""
if self.killSwitch.value() == YES:
print "kill"
self.speedCtrl.setValue_(0)
else:
print "valid"
"""

def changeSpeed_(self):
global speedCtrl
#print "change"
#print self.speedCtrl.value()
#speed = self.speedCtrl.value()
print speed

@objc.signature("v@:fff")
def acceleratedInX_Y_Z_(self, x, y, z):
global textView, direction, turn, count, values
print "accel"
str = "x = % -1.3f, y = % -1.3f, z = % -1.3f" % (x, y, z)
textView.setText_(str)
speed = (y * 100 / 50 ) * 255
if speed < 25 and speed > -25:
speed = 0
if speed > 255:
speed = 255
elif speed < -255:
speed = -255
sp = "% -d" % speed
self.killView.setText_(sp)
tilt = (x * 100 / 50 ) * 255
if tilt < 25 and tilt > -25:
tilt = 0
if tilt > 255:
tilt = 255
elif tilt < -255:
tilt = -255
ti = "% -d" % tilt
self.killView2.setText_(ti)
if speed > 25:
if direction == BACKWARD:
direction = FORWARD
values[2] = 0
values[3] = 0
self.pg.analogMultiOutput(values)
sleep(0.01)
values[2] = 0
values[3] = speed
elif speed < -25:
if direction == FORWARD:
direction = BACKWARD
values[2] = 0
values[3] = 0
self.pg.analogMultiOutput(values)
sleep(0.01)
values[2] = -speed
values[3] = 0
else:
direction = STOP
values[2] = 0
values[3] = 0
if tilt > 25:
if turn == LEFT:
turn = RIGHT
values[0] = 0
values[1] = 0
self.pg.analogMultiOutput(values)
sleep(0.01)
values[0] = 0
values[1] = tilt
elif tilt < -25:
if turn == RIGHT:
turn = LEFT
values[0] = 0
values[1] = 0
self.pg.analogMultiOutput(values)
sleep(0.01)
values[0] = -tilt
values[1] = 0
else:
turn = STRAIGHT
values[0] = 0
values[1] = 0
self.pg.analogMultiOutput(values)

@objc.signature("v@:")
def applicationWillTerminate(self):
self.pg.setLow(0)
self.pg.setLow(1)
values = [0, 0, 0, 0]
self.pg.analogMultiOutput(values)
#self.pg.analogOutput(0, 0)
#self.pg.analogOutput(1, 0)
self.pg.terminate()
print "terminating"

UIApplicationMain(["radicon"], radiconApp)

実装はかなり苦労しました。設計なんかよりも実装が大変でしたね。
おい、一体いくら掛かってんだよー、という声が聞こえるようです。
まーいいじゃないですか、結構楽しいですよ。

ウチと近所の子供と戯れるiPodラジコンです。この時のコードだと操縦がかなり難しかったですが、OS2.1バージョン用はもっと楽になりました。
video
ちなみに、これはMAKE: TokyoMeetingに出品する予定です。
iPodではなく、iPhoneで動かしますよ!!

2008年9月17日

グレア?ノングレア?

iPhoneの表面を傷つけたくないので、表面フィルム付きカバー(Air jacket set for iPhone3G:パワーサポート社製)を買いました。
初めは指紋が目立つのがいやだなぁと思って、ノングレア(ザラザラのやつ)にしていたのですが、なんかくすんでいて、とてもダサく感じました。それに、ノングレアでも結構手垢が付いているのがわかってしまうし、結局グレア(ツルツルのやつ)に交換しました。
とたんに、鮮明な画像になって格が一段上がった気がします。あー、素敵!
私のMacBookProもノングレアにして失敗したなぁ、と思っていたので、やっぱり画面ははっきりくっきり映るほうが自分の好みなんだなぁ、とつくづく実感しました。
つまり、手垢を拭くことで、またきれいになった楽しみを得るものなのだ。
次に何か買うときも必ずグレアにするぞー!

現代の登記権利書(登録書)

先日、父が亡くなったので、今済んでいる家の土地が父名義だったため、登記の変更を行い、今日無事に完了しました。
父の時代の登記権利書を見てみると、手書きで数ページに渡るもので、物々しくて本当に重要なものなのだなぁ、と実感していたのですが、今日もらった権利書(登記登録書)は、プリンタ出力したペラ紙1枚のそれは貧相なものです。知らない人だったらうっかり捨ててしまいそうです。オンラインで管理するようになったからこうなってしまったのでしょうが、なんか価値感が全く感じられません。
軽薄短小の時代をそのまま反映しているなぁ、と感じたのでした。

iPodラジコン→iPhoneラジコンポーティング

iPhoneのjailbreakで勝手アプリをインストール出来ることがわかったので、さっそくiPod touch用のラジコンアプリをiPhoneへポーティングしました。
いくつか作法が変わっているのと、SDKのクラスライブラリが変わっていましたが、昨日少しポーティング実験をしたので、あっさり完了。
そういえば、iPodの加速度センサの値は±0.5でしたが、iPhoneでは±1.0になって、かつX軸のプラスマイナスの向きが逆になっていました。iPodも2.1にするとそうなるのかなぁ。なんか結構コンパチにしていないんですよね。

PyObjCのバグは2.1では発生せず。

PyObjCでプロパティ値を取得するとハングする問題があるのは前のBlogに書きました。
PyObjCポーティング作者に問い合わせたところ、バグかもしれない、との話でしたが、jailbreakの仕事が忙しいのか、一向にバグフィックスされません。
しかし、iPhoneを入手したので、同じようにプロパティを取得してみたところ、無事値が得られました。なので、iPod touchも2.1にしてしまった方がいいかなぁ、と思っています。
それの方が、最新のSDKの情報も使えるし、便利なんですよね。

iPhoneへの勝手アプリインストール

できますね。
アプリのインストール先は2つに分かれています。
1つはAppStoreからダウンロードしたアプリが入る/mobile/Applicationsです。
これはその下のディレクトリがハッシュ値のディレクトリ名になっているので、勝手アプリはいれるのが面倒です。
もう一つはルート直下の/Applications。ここは特に変な細工もなく、そのまま素でアプリをインストール出来ます。jailbreakでインストールされるアプリもここに入っています。
早速、加速度センサ値を取得するPyObjCアプリを入れてみました。
初めはスプリングボードにアイコンが表示されずにあせりましたが、CydiaからUIKit Toolというのをインストールすると、あっさりアイコンが表示されました。
実行もちゃんと出来ます。
ただ、1.1.x時代はSSHのコマンドラインからPythonを実行すればprintデバッグ出来ましたが、2.1では何も出力されないので、このデバッグは使えません。

iPhoneはキャリアとの通信があるので、UIKit系の操作のレスポンスが悪い気がします。
UISliderなんかは最悪で、指でなぞっても追従性は非常に悪いです。
iPod touchを2.1にしてみて実験してみれば、キャリア通信の問題かどうかがわかりますね。

2008年9月16日

 Panasonicタイマ

うちのビデオカメラはPanasonicなんですが、ついにDVカセットのだし入れが出来なくなってしまいました。
Sonyタイマなんていう噂があって、3年たつとタイマが効いてSony製品は買い換えだ、というのがありましたが、Panasonicでも同じですね。5年ですけど。
最近の家電系は本当に数年で壊れますね。
こんな姿勢でいいのでしょうか?
とりあえず、DVカセットが読める機種はこれだけなので、修理しますが、次のビデオカメラをどうしようか迷っているのでした。

iPhone2.1のjailbreakはあっさり出来ます!

すでにQuickpwnやPwnageで2.1用のjailbreakツールがアップされています。
あっさり脱獄できました。Quickpwnの方がうまくいきました。Pwnageはうまくいきませんでした。
2.0の時は/Applicationsディレクトリの下にランダムな数値のディレクトリが出来ていて、こりゃ勝手アプリ対策だなー、と思っていたのですが、2.1になってからは普通にアプリが並んでいます。なーんだ、これなら勝手アプリが自由に入れられそうです。
試してみたら、報告してみようと思います。

2008年9月14日

iPodラジコン、操縦難しい!

ラジコン歴の長い弟に操縦をおねがいしたのですが、それでも8の字走行すら満足に出来ない状況。
こんなんで、iPodラジコンなんて言えるのか?
と、思ったらプログラムの方で結構チューニングすれば、もう少しまともになりそうです。
また弟にトライしてもらおうっと。

やっとiPhone設定開始だが。。。

xxx@i.softbank.jpのxxxを変更するのにすごい苦労した。
まずはMy Softbankにアクセスしなければならない。
そこでSMSで受け取ったIDとパスワードを入れるのだが、コピペが出来ないのでメモに手書きしておいて入力。
パスワードもランダムな文字列なので、自分のわかりやすいのに変更。
それだけではダメで、メールサーバの設定を設定→メール/連絡先/カレンダー→アカウントを追加で設定。
入力後、保存ボタンを押してしばらく待った後、「SSLで通信できません。」ダイアログで「はい」を入力しないと、i.softbank.jpのメールを受信できないです。
これって、すごく障壁が高いですね。素人さんにはほとんど対応できないでしょう。
もう少しやり方を工夫しないとダメですよ、ソフトバンクさん。

2008年9月13日

iPhone、来てしまいました。

今朝、届きました。
いろいろいじってみると、やっぱり常にネットワークにつながることが出来る重要性を感じました。iPod touchのように無線LAN環境を探すストレスがなく、情報にアクセス出来るわけです。
買ってよかったかなぁ、と思ってます。
ところが、子供たちが邪魔をしながらアクティベーションやアップデートをしていたおかげで、うっかり最新のバージョン2.1にまであげてしまいました。これじゃJailbreakできないじゃん!
はぁ−、はやく2.1でJailbreakしてくれないかしら。勝手な希望ですけどね。
ただ、バッテリーチューンや、いろいろなバグフィックスしているはずなので、ケータイとして考えてみると重要なアップデートだったわけですけどね。

自然と戯れる喜び

今日は子供たちとその友達の家族で近くにある水元公園に遊びに行ってきました。
久しぶりにザリガニ釣りをしたり、木々に囲まれてお弁当を食べたり、いろいろ自然と戯れてきました。ザリガニ釣りなんかは、自分が子供の頃を思い出して、子供より自分の方が興奮してしまったかもしれません。子供たちも生き生きと遊んでいて、あー、こういうのが大事なんだよな−、と感じてしまった一日でした。
本当に、今の世の中はコンクリートに囲まれてしまって、こういう余裕を忘れてしまっているんですね。自分の子供の時は当たり前の光景だったわけで、それだけに何度もこういう経験を子供たちにさせておくのは重要だなぁ、と感じています。

松屋の豚丼

今日初めて豚丼というのを松屋で食べました。
言ってみれば、牛丼の肉が豚に変わっただけ、という感じですかね。
やっぱ牛丼の方が食べ慣れているせいか、しっくりきますね。
いや、まずいわけではなく、おいしくいただきましたけれど。
ただ、どうやって食べようか迷ったあげく、紅ショウガ+七味唐辛子という牛丼トッピングで食べてしまいました。
正しい食べ方はあるのかしらん???

2008年9月12日

iPodラジコン作りました。

iPodで動かすラジコンを作りました。
無線にはXBee(802.15.4)を使っています。
iPod側の制御ソフトはPyObjC+PyGainer、ラジコン側の制御部はGainerです。
実走行動画はまた別途アップしようと思います。

2008年9月11日

酔った勢いで、プチッ!

頼んじゃいましたよ、YahooケータイでiPhone。
新規契約にしました。
3日くらいで来るようです。
とっても楽しみだったりします。
そう言えば、昨日OSが2.1にバージョンアップして電池寿命が延びたり、バグフィックスしたりしているようですね。結構たたかれていましたが、どうなるか?

来ました、XBeeピッチ変換ボード

ちゃんと来るんですね−。(当たり前か)
ポストを見たら、ちっちゃい箱が。
オーダーしてから約2週間でした。
これでこれからは安心して注文できますね。
変換ボードも来たことですし、しこしことXBeeラジコンを作っているところです。
出来たらまた公開します。

2008年9月8日

Macで鉄道模型コントローラを作る方法

リクエストがありましたので、MacとGainerを使って鉄道模型コントローラを作るための情報を載せておきます。

まずは、ハードウェアですが、TA7291Pという東芝のモータドライバIC(千石電子や秋月電子で入手可)を使っています。回路的にはデータシートそのままです。制御用のIN1,2をGainerのaout0,1に接続します。Gainerの情報はここ。Gainerのアナログ出力は幸いPWM出力ですので(つまりPWM回路不要というメリットがあります)、出力値がそのままPWMのパルス幅になることで、速度制御が自由に出来るようになります。ちなみにPWM周波数は50Hzで、鉄道模型的にはちょうどいい感じの緩い周波数です。回路図中の5VはGainerを繋げると得られるUSBからの5Vです。12Vは秋月電子で買ってきた12V1AのACアダプタ出力です。



次にソフトですが、Macに予め次の3つのPythonソフトをインストールしておきます。
1.PyObjC
2.PySerial
3.PyGainer

XCodeでコーディングするのが一般的なのでしょうが、Objective-Cコードを一切使わずにPythonのみでコードを書いてしまいました。参考にしたのは、XCodeをインストールしたときに一緒に置かれていたPyObjCのサンプルコードです。/Developer/Examples/Python/PyObjC/Scripts/HelloWorld.py
こいつを改造して、以下のプログラムを作成しました。
rmccontroller.py :起動は、$python rmccontoller.py です。
USB-シリアルのポート名(/dev/tty.usbserial-A2002mmD)は、私のやつですので、書き直してください。

#!/usr/bin/env pythonw
# coding:utf-8
# rmcont.py

import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper
from objc import YES,NO
from PyGainer import PyGainer
from time import sleep

app = None
speed = 0
speedDisp = None
slide = None
radio = None

STOP = 0
FORWARD = 1
BACKWARD = 2
direction = STOP

class AppDelegate (NSObject):
def applicationDidFinishLaunching_(self, aNotification):
self.pg = PyGainer()
print "Gainer Initialize..."
self.pg.open("/dev/tty.usbserial-A2002mmD", PyGainer.MODE1)
print "Gainer Initialize Ok."

def changeSpeed_(self, sender):
global speed, direction
speed = slide.intValue()
speedDisp.setIntValue_(speed)
#print "Speed Change."
if direction == FORWARD:
self.pg.analogOutput(0, speed*255/100)
elif direction == BACKWARD:
self.pg.analogOutput(1, speed*255/100)

def changeDirection_(self, sender):
global speed, direction, radio
print "Change Direction."
print speed
if radio.selectedCell() == radio.cellAtRow_column_(0, 0):
print "Forward."
direction = FORWARD
self.pg.analogOutput(1, 0)
sleep(0.1)
self.pg.analogOutput(0, speed*255/100)
sleep(0.1)
elif radio.selectedCell() == radio.cellAtRow_column_(0, 1):
print "Stop."
direction = STOP
slide.setIntValue_(0)
speed = 0
self.pg.analogOutput(0, 0)
sleep(0.1)
self.pg.analogOutput(1, 0)
sleep(0.1)
elif radio.selectedCell() == radio.cellAtRow_column_(0, 2):
print "Backward."
direction = BACKWARD
self.pg.analogOutput(0, 0)
sleep(0.1)
self.pg.analogOutput(1, speed*255/100)
sleep(0.1)

def close_(self, sender):
global app
print "Ganier Close."
speed = 0
self.pg.analogOutput(0, 0)
sleep(0.1)
self.pg.analogOutput(1, 0)
sleep(0.1)
self.pg.terminate()
app.terminate_(sender)

def main():
global speed, speedDisp, slide, radio, app

app = NSApplication.sharedApplication()

# we must keep a reference to the delegate object ourselves,
# NSApp.setDelegate_() doesn't retain it. A local variable is
# enough here.
delegate = AppDelegate.alloc().init()
NSApp().setDelegate_(delegate)

win = NSWindow.alloc()
frame = ((0.0, 800.0), (320.0, 480.0))
win.initWithContentRect_styleMask_backing_defer_ (frame, 15, 2, 0)
win.setTitle_ ('Railway Model Contoroller')
win.setLevel_ (3) # floating window

title = NSTextField.alloc().initWithFrame_(((40, 440), (240, 20)))
title.setEditable_(NO)
title.setSelectable_(NO)
title.setBezelStyle_(NSTextFieldRoundedBezel)
title.setAlignment_(NSCenterTextAlignment)
title.setStringValue_(u'鉄道模型コントローラ')
win.contentView().addSubview_(title)

ctrl = NSButtonCell.alloc().init()
ctrl.setButtonType_(NSRadioButton)
ctrl.setHighlightsBy_(0)
radio = NSMatrix.alloc().initWithFrame_mode_prototype_numberOfRows_numberOfColumns_(((50.0, 220.0), (120.0, 100.0)), NSRadioModeMatrix, ctrl, 3, 1)
radio.setCellSize_((100.0, 20.0))
radio.setIntercellSpacing_((50, 40))
radio.cellAtRow_column_(0, 0).setTitle_('Forward')
radio.cellAtRow_column_(0, 1).setTitle_('Stop')
radio.cellAtRow_column_(0, 2).setTitle_('Backward')
radio.selectCell_(radio.cellAtRow_column_(0, 1))
radio.sizeToCells()
radio.setTarget_(app.delegate())
radio.setAction_("changeDirection:")
win.contentView().addSubview_(radio)

slide = NSSlider.alloc().initWithFrame_(((200.0, 120.0), (30.0, 250.0)))
slide.setContinuous_(YES)
slide.setTarget_(app.delegate())
slide.setAction_("changeSpeed:")
slide.setMinValue_(0)
slide.setMaxValue_(100)
slide.setNumberOfTickMarks_(10)
slide.setTickMarkPosition_(NSTickMarkRight)
win.contentView().addSubview_(slide)

speedTitle = NSTextField.alloc().initWithFrame_(((160.0, 380.0), (50.0, 30.0)))
speedTitle.setEditable_(NO)
speedTitle.setSelectable_(NO)
speedTitle.setBordered_(NO)
speedTitle.setDrawsBackground_(NO)
speedTitle.setStringValue_('Speed:')
win.contentView().addSubview_(speedTitle)

speedDisp = NSTextField.alloc().initWithFrame_(((210.0, 380.0), (50.0, 30.0)))
speedDisp.setEditable_(NO)
speedDisp.setSelectable_(NO)
speedDisp.setBordered_(NO)
speedDisp.setDrawsBackground_(NO)
speedDisp.setIntValue_(0)
win.contentView().addSubview_(speedDisp)

bye = NSButton.alloc().initWithFrame_ (((100.0, 40.0), (120.0, 30.0)))
win.contentView().addSubview_ (bye)
bye.setBezelStyle_( 4 )
#bye.setTarget_ (app)
#bye.setAction_ ('stop:')
bye.setTarget_(app.delegate())
bye.setAction_('close:')
bye.setEnabled_ ( 1 )
bye.setTitle_( 'Goodbye!' )

adios = NSSound.alloc()
adios.initWithContentsOfFile_byReference_( '/System/Library/Sounds/Tink.aiff', 1 )
#adios.initWithContentsOfFile_byReference_( '/System/Library/Sounds/Basso.aiff', 1 )
bye.setSound_( adios )

win.display()
win.orderFrontRegardless() ## but this one does

AppHelper.runEventLoop()

if __name__ == '__main__' : main()


これですべてです。実はあんまり大したプログラムでもないんですよね。
こいつを動かしたところを映した動画が、
"Railway Model Control with Mac and Gainer"
です。

2008年9月5日

iPhoneやっぱり欲しいか?

iPhoneを秋葉原ヨドバシカメラで触ってきたんですが、やっぱ欲しいかなぁ。
Jailbreakがどこまで出来るのかももう一度試したいし、GPSとカメラがついているのは魅力だったりします。急いで機種変更する必要もないので、今日は退散してきましたが、なんか気になる−!
思ったより売れていないようですね。100万台の予定が20万台そこそこらしいです。
いいじゃん、自分の使い方は他の一般ケータイユーザと違うんだし。
どうしようか?
それとは違うんですが、e-mobileとバンドルしたネットPCが10800円とかで売っているのも気になっちゃいますね−。解約料が高いので損なのか得なのかが非常に微妙ですが。

2008年9月4日

iPhone/iPod touch用PyObjCにバグ?

iPod touchで鉄道模型コントローラを作ったりしていたわけですが、実はiPodのUIControl系のプロパティを取得しようとするとハングする問題に悩んでました。
英語は苦手ですが、思い切ってPyObjC作者の管理するメーリングリストに質問を投げたところ、バグかもしれない、との返答がありました。
出してみるもんですね−。
早く直ってくれないかしら。直れば手動でコントロールしたり出来るモードが作れるんです。
そしたらもっといろいろiPodのアプリが作れます。1.1.4用のObjective-Cの開発環境を作るのは面倒くさいですし、Pythonで書く方が気軽でいいですしね。

どうやら3日かけてラベルを作ってくれたらしい。

XBeeのピッチ変換ボードをSparkFunに発注していたが、今日やっとShippedになりました。
3日も(住所?)ラベルの印刷に費やした模様。なので、到着は今月来るのか?どうだろう???
さすが、海外ですね。
そう言えば、XBeeってどうやって読むのだろう。
クロスビー?エクスビー?
誰か教えてください。

2008年9月2日

MAKE:誌のブログに掲載されました。

MAKE:誌というハッカー・ギーク系雑誌があるので気に入っているのですが(右のAmazonのおすすめ本にも載せていますが)、ここのブログに今まで作った鉄道模型シリーズ動画が掲載されました。
Made in Japan - Volume30
上から3つめくらいに出ています。
こういうのに出るととたんにアクセス数が跳ね上がりますね。
次回の日本のMAKE:Meetingに展示しようと思っていたので、ちょっとうれしいです。
出してみるもんですね−。
次のネタは、XBeeラジコンの予定です。がんばろー!

また会社の夢。

ちょっと前にいろんなシチュエーションの夢を見ると書いたのですが、ここ数日はまた会社の夢を見るようになってきました。復帰が近づいているからなのか。休業から復帰した後にいろいろフォローをしている夢を見ます。結構夢見が悪いので、朝起きたときにとても憂鬱な気分になります。大丈夫かなぁ。。。

2008年9月1日

XBeeを動かしてみました。

2mmピッチコネクタで困っているとは言え、動かしてみたかったので、クリップケーブルを使ってXBeeを動かすことにしてみました。
いろいろハマったこともあるので、備忘録もかねて書いておこうと思います。

まずは設定から。
1.秋月電子のUSB-シリアル変換モジュール(¥950)を経由してXBeeのVcc,Gnd,Tx,Rxの4線と接続します。VIOはXBeeが3.3V動作なので、3.3V側にJ1でセットします。5V側にしないように。
2.XBeeを製造しているMaxStream社からX-CTUという設定・通信ユーティリティをダウンロードしてインストールしておきます。
3.まずはXBee単体でPC側ソフトで認識できるか確認しましょう。X-CTUのPC Settingsタブを開いて、右真ん中あたりにあるTest/Queryボタンを押してみて、XBeeが認識できるかを表示してみます。Communication with modem..OKの文字が出れば大丈夫。Unable to communicate with modem.が出るようなら配線を再確認します。2つのXBee間で通信を行うので、それぞれについて確認しましょう。
4.それぞれのモジュールのデフォルトの設定をModem ConfigurationタブのModem Parameters and FirmwareのReadボタンで読み出しておきます。
5.2つのXBeeモジュールはそれぞれ設定が異なります。片方はコーディネータ(CE=1)に設定し、もう一方はエンドポイント(CE=0:default値)に設定します。設定は、Modem ConfigurationタブのNetwork&Securityの下、CE-Coodinator Enableをクリックして値を設定します。
6.続いて、同じくNetwork&Securityの下、MY-16bit Source Addressをそれぞれ設定します。同じ番号でなければ0xFFFF以外ならどんな組み合わせでもOK。ex)1と2とか。
7.続いて、Network&Securityの下、DL-Destination Address Lowのアドレスを上記MYの相手側の値に設定します。たすき掛けですね。ex)1と2なら2と1とか。
8.Modem Parameters and FirmwareのWriteボタンでXBeeにこの設定を書き込みます。
これで準備OK。

どちらのXBeeモジュールでもいいですが、TxとRxをショートさせます。そして、Range TestタブのStartボタンを押せば、ループバックテストが出来るので、通信が出来ているかどうかがわかります。Goodカウンタが加算されていけばOK。

ググってみると意外にこういう情報が(英語)マニュアルをよく読む以外に見あたらないので、ちょっと困ることでしょう。

と、言うわけで、スターターキットの¥19800を買わなくても、モジュール2つだけ(¥7308)で十分に動作確認はできます。¥12000の差は大きいですね−。

あ、ハマったことを書いておきます。
・MacではParallelsでWinXPを動かすことが出来るので、私はいつもこれを使うのですが、秋月電子のUSB-シリアル変換モジュールはドライバがきちんと認識されるのに、データのやりとりが出来ません。ピュアなXPマシンを用意しなければなりません。どハマリしました。
・XBeeはデフォルトではNonSleepモードで動くので、使っているとちょっと暖かくなります。Cyclic Sleepモードというのがあって、定期的にスリープに落ちるので、省電力になるはずですが、設定時間にもよると思いますが、下手にSTやSPコマンドで設定してしまうと、全くつながらなくなります。(少なくともつながらなくなるように見えます。)やり方があるとは思いますが、へたにいじくるとなぜか設定値も再設定できなくなったりしました。青くなりました。リセット端子を数秒間Hに振っておいたら、うまく元に戻せましたが。。。

こんな感じですが、あっさりと無線通信が出来ることが確認できました。
はやくピッチ変換ボードこないかなぁ。。。SparkFunの発送ステータスを見ると2日間くらいLabel Printedのままです。どんなにすごいラベルプリントで送ってくるのかなぁ。のんびりしてますね−、海外は。

XBeeはBluetoohで言うペアリングがシンプルなので、いいですね。Bluetoothはすごいけど、ペアリングの難しさが障壁になっている気がします。