PIC 12F1822 DIでトリガーしてIr信号を出力

PICという小型だがスタンドアロンなコンピュータでデジタル入力の遷移で赤外線信号を出す回路

動作対象は、TVに付ける機器でTVの電源オンのタイミングで機器が作動し、視聴者番号を赤外線信号で通知するものです。外観を

に示します。手前の方に配置してあるのが小型基板上に作成したPICおよび周辺回路です。基板は、

35mmX25mmです。載っているPICは12F1822です。秋月では、

です。ピン配置は、

実際に使っていた基板は、

右下から伸びているリードの先には、センサーであるCDS Cellを接続してます。あまり速い応答性は必要としないのでCDSを使いました。今時CDSを使うケースは少ないと思いますが、安定して動けばなんでもおけです。5mmタイプです。

現物は、

CDSは周囲の明るさに応じてその抵抗値が変化する特性がありますから、抵抗器と直列に接続してやれば、分圧部分が変化して信号として使えます。古典的は光電変換素子ですね。さて、全体の回路図は掲載を省略します。というか、ありません。読者で同じようなものを作成したいというのであれば、なんとか作ります。同様な回路をテスト用も含めて3個使っていました。

ブレッドボード上でファームウエアのテストを重ねておけならば、基板に載せて結線します。

ファームウエアは,

/*
 * File:   newmain.c
 * Author: nao
 *
 * Created on 2020/01/27, 17:36
 */

#include <xc.h>


#define Levelpin      RA3		

#define _XTAL_FREQ 8000000	

// config 1
#pragma config FOSC     = INTOSC   
#pragma config WDTE     = OFF     
#pragma config PWRTE    = ON       
#pragma config MCLRE    = OFF      
#pragma config CP       = OFF      
#pragma config CPD      = OFF      
#pragma config BOREN    = ON       
#pragma config CLKOUTEN = OFF      
#pragma config IESO     = OFF      
#pragma config FCMEN    = OFF      

// config 2
#pragma config WRT    = OFF       
#pragma config PLLEN  = OFF      
#pragma config STVREN = ON      
#pragma config BORV   = HI         
#pragma config LVP    = OFF        

#define HIGH       1
#define LOW        0




char output[]= "011000000100001001010000000011111110";
/*
 LEADER
 * 01100000010000100101000000001111111
 
 */

void inline leadmark()
{
    unsigned int count = 9060/10;
    
    while( count --){
    		PORTAbits.RA2 = 1;
		__delay_us(10);
		PORTAbits.RA2 = 0;
		__delay_us(10);
    
    }
    PORTAbits.RA2 = 0;
    
}

void inline leadspace()
{
    PORTAbits.RA2 = 0;
    
    __delay_us(11310); // 2.6*4350
}

/* mark is 1 duration 683 0 duration 1552 */

void inline mark()
{
    unsigned int count = 683/10;
    
    while( count --){
    		PORTAbits.RA2 = 1;
		__delay_us(10);
		PORTAbits.RA2 = 0;
		__delay_us(10);
    
    }
    PORTAbits.RA2 = 0;
    
    __delay_us(4035); // 2.6*1552
}

/* space is 1 duration 683 0 duration 436 */
void inline space()
{
       unsigned int count = 683/10;
    
    while( count --){
    		PORTAbits.RA2 = 1;
		__delay_us(10);
		PORTAbits.RA2 = 0;
		__delay_us(10);
    
    }
    PORTAbits.RA2 = 0;

    
    __delay_us(1134); // 2.6*436
}

void main()
{
	int i ;

	
     OSCCON = 0b01110010 ;	
     ANSELA = 0b00000000 ;	
     TRISA  = 0b11111011 ;	
     //PORTA  = 0b00000000 ;	

     
     PORTAbits.RA2 = 0;
     while(1) {
        
         while(1){
             if( PORTAbits.RA3 ){
                 PORTAbits.RA3 = 0;
                 break;
             }
             else
                 continue;
        }
    unsigned long long pattern = 0x80000000;
         int j = 0;
         leadmark();
         leadspace();
         for( int i = 0 ; i < 35 ; i++ ){
             
             if( output[i] == '1' )
                mark();
             else
                 space();
             
        
         }
         //space();
         //space();
          PORTAbits.RA2 = 0;
            
         }



}

あらかじめ赤外線信号をRaspberry Pi等で記録して、

char output[]= "011000000100001001010000000011111110";

を作っておく必要がありますが、ロジックは極めて単純。回路図の必要な方はコメントください。PICは”箱庭”ないし”小宇宙”的で面白いです。使い道があれば楽しいですけど、この記事の機器というものは、契約期間終了で返却してもうありません。

コメント