Vol.857 25.Nov.2022

CSVファイル取り込み IRリモコン(4)〜リモコン送信機

E EXCELでテキスト(CSV)ファイルからデータを取り込む

by fjk

 テキスト形式で記録したデータは、以下の手順でエクセルに取り込むことが出来る。なお、テキストファイルの形式は、データが「カンマ」で区切られたCSVファイル、または「空白」で区切られたファイルなどが対象となる。なお、取り込み形式の編集には、Power Queryエディッタを利用する。

  1. 取り込みたいセル位置を指定後、「データ」タブで、「テキストまたはCSVから」を選択
  2. ファイルリストで取込ファイルを選択 (ファイルが表示されない場合「全てのファイル」を指示)
  3. 行単位でデータが読み込まれ表示されるので、ファイルを確認後、「データの変換」を選ぶ
  4. PowerQueryエディッタが開くので、「行の分割」「区切り記号による分割」を選択
  5. 区切り記号による列の分類が開くので、「コンマ」などを選択
  6. 列が分割されて表示されるので、確認後、「閉じて読み込む」を選択」

これで、エクセルにデータが取り込まれる。テーブルの表示形式は右上の「テーブルスタイル」で変更。

     

1.「データ」タブで・・

2.取り込みファイルを選択

3.内容確認後「データ変換」

4.PQエディッタで、行分割・・

5.区切り記号に「コンマ」

6.確認したらPQエディッタを閉じる

元のテキスト(ログ)ファイル
テキストファイルを

エクセルに取り込む

Excelに取り込み終了


R 赤外線リモコン(4) 〜リモコン送信機(DSM利用)

by fjk

 PICによる赤外線リモコン信号は、@PWMによる38kHz搬送波の作成、ADSMによる搬送波のON/OFFの手順で作成した。


リモコン試作回路図
(irLEDはOSISFU5111C-40)

試作リモコン
(PIC16F18424使用)

@PWMによる38kHz搬送波の作成
PWM周期の指定は、MCCのTimer2で、Period = 26,312usとすることで38kHzに設定した。
【MCC System】
Oscilator: HFINTOSC
Clock: 32Mhz
Diveder: 1
【MCC Timer2】
Enable Timer 'ON'
Source: FOSC/4
Period:: 26.312 us
【MCC Pwm6】
Enable PWM ‘ON'
Timer: Timer2
Duty: 50 (%)

搬送波のオシロ波形(dutyは1/2)

周波数を測定すると38.14kHz、duty:49.2%
ADSMによる混合波の作成
 DSM(Data SignalModulator、データ信号変調器)は。データ信号に搬送波信号を混合した変調信号を出力するモジュールで、データ信号のH/LでH入力搬送波とL入力搬送波を切り替えることができる。また、MDCARxレジスタのSYNCビットで、搬送波との同期や極性を指定できる。
 信号は内/外部信号を利用できるが、ソフトで制御するにはMDCONレジスタのMDBITに0か1を入力する。なお、MDBITを使うにはMDSRCレジスタでデータ入力をMDMS = 0000(MDBIT)にすること。

DSMのブロック図
【MCC DSM】
Mod.Source = MDBIT
High Carrier= PWM6
Low Carrier= LC1_out
Synchrorizeにチェック
(搬送波と同期)

★PIC16F18313/325などではDSM搬送波ソース選択でMDCx=0000とすると、Vss(Gnd)を選択することができたが、PIC16F18424/426では「Pin selected by MDCARLPPS」に変更され、搬送波ソースとしてGndの選択が出来ない。さらに、搬送波入力用に入力ピンを使いたくないので、CLCを使ってPIC内部でGnd信号を作り、L搬送波ソースの入力とした。
 MCCでCLCを選ぶとGUI設定ツールが起動し、Modeは「OR-XOR」を選択。CLCの4入力は全てPwm6とし、Norゲート入力は1つのみ接続(ゲートの無接続入力は0とみなされる)。同じ信号をXORに入力することで、どんな入力でも出力は0(Gnd)となる

CLCのGUI設定ツールで設定
B 動作テスト
(各ピンのCustomNameは、RC0="SwRC0"、RC1="SwRC1"、RC2="SwRC2")
 赤外線波形をオシロで見ると、チャンと変調コードが出力されている。送信プログラムは、8バイトのデータをそのまま送る方法と、カスタム2バイトおよびデータ2バイトから、送信コードを作成して送る2つの方法を試みたところ、どちらの方法でも、チャンネルを選ぶボタンを押すと、リモコンデータが送られ、チャンとチャンネルが切り替わった。
 パソコンで、オリジナルのリモコンと送信データを比較したところ、同じであることも確認できた

