2013/05/07

Arduino練習:紅外線傳送與接收

這篇的主角是紅外線(infrared、IR),俗稱紅外光,其波長在770nm(奈米)至1mm(毫米)之間,而人眼可感知的電磁波波長一般在400到700nm之間,所以紅外線屬於不可見光,在通訊、探測、醫療、軍事等方面有廣泛的用途。

請看看底下電磁波頻譜示意圖,可得知紅外線介於可見光(visible)與微波(microwave)之間。(圖片來源:維基百科




 
這篇的重點是紅外線遠端遙控,家裡電視機、音響、錄影機、DVD播放器
的遙控器,便是利用紅外線傳輸,從遙控器端(紅外線發射器)透過紅外線通訊技術發出特定編碼,然後由電視機的紅外線接收器接收,進行解碼並執行相關功能,譬如開啟電視機的電源、加大或減少音量、切換頻道、等等。

我用的是Arduino Uno R3板子、Arduino軟體開發環境為1.0.4版。

所需電子零件:
  • 紅外線接收器(Infrared Receiver),38kHz,例如TSOP38238、TSOP2438、TSOP4438、PNA4602、FM-6038TH2、FM-8038TM2-5DN。
  • 紅外線發射器(Transmitter、Emitter或稱 IR LED),發射波長為940nm。
  • 100 ohm電阻。
為什麼是38kHz?這叫做載波頻率,因為生活周遭的物品都會散發出不定程度的紅外線,為了避免干擾,設計紅外線接收器時便讓它只對特定載波頻率有反應。不同廠牌的遙控器可能會使用不同的載波頻率,但38kHz最普遍。請注意,本篇使用38kHz的紅外線接收器,不一定可正確接收你家遙控器發出的紅外線訊號,需查詢該遙控器的規格,購買正確的紅外線接收器。

為什麼是940nm呢?我查詢了紅外線接收器的資料規格表後,其中註明了其最高峰波長為940nm,也就是最敏感的地方,所以我買了能發射波長940nm的紅外線發射器。其他常見的波長還有850nm,你也可以多買一個試試看。

底下是我買的零件,大約幾十元便可搞定。


紅外線接收器的腳位非常簡單,從腳位Vout讀取紅外線訊號,腳位GND接地,以腳位Vcc提供5V電源。注意:有些紅外線接收器的GND和Vcc腳位相反,還請查詢資料規格表(datasheet)以免接錯。


底下是接線圖,非常簡單。

紅外線接收器的Vout接Arduino的數位腳位2。

紅外線接收器的GND接Arduino的GND。

紅外線接收器的Vcc接Arduino的5V。


我使用Ken Shirriff開發撰寫的IRRemote這套Arduino程式庫,下載後解壓縮,將目錄改名為IRremote,然後整個放進sketchbook/libraries裡,重開Arduino軟體開發環境後,便可在Sketch-Import Library...裡看到它的蹤影。

每家廠商都有其一套專屬的紅外線通訊協定(protocol),知名的有NEC、SONY、Philips的RC5與RC6、Toshiba、Sharp、等等,這也就是為什麼這一家的遙控器不能控制那一家的電視機。還好IRRemote已經幫我們準備好了,一般常見的紅外線協定都有支援。

程式碼如下,也非常簡單,收到紅外線訊號後便輸出到序列埠。

#include <IRremote.h>

int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
decode_results results; // 儲存訊號的結構

void setup()
{
  Serial.begin(115200);
  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 ");
    Serial.println(results.decode_type);
    irrecv.resume(); // 準備接收下一個訊號
  }
}

然後,請拿著紅外線遙控器,對著紅外線接收器隨便按一些按鈕。

我將使用Apple Remote遙控器,這是一支非常簡單的遙控器,只有六個按鈕,分別是「選單」、「播放/停止」、「音量增大」、「音量減小」、「上一個/倒退」、「下一個/快進」,可控制Mac電腦的系統音量、iTunes的音樂播放、iPhone觀賞照片幻燈片、等等。


當然了,你也可以拿其他紅外線控制器來實驗,譬如一般電視機或DVD播放機的遙控器。


應會看到類似底下的輸出:

results value is 77E11050, bits is 32, decode_type is 1

其中77E11050便是紅外線訊號的編碼,32代表它有32個位元(也就是4 bytes),而1代表它屬於哪個協定,從底下列表可知1為NEC,這些是IRRemote支援的協定。

#define NEC 1
#define SONY 2
#define RC5 3
#define RC6 4
#define DISH 5
#define SHARP 6
#define PANASONIC 7
#define JVC 8
#define SANYO 9
#define MITSUBISHI 10
#define UNKNOWN -1

我將Apple Remote遙控器六個鈕都按過之後,便能知道每個按鍵的紅外線編碼:
「選單」77E14050 、
「播放/停止」77E12050 、
「音量增大」77E1D050 、
「音量減小」77E1B050 、
「上一個/倒退」77E11050、
「下一個/快進」77E1E050。

以上是紅外線接收器的部份,接下來我要使用紅外線發射器,模擬Apple Remote遙控器的功能。

底下是接線圖,非常簡單。

Arduino的數位腳位3接100 ohm電阻後接紅外線發射器(IR LED)的長腳。

紅外線發射器的短腳接地。

注意,IRRemote限定使用數位腳位3作為紅外線訊號輸出端。若想改用其他腳位,請參考Cooper Maa的2.1 發射紅外線訊號 part 2著手修改。


程式碼如下,透過序列埠監控視窗命令紅外線發射器發出訊號:

#include <IRremote.h>

IRsend irsend; // IRRemote限定使用數位腳位3

void setup()
{
  Serial.begin(115200);
}

void loop() {
  int d;
  if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
      case '1':
        v = 0x77E14050;
      break;
      case '2':
        v = 0x77E12050;
      break;
      case '3':
        v = 0x77E1D050;
      break;
      case '4':
        v = 0x77E1B050;
      break;
      case '5':
        v = 0x77E1E050;
      break;
      case '6':
        v = 0x77E11050;
      break;
    }
   
    if(v != 0x0){
      Serial.print("read ");
      Serial.print(d);
      Serial.print(", IR send ");
      Serial.println(v, HEX);
      irsend.sendNEC(v, 32); // 輸出紅外線訊號
    }
  }
}

IRRemote函式庫支援很多種常見的紅外線協定,請使用適當的輸出函式:
void sendNEC(unsigned long data, int nbits);
void sendSony(unsigned long data, int nbits);
//  void sendSanyo(unsigned long data, int nbits); // 尚未實作
//  void sendMitsubishi(unsigned long data, int nbits); // 尚未實作
void sendRaw(unsigned int buf[], int len, int hz);
void sendRC5(unsigned long data, int nbits);
void sendRC6(unsigned long data, int nbits);
void sendDISH(unsigned long data, int nbits);
void sendSharp(unsigned long data, int nbits);
void sendPanasonic(unsigned int address, unsigned long data);
void sendJVC(unsigned long data, int nbits, int repeat);

將紅外線發射器對準我Mac電腦的紅外線接收端,啊哈,成功囉,我能透過Arduino控制音樂播放囉(雖然滿無聊的)。您可以試試家裡的遙控器,試試電源開關、頻道切換、音量增減等等按鍵。

可惜的是,因為IRRemote的限制,我們無法在一塊Arduino板子上同時加裝紅外線接收器與發射器。除非自己手動打造紅外線編解碼的功能,請參考底下的參考資料。


參考資料:

