Vol.855 28.Oct.2022

ボタン電池の種類と記号 IRリモコン(2)〜SMTによる解析

B ボタン電池の種類と記号

by fjk

 世の中には多種類のボタン電池が売られていますが、SR927W、SR927SWなど微妙に型番が異なり、価格も異なるので、購入を躊躇することがあります。
 まず、先頭の文字には、SR(酸化銀電池)、LR(アルカリボタン電池)、CR(リチウム電池)の3種類があり、その特徴は、
@ SR−酸化銀電池(1.55V)
酸化銀電池の特徴は「安定の持続性」で、電池の残量が無くなる直前まで一定の電圧を維持するため、時計のような精密機械にはピッタリ。しかし高価。。
A LR−アルカリボタン電池(1.5V)
アルカリ電池は酸化銀の替わりに二酸化マンガンを使用した安価な電池で、SRと比べて寿命が短い。価格はSRより安価なので、オモチャや、安価な時計に使われている。LRを使用する製品の多くはSRを使うことができる。
B CR−リチウム電池(3V)
リチウム電池は非常に長持ちする電池で、記憶保持などに優れており、デジタル時計や電子キーなどによく使用されている。

 語尾の文字にはSWとWの2種類があり、(「文字無し」は水酸化カリウム溶液使用でWと同じ)

 LEDライト付時計などでWを指定されている場合、SWを使うと正常に動作しなかったり、不具合を起こすことがある。逆にSW使用機器にWを使っても全く問題は無い。

 更に詳しい情報は以下などを参照
パナソニック   ・マクセル   ・プララ


R 赤外線リモコン(2) 〜SMTによるコード解析

by fjk

 赤外線リモコンの送信データを調べるため、PICを使ってリモコンコード解析器を作成した。リモコンのパルス幅の計測にはSMT (Signal Mesurement Timer)を使うことにした。SMT は、高度なクロックおよびゲーティングロジックを備えた24ビットカウンターで、パルス幅、周波数、デューティ サイクル、および 2つの信号のエッジ間の時間差など、さまざまなデジタル信号パラメーターを測定できる。SMT の機能は、@ 24ビットタイマー/カウンター、A 24 ビット測定キャプチャ レジスタ、B 24 ビット周期一致レジスタ、C 相対タイミング測定を含むマルチモード動作、D周期一致と取得完了で割り込む。
 SMTの詳細は TB3129 (Microchip、日本語)を参照。。
  

SMTのブロックダイヤグラム

赤外線受信モジュール
(GP1UXC41QS)

SMTのモード
@ 24ビットタイマ・・・・・・・・・・・ 単純な24ビットタイマー
A ゲート付きタイマ・・・・・・・・・・ ゲート信号がHighの期間のみカウント
B 周期/デユーティサイクル計測・・・・ Highパルス幅と周期を計測
C HIGH/LOW時間計測・・・・・・・・ Highパルス幅とLowパルス幅の計測
D ウィンドウ付き計測・・・・・・・・・ 窓信号の周期を計測
E ゲートおよびウィンドウ付き計測・・・ 窓信号の周期間、他の信号のHigh時間をカウント
F Tim of Flight・・・・・・・・・・・・ 2つの入力の立上りエッジ間の時間をカウント
G 24ビットキャプチャー・・・・・・・・ 立上りと立下がりの間の差を計測
H 24ビットカウンタ・・・・・・・・・・ 単純な24ビットカウンタ
I ゲーツ付きカウンタ・・・・・・・・・ ゲート信号がActive間、他のパルス数をカウント
J ウィンドウ付きカウンタ・・・・・・・ 窓信号がActive間、他のパルス数をカウント

 今回は、HIGHパルスとLOWパルスの両方のパルス幅を測定したいので、「HIGH/LOW時間計測モード」を使用することにした。
 HIGH/LOW時間計測モードは、入力信号の立ち上がりエッジで SMTxTMR のインクリメントを開始し、その値で SMTxCPWレジスタを更新し、立ち下がりエッジで SMTxTMRをリセットして、再びインクリメントを開始する。別の立ち上がりエッジを観測すると、SMTxCPRレジスタを現在の値で更新し、SMTxTMR値をもう一度リセットして、再びインクリメントを開始する。
  

HIGH/LOW時間計測モード

 解析器のプログラム作成には「はじめてのPIC」さんを参考(というより、ほぼそのまま)にさせていただいた。MCCの設定、プログラムの詳細などはオリジナルを参照のこと。なお、パソコン(windows10)端末にはテラターム(9,600bps)を用いた。
 なお、オリジナルからの追加・変更点は、

  1. 使用PICをPIC16F1619(RAM = 1024byte)から、手持ちのPIC16F18424(RAM = 512byte)に変更
  2. システムクロックを4MHzから、32MHzに変更(SMTのプリスケーラ=「1:8」)
  3. PPSを使って、SMT信号入力をRC7からRA2、TXをRB7からRA5、RXをRB5からRC5に変更
  4. パルス幅測定だけでなく、ビット判定と1バイト(8ビット)毎のコードデータ取得・送信を追加

