2013年1月27日

[openocd]0.7(dev版)を実行させたときのログ

Windows XPの新規インストール中・・・。
ARM-USB-TINY-Hのドライバを入れ直したりしたので、記録を残しておく。

OpenOCDの0.7から、FM3のmb9bfxx8が使えるようになったようだ、という確認だ。
以前より転送速度が遅くなっているような気がする(前は11KiB/sくらいだったような)が、まあ細かいことはよかろう。

Open On-Chip Debugger 0.7.0-dev-00145-gd631b2e-dirty (2013-01-24-00:15)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
trst_only separate trst_push_pull
adapter speed: 500 kHz
cortex_m3 reset_config sysresetreq
Info : max TCK change to: 30000 kHz
Info : clock speed 500 kHz
Info : JTAG tap: mb9bfxx8.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : mb9bfxx8.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'telnet' connection from 4444
auto erase enabled
Info : Fujitsu MB9Bxxx: Sector Erase ... (0 to 1)
Info : Fujitsu MB9B500: FLASH Write ...
wrote 32768 bytes from file asp.srec in 4.343750s (7.367 KiB/s)
Info : accepting 'gdb' connection from 3333
Warn : acknowledgment received, but no packet pending
requesting target halt and executing a soft reset
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x01000000 pc: 0x00000100 msp: 0x1fff1f48
Info : dropped 'gdb' connection

XPを入れ直してから、LiveWriterのCodeSnippetが動かなくなってしまった。
.NETのSDKをインストールすればよさそうではあるが、もういいや。

[nfc]月刊NDEF 1月号(そして最終回)

風邪を引きかけているような気がするので、今日は風呂も入らず外にも行かず、ずっとこたつに座っている。
ちなみに、ここ数年は風邪で仕事を休んだりしてないのは、休日に体調不良になって、なんとか治しているからだ。
そろそろ、そういうのができない体になってきたか・・・。

だからだろうか。
急に「NFCとあんまり関連しないようなタイトルを付けて資料を作りたい」と思った。
思いついたのが「月刊NDEF」だったのは、ベアゴスティーニの影響だろうか(買ったことないけど)・・・。

月刊NDEF(PDF)ダウンロード


「月刊」とつけるからには、なんとなく雑誌っぽい感じにしたくなるではないか。
うちにある月刊誌は、Interface誌しかない。
2013年3月号が手元にあったので、参考にしながら作った。
何気なく見ている目次だが、さまざまな工夫が凝らされていることがわかった。
配置、色、フォント、絵をどこに入れるか・・・。
私はあまり見栄えがいい資料を作っていない(なんとかしようとはしているのだ)けど、こういう冊子になると「目を引きつけさせる」という要素が必要になることがわかった。
技術文書なんて、だいたい技術に関することしか書かれていないので、その技術に興味がある人は見るだろうけれども、そうではない人の足を引き留めるためにどうするか、ということを考えないといかんな。

まあ、そんな細かいことは抜きにしても、あまり作ったことがないような資料だったので面白かった。
読んでわかりやすいかどうかは、今後の課題だろう。


絵でわかる!、って書いたけど、これはInterface誌の「絵とき!」をやってみたかったからだ。
が・・・絵がほとんどなかったな。
まあ、反省すべきところはする、ということですな。

でも、次はもうやらんですよ。

2013年1月26日

[nfc][nci]NFCEEはセキュアエレメント?

NCIの調査を始めたが、のっけからつまずいた。

image

これが、NCIに関わるもののおおまかな位置関係だと思う。
(ドキュメントから切り貼りしたかったが、著作権とかありそうなので描いている。)

DHは、ホストマイコンでいいだろう。
よくわからないのが、NFCCとNFCEEの関係だ。
特に、NFCEEっていうのが何だかわからない(まだ全部読んでないからだろうけど)。

Execution Environmentというくらいだから、NFCっぽいことを実行する本体なのだろうと思っていたのだが、NCIスコープの図を見るとNFCCにアンテナがついていた。
それに、NFCEEはなくてもよい、となっていた。
???である。

 

検索すると、どうもセキュリティが関係する内容を実行する場所のようである。
ということは、セキュアエレメントみたいなものなのだろうか。
セキュアエレメントだけということはないかもしれないが、なんというか、そういう感触のものなのだろう。

 

RC-S620/Sを使う場合、RC-S620/S自体はNCI対応していないから、ホスト側がNCIをRC-S620/Sのローカルコマンドに置き換えることになるのかな。
まだ大半のNFCデバイスはNCIで直接やりとりできるようになってないだろうから、こうなんじゃなかろうか。

 image

 

