2009年7月アーカイブ



特走行ってきました。コントローラユニットは成功。USBケーブルをつながずに
ログをとることができました。P-LAPのとりこみは失敗。ノイズがのりまくって
どれが信号だかわからない状態。

lap=219.881000
lap=46.105000
lap=16.063000
lap=34.067000
lap=38.470000
lap=15.021000
lap=32.998000
lap=36.903000
lap=13.895000
lap=28.778000
lap=33.941000
lap=12.877000
lap=28.106000
lap=34.318000
lap=14.696000
lap=119.500000
lap=0.000000
lap=7.449000
lap=13.793000
lap=0.014000
lap=0.028000
lap=10.778000
lap=12.115000
lap=26.237000
lap=20.379000
lap=10.817000
lap=0.007000
lap=12.077000
lap=25.788000
lap=19.540000
lap=0.010000
lap=0.010000
lap=0.001000
lap=0.010000
lap=0.010000
lap=0.031000
lap=0.020000
lap=0.259000
lap=0.029000
lap=0.121000
lap=0.066000
lap=0.033000
lap=0.493000
lap=10.453000
lap=0.007000
lap=0.000000
lap=11.918000
lap=26.127000
lap=4.533000
lap=15.658000
lap=0.358000
lap=0.055000
lap=0.164000
lap=10.494000
lap=12.007000
lap=22.869000
lap=2.954000
lap=20.074000
lap=0.030000
lap=0.417000
lap=10.791000
lap=12.230000
lap=9.932000
lap=0.009000
lap=0.070000
lap=0.209000
lap=0.083000
lap=0.043000
lap=0.075000
lap=16.679000
lap=20.289000
lap=11.100000
lap=11.972000
lap=0.008000
lap=0.000000
lap=25.785000
lap=31.207000
lap=11.947000
lap=25.654000
lap=19.671000
lap=11.561000
lap=11.873000
lap=25.802000
lap=0.011000
lap=0.000000
lap=31.122000
lap=11.974000
lap=10.701000
lap=15.057000
lap=20.213000
lap=2.145000
lap=8.735000
lap=11.943000
lap=25.818000
lap=9.511000
lap=10.903000
lap=10.594000
lap=11.810000
lap=28.261000
lap=34.763000
lap=16.550000
スピードデータは問題なし。二周程170km/h近くまで行ってるのはバックストレッ チで速い選手に抜かれた時にスリップで最終の進入までついていったもの。そ の後コントロールラインでは20mくらい前に行ってしまう...。

これはラストラップで8.6まで。がんばったつもりだけど、最終コーナーは 130km/hまで落ちてしまう。走ってるとアクセルオフでそんなにスピードが落ち てる気がしないんだよね。まず最終コーナーのスピードの落ち込みをなくして、 その次はCX切り返し後のアクセルオフ時間だな。

レースに体力を残すために一本目だけで帰ってきて整備しました。P-LAPの信号 は10kΩでつないでいたところを並列に1kΩいれて900Ω程度にしてみました。 電流流してノイズをなんとかしようという試み。

11:05 568m 26.6℃ 71.8% 1007.7hPa 曇
1.5枚65℃
ナラシ2枚65℃
best 8.6


なんとか動く形に。DIPスイッチとトグルスイッチはGPIO3_0-3_4に、7セグLED
はソースをGPIO4_0-4_7に、シンクをGPIO3_5-3_7に割りあてました。LPC2388で
はほとんど全てのGPIOポートでプルダウン、プルアップが指定できて、LEDをド
ライブできる電流を流せるので、驚くほど楽。コントローラボードに実装した
のはトグルスイッチのチャタ防止用のコンデンサと、LEDの電流調整用の抵抗
(330Ω)x8のみ。



ここに取り付けた。もう時間なくて基板剥き出し。とりあえず今回の仕様は DIPスイッチでログ#を指定して、トグルスイッチの立ち下がりでロガースター ト、立ちあがりでロガーストップとしました。ついでにサンプリング中は時速 を表示するようにしてみた。

メインマシンを4.99.72から4.99.15にしたのだけど、久々にひどいのをひいてしまったようだ。 apache-2.22.11は作り直しても(作り直すのにもopenssl-8.0向けに変更が必要だ)、SSLMutexがどうとか で立ちあがらないし、肝心なSubversionまで
svn status
svn: Error converting entry in directory '.' to UTF-8
svn: 有効な UTF-8 のデータ
(16 進数: 41 56 41 55 41 54 55 53 48)
の後に無効な UTF-8 文字列
(16 進数: 83 ec 60 48)
があります
...例によってwww/apache22でmake updateしたらいつのまにかX-serverまでdelete されてて、完全に不能状態。
SA5からでも開発できるようにしておいてよかった。


今日は筑波に行こうと思っていたのだけど、起きてみたら体力0。諦めました。
この衰えはなんだ。3戦終わったら走る(足で)かな。

DISK UNION新宿店で購入。これはアマゾンに登録がなかった。中国版。ライナー ノーツがきっちり入っていて、歌詞も全部中国語訳してある。中国語訳だとと んでもない歌詞も格調高い漢詩のように見えてしまう。

とても興味深い。NWOBM(New Wave Of British Metal)は英国重金属新波浪か。 Bay Area Thrashは湾区激流金属か。死亡金属、暗黒金属はそのままだね。

ロガー用のI/Oユニット作りはじめてます。間にあうのか? これをどこにつける のか? そして俺の体力は回復するのか。




CR85塔載のP-LAP3でテスト。LPC2388基盤はテスト用のもの。なんとかOK? とい
うところでロガーの方に実装。無線LAN環境も整えたのでそこそこ快適です。が、
11gだからかち合うんだよね。時により。このノート、SA5内蔵無線LANは11bgだ
し、NetBSDもまだ11nには対応してないから仕方がない。



ロガー基盤に実装してSDカードにデータを取り込もうとすると、P-LAPをつない だポートからノイズの割り込みが入る。ノイズが入るのが、リセット直後のSD カードの初期化と、SDカードの書き込み時。
この0.01uFのコンデンサを入れないと、SDカードの配線からノイズを拾ってし まいました。あと10kΩは大き過ぎたかな。.36mAしか流れないからな...。
このロガー、メンテナンス性が悪く、上の基盤を外すだけでもマザーボードか ら外して(この際に一個前面のスイッチを外さないといけない)、そしてSDカー ドボードを外して...と大変。SDカードの配線を直結したのも失敗で、プラプラ するのでたまに配線が切れてしまう。ここはコネクタにすべきだった。
LPC2388はの32bitタイマが4本のうち一つをロガーの基準時間として1msec ごと のカウントアップで電源ONから動かしている。32bitあるので0xffffffffまで 49日もある。のでラウンドアップの処理はいらない。0x0fffffffまででも3日な ので、上位4ビットを割り込み要因(今のところスピードメータのセンサと P-LAPのセンサの二つ)に割りあてることにしました。0x00ffffffとしても4時間 はもつ。やっぱり32bitは余裕があっていい。




タイヤ交換しました。週末の天候はまた微妙な感じなってきたけれど...。GR
DIGITALの修理はもしかすると盆明けになるようだ。昨日からまたEOS Kiss
Digital N。

ロガー計画。次はP-LAPの信号をとりこみたい。これはTカーのRS125についてい るP-LAP(初代)。本当はP-LAP2だったのだけど、ノイズがのると、修理に出し、 ノイズ対策品が返ってきて、まだノイズがのると、また修理に出し、3回目くら いに返ってきたのがこの初代P-LAP。自分でロガーを作ってみてわかったけれど、 EGVプラグのノイズはひどい。無理を言ったもんだ。
わかりにくい写真だけど、黒がGND、茶が5V、青が信号線で、アクティブロー。 3.6V。白はNC?よくわからない。

