2011年4月1日 星期五

2.2 自製電視紅外線遙控器(使用 Keypad)

實驗目的

練習製作一個電視紅外線遙控器。在這個實驗裏,你將練習用 IRRemote 函式庫發射紅外線訊號,然後搭配一個 Keypad 做出一個電視遙控器。預計製作的紅外線遙控器,其外觀如下:

DSC00165
▲ Keypad 數字 0 ~ 9 是作選頻道用,而 * 鍵是降低音量,# 鍵是提高音量

前提

在做這個實驗前,我假設:

  1. 你已經看過「IRRemote 紅外線遙控教學」這系列的教學
  2. 已經把 IRRemote 函式庫安裝起來
  3. 讀過「Arduino 筆記 – Lab18 讀取 3x4 Keypad 的輸入」一文,知道 Keypad 的使用方法,而且也已經把 Keypad 函式庫安裝好了
材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 發射波長為 940nm 的紅外線發射器 x 1
  • 3x4 Keypad
  • 100 歐姆電阻 x 1
  • 單心線 x N
識別 Keypad 的接腳

由於 Keypad 的腳位定義並沒有標準,所以,在使用 Keypad 前,必須先找出 Keypad 行(Column)與列(Row)線路所在的接腳。一個方法是用電表,對 Keypad 所有接腳兩兩量測,這部份可參考 Keypad Tutorial 的說明。另一個則是土法煉鋼的方法,把螺絲取下直接打開 Keypad 看它的電路。

image

以本實驗所用的 3x4 Keypad 為例,這個 Keypad 總共有 7 支接腳,上圖即 Keypad 拆開後的照片,它的電路結構很簡單,循著線路看就可以查出行(Column)與列(Row)線路所在的接腳,三個行(Columns)由左而右依序是 3, 1, 5 接腳,而四個列 (Rows) 從上而下依序是 2, 7, 6, 4 接腳。如下圖右下角的電路圖所示,可以拿個紙筆把你所用的 Keypad 行列所在的接腳抄寫下來,方便記憶。

image
▲ 圖片來源: arduino.cc

接線
  • 照下表把 Arduino 與 Keypad 連接起來 (Columns: 3, 1, 5, Rows: 2, 7, 6, 4)
Keypad 接腳 Arduino 接腳 說明
1 12 Column1
2 11 Row0
3 10 Column0
4 9

Row3

5 8

Column2

6 7 Row2
7 6 Row1
  • 如果你用的 Keypad 它的 Column0~Column2 是在 1, 2, 3 接腳,而 Row0~Row3 是在 4, 5, 6, 7 接腳的話,請照下表連接 Keypad 與 Arduino:
Keypad 接腳 Arduino 接腳 說明
1 12 Column0
2 11 Column1
3 10 Column2
4 9

Row0

5 8

Row1

6 7 Row2
7 6 Row3

image

  • 把紅外線發射器(IR LED)接到 pin 3,長腳(陽極)串接一顆 100 ohm 電阻接到 pin 3,短腳(陰極)接到 GND

image

注意!因為 IRRemote 函式庫限定使用 pin 3,所以你只能把紅外線發射器接到 pin 3,不能接到其它腳位。

錄製按鍵的紅外線編碼

參考「1.5 兩個取得遙控器紅外線資料的方法」一文錄製電視遙控器的紅外線資料。以我所用的電視遙控器為例,用 IRRemote 解碼之後,可知我電視遙控器講的是 NEC 紅外線協定,紅外線編碼資料長度都是 32 位元。我取得的數字按鍵以及音量鍵(Volume- 和 Volume+)紅外線編碼如下:

程式

底下就是這個紅外線遙控器的程式(Keypad_TVRemote.pde):

注意! 記得把 irKeyCodes 裏的資料換成你自己的遙控器的紅外線編碼。另外,如果你的遙控器講的不是 NEC 而是其它紅外線協定,例如 Philips RC5,記得也要把 sendNEC() 這行換成其它發射紅外線的函式,例如 sendRC5()。