組込みの小さいマイコンだと、容量などの関係からNCIはつらいかもしれんな。
まあNCIだけじゃなくて、共通インターフェース自体がそんなもんだろうけどね。


NFCでよくわからない単語を検索すると出てくるこのサイトhttp://www.ekouhou.net/。
国が運用している特許公報のページかと思っていたら、そうじゃないらしい。
特許をダウンロードするときにIPDLDDというツールを使うと貢献できるらしい。
今のところ特許を調べているわけではないのだが、いるときがあるかもしれないので覚えておこう。

[nfc]NCIを調べよう

NCIを早くやらねば、とよくわからない焦燥感に駆られている。
AndroidもNXPからBroadcomのチップに変わったように、今やNCIがないNFCチップは見放されようとしている(と、勝手に思っている)。

まあ、私はNFCチップを売っているわけではないし、そもそもNFCを仕事にしているわけではない。
ないのだが、PaSoRi RC-S370にも搭載されているRC-S956というR/W用NFCチップが搭載されているRC-S620/Sを使って遊んでいるので、他人事ではない気がしている。

 

自分で、RC-S620/Sを使うためのライブラリを作ってはいる。
いるのだが、そのインターフェースの設計はいきあたりばったりで(いや、がんばってはいるんだよ)、もちろん使っている人などいない。
このまま独自路線を貫くという手もあるだろうが、そうやって消えていった例を我々は何度も見てきて「時代に乗り遅れた」と思ってきたではないか。
それを「めんどくさい」というだけの理由で見過ごすというのも、愚かだろう。

 

そんな理由を付けて、最後に残ったNCIドキュメントを読むことにしよう。
過去にも数回眺めてはいるのだが、調査ってところまではやっていないのだ。

Linuxなんかは既に実装があるようなので、それを参考にできたらいいな。

[nfc]Static Handover(Wi-Fi)のまとめ

Arduinoが来てからNFCをもうやらないように見えたかもしれないけど、ときどきやってます。
NFC Forumの仕様に関しては、全部ではないにしても見たいところは見たような気がする。

 

数回に分けて書いていた、Static Handoverについての調査をまとめた。
Static Handoverの例(Wi-Fi)

 

 

siteの方もときどき更新していますよ、ということで。

2013年1月24日

[openocd]Interface付録のFM3マイコンに対応したようだ

[nor/fm3] mb9bfxx7 mb9bfxx8 support.

これが3週間前にfixedになったようだ。
Interface誌の付録になっているFM3は、MB9B618T。
今まで、OpenOCDでは、xx6、のサポートまでだったので、FLASHメモリを全部は扱えなかったらしい。

 

まだgitに入っている段階で、0.7.0のリリースはされていないようだ。
ファイルを取ってきて、ビルドすると、とりあえずマイコン指定でxx8を選んでも怒られなかったように思う。
まあ、もともとそんなに大きなプログラムは作ってないんだけどね・・・。

 

とにかく、ビルドで疲れた。
せっかく残業無し日だったのに、いつもより遅いじゃないか。。。
ビルド方法は、こちらを参考に、というよりも、そのままやった。

  • libusb-win32は、書いてある通り1.2.4を使った。最近のはusb.hから名前が変わっているので心配だったのだ(既存との名前衝突を避けるために変更したらしい)。
  • libFTDIは、0.20を使った。
  • ヘッダファイルを置く場所を、勝手に/usr/local/includeとかにしていたのだが、コンパイラをi686-pc-mingw32でやっているので、ここに書いてあるパスに置かないと読んでくれない。
    無理に-Iで指定させたら、あちこちぶつかりだした。
    mingw32じゃないとだめかどうかは、確認してない。動けばよかろうなのだ。

最初、mingw32をcygwinにインストールしていなかったのだが、libFTDIはビルドできたのだ。
そのままOpenOCDをビルドし出すとエラーになったので、インストール。
最後の最後になって、libFTDIのリンクに失敗。cygwinでビルドしていたライブラリだったので、いくつかリンクできないものがあったらしい。

そんなごにょごにょしたことをやりたくなければ、サイトに書いてあるようにビルドするとよろしい。


なんで半年くらいほおっておいたFM3を触ってみたかというと、やはりArduino効果だろう。
Arduinoを動かしてて、「あー、USBホストシールドがあるといいかも」「バニラシールドもあると収まりがいいな」などと散財してしまいそうだったので、その誘惑を断ち切るためにも既存に目を向けることにしたのだ。