P-LAPの本体に接続したまま、分岐する形でLPC2388のGNDと黒をつないで、青を 10kΩでP0_21に接続しました。入力電圧の最大は5.5Vなので電圧は気にしなく ていい。
インターフェース2009/5月号の41pのCN3の表は まちがえていて、A19とB19が反対。
void
data_init2 ()
{
  // Setup GPIO senser connected.
#define	PLAP_PIN	21
  // GPIO setting.
  mcu_pin_select2 (0, PLAP_PIN, PIN_FUNC0);	// GPIO
  mcu_pin_mode (0, PLAP_PIN, PIN_HIZ);

  *FIO0DIR &= ~(1 << PLAP_PIN);	// Input

  *VICIntSelect &= ~VIC_EINT3;	// IRQ
  *VICIntEnable |= VIC_EINT3;

  // Falling edge
  *IO0IntEnR &= (1 << PLAP_PIN);
  *IO0IntEnF |= (1 << PLAP_PIN);
}

これでP-LAPのセンサに磁石を近づけて、P-LAPも動き、EINT3に割込みが入ると ころまで確認。



久々にハイエースを洗車。水洗いだけ。汚れが沈着してしまったところもあ
り...。とにかく暑い。

内側のOリング溝を1.61〜1.65mmにした後の初走行でもあったのだけど、これ は... 素晴しい。今迄でもちょっと溝深さが足りなかったようだ。完全にチビ りがない。
外側は1.4-1.5mmくらい。これももっと溝深くした方がいいかも。ヘッドの締め 込みでゴムを押す感があるんだよね。

と整備しつつ、ふとRSSフィードを見ると、TSR転倒? HARCも転倒? 8耐にはほと んど興味がなく、結果を見るだけなのだけど、ちょっと気になった。なんとト リックスターが3位? 2位? おおおおお武さん!!。89年にHSPでレースを初めた 俺にとっては武さんは神的存在。こうなると応援する心を押さえきれない。
ピストンはめては、実況ch。おお!? おお...
シリンダはめては、実況ch。おおおおお(豪雨)
ヘッド締めては、実況ch。ぬーー。
チャンバー装着しては実況ch。!!
...
2位入賞おめでとうございます!!

と、作業が進まず。タイヤ交換までするつもりが、腰上整備だけで終わってし まった。



筑波行ってきました。予想以上に晴れてこれとない絶好のコンディションで走
れました。ロガーのデータもこの通り二本ともばっちりとれました(よかった。
ほっとした)。走行後、恐る恐るUSBケーブルを継いでみて、tip umon230400(ぽ
こ)(ぽこ)でuser>のプロンプトが返ってきた時はうれしかった。ここでlogger
stopコマンドでinodeに最終セクタとトータルサイズを書きこんで終了です。そ
して、SDカードをノートPCに移して、

$ mount -o nodev,nosuid /dev/ld0a /mnt
$ ls -al /mnt
total 419
drwxr-xr-x   2 root  staff      64 Jul 16 10:41 .
drwxr-xr-x  25 root  wheel     512 Jul  5 11:39 ..
-rw-r--r--   1 root  wheel  100352 Jan  1  1970 log0.dat
-rw-r--r--   1 root  wheel  112128 Jan  1  1970 log1.dat
$ 
よし! はやく、もつ定を食べたい気持ちと、データを確認したい気持ちで、食堂に ノート持っていって待ち時間にデータ処理してgnuplotで確認しました。
これは一本目。ベストは8.9まで。

これは二本目。ベストは9.1まで。

これは一本目の最後あたり。
plot [20:25] [50:170] "log0" w l
1ヘアの方が遅いんだ(全体的に同じ傾向)。下り線をよくみるとブレー キング終了とアクセルオフで廻ってるところで斜度が違うのがわかる。1ヘアも 2ヘアもブレーキングは80km/hあたりで終わっているのだけど、明かにアクセル オフの時間が1ヘアは長い。これはわかってるんだよね。1ヘアの立ちあがりは なんかいつまでもハンドルにしがみついてて立ちあがれない。
意外なのがダンロップ進入と、最終コーナーの一番スピードの落ちたあたりが 同じ。両方ともバンクした状態なので大体同じだろう。そんなにゆっくり最終 まわってるのか。いやそれはわかっていたことだが...。
E/G的には俺E/Gのベスト165km/hまで出てるからベストだ。本当に速いマシンに はかなわないけれど、十分もっとタイムは出るレベルだ。

新しい試みとして、着替えのTシャツとパンツを保冷箱の中で冷やしておいてみ た。着たらヒンヤリ〜と期待していたのだけど、着替え中にヒンヤリ感が多少 感じれる程度で、企画倒れでした。

これから出走という時にマシン立ちあげて、tipで接続して、スタートコマンド を叩くというのは、かなり嫌です。同じく、朦朧として返ってきて同じように ストップコマンドを打つのもとてもつらい。ここはI/Oユニットを作っておきた い。

8:50 646m 27.5℃ 79.0% 1004.4hPa 曇/晴
13巻 6/9
16周(20分) best 8.9
4l残1.8l
1.5枚65℃

10:55 765m 30.8℃ 67.2% 1003.8hPa 曇/晴
14巻 6/9
18周(25分) best 9.1
一本目はずっと絡めて楽しかった。もうちょっとタイムが出ればなぁ。二本目 は黙々とソロ。最後3,4周、体調的にもうやばいのはわかってたのだけど、がん ばってチェッカーまで。

二本目最後ふんばったのが結構きつくて、その後下痢ってしまう。帰る準備す るのもしんどい。D'sで買物して、車を運転するとポワーンとしている。ちょっ とこれはやばいかもということで、ホームジョイ本田で資材を購入ついでにア リナミンV&Vを二本一気飲み。そろそろ体を鍛えないと老いる一方かも。

いい天気だ。

C2の眺めはいつも最高だ。この撮影を最後にGR DIGITALが壊れた。ショック。



明日こそ走れるだろうな...。ロガー計画も先に進みたいし。この一週間でマイ
OSのブラッシュアップも完了。色々迷うとこもあり(どこまでシステマティック
にしておくべきかとか、作ったはいいけどあまり使わなかったのをどこまで削
るかとか(あまり削れなかった))結構時間がかかった。





        



Webikeで買ったNHKのストローク90mmのステアリングダンパーを取り付けました。
CR85は前回の筑波が雨で流れて以来ハイエースの中のでしこしこと車内で。



これ、21年前に壊したステダン。素材としてなにか使えるかも...と延々とストックしてあるのだけど、未だその機会なし。とりあえずピロボールの部分だけプレスで抜いておきました。これは使えそう。後は捨てるかな。
とはいえ、このシャフトの部分、使える時には使えそうじゃない? となかなか 捨てる気になれず...




日食、曇空。残念ね...と、この雨で割れが入ってしまったこれまた残念なトマ
トを収穫していると、おおお! 雲越しに肉眼で見えた。これはGR DIGITALに溶
接面のシールドをとりはずしてレンズ面につけて撮影。



どんどん曇が晴れてきた。

ストックの一番濃いシールドをつけて撮影。ブレブレです。

これは、自動遮光シールドの溶接面から。これは見るのに便利だった。

その後、あたふたあたふたしたものの、うまく撮れなかった。よしこのくらいか! とシャッタースピード決めてもその間に雲に入ってしまったりでなかなか難しい。



思ったより興奮してしまった。下手に撮影なんかしてるよりじっくり見た方が いいのでは? と葛藤したり。

割れてしまったので収穫したトマト。この時期にまた雨続きだと辛いな。




今日の収穫。これはプレーンなトマトソーススパゲティにしてみました。



朝から晩まで、木工部屋を猛掃除。塗装部屋にもしたい時、どうするべきか考 えたところ、塗装する時こまるのは木工粉塵。そして塗装の時にミストで木工 機械が汚れるのも困る。
部屋の掃除がしやすいように床面全部だす。木工機械は押し入れに全部収納で きるようにする。
工作部屋に木材を置いておくと、掃除の邪魔だし、粉塵の巣窟となってしまうの でだめ。
そんなところかな。あと、部屋を負圧にするためにシロッコファンが欲しい。 扉を閉めていても、どうしても粉塵がまわりの部屋に浮遊していってしまう。

まずは整理棚を用意するか。



