Thứ Sáu, 31 tháng 3, 2017

STM8 decode NEC protocol

1. NEC protocol.

  • Chuẩn NEC


Hình 1.

       Ngõ ra mắt thu hồng ngoại sẽ bị đảo mức so với chuẩn NEC.

                 -Xung start:


Hình 2.
    • 9ms xung mức thấp.
    • 4.5ms xung mức cao.
             
       -32 bit data:
    • 8 bit địa chỉ.
    • 8 bit đảo của 8 bit địa chỉ.
    • 8 bit command.
    • 8 bit đảo của 8 bit command
  • Xung mức logic 0 và 1


Hình 3.


    • Logical '0' – 562.5µs xung mức thấp, 562.5µs xung mức cao, tổng thời gian 1.125ms
    • Logical '1' – 562.5µs xung mức mức thấp, 1.6875ms xung mức cao, tổng thời gian 2.25ms.
  • Giải mã chuẩn NEC.

           -Sử dụng STM8S003 giải mã NEC, dùng timer ngắt 0.5 ms và ngắt port để detect xung start, 32 bit data.

           -Detect xung start: set port ngắt cạnh xuống, khi port nhảy vào ngắt kiểm tra thời gian timer đếm được ,nếu timer đếm được khoảng 13ms (9 ms + 4.5 ms) => Xung start (Vị trí ngắt màu đỏ Hình 2).

           -Detect 32 bit data: set port ngắt cạnh xuống, khi port nhảy vào ngắt kiểm tra thời gian timer đếm được (Vị trí ngắt màu đỏ Hình 3):

    • Nếu timer đếm được nhỏ hơn 2 ms (562.5µs + 562.5µs ) => Logic 0.
    • Nếu timer đếm được lớn hơn 2 ms (562.5µs + 1.6875ms ) => Logic 1.
  • Code:


Ngắt timer 0.5 ms:
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)

 {

        count_ms++;

        if(count_ms==50) 

        count_ms=0;

        TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

 }



 Ngắt Port:



INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
{

    if ((GPIO_ReadInputData(GPIOB) & 0x20) == 0x00)
   {
       /////
      count_ms1=count_ms;
      count_ms=0;
      count_data++;
      if(((count_ms1)>=20)&((count_ms1)<=28))//10s-14s
      {
        count_data=-1;
        start_status=1;
        count_ms1=0;
      }
      else if((start_status==1)&(count_data>=0)&(count_data<=31))
      {
          if((count_ms1>=4)&(count_ms1<=6))//2ms->3ms //detect logic 1.
          {
              data|=(uint32_t)1<<(31-count_data);
              count_ms1=0;
          }
          else if(count_ms1<4)//nho hon <2s //detect logic 0.
          {
               count_ms1=0;
           }
           else //error data reset all
           {
              count_ms1=0;
              start_status=0;
              count_data=0;
              data=0;
           }
           ////
      }
      else if((start_status=0)&((count_ms1)>28))/// error detect xung start
      {
          count_ms1=0;
          start_status=0;
          count_data=0;
          data=0;
      }
      ///
      if(count_data==32) //reset sau khi detect 32 bit data
      {
        count_data=0;
        data=0;
        start_status=0;
        count_ms1=0;
      }
      //////// 
  }
  ///////
}



2. Sơ đồ nguyên lý.




3. Sản phẩm hoàn thiện.













Sử dụng mạch nguồn AC-DC 220V-5V 750mA cấp nguồn cho mạch (hình trên)



4. Demo.


Mã command nút power trên remote: 0x00ffA25D



Mã command nút power trên app remote Toshiba: 0x02FD48B7


Mã command nút power trên app remote LG: 0x20DF10EF





Video demo:


Bổ sung.


Chỉnh sửa hardware để điều khiển được bóng đèn huỳnh quang, lý do khi sử dụng relay tiếp điểm để điều khiển đèn huỳnh quang gây nhiễu khi đèn khởi động ("stater" hay "chuột" khởi động tạo hồ quang điện gây nhiễu).

Ngoài ra chọn lại nguồn AC-DC 5V filter tốt hơn (mình dùng mạch sạc Travel Adapter của samsung, mạch này lọc nhiễu đầu vào tốt hơn mạch bên trên mình đã dùng). Để nguồn DC ngõ ra filter tốt hơn ,ít nhiễu hơn mình còn gắn thêm cuộn cảm 330uH nối tiếp DC ngõ ra adapter.



Thay relay tiếp điểm bằng solib state relay (SSR).


Mạch sau khi sửa.



Video demo:


8