2016年9月8日 星期四

用一條網路線讓電腦和電視共用第四台機上盒

自從第四台數位化之後,每台電視旁都要擺機上盒轉成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的話,當收到訊號時,腳位13LED便會閃爍
  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");
  }    
}


測試出來頻道鍵的遙控碼如下 80BF01FE  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);
  }
}
10月16日更新
實際操作影片 





2 則留言:

Ken77 提到...

讚哦!

Unknown 提到...

請問用電視卡的遙控器不能用嗎?

自製簡易新風系統

                   最近空氣品質很糟糕 , 家裡的空氣清淨機開全速壓制 , 只能壓到室內 30~40ug/m3 , 而且要關窗才有效 , 長時間關窗會有二氧化碳的問題 , 後來看網路的文章看多了 , 發現有種東西叫 全熱交換器 , 在裡面...