ここにきてスイカが元気がいい。とはいえまだ一個も実がなっていないのだけ
ど。これはユリにつかまって上に伸びだした。



雄花ばっかりたくさん咲く。これは珍しい雌花。大体枯れてしまう。

毎日トマトの収穫。植え過ぎたこともあり、今現在、下から3,4個目の花が咲い たところで摘心しました。

さて、机の続き。筑波&MCAFJ2戦の前に、レース後に作りはじめれるようにと荒 木取りしたまま、もうすでに3戦が近付いてしまった。ちょっと進めます。

前回と同じように、手押しカンナの幅(156mm)に合うように耳を切り落として (ここまでやってからシーズニングにしておけばよかった)、手押しカンナで基準面だして、自動カンナで30mm厚にまで。
はぎ面はルーターできっちり直角を。このルータービット、鉄工用のエンドミ ルで代用していたのだけど、うっかり冷却忘れて焼きなましてしまった。
フライスとルーターじゃ回転数がオーダーで違うし、金工と違って切子が切削 熱をもっていってくれないから気をつけないといけなかった。

虹が出ていた。

ビスケットジョイントは前回、表裏両面からジョインターを合てて溝を開けた。今回は片側からのオフセットだけで。多少、前回よりも目違いが減ったかな。

今回は5枚張り合わせ。ボンド塗りはかなり忙しい。組み時にクランプを締め過 ぎて思いっきり反ってしまい焦った。これはクランプで圧着するよりは、ちょっ と締めて、ラバーハンマーで叩いて押しこみ。またちょっと締めて叩いて押し こみを繰り返した方がいい感じ。一気に張り合わせるのは5枚が限界かな。
木裏、木表の順にはしたのだけど、成長方向を合わせるのを忘れた。
最後で失敗続き。

トムラウシ山、22,3年前、親父と一緒に登ったことがある。ルートはトムラウ シ温泉から旭岳温泉までの縦走だ。山自体の面白味という分では北アルプスに はかなわないのだけど(全体的にモペーッとしている)、言葉にするとチープだ けれど、雄大さ、誰もいなさ。俺はいたく感動した。東京から鉄路で向い(まだ 青函連絡船があった頃だ)、函館についた頃から異国情緒に驚き、札幌駅の趣が たまらなく良かった(数年後高架になってただの地方駅になってしまった)。
その後大学を北大にしたのもこの時の記憶が大きい。そういう意味では俺の人 生を運命づけた山かもしれない。夏山に登ったのも、思えばこれが最後か。
ふと思い出した。


Product Advertising API(旧:Amazon アソシエイト Web サービス)の署名認
証開始が、あと一ヶ月とせまってきたので、とても重い腰をあげて、本棚シス
テムを変更しました。perlを思い出すのが億劫で放置していたのだけど、そろ
そろ。

なんか小粋なスクリプト言語を一個くらい自由自在に使えるようにしたいと思 うのだけど...。と思い続けて10年以上。
結局一日かかった。うっかりTimestampを二重にURLエンコードしていて大ハマり。
package uch_aws;

use strict;
use Data::Dumper;
use Jcode;
use WebService::Simple;

use POSIX qw (strftime);
use Digest::SHA qw (hmac_sha256_base64);
use URI::Escape;

my $AMAZON_HOST = 'ecs.amazonaws.jp';
#my $AMAZON_HOST = 'webservices.amazon.com';
my $AMAZON_DIR = '/onca/xml';

our @media_type =
    (
     { media => 'book',	id => 'ISBN',	index => 'Books' },
     { media => 'cd',	id => 'EAN',	index => 'Music' },
     { media => 'dvd',	id => 'EAN',	index => 'DVD' },
     { media => 'misc',	id => 'UPC',	index => 'Blended' },
    );

# These parameters are not changed.
our %aws_base_params =
    (
     Service        => 'AWSECommerceService',
     locale         => 'jp',
     ContentType    => 'text/xml',
     Version        => '2009-03-31',
    );

sub new
{
    my $class = shift;
    my $self =
    {
	public_key => shift,  # AWS Access Key ID
	private_key => shift, # AWS Secret Access key.
	associate_tag => shift,  # Associate ID (optional)
	aws => '',
    };
    $aws_base_params{'AssociateTag'} = $self->{associate_tag};
    $aws_base_params{'AWSAccessKeyId'} = $self->{public_key};

    $self->{aws} = WebService::Simple->new (
	base_url => 'http://' . $AMAZON_HOST . $AMAZON_DIR);

    return bless $self, $class;
}

sub aws_request
{
    my $self = shift;
    my %args = %{ shift @_ };
    my $key;
    my %timestamp =
	(
	 Timestamp => strftime("%Y-%m-%dT%TZ", gmtime())
	);
# Concatinate all parameters.
    my %all = (%args , %aws_base_params, %timestamp);
#    foreach $key (sort keys %all) {
#	print $key, '=', $all{$key}, "\n";
#    }

# Sort by key and URL-encode. (Cannonicalized)
    my $parameter = join '&', map { $_ . '=' . uri_escape ($all{$_}) }
    sort keys %all;
# Add GET method for signature.
    my $signature_text = join "\n", 'GET', $AMAZON_HOST, $AMAZON_DIR,
    $parameter;
# Signature.
    my $signature = hmac_sha256_base64 ($signature_text, $self->{private_key});
    $signature .= '=' while length ($signature) % 4;
# Prepare actual request. signature is URL-encoded.
    my $request = sprintf ("http://%s%s?%s&Signature=%s", $AMAZON_HOST,
			   $AMAZON_DIR, $parameter, uri_escape ($signature));
#    printf ("<%s>\n", $request);
# Access to AMAZON.
    my $response =  $self->{aws}->get_simple ($request);
#    print Dumper $response->parse_response;

    return $response;
}

sub item_info
{
    my ($self, $code, $title, $content) = @_;
    my $asin;
    my $media;
# Get ASIN from ISBN, EAN, UPC
    foreach my $type (@media_type) {
	$media = $type->{media};
	$asin = $self->code_to_asin ($code, $type);

	if (defined ($asin)) {
	    last;
	}
    }

    if (!defined ($asin)) {
	print STDERR "no ASIN for ", $code, "\n";
	return '';
    }

# Get Item information.
    my $item_query = $self->aws_request (
	{
	    Operation		=> 'ItemLookup',
	    ItemId		=> $asin,
	    ResponseGroup	=> 'Small,Images',
	}
	);
#print Dumper $item_query->parse_response;
    my $item = $item_query->parse_response->{Items}->{Item};
    if (!defined ($item)) {
	print STDERR "ASIN exists (", $asin, "), but no information\n";
	print STDERR $item_query->parse_response->{Items}->{Request}->
	{Errors}->{Error}->{Code}, "\n";
	return '';
    }

# Construct html tag.
    $$title .= sprintf ("%s ", $item->{ItemAttributes}->{Title});
    my $author = $item->{ItemAttributes}->{Author};
    if (ref ($author) eq 'ARRAY') {
	for (my $i = 0; $author->[$i]; $i++) {
	    $$title .= sprintf ("%s ", $author->[$i]);
	}
    } else {
	$$title .= sprintf ("%s ", $author);
    }

    my $creator = $item->{ItemAttributes}->{Creator};
    if (defined ($creator)) {
	if (ref ($creator) eq 'ARRAY') {
	    for (my $i = 0; (my $c = $creator->[$i]); $i++) {
		$$title .= sprintf ("%s ", $c->{content});
	    }
	} else {
	    $$title .= sprintf ("%s ", $creator->{content});
	}
    }

    my $image;
    if (defined (($image = $item->{SmallImage}->{URL}))) {
	$$content .= sprintf ("<a href=\"%s\"><img src=\"%s\"></a>\n",
			      $item->{DetailPageURL},
			      $image);
    } else {
	$$content .= sprintf ("<a href=\"%s\">%s</a>\n",
			      $item->{DetailPageURL},
			      $$title);
    }

    return $media;
}

