Chào các bạn!
Hôm nay mình xin chia sẻ với mọi người thuật toán giải mã tín hiệu remote (điều khiển từ xa bằng hồng ngoại) dùng cho mọi loại remote, mình đã nghiên cứu rất lâu trên mã code remote của nhiều loại remote khác nhau và rút ra thuật toán chung để giải mã chúng.
Trước tiên các bạn vào trang này để xem code của tất cả các loại remote : Index of /remotes
sau đó rút ra kết luận sau: có 2 loại mã hóa khác nhau được tích hợp trên remote
1, Loại điều chế độ rộng xung Thấp là loại remote có bit 0 và bit 1 khác nhau ở độ rộng xung thấp, điển hình là điều khiển sony: ( us là viết tắt của micro giây)
Sony CD player : RM-470
bits 7 (số bit được truyền đi : 7 bít )
Xung thấp(us) Xung cao (us)
header 2412 588 ( bít khởi động)
one 612 588 ( bít 1)
zero 1210 588 ( bít 0)
ptrail 1210
khi ấn 1 nút trên điều khiển thì sẽ có 1 xung khởi động được truyền đi với độ dài xung thấp 2412us và xung cao 588us (để đánh thức mcu), tiếp đó là 7 bít dữ liệu ,,bít 1 có 612us xung thấp và 588us xung cao,bít 0 có 1210us xung thấp và 588us xung cao. Cuối cùng là bít stop có 1210us xung thấp và xung cao rất dài, cái này chả cần quan tâm chỉ cần biết cứ xung cao kéo dài hơn 2000us thì là bít stop. nếu giữ nút trên remote thì quá trình truyền mã lệnh cứ lặp lại như thế mãi cho đến khi nhả nút.
Bit 0 và bít 1 có phần xung cao bằng nhau (588us) để làm mốc đo phần xung thấp phân biệt giữa bít 0 và 1. Sóng mang ( carrier) của remote có tần số 38Khz hoặc 40Khz, khi sóng mang phát ra tương ứng với xung thấp ta sẽ đo được mức logic 0 trên chân ra của ic nhận quang ( ic này có 3 chân : 1 out, 2 GND, 3 VCC = +5v hoăc +3v ) , khi sóng mang không phát ra thì tương ứng với xung cao, ta sẽ đo được mức logic 1 trên chân ra của ic nhận quang. khi không nhận tín hiệu gì thì chân ra của ic nhận quang có mức logic 1.
2, Loại điều chế độ rộng xung Cao là loại remote có bit 0 và bit 1 khác nhau ở độ rộng xung Cao, điển hình là điều khiển samsung: ( đây là kiểu mã hóa phổ biến nhất ).
Samsung_00025G
bits 16 (16 bit dữ liệu)
Xung thấp(us) Xung cao (us)
header 8985 4387 ( khởi động)
one 599 1626 (bit 1 )
zero 599 506 (bit 0 )
ptrail 599 (dừng )
Qua cách mô tả trên ta rút ra điểm riêng sau của các remote:
- Số lượng bít dữ liệu được truyền đi khác nhau: có loại 7 bit(sony),loại 8 bít, 12 bít, 16 bít , 18 bít, 32 bít, 42 bít (AIWA). Cùng 1 hãng điện tử ví dụ sony thì số bít cũng khác nhau, điều khiển tivi sony có 7 bit, còn dàn âm thanh sony là 16 bit.
- Xung khởi động khác nhau
- Phương thức mã hóa khác nhau : điều chế độ rộng xung thấp hay cao
Giống nhau, dựa vào cái này mà giải mã tất cả các remote:
- Mỗi bít khởi động, dừng,0 ,1 đều có phần xung thấp, cao.
- Bit khởi động có phần xung thấp bao giờ cũng > 2000us
- bit 1 có tổng độ dài xung thấp và cao < 1500us
- bit 0 có tổng độ dài xung thấp và cao > 1500us
- bit dừng có xung cao > 2000 us
- Điều khiển nào có độ dài dữ liệu > 16 bit thì phần dữ liệu đầu tiên là giống nhau, 16 bit còn lại khác nhau ( đây là các bít có nghĩa) ví dụ :
Đieu khien tivi samsung bn59-00891a (21 inch CRT)
thap cao
start 4604u 4431u
0 618u 544u
1 618u 1609u
bits 32
các bít phát đi đầu tiên | 16 bít cuối cùng
00011111 00011111 01110111 10001000 0
00011111 00011111 11011111 00100000 1
00011111 00011111 01011111 10100000 2
00011111 00011111 10011111 01100000 3
00011111 00011111 11101111 00010000 4
00011111 00011111 01101111 10010000 5
00011111 00011111 10101111 01010000 6
00011111 00011111 11001111 00110000 7
00011111 00011111 01001111 10110000 8
00011111 00011111 10001111 01110000 9
00011111 00011111 11101001 00010110 enter
00011111 00011111 01001011 10110100 exit
00011111 00011111 00000111 11111000 info
00011111 00011111 11110111 00001000 p-
00011111 00011111 10110111 01001000 p+
00011111 00011111 10100111 01011000 menu
00011111 00011111 00001111 11110000 mute
00011111 00011111 10111111 01000000 power
00011111 00011111 00110111 11001000 pre CH
00011111 00011111 01111111 10000000 source
00011111 00011111 00101101 11010010 tool
00011111 00011111 00101111 11010000 vol-
00011111 00011111 00011111 11100000 vol+
Tôi đưa ra thuật toán giải mã remote tivi samsung như sau:
- bước 1: R4 = 0 ; Hai biến này mỗi biến có độ dài 2 byte
R5 = 0
- bước 2: đợi xung xuống thấp rồi nhảy đến bước 3
- bước 3: đo độ rộng xung thấp nếu 4400 < độ rộng < 4800us
thì nhảy đến bước 4, nếu không thì quay về bươc 1
- bước 4:đo độ rộng xung cao nếu 4400 < độ rộng < 4800us
thì nhảy đến bước 5, nếu không thì quay về bươc 1
- bước 5: đo độ rộng xung thấp, nếu độ rộng > 2000 thì quay về bước 1
nếu < 2000 thì nhảy đến bước 6
- bước 6: đo độ rộng xung cao, nếu độ rộng > 2000 thì nhảy đến bước 9 (bit stop)
nếu < 2000 thì cộng độ rộng này với độ rộng đo ở bước 5 ta có tổng.
nếu tổng > 1500 thì đây là bit 0, nhảy đến bước 7
nếu tổng < 1500 thì đây là bit 1, nhảy đến bước 8
- bước 7: xóa cờ nhớ C
quay trái có nhớ R4
quay trái có nhớ R5
nhảy đến bước 5
- bước 7: set cờ nhớ C
quay trái có nhớ R4
quay trái có nhớ R5
nhảy đến bước 5
- bước 9: chúng ta có 32 bit dữ liệu giải mã chứa trong R4 và R5, mang so sánh với dữ liệu sẵn có để thực hiện lênh tương ứng
Tuy nhiên, thuật toán trên là tổng quát nên rất tuyệt vời ở chỗ nó giải mã được cả 2 loại điều chế độ rộng xung cao và thấp, đọc được bít dừng và khởi động, giữ lại 16 bít có nghĩa ở R4, các bít giống nhau giữ ở R5. Nếu độ dài bít > 32 bít thì nó giữ lai 32 bít cuối cùng, còn nếu < 32 bit thì phần trống có giá tri là 0.
Tôi đã dùng thuật toán trên viết chương trình cho MSP430G2131 đọc mã từ remote rồi lưu vào Seg D, sau đó sẽ thực hiện các lệnh điều khiển tương ứng với mã đọc được : bật tắt đèn, quạt, hẹn giờ tắt
Hôm nay mình xin chia sẻ với mọi người thuật toán giải mã tín hiệu remote (điều khiển từ xa bằng hồng ngoại) dùng cho mọi loại remote, mình đã nghiên cứu rất lâu trên mã code remote của nhiều loại remote khác nhau và rút ra thuật toán chung để giải mã chúng.
Trước tiên các bạn vào trang này để xem code của tất cả các loại remote : Index of /remotes
sau đó rút ra kết luận sau: có 2 loại mã hóa khác nhau được tích hợp trên remote
1, Loại điều chế độ rộng xung Thấp là loại remote có bit 0 và bit 1 khác nhau ở độ rộng xung thấp, điển hình là điều khiển sony: ( us là viết tắt của micro giây)
Sony CD player : RM-470
bits 7 (số bit được truyền đi : 7 bít )
Xung thấp(us) Xung cao (us)
header 2412 588 ( bít khởi động)
one 612 588 ( bít 1)
zero 1210 588 ( bít 0)
ptrail 1210
khi ấn 1 nút trên điều khiển thì sẽ có 1 xung khởi động được truyền đi với độ dài xung thấp 2412us và xung cao 588us (để đánh thức mcu), tiếp đó là 7 bít dữ liệu ,,bít 1 có 612us xung thấp và 588us xung cao,bít 0 có 1210us xung thấp và 588us xung cao. Cuối cùng là bít stop có 1210us xung thấp và xung cao rất dài, cái này chả cần quan tâm chỉ cần biết cứ xung cao kéo dài hơn 2000us thì là bít stop. nếu giữ nút trên remote thì quá trình truyền mã lệnh cứ lặp lại như thế mãi cho đến khi nhả nút.
Bit 0 và bít 1 có phần xung cao bằng nhau (588us) để làm mốc đo phần xung thấp phân biệt giữa bít 0 và 1. Sóng mang ( carrier) của remote có tần số 38Khz hoặc 40Khz, khi sóng mang phát ra tương ứng với xung thấp ta sẽ đo được mức logic 0 trên chân ra của ic nhận quang ( ic này có 3 chân : 1 out, 2 GND, 3 VCC = +5v hoăc +3v ) , khi sóng mang không phát ra thì tương ứng với xung cao, ta sẽ đo được mức logic 1 trên chân ra của ic nhận quang. khi không nhận tín hiệu gì thì chân ra của ic nhận quang có mức logic 1.
2, Loại điều chế độ rộng xung Cao là loại remote có bit 0 và bit 1 khác nhau ở độ rộng xung Cao, điển hình là điều khiển samsung: ( đây là kiểu mã hóa phổ biến nhất ).
Samsung_00025G
bits 16 (16 bit dữ liệu)
Xung thấp(us) Xung cao (us)
header 8985 4387 ( khởi động)
one 599 1626 (bit 1 )
zero 599 506 (bit 0 )
ptrail 599 (dừng )
Qua cách mô tả trên ta rút ra điểm riêng sau của các remote:
- Số lượng bít dữ liệu được truyền đi khác nhau: có loại 7 bit(sony),loại 8 bít, 12 bít, 16 bít , 18 bít, 32 bít, 42 bít (AIWA). Cùng 1 hãng điện tử ví dụ sony thì số bít cũng khác nhau, điều khiển tivi sony có 7 bit, còn dàn âm thanh sony là 16 bit.
- Xung khởi động khác nhau
- Phương thức mã hóa khác nhau : điều chế độ rộng xung thấp hay cao
Giống nhau, dựa vào cái này mà giải mã tất cả các remote:
- Mỗi bít khởi động, dừng,0 ,1 đều có phần xung thấp, cao.
- Bit khởi động có phần xung thấp bao giờ cũng > 2000us
- bit 1 có tổng độ dài xung thấp và cao < 1500us
- bit 0 có tổng độ dài xung thấp và cao > 1500us
- bit dừng có xung cao > 2000 us
- Điều khiển nào có độ dài dữ liệu > 16 bit thì phần dữ liệu đầu tiên là giống nhau, 16 bit còn lại khác nhau ( đây là các bít có nghĩa) ví dụ :
Đieu khien tivi samsung bn59-00891a (21 inch CRT)
thap cao
start 4604u 4431u
0 618u 544u
1 618u 1609u
bits 32
các bít phát đi đầu tiên | 16 bít cuối cùng
00011111 00011111 01110111 10001000 0
00011111 00011111 11011111 00100000 1
00011111 00011111 01011111 10100000 2
00011111 00011111 10011111 01100000 3
00011111 00011111 11101111 00010000 4
00011111 00011111 01101111 10010000 5
00011111 00011111 10101111 01010000 6
00011111 00011111 11001111 00110000 7
00011111 00011111 01001111 10110000 8
00011111 00011111 10001111 01110000 9
00011111 00011111 11101001 00010110 enter
00011111 00011111 01001011 10110100 exit
00011111 00011111 00000111 11111000 info
00011111 00011111 11110111 00001000 p-
00011111 00011111 10110111 01001000 p+
00011111 00011111 10100111 01011000 menu
00011111 00011111 00001111 11110000 mute
00011111 00011111 10111111 01000000 power
00011111 00011111 00110111 11001000 pre CH
00011111 00011111 01111111 10000000 source
00011111 00011111 00101101 11010010 tool
00011111 00011111 00101111 11010000 vol-
00011111 00011111 00011111 11100000 vol+
Tôi đưa ra thuật toán giải mã remote tivi samsung như sau:
- bước 1: R4 = 0 ; Hai biến này mỗi biến có độ dài 2 byte
R5 = 0
- bước 2: đợi xung xuống thấp rồi nhảy đến bước 3
- bước 3: đo độ rộng xung thấp nếu 4400 < độ rộng < 4800us
thì nhảy đến bước 4, nếu không thì quay về bươc 1
- bước 4:đo độ rộng xung cao nếu 4400 < độ rộng < 4800us
thì nhảy đến bước 5, nếu không thì quay về bươc 1
- bước 5: đo độ rộng xung thấp, nếu độ rộng > 2000 thì quay về bước 1
nếu < 2000 thì nhảy đến bước 6
- bước 6: đo độ rộng xung cao, nếu độ rộng > 2000 thì nhảy đến bước 9 (bit stop)
nếu < 2000 thì cộng độ rộng này với độ rộng đo ở bước 5 ta có tổng.
nếu tổng > 1500 thì đây là bit 0, nhảy đến bước 7
nếu tổng < 1500 thì đây là bit 1, nhảy đến bước 8
- bước 7: xóa cờ nhớ C
quay trái có nhớ R4
quay trái có nhớ R5
nhảy đến bước 5
- bước 7: set cờ nhớ C
quay trái có nhớ R4
quay trái có nhớ R5
nhảy đến bước 5
- bước 9: chúng ta có 32 bit dữ liệu giải mã chứa trong R4 và R5, mang so sánh với dữ liệu sẵn có để thực hiện lênh tương ứng
Tuy nhiên, thuật toán trên là tổng quát nên rất tuyệt vời ở chỗ nó giải mã được cả 2 loại điều chế độ rộng xung cao và thấp, đọc được bít dừng và khởi động, giữ lại 16 bít có nghĩa ở R4, các bít giống nhau giữ ở R5. Nếu độ dài bít > 32 bít thì nó giữ lai 32 bít cuối cùng, còn nếu < 32 bit thì phần trống có giá tri là 0.
Tôi đã dùng thuật toán trên viết chương trình cho MSP430G2131 đọc mã từ remote rồi lưu vào Seg D, sau đó sẽ thực hiện các lệnh điều khiển tương ứng với mã đọc được : bật tắt đèn, quạt, hẹn giờ tắt
Comment