สารบัญ:

รีโมททีวีสากล - Ardiuino อินฟราเรด: 5 ขั้นตอน
รีโมททีวีสากล - Ardiuino อินฟราเรด: 5 ขั้นตอน

วีดีโอ: รีโมททีวีสากล - Ardiuino อินฟราเรด: 5 ขั้นตอน

วีดีโอ: รีโมททีวีสากล - Ardiuino อินฟราเรด: 5 ขั้นตอน
วีดีโอ: DIY รีโมทอินฟาเรด จากวัสดุเหลือใช้ในบ้าน | How to make IR Blaster 2024, มิถุนายน
Anonim
รีโมททีวีสากล - Ardiuino, Infrared
รีโมททีวีสากล - Ardiuino, Infrared

สวัสดี! ในคำแนะนำนี้ ฉันจะแสดงวิธีสร้างและตั้งโปรแกรมรีโมตสากลของคุณเองที่จะทำงานกับสิ่งต่างๆ ส่วนใหญ่ที่ใช้รีโมตอินฟราเรด และจะ "ฟัง" และถอดรหัสสัญญาณอินฟราเรดที่ส่งมาจากรีโมตอื่นๆ

เบื้องหลังเล็กน้อยของแรงบันดาลใจให้ฉันสร้างรีโมตนี้ - ฉันเหมือนพวกคุณส่วนใหญ่ ทำรีโมตของฉันหายอย่างต่อเนื่อง และภัยพิบัตินี้ค่อนข้างน่าหงุดหงิด ฉันคิดว่ามาแก้ปัญหากันเถอะ! ฉันได้สร้างรีโมตนี้และฝังไว้อย่างสุขุมรอบคอบในโครงเตียงที่ฉันทำเอง (ฉันก็เป็นช่างไม้ด้วย) - รีโมตคอนโทรลจะขาดไม่ได้หากเป็นส่วนหนึ่งของโครงเตียงของฉัน!

เสบียง

สิ่งที่คุณต้องการ:-Arduino UNO หรือ Nano - ระยะอาจแตกต่างกันไปตามบอร์ดอื่นๆ

- เขียงหั่นขนมแบบไม่มีบัดกรี (หรือแผ่นกระดานแบบบัดกรีได้หากต้องการทำให้เป็นแบบถาวร)

-จัมเปอร์ไวร์หลากสีและความยาว

- ปุ่มกดชั่วขณะ (5) (คุณสามารถเพิ่มปุ่มเพิ่มเติมได้ แต่คุณจะต้องใช้พินดิจิทัล เนื่องจากมีการใช้พินอะนาล็อกทั้งหมดยกเว้น 1 อัน คุณจะต้องตรวจสอบให้แน่ใจว่าคุณใช้ตัวต้านทานแบบดึงขึ้นอย่างเหมาะสม, หรือดึงตัวต้านทานลงและดีบ็อกซ์ปุ่มกด)

ตัวต้านทาน -10K Ohm (5) (ถ้าคุณต้องการปุ่มกดมากกว่านี้ คุณจะต้องมีมากกว่านี้)

ตัวต้านทาน -470 โอห์ม (2)

- LED อินฟราเรด

- ไฟ LED สีแดง

-Infrared Sensor (ฉันใช้หมายเลขชิ้นส่วน VS1838B คุณสามารถใช้อันอื่นได้ เพียงแค่ตรวจสอบพินเอาต์)

(อุปกรณ์เสริม) หัวแร้ง, บัดกรี, ฟลักซ์บัดกรี

ขั้นตอนที่ 1: สร้างวงจร:

การสร้างวงจร
การสร้างวงจร

1). ฉันชอบเริ่มต้นด้วยการจัดวางส่วนประกอบของฉันเสมอ เนื่องจากสิ่งนี้จะขับเคลื่อนเค้าโครงบนเขียงหั่นขนม

- ปุ่มกด