sub code_to_asin
{
    my ($self, $code, $type) = @_;

    my $id = $type->{id};
    my $index = $type->{index};
    my $asin_query;

    if ($id eq 'UPC') {
	$asin_query = $self->aws_request (
	    {
		Operation	=> 'ItemSearch',
		'ItemSearch.Shared.Keywords' => $code,
		IdType		=> $id,
		SearchIndex	=> $index,
		ResponseGroup	=> 'Small',
	    }
	    );
    } else {
	$asin_query = $self->aws_request (
	    {
		Operation	=> 'ItemLookup',
		ItemId		=> $code,
		IdType		=> $id,
		SearchIndex	=> $index,
		ResponseGroup	=> 'Small',
	    });
    }

    return $asin_query->parse_response->{Items}->{Item}->{ASIN};
}
1;

こんな感じで使います。

#!/usr/pkg/bin/perl

BEGIN
{
    my $MT_DIR = '/home/uch/public_html/sn/';
    my $WEBTOOLS_DIR = '/home/uch/webtools/';
    push @INC, $MT_DIR . 'extlib';
    push @INC, $MT_DIR . 'lib';
    push @INC, $WEBTOOLS_DIR . 'lib';
    push @INC, $WEBTOOLS_DIR;
}

#6, DVD
#5, CD
#4, 本
#3, 本棚
#2, モブログ
#1, 日記

use strict;
use uch_mtrpc;
use uch_aws;

$uch_mtrpc::mt = new uch_mtrpc 'http://www.vnop.net/~uch/sn/mt-xmlrpc.cgi ', 'uch', 'MovabletypeのXMLRPC用のパスワード', 1;
$uch_aws::aws = new uch_aws '01XB2AJX6DH0D8W91S02', 'AWSのプライベートキー',
'uchamazon-22';

my $barcode;
my $title;
my $content;
my $category;
%::category_map = (
    misc	=> 3,
    book	=> 4,
    cd		=> 5,
    dvd		=> 6,
    );

while (<STDIN>) {
    $barcode = $barcode.$_;
}

if ((my $media = $uch_aws::aws->item_info ($barcode, \$title, \$content, \$category))) {
    print $barcode;
#    print $media;
#    print $::category_map{$media};
    my $post_id = $uch_mtrpc::mt->post
	($title, $content, $::category_map{$media}, 1);
}

exit;


5時に起きてみるとザーザー降り。失意のうちに筑波は断念。こんなことなら
FRP補修は週末にゆっくりやりたかった。

富士のライセンスを更新。督促状が来ていた軽自動車税も納付。自動車税も忘 れていた。これは督促待ちにしておくか。


トマト食べてみました。みっちりとした味わいがいい。食べるのはあっという間。



美味しんぼらーとしてはトマトといえば7巻の題名ともなった「大地の赤」。こ れを食べたくてやってきたわけだけど、これは満足だ。
トウモロコシは失敗したが...一番最初に食べた時点で全部食べてしまえばよかっ た。トウモロコシの場合は、本当においしいトウキビを知っているので評価が 厳しいというのもあり。

ロガーは電池を新しいのに交換しました。プログラムの内容はバグフィックス 以外は前回と同じ。先に進めたい気持ちを抑えてコードのクリーンナップだけ。 まずここで基盤部分の確認をしておきたい。

FRP補修したカウルの端をサンダで削って、スクリーンつけて、整備終了。昨日 まで晴れ時々曇だったのが、今、天気予報見たら9時:弱雨...。うわ〜。S1,S2 狙って雨か。今になって。


トマト、今日はここまで赤くなった。今日はがまんしてもうちょっと待ってみることに。



受粉が不完全だといくら待ってもだめ。食べてみると旬を過ぎてちょっと固く なっていた。実入りがどうだろうとヒゲが茶色くなったら収穫だね。

筑波2戦で破損したカウル、ペペッとガムテープはって、FRP50gでパパッとクロ ス貼りました。ひどい出来だ。

裏からハケで塗りこんでるうちにガムテープが浮いてしまって、とんでもないことに。こうなってしまうとリカバリもつらい。ショックだ。
1セット、カウル買うかな。

腰上も組んで軽く火入れまで。ゼッケンも筑波選手権用に23に張替え。

筑波2戦の転倒でステアリングダンパーが完全にエア噛みして動きが悪くなって しまっていた。とりあえず注文は出しておいたけれど、TカーのRS125から、 ちょっとエア噛みしているダンパーをもってきた。


菜園状況。かなり赤くなってきた。これは明日かな。



トウモロコシは失敗でした。雄花と雌花の咲くタイミングが離れ過ぎで、雌花 が咲いたころには雄花は花粉が落ちてしまった頃で、受粉がうまくいかなかっ た感じがする。早い時期の雌花だけはなんとか実入りがよかった。
来年は定植の時期をちょっとづつずらしてみようか。



サーバ機のSubversionが古いので、ちょっとアップデートしようとなんとなく make updateしたら、perlが5.8から5.10に。アップデート祭りに。Movabletypeが 多少不安だったけれど、なんとか大丈夫?



今日はここまで赤くなりました。熟しはじめると結構早い。食べるのは明日か
明後日か。



シリンダを切削治具に載せて芯出し。スタッドボルトを抜かずにやるためにテ コ式のダイヤルゲージが重宝。今日はいきなりスパっと芯出しが決まった。

これはスタッドボルトをよけるためにギリギリまで削りこんだ、手廻し専用Oリ ング溝切削バイト。
溝より細く作って左右に拡げながら作業するといい。溝幅そのままだとビビり まくるので。

溝深さ1.5mmだったところを1.6mmちょっとまで。

Oリングはφ2.0なので、0.4mm弱のとびだし。ここまで低いのは初めてなんだよ な...。ちょっと緊張。




菜園状況。一番成長頭のトマトが色づいてきた。これは朝撮ったのだけど、夕
方にはちょっとオレンジっぽく。早く食べたい。トマトは思いの他、順調でポッ
ト上げしてから脱落したのは一株のみ。なので27株も庭に植えることになって
しまい、至るところトマトが植わっています。

わき芽がもりもり出るので毎日チェックしています。最初のわき芽はまったく 気付かずに、よーく見てみたらびっくりするほどわき芽が育っていた。
そのわき芽をかいたのを差しておいたら、それもグングン育っていて+4株。
スイカはまったく実がなっていません。咲くのは雄花ばかり。たまに雌花が あるのだけど、すぐ枯れてしまう。

スプロケットカラーのベアリングにちょっとゴリゴリ感があるので交換。これ で6904も最後なのでMonotaROに発注。ついでにホットガン(そろそろ買ってもい い頃だ。)とM8のスパイラルタップを。
いらなくなったベアリングをバラしたのやフォークの部品、ギヤシャフトでい つもなんとなく作業。それぞれの作業向けに溶接しておきたいとも思うのだけ ど...。いつもベアリングバラし箱がガサガサ探りながら、受けはこれを重ね て...押しはこれにこれを...と。毎回やってる。

そして今日はフロントまわりを洗浄。筑波2戦の雨で汚れきってたからね。フォー クオイルも交換。真っ黒。例によって左側はちょい金属粉。全バラして組み直 してこれならもう終りかもね...。

ちょっと内側のOリング溝が浅いか。次までにちょっと掘ります。他は特に問題なし。

ロガー用のバッテリー、秋葉原のスーパーラジコンで、3.7V直列の7.4Vのリポ を買ってきました。800mA。これにします。青い端子は直列の真中の端子で 3.7V。




小さいトウモロコシの中を見てみた。こういう仕組みだったのか...。