215 comments:

  1. Anonymous21/8/13 22:22

    江兄您好!

    常來您這挖寶,謝謝您提供這麼優質的資訊與譯著!

    想請教您兩個問題,

    Q1:在下文中使用的是 TSOP38238 (吃3.3V)
    (http://learn.adafruit.com/using-an-ir-remote-with-a-raspberry-pi-media-center/hardware)
    而我在光華源達買到的是6038LM(吃5V),
    我剛剛把它接上去(也是吃3.3V)可以收到遙控器的訊號,
    請問這樣會傷害到RPi嗎?

    Q2:另外不知您有沒在 Mac Mountain Lion (OSX 10.8.4) 玩 baking Pi?
    (http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads.html)
    他需要下載 yagarto-4.7.2 (由dmg解開之後是一個 app) ,
    他說雙擊之後會得到一個目錄。只是無論我麼點都無法得到該目錄。
    不知為何不做成 rar 或 zip 檔供人下載?

    謝謝您!

    ReplyDelete
    Replies
    1. Q1: 你買的6038LM,有完整的型號嗎?接腳呈直線還是90度彎曲?
      根據我手上的6038LM的規格表,其電源接腳可接受2.7V~5.5V,所以吃5V是可以動的,但是這麼一來,其輸出的電壓大概會是4.5V,這不是rpi的GPIO針腳可容忍的值,最好不要。你接3.3V應該也是能運作正常才是。

      Q2: 玩過一部分。
      你是在mac os x裡雙擊.dmg檔嗎?dmg是mac os x內建的映像檔,雙擊後就會變成一個磁碟,就好像掛載一個光碟映像檔一樣,雙擊後裡頭有
      Readme me first!!
      Version information
      yagarto-4.7.2.app
      YAGARTO.webloc
      這些檔案。

      mac os x習慣使用dmg。沒有為什麼。

      Delete
    2. Anonymous21/8/13 23:06

      他是說再雙擊 yagarto-4.7.2.app 會產生一個目錄,但是我怎麼點都無效。
      我後來是安裝windows7版,只是要切來切去很麻煩。

      謝謝您的回覆!

      Delete
    3. Anonymous21/8/13 23:12

      BTW,
      Q1 ref: http://www.mobile01.com/newsdetail.php?id=2438

      Delete
    4. yagarto-4.7.2.app是mac的應用軟體,本身就是一個目錄。

      如果是這個網址裡的6038LM,用3.3V就能動了。

      哪裡,不客氣。

      Delete
  2. Anonymous22/8/13 06:21

    我最後在這裡發現跟我安裝時比較雷同的情節:
    https://github.com/synthetos/g2/wiki/Development-Environments
    ===> [Yagarto on the Mac for Xcode]
    :
    :
    :
    Open and install yagarto. Unpack the yagarto .dmg. You should see the yagarto-4.7.2.app (or similar) in a new finder window. Move this to your home directory (~). Run the app.
    If you can't run it by double clicking, right click it and hit "Open". You should see a yagarto-4.7.2 directory in your home dir when it's done.
    In Mountain Lion the yagarto-4.7.2 dir may not show up in the Finder window. You should be able to see it from the command line in a terminal window. (cd ~ ls) In this case enter open yagarto-4.7.2 from the command line. It should show up in the Finder.

    ==== 這是我 ===========
    MacPro:~ myhome$ mkdir yagarto
    MacPro:~ myhome$ mv yagarto-4.7.2.app/ yagarto
    MacPro:~ myhome$ cd yagarto/
    MacPro:yagarto myhome$ du .
    136 ./yagarto-4.7.2.app/Contents/MacOS
    352 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/MacOS
    48 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/MainMenu.nib
    32 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/Msgbox.nib
    32 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources/SecureInputbox.nib
    448 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents/Resources
    816 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app/Contents
    816 ./yagarto-4.7.2.app/Contents/Resources/CocoaDialog.app
    64 ./yagarto-4.7.2.app/Contents/Resources/en.lproj/MainMenu.nib
    72 ./yagarto-4.7.2.app/Contents/Resources/en.lproj
    76296 ./yagarto-4.7.2.app/Contents/Resources
    76448 ./yagarto-4.7.2.app/Contents
    76448 ./yagarto-4.7.2.app
    76448 .
    MacPro:yagarto myhome$ open yagarto-4.7.2.app
    MacPro:yagarto myhome$ ls
    yagarto-4.7.2.app
    MacPro:yagarto myhome$

    -----------> 沒產生 toolchain /yagarto/yagarto-4.7.2

    更遑論要設定 .bash_profile 了 (因為看不到 bin & tools目錄呀)

    export PATH="$PATH:$HOME/yagarto/yagarto-4.7.2/bin"
    export PATH="$PATH:$HOME/yagarto/yagarto-4.7.2/tools"

    對ML10.8.4我還是新手,因此我放棄了。
    只是不想烘個派還要動用到三台機器罷了。
    我想有空再去找一下人家已成功展開後再壓縮成rar檔的比較實際些。

    謝謝您,不好意思耽擱您寶貴的研發譯時間!

    ReplyDelete
    Replies
    1. 你多了一個yagarto子目錄,但原文是把yagarto-4.7.2.app放在home directory之下,說不定有什麼差異。

      我沒有在os x下試過baking pi裡的範例,只有在windows下;但有在os x下編譯過pi的linux kernel。

      Delete
    2. Anonymous22/8/13 09:47

      兩個都試過了,都一樣沒反應,得不到 bin & tools 。
      我也曾把它拉進應用程式目錄中,也是無言的結局。

      就讓從這棵樹跳到另一棵樹的喜悅,留給松鼠吧!
      Let it be!

      謝謝囉~

      Delete
  3. Hello ~~~
    我完全是新手,剛剛入 Arduino 的門。我想請問一下:
    我想製做一對 (兩個) 紅外線收發模組,實驗互傳資料,也就是說單個的 Arduino Unor 板子上要接上一個 IR emitting diode 以及一個 IR receiver,我想請問單個板上是要分別用一個發射器與接受器好,還是去買兩個類似 CYN 70 的紅外線反射式模組來用,分別接在兩個 Uno 板子上就可以了?
    Thanks a lot.

    ReplyDelete
    Replies
    1. 我那個時候試驗的結果,若使用IRremote這套程式庫,無法在一塊Arduino板子上同時使用IR emitter與IR receiver。好像有人有辦法,但非常進階,我沒有試過。

      所以你的需求「兩塊板子,每塊板子都有IR emitter與IR receiver,可互傳資料」,
      我沒做過,目前也不知道怎麼自行製作。

      我沒用過CYN 70,網路上查詢到的資料,都是用來作為偵測用,譬如讓車子維持走在黑色軌道上,我不知道它可不可以發出一般的紅外線訊號。

      Delete
  4. 不好意思 我是arduino新手 我使用你的紅外線接收的程式碼之後沒有問題 可是使用紅外線發射的程式碼 卻出現case2:3: error: 'IRsend' does not name a type
    case2.ino: In function 'void loop()':
    case2:40: error: 'irsend' was not declared in this scope
    這三個錯誤 我找不出來請問是哪裡有問題?

    ReplyDelete
    Replies
    1. 看起來是沒有#include IRremote.h了,所以編譯器找不到IRsend這個東西。

      Delete
    2. 可是 我也把檔案解壓縮之後 放到 指定的路徑了 怎還會找不到IRsend

      Delete
    3. 嘛,說的也是,你能夠接收紅外線,也就是說IRrecv沒問題,那麼IRsend應該也沒問題才對。
      不過看到錯誤訊息case2:3: error: 'IRsend' does not name a type,理由應該就是我說的那樣。


      Delete
    4. This comment has been removed by the author.

      Delete
    5. 可以用有限狀態機(finite state machine)的程式撰寫技巧,一個LED的狀態會有:1熄滅、2熄滅(可根據亂數判斷要不要點亮)、3亮,三種狀態,
      一開始是1,經過一段時間後,進入2,然後程式就可以呼叫亂數函式,看看要不要點亮,若否,等待下一次機會,若是則點亮進入3,直到被使用者按掉,回到1。

      Delete
  5. 您好 我剛接觸arduino 我現在打地鼠用紅外線接收來控制 我的問題卡在燈隨機亮 但搖控按下去沒有滅 可是在Serial monitor上 我紅外線是有收到的 是怎麼回事???

    ReplyDelete
    Replies
    1. 抱歉,完全看不懂你的問題。

      Delete
  6. 你好 我接收 都可以 數值也都對 可是 發射出去 (紅外線有亮) 電視卻沒有動作 大概是哪裡的問題呢?

    ReplyDelete
    Replies
    1. 可能原因之一:你的紅外線發射器跟電視的紅外線接收器不相容。
      可能原因之二:你發出去的數值不正確,不符合電視機的紅外線協定。

      Delete
  7. 版主你好,我想做紅外線發射接收的燈 我的接收器接收的到遙控器等東西.但我的發射器卻毫無訊號出現
    by the way我的發射器沒那麼複雜,只是單純的一個button,按一下開燈按一下關燈
    請問該怎麼改發送端的程式碼?
    還有不好意思可以加FB嘛 我的是luna427018@gmail.com
    我還有一些想請教您!
    謝謝><

    ReplyDelete
  8. > 但我的發射器卻毫無訊號出現
    不知道是哪裡出問題,可以按照我這篇說的,用紅外線發射器模仿其他遙控器、控制相對應的電器嗎?你的紅外線發射器壞了?
    另外,似乎不能在一塊Arduino板子上同時使用紅外線接收器與發射器。

    抱歉,我不想加FB。有問題的話還請留言。
    這只是個人部落格,若有人留言,我會盡量回答。
    如果你需要的話,也可以到各大Arduino相關論壇發問。

    ReplyDelete
  9. 版主您好

    我發現一件奇怪的事情

    將這個紅外線接收器,與dallas 測溫,以及一個relay 的整合在一起

    本來是希望做到:溫度超過一個數值就啟動relay ,但也可以用遙控啟動relay

    結果這兩個東西竟然嚴重干擾,dallas 測溫會讓紅外線接收幾乎失靈,勉強偶爾可運作,而且紅外線接收會持續接收到莫名其妙的訊號

    不知是我哪裡弄錯

    該不會dallas 測溫的內部元件其實跟紅外線有啥關係

    這種現象是常態?元件在同一個arduino 內不一定能共存的現象?

    ReplyDelete
    Replies
    1. 我真的屢試不爽 XD

      只要對dallas 發出一次 sensors.requestTemperatures();

      那麼IR Receiver 就會收到一個莫名其妙的紅外線訊號,而且造成遙控按出來的被漏接

      現在解法就是讓測溫的每三十秒一次

      應該不太可能是我接線有問題 @@

      Delete
    2. 會有干擾,這是常態,電子元件與線路,無時無刻都有干擾,差別在大小而已。
      您的線路是?

      我記得sensors.requestTemperatures()發出後,dallas測溫晶片可能要花上0.5秒左右的時間,如果程式沒寫好,可能就會阻礙IR Receiver的部份。

      Delete
    3. IR 用pin3 ,溫度用pin 9 。但兩個元件可能是靠太近了

      我比較疑惑的是,玩arduino 一個多月我怎麼看都覺得他並非多工

      我在loop 內,先利用millis() 偵測時間差,每兩秒 getTemp 取得溫度,但 decodeIR 則是一定隨時都在做 (進入loop 就做)

      都沒有任何delay

      我以為這種在loop() 內先後順序呼叫,應該不會互相影響才對

      要不就是我以前寫軟體寫太多,可能硬體在loop 內的呼叫並不是我想的那樣?

      兩個呼叫有可能是多工作業背景處理?

      Delete
    4. Arduino微控制器沒有作業系統、沒有多工。

      雖然你沒有用delay,但sensors.requestTemperatures()執行時需要的時間較長,也算是delay了。

      requestTemperatures會要求全部感測器,較費時間。

      DallasTemperature程式庫裡還有waitForConversion與checkForConversion等旗標,設定後,不會等待溫度讀數轉換完成就會回傳,非常快,但必須自己檢查讀數是否有效。

      Delete
  10. This comment has been removed by the author.

    ReplyDelete
  11. 你好,請問如果紅外線序列是Unknown怎麼辦呢?

    ReplyDelete
    Replies
    1. 咳咳,沒碰過,您的遙控器這麼稀少啊?

      Unknown代表IRRemote不支援,但呼叫.decode是否能得到一些資訊呢?
      若有的話,或許還是可以用的。

      Delete
  12. 請問如果我自己做一個簡單的紅外線遙控器來控制紅外線的喇叭,那該從哪裡開始?

    ReplyDelete
    Replies
    1. 紅外線的喇叭?抱歉,我沒有這種東西耶。

      如果是用紅外線遙控器操縱喇叭的電源、音量、等,那應該跟一般遙控器差不多,要先找出原本紅外線遙控器屬於哪家規格(sony、panasonic、...)、每個按鍵的紅外線指令碼是什麼,然後自己以Arduino控制IR發射器發出相同的指令碼,如此即可。

      如果是以紅外線傳輸音訊,那我就不知道了。

      Delete
  13. 請問一下 我的會出現這個 這是什麼意思?
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope
    int RECV_PIN = TKD2; // the pin the IR receiver is connected to

    ReplyDelete
    Replies
    1. TKD2應該是Arduino Robot才有的定義,在Arduino 1.5.7的hardware\arduino\avr\variants\robot_control\pins_arduino.h裡,摘錄如下:

      #define D0 TKD0
      #define D1 TKD1
      #define D2 TKD2
      #define D3 TKD3
      #define D4 TKD4
      #define D5 TKD5

      而IRremoteTools.cpp裡使用的TKD2,

      會出現這樣的錯誤訊息,代表你選的板子的腳位定義裡沒有TKD2。

      Delete
    2. 請問 我該怎麼辦?

      Delete
    3. 呃,IRremoteTools.cpp屬於RobotIRremote的一員,而RobotIRremote是Arduino Robot(http://arduino.cc/en/Main/Robot)這塊板子才能使用的程式庫,如果你的板子不是Arduino Robot,自然不能使用。

      Delete
    4. 如果你的板子不是Arduino Robot的話,那就不要用RobotIRremote。
      RobotIRremote是從IRremote修改而來,所以請自己下載安裝IRremote。

      Delete
    5. 不好意思,你好
      我是安裝 IRremote 但也出現相同的問題
      請問我該怎麼做?

      Delete
    6. 拿掉arduino-1.5.7\libraries\RobotIRremote整個目錄,試試看。

      Delete
    7. 請參考這篇http://yehnan.blogspot.tw/2014/09/arduinoerror-tkd2-was-not-declared.html

      Delete
  14. Anonymous21/9/14 18:38

    您好 我最近一支新的冷氣遙控器遇到困難,他永遠顯示FFFFFFFF (0 bits),每個按鍵都一樣,請問會不會是頻率或波長不匹配的問題呢?

    ReplyDelete
    Replies
    1. 冷氣遙控器通常都比電視遙控器複雜,有其特別的作法。
      所以很難自己做出相容於冷氣機的遙控器(或接收器)。

      Delete
  15. 不好意思 請問一下 我做紅外線發送 會出現這樣的錯誤 我該怎麼辦?
    'IRsend' does not name a type

    ReplyDelete
    Replies
    1. 若你用1.0.x版,那原因應該是IRRemote程式庫沒有成功安裝。

      若你用Arduino 1.5.x版,那應該是跟Arduino IDE內建的程式庫起衝突,
      假設你的板子不是Arduino Robot,那麼就乾脆拿掉libraries/目錄下的子目錄RobotIRremote,
      應該就可解決。

      Delete
  16. 不好意思 請問一下 .. 我們用接收器收到9,廠牌是SANYO的
    但是打在Arduino程式上卻沒有像NEC一樣顯示橘色的字
    EX: irsend.sendSANYO(v, 32);
    SANYO沒有變橘字
    我們試過各種大小寫,也查過網路爬過文
    都沒有看到類似的問題,
    懇請大大幫忙解答 謝謝

    ReplyDelete
    Replies
    1. 顯示橘色的字?SANYO沒有變橘字?

      喔,因為IRRemote的IRsend尚未支援Sanyo。

      Delete
  17. 你好,依序照您的此篇文章實作,直到紅外線發射部分有點問題,想請教一下,以下紅外線的程式碼:

    #include

    IRsend irsend; // IRRemote限定使用數位腳位3

    void setup()
    {
    Serial.begin(115200);
    }

    void loop() {
    int d;
    if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
    case '1':
    v = 0x2FD48B7;
    break;
    case '2':
    v = 0x2FD58A7;
    break;
    case '3':
    v = 0x2FD7887;
    break;
    case '4':
    v = 0x2FDD827;
    break;
    case '5':
    v = 0x2FDF807;
    break;
    case '6':
    v = 0x2FDF00F;
    break;
    }

    if(v != 0x0){
    Serial.print("read ");
    Serial.print(d);
    Serial.print(", IR send ");
    Serial.println(v, HEX);
    irsend.sendNEC(v, 32); // 輸出紅外線訊號
    }
    }
    }

    上傳完成之後,點入Serial Monitor輸入數字1則得:
    read 49, IR send 2FD48B7

    輸入數字2則得:
    read 50, IR send 2FD58A7

    但電視依然沒有起反應,已確認過遙控器編碼與此程式編碼相同,IR LED正負極沒接反,接線都正常,想請問問題可能是出在哪裡嗎?謝謝!

    ReplyDelete
    Replies
    1. 看不出問題耶。

      1. 你確定協定是NEC嗎?
      2. 去別家電子材料行再買一顆IR LED試試看。
      3. 如果有兩塊Arduino板子的話,一方接IR接收器,一方接IR LED,試試能不能收到。

      Delete
    2. 好的 我在試試謝謝您

      Delete
  18. 你好 我參考了你的遮斷型的紅外線範例程式
    我的實驗結果他會LED一直閃爍 代表他有東西遮住
    但我中間甚麼都沒有遮 監控端也一直顯示1
    我是哪邊有出問題嗎 (確定沒有接線的錯誤)

    ReplyDelete
  19. 遮斷型?請問是哪個範例?
    電路圖?程式碼?

    ReplyDelete
  20. 版主你好,不好意思請教你一個問題。我是Arduino新手,因為校內科展的關係我開始接觸它,先前照著您的做法實驗了幾次,可是當我上傳完程式後按serial monitor 結果沒有任何回應(有嘗試其他的遙控器可是還是沒有任何回應) 拿著器材到學校詢問老師,檢查後發現沒有任何問題(ex:電路、程式等),可是還是無法遙控它,紅外線接收器甚至跟老闆換新的了,還是運作不了,請問是因為甚麼其他問題嗎? 謝謝幫忙,感激不盡。

    ReplyDelete
    Replies
    1. 還是要看遙控器的頻率嗎?

      Delete
    2. 遙控器跟紅外線接收器的載波頻率,一樣嗎?Sony的遙控器應該是40kHz,Philips是36kHz,其他大部分是38kHz。不一樣,自然收不到。
      有先試過最簡單的程式碼了嗎?本文中第一份程式碼。先確定兩者能通,再往下做。

      Delete
    3. 呃,連最簡單的程式碼都沒過,那不就還沒開始嗎。

      1. 檢查遙控器跟紅外線接收器的載波頻率,換別的遙控器試試看
      2. 確認紅外線接收器每個腳位的功能為何,有些紅外線接收器的GND和Vcc腳位相反,必須查詢datasheet才能得知
      3. 去買成對的紅外線接收器與紅外線發射器,使用兩塊Arduino板子,一個發、一個收,試試看

      Delete
  21. This comment has been removed by the author.

    ReplyDelete
  22. 請問一下
    我利用紅外線發射器 和 接收器做實驗
    我設定發射器發射32位元的訊號 紅外線接收器同樣也顯示32位元的資料
    但是發射以下訊號時
    0x77E14050
    0x77E12050
    0x77E1D050
    0x77E1B050
    0x77E1E050
    0x77E11050
    接受器顯示的卻是:
    1RU2G2G
    1RU282G
    1RU3K2G
    1RU3C2G
    1RU3O2G
    1RU242G
    也不是傳輸中出現錯誤 ˇ為每次都匯出現這樣的結果
    為什麼他不會顯示與發射器相同的編碼呢?
    謝謝

    ReplyDelete
    Replies
    1. 裝在兩個不同的ardiuno上

      Delete
    2. #include // 引用 IRRemote 函式庫
      IRsend irsend;
      void setup()
      {
      Serial.begin(9600); // 19200 bps
      }

      void loop() {
      irsend.sendNEC(0x1F2F1196,32);
      delay(1000);
      Serial.println("1");
      irsend.sendNEC(0x77E14050,32);
      delay(1000);
      Serial.println("2");
      irsend.sendNEC(0x77E12050,32);
      delay(1000);
      Serial.println("3");
      irsend.sendNEC(0x77E1D050,32);
      delay(1000);
      Serial.println("4");
      irsend.sendNEC(0x77E1B050,32);
      delay(1000);
      Serial.println("5");
      irsend.sendNEC(0x77E1E050,32);
      delay(1000);
      Serial.println("6");
      irsend.sendNEC(0x77E11050,32);
      delay(1000);
      Serial.println("7");
      }

      #include
      int RECV_PIN = 11;
      IRrecv irrecv(RECV_PIN);
      decode_results results;




      void setup() {
      Serial.begin(9600);
      irrecv.enableIRIn();


      }

      void loop() {
      if(irrecv.decode(&results)) {
      Serial.println(results.value,32);


      irrecv.resume();
      }

      }

      Delete
    3. This comment has been removed by the author.

      Delete

    4. Serial.println(results.value,32);
      改成
      Serial.println(results.value, HEX);
      即可

      Delete
    5. 可是發射時不是32為位元嗎? 為何接收變HEX格式?

      Delete
    6. void sendNEC(unsigned long data, int nbits);
      Print::println(unsigned char b, int base)

      這兩個函式,第二個參數代表的含意不同。
      println第二個參數若是32,代表以32進制輸出。

      Delete
  23. 請問第二個參數代表的含意分別代表甚麼意思呢?

    ReplyDelete
    Replies
    1. sendNEC第二個參數代表要送出幾個bit。
      rint::println若第一個參數是個整數,那麼第二個參數可以是BIN、OCT、DEC、HEX,代表以何種進位制輸出。請查詢http://www.arduino.cc/en/Serial/Print

      Delete
  24. 大大你好 使用你提供的程式或者IR範例檔想發送紅外線訊號 ,都會出現下面的錯誤
    sketch_may11a.ino: In function 'void loop()':
    sketch_may11a.ino:43:14: error: 'class IRsend' has no member named 'sendNEC'

    文章內有看到有類似的問題有人發問,可是不知道她最後怎麼解決的
    接收紅外線沒有問題很正常,只差在發送這個部分,能替我解惑一下嗎

    ReplyDelete
    Replies
    1. 根據你的錯誤訊息,代表IRsend這個類別裡沒有你想呼叫的成員函式sendNEC。
      應該是程式庫沒安裝好的緣故。

      你用的Arduino IDE版本是多少?
      1.5.x之後的版本,有內建的紅外線程式庫,但沒有IRSend。

      Delete
  25. 我的版本是1.5.8 內建的那個紅外線程式庫 RobotIRremote 我有將這個程式庫刪掉
    換成大大提供的網址那一個紅外線程式庫來使用 結果有這個錯誤
    才覺得怪怪 不知道哪邊 出了差錯!

    ReplyDelete
    Replies
    1. 因為新版的IRremote改架構了,但是好像還沒改好,

      根據IRremote的說明頁面,可到https://github.com/shirriff/Arduino-IRremote/releases下載穩定版,應該就可以了。

      Delete
  26. 剛剛有去抓了新的版本 還是有一樣的錯誤 請問葉大是不是也會有這樣的錯誤訊息?
    如果是的話 可以請葉大提供能運行的舊版本,讓我先可以動作嗎?
    不是的話 我再找找看哪邊的問題。

    ReplyDelete
    Replies
    1. 我沒有錯誤。


      https://github.com/yehnan/arduino_book_yehnan
      子目錄libraries_source裡的Arduino-IRremote-master.zip

      Delete
    2. 感謝 葉大 程式可以正常動作。
      再請教一個問題 我今天要使用Arduino接收某個儀器輸出的電流2~40mA
      我需要額外的東西才能讀取嗎?還是直接接上板子他就會讀到了?

      Delete
    3. 需要額外的零件。
      搜尋「Arduino 測量 電流」,有幾篇分享文。

      Delete
    4. 想請教版主大大,對於TSOP38238相關系列的接收端的疑問
      1.) 該元件本身就會具備解碼的功能嗎?
      2.) 沿上、解碼格式會是怎樣的型態與數值呢?

      受教了

      Delete
    5. 1. 沒有。
      2. 要看傳送方發出什麼格式的形態與數值。

      Delete
    6. 要如何把紅外線接收器收到的資料儲存並且記錄下來?

      Delete
    7. 不懂。就儲存啊。
      儲存到SD卡?開檔、寫入檔案、等等。

      Delete
  27. 您好 !
    我在製作發射器時有些問題請問一下
    目前接收到到的數值為
    results value is 404050AF, bits is 32, decode_type is 3
    decode_type 是 3 所以應該是RC5這個協定
    發射器的程式部分也在最後輸出的部分
    改為 irsend.sendRC5(v, 32); // 輸出紅外線訊號
    線路部分應該是沒有問題
    想請問是否有哪邊沒有注意到要做更改呢 ?
    麻煩您了 感謝

    --這邊附上我發射器部分的程式碼
    #include
    #include
    IRsend irsend; // IRRemote限定使用數位腳位3
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    int d;
    if( (d = Serial.read()) != -1) { // 讀取序列埠
    unsigned long v = 0x0;
    switch(d){ // 根據讀取到的資料,換成代表六個按鍵的紅外線編碼
    case '1':a
    v = 0x404050AF;
    break;
    case '2':
    v = 0x4040708F;
    break;
    }

    if(v != 0x0){
    Serial.print("read ");
    Serial.print(d);
    Serial.print(", IR send ");
    Serial.println(v, HEX);
    irsend.sendRC5(v, 32); // 輸出紅外線訊號
    }
    }
    }

    ReplyDelete
    Replies
    1. 上面#include 是沒有複製好 在程式裡是正常的!

      Delete
    2. 你的問題是?

      Delete
    3. 我們發射的紅外線無法開啟電視

      但是我們剛剛 試成功了
      奇怪點的是接收的結果是 decode_type is 3意思不是 協定是RC5
      所以這必分要更改irsend.sendRC5(v, 32);

      但是我們剛剛蝦矇把協定改回NEC就成功了 ?
      不知道怎麼一回事@@

      Delete
    4. decode_type is xx,什麼數字代表哪種協定,這要看你使用的IRRemote程式庫而定,作者有改,請查詢IRremote.h。

      我寫這篇文章時,3代表的是RC5,但是新版IRRemote的3似乎改成NEC了。

      Delete
    5. 哦哦 那應該就是這樣了
      問題已經解決
      非常感謝你的分享!!!!!

      Delete
  28. This comment has been removed by the author.

    ReplyDelete
  29. 請問老師 , 如何能達成像影片中這樣 ,利用 twitter 控制 arduino ? https://www.youtube.com/watch?v=59pHXHXJqAw

    ReplyDelete
    Replies
    1. 首先連上網路,使用ethernet或wifi擴充板,

      然後使用HttpClient之類的程式庫,從Twitter網站抓取推文,
      解析推文內容,找出代表顏色值的部份,然後修改RGB的顏色。

      影片範例應該是每10秒去抓一次顏色值。

      Delete
  30. 老師您好:
    我想自製一個紅外線測距 (想做陣列型的,市面找不到有賣)
    如果用上面的透明紅外線sensor
    http://www.icshop.com.tw/product_info.php/products_id/4128
    能夠做到光強度感應嗎?
    還是一定要用到您另外一篇的http://yehnan.blogspot.tw/2013/12/arduinotsl2561.html 明度感應器才行?

    ReplyDelete
    Replies
    1. 紅外線測距?你說的是這種嗎http://aroboto.com/shop/goods.php?id=189 ?

      光強度感應,當然要用別的感測器才做得到吧。

      Delete
  31. 你好,我最近作了一個很傻的事情,不知是否會壞掉?
    我把火焰感測器拿來燒(是直接放入火裡),但是只燒了大概一秒鐘,很快就拿起來了。

    ReplyDelete
    Replies
    1. 屬不正常用法,誰知道呢。

      Delete
  32. Anonymous18/3/16 21:32

    您好:
    家裡的電視遙控器壞了,也不見了(目前看電視都是用手按...).最近興起一個想要自己做遙控器的念頭(電視是奇美的),但我不知奇美的遙控器的紅外線通訊協定是用那一種,想請問可否用IRremote配Arduino得知是那種通訊協定?
    若答案是否定的,那有什麼方式是值得我去試的?
    謝謝!

    ReplyDelete
    Replies
    1. 最簡單的作法是去大賣場買一支。

      奇美電視使用哪一套紅外線協定,我上網搜尋,沒找到。

      如果奇美沒有自創新協定、而是使用既有的協定,那麼就能用這篇介紹的作法查出來。

      Delete
    2. 您好:
      小弟不才,看了您上述提供的程式碼後,覺得您應該是讀取現有遙控器的按鍵碼後再製作出和該遙控器相同功能的發射電路.但我的狀況是遙控器不見了,我無法取得遙控器紅外線訊號的編碼資料,我的對象只有電視機(紅外線接收)而已,我有想過幾個方法:
      1.想辦法借到一個也是奇美的遙控器,用大大提供的方法做出遙控器...
      2.使用常見的紅外線通訊協定,利用IRremote函式庫,一個一個試試看,碰碰運氣看那個可以用...(可是我上網找不到各種常見協定的按鍵編碼資料,或許可以打電話到奇美的技術部門問問看...)
      3.更聰明的方法......(但我想不到)

      Delete
    3. > 您應該是讀取現有遙控器的按鍵碼後
      > 再製作出和該遙控器相同功能的發射電路
      yes

      > 1.想辦法借到一個也是奇美的遙控器
      yes

      > 2.使用常見的紅外線通訊協定...一個一個試試看...
      嗯,很麻煩。
      > 找不到各種常見協定的按鍵編碼資料
      我也不清楚。

      > 打電話到奇美的技術部門問問看
      我沒試過。

      > 3.更聰明的方法
      嗯,上網找找,看看有沒有別人嘗試過你想做的事情。
      但我找不到。

      Delete
    4. Anonymous20/3/16 21:50

      謝謝您...

      Delete
  33. 您好
    我想請問您一個問題
    我用Arduino+Ethernet寫了一個紅外線學習的程式
    可以學習4個編碼並且發射學習過的碼
    而現在碰到的問題是
    我們有牌子的編碼(如NEC)
    都可以儲存4個並且發射相對應的碼
    而在Unknown碼的部分
    我們前面儲存的編碼都會被後面儲存的紅外線碼所覆蓋
    請問有沒有什麼方法可以解決這個問題??

    ReplyDelete
    Replies
    1. > 前面儲存的編碼都會被後面儲存的紅外線碼所覆蓋
      不懂為何如此,請詳述。

      Delete
    2. 假設我們現在儲存了4個編碼
      儲存完之後,發射出去的編碼
      都是第4個紅外線碼
      在協定為UNKNOWN的時候才會出現這個問題
      其他有協定的紅外線碼都不會

      Delete
    3. 不懂為何如此,請詳述。

      程式沒寫對吧。

      Delete
  34. 你好
    我想請問一下
    如果我接收的紅外線編碼他是33bits
    怎麼辦?
    email:s9910721@gmail.com

    ReplyDelete
    Replies
    1. 有聽聞過33 bits,但沒實際碰過。

      Delete
    2. 我是接收冷氣的紅外線碼

      Delete
    3. 冷氣機的遙控器,通常比電視的更為複雜,而且有記憶功能。

      Good Luck.

      Delete
    4. 我還有用一個機上盒(台灣大寬頻)的遙控器
      錄出來的編碼也很特別
      results value is 514AEB, bits is 25, decode_type is 11
      results value is FFFFFFFF, bits is 0, decode_type is 11
      results value is D14FC0AC, bits is 32, decode_type is -1
      results value is BB56C1F5, bits is 32, decode_type is -1
      results value is FFFFFFFF, bits is 0, decode_type is 11
      results value is FFFFFFFF, bits is 0, decode_type is 11
      這樣

      Delete
    5. 紅外線傳輸並無標準可言。

      你給的結果是按一次按鍵的結果嗎?若是,的確很特別,我也曾遇過。

      IR發射器與接收器必須匹配,譬如載波頻率與紅外線波長,否則也會發生各種奇異現象。

      Delete
  35. 請問一下紅外線發射器的led燈需要買多少瓦的燈泡,會因為訊號太弱冷氣接收不到嗎
    有推薦的瓦數嗎?

    ReplyDelete
    Replies
    1. 瓦?燈泡? 沒聽說過耶
      紅外線自有其距離限制 大概就是三公尺左右吧

      冷氣 冷氣機的紅外線 通常很特別 我沒玩過

      Delete
  36. 可以請問用燈泡顯示紅外線心跳感應的二進制"計數"程式要如何去找或寫嗎?拜託求解謝謝

    ReplyDelete
    Replies
    1. 接收紅外線心跳感應的訊號,記錄次數在int變數裡,
      使用bitRead()讀取每個位元的值,1或0,輸出亮滅狀態控制LED。

      Delete
  37. 您好
    想問電阻接100ohm的理由是?
    最近在考慮發射功率的問題
    調查一陣子發現Arduino的digital output pin電流只有50mA
    我用想電晶體放大電流但不太知道詳細的計算是怎樣
    目前我是先不管電晶體的DC gain,直接用(9V-1.5V(IR LED壓降))/100mA計算限流電阻68ohm
    但實際接上去量只有約60mA左右,請問大概可能是哪邊出問題?

    ReplyDelete
    Replies
    1. > 電阻接100ohm的理由是?
      限制通過IR LED的電流。(5-1.2)/0.1 = 38,有人會選33 ohm,有人保守一點選100。

      > 實際接上去量只有約60mA左右
      不知道。

      電路圖?


      Delete
  38. This comment has been removed by the author.

    ReplyDelete
  39. 請問接收到紅外線的訊號之後有辦法比較那個紅外線訊號嗎?
    這是我的Code:
    if (irrecv.decode(&results)) {
    value = results.value;
    if (value=="FF30CF") {
    Serial.print("Test");
    }
    }
    沒有任何錯誤,可是我朝他發射訊號的時候卻沒有任何反應,該如何比較呢?

    ReplyDelete
    Replies
    1. if (irrecv.decode(&results)) {
      value = results.value;
      if (value=="FF30CF") {
      Serial.print("Test");
      }
      irrecv.resume();
      }

      Delete
  40. 不好意思請問我這個要怎麼處理
    D:\microsoft\Downloads\sketch_nov26a1\sketch_nov26a1.ino:2:19: fatal error: Timer.h: No such file or directory

    #include "Timer.h"

    ^

    compilation terminated.

    exit status 1
    板子Arduino/Genuino Uno編譯錯誤

    ReplyDelete
    Replies
    1. 少了Timer這個程式庫,
      到https://github.com/JChristensen/Timer下載,
      有1.x版與2.x版。

      Delete
  41. 不好意思請問一下 我接收使用廣華買的HS0038B
    http://shop.cpu.com.tw/product/46882/info/

    程式碼都和你一樣,上傳時也沒出錯,但拿了很多遙控器來試都沒反應,這是接收器的問題嗎?

    ReplyDelete
    Replies
    1. 都沒反應,滿奇怪的。

      接收器的線路檢查一下,OUT、GND、Vcc。

      再買個接收器,試試囉。

      Delete
  42. 不好意思
    請問一下 我在制作一个多個的红外接收端,通常的红外接收器僅需要一个红外接收頭即可,但因為我的项目特殊,需要定義5個红外接收頭 請問有辦法嗎
    #include
    #define motorIn1 8 //L298N IN1 D8
    #define motorIn2 7 //L298N IN2 D7
    #define motorIn3 6 //L298N IN3 D6
    #define motorIn4 5 //L298N IN4 D5
    int a;

    const int RECV_PIN1 = 4;// 使用數位腳位4接收紅外線訊號
    const int RECV_PIN2 = 9;
    const byte RECV_LED = 13;
    IRrecv irrecv(RECV_PIN1); // 初始化紅外線訊號輸入
    IRrecv irrecv2(RECV_PIN2);
    //IRsend irsend;
    decode_results results; // 儲存訊號的結構
    void setup()
    {
    pinMode(motorIn1, OUTPUT);
    pinMode(motorIn2, OUTPUT);
    pinMode(motorIn3, OUTPUT);
    pinMode(motorIn4, OUTPUT);
    pinMode(RECV_LED, OUTPUT);
    Serial.begin(9600);
    irrecv.enableIRIn(); // 啟動接收
    }
    void loop()
    {

    if(irrecv.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    if (results.value == 0xC1C7C03F) //左轉
    {
    Serial.println("on");
    digitalWrite(motorIn1, HIGH);
    digitalWrite(motorIn2, LOW);
    digitalWrite(motorIn3, LOW);
    digitalWrite(motorIn4, LOW);
    digitalWrite(RECV_LED, HIGH);
    delay(1500);
    }
    }
    if(irrecv2.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    if (results.value == 0xC1C7C03F) //右轉
    {
    Serial.println("of");
    digitalWrite(motorIn1, LOW);
    digitalWrite(motorIn2, LOW);
    digitalWrite(motorIn3, HIGH);
    digitalWrite(motorIn4, LOW);
    digitalWrite(RECV_LED, HIGH);
    delay(1500);
    }
    }
    irrecv.resume(); // 準備接收下一個訊號
    }
    這是我的程式碼,但是設置第二個紅外線接收器後,紅外線接收器就收不到訊號了

    ReplyDelete
    Replies
    1. 那請問一下,這個程式庫有說明嗎,因為我下載下來放進去,要驗證時就會出現這個Arduino:1.6.12 (Windows 7), 板子:"Arduino/Genuino Uno"

      C:\Users\AnAn\AppData\Local\Temp\ccQBDauf.ltrans0.ltrans.o: In function `IRrecv::decode(decode_results*) [clone .constprop.3]':

      ccQBDauf.ltrans0.o:(.text+0x552): undefined reference to `IRrecv::decodeNEC(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x560): undefined reference to `IRrecv::decodeSony(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x56e): undefined reference to `IRrecv::decodeSanyo(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x57c): undefined reference to `IRrecv::decodeMitsubishi(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x58a): undefined reference to `IRrecv::decodeRC5(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x598): undefined reference to `IRrecv::decodeRC6(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5a6): undefined reference to `IRrecv::decodePanasonic(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5b4): undefined reference to `IRrecv::decodeLG(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5c2): undefined reference to `IRrecv::decodeJVC(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5d0): undefined reference to `IRrecv::decodeSAMSUNG(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5de): undefined reference to `IRrecv::decodeWhynter(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5ec): undefined reference to `IRrecv::decodeAiwaRCT501(decode_results*)'

      ccQBDauf.ltrans0.o:(.text+0x5fa): undefined reference to `IRrecv::decodeDenon(decode_results*)'

      collect2.exe: error: ld returned 1 exit status

      exit status 1
      板子Arduino/Genuino Uno編譯錯誤

      This report would have more information with
      "Show verbose output during compilation"
      option enabled in File -> Preferences.

      Delete
    2. > 放進去
      放哪裡?

      我自己下載並編譯,無問題。

      Delete
    3. 就是把你給我的網站,我把她下載下來,解壓縮,然後放進libraries資料夾理,再進行修改成IRremote,可是我範例那理也找不到紅外線的東西(我有重開arduino)麻煩大大幫我解惑,謝謝。

      Delete
    4. 我做的動作,就是你說的,不知何處出錯。

      要注意目錄結構,
      libraries裡要放IRremote目錄,而IRremote目錄裡,應有IRremote.cpp、IRremote.h等原始檔。

      Delete
    5. 不好意思再請問一下,大大給我的這個程式庫是可以在arduino上裝設多個紅外線接收器的嗎

      Delete
    6. 特別修改後的IRRemote程式庫,才支援多個紅外線接收器,
      https://github.com/z3t0/Arduino-IRremote/tree/dev
      試試吧,我只聽說別人用過。

      Delete
    7. 那請問怎樣算是有成功放進去

      Delete
    8. 放什麼?
      程式庫?
      有成功的話,使用該程式庫的sketch,就可成功編譯並連結。

      Delete
    9. 恩恩 可是我從草稿碼要匯入程式庫就會出現這個
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      在C:\Program Files (x86)\Arduino\libraries\IRremote: Missing 'paragraph' from library裡找到無效的程式庫
      請問是什麼問題

      Delete
    10. 不知道。

      完整的錯誤訊息?

      Delete
  43. This comment has been removed by the author.

    ReplyDelete
  44. 想請問同一組的code與材料在Uno上發射可正確執行,但換到Atmega644晶片時卻無法,會是晶片初始化上有需要設定甚麼嗎?

    ReplyDelete
    Replies
    1. 發射腳位要改改,
      請參考 https://github.com/z3t0/Arduino-IRremote
      尋找644的部份

      Delete
  45. 請問:Arduino的serial monitor測出的解碼值會有突然閃跳的數值跑出來,是否可解釋是實作現場有好幾隻同型的紅外線遙控器干扰所致?

    Ted Lee

    ReplyDelete
    Replies
    1. 如果載波頻率一樣的話,就會干擾。

      Delete
    2. Tks,那就是了,我在office玩時搖控器解碼怎按都是同一值
      教室裡有13套相同材料,carrier都是38KHz

      Ted Lee

      Delete
  46. 版主您好:
    想請教一個問題..不知道您有沒有遇到過?就是依照您作法...編譯上傳後已經可以接收到搖控器的訊息...都正常...但在arduino(我是使用arduino micro pro)重開後..紅外線接收器接到的訊號編碼就變不同了,序列埠顯示的編碼明顯不同...除非再重新上傳一次至arduino上...否則接收器接收到同一按鍵的訊息編碼都不同...請問版主有遇過這樣的情形嗎??

    ReplyDelete
    Replies
    1. 沒遇過。超級怪。

      電路? 哪個紅外線接收器? 程式?

      Delete
    2. 紅外線接收器的程式,同樣的程式...我在arduino nano使用是正常的,但在arduino micro pro關掉要重新開啟後,從序列埠可以看到收到的編碼就不同(遙控器同一按鍵),電路就是經外線接收的電路

      Delete
    3. 不知道耶,orz。

      Delete
    4. 我找到問題了,arduino micro pro這片在官網並沒有這個型號,雖然晶片和arduino micro(官網有arduino micro的型號)一樣,但設計的電路不同,沒想到竟會發生這樣奇怪的問題,目前改成arduino micro後,同樣的接法,同樣的程式,電源關掉後再重開就不會有之前奇怪的情形發生了,謝謝版主花時間協助,也跟版主分享我試出來的結果。

      Delete
    5. 厲害,恭喜你。多謝回報與分享。
      請問你的板子到底是哪一塊,產品網址是?

      Delete
    6. This comment has been removed by the author.

      Delete
    7. 這二塊版子都是在露天購買的,網址上面都有照片:官網有的arduino micro的這塊板子,購買的網址是http://goods.ruten.com.tw/item/show?21312301266108,而官網沒有這型號的arduino pro micro 購買網址是http://goods.ruten.com.tw/item/show?21537652077319

      Delete
    8. Arduino Micro是Adafruit的產品 https://www.adafruit.com/product/1086,也成為arduino.cc官方產品之一。

      Pro Micro應該是Sparkfun的產品 https://www.sparkfun.com/products/12640 。

      原廠都要20美金以上,不太可能以兩三百塊台幣買到,
      但他們的電路設計圖都有公開,所以任何人都可以仿製。

      Delete
    9. 不知道是不是仿制的問題,至少測試結果Pro Micro這片,在電源重開後接收紅外線的編碼會跑掉,雖然程式沒變,另一塊就不會,之前買MAGE 2560也有發生過類似的問題,MEGA 2560版接NRF24L01+無線收發模組傳送或接收就是會有問題,國外論壇上也蠻多人在問的,但似乎也沒有很完整的解決方式,換版似乎是比較快的方法,感謝版主熱心的回覆。

      Delete
    10. 仿製為了降低成本,能省則省,用料較差,電路設計可能與原版有所差異,就看你使用時、會不會碰到那部份而已。

      Delete
  47. 版主大大您好,我想請問一下,我的紅外線接收端接法合板主一樣,資料庫也有新增了,不過在編譯時卻出現錯誤訊息
    Arduino:1.8.3 Hourly Build 2017/03/23 09:33 (Windows 10), 開發板:"Arduino/Genuino Uno"

    c:\users\user\desktop\arduino\arduino-nightly\hardware\tools\avr\bin\../lib/gcc/avr/4.9.2/../../../../avr/bin/ar.exe: unable to rename 'core\core.a'; reason: File exists

    exit status 1
    開發板 Arduino/Genuino Uno 編譯錯誤。

    This report would have more information with
    "Show verbose output during compilation"
    option enabled in File -> Preferences.

    可以請教一下發生了什麼問題嗎?我是剛接觸ARDUINO的新手,所以不太明白

    ReplyDelete
    Replies
    1. 現在變成這樣了

      Arduino:1.8.3 Hourly Build 2017/03/23 09:33 (Windows 10), 開發板:"Arduino/Genuino Uno"

      fork/exec C:\Users\user\Desktop\arduino\arduino-nightly\hardware\tools\avr/bin/avr-g++.exe: Access is denied.
      開發板 Arduino/Genuino Uno 編譯錯誤。

      This report would have more information with
      "Show verbose output during compilation"
      option enabled in File -> Preferences.

      Delete
    2. 關掉防毒軟體,試試看。

      Delete
  48. 你好 我想請問一下
    想增加紅外線發射距離 要怎麼改電路呢???
    比如增加2n3904電晶體之類的 但我不知道要怎麼接

    ReplyDelete
    Replies
    1. 查看紅外線發射器的datasheet,找出順向電流與順向電壓的最大上限,算出限流電阻值,
      arduino板子的腳位,應該無法輸出那麼大的電流,
      所以需要連接電晶體,接法請上網找,
      例如http://www.robotroom.com/Infrared555.html

      Delete
  49. 你好 我想問一下
    我在紅外線發射的程式中編譯正常
    但是在實際send訊號時 我的IRLED沒有反應
    用手機的相機看時沒有紅色的光 應該是沒有發送出去
    但檢查腳位是正確的 請問這種情況該怎麼做呢?

    ReplyDelete
    Replies
    1. 我使用的板子是 arduino yun 後來發現輸出pin插在13的話 就會送出相機也看得到光 sendRC5出去的值是正確的 但是接收端decode_type會是1 其餘的send函式送出的直都會是錯的 decode_type都會變成 -1

      Delete
    2. IRRemote會根據板子預設設定紅外線訊號輸出的腳位,可看IRremoteInt.h(或boarddefs.h),
      Yun的微控制器晶片是ATmega32U4,所以應該是使用腳位10。
      #elif defined(__AVR_ATmega32U4__)
      //#define IR_USE_TIMER1 // tx = pin 14
      //#define IR_USE_TIMER3 // tx = pin 9
      #define IR_USE_TIMER4_HS // tx = pin 10


      Delete
  50. 您好 我想請問一下
    在紅外線接收部分依照您的程式碼上傳
    器材是用8038LM接收器和紅外線接收模組http://www.ltc.com.tw/product_info.php/products_id/60575
    13腳位的LED燈有亮起 按下遙控器時模組上的LED燈也有閃爍
    但是serial monitor上卻沒有顯示任何東西
    (用大金冷氣遙控器做測試)
    想請問可能的問題是在哪呢

    ReplyDelete
    Replies
    1. 冷氣遙控器通常都比電視遙控器複雜,有其特別的作法。

      Delete
    2. 但是用東元的電視遙控器也沒辦法顯示
      請問會不會是板子問題呢

      Delete
    3. 看看遙控器發出的紅外線的載波頻率是什麼?
      要跟你的接收器一樣才行。

      Delete
  51. This comment has been removed by the author.

    ReplyDelete
  52. 你好想請問一下
    我現在使用的晶片為MT7697 那是不是IRemote libraries就不使用了?

    ReplyDelete
    Replies
    1. 看不懂你的問題。

      參考這個
      https://docs.labs.mediatek.com/resource/linkit7697-arduino/en
      試試看吧。

      Delete
  53. 葉大 您好 我再編譯紅外線程式到MT7697時無法成功,但是編譯到leonardo就可以編譯。
    晶片不同但程式是一樣的。請問該如何處理呢?

    ReplyDelete
    Replies
    1. 錯誤訊息?

      你的MT7697有IRRemote這套程式庫嗎?

      Delete
    2. compilation terminated

      exit status 1
      開發板linkit 7697 編譯錯誤。
      出現以上錯誤///
      IRRemote我都放在arduino IDE的libraries裡面。
      兩個晶片都是用arduino IDE去撰寫。

      Delete
    3. C:\Program Files (x86)\Arduino\libraries\IRremote\IRremote.cpp:28:27: fatal error: avr/interrupt.h: No such file or directory

      #include

      ^

      compilation terminated.

      exit status 1
      開發板 LinkIt 7697 編譯錯誤。

      Delete
    4. C:\Program Files(x86)\Arduino\libraries\IRremote
      \IRremote.cpp:28:27: fatal error: avr/interrupt.h: No such file or directory

      #include
      ^
      compilation terminated.

      exit status 1
      開發板 LinkIt 7697 編譯錯誤。
      //不好意思 跑板我在貼一次 完整錯誤訊息

      Delete
    5. IRremote有支援7697嗎?
      根據https://github.com/z3t0/Arduino-IRremote
      ,應該是沒有。

      找得到的資訊,只有這篇,
      https://docs.labs.mediatek.com/resource/mt7687-mt7697/en/tutorials/ir-transceiver-part-1
      但他是7687,我不知道跟7697差多少。

      Delete
  54. 您好 我想請問一下
    我接收進來的都是亂碼怎麼辦

    ReplyDelete
    Replies
    1. 請再詳細描述。

      Delete
    2. 亂碼的問題解決了,鮑率調整過就OK了,不過現在發射出的紅外線好像很弱,電視接收不到,我透過手機鏡頭錄影,按下遙控器時,遙控器的紅外線發射器射出很強的光線,而我麵包板接的發射器就只有一點亮光而已,請問這可以透過程式讓輸出電壓或電流提升嗎,還是我要換一個功率大一點的紅外線發射器

      Delete
    3. 呃,買個 高功率紅外線LED 試試...

      Delete
  55. Anonymous5/11/17 14:10

    請問 用五個紅外線發射器和接收器,發射器都發射同一個訊號,讓每個接收器收到相對的發射器的訊號,分成五組
    這樣可以做到嗎??
    可以的話程式該怎麼打??

    ReplyDelete
    Replies
    1. 呃,既然是同一個訊號,怎麼分辨?

      Delete
    2. Anonymous5/11/17 17:35

      我想讓每組收到訊號後讓Led亮,然後沒收到就不亮
      但每次試都只有一個接收到

      Delete
    3. This comment has been removed by the author.

      Delete
    4. 主要第二個接收器收不到訊號程式不太知道怎麼打

      Delete
    5. 喔,我想起來了。

      一塊板子要接兩個(或以上)的IR接收器,有困難,
      請參考這篇 https://github.com/z3t0/Arduino-IRremote/issues/20

      Delete
    6. 請問如果相同的訊號,五個接收器插在arduino uno板上的不同接角
      要怎麼打程式分辨出哪個接收器送回來的資料

      Delete
    7. 呃,你讓5個接收器都動起來了嗎?都能收到訊號?
      如果還沒,請參考上一留言。

      我只有做過兩塊板子、各自有一個IR接收器與一個IR發射器,互相傳送且接收。我沒有在一塊板子上裝兩個IR接收器的經驗。

      Delete
  56. 我巳經將輕鋼架風扇的碼錄起來(它的協定是UNKNOW ),但是發射之後,紅外線有動作會亮,但是,輕鋼架風扇卻沒有動作,請問,要如何解決?

    ReplyDelete
    Replies
    1. UNKNOW代表不知道。
      風扇的紅外線控制,是不是有狀態啊?
      那種的比較複雜,跟一般電視機的不同。

      Delete
    2. 謝謝您的回信,decode 還是可以解出,但是-1代表UNKNOW, /*
      * 371A3C86 關
      1D2FEFF6 轉向
      143226DB 風速1
      E0984BB6 風速2
      A32AB931 風速3
      39D41DC6 定時
      */
      雖然找出其對應關係,但是,當IR 發射後,雖然IR 燈會亮,但是,風扇設備卻無法接收,問題會出現在那裡?

      Delete
    3. 不知道。

      有些裝置的控制功能,是有狀態的,比較複雜,
      不是單單傳個紅外線碼就可以了。

      Delete
  57. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. 請問我想將 Serial.print(results.value, HEX);的值2F950AF指定給String san = HEX;,為什麼印出來的Serial.print(san);會是16而不是2F950AF?

      Delete
  58. 試試
    String san = String(results.value, HEX);
    Serial.print(san);

    ReplyDelete
  59. Anonymous2/1/18 15:05

    版主您好:
    謝謝您提供這麼好的內容,真的很實用
    不過我有個問題想問一下
    我有兩塊Arduino UNO的板子
    一塊用來傳送紅外線資料(sendNEC)
    一塊用來讀取紅外線資料
    程式碼都跟您網站上附的一樣
    可是在接收紅外線的Arduino的監控窗裡type卻一直是unknow
    讀進來的值也不是我送出的值
    請問這可能是什麼原因造成的?

    ReplyDelete
  60. 我想請問一下,我要用arduino控制冷氣,

    但功能是把arduimo來當成一個遙控器,
    設定每天晚上10點開啟早上8點關掉,到了中午11點開啟下午3點關掉。

    能不能先把程式打好輸入在arduino裡面,不要讓arduino板連接冷氣和電腦,
    只要讓arduino板連接電源讓他作動即可。

    在arduino板外接個麵包版+紅外線接受器+定時器

    這樣可行嗎? 還是有少了什麼?



    暑假才接觸到arduino的男子


    ReplyDelete
  61. 版主你好,我要用Arduino控制冷氣,但是我身旁的紅外線接收器是433MHZ,

    能用Arduino程式把紅外線接收器的頻率給降低嗎,讓紅外線接收器收到冷氣遙控器的紅外線,

    還是只能乖乖的去買38KHz的紅外線接受器?

    ReplyDelete
  62. Positive site, where did u come up with the프리서버추천

    information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work.

    ReplyDelete
  63. 請教葉老師, 我用UNO/ESP32分別試了很多次, 按遙控器都有反應, 但收到的都是
    results value is 0, bits is 0, decode_type is 0
    是什麼原因?

    ReplyDelete
  64. This article was written by a real thinking writer.I agree many of the with the solid points made by the writer. 검증업체

    ReplyDelete
  65. Anonymous15/4/21 17:19

    你好,請教板主或高手,我是新手,使用你的紅外線程式IRremote,可完全燒錄arduino裡,但是序列簿會一直出現
    The function decode(&results)) is deprecated and may not work as expected! Just use decode() - without any parameter.
    我有把&results刪掉,卻英文不見了,可是出現的是數字0,換數字0
    是我設定有問題嗎,還是IRremote新舊板本有問題嗎。
    我可以加LINE 或MAIL問你嗎

    ReplyDelete
  66. 板主你好,如果我想要用發射器和接收器做成一個能感測是否有物體通過的機構,我打算把它用在自製販賣機的出貨口,我需要用到任何函式庫嗎?

    ReplyDelete
  67. Anonymous27/6/21 23:23

    @葉難大大
    下面的是我的程式
    我想問我想讓rgb三個燈利用紅外線遙控器來控制
    按數字1則亮起來在按一次變更亮按數字4則暗在暗一次更暗(這是操控紅色燈)
    以此類推......(請問我該如何變換燈(我的意思是我原本控制紅色燈然後現在我想控制綠色燈該怎麼打
    #include
    int RECV_PIN = 2;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void setup(){
    irrecv.enableIRIn();
    Serial.begin(9600);
    pinMode(10,OUTPUT);
    }
    int light=0;
    void loop() {
    if (irrecv.decode(&results)) {
    if (results.value==0xFD28D7){ //4

    if (light-5<0){
    light=0;
    }
    if (light-5>0){
    light-=5;
    }
    }
    if (results.value==0xFD08F7){//1
    if (light+5>225){light=255;
    }
    if (light+5<225){
    light+=5;}
    }
    analogWrite(10,light);

    irrecv.resume();

    }
    delay(100);
    }

    ReplyDelete