マイコン工作実験日記

Microcontroller を用いての工作、実験記録

RX-8025NB

2014-12-30 18:35:45 | FRDM
温度/気圧の記録で使用するために、RTCとしてRX-8025NBを追加しました。



KL25にはRTC機能が備わってはいますが、FRDM-KL25Zでこの機能を使うためには
  1. 外部の32KHz発振器をクロック源とする。
  2. 内臓の1KHz LPO発振器をクロック源として使用する。
のいずれかの方法をとる必要があるようです。KL25はクリスタル接続用の端子を一組しかもっていないので、メインのクロック発振用とRTC用のクリスタルのふたつを別々につなぐことができないためです。LPO発振器は時計として使うだけの精度はありませんので、やはりクリスタルを使いたいところです。FRDM-KL25Zではメインのクロックとしてすでに8MHzのクリスタルがつながっているので、RTC用のクロックは別に用意しなけれなならないのです。

32KHzの発振器を探してつなげればKL25Z内臓のRTC機能を使うことができますが、入手性と消費電流の少なさからRX-8025NBを使うことにしました。

どうやらKinetisではKLシリーズのMCUはどれも、クリスタル発振器はひとつしかつなげられないようです。KL25では32Kクリスタルを発振させてシステムクロックとして使用することも可能ですが、そうするとUSBに必要な48MHzが作れなくなってしまいます。

消費電流確認

2014-12-21 22:59:02 | FRDM
M24SRへの書き込みは問題無くできるようになったので、ボード全体の消費電流を確認しておくことにしました。これまでは動作状況確認用にOpenSDAの仮想COMポートを使ってメッセージの出力をおこなっていましたが、電池動作させるためにはこれを止めるようにせねばなりません。すでに先の記事にも書いたようにJ3のジャンパを用意してありましたが、この記事によればJ14とJ20もカットする必要があるとのことなので、対処しておきました。また、この記事と同じく内蔵CR発振器を使って生成したクロック4MHzで動作させ、VLPRモードで計測を実施しています。計測間隔は30秒に1回で、その間はSTOPモードに遷移してDeep Sleepさせています。

秋月の大気圧センサーモジュールには、通電されていることを表示するLEDが実装されていますが、消費電流の観点からすれば常時点灯するLEDなんて大飯ぐらいなので、除去しちゃいました。また計測時間待ちの間はセンサーもパワーダウンモードに設定することで消費電流を節約します。




消費電流はもう1枚のFRDM-KLZ25ボードから3.3Vを供給することで計測しました。



UART出力を使わなくなったこともあり、Deep Sleep時のボード全体での消費電流もおよそ13uAに抑えられています。これなら電池で動かしても心配ありません。

アプリの必要性

2014-12-13 15:38:18 | Weblog
前回の記事ではTagに温度、気圧を表示するためのURIを書き込むことで、メータ表示を実現しました。この方法は、自分でアプリを開発しなくてもNFCタグを検出するとAndroid側がブラウザを開いてくれるために大変お手軽です。しかしながら、サーバ側に簡単なスクリプトを用意しなければなりません。

使っているM24SRのEEPROMには8KBもの容量があるので、表示に必要なHTMLファイルをタグ側に書き込んでおき、それをAndroidで読み込んで表示できればサーバを不要にできます。調べてみると、NDEFファイルのレコードの型には文字列やURLだけでなく MIMEタイプも指定できるようになっています。この仕様に従って、MIMEタイプとしてtext/htmlを指定してやれば、NDEFデータ本体にHTMLテキストを書き込んでやることができます。早速実験してみました。




試験データをM24SRに書き込んでみて、それをTagInfoで確認するとちゃんとデータを読み取れています。しかしながら、Nexusをこのタグにかざしても書き込んだHTMLのデータを表示することはできませんでした。AndroidがTAGから読み込んだデータを作業領域にいったん保存して、それをファイルとして開いてくれることを期待していたのですが、どうやらそのような機能は備わっていないようです。

検索してみたら、次の情報が見つかりました。
http://stackoverflow.com/questions/23108300/nfc-ndef-mime-type-text-html

やはり同じようなことを考える人はいるもんですね。安価なNFCタグシールは容量も小さいのでURLくらいしか記録できませんが、MR24SRのようなものでは容量も大きいので、text/htmlが読めれば便利だと思うのですが。。。

いくつかNFCアプリをインストールして試してみたのですが、text/htmlを読んで、その内容を開けるものはありませんでした。やはり自分でアプリ作るしかないんでしょうか。そこまでやるのは、おっくうなんですが。。

温度と気圧をメータ表示する

2014-12-10 12:25:08 | FRDM
M24SRへの書き込み方がわかったので、LPS25Hで計測した温度と気圧を書き込んでみました。単純にテキストで温度と気圧を表示しただけではつまらないので、チョットだけ手を加えてメータ風に表示してみました。Nexus 7をタグの上にかざすと、ブラウザが開いて温度と気圧をメータ表示してくれます。



M24SRに書き込んでいる内容は、Smart Poster形式のNDEFデータです。これは、タイトル文字列を持つテキストと、表示すべきページのURLのふたつのデータを持つ複合データ形式です。これをわたしのNexus 7で読み取ると、書き込んであるURLのWeb ページが表示されます。タイトルの方は表示されないのですが、あらかじめ起動しておいたアプリで読み取るとタイトルが表示されることもあるようです。