Arduinoって5Vだけど、うちには3.3Vのものしかないので、つなげるのが難しいのよね。。。
スイッチサイエンスさんから、簡易レベルコンバータを買ってFeliCa Plugと接続しようとしたところで、「いやいや、3.3Vで動かせる環境は既にあるやん」と思い出したのだ。

基板がきれいだから、見た目もきれいにしたくなってしまうという誘惑に打ち勝たねば。

2013年1月23日

ArduinoとAndroid Beam

ArduinoにNFC R/WのRC-S620/Sを載せて「SNEPが動いた-!」と日曜日は喜んでいた。

しかし少し経って冷静になってみると「はて、組込みでSNEPって需要があるんだろうか?」ということに思い至った。

SNEPでNDEFをPUTするなら、その内容はインタラクティブというか、動的な内容になるだろう。
静的な内容だったらカードで十分だからだ。
もし、画像みたいに大きなものを送るのだったらBluetoothとかWi-Fiを使うだろう。
小さいNDEFだったら、カードエミュレーションで相手に読ませた方が楽だ。

SNEPって、相手とデータをやりとりを繰り返すので、それなりに電力を使うのよね、たぶん。
デジタルサイネージの例かなんかで、カメラで広告を見ている人を見分けて、その人に合いそうな広告を出す、というのがあった。
ああいうのに使えそうな気もしたけど、それだったらDynamic TagでNDEFデータを生成させればいいしね。

 

ただ、「カードを読みたい」というときにはR/Wしかない。
つまり、相手に読ませるのではなく、自分で読みたい場合だ。
そういうときにしか使わなくなるのかなあ。

ならば次にやるのは「AndroidからArduinoを近接制御!」だろうか。。。。

2013年1月20日

[arduino]サーボモータの制御はPWMなんだ

はい、素人です。
サーボモータ自体知らず、Arduino本の通りに接続して、ソースを書いて実行させました。

サンプルは、ポテンショメーターのつまみをぐりぐり回すと、それにあわせてサーボモータがぐりぐり動くというもの。
ほほぅ、こういうことができるんだ、と素直に楽しめた。

 

ポテンショメーターも初めてだったのだが、これは可変抵抗と電圧出力がセットになったような部品だ。
それはいいのだけど、これの+と-の間に100uFの電解コンデンサをまたぐようになっている。
さて、なんのためだろう?
チャタリング・・・じゃなくてジッタを弱めるためだろうか。
と知った顔で書いてみたが、「ジッタ」って用語で正しいのかわからん。。。

 

同じ容量の電解コンデンサが、サーボモータの+と-のところにも同じようにまたいでいる。
こっちは本にも書いてあって「you can smooth out any voltage changes that may occur」だと。
発生する電圧変化を滑らかに伝える、ということなのかな。
積分回路・・・だっけ?
コンデンサに充電するからすぐに変化がサーボに直結せず、立ち上がりがゆっくりになる、ということか。

あ、同じところに「ポテンショメーターも同じ」みたいなことが書かれている。
「デカップリング キャパシタ」と呼ぶらしい。なんとなく聞いたことがある気がする。
TDKのページによると、高周波成分を通す性質を利用する、という基本機能の応用とのこと。
なので、さっきジッタがどうのって書いたけど、ノイズのような高周波成分をGNDに流すために使っている、ということになるのかな。

容量が100uFということについては、よくわからない。


ソースも少し書くだけで動いたのだが、実はサーボモータはPWMで制御するらしい。
digitalWrite()でPWMのチェックをしているところがあったので「PWMとかそげん使わんよなあ」と思っていたのだが、いきなり使っているではないか。

今のところ、お仕事でもPWMは使ったことがない。
サーボモータやLEDで試しておきたいところだ。

ん、ってことはサーボモータのライブラリをLED制御に使うと簡単なのかな?
と思ったら、それも本に書いてあった。
パルス幅が違うとか、そんなことを書いているようだ。

PWMでのLED制御も本に載っているから、試してみようかね。

[arduino]RC-S620/SからSNEP PUTする

昨日、スタックが足りんと騒いでいたが、cygwinでデバッグしていたコードが残っていた。
printf()しているだけだったのだが、削ると小さくなった。
あまり確認していないが、動いているから動いているんだろう。

 

ある程度、RC-S620/SからSNEP PUTできたので、githubに置いた。

https://github.com/hirokuma/ArduinoHkNfcRw

 

