2008-05
フィジカルコンピューティングについて†
- DWM2008.5付録の蛙のゲームはFlash(ActionScript)で書かれている。
- どうやってARM基板からFlashをコントロール出来るのだろうかという疑問が沸いてくる。(方向は逆かもしれない)
これには種があって、実はGAINER(環境、ライブラリ)が使われている。
- GAINERとは、最近流行り(?)のフィジカルコンピューティングなるものらしい。
- AVRでも同じようなものがある。Arduinoだ。
- http://www.arduino.cc/
- ホスト側の言語はProcessingというJava由来の簡易言語だ。
- GAINERは、CypressのPSoCマイコンをデバイスとして使用している。
- 但し、接続はUSBで、FT232を使用する。
- GAINERのホスト側は3種類ある。
- MAX/Msp(製品)
- Flash(ActionScript)
- Processing
- それ以外にRubyやら.NETやらC++という実装もぼちぼち見られるようだ。
フィジカルコンピューティングなるものが流行っているなんてことは、DWM2008.5を入手するまで知らなかった。
- しかし、これはもっと汎用的であるべきだと思う。
- たとえば、デバイスはCypress製である必要なんてない。
- 実際のところ、DWM誌のデバイスはARMだ。
- 接続はシリアルまたはUSB経由のシリアル(Virtual COM Port)またはTCP/IPのいずれかを使うことになるだろう。しかし本質的にはRS232CのRxD,TxDを使っているのと何ら変わりはない。USBで仮想化されるだけだし、USBも介したくない場合はTCP/IPでも結局文字列渡しのコマンドストリームというところは変わらない。
文字列ベースのストリーム通信をやることに異論を挟むわけではないが・・・違和感を感じるのは何故だろう。
- 結局のところ、リモートセンシングとポートコントロールをやっているだけなのに
- ターゲットデバイスに文字列処理を強いるのはいかがなものか?
- 文字列ベースの処理はPCホスト側の仮想デバイス(シリアルプロクシーのレベルでも良い)に担当させて、USB/COMはバイナリー化したほうが性能は良くなる。デバイス側のコードも簡略化出来る。
- AVRUSBとの相性も良くなるわけだが。
- FlashやらProcessingとの交信は文字列ストリームであることは賛成だ。
- そういうわけで、gsp(GAINER Serial Proxy)を各種デバイス向けに用意してやれば、上位層は同じ(ような)デバイスと思ってアプリが作れるし、下位層はデバイスの差し替えが容易になるわけだ。
- 各種デバイスというのは
- AVR−USB
- FT232を挟んだ(あるいはシリアル経由)AVR
- FT232を挟んだ(あるいはシリアル経由)H8などの汎用マイコンなど。
- というか、いまだに、簡易オシロの実装の方向性を考えているだけなのだが。
- サンプリングレート命になるので、8bitもしくは16bit整数のバイナリー列で受け取ってやるしかないと思っている。
- ARMのようにオンチップのUSB-仮想COMデバイスを実装できれば、ボーレートは最速になる。
- ただし、USBの弱点であるフレーム時間同期のことを考えると、コマンド送出→データ受け取りという同期の取り方では速度ネックになりやすい。
- 往復時間で数フレームを消費するので、せいぜい秒あたり250サンプルなんていう結果に陥るのだ。
- これはRS232Cに換算すると19200bps程度だ。バイト数で言うと2400バイト/秒なので、1サンプル10バイトとしても達成出来るスループットだ。
- この程度のサンプリングレートで良いかどうかは、使い道次第だが・・・。
GAINERコマンドリスト†
GAINER I/O module command list | |||||||||||
version: 1.0.0.15 | |||||||||||
date: 2006.5.27 | |||||||||||
Configuration | |||||||||||
command | result | comments | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
KONFIGURATION_n | KONFIGURATION_n* | n: configuration (1~8) | ○ | ||||||||
I/O | |||||||||||
command | result | comments | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
Dxxxx | Dxxxx* | set all digital outputs, xx: value | ○ | ○ | ○ | ○ | |||||
Hn | Hn* | set specified digital output high, n: port number | ○ | ○ | ○ | ||||||
Ln | Ln* | set specified digital output low, n: port number | ○ | ○ | ○ | ||||||
R | Rxxxx* | get all digital inputs, xx: value | ○ | ○ | ○ | ○ | |||||
r | rxxxx*rxxxx*… | get all digital inputs (continuous mode), xx: value | ○ | ○ | ○ | ○ | |||||
E | E* | exit continuous mode | ○ | ○ | ○ | ○ | |||||
Tx | Tx* | set sensitivity for capacitive sensing inputs | ○ | ||||||||
Axx…xx | A* | set all analog outputs, xx: value | ○ | ○ | ○ | ○ | |||||
anxx | anxx* | set specified analog output, n: port number, xx: value (00~FF, 8bit) | ○ | ○ | ○ | ○ | |||||
anx…x | a* | set specified analog output, n: row number, x: value (0~F, 4bit) | ○ | ||||||||
I | Ixx…xx* | get all analog inputs, xx: value | ○ | ○ | ○ | ○ | |||||
i | ixx…xx* | get all analog inputs (continuous mode), xx: value | ○ | ○ | ○ | ○ | |||||
E | E* | exit continuous mode | ○ | ○ | ○ | ○ | |||||
Sx | Sxx* | get specified analog input (continuous mode), xx: value | ○ | ○ | ○ | ○ | |||||
E | E* | exit continuous mode | ○ | ○ | ○ | ○ | |||||
Mx | Mx* | ain sampling mode, x:mode (0: scan all channles, 1: scan ain 0/4 only) | ○ | ○ | ○ | ○ | |||||
Button/LED | |||||||||||
command | result | comments | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
(button pressed) | N* | the on-board button is pressed (no need to send a get command) | ○ | ○ | ○ | ○ | |||||
(button released) | F* | the on-board button is released (no need to send a get command) | ○ | ○ | ○ | ○ | |||||
h | h* | turn the on-board LED on | ○ | ○ | ○ | ○ | |||||
l | l* | turn the on-board LED off | ○ | ○ | ○ | ○ | |||||
PGA | |||||||||||
command | result | comments | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
Gxy | Gxy* | set PGA gain and PGA reference, x: gain, y: reference | |||||||||
Misc. | |||||||||||
command | result | comments | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 |
Q | Q* | reboot | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
Vx | Vx* | verbose mode, x: mode (0: disabled, 1: enabled) | ○ | ||||||||
? | ?1.0.0.xx* | version number, xx: build number | ○ | ||||||||
General Notes | |||||||||||
all values are in hex and should be in upper case (e.g. 0A, F8...) | |||||||||||
Configurations | |||||||||||
configuration | ain/din/aout/dout | comments | |||||||||
0 | 0/ 0/ 0/ 0 | initial configuration just after rebooting | |||||||||
1 | 4/ 4/ 4/ 4 | default configuration | |||||||||
2 | 8/ 0/ 4/ 4 | ||||||||||
3 | 4/ 4/ 8/ 0 | ||||||||||
4 | 8/ 0/ 8/ 0 | ||||||||||
5 | 0/16/ 0/ 0 | ||||||||||
6 | 0/ 0/ 0/16 | ||||||||||
7 | 0/ 8/ 8/ 0 | matrix LED control mode | |||||||||
8 | 0/ 8/ 0/ 8 | capacitive sensing switch mode (first 4 ports only) |
付録ARMは、厳密に言うとGAINERではないのかもしれない。†
- main.c
void checkCommand() { // * -- Accelerator mode if(memcmp(buffer_out, "*", 1) == 0) <==こんなコマンドは存在しない。 { sendFlg = 0; mode = 'A'; } ・・・ void main(void) { ・・・ case 'A': <==アクセラモードというのはGAINERにはない。 delay(CNT_DELAY); ACC_To_USB_Send_Data(); break;
- hw_config.c
void ACC_To_USB_Send_Data(void) <==アクセラモードの挙動。 { u16 x, y, z; x = ADC_RegularConvertedValueTab[0]; y = ADC_RegularConvertedValueTab[1]; z = ADC_RegularConvertedValueTab[2]; sprintf((char*)buffer_in, "%d,%d,%d\r", x, y, z); ・・・
- たしかに、3軸の10進値を "x,y,z\n" 形式で吐いている。
- GAINERに則れば、"i00*" とか "iFF*" みたいにアナログインプットコマンド(連続送信モード)の"i"を受け取ると、1バイトのアナログ値をHEX2桁で返す流儀がオリジナルなようだ。
- GAINERのままでは、16ビット(あるいは12ビット)アナログ値は受け渡すことが出来ないので、困るはず。
- 実際に "i*"を送ると、 "iXXYYZZWW*" (XX,YY,ZZ,WWは4つのアナログ入力値(00〜0xFF)ただしWWは00固定、他の軸は256/4096した値)を連続送信するモードに突入する。
- さらに、アナログ入力系のコマンドと、上記のアクセラ入力モード以外はいっさい実装されていないことがわかった。
Cypress用のGAINERファームの実装はあまり良くないのでは?†
- gainer_psoc(1.1.0b00)よりもgainer_v1.5(1.5.0b01)のほうが、まだまともだが。
- なまじ文字列コマンドで柔軟性を持たせているので、処理が重い。
- コード量もけっこうある。
- v1.5のhexで内容的に16kBくらい(?)
- ATtiny2313の2kBには、逆立ちしても入らない容量
- そのまえに、前提条件として、文字列ストリームで汎用性を持たせてあるわりには、Cypress以外への実装に向かないようなコマンド体系、リファレンス実装とはいかがなものかい?(或いは、他のマイコンへの挑戦なのカー?)
とはいえ、GAINERは大きな可能性を持っていると思う。†
- PSoC、AVR、ARM、H8、SH、R8などどのマイコンもUART(つまりシリアル通信)くらいは持っている。
- つまり、シリアル通信はマイコンの共通言語なんだ。(PCから見て)
- USB化されていても仮想COMポートであればシリアル通信とほぼ同じだ。
ということは
- GAINERのデバイス層が共通なコマンド体系で実装されれば、事実上どのマイコンもPCと繋がり、ほぼ同じように操作出来るアプリケーション群が書けるはず。
- ついでに言うと、内部メモリーを読み書きするモニターとSローダーとGDBスタブ(or OpenOCDのようなもの)まで、このシリアル通信に含めてしまえば、PCと接続して処理を行う用途についてはほぼ需要を満たせるはずなんだ。
- デバッグスタブは機種固有なのでとりあえずおいといても構わない。
- これは迅速なプロトタイピングの実現という意味で非常に便利なものだ。
- PC部のメインルーチンをターゲットに移植すれば、プロトタイプからスタンドアローン化も出来ることになる。(但しPC側のリソースは使えない)
- それにしても、現在のCyprress(PSoC)の実装はとても褒められたものではない。
- GAINER v2.0に期待するか。
勝手にGAINER補完計画†
- 実は俺にとっては上位層なんてどうでもよい。
- 極端なことを言えば、COMポートをReadFile/WriteFile出来る言語があればそっから上はなんでもOK。
- それが出来ない言語ではgspのようなものを仲介させてTCPのストリームをOpenさせる。
- シリアルポートを流れるコマンドこそ全て。(モデムで言うならさしずめATコマンド体系がしっかりしているかどうかだ)
- マイコンの機種に依存しない柔軟なコンフィギュレーションが必要。
- たとえばAVRならport directionを制御したり、PWMの周期やモードを制御できたほうがよいが、それらは機種固有なのでオプショナルだ。
- 論理ポートNoと物理ポートNoの割り付けのようなものは必要だろう。PSoCのように固定化したものでなく。
- データの種類は analog in/out , digital in/out 。
- AVRでは双方向とかPullUpがあるが・・・それらはオプショナル。
- 受け渡すデータ列は8ビット、16ビット、32ビットの3種類。32ビットは将来のオプション
- 基本的には数値表現は16進整数値。(固定桁ゼロパディング)
- オプショナルでバイナリ8ビット、16ビット、32ビットのストリームあり。
- continuousモード(連続送信モード)はサンプリングレートの指定が必要だと思う。
いっそのこと、MIDIのノートON、ノートOFFイベントをそのまま流用するか? (ain/aout代わりに)
- そうすると、ベンダーリクエストのコマンドが来たら、Sレコードを埋め込んでプログラムを送りつけて実行させたり、やりたい放題のことも出来る。
秋月のSH2tiny†
- Comming Soonだった基板が新製品に出ていた。
1800円。すこし安いな。完成品のようだ。
- これに外部メモリーが付けられるなら鬼に金棒なんだが。
- FR60の汎用ポートにバスぶら下げるのって・・・(IF記事見たけど・・・)どうなんでしょ?
- まわりくどいI/Oポートとしては使えるだろうけど、外部RAM上のコードを実行できるわけじゃないしねぇ。
まだH8のモニターを弄っているのだが・・・†
- こんどは3048Fの秋月ボードにmonitorを書き込もうとしている
- flashの書き込みは1回目はうまくいったのだが、2回目以降ちっとも書き込めない。
- やっぱり100回のチケットを使い果たしたのか?
- と思ったが、昇圧の12Vがやや低いような気がする。
現在、秋月3048マザボを改造して、AVRUSBによるUSBポートを繋いでいる。
- ATtinyの空きポートにPWM生成をプログラムして、そこから取り出した矩形波 で2SC1815みたいなTrをOn、Offしている。
- 適当なトロイダルコイルをチョッパして、なんちゃって12Vを生成しているのだが、
- ちょっと電圧が足りてないようだ。
- それと、5V、12Vを与えるタイミングが、秋月の意図したタイミングと逆転してしまう(12Vが後で印加される)ので、どうも具合が悪い。
- 対策として、手動リセットをかましているのだが、今日に限ってうまく書き込めない状態のようだ・・・。困ったな。
- 三端子レギュレータをとっぱずしてみるか・・・。
なんか適当すぎるなぁ>俺
3048F用のモニタがとりあえず動作した。†
- 電源12V問題は、ハンダ不良だった。(つまんねー)
- でも、チョッパーのOUTは12Vしか出ていないので三端子レギュレータをスルーするように配線を変えてみた。
- 一応書き込み成功。sciのコントロールが3694Fと微妙に違うのが気に入らないがまあいいや。
- そのうちソースを整理してUP予定。
- 結局のところGDBなんか使う気ないのでStub統合はナシ。
- 3048FはフラッシュROMが多めなので、逆アセンブラくらい欲しいなあ・・・
- 相変わらず19200bps。
- 38400bpsにするとやはり文字欠けする。AVRUSB側の(スループット不足)問題。
- でも速いほうが気持ちいい。
- いっそのこと、AVRmonitのように、バイナリーでメモリーR/Wするだけの単機能 モニターにしてしまって、パソコン側に逆アセンブラを入れようかとも思った。
- そうしたら現在の3倍は速く表示出来るし、スループット不足による文字欠けは(16バイト単位のリードをリクエストする限りは)発生しない。
- 3048F側のコードも、現在の4k強サイズから、1kバイト程度にまで縮むに違いない。
トラ技8、9月号はNECの78KUSBマイコンが付録†
http://www.cqpub.co.jp/toragi/Images/tr200808,9.pdf
- 8月号(7/10発売)USBスティック型風の78Kマイコン基板付録
- 9月号(8/9発売)ベースボード(基板のみ。部品なし)付録
今年は基板が豊作だ。・・・しかもUSB接続種が多い!
http://www.necel.com/micro/ja/product/all_8_usb.html
- 78Kは8ビットマイコンらしい。ROM16K、RAM3K。なのにUSB
- 何故にUSB?といった感じだな。
- クロックは16MHz。
- ユーザーズマニュアルをDLしようとしたら、500 Errorって何だい。
- ああ、もうこれ以上、マイコンの機種を増やしたくない。
- AVRを主軸にして、ARMとSH2tinyくらいにとどめておこう。
- 78Kはチップ価格が安いらしい(300円とか) --- http://www.necel.com/news/ja/archive/0609/1901.html
- データ記録用フラッシュ256KB内蔵品種もある。(コードは16kBのままで)
- そもそも8ビットマイコンなのに、何故に256kB?
- この78K+USBは、鍵用途だな(USBドングルっぽいやつ)
http://elm-chan.org/works/sp78k/report.html
- 上記ChaNさんの解説によると、
78Kアーキテクチャは、8085に独自のビット操作命令を追加したような感じのレジスタと命令セットを持ち
- ということらしいので、Cで書こうとは思わないほうがよいのかな。
- PICよりはまし、とか。
- 某社の8051よりはまし、とか。
- **よりはまし、というのは何ともネガティブだなぁ・・・。
- PICを含めフルアセンブラで書かないと使えないようなCPUは全力でスルーの方向で。
- とか、いいながら、上記トラ技の広告PDFによるとC言語でプログラミング出来るらしい。
- 8085をか?
- とりあえず怖いものみたさで入手予定だ。
- ダメアーキだったとしても、(一応シリアルを含むので)FT232の代用品として使えるかも
78Kのユーザーズマニュアルを流し読み。†
- ほんとに8085だ。IX,IYは無い。
- 8080に欠けているAレジスタの片割れとしてXを追加しており、
- AX、BC、DE、HLという16ビットレジスタペアが構成できる(って8086かよ)
- [HL+B]とか[HL+C]あるいは[HL+#imm8]というアドレスモードがある。
- それ以外のパターンはあるかというと、ない。
- [BC][DE][HL]はあるが、[AX]というアドレスモードはない。
- にもかかわらず、AXに対してのみ16ビット即値加算、減算、即値比較が用意されている。
- BC、DE、HLに即値代入するのは普通にあるが、レジスタペアにメモリーからロード、ストアはない。AXのみ可能。
- AXとrp(BC、DE、HLのうちどれか)の交換はある。代入は無い。
- AX=A*X、AX=AX/Cという符号なし乗除算命令を持っている(それぞれ16、25クロック)
- そのほかはおおよそ8085相当なので、C言語で使うにはきつい
- バスは8ビットらしく、平均命令サイクル数は6くらい?
- AVR換算で3MHzくらいかな。だけどレジスタが少ないのでC言語で使うには効率が悪い。
- そうそう、USBは一応12MHz(フルスピード)でパケット長64バイト。
- それからバルク用エンドポイントが2つ用意できる。64バイトのバッファをエンドポイントごとに2組持てる。
中国四川省地震†
- 本題(AVR)から脱線して申し訳ない。
- この地震に関して、日本国内での反応は「他人事」もしくは「対岸の火事」のように見ているが、
- 実のところ、被災者1000万人、死者数万人(もしかしたら10万人を越える、ダムが決壊すればそれどころではない)というリアル数字は地震の第一報からは全く想像も出来なかったことだ。
- これは対岸の火事ではない。近い将来間違いなく日本で起こる。
- 不気味な予行演習だ
Atomベンチマーク来たー†
PCウォッチ:MSIのAtom搭載ミニPC「WIND PC」速報レビュー
- http://pc.watch.impress.co.jp/docs/2008/0519/msi2.htm
- Atom以外は汎用品という割り切り方が好いねぇ・・・。
- E7200と比べると1/5以下の性能だ。負けっぷりが好いねぇ。
- Cele-M 900MHzと比べるとやや劣るくらいだな(Atomは1.33GHz)
- システムトータルでの消費電力は実測30〜35Wらしい。排気ファンが1つ付いている。惜しい
- 完全ファンレスだったら良かったのに・・・
OpenCV:†
openframeworksとか入れなくちゃいかんのかなーと思っていたら、別なのを見つけたので貼っとく
- http://opencv.jp/
- インテルが開発・公開しているオープンソースのコンピュータビジョン向けライブラリ。
- WindowsならびにLinux、FreeBSD,Mac OS X等。
- C/C++で記述する。
初めて知った。
- 名前だけはなんとなく聞いていたが、CVってあーたなんですか?って感じで通り過ぎていた(引っかからなかった)わけで・・・。(Control Voltage?え?)
- コンピュータビジョンのことらしい。
- Wikipediaによると、
コンピュータビジョン(computer vision)は大雑把に言って、 「ロボットの目」を作る研究分野である。
だそうだ。
フィジカルコンピューティングと何か関係あるのかな?†
とりあえずやりたいことは
- Win上でも動くGUIっぽいプログラムを簡単に書きたい。
- もちろん、画像を表示するのが主だ。
- で、この手の簡易言語の候補としてあがってきたのは
MAX/Msp 商用ソフト,元はMac用のサウンド系ツール 商用はフリーじゃない不利 Action Script Adobe Flashで使われている。JavaScriptにすこし似ている Webブラウザ上の動作なので嫌 Processing Java由来の簡易言語。Java仮想マシン上で動く。Proce55ingとも書かれる Javaかぁ・・・ openframeworks OpenGLの薄いラッパーとして実装されたC++ベースの簡易言語(?) まだまだ過渡期
- どれも触手が動かないんだよう・・・。
- このほかに、Tcl/TkとかHSP(ほっとすーぷ)とかC#とかもいちおう考えはした。
- やっぱりアルゴリズムを書くのはバニラなC言語がいい。
- だけどGUI構築の為にWin32APIを叩くとかVisualなんとかを使うのは嫌だ(面倒すぎるし、Windowsと心中したくない心理)
- SDLとかOpenGLベースも考えてみたが、こつこつやるのはやっぱ面倒臭いんだよ〜。
というわけで、暫くの間OpenCVを試してみることにする。