メータ表示はブラウザにやらせており、Nexus上に特別なアプリは必要ありません。実際にタグに書き込んでいるデータは次のようなURLです。

http://sirius506.chips.jp/ptest.php?temp=19.43&hpa=1017.54

サーバ上のPHPスクリプトに気温と気圧のデータを渡しているだけですので、マイコン側では何も描画に関わる処理はしていないことになります。あとはすべてサーバとブラウザにお任せというわけです。




サーバ側の処理も手抜きしてあります。メータ表示にはGoogle ChartsGaugeを使用しており、ほとんどサンプルコードをコピペしたようなものです。

現在10秒おきに計測をおこない、タグの内容を更新しています。室内の気温と気圧なんてそんなに頻繁に変化するわけではないので、30秒とか1分間隔でも充分かとも思います。M24SRにはRFでのセッションが開いたことを検出して割り込みをかける機能も用意されています。これを使えば、通常はスリープさせておき、割り込み信号でWakeupさせてから計測をおこなってタグデータを更新するという方法も考えられます。

M24SRへの書き込み

2014-12-07 10:20:10 | Weblog
M24SRへの書き込み手順がわかったので、メモしておくことにします。
  1. KillRFsessionコマンドを送る
    M24SRではRF側とI2C側の両方からタグデータに対してのアクセスが可能ですが、両方か同時にアクセスすることはできません。アクセス手順に先立って、まずはアクセス権を取得しておく必要があります。I2C側からKillRFsessionを送ることで、I2C側からのアクセス権を取得することができます。このコマンドは、進行中のRFアクセスがある場合には、それを中断してI2C側のアクセス権を取得してくれます。このコマンドの送信は、具体的にはコマンドデータとして 0x52の1バイトを送信してやるだけです。
  2. NDEF Tag Application Select commandを送信する
    NDEF TAG applicationを活性化するためのSelectコマンドをI-Block形式で送信します。C-APDU形式での送信内容はデータシートに明記されていますが、実際にこれをI2Cで送信する際にはI-Block形式になっていなかればならないので、C-APDUデータの前に1バイトのPCBと、後ろに2バイトのCRCを付加してやる必要がある。そのため、実際の送信バイト数は16バイトになる。
  3. 応答を読み取る
    5バイトの応答を読み取る。応答もまたI-Block形式なので、最初の1バイトがPCBで終わりの2バイトはCRC。正常終了であれば2バイト目と3バイト目が0x90, 0x00となる。
  4. 正しい手順としては、続いてCapability ContainerをSelectして、その内容を読んでおくべきなのですが、特にその内容を参照/変更する必要がなければ、この手順は省略可能。
  5. NDEF Selectコマンドを送信して、最初のNDEFファイルを選択する。
    これまたI-Block形式で送信。PCBのBlock numberビットを反転させる。
  6. 5バイトの応答を読み取る
    I-Blockでの応答を読み取る。応答のI-Blockも反転されている。
  7. UpdateBinaryコマンドを使って書き込むタグデータをI-Block形式で送信する
  8. 5バイトの応答を読み取る
  9. Deselectを送信する
    タグへのアクセスの終了を示すためにDeselectコマンドをS-Block形式で送信する。具体的には 0xC2, 0xE0, 0xB4の3バイトをI2Cで送信する。最初の1バイトがDeselectを示し、残りの2バイトがCRC。
  10. 3バイトの応答を読み取る
    応答内容もDeselectを示す3バイトである。

手順そのものはISO14443AとNDEF Type 4 Tagに準拠したものなので、両標準資料を読んでおえば理解が深まります。手順は最後のDeselectの応答までキチンと読み取ることが重要です。Deselectコマンドを送信しただけだと、タグデータへのアクセス権はまだI2C側に与えられてままになっています。応答を読み取ることで、I2C側に与えられたアクセス権が解除されます。

Deselectを忘れるとI2C側がアクセス権をつかんだままになってしまうので、RF側からスマホやタブレットでアクセスしてもデータが読み取れないので注意。

M24SRを追加

2014-12-04 22:54:43 | FRDM
電池駆動のお膳立てはできましたが、前記事で書いたようにOpenSDAが使えないのでなんらかの出力表示方法を用意せねばなりません。そこで、今回のプロジェクトでは、こいつを投入することにしました。



積み基板となっていたM24SRです。I2CでつながるNFCタグです。今回は、LCDのような表示器は用意せず、気圧や温度のデータはNFCタグに書き込むことにします。それをスマホやタブレットで読めば、表示装置は不要になるというわけです。

以前、Bluetoothのペアリング用にTIのRF430CL330Hを使いました。TIのタグはRAMでデータを保持していたので、タグを動作させるためには電源を供給する必要がありました。M24SRは不揮発性メモリにタグデータを保持するうえに、RFで受ける電力だけで動作することができます。したがって、いったんタグデータを書き込んだら、マイコン側の電源を落としてしまってもかまいません。

M24SR基板を積み重ね。うーん、3段はチィっと見苦しいな。




M24SRへのデータの書き込み方を調べて、ソフトを書き始めたところです。