自從第四台數位化之後,每台電視旁都要擺機上盒轉成AV端子或HDMI再接電視才能看,以前買的電視棒和電視卡都廢了,要和第四台業者申請機上盒還要押金和占空間,於是有了一些想法
這是我家的機上盒
這是放在角落很久的電視卡
這張電視卡可以接收AV端子信號
看了一下 ,機上盒背面有AV端子,想把訊號拉到房間,但是市面上沒賣這麼長的AV訊號線,後來想到可以用網路線來傳送訊號,一條網路線可以分8條
於是去光華電子材料行買RCA接頭和網路分接盒,然後DIY把以前在外租屋買的30米網路線接上
音源用掉3條(左聲道,右聲道,地線)影像用兩條(影像和地線) 8-3-2=3 還剩3條可利用
後來想 ....光把訊號傳到房間也沒用,要能選台才行
要控制機上盒就要用遙控,後來想到用arduino來發送紅外線訊號控制機上盒選台
然後看了網路上很多高手的文
用紅外線遙控家電
葉難: Arduino練習:紅外線傳送與接收
如何用紅外線遙控Arduino
然後決定用剩下3條線做選台功能(選台上 選台下 地線)
點網頁綠色的按鈕,按download zip
解壓縮改資料夾檔名存在arduino目錄的libraries資料夾內
然後開始做實驗了
這是我的測試用程式碼 接收端 (參考網路並修改過)
#include <IRremote.h>
int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構
void setup()
{
Serial.begin(9600);
irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
irrecv.enableIRIn(); // 啟動接收
}
void loop() {
if
(irrecv.decode(&results))
{
// 接收紅外線訊號並解碼
Serial.print("results value is "); // 輸出解碼後的資料
Serial.print(results.value, HEX);
Serial.print(", bits is ");
Serial.print(results.bits);
Serial.print(", decode_type is ");
showIRProtocol(&results);
Serial.println(results.decode_type);
irrecv.resume(); // 準備接收下一個訊號
}
}
void showIRProtocol(decode_results
*results)
{
switch(results->decode_type) {
case NEC:
Serial.print("NEC");
break;
case SONY:
Serial.print("SONY");
break;
case RC5:
Serial.print("RC5");
break;
case RC6:
Serial.print("RC6");
break;
default:
Serial.print("Unknown encoding");
}
}
測試出來頻道鍵的遙控碼如下
80BF01F E NEC和 80BF817E NEC
於是開始寫發送端程式碼
經過反覆測試後,變如下
int I,J;
unsigned long v = 0x0;
#include <IRremote.h>
IRsend irsend; // IRRemote限定使用數位腳位3
void setup()
{
pinMode(4, INPUT);
pinMode(5, INPUT);
I=0;
J=0;
}
void loop()
{
if(digitalRead(4)==LOW)
{
I=1;
}
if(digitalRead(4)==HIGH && I==1)
{
I=0;
v
= 0x80BF01FE;
irsend.sendNEC(v,32);
}
if(digitalRead(5)==LOW)
{
J=1;
}
if(digitalRead(5)==HIGH && J==1)
{
J=0;
v
=0x80BF817E;
irsend.sendNEC(v,32);
}
if(I==1&&
J==1)
{
v=0x80BF3BC4;
irsend.sendNEC(v,32);
I=0;
J=0;
delay(1000);
}
}
這是我測試配備,右邊那台是我自製行動電源
測試訊號ok,可以轉台,準備焊接電路
加工電路板用來裝dc接頭
零件試擺
焊接中
arduino uno腳位定義
328腳位圖
焊接初步完成(省略reset鍵和晶體振盪器和電容,因為我用ic內建晶振)
燒錄中,用自製燒錄板接上arduino燒錄
arduino燒錄方式(無晶振和有晶振接法)
合體,準備測試
如上圖,機上盒有usb, 直接從機上盒取出5v電壓給328晶片用
將線拉到房間,並安裝好訊號線
安裝電視卡驅動程式和軟體
後來發現廣寰的軟體有bug
,只有安裝好第一次執行可以播av訊號,關閉軟體再開後就只有聲音無畫面,害我以為是電腦或線路問題,測試好幾次並重灌win7,直到重灌完還是一樣,才上網找其他電視卡撥放軟體,最後我用kmp試成功,方法如下
右鍵>開啟>開啟WDM
右鍵>WDM
>video composite 和audio line (這時就看到av端子的訊號了)
如果還有問題,則右鍵>開啟>設定WDM/BDA
如圖設定,我這張卡這樣設定就能看了
這是我的軟體版本
接下來做選台用的的按鍵
蓋上蓋子
裝上並接好線
拉到桌上
測試後可正常選台和觀看,音量用電腦控制即可
總結: 這個裝置可以充分利用機上盒,但是客廳如果同時有人看電視轉台時,就會有搶台狀況,畢竟只有一台機上盒,不過對我家來說不必擔心,我只是懶得在客廳滿身大汗看電視,選台雖然只有上下兩鍵,但對我來說夠了,要更多功能也可以,只要用另一顆328ic 做發送端,送串列訊號到遙控端即可,這樣做即使選號轉台也ok
9/20日更新 經過數日使用,一次只能一台一台轉太慢,於是改了程式碼,讓兩鍵同時按時可以快速切換到10 ,50 , 200 , 250,並把程式碼加上註解如下
int I,J,k; //I和J用於判斷頻道上下鍵是否被按下,k則用於兩鍵同時按下記數用
unsigned long v = 0x0;
#include <IRremote.h>
IRsend irsend; // IRRemote限定使用數位腳位3
void setup()
{
pinMode(4, INPUT);//按鈕輸入腳位
pinMode(5, INPUT);//按鈕輸入腳位
I=0;
J=0;
k=0;
}
void loop()
{
if(digitalRead(4)==LOW) //按鈕按下時
{
I=1;
}
if(digitalRead(4)==HIGH && I==1) //按鈕放開時
{
I=0;
v = 0x80BF01FE;
irsend.sendNEC(v,32); //轉台上(發送紅外線訊號)
}
if(digitalRead(5)==LOW) //按鈕按下時
{
J=1;
}
if(digitalRead(5)==HIGH && J==1) //按鈕放開時
{
J=0;
v =0x80BF817E;
irsend.sendNEC(v,32);//轉台下(發送紅外線訊號)
}
if(I==1&& J==1) //當兩鍵同時按下時
{
k=k+1;
I=0;
J=0;
switch(k) {
case 1: //轉到10台(當兩鍵同時按下第一次時)
v =0x80BF49B6;
irsend.sendNEC(v,32);//1(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 2: //轉到50台(當兩鍵同時按下第二次時)
v =0x80BFF10E;
irsend.sendNEC(v,32);//5(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 3://轉到200台(當兩鍵同時按下第三次時)
v =0x80BFC936;
irsend.sendNEC(v,32);//2(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 4://轉到250台(當兩鍵同時按下第四次時)
v =0x80BFC936;
irsend.sendNEC(v,32);//2(發送紅外線訊號)
delay(200);
v =0x80BFF10E;
irsend.sendNEC(v,32);//5(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
k=0; //兩鍵同時按下記數歸零
break;
default:
k=0;
}
delay(1000);
}
}
int I,J,k; //I和J用於判斷頻道上下鍵是否被按下,k則用於兩鍵同時按下記數用
unsigned long v = 0x0;
#include <IRremote.h>
IRsend irsend; // IRRemote限定使用數位腳位3
void setup()
{
pinMode(4, INPUT);//按鈕輸入腳位
pinMode(5, INPUT);//按鈕輸入腳位
I=0;
J=0;
k=0;
}
void loop()
{
if(digitalRead(4)==LOW) //按鈕按下時
{
I=1;
}
if(digitalRead(4)==HIGH && I==1) //按鈕放開時
{
I=0;
v = 0x80BF01FE;
irsend.sendNEC(v,32); //轉台上(發送紅外線訊號)
}
if(digitalRead(5)==LOW) //按鈕按下時
{
J=1;
}
if(digitalRead(5)==HIGH && J==1) //按鈕放開時
{
J=0;
v =0x80BF817E;
irsend.sendNEC(v,32);//轉台下(發送紅外線訊號)
}
if(I==1&& J==1) //當兩鍵同時按下時
{
k=k+1;
I=0;
J=0;
switch(k) {
case 1: //轉到10台(當兩鍵同時按下第一次時)
v =0x80BF49B6;
irsend.sendNEC(v,32);//1(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 2: //轉到50台(當兩鍵同時按下第二次時)
v =0x80BFF10E;
irsend.sendNEC(v,32);//5(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 3://轉到200台(當兩鍵同時按下第三次時)
v =0x80BFC936;
irsend.sendNEC(v,32);//2(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
break;
case 4://轉到250台(當兩鍵同時按下第四次時)
v =0x80BFC936;
irsend.sendNEC(v,32);//2(發送紅外線訊號)
delay(200);
v =0x80BFF10E;
irsend.sendNEC(v,32);//5(發送紅外線訊號)
delay(200);
v =0x80BFE11E;
irsend.sendNEC(v,32);//0(發送紅外線訊號)
k=0; //兩鍵同時按下記數歸零
break;
default:
k=0;
}
delay(1000);
}
}
10月16日更新
實際操作影片
2 則留言:
讚哦!
請問用電視卡的遙控器不能用嗎?
張貼留言