日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ardino基础教程 20_红外遥控

發布時間:2025/4/5 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ardino基础教程 20_红外遥控 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗二十:紅外遙控

庫文件下載鏈接:ArduinoCode20-紅外遙控庫代碼.zip
注意:把 IRremote 文件夾放到 編譯器安裝目錄下的\Arduino\libraries里。不然編譯不過。
例如我的:C:\Program Files\Arduino\libraries

一、什么是紅外接收頭?
紅外遙控器發出的信號是一連串的二進制脈沖碼。為了使其在無線傳輸過程中免受其他紅外信號的干擾,通常都是先將其調制在特定的載波頻率上,然后再經紅外發射二極管發射出去,而紅外線接收裝置則要濾除其他雜波,叧接收該特定頻率的信號并將其還原成二進制脈沖碼,也就是解調。

二、工作原理
內置接收管將紅外發射管發射出來癿光信號轉換為微弱的電信號,此信號經由IC內部放大器進行放大,然后通過自動增益控制、帶通濾波、解調變、波形整形后還原為遙控器發射出的原始編碼,經由接收頭的信號輸出腳輸入到電器上的編碼識別電路。

三、紅外接收頭的引腳與連線
紅外接收頭有三個引腳如下圖:
用的時候將VOUT接到模擬口,GND接到實驗板上的GND,VCC接到實驗板上的+5v。