示範影片
動動腦

請找一個紅外線遙控器,電視、音響、手機、相機、投影機或是冷氣機的遙控器都可以,然後修改這個實驗的範例程式,用 Arduino 做一個遙控器來控制你的影音設備。

延伸閱讀

72 意見:

Lo cheng wei 提到...

這超棒拉!下次我也要試一下

coopermaa 提到...

試試看,真的超簡單。

aoaodi 提到...

這個能在設一個按鈕來做電視的開跟關嗎?或者是用光敏電阻另外設一個電視的開關?@@~ 拜託大大了~~

coopermaa 提到...

我「發射紅外線訊號」這篇剛好有這麼一個範例程式,利用一個按鈕來控制電視的開關: http://coopermaa2nd.blogspot.com/2011/03/21.html

aoaodi 提到...

請問 我買100ohm +- 1%
1/4W的電阻跟10kohm +-1% 1/4w
940nm紅外線發射 他有很多種呢 分不清楚 我買淡藍色的
keyword我買接腳在123數字鍵上面的 也有*0#底下的接腳有差嗎? 不好意思 感謝 還是你能給我比較詳細的電子材料表~~~

coopermaa 提到...

電阻沒問題。
我買的紅外線發射器也是淡藍色的,我有看過白色的,顏色可能沒什麼關係吧,只要確定發射波長是 940nm 就對了。
Keypad 的話,要注意它的接腳。我看一般好像分成兩種。我在底下這篇有提到,到時你可以照著上面的步驟檢查,看看你買的是哪一種:
http://coopermaa2nd.blogspot.com/2011/01/arduino-lab18-3x4-keypad.html

不錯喔!你是行動派的。Luck for you.

aoaodi 提到...

紅外線編碼取下來之後前面要再+0x嗎?沒+的話會錯誤呢
紅外線編碼要改之外 還有其他要改嗎?因為我現在試沒辦法遙控電視呢?謝謝

coopermaa 提到...

是的,要發射的時候,編碼前必須加上 0x。
在 C 語裏,數字前的 0x 代表這個是 16 進位的數字。

aoaodi 提到...

那程式方面還有其他需要修改的嗎?謝謝

aoaodi 提到...

Protocol: Unknown encoding, irCode(): 57C003F9, bits: 32這是我解碼出來的 那我的協定要改成什麼?感恩


注意! 記得把 irKeyCodes 裏的資料換成你自己的遙控器的紅外線編碼。另外,如果你的遙控器講的不是 NEC 而是其它紅外線協定,例如 Philips RC5,記得也要把 sendNEC() 這行換成其它發射紅外線的函式,例如 sendRC5()。

aoaodi 提到...

Protocol: Unknown encoding, irCode: 57C003F9, bits: 32
這是我接收的紅外線訊號 那我紅外線函士要改成什麼?感恩


如果你的遙控器講的不是 NEC 而是其它紅外線協定,例如 Philips RC5,記得也要把 sendNEC() 這行換成其它發射紅外線的函式,例如 sendRC5()。

coopermaa 提到...

Unknown encoding??
每次收到的碼都是 Unknown encoding 嗎?可不可以多試幾次看會不會不一樣。

如果每次都是 Unknown encoding 的話,你試試看用 sendRaw()。

aoaodi 提到...

用Raw會出現這錯誤呢?謝謝


sketch_nov03a.cpp: In function 'void loop()':
Keypad_TVRemote:75: error: no matching function for call to 'IRsend::sendRaw(long int&, int)'
C:\Users\wowo\Desktop\arduino-0022\libraries\IRremote/IRremote.h:80: note: candidates are: void IRsend::sendRaw(unsigned int*, int, int)

coopermaa 提到...

sendRaw() 要三個參數。

sendNEC(irCode, 32, 38); // 第三個參數的 38 是 38 KHz 的意思