ArduinoのライブラリはC++クラス、みたいなことが書かれていたのでそうしたのだけど、普通のCでもいいんじゃないかな。
今回のだって、結局はstaticメンバ関数しか持たせてないので、インスタンスを作ったりしないのだ。
複数接続しても使えるようにする、とかかな?
まだ慣れていないということで、大目に見てほしい。

 

サンプルは、

  • NFC-Fを500msごとに検出する
  • SNEP PUT(initiator)で「http://www.google.co.jp/」のURIを飛ばす(「http://www」と「google.co.jp/」)

の2つ。
動作確認は、Arduino Uno R3 + RC-S620/S。

image

RC-S620/Sの上に載っているのは、弁当のふた。
FM3基板のセットをケースに収める際に、グルーガンで撃ってそのままにしているのだ。
Arduinoの下にあるブレッドボードに何か挿してあるが、単に片付けてないだけだ。
接続しているのは、RX/TXと、5V/GNDだけ。

 

SNEPのinitiatorにしたのは、動作確認がしにくかったため。
targetでやっていたのだが、搬送波が出ないので、どこまで動いたかわからんかったのだ。
ポートが一杯あるからロジアナでデバッグするという手も使えるのだが、めんどくさくてね(ロジアナを出すのが)。。。

Arduino風にデバッグするとしたら、やはりソフトウェアでUARTを実現して、既存のUARTをシリアルデバッグ出力に使う、ということになるのかな。
まあ、そこら辺はこれから調べればいいや。


上の写真を見ると、Arduinoの左側にごにょごにょとした図柄があるのがわかるだろうか。
これは、スターターキットに付属した木の板で、単に刻印というか、絵が描いてあるだけだ。
何もなくても動作にはまったく関係ないのだが、こういう細かいところはいいな、と思う。
(足がはまっている部分がわかりにくくなる、という利点もあるのだ)

2013年1月19日

[arduino]自作NFCライブラリを使うとスタックが足りないっぽい

Arduinoスターターキットに入っていた本を順番に試していくのもいいかと思っていたが、やっぱりNFCに関係したことをやるのが私らしいだろう。
まあ、ハードの勉強も一緒にやるさ。

そんなわけで、以前作っていたArduino用NFCライブラリ for RC-S620/Sを使ってみた。


InListPassiveTargetして、NFC-Fを検出したらLEDを点灯させる、というところは動いた。
スケッチも含めて一発で動いたので、さすがに驚いた。
さすが私!

 

では、とSNEP TargetでPUSHするスケッチを動かした。
これは・・・動かなかった。
そんなもんだ、私。。。


まどろみさんのところを見て、標準のUARTポートじゃないところを使う手段があることを知ったが、どういうやりかたで実現しているのか確認していないし、なによりも初心者ってこともあるので、まずは標準UARTポートを使っている。
Arduino+RC-S620/SでSoftwareSerial通信が上手くいかない

 

エラーになったら、自作Abort関数を呼び、Arduino上のLEDをちかちか無限ループさせるようにしている。
いるのだが、なぜか点灯したままになるのだ。
なして?

setup()のポート設定後くらいにAbortを呼んでも、同じ。
ってことは、どうもロジック的な問題じゃなさそうだ。

よくわからんので、Abort呼び出しの直後に、while(1){}、とそれから先に進まないようにした。
すると・・・LEDがちかちかし始めた。
ロジックは変わってないので、違う原因だ・・・。

スケッチのサイズを見ていて気付いたのだが、avr-gccはよくできていて、while(1){}以降の関数は呼び出されることがないため、リンクレベルで捨てていてサイズが小さくなっている。
なので、setup()直後でAbortとwhile(1)するとサイズが小さいのだが、それをどんどん後ろにずらしていくとスケッチサイズが増えていく。
そして、あるところから先になると、while(1)をしてもLEDが点灯しっぱなしになった。
そこはちょうど、SNEPの処理を始める部分だ。

 

ってことは、スタックが足りなくなってプログラムカウンタがどっかに吹っ飛んでるんだろうな。
SNEPの処理をやると、LLCPや、NFC-DEPまでリンクすることになってしまう。
FM3みたいにメモリが多い環境では動いていたのだが、Arduino Unoでは足りなかったようだ。

Arduino UnoのRAMは・・・2KBか。
2KBでは、汎用に作ったSNEPでは足りないように思う。
FLASHは32KBで余裕があるので、送受信バッファを共用しつつ、処理速度を犠牲にしていけばなんとか・・・。
と思わなくもないが、そこまでしてSNEPしたいか?というと、そうでもないかも。