【注意・問題点】

  1. RS232C→USB変換に「FT234X超小型USBシリアル変換モジュール」(秋月、M-08461、@680)を用いた。このモジュールは5Vトレラント機能があり、5V信号を直接接続することが出来る。ただし、PICのTxはFT232XのRxに接続すること。
  2. PIC16F18424はメモリが少なく、パルス幅配列データは75しか使えず、RAM使用率が99.4%とほとんど余裕がない。IOデータのリモコン信号(2フレームNECフォーマット)は何とか受信・解読できたが、もっとコードが長い場合や機能を追加するには、メモリ容量の大きいPICを使う必要がある
 

赤外線リモコン解析用回路図(電源はUSBから)
 

リモコン解読用試作回路(SMT1SIG は RA2)

テラターム画面例

 赤外線コードデータは当初32ビット変数を用いたが、何故か32ビット変数のシフトが正しく機能せず、メモリも少ないことから、8ビット単位で求めることにした。
 値が0の1バイト(ird)と、LSBのみが1のシフトバイト(sbt)を準備し、赤外線データビットが’1’ならirdにsbtを加算し、その後sbtを左に1ビットシフトし、同じように赤外線データの8ビット分を取り込むと、1バイトの16進データとしてパソコンに送信し、これを繰り返している。

 IOデータのリモコンコードは、カスタマコードの2バイト、データコードの2バイトのフレームを送信し、続けて43ms後に、更に次のフレームデータを送り、併せて16ビットのデータとしている。
  <ボタン’3’を押したとき>
   80H、E8H、84H、7BH, − 80H、E8H、30H、CFH (フレームの4バイト目は3バイト目のビット反転データ)

【プログラム(abc855_main.c)】  赤字オリジナル(初めてのPIC)に追加・変更したところ。

#include "mcc_generated_files/mcc.h" 
#define maxdata 75                                  // 配列データの最大値は75

	・・・    

void main(void){ 
    uint8_t ird;                                    // 赤外線データ
    uint8_t sbt;                                    // ビットセット用シフトバイト
    uint8_t bct;                                    // 有効ビットカウンタ

    SYSTEM_Initialize();                            // デバイス初期化
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();

    while (1)                                       // 赤外線信号受信 繰り返し
    {
      	  ・・・
	
        // ---------- 赤外線信号を受信する --------

      	  ・・・

        //------------ 受信結果を送信する -------
        SMT1CON1bits.SMT1GO = 0;                    // 測定終了
        printf(" -  mark  space (us)\r\n");         // タイトル送信
        ird = 0;
        sbt = 1;
        bct = 0;
        for(char i=0;i < p_PW;i++){                 // 保存した時間を送信
            printf("%2d %5d",i,(uint16_t)PW[i]);    // mark時間
            if(PR[i]==0) {                          // 無信号なら
                printf("    ---\r\n");              //  「---」を送信
            }else if(PR[i] > 0){                    // 10ms未満なら
                printf("  %5d",PR[i]);              //   us単位で送信(改行を外す)
                if(PW[i]<900){                      // markが900us未満なら
                    if(PR[i]<2000){                 // spaceが2000us未満なら
                        if(PR[i]>900){              // さらに、spaceが900us以上なら
                            ird |= sbt;             // シフトバイトを加える
                            printf("  1");
                        }else
                            printf("  0");
                        sbt <<= 1;                  // シフトバイトを左にシフト
                        bct++;                      // 有効ビットカウンタを1増やす
                        if((bct % 8) == 0){         // カウンタ値が8の倍数なら
                            printf(" >> %02XH",ird);// 16進数に変換し送信
                            ird = 0;                // 赤外線データをクリア
                            sbt = 1;                // シフトバイトも初期化
                        }
                    }
               }
               printf("\r\n");                      // 改行コードを送信
            }else{                                  // 10ms超(負数)なら
                printf("%7d ms\r\n",-PR[i]);        //   ms単位で送信
            }
        ]
        if(p_PW >= maxdata){                        // バッファ満杯なら
            printf("-- Buffer Full --\r\n");        //  Buffer Full 送信
        }
    }
}

 

LCD-DTVRC4のリモコンの全コードデータ

LCD-DTVRC4

★★★リコモンコードで「前チャンネル」が抜けていました


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


ボタン電池の種類と記号 IRリモコン(2)〜SMTによる解析