實驗器材清單

  • 紅外遙控器 1個
  • 紅外接收頭 1個
  • M5直插LED燈 6個
  • 220歐姆直插電阻 6個
  • 面包板 1個
  • 面包板跳線 1扎
  • 實驗接線

    首先將板子連接好;接著將紅外接收頭按照上述方法接好,將VOUT接到數字11口引腳,將LED燈通過電阻接到數字引腳2,3,4,5,6,7。返樣就完成了電路部分的連接。

    實驗原理

    要想對某一遙控器進行解碼必須要了解該遙控器的編碼方式。本產品使用的控器的碼方式為:NEC協議。下面就介紹一下NEC協議:
    NEC協議介紹:特點:
    (1)8位地址位,8位命令位
    (2)為了可靠性地址位和命令位被傳輸兩次
    (3)脈沖位置調制
    (4)載波頻率38khz
    (5)每一位癿時間為1.125ms戒2.25ms
    邏輯 0和1的定義如下圖
    協議如下:

    按鍵按下立刻松開的發射脈沖:

    上面圖片顯示了NEC的協議典型的脈沖序列。注意:這首先發送LSB(最低位)的協議。在上面癿脈沖傳輸的地址為0x59命令為0x16。一個消息是由一個9ms的高電平開始,隨后有一個4.5ms的低電平,(返兩段電平組成引尋碼)然后由地址碼和命令碼。地址和命令傳輸兩次。第二次所有位都取反,可用于對所收到的消息中的確認使用??倐鬏敃r間是恒定的,因為每一點與它取反長度重復。如果你不感興趣,你可以忽略這個可靠性取反,也可以擴大地址和命令,以每16位!

    按鍵按下一段時間才松開的發射脈沖:

    一個命令發送一次,即使在遙控器上的按鍵仍然按下。當按鍵一直按下時,第一個110ms癿脈沖與上圖一樣,之后每110ms重復代碼傳輸一次。返個重復代碼是由一個9ms的高電平脈沖和一個2.25ms低電平和560μs癿高電平組成。

    重復脈沖

    注意:脈沖波形進入一體化接收頭以后,因為一體化接收頭里要迕解碼、信號放大和整形,故要注意:在沒有紅外信號時,其輸出端為高電平,有信號時為低電平,故其輸出信號電平正好和發射端相反。接收端脈沖大家可以通過示波器看到,結合看到的波形理解程序。

    實驗接線圖


    參考程序代碼:
    #include <IRremote.h>
    int RECV_PIN = 11;
    int LED1 = 2;
    int LED2 = 3;
    int LED3 = 4;
    int LED4 = 5;
    int LED5 = 6;
    int LED6 = 7;
    long on1 = 0x00FFA25D;
    long off1 = 0x00FFE01F;
    long on2 = 0x00FF629D;
    long off2 = 0x00FFA857;
    long on3 = 0x00FFE21D;
    long off3 = 0x00FF906F;
    long on4 = 0x00FF22DD;
    long off4 = 0x00FF6897;
    long on5 = 0x00FF02FD;
    long off5 = 0x00FF9867;
    long on6 = 0x00FFC23D;
    long off6 = 0x00FFB047;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    // Dumps out the decode_results structure.
    // Call this after IRrecv::decode()
    // void * to work around compiler issue
    //void dump(void *v) {
    // decode_results *results = (decode_results *)v
    void dump(decode_results *results) {
    int count = results->rawlen;
    if (results->decode_type == UNKNOWN)
    {
    Serial.println(“Could not decode message”);
    }
    else
    {
    if (results->decode_type == NEC)
    {
    Serial.print("Decoded NEC: ");
    }
    else if (results->decode_type == SONY)
    {
    Serial.print(“Decoded SONY: “);
    }
    else if (results->decode_type == RC5)
    {
    Serial.print(“Decoded RC5: “);
    }
    else if (results->decode_type == RC6)
    {
    Serial.print(“Decoded RC6: “);
    }
    Serial.print(results->value, HEX);
    Serial.print(” (”);
    Serial.print(results->bits, DEC);
    Serial.println(” bits)”);
    }
    Serial.print(“Raw (”);
    Serial.print(count, DEC);
    Serial.print(”): “);
    for (int i = 0; i < count; i++)
    {
    if ((i % 2) == 1) {
    Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else
    {
    Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(” “);
    }
    Serial.println(””);
    }
    void setup()
    {
    pinMode(RECV_PIN, INPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
    pinMode(LED5, OUTPUT);
    pinMode(LED6, OUTPUT);
    pinMode(13, OUTPUT);
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }
    int on = 0;
    unsigned long last = millis();
    void loop()
    {
    if (irrecv.decode(&results))
    {
    // If it’s been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250)
    {
    on = !on;
    // digitalWrite(8, on ? HIGH : LOW);
    digitalWrite(13, on ? HIGH : LOW);
    dump(&results);
    }
    if (results.value == on1 )
    digitalWrite(LED1, HIGH);
    if (results.value == off1 )
    digitalWrite(LED1, LOW);
    if (results.value == on2 )
    digitalWrite(LED2, HIGH);
    if (results.value == off2 )
    digitalWrite(LED2, LOW);
    if (results.value == on3 )
    digitalWrite(LED3, HIGH);
    if (results.value == off3 )
    digitalWrite(LED3, LOW);
    if (results.value == on4 )
    digitalWrite(LED4, HIGH);
    if (results.value == off4 )
    digitalWrite(LED4, LOW);
    if (results.value == on5 )
    digitalWrite(LED5, HIGH);
    if (results.value == off5 )
    digitalWrite(LED5, LOW);
    if (results.value == on6 )
    digitalWrite(LED6, HIGH);
    if (results.value == off6 )
    digitalWrite(LED6, LOW);
    last = millis();
    irrecv.resume(); // Receive the next value
    }
    }


    程序功能

    對遙控器發射出來的編碼脈沖進行解碼,根據解碼結果執行相應的動作。返樣大家就可以用遙控器遙控你的器件了,讓它聽你的指揮。

    實驗截圖

    程序代碼

    #include <IRremote.h> int RECV_PIN = 11; int LED1 = 2; int LED2 = 3; int LED3 = 4; int LED4 = 5; int LED5 = 6; int LED6 = 7; long on1 = 0x00FFA25D; long off1 = 0x00FFE01F; long on2 = 0x00FF629D; long off2 = 0x00FFA857; long on3 = 0x00FFE21D; long off3 = 0x00FF906F; long on4 = 0x00FF22DD; long off4 = 0x00FF6897; long on5 = 0x00FF02FD; long off5 = 0x00FF9867; long on6 = 0x00FFC23D; long off6 = 0x00FFB047; IRrecv irrecv(RECV_PIN); decode_results results; void dump(decode_results *results) {int count = results->rawlen;if (results->decode_type == UNKNOWN) {Serial.println("Could not decode message");} else {if (results->decode_type == NEC) {Serial.print("Decoded NEC: ");} else if (results->decode_type == SONY) {Serial.print("Decoded SONY: ");} else if (results->decode_type == RC5) {Serial.print("Decoded RC5: ");} else if (results->decode_type == RC6) {Serial.print("Decoded RC6: ");}Serial.print(results->value, HEX);Serial.print(" (");Serial.print(results->bits, DEC);Serial.println(" bits)");}Serial.print("Raw (");Serial.print(count, DEC);Serial.print("): ");for (int i = 0; i < count; i++) {if ((i % 2) == 1) {Serial.print(results->rawbuf[i]*USECPERTICK, DEC);} else {Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);}Serial.print(" ");}Serial.println("");}void setup(){pinMode(RECV_PIN, INPUT); pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);pinMode(LED4, OUTPUT);pinMode(LED5, OUTPUT);pinMode(LED6, OUTPUT); pinMode(13, OUTPUT);Serial.begin(9600);irrecv.enableIRIn(); // Start the receiver}int on = 0; unsigned long last = millis();void loop() {if (irrecv.decode(&results)) {// If it's been at least 1/4 second since the last// IR received, toggle the relayif (millis() - last > 250) {on = !on; // digitalWrite(8, on ? HIGH : LOW);digitalWrite(13, on ? HIGH : LOW);dump(&results);}if (results.value == on1 )digitalWrite(LED1, HIGH);if (results.value == off1 )digitalWrite(LED1, LOW); if (results.value == on2 )digitalWrite(LED2, HIGH);if (results.value == off2 )digitalWrite(LED2, LOW); if (results.value == on3 )digitalWrite(LED3, HIGH);if (results.value == off3 )digitalWrite(LED3, LOW);if (results.value == on4 )digitalWrite(LED4, HIGH);if (results.value == off4 )digitalWrite(LED4, LOW); if (results.value == on5 )digitalWrite(LED5, HIGH);if (results.value == off5 )digitalWrite(LED5, LOW); if (results.value == on6 )digitalWrite(LED6, HIGH);if (results.value == off6 )digitalWrite(LED6, LOW); last = millis(); irrecv.resume(); // Receive the next value} }

    總結

    以上是生活随笔為你收集整理的Ardino基础教程 20_红外遥控的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。