やるかどうかは別として、MAPファイルで確認くらいはしておきたい。
MAPファイルの出力方法はわからなかったが、Documents and Settingsの下にELFファイルができていることに気付いた。
(Arduino IDEを起動したままTempフォルダの整理をしてばしばし削除した後にビルドすると「フォルダがない」というエラーが出たのでわかった)。
ELFの見方は、BINARY HACKSで調べた。
.BSS(グローバル変数の初期値無し)と.DATA(グローバル変数の初期値有り)を見ればいいのかな。

[/cygdrive/c/Documents and Settings/xxxx/Local Settings/Temp/build4506488131124712308.tmp]$ readelf -S SnepTarget.cpp.elf
There are 16 section headers, starting at offset 0x264c0:
 
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .data             PROGBITS        00800100 003cf0 000bd8 00  WA  0   0  1
  [ 2] .text             PROGBITS        00000000 000094 003c5c 00  AX  0   0  2
  [ 3] .bss              NOBITS          00800cd8 0048c8 00047f 00  WA  0   0  1
  [ 4] .debug_aranges    PROGBITS        00000000 0048c8 000920 00      0   0  1
  [ 5] .debug_pubnames   PROGBITS        00000000 0051e8 001844 00      0   0  1
  [ 6] .debug_info       PROGBITS        00000000 006a2c 00bb4f 00      0   0  1
  [ 7] .debug_abbrev     PROGBITS        00000000 01257b 002c8f 00      0   0  1
  [ 8] .debug_line       PROGBITS        00000000 01520a 006325 00      0   0  1
  [ 9] .debug_frame      PROGBITS        00000000 01b530 000fc0 00      0   0  4
  [10] .debug_str        PROGBITS        00000000 01c4f0 003715 01  MS  0   0  1
  [11] .debug_loc        PROGBITS        00000000 01fc05 005f68 00      0   0  1
  [12] .debug_ranges     PROGBITS        00000000 025b6d 0008b0 00      0   0  1
  [13] .shstrtab         STRTAB          00000000 02641d 0000a2 00      0   0  1
  [14] .symtab           SYMTAB          00000000 026740 0019e0 10     15 220  4
  [15] .strtab           STRTAB          00000000 028120 0016c9 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

 

足すと、4183byte。
あっはっは、スタックどころかRAM自体が全然足りてないやん。。。。

さて、どうしたもんだか。
動いているときの状況でも、1600byte以上使っているので、もともと多いんだ。
そういえば、空っぽの場合はどのくらいなんだろう?
裏で動いているものもあるだろうから、調べておきたい。

[/cygdrive/c/Documents and Settings/xxxx/Local Settings/Temp/build4038602356621893896.tmp]$ readelf -S empty_sketch.cpp.elf
There are 15 section headers, starting at offset 0x1740:
 
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000074 0001d2 00  AX  0   0  2
  [ 2] .bss              NOBITS          00800100 000246 000009 00  WA  0   0  1
  [ 3] .debug_aranges    PROGBITS        00000000 000246 000090 00      0   0  1
  [ 4] .debug_pubnames   PROGBITS        00000000 0002d6 0000cd 00      0   0  1
  [ 5] .debug_info       PROGBITS        00000000 0003a3 0005c5 00      0   0  1
  [ 6] .debug_abbrev     PROGBITS        00000000 000968 000271 00      0   0  1
  [ 7] .debug_line       PROGBITS        00000000 000bd9 000635 00      0   0  1
  [ 8] .debug_frame      PROGBITS        00000000 001210 0000c0 00      0   0  4
  [ 9] .debug_str        PROGBITS        00000000 0012d0 0001ec 01  MS  0   0  1
  [10] .debug_loc        PROGBITS        00000000 0014bc 00016d 00      0   0  1
  [11] .debug_ranges     PROGBITS        00000000 001629 000078 00      0   0  1
  [12] .shstrtab         STRTAB          00000000 0016a1 00009c 00      0   0  1
  [13] .symtab           SYMTAB          00000000 001998 000610 10     14  39  4
  [14] .strtab           STRTAB          00000000 001fa8 000372 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

9byteとは、お主なかなかやるな。

ここにdelay()を加えると、こうなる。

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000074 000290 00  AX  0   0  2
  [ 2] .bss              NOBITS          00800100 000304 000009 00  WA  0   0  1

RAMは変わらんけど、コード量が増えた。
複数のタイマを管理する、という必要がないからRAMは最初に1つ確保しておけばいいということか。
ふーむ。

 

とにかく、2KBのRAMをうまく使うためには、ライブラリにもそれなりの制約を設けないとだめだな。