前報(abc858)でテレビにwindows11マシンを接続したが、テレビなので寝転がって操作をしたくなった。そこで、寝転びながらマウス操作などができる「エアーマウス」を調べて見たところ、以下のマウスが見つかった。
@トラックボール方式 指でトラックボールを回転させてポイントを指定する。ボールを回す感覚がわかりやすく、微妙な操作も可能。しかし、マウスを傾けるとボールが正しく動作しないことがある。 (エレコムM-RT1BRBK、M-RT1DRBKなど) |
|
Aジャイロセンサ方式 マウス本体にジャイロセンサを内蔵し、傾きで画面に表示されたポインタを操作する。僅かな手首の動作でも反応するため、広い範囲で素早く操作できるが、ボタンを押すときに移動するなど、微妙な指示は難しい。 (サンワサプライ400-MA134BKなど) |
|
Bタッチバッド方式 タブレットの様なタッチパッドを指でなぞり、ポイント指示する。パッドと画面が対応するので操作はわかりやすいが、パッドを保持する必要があるので、片手で操作するのは難しい。 (eWIN、W-RW010など、abc741で紹介) |
上記のうち片手で操作が可能な@とAのエアーマウスを使用してみたところ、
スタートアイコンから・・ |
前報(abc858)でIOデータリモコンを実現したが、全ての機能をカバーしていなかった。12キーのままで機能を増やすため、4つのモードを設定し、モードを切り替えることにより、48種類の機能を実現することにした。モードの切替はモードキー(RA3)を押すたびにモードが変わり、どのモードかはLEDの点滅速度でわかるようにした。電源のON/Offはモードキーの長押しで実現した。LEDの点滅にはNCOモジュールを用いた。
ハードはabc858をベースに、NCOモジュールの追加、RA3をSw_A3標準入力、RA4を NCO1OUTに設定、12キーとの配線の変更(回路図を参照)を行った他はabc858と同じ。
NCO(Numerically Controlled Oscillator:数値制御オシレータ)は20bit増分レジスタ(NCOxINC)に設定した値を加算機で20bitアキュームレータ(NCOxACC)にクロック毎に加え、NCOxACCがオーバーフローした時に信号を出すモジュールで、50%デユーティのパルス信号を出力するFDC(Fixed Duty Cycle)モードと、周期が可変で一定のパルス幅のパルスを出力するPF(Pulse Frequency)モードが選択できる。
発生出来る周波数は、2回のオーバーフローで1サイクルとなるので、下記の式となる。
20bit増分レジスタ(NCOxINCy)[y = U/H/L]は、最下位のNCOxINCLレジスタにデータを書き込むと、上位のU/Hレジスタと共にbufferレジスタに書き込まれる(U/Hレジスタに書き込んでも、NCOxINCLレジスタの書込が行われるまで反映されない)。なおbufferレジスタは読み書きできない。
演算レジスタ(NCOxACCy)は読み書き可能だが、NCO動作中にアクセスすると動作が保証されないので、NCOの動作を停止してから行うこと。
NCOのclockソースはPIC16F1842xファミリーでは NCOxCLKレジスタで11種類から選ぶことができる。今回は0.5Hzと低い周波数のパルスを得るためclockとして MFINTOSC(31.25kHz)を用い、20bitのカウンタを使うことで実現した。モードはFDCに設定。
当初、点滅の周期は、0.5〜4Hzの4種類としたが、よく使うと思われるチャンネル選択モードは、点滅では無く、約1kHzの点灯(Duty=50%、やや暗め)になるようにした。周波数と増分レジスタへの設定値は別表のとおり。
モードキーのチャタリング対策と長押しの判断には、タイマー割り込みを使わない方法を用いた(長押し判断時間はループ回数で決めている)。
★リモコンの全ボタンの動作が正常に動作することを確認したが、LED点滅だけで無く、ボタンの現在機能の表示が必要かも・・
【トラブル】
A3ポート入力確認に Sw_A3_GetValue() を用いたところ、正しい入力値が得られないことがあった。そこで、PORTAbits.RA3 を使ったところ正しい現在値が得られるようになった。
NCOのブロック図 |
NCOの主なレジスタ |
MCCピンモジュールの設定画面 |
NCO設定(MCC) パルス周波数とNCO設定値 |
4つのリモコンモードとキー対応 |
|
LCD-DTVRC4リモコン回路図 |
abc856解読器で動作確認中 |
|
MacAfee偽ポップアップの例 |
※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。