-ไฟ LED: ไฟ LED สีแดงและไฟ LED IR ต่อสายเข้าด้วยกัน คุณจึงมองเห็นได้ว่าไฟ LED อินฟราเรดกำลังทำอะไร

-เซ็นเซอร์

2). ตัวต้านทาน

- ตัวต้านทาน 10K ห้าตัวที่เราติดไว้กับปุ่มกดเรียกว่าตัวต้านทานแบบ "ดึงลง" ดึงตัวต้านทานลง ตรวจสอบให้แน่ใจว่าเมื่อไม่ได้กดปุ่ม พิน Arduino ที่สอดคล้องกันจะได้รับ 0 โวลต์ (หรืออย่างน้อยก็ใกล้กับมัน) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวต้านทานแบบดึงลง (หรือดึงขึ้น) นี่คือคำแนะนำเชิงลึก:

www.electronics-tutorials.ws/logic/pull-up…

ตัวต้านทานเหล่านี้อาจไม่จำเป็นอย่างสมบูรณ์ แต่ถ้าคุณได้รับ "ghost" ดัน มีความเป็นไปได้มากกว่าที่จะเกิดจากการคัปปลิ้งแบบคาปาซิทีฟและตัวต้านทานแบบดึงลงเพื่อป้องกันไม่ให้เกิดสิ่งนี้

3). สายไฟวงจร

4). 5V และสายกราวด์

ใช้รูปภาพที่ให้มาเพื่อเป็นข้อมูลอ้างอิง! อย่ากลัวที่จะเปลี่ยนแปลงตามความต้องการของคุณ!

ขั้นตอนที่ 2: รหัส:

#include const int RECV_PIN = 7; // เซ็นเซอร์ IR อ่านพิน int Button1 = A4;// ซ้ายสุด int Button2 = A3; // ที่ 2 จากซ้าย int Button3 = A2; // ปุ่มกลางตรงกลาง 4 = A1; // ที่ 2 ทางด้านขวา int Button5 = A0; // ไกลที่สุดไปทางขวา LED int = 3; // IR LED และสีแดง LED int val = 0; // การเปลี่ยนค่า IRsend irsend; IRrecv irrecv(RECV_PIN); ผลลัพธ์ decode_results;