aoaodi 提到...

今天用SONY的遙控器有爭測到 可是改上去有錯誤呢
Protocol: SONY, irCode: 490, bits: 12


bits: 12是 12的話有什麼地方要改嗎?謝謝

coopermaa 提到...

所以你遙控器講的是 SONY Protocol。
改上去有什麼錯誤?

aoaodi 提到...

我改了遙控器的紅外線編碼和這條程式
irsend.sendSONY(irKeyCodes[irKeyIndex], 12);
出現以下錯誤~~~
sketch_nov04a.cpp: In function 'void loop()':
Keypad_TVRemote:75: error: 'class IRsend' has no member named 'sendSONY'

coopermaa 提到...

大小寫有差喔:

sendSONY() 跟 sendSony() 是不一樣的

aoaodi 提到...

可以執行了 可是案沒反應呢~
我在爭測遙控器紅外線他都會比一般遙控器在多一行解碼呢!
是不是要再改解碼編號那邊再做什麼改變?
Protocol: SONY, irCode: E10, bits: 12
Protocol: SONY, irCode: E10, bits: 12
Protocol: SONY, irCode: 110, bits: 12
Protocol: SONY, irCode: 110, bits: 12
都是一次2行
這行程是這樣改對嗎?
irsend.sendSony(irKeyCodes[irKeyIndex], 12);// 發射紅外線訊號


不好意思 那麼多問題打擾了~

coopermaa 提到...

嗯,程式沒錯。
我沒用過 Sony Protocol,不過聽說 Sony Protocol 在發射的時候必須像底下這樣連續送三次才行,你試試看:

for (int i = 0; i < 3; i++) {
irsend.sendSony(0xa90, 12); // Sony TV power code
delay(100);
}

aoaodi 提到...

不好意思 這三行要+到程式的哪裡~"~

coopermaa 提到...

你說呢?

aoaodi 提到...

+了這三行按keypad會變成電視 開跟關呢@@~

coopermaa 提到...

哈。你已經把 keypad 也弄上去了啊?

aoaodi 提到...

照你上面做的阿~"~

coopermaa 提到...

所以你是照著這篇的教學用 Keypad 自製電視紅外線遙控器啊?
問一下,你是自己在玩 Arduino 嗎?
跟我一樣純綷好玩,還是說工作上或課堂上會用到?

aoaodi 提到...

學校上課會用到很多arduino的東西~
老師又不知道在教什麼~看無
這一項我是覺得材料很容易就買的到就做做看
蠻好玩的~只是 程式真的有待進步



大大 也經可以瞜!!城市改成這樣