試作品の赤外線Tr出力波形
(下段は拡大波形、搬送波38kHz)
反転波形だが・・チャンと発光

受信データの比較
(左:origal、右:試作品)

abc856解読器
コードを確認

【プログラム】 (abc857-main.zip)

/*=== TV Remote Controler (IO-data ) ===*/

#include "mcc_generated_files/mcc.h"

#define	MARK()		__delay_us(562)
#define SPACE_1()	__delay_us(1686)
#define SPACE_0()	__delay_us(562)
#define LEADER_1()	__delay_us(8992)
#define LEADER_0()	__delay_us(4496)
#define GYAP_0()	__delay_ms(43)

#define DSM_1()		(MD1CON0bits.MD1BIT = 1)
#define DSM_0()		(MD1CON0bits.MD1BIT = 0)

#define IO_CUSTOM	0xE880

/*----------    ----------*/
uint8_t  IO[][8] ={{0x80,0xE8,0x84,0x7B,
                    0x80,0xE8,0x10,0xCF},
                   {0x80,0xE8,0x84,0x7B,
                    0x80,0xE8,0x20,0xCF},
                   {0x80,0xE8,0x84,0x7B,
                    0x80,0xE8,0x30,0xCF}};
			
uint16_t IO2[] = {0x1084,0x2084,0x3084};

uint8_t  sft;
uint16_t wsft;


/*---- Send Ir_Leader ---*/
void Ir_Leader(){
    DSM_1();            // send Leader
    LEADER_1();
    DSM_0();
    LEADER_0();
}

/*---- Send Ir_Stop  ---*/
void Ir_Stop(){
    DSM_1();
    MARK();              // send stop
    DSM_0();
}

/*--- Send strings of IRcode -----*/
void Ir_Send(uint8_t *dt,uint8_t x){
    for (int j=0;j < x;j++){
        sft = 0x01;
        for(int i=0;i<8;i++){
            DSM_1();
            MARK();
            DSM_0();
            if(dt[j] & sft)  SPACE_1();
            else             SPACE_0();
            sft <<= 1;
        }
    }
}

/*------- Send IOdata code -------*/
void IO_DATA(uint8_t c){
    Ir_Leader();            // Leader Start
    Ir_Send(&IO[c][0],4);   // Send Data1
    Ir_Stop();              // Stop
    GYAP_0();               // Gyap time
    Ir_Leader();            // Leader Start
    Ir_Send(&IO[c][4],4);   // Send Datae2
    Ir_Stop();              // Stop
}

/*-------- Send word of IRcode ------*/
void Ir_Send2(uint16_t wd){
    wsft = 0x0001;
    for(int i=0;i<16;i++){
        DSM_1();
        MARK();
        DSM_0();
        if(wd & wsft)   SPACE_1();
        else            SPACE_0();
        wsft <<= 1;
    }
}

/*-------- Send IOdata2 IRcode  ----*/
void IO_DATA2(uint8_t c){
    uint16_t w = IO2[c];
    uint16_t wLo = (w & 0x00FF)
                | ((~w << 8) & 0xFF00);
    uint16_t wHi = ((w >> 8) & 0x00FF)
                | (~w & 0xFF00);
    Ir_Leader();            // Leader Start
    Ir_Send2(IO_CUSTOM);    // Send Custom  
    Ir_Send2(wLo);          // Send Data1
    Ir_Stop();         	    // stop
    GYAP_0();               // Gyap time
    Ir_Leader();            // Leader Start 
    Ir_Send2(IO_CUSTOM);    // Send Custom  
    Ir_Send2(wHi);          // Send Data2
    Ir_Stop();              // stop
}

/* =====  Main application ====== */

void main(void)
{
    SYSTEM_Initialize();

    while (1){
        if(PORTCbits.RC0 == 0){
            IO_DATA(0);
        }else if(PORTCbits.RC1 == 0){
            IO_DATA2(1);
        }else if(PORTCbits.RC2 == 0){
            IO_DATA2(2);
        }
        __delay_ms(500);
    }
}

/**==== End of File ====*/


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


CSVファイル取り込み IRリモコン(4)〜リモコン送信機