การตั้งค่าเป็นโมฆะ () {pinMode (Button1, INPUT); โหมดพิน (Button2, INPUT); โหมดพิน (ปุ่ม 3, อินพุต); โหมดพิน (Button4, INPUT); โหมดพิน (ปุ่ม 5, อินพุต); โหมดพิน (LED, เอาต์พุต); Serial.begin(9600); irrecv.enableIRIn(); irrecv.blink13 (จริง);} วงเป็นโมฆะ () {{{ถ้า (analogRead (Button1)>900) irsend.sendNEC (0xFF02FD, 32); // ใช้การอ่านแบบแอนะล็อกแทนการอ่านแบบดิจิทัลเพื่อหลีกเลี่ยงปัญหาเรื่องความจุของตัวเก็บประจุ ยังช่วยดีดกลับปุ่มต่างๆ // การอ่านค่าแบบอะนาล็อกที่ 900 จะทำให้ค่าต่างๆ ขยับเขยื้อนได้ ซึ่งหมายความว่าสัญญาณอินฟราจะถูกส่งไปแม้ว่าจะไม่ได้ใช้ 5V เต็มกับพินก็ตาม // แต่ 900 นั้นสูงพอที่จะไม่ได้อ่านผิดพลาดเนื่องจากความล่าช้าการมีเพศสัมพันธ์ capacitive (100);} // RGB Strip และปิด {if (analogRead (Button5)> 900) {สำหรับ (int i = 0; ฉัน <3 ผม ++) // การเปลี่ยนค่าใน "i < 3" จะเปลี่ยนจำนวนครั้งที่สัญญาณซ้ำทันที ดังนั้น "i < 2" จะส่งสัญญาณซ้ำสองครั้ง // คุณอาจต้องลองใช้ตัวเลขนี้ดูหากทีวีไม่ตอบสนอง โดยทั่วไป 1 หรือ 3 ใช้ได้ดีที่สุด หากไม่เป็นเช่นนั้น ให้ลองใช้เลขคี่ // คุณอาจต้องเล่นกับค่าเวลาหน่วงสัญญาณภายใน เช่น สำหรับทีวี 10 ของฉัน แต่ 30 ไม่ได้ {irsend.sendSony(0xa90, 12); // รหัสพลังงานของทีวี Sony สำหรับทีวีของฉัน ต้องส่งรหัส 3x3 ดังนั้น 3 พัลส์ หน่วงเวลาแยกกันสามครั้ง (10) // "อินทราสัญญาณดีเลย์" สำหรับ (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12); // "12" คือหมายเลขบิต โปรโตคอลที่ต่างกันจะเรียกหมายเลขบิตที่ต่างกัน NEC คือ 32, Sony คือ 12, คุณสามารถค้นหาความล่าช้าอื่น ๆ (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i < 3; i++) {irsend.sendSony (0xc90, 12); // Sony TV power Volume Down delay(100);}}} delay(100);} if (irrecv.decode(&results)) // ส่วนด้านล่างของรหัสช่วยให้คุณสามารถตีความสัญญาณอินฟราเรดจากรีโมทต่างๆ { Serial.println (ผลลัพธ์. ค่า HEX); // จะสร้างขั้นตอน "NEC, Sony, Etc.." และรหัสทีวี "C90, A90, FF02FD" คุณจะต้องเพิ่ม 0x ไปยังด้านหน้าของสวิทช์ทีวีรหัส (results.decode_type) {กรณีสินค้า DENON: Serial.println("DENON"); หยุดพัก; กรณี NEC: Serial.println ("NEC"); หยุดพัก; กรณี PANASONIC: Serial.println ("PANASONIC"); หยุดพัก; กรณี SONY: Serial.println("SONY"); หยุดพัก; กรณี RC5: Serial.println("RC5"); หยุดพัก; กรณี JVC: Serial.println ("JVC"); หยุดพัก; กรณี SANYO: Serial.println("SANYO"); หยุดพัก; กรณี MITSUBISHI: Serial.println("MITSUBISHI"); หยุดพัก; กรณี SAMSUNG: Serial.println("SAMSUNG"); หยุดพัก; กรณี LG: Serial.println("LG"); หยุดพัก; กรณี RC6: Serial.println("RC6"); หยุดพัก; กรณี DISH: Serial.println ("DISH"); หยุดพัก; กรณี SHARP: Serial.println("SHARP"); หยุดพัก; กรณี WHYNTER: Serial.println ("WHYNTER"); หยุดพัก; กรณี AIWA_RC_T501: Serial.println("AIWA_RC_T501"); หยุดพัก; ค่าเริ่มต้น: กรณี UNKNOWN: Serial.println("UNKNOWN"); break;} irrecv.resume();}}

ขั้นตอนที่ 3: รหัสในความลึก: การส่งสัญญาณ IR

ฉันจะอ้างถึงบรรทัดของรหัสตามหมายเลขบรรทัด - เพื่อทำตาม ใช้ลิงค์นี้:

pastebin.com/AQr0fBLg

อันดับแรก เราต้องรวม IR Remote Library โดย z3t0

นี่คือลิงค์ไปยังห้องสมุด:

github.com/z3t0/Arduino-IRremote

หากคุณต้องการคำแนะนำเกี่ยวกับวิธีการดาวน์โหลดไลบรารี่และติดตั้งใน IDE อย่างถูกต้อง:

www.arduino.cc/en/guide/libraries

บรรทัดที่ 1 ประกอบด้วยห้องสมุด

ต่อไป เราต้องประกาศตัวแปรสองสามตัว บรรทัดที่ 2-12 ทำสิ่งนี้

เราใช้ " cost int " เพื่อกำหนดตัวแปรที่จะไม่เปลี่ยนแปลง ทั้งหมดยกเว้นหนึ่งรายการในหมวดหมู่นี้

เราใช้ "int" เพื่อกำหนดตัวแปรที่จะเปลี่ยนแปลง

เราต้องใช้พินที่มีพัลส์ที่มีการมอดูเลต (PWM) สำหรับพิน LED ของเรา - พินใดๆ ที่มี "~" อยู่ข้างๆ ก็เพียงพอแล้ว ในโค้ดของฉัน - เราใช้พินดิจิทัล 3

ต่อไป เราต้องทำการตั้งค่า - โค้ดนี้จะทำงานเพียงครั้งเดียวเมื่อเปิดหรือรีเซ็ต Arduino

ขอให้สังเกตว่าเรากำลังกำหนดอินพุตและเอาต์พุตของเรา (15-20) เปิดใช้งานจอภาพอนุกรม (21) ทำให้เซ็นเซอร์ IR (22) และบอกให้ Arduino กะพริบ LED ออนบอร์ดทุกครั้งที่เราได้รับสัญญาณในเซ็นเซอร์ (23).

ต่อไป เราจะสร้างลูปของเรา - โค้ดนี้จะรันซ้ำๆ โดยเริ่มจากบนลงล่างสองสามครั้งในหนึ่งวินาที

ที่บรรทัดที่ 25 เราใช้คำสั่ง if ซึ่งจะบอก Arduino ว่า "มองหาเกณฑ์เฉพาะนี้ หากตรงตามเกณฑ์ ให้ทำสิ่งนี้โดยเฉพาะ" ในกรณีนี้ เกณฑ์จะเป็นแบบแอนะล็อกRead(Button1)>900 หรืออีกนัยหนึ่ง - "Arduino ดูที่ button1 ซึ่งเรากำหนดให้เป็นพิน A4 ก่อนหน้านี้ หากสัญญาณแอนะล็อกที่ได้รับมากกว่า 900 โปรดดำเนินการตามคำแนะนำต่อไป ถ้าไม่ใช่ก็ไปต่อเถอะ" มีบิตที่จะแกะที่นี่ ดังนั้นให้ดำดิ่งลงไป: สัญญาณอะนาล็อกบน Arduino มีค่าเท่ากับหรือน้อยกว่า 5V โดยที่ 5V เท่ากับ 1023 และ 0V เท่ากับ 0 แรงดันไฟฟ้าที่กำหนดใด ๆ ระหว่าง 0 ถึง 5V สามารถกำหนดได้โดย ตัวเลข และคณิตศาสตร์นิดหน่อย เราสามารถหาตัวเลขนั้นได้ หรือในทางกลับกัน แรงดันไฟฟ้า หาร 1024 (เรารวม 0 เป็นหน่วย) ด้วย 5 จะได้ 204.8 ตัวอย่างเช่น เราใช้เลข 900 เพื่อแปลงค่านั้นเป็นแรงดันไฟ เราก็แค่หาร 900 ด้วย 204.8 ได้ประมาณ 4.4V เรากำลังบอกให้ Arduino มองหาแรงดันไฟฟ้าที่มากกว่า ~4.4 โวลต์ และถ้าเป็นเช่นนั้น ให้ทำตามคำแนะนำต่อไปของเรา

พูดถึงคำแนะนำถัดไป (บรรทัดที่ 25) เราจะเห็น irsend.sendNEC(0xFF02FD, 32) สิ่งนี้ระบุว่า "Arduino ส่งพัลส์แบบมอดูเลตที่ตามโปรโตคอล NEC โดยเฉพาะสัญญาณ FF02FD และตรวจสอบให้แน่ใจว่ามีความยาว 32 บิต" สิ่งนี้จะทำให้ IR LED ของเรากะพริบในลักษณะที่อุปกรณ์อื่นสามารถเข้าใจได้ คิดว่ามันคล้ายกับรหัสมอร์สเล็กน้อย แต่ด้วยแสงที่มองไม่เห็น! มีโปรโตคอลต่างๆ มากมาย แต่ละโปรโตคอลมีสัญญาณหลายร้อยหรือหลายพันสัญญาณ และแต่ละตัวมีหมายเลขบิตเฉพาะ อุปกรณ์ของเราจะจดจำสัญญาณเหล่านี้ได้จำนวนมาก แต่เราจะเจาะลึกเรื่องนี้ในภายหลัง!

ที่บรรทัดที่ 28 เรามีการดีเลย์ครั้งแรก - นี่คือการป้องกันสัญญาณซ้ำโดยไม่ได้ตั้งใจ เมื่อกดปุ่มและส่งสัญญาณ IR เรามีเวลา 100 มิลลิวินาทีในการเอานิ้วออกจากปุ่ม ดูเหมือนเวลาจะไม่นานนัก แต่ในทางปฏิบัติ ดูเหมือนว่าจะใช้ได้ดี ฟังก์ชันหน่วงเวลาบอก Arduino ว่า "ไม่ทำอะไรเลยสำหรับ X มิลลิวินาที" และสำหรับการอ้างอิงคือ 1,000 มิลลิวินาทีในหนึ่งวินาที

ย้ายไปยังปุ่มถัดไปของเราที่บรรทัดที่ 29, button5 (เดิมฉันมี 4 ปุ่มบนรีโมทนี้ เพิ่มหนึ่งในห้า นั่นคือเหตุผลที่เราไม่เป็นระเบียบ) โดยพื้นฐานแล้วสิ่งนี้เหมือนกับปุ่ม 1 แต่มีความแตกต่างที่สำคัญบางประการ ความแตกต่างอย่างแรกที่คุณเห็นคือคำสั่ง for - นี่เป็นอีกหนึ่งลูปหลัก - ลูปที่มีลูปที่ใหญ่กว่าอีกอันหนึ่ง นั่นคือ loopception โดยเฉพาะเรามี " for (int i = 0; i < 3; i++) " อ่านว่า "Arduino เริ่มที่ 0 ให้ทำซ้ำคำแนะนำต่อไปนี้จนกว่าเราจะไปถึง 3 ครั้ง" ใช้ฟังก์ชัน for เนื่องจากมีอุปกรณ์จำนวนมากตั้งโปรแกรมให้มองหาสัญญาณซ้ำ และในกรณีของเราที่นี่ 3 ครั้ง คุณสามารถเปลี่ยนหมายเลข 3 เป็นหมายเลขอื่นได้หากอุปกรณ์ของคุณเรียกตารางการทำซ้ำที่แตกต่างกัน ความแตกต่างที่สำคัญอีกประการหนึ่งของ button5 คือการทำซ้ำอีกครั้ง 3 ครั้งหรือ 3x3 กล่าวคือ เราส่งสัญญาณ 3 ครั้ง รอ 10 มิลลิวินาที ส่งอีกครั้ง 3 ครั้ง รออีก 10 มิลลิวินาที แล้วส่งอีกครั้ง 3 ครั้ง การสื่อสารประเภทนี้เป็นเรื่องปกติสำหรับการเปิดและปิดอุปกรณ์ และอาจเป็นสิ่งที่ทีวีหรืออุปกรณ์ของคุณเรียกร้อง กุญแจสำคัญในการดำเนินการนี้คือเล่นกับตัวแปรทั้งหมดจนกว่าคุณจะได้ผลลัพธ์ที่ต้องการ เปลี่ยนค่าการหน่วงเวลาสั้น ๆ เปลี่ยนค่าสำหรับการทำซ้ำ ส่ง 6 ชุดแทนที่จะเป็น 3 ฯลฯ อุปกรณ์ได้รับการตั้งโปรแกรมด้วยกฎสัญญาณที่กำหนดเองโดยเจตนา ลองนึกภาพว่ารีโมททีวีของคุณส่งสัญญาณประเภทเดียวกันกับซาวด์บาร์ของคุณหรือไม่ ทุกครั้งที่คุณเปลี่ยนช่องบนทีวี ซาวด์บาร์ของคุณจะปิด - นั่นคือสาเหตุที่กฎสัญญาณต่างกัน

ปุ่มสามปุ่มถัดไปถูกตั้งโปรแกรมด้วยหลักการเดียวกัน อย่างน้อยก็ในบางส่วน ดังที่อธิบายไว้ข้างต้น เพื่อให้เราสามารถข้ามไปจนสุดบรรทัดที่ 55

ขั้นตอนที่ 4: รหัสในความลึก: รับสัญญาณ IR

รหัสในความลึก: รับสัญญาณ IR
รหัสในความลึก: รับสัญญาณ IR

ที่บรรทัดที่ 55 เราเริ่มตั้งโปรแกรม Arduino เพื่อตีความสัญญาณ IR ที่ส่งโดยรีโมตอื่น ๆ ซึ่งจำเป็นเพื่อให้คุณสามารถทราบโปรโตคอลและสัญญาณที่รีโมทของคุณใช้ บรรทัดแรกของโค้ดในบรรทัดที่ 55 คือ if (irrecv.decode(&results) อ่านว่า "Arduino ค้นหาโค้ด IR หากพบ ให้คืนค่าจริง หากไม่พบ ให้คืนค่าเท็จ เมื่อเป็นจริง ให้บันทึก ข้อมูลให้เป็น "ผลลัพธ์"

จากบรรทัดที่ 56 เรามี Serial.println(results.value, HEX) ซึ่งระบุว่า "Ardunio พิมพ์ผลลัพธ์ในจอภาพแบบอนุกรมในรูปแบบ HEX" เลขฐานสิบหกหมายถึงเลขฐานสิบหกเป็นวิธีที่เราสามารถย่อสตริงไบนารี (เพียง 0 และ 1) ให้พิมพ์ได้ง่ายขึ้นเล็กน้อย ตัวอย่างเช่น 101010010000 คือ "a90" รหัสที่ใช้ในการปิดและเปิดทีวีของฉัน และ 111111110000001011111101 คือ 0xFF02FD ซึ่งควบคุมแถบ RGB ของฉัน คุณสามารถใช้แผนภูมิด้านบนเพื่อแปลงไบนารีเป็นเลขฐานสิบหก และในทางกลับกัน หรือคุณสามารถใช้ลิงก์ต่อไปนี้:

www.rapidtables.com/convert/number/hex-to-…

ลงไปที่บรรทัดที่ 57 เรามีฟังก์ชั่นใหม่ที่เรียกว่าเคสสวิตช์

โดยพื้นฐานแล้ว กรณีสวิตช์ช่วยให้เราสามารถระบุคำสั่งต่างๆ ตามผลลัพธ์ของตัวแปรที่กำหนด (ตัวพิมพ์) ตัวแบ่งออกจากคำสั่ง switch และถูกใช้ที่ส่วนท้ายของแต่ละคำสั่ง

เราใช้กรณีสวิตช์ที่นี่เพื่อเปลี่ยนวิธีการพิมพ์ในมอนิเตอร์แบบอนุกรมตามโปรโตคอลที่ Arduino สัมผัสได้จากรีโมทต่างๆ

ขั้นตอนที่ 5: บทสรุป

หากคุณมีคำถาม - โปรดติดต่อเราที่นี่! ฉันยินดีที่จะพยายามช่วยเหลือคุณอย่างสุดความสามารถ

ฉันหวังว่าคุณจะได้เรียนรู้บางสิ่งที่คุณสามารถใช้เพื่อทำให้ชีวิตของคุณดีขึ้นเล็กน้อย!

-RB

แนะนำ: