집에 있는 밀폐등 리모컨을 잠그면

1. 시작
본 보도의 목표는 자신의 밀봉등 리모컨을 연결하여 마이크로컴퓨터에서 조작하는 것이다.
이번 해커의 차단등은 여기에 있다.
NEC-LED 밀폐등-조광형-~8다다미-HLDZB0849
밀폐등으로서의 기능
  • 다단조광(100%, 약 70%, 약 50%, 약 30%, 약 10%(5레벨 그레이스케일)
  • A 글로벌
  • 스토리지 강조 표시
  • 휴면 타이머(30분, 60분)
  • 이것들은 부속된 조명 리모컨 RE0201로 조작할 수 있기 때문에 나는 이 조명 리모컨을 덮고 마이크로컴퓨터에서 조작하고 싶다.
    2. 준비물
    제작에 필요한 건
  • 마이크로컴퓨터 PIC24FV32KA 301
  • 트랜지스터 S850
  • 적외선 LED
  • PICKit3
  • USB 직렬 변환 모듈 FT232RL
  • 좌우. (저항과 콘덴서 생략.) 디버깅용 오실로그래프 등이 편리합니다. 특별히 깊은 이유는 없고,마이크로컴퓨터는 PIC24FV32KA 301. 손 옆에 있는 판에 이것만 묶었습니다. PWM과 UART가 사용할 수 있다면 무엇이든지 좋습니다. 마이크로컴퓨터의 자세한 내용은 여기.보십시오. 가을달은 290엔에 판매됩니다.(2016년 1월 31일 현재)
    트랜지스터는 저속 스위치에 쓰이기 때문에 모델 등을 신경 쓸 필요가 없고 LED만 구동할 수 있으면 충분하다. (나는 없어도 괜찮다고 생각한다.)
    손에 적외선 LED가 없어서 리모컨에서 빌렸어요.(작은 소리)
    3. 리모컨의 출력 파형
    어떤 포맷으로 출력되는지 모르면 구하기 어려우므로 먼저 출력 포맷을 조사한다. 일본에서는 주로 NEC/가제협/SONY 포맷을 사용한다. 이번에 데이터를 얻은 리모컨은 NEC제,NEC 형식이겠죠. NEC 형식에 대한 자세한 내용.
    적외선 리모컨의 통신 형식 - ELM by Chan
    봐라, 내가 말로 설명하는 것보다 더 쉽게 이해할 수 있다.
    요점만 발췌하다
  • 950nm 파장의 적외선
  • 사용
  • 0과 1은 적외선 유무가 아니라 적외선 OFF의 시간에 0과 1을 표시한다
  • 소음의 영향을 줄이기 위해 38kHz, 공중의 1/3을 차지하는 신호를 사용한다.
  • 리더 코드 뒤에 32비트 메시지 보내기
    되다
    4. 데이터 가져오기
    조광 리모컨에서 데이터를 얻으려면 적외선 수광 모듈을 이용하는 것이 가장 좋다. 그러나 내 옆에 그런 물건이 없기 때문에 리모컨에서 직접 추출한다.
    우선 수중에 있는 리모컨을 디버깅 모드로 바꿔라(웃음).
    ※ 디버깅 모드(웃음)를 사용하면 공장의 게으름을 받아들일 수 없으니 주의하세요.

    그리고 조광 리모컨의 적외선 LED 출력 단자를 PIC의 RB2에 연결하고, 결과를 표시하기 위해 FT232RL을 UART1에 연결한다.
    다음 프로그램으로 리모컨이 출력한 데이터를 추출합니다.
    get_data.c
    void get_data(){
        //変数宣言
        char s[50];
        unsigned int count = 0;
        unsigned int i = 0;
        unsigned int size = 1500;
        unsigned char result[size]; 
        unsigned char pos = 0;
    
        while(true){
            //信号があるまで待機
            while(IO_RB2_GetValue());
    
            //信号を取得
            result[count] = result[count] | (IO_RB2_GetValue()<<pos);
            pos++;
            if(pos == 8){
                pos = 0;
                count++;
            }
            //サンプリングレート2us
            __delay_us(2);
    
            //バッファフルになったら出力
            if(count >= size){
                for (i = 0; i < count; i++) {
                    for (pos  = 0; pos  < 8; pos ++) {
                        sprintf(s, "%d,",(result[i]>>pos) & 0b1);
                        uart_tx(s);
                    }
                }
                uart_tx("¥n");
    
                //初期化
                for(i=0; i < count; i++){
                    result[i] = 0;
                }
                pos = 0;
                count = 0;
            }       
        }
        return;
    }
    
    마이크로컴퓨터의 메모리가 제한되어 수조로 2000 정도를 선언할 수 없기 때문에 1500을 선언하고 이위연산을 이용하여 unsigned char형의 영역을 활용한다. 리모컨에서 출력되는 파형은 38kHz(=약 26us)이다.작은 샘플링 주파수로 샘플링해 얻은 파형은 csv 형태로 출력하고 UART로 PC에 출력하며 엑셀 등으로 도표를 그린다.
    얻은 4개의 데이터는 아래와 같이 병렬되어 있다. 적외선 LED의 음극 측면에서 단자가 뻗어 있기 때문에 하이트에서 LED는 OFF 상태에 있다.

    왼쪽 띠가 굵은 곳은 리더코드다. 이후 간격이 좁은 곳과 넓은 곳은 계속된다. 좁은 곳은 0, 넓은 곳은 1을 의미한다. 데이터의 전반부 16비트는 고객 코드로 제품에 공통적이다. 후반 16비트는 데이터로 전반부 8비트의 물건을 반전시켜 후반 8비트가 된다.오류 확인 중입니다.
    그나저나 샘플링 비율이 낮으면 이런 느낌이 들 수 있어서 겨우 읽을 수 있었는데...

    5. 데이터 전송
    데이터의 전송은 PWM의 ON, OFF를 재현할 때 4장에서 얻은 신호를 전달한다.
    PIC는 16MIPS 동작으로 38kHz를 위해 공중의 1/3을 차지하는 PWM을 다음과 같이 설정합니다.
    TIMER1
    - Clock Source = FOSC/2
    - Prescaler = 1:1
    - Period 0x1A5 (26.313us)
    OC3
    - Mode = Edge-Aligne PWM mode
    - Source = TMR1
    - DCB = start of instruction cycle
    - Trigger/Sync = Trigger
    - Primary Compare = 0x8A
    - Secondary Compare = 0x1A5 (Duty cycle 33%)
    발송은 다음과 같은 코드를 사용했습니다: (초기화 함수를 생략합니다.)
    send_data.c
    #define customerCode    0b0100000110110110
    #define lightFull       0b01100101
    #define lightUp         0b01011101
    #define lightDown       0b11011101
    #define lightOff        0b01111101
    #define T               515
    
    void sendReaderCode(){
        OC3_Start();
        __delay_us(16 * T);
        OC3_Stop();
        __delay_us(8 * T)
    }
    
    void sendCustomerCode(){
        int n;
        //customer Code
        for(n = 15; n >= 0; n--){
            if((customerCode >> n) & 0b1){
                send1();
            }else{
                send0();
            }
        }
    }
    
    void send0(){
        OC3_Start();
        __delay_us(T);
        OC3_Stop();
        __delay_us(T);
    }
    
    void send1(){
        OC3_Start();
        __delay_us(T);
        OC3_Stop();
        __delay_us(3 * T);
    }
    
    void sendStopBit(){
        OC3_Start();
        __delay_us(T);
        OC3_Stop();
    }
    
    void sendData(unsigned char data){
        int n;
        //data
        for(n = 7; n >= 0; n--){
            if((data >> n) & 0b1){
                send1();
            }else{
                send0();
            }
        }
    
        //data inverse
        for(n = 7; n >= 0; n--){
            if((data >> n) & 0b1){
                send0();
            }else{
                send1();
            }
        }
    }
    
    void sendCmd(unsigned char data){
        sendReaderCode();
        sendCustomerCode();
        sendData(data);
        sendStopBit();
    }
    
    int main(void) {
        // initialize the device
        SYSTEM_Initialize();
    
        while(1){
                sendCmd(LightOff);
                __delay_ms(1000);
    
                sendCmd(LightFull);
                __delay_ms(1000);
    
                sendCmd(LightDown);
                __delay_ms(500);
                sendCmd(LightDown);
                __delay_ms(500);
    
                sendCmd(LightUp);           
                __delay_ms(500);
                sendCmd(LightUp);           
                __delay_ms(500);
            while(1){
                IO_RA0_SetHigh();
            }
        }
    }
    
    전송 간격 T의 형식 값은 562us이지만 처리 시간을 고려하여 515us를 선택합니다.
    실행하면 방의 밀폐등.
    불끄기→켜기→두 단계 어둡기→두 단계 밝기
    라고 동작했다.
    6.이번의 키
    우선 정지 위치를 잊어버렸다. 고객 코드를 포함한 데이터는 32비트였지만 정지자를 마지막으로 삽입하지 않으면 마지막 비트가 0인지 1인지 알 수 없다.
    또 하나는 처리 속도입니다. 이번 마이크로컴퓨터는 16MIPS 동작입니다. 전력을 절약하기 위해 0.5MIPS 정도의 속도로 동작을 하려고 했지만 처리 속도가 부족해서 리모컨과 같은 시간에 발송하지 못했습니다.delay_us()로 처리하는 데 시간이 필요합니까?
    7. 요약
    리모컨의 데이터를 추출하면 마이크로컴퓨터에서 조작할 수 있다.
    앞으로 나는 시간에 따라 자동으로 밝기를 조절하고 싶다.
    8. 참조
    적외선 리모컨의 통신 형식 - ELM by Chan
    FAQ No.1007798(NEC 형식의 적외선 리모컨 형식[공용]) 추월 전자 리모컨 양식 참고 자료
  • 좋은 웹페이지 즐겨찾기