for (int i = 0; i < 3; i++) {
irsend.sendSony(irKeyCodes[irKeyIndex], 12); // Sony TV power code
delay(100);

謝謝瞜~後面還是會有問題問你的 再麻煩妳了~"~

coopermaa 提到...

已經搞定啦!?
恭禧你啊!
「發表是最好的記憶」,你也寫篇文章分享一下吧!

不客氣,學習寫程式沒什麼,就是多找題目來練習。加油啊!

aoaodi 提到...

學校我們這一屆開始都要碰arduino都沒有學長做過 我們這一屆當白老鼠~老師上課又不知道在教什麼~看無
想說做這個材料方便取得 就做做看瞜
有助於學習~~~呵呵

後面還是會有問題要問你 到時再麻煩妳了~
大大可以瞜!!程式改成這樣就可以了
for (int i = 0; i < 3; i++) {
irsend.sendSony(irKeyCodes[irKeyIndex], 12); // Sony TV power code
delay(100);
}

coopermaa 提到...

請問你唸哪間學校?
現在好像有愈來愈多的學校在開 arduino 的課程
這是很好的現象
因為我覺得比起 8051,學習 arduino 的曲線真的簡單多了。
我有寫「arduino 教學」這系列入門教學,你照著步驟一個一個做,也許會有幫助:

http://coopermaa2nd.blogspot.com/2011/05/arduino.html

歡迎常來啊!

aoaodi 提到...

新竹大華技術學院~~~你可能沒聽過
不怎麼樣的學校 呵呵 謝謝瞜

coopermaa 提到...

有聽過,不過沒去過。其實我很少去新竹,新竹很多地方都沒啥印象。
不會啦,真要唸書的話,人還是可以出辦法啦的。
最簡單的方法就是呼朋引伴囉。

aoaodi 提到...

大大 需要請你幫忙了
我現在是用另一台電視遙控器+一個button設電視的開關
現在是可以選台 但開電視一下能開 一下又不能開這樣
用moiter爭測不到HIGH呢 幫我看看程式哪裡需要修改的
謝謝
/*
* Keypad_TVRemote.pde: 自製紅外線電視遙控器(使用 Keypad)
*/
#include // 引用 Keypad 函式庫
#include // 引用 IRRemote 函式庫
const int buttonPin = 4; // 按鍵(pushbutton)接在 pin 4
int buttonState = 0; // 按鍵狀態

const byte ROWS = 4; // 3x4 Keypad
const byte COLS = 3;

char keys[ROWS][COLS] = { // 定義 Keypad 的按鍵
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

// 定義 Keypad 連到 Arduino 的接腳
// Keypad 腳位佈局:
// Rows: 2, 7, 6, 4
// Cols: 3, 1, 5
byte rowPins[ROWS] = {11, 6, 7, 9}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {10, 12, 8}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2

/*
// Keypad 腳位佈局:
// Rows: 4, 5, 6, 7
// Cols: 1, 2, 3
byte rowPins[ROWS] = {9, 8, 7, 6}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {12, 11, 10}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2
*/

// 建立 Keypad 物件
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// 紅外線編碼對應表
// 這是我電視遙控器的紅外線編碼,記得換成你的紅外線編碼
long irKeyCodes[12] = {
0x6F920DF, 0x6F9A05F, 0x6F9FA05, // 對應 Keypad 的 '1', '2', '3'
0x6F9E01F, 0x6F910EF, 0x6F9906F, // 對應 Keypad 的 '4', '5', '6'
0x6F950AF, 0x6F9D02F, 0x6F930CF, // 對應 Keypad 的 '7', '8', '9'
0x6F9A857, 0x6F9C03F, 0x6F99867 , // 對應 Keypad 的 '*', '*', '#'
};

IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號

void setup()
{
pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT
{
Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
}
}
void loop()
{
// 讀取按鍵狀態
buttonState = digitalRead(buttonPin);
// 檢查按鍵是否被按下(pressed)
// 有的話,buttonState 會是 HIGH
if (buttonState == HIGH){
// 發射紅外線訊號
irsend.sendNEC(0x6F900FF, 32); // 我電視 Power 鈕的紅外線編碼, 記得換成你的紅外線編碼
}

{
char key = keypad.getKey();
byte irKeyIndex;

// 檢查 Keypad 是否有被按下
// 有的話,key 會是非 NO_KEY 的值
if (key != NO_KEY){
Serial.println(key); // 把按鍵印到 Serial Port

// 計算 irKeyCodes 的索引
switch (key) {
case '*':
irKeyIndex = 9; // 降低音量 (volume-)
break;
case '0':
irKeyIndex = 10; // 按鍵 '0'
break;
case '#': // 提高音量 (volume+)
irKeyIndex = 11;
break;
default:
irKeyIndex = key - '1'; // 按鍵 1 ~ 9
}

irsend.sendNEC(irKeyCodes[irKeyIndex], 32); // 發射紅外線訊號
}
}
}

aoaodi 提到...

大大我現在換用另一台電視 紅外線遙控+button做電視開關
現在程式一樣可以選台~電視開關有時可以有時不可以怪怪的
用moniter爭測也沒有HIGH呢
幫我看看成是哪裡出問題了 謝謝~
/*
* Keypad_TVRemote.pde: 自製紅外線電視遙控器(使用 Keypad)
*/
#include // 引用 Keypad 函式庫
#include // 引用 IRRemote 函式庫
const int buttonPin = 4; // 按鍵(pushbutton)接在 pin 4
int buttonState = 0; // 按鍵狀態

const byte ROWS = 4; // 3x4 Keypad
const byte COLS = 3;

char keys[ROWS][COLS] = { // 定義 Keypad 的按鍵
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

// 定義 Keypad 連到 Arduino 的接腳
// Keypad 腳位佈局:
// Rows: 2, 7, 6, 4
// Cols: 3, 1, 5
byte rowPins[ROWS] = {11, 6, 7, 9}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {10, 12, 8}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2

/*
// Keypad 腳位佈局:
// Rows: 4, 5, 6, 7
// Cols: 1, 2, 3
byte rowPins[ROWS] = {9, 8, 7, 6}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {12, 11, 10}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2
*/

// 建立 Keypad 物件
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// 紅外線編碼對應表
// 這是我電視遙控器的紅外線編碼,記得換成你的紅外線編碼
long irKeyCodes[12] = {
0x6F920DF, 0x6F9A05F, 0x6F9FA05, // 對應 Keypad 的 '1', '2', '3'
0x6F9E01F, 0x6F910EF, 0x6F9906F, // 對應 Keypad 的 '4', '5', '6'
0x6F950AF, 0x6F9D02F, 0x6F930CF, // 對應 Keypad 的 '7', '8', '9'
0x6F9A857, 0x6F9C03F, 0x6F99867 , // 對應 Keypad 的 '*', '*', '#'
};

IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號

void setup()
{
pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT
{
Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
}
}
void loop()
{
// 讀取按鍵狀態
buttonState = digitalRead(buttonPin);
// 檢查按鍵是否被按下(pressed)
// 有的話,buttonState 會是 HIGH
if (buttonState == HIGH){
// 發射紅外線訊號
irsend.sendNEC(0x6F900FF, 32); // 我電視 Power 鈕的紅外線編碼, 記得換成你的紅外線編碼
}

{
char key = keypad.getKey();
byte irKeyIndex;

// 檢查 Keypad 是否有被按下
// 有的話,key 會是非 NO_KEY 的值
if (key != NO_KEY){
Serial.println(key); // 把按鍵印到 Serial Port

// 計算 irKeyCodes 的索引
switch (key) {
case '*':
irKeyIndex = 9; // 降低音量 (volume-)
break;
case '0':
irKeyIndex = 10; // 按鍵 '0'
break;
case '#': // 提高音量 (volume+)
irKeyIndex = 11;
break;
default:
irKeyIndex = key - '1'; // 按鍵 1 ~ 9
}

irsend.sendNEC(irKeyCodes[irKeyIndex], 32); // 發射紅外線訊號
}
}
}

aoaodi 提到...

大大我留給你的言怎會不見= =
想請問你紅外線遙控+button程式要怎麼寫~
我貼程式上來 好像都會被移除耶@@~

aoaodi 提到...

#include // 引用 Keypad 函式庫
#include // 引用 IRRemote 函式庫
const int buttonPin = 4; // 按鍵(pushbutton)接在 pin 4
int buttonState = 0; // 按鍵狀態

const byte ROWS = 4; // 3x4 Keypad
const byte COLS = 3;

char keys[ROWS][COLS] = { // 定義 Keypad 的按鍵
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

// 定義 Keypad 連到 Arduino 的接腳
// Keypad 腳位佈局:
// Rows: 2, 7, 6, 4
// Cols: 3, 1, 5
byte rowPins[ROWS] = {11, 6, 7, 9}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {10, 12, 8}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2

byte rowPins[ROWS] = {9, 8, 7, 6}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3
byte colPins[COLS] = {12, 11, 10}; // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2
*/

// 建立 Keypad 物件
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// 紅外線編碼對應表
// 這是我電視遙控器的紅外線編碼,記得換成你的紅外線編碼
long irKeyCodes[12] = {
0x6F920DF, 0x6F9A05F, 0x6F9FA05, // 對應 Keypad 的 '1', '2', '3'
0x6F9E01F, 0x6F910EF, 0x6F9906F, // 對應 Keypad 的 '4', '5', '6'
0x6F950AF, 0x6F9D02F, 0x6F930CF, // 對應 Keypad 的 '7', '8', '9'
0x6F9A857, 0x6F9C03F, 0x6F99867 , // 對應 Keypad 的 '*', '*', '#'
};

IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號

void setup()
{
pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT
{
Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
}
}
void loop()
{
// 讀取按鍵狀態
buttonState = digitalRead(buttonPin);
// 檢查按鍵是否被按下(pressed)
// 有的話,buttonState 會是 HIGH
if (buttonState == HIGH){
// 發射紅外線訊號
irsend.sendNEC(0x6F900FF, 32); // 我電視 Power 鈕的紅外線編碼, 記得換成你的紅外線編碼
}

{
char key = keypad.getKey();
byte irKeyIndex;

// 檢查 Keypad 是否有被按下
// 有的話,key 會是非 NO_KEY 的值
if (key != NO_KEY){
Serial.println(key); // 把按鍵印到 Serial Port

// 計算 irKeyCodes 的索引
switch (key) {
case '*':
irKeyIndex = 9; // 降低音量 (volume-)
break;
case '0':
irKeyIndex = 10; // 按鍵 '0'
break;
case '#': // 提高音量 (volume+)
irKeyIndex = 11;
break;
default:
irKeyIndex = key - '1'; // 按鍵 1 ~ 9
}

irsend.sendNEC(irKeyCodes[irKeyIndex], 32); // 發射紅外線訊號
}
}
}

coopermaa 提到...

不曉得怎麼回事
你的留言常常會被 blogger 當成垃圾留言
我都是收到信後再去 blogger 把你的留言改成不是垃圾留言,這才會顯示出來的說。

coopermaa 提到...

看你之前的測試結果
你遙控器不是講 SONY Protocol 的嗎?
可是我看你程式碼還是寫 sendNEC(),這樣可以動嗎?

你現在是用一個 Keypad 再加一個按鈕在控制嗎?
嗯,建議要分而治之
先測 Keypad 或按鈕的部份都行,先一部份一部份測
確定兩個部份都沒問題後,再合起來一起測

aoaodi 提到...

有2台電是在做測試 sony的當天搖控好以後馬上就接button來作開關 一切都很順利 都可以用 重開機之後又怪怪的了 沒反應
所以我現在在測另一台電視NEC的
大大您說的我會再做測試看看~謝謝

coopermaa 提到...

原來如此。
自己接按鈕的話,要注意按鈕會有彈跳的問題:
http://coopermaa2nd.blogspot.com/2011/07/42-timer-as-counter.html

aoaodi 提到...

請問一下 我現在宿舍電視是東元的大頭寶寶(以前的電視)
他編號都是Unknown encoding 是不是就解不出來紅外線協定了~

coopermaa 提到...

試了很多次都是 Unknown encoding 的話,有可能是 IRRemote 不認得的紅外線協定。
那 irCode 跟 bits (資料長度) 有解出來嗎?
如果每次 irCode 跟 bits 都一樣,也許還是可以用 sendRaw() 來發射紅外線。

aoaodi 提到...

Protocol: Unknown encoding, irCode: B555435, bits: 32


sendRaw() 來發射紅外線。 是要貼在程式哪裡

你之前說用這個sendRaw() 要三個參數
是改這行程式嗎?irsend.sendNEC(irKeyCodes[irKeyIndex], 32);

改了之後
sendRaw(irCode.32.38);//32是bits 38是IR

試過這行程式 可是會錯誤..

coopermaa 提到...

Q: 要貼在程式哪裏?
A: 就把 sendNEC() 換成 sendRaw() 呀。

像這樣:

irsend.sendRaw(irKeyCodes[irKeyIndex], 32, 38); // 發射紅外線訊號,第三個參數的 38 代表用 38 kHz

aoaodi 提到...

Keypad_TVRemote:75: error: invalid conversion from 'long int' to 'unsigned int*'

Keypad_TVRemote:75: error: initializing argument 1 of 'void IRsend::sendRaw(unsigned int*, int, int)'

他會出現這錯誤 好像是找不到Raw呢~~

coopermaa 提到...

sendRaw() 用法好像蠻特別的,跟 sendNEC(), sendSony() 這些不太一樣。

aoaodi 提到...

對阿 ~~還是找個有紅外線協定的來玩好了~~~謝謝了

coopermaa 提到...

IRRemote Library 裏 IRrecord 這個範例有示範 sendRaw() 的用法。
不過還挺複雜的。

aoaodi 提到...

大大 有問題要求救 幫我看這程式哪裡要修改
我現在是用srf05感測器來遙控電視
這個網址裡的最底那那一個執行程式
我跟他一樣用0018版本的arduino
麻煩你了 謝謝
會出現這錯誤
9: error: #include expects "FILENAME" or In function 'void loop()':
Bad error line: -4


http://luckylarry.co.uk/arduino-projects/arduino-redefining-the-tv-remote/

coopermaa 提到...
作者已經移除這則留言。
coopermaa 提到...
作者已經移除這則留言。
coopermaa 提到...

#include // 這裏要加 <IRremote.h>
IRsend irsend;

aoaodi 提到...

出現這錯誤~~


In function 'void loop()':
error: 'lt' was not declared in this scope At global scope:

aoaodi 提到...

我現在重開機載測一次是出現這不一樣的問題~~~
21: error: IRremote.h: No such file or directory In function 'void loop()':
Bad error line: -4

coopermaa 提到...

那個網站上貼的程式碼沒處理好,你自己要把大於、小於跟 logical and 的 html 換掉。

我已經改好了,可以編譯過關,你試看看:

http://goo.gl/Z13Bq

這支程式 code 內容在做什麼,你研究出來後,別忘了來分享喔。

aoaodi 提到...

大大太感謝了~~~~~~~~~我以為你不幫我解答了~"~

我現在馬上試 試好會做分享的~~謝謝

coopermaa 提到...

我在忙工作呢,一直在開會,實在是分身乏術
開會好累啊,我現在假日都在補眠,沒有空閒寫文章回留言說

你在研究上次提到的 sendRaw() 怎麼用嗎?
加油啊!期待你的分享。^o^

aoaodi 提到...

大大 完了~~~~照著用他的紅外線編碼raw的不行@@
用另一台電視NEC跟Sony協定的就不知道怎麼改了~
他的程式好像原本就是針對偵測不到紅線訊號用的~~
大大有什麼能建議的嗎?謝謝

aoaodi 提到...

Raw已經可以了 偵測到68個編碼要刪掉最前面那一個就可以了~~
只是頻道感測還要再改一下會比較好~~聲音的就比較穩!
現在就差NEC跟SONY的還沒測出來瞜~

coopermaa 提到...

不太懂你的意思耶
你是說已經可以用 sendRaw() 送出紅外線訊號了嗎?
所以,現在的問題是什麼?是不曉得它的協定是 NEC 還是 SONY 嗎?

aoaodi 提到...

測不到紅外線協定的 只要照著他又IRremote裡的dump範例來測紅外線訊號~~~測到(68)個編碼的話 只要把第一個編碼刪掉就可以遙控電視了~~~
一樣測的到紅外線協定 只是測不到他的紅外線協定的我照他他解說上面改就可以了~~~NEC的下午測也可以了照他上面改就可以 不用把協定改成NEC~一樣用SendRaw就可以了
只是SONY的應該要在+一些程式八
現在剩SONY沒辦法而已~~~大致上沒問題
想問大大他的程式是怎麼跑的~
沒有你的幫忙我現在也沒辦法遙控電視阿 ~~呵呵 謝謝

vkjuju 提到...

您好,我有一個keypad按下去任何鍵都對應不到任何pin,是不是要先通電給它?

Thanks

coopermaa 提到...

對應不到任何 pin ?
你是說還不確定 keypad 能不能動嗎?

要不要先照這篇的方法做試一下 keypad:
http://coopermaa2nd.blogspot.tw/2011/01/arduino-lab18-3x4-keypad.html

dusk 提到...

版主你好~
在這版上學到很多
關於上面aoaodi及版大所說明的 sendRaw()這個還是不太會用

#include

IRsend irsend;



const int buttonPin = 4; // 按鍵(pushbutton)接在 pin 4
int buttonState = 0;
// setup my arrays for each signal I want to send
unsigned int powerOn[76] = {900, -3250, 750, -500, 700, -550, 700, -500, 750, -500, 750, -500, 750, -500, 700, -550, 700, -500, 750, -550, 700, -550, 700, -500, 700, -550, 700, -550, 700,-1600, 700, -550, 700 ,-550 ,700, -500, 750, -500, 750, -500, 700, -550 ,700 ,-500, 750 ,-500, 750, -500 ,750 ,-500, 700, -1650 ,700, -500 ,700, -550, 700, -550 ,700, -500, 750, -500, 750, -500, 700, -550, 700 ,-550, 700 ,-500 ,750, -500 ,750, -500 ,700};

void setup() {

Serial.begin(9600);
pinMode(buttonPin, INPUT);
}

void loop() {

buttonState = digitalRead(buttonPin);

// 檢查按鍵是否被按下(pressed)
// 有的話,buttonState 會是 HIGH
if (buttonState == HIGH) {
// 發射紅外線訊號
irsend.sendRaw(powerOn,76, 38);
}
}

這是程式碼 發射之後在另一個arduino使用IRremote裡的dump範例測不到發射出來的紅外線碼
但是紅外線燈有亮 不知道問題出在哪
能麻煩撥空幫忙解答嗎
謝謝

dusk 提到...

經過爬文之後再測試
對於Unknown encoding的紅外線碼
只要在矩陣中將數值改為全部正值就可以發射

目前問題為如果是NEC的紅外線碼發射時用38Khz可以每次成功且穩定

如果是Unknown encoding 例如禾聯冷氣使用38KHz卻不能每次都成功

雖然成功機率頗大 但有人能幫忙解決嗎

cooper maa 提到...

你 NEC 的紅外線遙控器是什麼設備的?電視機? 冷氣,還是?

冷氣機的 code 通常都很長,不能成功很可能 buffer 太少的關係,因為 buffer 不足以保存全部的 code,建議把 buffer 加大一點試試

dusk 提到...

有加大試過 不過好像沒那麼單純
電器是冷氣

cooper maa 提到...

也許你可以用 PC 把 IR Code 整個錄製重播,先看看 IR code 有多長(我沒試過,不確定 work 不 work):

http://jumpjack.wordpress.com/2008/05/20/worlds-cheapest-remote-control-replicator-just-1/

dusk 提到...

前面發問的測試是要執行涵式庫附檔第一個範例做測試

這個範例收跟發原本有問題經過看板主的1-1下面留言發現
#define TIMER_DISABLE_INTR (TIMSK2 = 0)
這裡需要做更改

想請問版主怎麼知道要更改成=呢?

cooper maa 提到...

哦~ 那是去年在回網友小 B 有關同時發射與接收紅外線問題時發現的。

這個 bug 後來原作者也已經修正了: https://github.com/shirriff/Arduino-IRremote

dusk 提到...

了解哩~
謝謝版主解說!!

cooper maa 提到...

不客氣