Chia sẻ Cách giao tiếp với Vi Điều Khiển và Cách Lấy Mã Code Remote

Thảo luận trong 'Họ AVR'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

Moderators: mta_cdt
  1. bachnguyen

    bachnguyen Kỹ sư

    Tham gia ngày:
    7/1/13
    Bài viết:
    199
    Đã được thích:
    117
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    Sinh viên
    Nơi ở:
    Hồ Chí Minh - Việt Nam
    Đây là bài mình sưu tầm được chia sẻ với mọi người, cao thủ nào biết rồi đừng có chém em

    Trong bài viết này, mình sẽ hướng dẫn các bạn thực hiện project: sử dụng remote và mắt thu hồng ngoại điều khiển các thiết bị điện trong gia đình. Project được thực hiện trên vi điều khiển Atmega8.

    I.GIỚI THIỆU VỀ REMOTE VÀ MẮT THU HỒNG NGOẠI.
    2.REMOTE HỒNG NGOẠI
    ·Remote là một thiết bị phát sóng hồng ngoại, sử dụng trong các mục đích điều khiển từ xa (tầm 10m). Remote nhận lệnh điều khiển từ người điều khiển thông qua các phím bấm, sau đó xuất ra một khung dữ liệu ứng với phím được bấm.
    ·Có rất nhiều loại remote được sử dụng như: Sony, LG,… mỗi loại có 1 cách mã hóa phím bấm khác nhau (các bạn có thể tự tìm hiểu thêm).
    ·Trong project này mình sử dụng remote 3 kênh:
    [​IMG]
    Khi 1 kênh được ấn, khung truyền dữ liệu có dạng như sau:
    [​IMG]
    Sau xung START, 8 bit 0, 8 bit 1 là mã của kênh được bấm.
    ØBit 0 được định nghĩa: tín hiệu ở mức thấp trong 700us và ở mức cao trong 500us.
    ØBit 1 được định nghĩa: tín hiệu ở mức thấp trong 700us và ở mức cao trong 1600us.

    1.MẮT THU HỒNG NGOẠI.
    ·Mắt thu hồng ngoại gồm 3 chân: VCC, GND, DATA:
    [​IMG]
    ·Mắt thu hồng ngoại có chức năng chuyển sóng hồng ngoại phát ra từ remote thành đúng dạng tín hiệu số ứng với phím được bấm, nhưng tín hiệu ra có pha ngược với tín hiệu từ remote.
    ·Khi không có sóng tới, tín hiệu ra trên chân DATA ở mức cao.

    II.THỰC HÀNH PROJECT.
    1.THIẾT KẾ PHẦN CỨNG.
    Trong project này, có 2 khối các bạn cần thiết kế:
    -Khối vi điều khiển Atmega 8 và mắt thu hồng ngoại:
    [​IMG]
    -Khối Relay để điều khiển thiết bị bên ngoài:
    [​IMG]
    2.LẬP TRÌNH PHẦN MỀM.
    Đối với hồng ngoại, thuật toán của bạn đưa ra chỉ cần thỏa mãn 2 yêu cầu sau:
    -Các kênh khác nhau cho mã lệnh khác nhau khi được ấn.
    -Một kênh chỉ cho duy nhất một mã lệnh.
    (Mã nhận về không cần thiết phải giống mã của nhà sản xuất định sẵn cho các kênh).
    Dựa vào khung truyền đã nói ở trên, mình sẽ có 2 hàm để xử lý cảm biến hồng ngoại:
    -Hàm kiểm tra xung START:
    Mã:
    // Ham check xung START
    /* Xung START là xung co:
    - tin hieu o muc thap (0) có do dai 9ms
    - tin hieu o muc cao (1) có do dai 4ms
    Chi kiem tra tin hieu o muc thap dung 9ms la dung xung START
    */
    unsigned char check_start()
    {
        unsigned char i;
        if(DATA_INFR==0)              // Neu co canh xuong cua tin hieu
        {
              delay_us(500);          // Delay de chong nhieu
              if(DATA_INFR==0)        // Neu dung la co canh xuong cua tin hieu
              {
                  for(i=0;i<40;i++)  // Chia nho xung START thanh 40 doan, moi doan dai 200us
                  {
                        delay_us(200);
                        if(DATA_INFR==1) return 0;    // Neu tin hieu len muc cao (1) --> khong phai xung START
                  }
                  while(DATA_INFR==1);   
                  return 1;          // Dung la xung start
              }
     
        }
    }  
    -Hàm nhận về mã của kênh remote:
    Mã:
    // ===============================================================
    //  Ham doc ma cua cac kenh
    unsigned long int infr_sensor()
    {
        unsigned char i;
        unsigned int Data_Infr;
        Data_Infr=0;
        if(check_start())                  // Neu dung xung START
        {
              while(DATA_INFR==1);          // Cho het bit 1 tiep theo
              while(DATA_INFR==0);          // Cho het bit 0 tiep theo
              for(i=0;i<24;i++)            // Lay 24 bit du lieu (bao gom 8 bit 0 va 8 bit 1 dau tien sau xung start)
              {
                  //while(DATA_INFR==0);
                  delay_us(750);          // Delay 750us de kiem tra bit
                  if(DATA_INFR==0) Data_Infr=Data_Infr*2 + 1;
                  if(DATA_INFR==1) Data_Infr=Data_Infr*2;
                  while(DATA_INFR==1);    // cho canh len
                  while(DATA_INFR==0);    // cho canh len
              }
              delay_ms(600);                // Cho het tin hieu (chong nhieu)
        }
        return Data_Infr;                  // Gia tri ma kenh tra ve
    }
    Trước khi dùng phục vụ mục đích điều khiển, các bạn nên cho hiển thị mã của các kênh trên remote lên LCD1602 để lưu lại giá trị mã của từng kênh.
    Các bạn có thể tham khảo code mẫu dưới đây
    Mã:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.0 Professional
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
     
    Project : DIEU KHIEN QUAT DIEN SU DUNG REMOTE HONG NGOAI 20 KENH.
    Version : V1.0.0
    Author  : LE ANH QUANG   
    Company : MINHHAGROUP
    Comments: Su dung 2 Relay dieu khien ON/OFF quat va che do quay quat
     
     
    Chip type              : ATmega8
    Program type            : Application
    AVR Core Clock frequency: 1.000000 MHz
    Memory model            : Small
    External RAM size      : 0
    Data Stack size        : 256
    *****************************************************/
     
    #include <main.h>
     
    void main(void)
    {
     
    unsigned char Lcd_Buffer[20];           
    unsigned long int Data;      // Ma cac kenh cua remote               
    // Declare your local variables here
     
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x10;
    DDRB=0x00;
     
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0xff;
    DDRC=0xff;
     
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x0f;
     
    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTB Bit 1
    // RD - PORTB Bit 2
    // EN - PORTB Bit 3
    // D4 - PORTC Bit 2
    // D5 - PORTC Bit 3
    // D6 - PORTC Bit 4
    // D7 - PORTC Bit 5
    // Characters/line: 16
    RELAY1 = RELAY2 = 1;
    /*
    lcd_init(16);                // Ham khoi tao LCD1602
    lcd_clear();                  // Ham xoa LCD1602
    lcd_gotoxy(0,0);              // Di chuyen con tro den vi tri (0,0)
    lcd_putsf("MINHHAGROUP.COM");
    */
    while (1)
          {
              Data = infr_sensor();    // Gan ma cua kenh vao bien Data 
    /*
    Ham hien thi gia tri ma cua cac kenh len LCD1602
        if(Data!=0)
        {
              lcd_gotoxy(0,1)
              sprintf(Lcd_Buffer,"Ma Kenh: %lu",Data);
              lcd_puts(Lcd_Buffer);
        }
    */
     
    // Ham dieu khien RELAY ========================================================   
              if(Data!=0)              // Neu co kenh tren remote duoc an   
              { 
                  if(Data == OF_QUAT) // Thuc hien lenh dieu khien ung voi moi phim
                  {   
                        RELAY1 =~RELAY1;       
                  } 
                    if((Data == QUAY_QUAT)|(Data == QUAY_QUAT1))
                  {         
                      RELAY2 =~RELAY2;
                  }
                 
              } 
             
          }
    }
     
    //---------------END OF FILE-----------------/
    //--------------------------------------------/
    
    Nguồn: Banlinkien.vn


     
    croket_2512, chúng, toi ngu kinh10 others thích bài này.
  2. dungvt

    dungvt VIP

    Tham gia ngày:
    15/4/13
    Bài viết:
    583
    Đã được thích:
    905
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Bài của bạn rất hay và bổ ích. Nhưng có một vấn đề là phải biết chính xác timing của khung truyền, trong khi trong nhà mỗi người thì remote chưa biết timing rất nhiều: LG, Samsung, Ariang, remote máy lạnh ... Có 1 cách giúp ta catch được timing của 1 remote bất kỳ, tuy là hơi "bá đạo...", nhưng đảm bảo chạy được, đó là dùng ICP (Input capture) của AVR.
    Giải thuật như sau:
    • Khởi tạo ngắt ICP, cạnh lên hay cạnh xuống đều được
    • Khi ICP gây ngắt:
      • Đồng thời đọc giá trị cộng dồn (vd đặt là stick) khi ngắt 100us tràn
      • Dựa vào stick, ta xác định được MAX (timing bit 1) và MIN(timing bit 0)
      • Khi có MAX, MIN, ta dễ dàng xác định được mã code của phím nhấn.
      • Ta khởi tạo lại ngắt Timer 100us(Tại sao lại là 100us? Đơn giản thôi: vì tất cả timing đều chia hết cho 1:)) )
    Nhức đầu quá phải không? để thêm mấy cái hình cho dễ hiểu nhá​
    [​IMG]
    [​IMG]
    Chương trình ví dụ:
    Dựa vào cách này, mình đã viết một chương trình parse được mã của bất kỳ remote nào, lưu mã vào 1 số 32 bit. Để thuận tiện, mình cho generate code ra 2 file: 1 file InfraredDecode.c và 1 file InfraredDecode.h.​
    Schematic (thông cảm không vẽ hoàn chỉnh được vì không có bản quyền):​
    [​IMG]
    Mình attach lên đây mã nguồn cho mega8 cho các bạn tham khảo, dùng gui có thể sinh ra 2 file đọc mã của remote bất kỳ. Cách làm như sau:​
    1. Down load file .hex vào mega8
    2. Chạy chương trình InfraredRemote.exe
    3. Nối Mega8 với cổng COM_to_UART, Chọn Port kết nối, rồi nhấn "Connect"
    4. Đưa remote vào mắt thu hồng ngoại, nhấn lần lượt các phím trên remote để chương trình giải mã. Nếu cần đổi tên thì click vào phím cần đổi, đổi tên và nhấn "Update key".
    5. Nhấn "Genereate code" để tạo ra file .c và .h
     

    Các file đính kèm:

    ETPH, tannetto, xaxa9ztb12 others thích bài này.
  3. NgoHungCuong

    NgoHungCuong http://ngohungcuong.com

    Tham gia ngày:
    19/8/12
    Bài viết:
    4,020
    Đã được thích:
    9,121
    Điểm thành tích:
    69
    Giới tính:
    Nam
    Nghề nghiệp:
    Thất nghiệp
    Nơi ở:
    Lâm Thao - Phú Thọ
    Hi anh.
    Lâu lắm rồi em không dùng autoit, không ngờ nó cũng mạnh đó chứ anh nhỉ?
    :) Mỗi tội là có 1 số AV cứ thấy autoit thì coi là virus và xóa luôn :)
     
    thienkt thích bài này.
  4. dungvt

    dungvt VIP

    Tham gia ngày:
    15/4/13
    Bài viết:
    583
    Đã được thích:
    905
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Bữa đó lẽ ra viết bằng C#, nhưng thấy viết hoài C# chán quá nên muốn viết bằng cái khác, thế là thử chơi với autoit, học nó trong 2 ngày ấy :)).
     
    thienkt, namproNgoHungCuong thích bài này.
  5. NgoHungCuong

    NgoHungCuong http://ngohungcuong.com

    Tham gia ngày:
    19/8/12
    Bài viết:
    4,020
    Đã được thích:
    9,121
    Điểm thành tích:
    69
    Giới tính:
    Nam
    Nghề nghiệp:
    Thất nghiệp
    Nơi ở:
    Lâm Thao - Phú Thọ
    mr_Anhthienkt thích bài này.
  6. mr_Anh

    mr_Anh Kỹ sư

    Tham gia ngày:
    1/11/12
    Bài viết:
    299
    Đã được thích:
    346
    Điểm thành tích:
    63
    Giới tính:
    Nam
    Nơi ở:
    255B. Bồ Đề, Long Biên , Hà Nội
    Cái này mình đã thử, và nó hoạt động tốt, nhưng có bạn nào "hảo tâm" chuyển giúp mình sang CodevisionAVR với, WINAVR mình chẳng hiểu gì cả.X_X
    Xin Cảm ơn trước!^:)^
     
  7. chúng

    chúng Kỹ sư

    Tham gia ngày:
    7/9/12
    Bài viết:
    345
    Đã được thích:
    349
    Điểm thành tích:
    63
    Giới tính:
    Nam
    tự viết cho quen đi bạn, lúc trước mình chơi AVR cũng toàn viết lại mấy cái mẫu trên trang hoacavr.com
     
  8. mr_Anh

    mr_Anh Kỹ sư

    Tham gia ngày:
    1/11/12
    Bài viết:
    299
    Đã được thích:
    346
    Điểm thành tích:
    63
    Giới tính:
    Nam
    Nơi ở:
    255B. Bồ Đề, Long Biên , Hà Nội
    Umh:-? , ko được thì phải lấy cái ở bài #1 nghiên cứu vậy, Quỹ thời gian ít quá..........................:!!
     
  9. mr_Anh

    mr_Anh Kỹ sư

    Tham gia ngày:
    1/11/12
    Bài viết:
    299
    Đã được thích:
    346
    Điểm thành tích:
    63
    Giới tính:
    Nam
    Nơi ở:
    255B. Bồ Đề, Long Biên , Hà Nội
    Mỗi người có một "sở thích", Mình ác cái là mạch khó đến đâu cũng nghiên cứu để làm cho bằng ra, code khó đến đâu cũng .... "nhờ" cho bằng được!!! :D
    Mà chót mua bản quyền CodevisionAVR rồi, thế mới đau mình chứ.....
     
    NgoHungCuong thích bài này.
  10. dainv

    dainv http://vntech24h.com/

    Tham gia ngày:
    6/9/12
    Bài viết:
    411
    Đã được thích:
    655
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nghề nghiệp:
    Engineer Electronic
    Nơi ở:
    Vĩnh Phúc
    Bác mr_Anh ăn chới quá dùng codevisionAVR bản quyền à. Hic hum nào cho em xài thử xem nó hơn thằng Crack nhiều không :D
     
Moderators: mta_cdt

Chia sẻ trang này