今日はリア廻りを洗ってました。トルクロッドの位置を変更したので(前はキャ リパーサポート側だけ外側につけていたのだけど、それだとトルクロッドに押 されてローターとサポートが接触してしまうので、フレーム側も外側に変更。
そのあおりでP-LAPのセンサ位置も変更しました。




突貫工事で作ったロガーもなんとか対岸にタコ糸がついた安心感と疲労でボーッ
としてます。

ソフトの方はとりあえずなんとかで、とりあえずのコードのつぎはぎだらけになってしまったので、ここは前には進まず、コード整理を。
電動ポンプ仕様の時に使っていたバッテリーです。GS YUASAのNP2-12 12V 2.0Ah。

ふと20年前のライディングスポーツをひっぱりだしてきた。昨日、二本目の走 行、目の前で走っているのにちょっとドキドキしてしまった。
これは89年全日本選手権ロードレース第7戦 筑波大会 国際A級125 ジュニア 125、F3、250
異様に味わい深い。そう、和田欣也選手のウェブ日記はいつも楽しみに見てい ます。たまにぽつんとでてくるWGPの思い出がとてもいい。




BS走行会でした。二本目の走行、最初の5周ほどきちんとしたデータがとれまし
た。感動!縦軸はkm/h、横軸はminです。最終進入の最高速地点の間を計算して
みたのが上の数字。P-LAPだと1'13,1'12,1'10,1'10なのでそこそこあってる。

グラフはgnuplotで、文字入れはgimpです。

拡大すると。コースイン直後なのでなんとも言えないけれど、これは面白い。 この後、ロガーに塔載していた電池の接点が根本から折れてしまい、ここで終 了。

昨日、寝る前に酒飲みながらぼーっと自分のブログを眺めていたらとんでもな いバグに気付いた。bfs_datafile_openでこれから書き出すセクタを取得するの だけど、そのセクタが、SysVBFSパーティション先頭からのオフセットで、下駄 をはかせるのを忘れていたのだ。どうしようか迷っていたのだけど、パーティ ション構成からして、運用でカバーできそうなのでそのまま就寝。
天気予報では午後から雨だったのに、朝から雨。6時に筑波に着いた頃にはざー ざー振り。しかし7時には雨もあがり。空は快方なのでレインに交換して一本目 でクランクとクラッチとピストンのナラシをすることにしました。
Logger01にPCを接続してチェック。そしてE/Gをかけて見ると...音速を越えた。 600km/h。ノイズを思いっきり拾ってる。3.3Vでプルアップが10kΩだから 0.33mA。正直、これじゃきついかなとは思っていた。でもできればできるだけ 消費電力を落とせるところがみつかれば...という思いもあり。
これはこれでタコメータになるかな。とも思い、そのまま出走。
淡々とナラシ走行して一本目終了。
さっそくUSBケーブルをつなげてロガーをストップさせようとすると、ハングし てた。これはスレッドまわりのバグだね。
ハングしていようとも動いていたところまでは連続セクタで書き出されている のでデータは簡単にとれます。PCにSDカードを移してddで64MB全部バックアッ プ。

二本目は完全ドライ。朝からは信じられないほど晴れた。プラグをEGVからイリ ジウムにしてみる。ロガーにPCを継げてテストしてみるとこれはノイズが乗ら ない。かなり違う。
クランク交換してやっぱり上の伸びがいいかも。13500rpmまですっきり廻る。 その割りにまったくタイム出ず、一番気になるのは最終にいい感じで開けたま ま突っこめることだ。マシンが遅いと開けたまま入れるんだ。
CXの切り替えしは、ダンロップの立ちあがりでもうちょっと曲げこむようにし てみた。そうすると、切り替えした先でインにつけない。もっと早いうちに開 けて曲げておかないといけないのかな。こういう風にした方が思いっきり切り 替えしてもお釣りがないみたい。
タイムは結局出ず、9.4まで。8秒の声も聞こえないなんて...

体力が落ちていて、30分走りきれませんでした。20分過ぎで足がガクガク震えて きてしまい、疲労回復にピットインした。
走行後、さっそくデータを落とそうとすると、なんとロガーの電源が落ちてい て入らない。ノートPCもバッテリあがってるし。ちょっとショックでした。
一ヶ月ぶりに、もつ定を食べて(久々で最高に旨かった。)、ボーッとしてると 雨が降ってきた。ギリギリいいタイミングで走れた。さっさと積み込んで帰宅。
例によってホームジョイ本田、石下店で農業資材と木材を購入。

ロガーを開けてみると、端子の根本から折れてました...。これ結構高かったの に...。

データの取り出し。log1.imgはSDカードのフルイメージ64MB。今回間違えてBFSパーティションの9セクタ目を、最初からの9セクタ目から書いてしまったため、そこから採取。

 dd if=log1.img of=test.img bs=512 skip=9 count=512

このデータの処理。

#include <sys/types.h>
#include <assert.h>
#include <stdio.h>

int
main (int argc, char *argv[])
{
  FILE *f;
  size_t sz;
  uint32_t r, r0, r1;
  uint32_t t0;

  if (argc < 2)
    {
      fprintf (stderr, "specify filename\n");
      return 1;
    }

  f = fopen (argv[1], "r");
  assert (f);

  r0 = 0;
  r1 = 0;
// データは1msecごとにカウントするタイマの値を割込み毎にとっているだけなので
// まず最初のデータを読んで時間の基準にします。
  if ((sz = fread (&t0, 1, 4, f) == 0))
    {
      fprintf (stderr, "no data\n");
      return 1;
    }
  r0 = t0;
  while ((sz = fread (&r, 1, 4, f)) != 0)
    {
// 200km/hを越えると割込み間隔が34msec以下になるので、それ以下なら
// ノイズとしてスキップ。(イリジウムでも多少ノイズが入った。)
      if ((r1 = r - r0) < 34)
	continue;
      if (r1 != 0)
	printf ("%f %d\n", (r - t0)/1000./60., (188 * 36) / (r - r0));
      r0 = r;
    }

  return 0;
}

これで処理したデータをgnuplotで
gnuplot> plot 'aaa' using 1:2 w l
あるいは
gnuplot> plot 'aaa' using 1:2



Logger01を載せました。ついにここまで来た。なんとか間にあった。



後輪廻してデータがとれているのを確認して積み込み。あと、データの確認の ホスト側の簡単なプログラムも書いておきたかったのだけど、疲れた。もう無 理。一本目のプラグはいつも通りEGVにして二本目はイリジウムにしてデータと ろう。(EGVはレジスタなしなので思いっきりノイズが飛ぶのだ)



CR85クランク交換しました。この新品クランク。振れはいい。両端とも0.01mm
以内だ。しかし、このクランク、キー溝がゆる過ぎ。こんなクランクに今迄出
会ったことがない。クランク、キー共に品番確認して、それでも信じられず、
旧クランクからキーを叩き出してはめてみても、ゆるゆる。

とても気になる...。CR85でキーのトラブルには会ったことはないので、これで も大丈夫なのかな...と思いつつ組んだけれど...。最近のホンダの部品のバラ つきはひどい。

ついでにクラッチも、フリクション、プレート、スプリングを新品に。相変わ らず、クランクのオイルシールの入れ方がうまくいかない。うーん...とやり過 ぎると打ち込み過ぎて泣きながら引っこ抜くハメになるのも恐しく。
とりあえず組みはいつも通り。

ピストン廻りも全部新品にして、軽く火入れの確認まで。シーズン前にパーツ 買い込んだ時には「これで1シーズン分だな」と思っていたのだけど、壊し過ぎ。 もうなくなってしまった。

後はロガーのソフト。シェルからいつでもコマンドを受けとれて、SDカードの 書き出し中にもセンサからの割り込みをこぼさないというところで、シェル、 データ、ストレージの3スレッドにしました。
データサンプリングスレッドは割り込みから起こされて、データをバッファに 入れる。このバッファは512Bのダブルバッファにして、512B書きこんだらその バンクをSDカード書き込みスレッドが書き出す。という方針。
char logfile_name[32] = "logx.dat";

uint32_t
logger (int32_t argc, const char *argv[])
{
  struct bfs_fileattr attr;
  int err;

  memset (&attr, 0xff, sizeof attr);	/* Set VNOVAL all */

  if (argc < 2)
    {
      switch (log_status_flag)
	{
	default:
	  printf ("bogus state.\n");
	  assert (0);
	  break;
	case LOG_STATUS_IDLE:
	  printf ("idle.\n");
	  break;
	case LOG_STATUS_SAMPLING:
	  printf ("sampling.\n");
	  break;
	case LOG_STATUS_STOP:
	  printf ("stop process.\n");
	  break;
	}
      return 0;
    }

  if (strcmp (argv[1], "start") == 0)
    {
      if (argc < 3)
	{
	  printf ("specify log #\n");
	  return 0;
	}
      logfile_name[3] = '0' + atoi (argv[2]);
      printf ("LOG START %s\n", logfile_name);
//ロガーのスタート。SysVBFSのファイルは連続セクタなので、これはinodeを
//設定してデータのスタートセクタをとってくる。
//そのセクタから順々に書き込みをして、終了時に、最終セクタの情報を
//inodeに書き戻せばいい。ファイルを開くのは一つだけなので。
      if ((err = bfs_datafile_open (b, logfile_name, &attr, &logfile)) != 0)
	{
	  printf ("can't open log file. %d\n", err);
	  assert (0);
	}
      log_status_flag = LOG_STATUS_SAMPLING;

      return 0;
    }

  if (strcmp (argv[1], "stop") == 0)
    {
      printf ("LOG STOP\n");
      log_status_flag = LOG_STATUS_STOP;
//ストップする時はデータスレッドはセンサからの割り込み待ちかもしれないので
//キック。
      thread_wakeup (data_th);
      return 0;
    }

  return 0;
}

//512byteのダブルバッファ。片方がSDカードへの書き込みに使われ、もう片方は
//割り込みからのデータの保存に使われる。
uint8_t scratch[2][512] __attribute__((aligned (4)));

thread_t data_th;
int data_bank = 0;

//割り込みルーチンとデータスレッドとの間の受渡し用。割り込みハンドラから
//wakeupされて処理がはじまる前に割り込みが入った時にデータを落とさないように
//リングバッファ。
#define	INTR_RBUF_SIZE	64
STATIC uint8_t __buf_intr[RBUF_NOLOCK_SIZE (INTR_RBUF_SIZE)];
STATIC rbuf_nolock_t buf_intr;

void
data_thread (uint32_t arg __attribute__((unused)))
{
  uint8_t buf[INTR_RBUF_SIZE];
  uint8_t *p, *q;
  size_t sz;
  size_t cnt;

  data_th = current_thread;

//センサがつながるGPIOを設定
  data_init ();

//ロガーが使うタイマを設定。今のところ1msecごとにカウントアップするフリー
//タイマー
  // Logger timer. Free count. 1msec.
  timer_config (TIMER3, TIMER_COUNTER_RESET, TIMER_MSEC);
  timer_start_nointr (TIMER3);
  buf_intr = rbuf_nolock_init (__buf_intr, INTR_RBUF_SIZE);

  intr_enable ();

  p = scratch[data_bank];
  cnt = 0;
  while (/*CONSTCOND*/1)
    {
      status_t s;
      size_t i;

      thread_sleep (current_thread);
//ロガーの終了要求が来たら吐き出しスレッドをキック。
      if (log_status_flag == LOG_STATUS_STOP)
	{
	  // Flush
	  printf ("flush.\n");
	  data_bank ^= 1;
	  thread_wakeup (storage_th);
	}
      else if (log_status_flag == LOG_STATUS_IDLE)
	{
//センサから起こされたけれど、まだロガーはスタートしてません。
	  printf ("idle.\n");
	  continue;
	}

//割り込みハンドラからのデータをコピーします。
      s = intr_suspend ();
      sz = rbuf_nolock_read (buf_intr, buf, INTR_RBUF_SIZE);
      intr_resume (s);

//コピーしたデータをさらに吐き出しスレッド用にコピーします。
//このコピーは減らしたいけれど、今回は富豪的に。
      for (i = 0, q = buf; i < sz; i++)
	{
	  *p++ = *q++;
//1セクタ(512byte)分バッファがたまったら、そのバッファを吐き出すように
//キックしてバンクを切り替えます。
	  if (++cnt == 512)
	    {
	      data_bank ^= 1;
	      p = scratch[data_bank];
	      cnt = 0;
	      assert (!write_busy);
	      // Kick storage thread.
	      thread_wakeup (storage_th);
	    }
	}
    }
  // NOTREACHED
}

void
data_init ()
{
  // Setup GPIO senser connected.

  // GPIO setting.
  mcu_pin_select2 (0, 28, PIN_FUNC0);	// GPIO
  // P0_28 is shared with I2C. can't use internal pullup.

  *FIO0DIR &= ~(1 << 28);	// Input

  *VICIntSelect &= ~VIC_EINT3;	// IRQ
  *VICIntEnable |= VIC_EINT3;

  *IO0IntEnR &= (1 << 28);
  *IO0IntEnF |= (1 << 28);
}

void
eint3_intr ()
{
  uint32_t r;

  r = *T3TC;
  //  iprintf ("%x\n", r);
  if (log_status_flag == LOG_STATUS_SAMPLING)
    {
      rbuf_nolock_write (buf_intr, (uint8_t *)&r, sizeof (uint32_t));
// この割り込みから起床する間にまたこの割込みが入ることもあるので、
// 既に起床されていたら起床カウントを上げません。
// これはちょっとモヤモヤする問題。
      thread_wakeup_once (data_th);
    }

  *IO0IntClr = (1 << 28);
}


これは吐き出しスレッド。

void
storage_thread (uint32_t arg __attribute__((unused)))
{
  int err;
  intr_enable ();

// BFSを初期化します。
  b = app_bfs_init (scratch[0]);
  assert (b);

//これはシェルスレッドとの待ち合わせ。
  storage_thread_flag = 1;
  thread_wakeup (shell_th);

  while (/*CONSTCOND*/1)
    {
      thread_sleep (current_thread);
//起こされた時には書き出すバッファが512B用意されているので書き出し。
//SysVBFSは連続セクタなので単に次セクタに書きこんでいくだけ。
      write_busy = 1;
      printf ("write start\n");
      if ((err = bfs_datafile_write (&logfile, scratch[data_bank ^ 1])) != 0)
	{
	  printf ("can't write log file. %d\n", err);
	}
      write_busy = 0;
      printf ("write end\n");
//ロガーの終了要求が来たら、ファイルを閉じます。これは該当ファイルのinodeの
//end_sectorとeof_offset_byteを設定するだけ。
      if (log_status_flag == LOG_STATUS_STOP)
	{
	  if ((err = bfs_datafile_close (&logfile)) != 0)
	    {
	      printf ("can't close log file. %d\n", err);
	    }
	  log_status_flag = LOG_STATUS_IDLE;
	  printf ("file closed\n");
	}
    }
  // NOTREACHED
}


ROM data: 0x3250-0x32b8
RAM data: 0x4000f800-0x4000f868 104byte
bss: 0x4000f868-0x4000f938 208byte
current stack=0x4000fff8
Clock: IRC, PLL NOT connected, PLL MSEL:0 NSEL:0, CCLKCFG 0
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
sysclock:288000000Hz cpuclock:72000000Hz
PCLK0: 0, PCLK1: 0 PCONP: 4280ffe
calibrated. delay_parm=11
bss RAM check passed.
Checking RAM 40000000-4000f800
LPC2388 Simple Monitor Build Jul  4 2009 14:54:24
mon> l
Send S-record file.
~>Local file name? a.mot
5310 lines transferred in 5 seconds 
!
Read 124732 byte. success
Start address: 0x40004054
stack_start: 0x4000f800
RAM data: 0x4000a02c-0x4000a78c 1888byte
bss: 0x4000a78c-0x4000db6c 13280byte
current stack=0x4000f7f8
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
Clock: MAIN, PLL connected, PLL MSEL:11 NSEL:0, CCLKCFG 3
sysclock:288000000Hz cpuclock:72000000Hz
PCLK0: 0, PCLK1: 0 PCONP: 4280ffe
calibrated. delay_parm=74
bss RAM check passed.
md_thread_create: [2]:uart recv pc=400015a4 sp=4000d60c stack=1024byte
thread_start: [2]
md_thread_create: [3]:uart send pc=40001540 sp=4000d144 stack=1024byte
thread_start: [3]
md_thread_create: [4]:storage pc=40005820 sp=4000ccd0 stack=2048byte
thread_start: [4]
md_thread_create: [5]:data pc=40005c58 sp=4000c460 stack=1024byte
thread_start: [5]
port 0 pin 19 func 2 => r=e002c004 shift=6
port 0 pin 19 func 2 => r=e002c044 shift=6
port 0 pin 20 func 2 => r=e002c004 shift=8
port 0 pin 20 func 2 => r=e002c044 shift=8
port 0 pin 21 func 2 => r=e002c004 shift=10
port 0 pin 21 func 2 => r=e002c044 shift=10
port 0 pin 22 func 2 => r=e002c004 shift=12
port 0 pin 22 func 2 => r=e002c044 shift=12
Pport 0 pin 28 func 0 => r=e002c004 shift=24
WR 14e80ffe CLK 3005000 PIN 2a80
SD card
RCA=9a970520
[0] DOS 3.0+ 16-bit FAT <32M [63 33264]
[1] NetBSD [33327 90657]
[2] unused [0 0]
[3] unused [0 0]
SysVBFS sector = 6 size = 65536
bfs super block + inode area = 1024byte
inode: 3/8
root inode: 2-2
bfs dirent area = 512byte
dirent: 4/32
super block 512byte, inode 64byte, dirent 16byte
magic=1badface
data_start_byte=0x400
data_end_byte=0x1ffffff
from=ffffffff
to=ffffffff
from_backup=ffffffff
to_backup=ffffffff
fsname=
volume=
[inode index list](max 8)
2  96 2 2 (0) 2 493 210 20 2 4a4ac235 4a4ac235 4a4ac235
3  1515 3 5 (1) 1 420 210 20 1 4a4ac236 4a4ac236 4a4ac236
4  1515 6 8 (2) 1 420 0 0 1 0 0 0
total 3 i-node.
[dirent index list]
32 file entries.
.: sector:58448 + 2 -> 2 96byte. inode=2
..: sector:58448 + 2 -> 2 96byte. inode=2
a.txt: sector:58448 + 3 -> 5 1515byte. inode=3
b.txt: sector:58448 + 6 -> 8 1515byte. inode=4
4 files.
user> 
user> logger
idle.
user> logger
idle.
user> logger start
specify log #
user> logger start 4
LOG START log4.dat
bfs_datafile_open: start 9 end 9
user> a672
a672
a672
a8d8
a943
aa11
aa5a
aae7
ab28
ab83
abb6
logger 
user> logger
sampling.
user> d133
d1e5
d1e5
d395
d3da
d3da
d3db
d3db
d3db
d3db
d4f0
d4f0
d51c
d51c
logger stop
LOG STOP
uflush.
write start
bfs_datafile_write: sector 9
write end
bfs_datafile_close: start 9 end 9
file closed
ser> read 9
72 a6 0 0 72 a6 0 0 72 a6 0 0 d8 a8 0 0 
43 a9 0 0 11 aa 0 0 5a aa 0 0 e7 aa 0 0 
28 ab 0 0 83 ab 0 0 b6 ab 0 0 33 d1 0 0 
e5 d1 0 0 e5 d1 0 0 95 d3 0 0 da d3 0 0 
da d3 0 0 db d3 0 0 db d3 0 0 db d3 0 0 
db d3 0 0 f0 d4 0 0 f0 d4 0 0 1c d5 0 0 
1c d5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 57 45 56 82 7b d3 6 0 0 20 0 0 
0 20 0 0 21 22 0 0 2f 82 0 0 0 4 0 0 
7 8 10 0 0 40 0 0 50 a4 0 0 0 0 0 0 
1 0 0 0 21 62 1 0 2f 82 0 0 0 0 0 0 
0 0 0 0 50 e4 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 f0 81 0 0 3f 0 0 0 0 0 0 0 
8 0 0 0 0 0 1 0 50 e4 0 0 0 0 0 0 
19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 c b 52 6e 52 dd bb 23 e5 31 d2 95 
38 73 2d ef f8 1c 2e a9 e3 c c0 62 8e 76 6b a7 
c6 fd 80 9c f6 eb 5e 6f a8 ea f7 b7 9e 7b 8b 88 
e1 28 40 f2 15 77 65 79 c9 24 f5 35 ed c9 2b a9 
35 f1 1f 33 8f 52 aa ee b5 56 d4 e6 6f 65 98 44 
b e4 ac a3 21 6d c6 70 4f 7c e 94 4c 9e 5a 88 
3c 86 8d e2 5c b1 3 93 ea 4f a7 1c d7 75 25 ca 
user> 



ガレージ内無線LANにしました。プラネックスのGW-US54GXS(1480円)を買ってき
て、奥のVistaマシンをアクセスポイントにしました。工人舎SA5の方は内蔵の
rum0。中でUSBの先についている。意外に電波が届く範囲は拡く、家の二階の部
屋でもOKだった。

ちょっと不具合もあり。起動時にgnomeでgdmにしていたのだけど、rum0を使う とavahidaemonがusbの待ちのまま戻らない。
ということで結局いつものようにtwmに。

ロガーは次回の走行に乗せる分だけを実装し終わりました。今日はP0_28を10k でプルアップして、ラインを外に引きだすのと、本体基板の5V→3.3Vのレギュ レータISL9007IUNZのラッチアップ対策にショットキーバリアダイオードを追加 しただけ。
なのだけど、その作業中にまたリチウムイオン電池の端子のハンダが剥れてし まい(今度は別の場所)、がっかり。ラジコン用にパックされたのを買った方が いいね。ワイヤでぐるぐる巻きにしてペンチでかしめてハンダで固めました。
他の端子も走行中の振動で落ちそうだ。

あとはマシンの整備と、ロガーのソフト書き。



さっそくスピードメータのセンサとつないでみました。今のところCN3のP0_28
につなげています。ただここはI2Cピンと共有なので内蔵プルアップはできず、
常にオープンドレイン。なので10kΩで外からプルアップしました。

割り込みをかけれるのがP0とP2だけで、コネクタのピン配置の関係上こんなと ころで。
void
eint3_intr ()
{

  iprintf ("@ %x\n", *FIO1PIN);
  *IO0IntClr = (1 << 28);
}

uint32_t
test (int32_t argc __attribute__((unused)),
     const char *argv[] __attribute__((unused)))
{
  mcu_pin_select2 (0, 28, PIN_FUNC0);	// GPIO
  mcu_pin_mode (0, 28, PIN_PULLUP);	// pullup
  // GPIO setting.
  *FIO0DIR &= ~(1 << 28);	// Input

  *VICIntSelect &= ~VIC_EINT3; // IRQ
  *VICIntEnable |= VIC_EINT3;

  *IO0IntEnR &= (1 << 28);
  *IO0IntEnF |= (1 << 28);

  while (/*CONSTCOND*/1)
    ;
  // NOTREACHED

  return 0;
}
こんな感じで、後輪が一回転ごとに割り込みが入るのを確認。あとは手数の問 題だ。工人舎SA5が活躍。ただLANケーブルが危険。ガレージ内に無線LAN入れる かな。

トウモロコシを一つ収穫してみました。ヒゲが茶色く枯れたのを一本。小さい です。でもこれでも菜園の中では大きい方。さっそくゆでて食べてみたところ、 さすが採れたてをゆでたのはうまい。先端の部分は芯まで食べれた。
サイズ的に食べ足りなかった。茶色くなってから大きくなるまで待ってみるか、 それとも食べてしまうか。悩みどころだ。

久々にガレージを大掃除。スポットクーラーも奥から引っ張り出してきた。

整備も早くやらないと間にあわない...。時間がない。



ロガー箱をメーターステーに取りつけます。ステムに干渉しないギリギリのと
こで。04カウルなら3cmは前に出せるのだけど...



NFカウルだと、ここでギリギリ。

やっぱり車体に載せると、このサイズは大きいな。

重量は370g。この先いろいろ実装しても400gは越えないでしょう。このくらい なら許せる範囲か。

マシンへの固定ができたところで、ちまちまとスイッチの配線(これが時間がか かる)をし、実際はめてみると基板と干渉してしまい、基板をリューターで削っ たり、ネジの頭を旋盤でギリギリまで詰めたりしてなんとか詰めこめた。
途中リチウムイオン電池の端子のハンダが剥れてしまい、ハンダ付けしようと したところ、まったくハンダが乗らない。ヤスリで削ってみてもうまくいかな い。仕方ないので鈑金用フラックスでジュージューやりながらハンダを乗せて みたところ、なんとかついた。これは大変でした。最初からハンダが乗ってる わけだ。
SD/MMCカードの配線はDAT0の他にDAT1-3も配線し4bitモードで転送できるよう にしておきました(これまでの実験ではDAT0だけの1bitモード)。

まずは車速から取ってみます。今迄Topeakのサイクルメータでとっていた。マ イCR85では、後輪にセンサをつけています。磁石はハンズで買ってきた小さい 磁石をブレーキローターの固定ボルトにフライスで座具って、セメダインスー パーXを塗布して埋めこんであります。
どういう仕組みになっているかというと、これは磁石がセンサを通るとスイッ チがONになるものだった。なので適当にプルアップして割り込みでとればよさ そう。
6速0.92、17:34で13000rpmまで廻ったとして一次減速は4.117なので、ホイール は13000/4.117/0.92/(34/17)で1716rpm、秒間28.6回転。34msecごとくらいかな。
このくらいノンビリならシュミット入力にしなくてもソフトでいいか。 そしてLPC2388はなんと、全てのピンに対して内蔵プルアップ、プルダウンを設 定できるので直結でいい。




突貫工事でケースの穴開けをしました。ワークの固定が不十分で、フライスで
開けたUSBとSD/MMCカードの穴はメタメタな仕上り。



例によってLM317で5Vに。LM317は最大1.5Aなので十分。これは出力コンデンサ が25μF以下なら逆流防止ダイオードは必要ない。これは入力が0.01μF、出力 が1μF。R1は120Ω、R2は500Ωの半固定抵抗にしておきました。

今日からまた節酒。レース後からまた酒量が増えていってしまい、ここ最近は 飲みたいだけ飲んでしまったいた。節酒の友は、このただのソーダ水。これを そのままグビグビ飲む。かなり気が紛れます。



ロガーを置く場所を検討。このあたりかな。CDIは横にずれてもらって。もう一
サイズ大きいケースにします。いつも最後のあたりで場所が足りなくて大変な
ので。



今回は最初にケースありきなので、よく配置を検討してから。

電源はリチウムイオン充電池、LI3100BP(3.7V 1050mAh MAX4A 23g)を直列で8V 程度。最低で6V。最初、ボタン電池にしようかと思っていたのだけど、 CR2032で200mA。これでは基板本体だけでいっぱいいっぱいなので、いろいろ悩 んだあげくこれに。
タコメータ駆動用の12Vのバッテリからとるのも考えたのだけど、12Vから5Vに するのもかなりロスだし、できる限りロガーは本体と切り離したい。ロガーを 車体から外して開発する時の手間を考えてこうしてみました。
基板本体は3.3Vなのだけど、ホスト側とのUSBに5Vが必要なのだ。LPC2388のIP ポートは100mAも流せて、5Vトレランス(最大6V)。これは使いやすい。外部は 5Vでもいいということだ。
今日は電源を基板にもってきたところまで。




LPC2388のSD/MMCカードインターフェース続き。

そこそこコードも整理しました。このLPC2388のSD/MMCカードインターフェース はR/Wをはじめると、絶対にコントローラのタイミングでFIFOに書き込むか読み 込むかしないといけない。72MHzで動かしていてもこれはとてもきついタイミン グです。
SD/MMCカード自体はクロックをいくら止めてもいいので、FIFOが待ちになったら クロックを止めてくれればよかったのに。
Cで呑気に書いたくらいだと18KHzくらいが安牌。DMA使ってアセンブラでガチガ チに組まないと普通には使えない感じです。これはこの後のロガーの実装で問 題になるかもしれない。データの入力は落としてでも書きこむスケジューリングに しないと。
前日でCMD1がうまくいかないのは仕様だった。MMCカードではなく、SD/MMCカー ドの場合、CS#をアサートしてCMD1を発行すればSPIモードになるけれど、アサー トしていない場合は蹴られるのだ。SDカードとしてACMD41を発行してくれとい うことなのだ。
もうちょっと詰めたいのだけど、BS走行会までに、これをCR85に積みたいので ちょっとおざなりのまま先に。ハード的な問題も実験したいし。間にあうのか 微妙....。最悪ノイズをサンプリングテストまででも。
bool
mci_mmc_init ()
{
  int i;

  mci_power (FALSE);
  mci_power (TRUE);
  mmc_debug = 0;

まずCMD0を送ってIdle状態にします。
  // [CMD0] Reset
  mci_cpsm_command (NULL, &cpsm_command[MMC_CMD0]);

この状態でCS#はHi-Z(本当はプルアップするべきみたい)。MMCカードならこのCMD1に
レスポンスを返すはず。
  // [CMD1] MMC card response this. SD card don't response.
  if (mci_cpsm_command (NULL, &cpsm_command[MMC_CMD1]))
    {
      card_info.type = CARD_MMC;
      return FALSE;	// not supported.
    }

SD, SDHCカードなので反応しない。初期化をやり直すためにCMD0をもう一回発行します。
  // [CMD0] Reset again for SD, SDHC card.
  mci_cpsm_command (NULL, &cpsm_command[MMC_CMD0]);

SDHCカードを確認します。CMD8に反応すればSDHC
  // [CMD8] Check SD card or SDHC card.
  if (mci_cpsm_command (NULL, &cpsm_command[MMC_CMD8]))
    {
      printf ("SDHC card\n");
      card_info.type = CARD_SDHC;
    }
  else
    {
      printf ("SD card\n");
      card_info.type = CARD_SD;
    }

ここでSD,SDHCカードを初期化。
  // [CMD41] Initialize SD, SDHC card.
  cpsm_command[MMC_ACMD41].arg =
    card_info.type == CARD_SDHC ? 0x40ff8000: 0x00ff8000;
  for (i = 0; i < 100; i++)
    {
      if (mci_cpsm_command (NULL, &cpsm_command[MMC_CMD55]) &&
	  mci_cpsm_command (NULL, &cpsm_command[MMC_ACMD41]))
	break;
    }
  if (i == 100)
    {
      printf ("ACMD41 failed.\n");
      return FALSE;
    }
  //  mmc_debug = 1;

  // Check OCR
  card_info.block_address = FALSE;
  if (card_info.type == CARD_SDHC)
    {
      if (response[3] & 0x40000000)
	{
SDHCカードの場合、ディスクアドレスではなく、セクタ番号を指定する場合が
あるので、それをチェック。(4GBまでならディスクアドレスでした)
	  printf ("SDHC block addresssing.\n");
	  card_info.block_address = TRUE;
	}
    }

  // [CMD2] Get CID.
  if (!mci_cpsm_command (NULL, &cpsm_command[MMC_CMD2]))
    return FALSE;

CMD7,9,10,13に必要なRCAを取得します。
  // [CMD3] Get RCA.
  if (!mci_cpsm_command (NULL, &cpsm_command[MMC_CMD3]))
    return FALSE;
  card_info.rca = response[0];
  printf ("RCA=%x\n", card_info.rca);

  // [CMD9] Get CSD
  if (!mci_cpsm_command (&card_info, &cpsm_command[MMC_CMD9]))
    return FALSE;

フルスピードにするとFIFOの読み込みが間にあわないので400KHz以下のまま。
  // Full speed clock.
  //  *MCI_CLOCK |= CLOCK_BYPASS;

  // [CMD10] Get CID again. (paranoia)
  if (!mci_cpsm_command (&card_info, &cpsm_command[MMC_CMD10]))
    return FALSE;

  // [CMD7] Set RCA to r/w  This command must be last.
  if (!mci_cpsm_command (&card_info, &cpsm_command[MMC_CMD7]))
    return FALSE;

  return TRUE;
}
MonotaRO(モノタロウ)
あわせて読みたい