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

#41
e đã giải mã được cái "car mp3", nhưng có 1 điều là trong hàm.
InfraredDecode_GetKeyCode();
biến stick 500 có ý nghĩa gì, vì nếu stick <500
thì dù có đọc được mã từ remote nhưng kết quả trả về luôn bằng 255
 
#42
Stick là biến đếm sau mỗi 0.1ms. Anh quy định trong vòng 50ms sau khi bấm thì user sẽ chưa có mã và trả về KEY-INVALID là 0xFF, lý do là vì có nhiều loại remote có độ dài timing, hay số lượng bits khác nhau nên 50ms là quy định chung. Em tham khảo hàm main cách lấy keycode ra nhé
 

mencaulong

Học sinh phổ thông
#43
anh dungvt giúp em với. Em download chương trình của anh về và đã kết nối được ATmega8 với PC và đã Generator code ra được 2 file InfraredDecode.c và InfraredDecode.h rồi nhưng khi em đưa vào codevision để on/off toggle 1 led port C.5 nhưng vẫn không chạy. Nhờ anh hướng dẫn giúp em sau khi lấy được 2 file InfraredDecode.c và InfraredDecode.h rồi mình làm như thế nào. A cho e 1 đoạn codevision mẫu để toggle 1 led được không anh. Em cũng thử add code và chỉnh sữa dòng 14 giống như anh nói nhưng nạp vào board bên ngoài thì led vẫn không chạy được anh. Nhờ anh giúp em xíu, thank anh nhiều.
 

mencaulong

Học sinh phổ thông
#44
anh dungvt oi. Em download bài viết của anh nạp vào mạch thực tế thì chi bắt được sóng hồng ngoại qua RS232 lên máy tính và Generator code ra 2 file .c và .h còn thực tế nạp vào board để chạy thì không toggle được led. Nhờ anh chỉ em với có cần phải làm gì thêm nữa không anh? Em mới tìm hiểu về sóng hồng ngoại cho atmega8 nên chưa có nhiều kinh nghiệm. Nhờ anh giúp em
 

Cdt076

Học sinh phổ thông
#46
e đã giải mã được cái "car mp3", nhưng có 1 điều là trong hàm.
InfraredDecode_GetKeyCode();
biến stick 500 có ý nghĩa gì, vì nếu stick <500
thì dù có đọc được mã từ remote nhưng kết quả trả về luôn bằng 255
Bạn tiennam191 có thể cho mình kết quả giải mã remote carmp3 được không ? e-mail của mình cdt076@gmail.com. Thanks !
 
#47
Đâ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:

Khi 1 kênh được ấn, khung truyền dữ liệu có dạng như sau:
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:

·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:

-Khối Relay để điều khiển thiết bị bên ngoài:
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
theo mình không nhằm thì nó dùng chức năng so sánh analong để lấy tính hiệu ( cao hây thấp) của mắt hồng ngoại được gắn trực tiếp qua chân AINO chứ không qua khối khuyech đại nào thêm luôn đúng không .nếu vạy có bác nào rành có thể cho mình biết thêm về độ nhạy tính hiệu của hai chân nầy không (tức khoảng chênh lệch tính hiệu bao nhiêu thì có so sánh) cám ơn nhiều nè
 

dai le

Học sinh phổ thông
#48
ai cho mình hỏi. sao cứ làm tới truyền tín hiệu bằng IF hay RF cái là ai cũng dùng atmega, dùng loại khác có dc k?
mình đang muốn làm mà chỉ biết pic ngại học cái khác quá. (mới xong đồ án còn dư ít con pic, đang k biết làm gì với nó)
 
#49
ai cho mình hỏi. sao cứ làm tới truyền tín hiệu bằng IF hay RF cái là ai cũng dùng atmega, dùng loại khác có dc k?
mình đang muốn làm mà chỉ biết pic ngại học cái khác quá. (mới xong đồ án còn dư ít con pic, đang k biết làm gì với nó)
her đây là luồn dành cho avr mà bạn pic cũng làm được bt mà
 

huunho

Thạc sỹ
#50
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á


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):

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
bài này cũng hay nhưng sao bạn không viết chương trình lưu vào bộ nhớ flash của vdk mà phải giao tiếp máy tính cho phức tạp ra?
 

Quảng cáo Google