2014年9月24日水曜日

自転車ビーコンの回路図

自転車ビーコンの回路図を、BSch3Vで描いてみました。

自転車ビーコン送信機
受信機はDIP版とSMD版があり、ピン番号が違います。現在使用しているのはSMD版です。

自転車ビーコン受信機(SMD版)

自転車ビーコン受信機(DIP版)
実物では、
  • ファームウェア書き換え用のピンヘッダまたはピンソケットを接続
  • モード設定ビット端子(M1,M2,M3)をピンヘッダ/ソケット化
 が追加されています。これらは動作時には不要なため、回路図では省略しています。モード設定ビット端子は、使用時はファーム書き換え用ピンソケットのGNDに接続し、書き換えおよび設定変更時には抜いています。

2014年9月23日火曜日

自転車ビーコンの使い勝手向上計画

 リモコン送信機のボタンが小さいため、受信機が反応するまで押し続けるのは、意外と不便な仕様です。ボタンの押しにくさのせいで受信間隔をあまり長くできず、電池持ちも思うように伸ばせませんでした。今週は、ここに改造のメスを入れてみました。

 当初の設計では、リモコン送信機を親機とし、タクトスイッチで電源をON/OFFしていました。押した間だけ電源が入り、動作中は連続送信を行います。
 これを、「チョイ押し」だけで手を離しても数秒間連続して送信を行うように改造しました。
  • 送信機をmode7(子機間欠10秒モード)とし、送信間隔を0秒としました。これで、タイマーによるWakeUpが無効となり、ボタンによる割り込みでのみWakeUpします。
  • 送信機がWakeUpしたら、mode4の送信間隔+100msの間、スリープせずにデータを32回/秒のペースで連続送信するようにしました。
  • 受信機側では、vReceiveIoData()にある親機子機の判定を無効化し、受信したデータを親機/子機の区別無く処理するようにしました。
  送信機のチョイ押しで自動的に送信を続けるので、子機の通信間隔が長くてもボタンを押すのが苦にならなくなりました。この改造に合わせて、
  • 2秒毎だった通信間隔を4秒に延長
  • ADCを行わない受信待ちだけのWakeUp時間を24msに延長
  • 連続送信の間隔を毎秒64回から32回に戻す
  • mode7のスリープ時にRAMを保持しない
という調整も行いました。これで、子機の電池は半年持つ見込みです。
 受信間隔が長いと親機の連続送信時間が延びて、親機の電池持ちは短くなりますが、スリープ時にRAMを保持しないことで待機時の消費電流を減らしました。1日1回の使用で、送信機の電池は7年以上持つ見込みです。

追記:
 この時は子機間で通信するために親子判定を無効化しましたが、子機からの宛先論理IDを親機(0x00)ではなく子機宛とし、この動作を想定するように受信時のID判定を改造するというのがToCoNet的にはまっとうな方法のようです。
  http://tocos-wireless.com/jp/products/TWE-ZERO/App_Twelite/overview.html

2014年9月22日月曜日

TWE-Lite子機間欠モードの受信動作で使えるチャンネル(2)

 子機間欠モードで受信動作をする場合、使えるチャンネルは18だけでしたが、正しくは、「ビルドの際にデフォルト値として設定したチャンネルだけ」でした。デフォルトのチャンネルを18以外にすると、そのチャンネルだけが使えるようになります。

2014年9月20日土曜日

自転車ビーコンの電池持ち問題に対する解決案

 自転車ビーコンの電池持ちが思ったより良くないので、改善を図ることにしました。

 電池が持たない最大の要因は、一回あたりのWakeUp時間が52msと長いせいだと考えられます。その大半が、IO状態の読み取りと送信待ちである事もわかりました。IO状態の読み取りは、電池残量を知る必要があるのでなくす訳には行かないのですが、頻度はある程度減らしてもいいはずです。

 IO状態の読み取りを60秒毎に1回のペースまで落とし、2秒に1回のWakeUp時間を減らしたところ、計測できる下限の4msになりました。これは、起きた直後にスリープするような感じです。しかし、ここまで短くしてしまうと、親機からのパケットを取りこぼしてばかりで、肝心のビーコンとしての動作が開始できなくなりました。
 タイミングのイメージとしては、 この図のようになります。青が子機のWakeUp時間、ピンクが親機のパケット送信時間を表しています。
  WakeUp部分を切り出しすと、下の図になります。1/32秒間隔で再送1回を伴う送信を行う場合、4msのWakeUp時間では親機のパケットの隙間に埋もれてしまい、すれ違いがちになります。
    
 WakeUp時間があまりに短いと、受信処理に支障が出ることが分かったので、スリープ前にウェイト入れてWakeUp時間を20msに延長してみました。
  かなりマシになりましたが、まだ時々取りこぼします。タイミングによっては、WakeUpが親機のパケットの隙間を縫ってしまうようです。
 ウエイトを長くしてWakeUp時間をたっぷり確保すれば確実に受信できますが、それでは電池持ちが改善されません。
 電池持ちのために受信間隔を長くするとWakeUpを長くしても電池は持ちますが、応答が悪くなってしまいます。 また、たまに取りこぼしたときのペナルティが大きくなってしまう問題もあります。

 この問題を解決するために、子機のWakeUp時間を20msにしたまま、親機のパケット送信ペースを毎秒64回に倍増することにしました。
  今度は、子機のWakeUp時間の間に、親機のパケットを確実に受信できるようになりました。
 パケット密度が高すぎて輻輳がちょっと心配になりますが、親機の電源は一日に2-3秒しかONにしませんので、この方法で行く事にします。

2014年9月18日木曜日

自転車ビーコンの電池持ち問題

 今日から自転車ビーコンの本番運用を開始しました。が、帰宅時に鳴らしたところ、早くも子機の電池警告サインが発動してしまいました。試作中に使用していた電池をそのまま使っているので、試運転で減ってはいたと思いますが、予想を上回る早さです。

 電池消費の要因は間欠受信のWakeUp時間が長いせいではと思い、vProcessEvCoreSlp()にデバッグログを追加して、状態遷移の間隔を測ってみました。すると、時刻の起点をWakeUpとした場合、
  • WakeUp 0ms
  • IO状態の確定 32ms
  • 送信完了,Sleep 48ms
  • 次のWakeUp 52ms
でした。時刻の刻みは4msです。1サイクルに52msもかかっています。

 動作中の消費電流は、Sleep時は2μA、WakeUp中は18.7mA、メロディ再生中は約21mAでした。Sleep時の電流は無視して、動作中をざっくり20mAとすると、2秒間隔の間欠モードで一日に消費する電流容量は、
(86400/2) * 0.052 * 0.02 = 44.9 [mA sec]
です。これに、1日あたり50秒のメロディ鳴動を追加すると、
44.9 + 50 * 0.021 = 46.0 [mA sec]
が、一日あたりの総消費電流容量になります。
 電源のニッケル水素電池の容量は750mAhです。満充電から1.2Vの電池警告までに容量の8割まで利用できるとすると、利用できる日数は、
0.8 * 0.75 * 3600 / 46 = 47 [日]
で、電池寿命は約1ヵ月半と予想されます。自分としては、ちょっと短いなと思います。

 子機は受信専用として使っていて、送信したデータは使っていないのですが、WakeUp中の動作時間のうち大半を、IO状態の読み取りと、読み取ったデータの送信が占めています。これはもったいない。ざっくり無効化したいところですが、IO状態の読み取りは電池残量を知るために必要なので、完全に消すと残量チェックができなくなります。ただ、WakeUpの度に毎回知る必要も無いので、もっと長いインターバルを置いて、例えば32回のWakeUpに対して1回計測するという動作にすれば、電池持ちは大きく改善できると思います。

2014年9月17日水曜日

TWE-Lite子機間欠モードの受信動作で使えるチャンネルは18だけ

 先日のエントリーで、TWE-Liteの子機間欠モードで受信を有効にしても、チャンネルによって機能しない場合があって大いに時間をロスした事を書きました。自転車ビーコンの製作が済んだので、改めて、11から26までの16個のチャンネルのうち、どれが使えるのかを調べてみました。その結果、18以外は全滅でした。親機から子機への通信が、連続モードでは動くのに、子機間欠モードにすると全く伝わらなくなります。子機から親機への送信結果は刻々と親機に表示されていたので、親機と子機でチャンネルが違っていたという落ちはありません。
 子機間欠モードで受信動作をさせる場合、使えるチャンネルは18だけです。したがって、チャンネルの住み分けでグループ化の区別をすることはできません。混信を防ぐには、アプリケーションIDの使い分けに頼ることになります。

2014年9月15日月曜日

メロディーと音で置き場所を知らせる自転車ビーコン完成

 この三連休で完成しました。左が子機、右が親機(コマンダーリモコン)です。


 LEDと圧電スピーカーを装備した子機は、100円ショップCanDoの自転車用LEDリアライトに、TWE-Lite(SMDタイプ)のハテナアンテナ型を格納しています。圧電スピーカーはサイズと音量の都合でケースの外に接着しています。
 親機のコマンダーリモコンは、MINTIA BREEZEのケースに、TEW-Lite(DIPタイプ)のPCBアンテナ型を格納しています。開閉できる蓋の中にタクトスイッチを仕込んで、押している間だけ電源が入り、毎秒32回の連続送信を行います。連続送信する親機はCR2032では賄えない電流を消費するため、電気二重層キャパシタを追加しています。
子機の中身

 TWE-Liteには、「超簡単!TWE標準アプリ」v1.7にToCoNet SDKに入っていたApp_MelodyのMML再生機能を流用し、さらに標準アプリでは無効化されていた子機間欠モードの受信動作を有効にしています。

  アンテナの設置条件は良くありませんが、メロディが聞き取れなくなる数十m先からでも反応しました。

 ソースコードは、githubで公開しています。