กลับไปหน้ารวมไฟล์
iot-ir-programmable-transcoder-tv-remote-on-steroids-375cf4.md

พื้นหลัง

รู้สึกมั้ยเวลามีอะไรน่ารำคาญจนต้องลุกขึ้นมาแก้ไข โดยเฉพาะถ้าโดนคนอื่นบ่นตามอีก โคตรเข้ากับสถานการณ์รีโมททีวีของเราเลย มันเป็นรุ่น "Dick Smith" และรีโมทมันกากมาก กดบ้างไม่กดบ้าง เคยใช้รีโมทอเนกประสงค์มาก่อน แม้จะตั้งค่ามาหลายชั่วโมงก็ยังไม่เวิร์ค แล้วจะทำไงดี? เครื่องบันทึกภาพ Panasonic DVR ที่เราใช้อยู่ มันมีฟังก์ชันรีโมทอเนกประสงค์ในตัวที่โคตรจะเทพ แต่ดันคุยกับอุปกรณ์อื่นเป็นร้อยได้ ยกเว้นทีวีของเรา! ถ้ามันเข้าใจภาษากันได้ก็ดีสิ

Arduino IR library และ Nano มาแล้วจ้า

รู้มั้ยว่าแค่มีชิ้นส่วนสองสามอย่าง ก็รับ วิเคราะห์ และส่งสัญญาณอินฟราเรด (IR) ได้ แม้จะใช้ Arduino ตัวจิ๋วที่สุดก็ตาม! ดังนั้น ด้วยโค้ดตัวอย่างไม่กี่บรรทัด ก็สามารถรู้ได้แล้วว่าแต่ละปุ่มบนรีโมทส่งรหัสอะไร ด้วยโปรโตคอลอะไร พอเพิ่มโค้ดอีกนิดหน่อย ก็สามารถส่งรหัสอื่นแทนรหัสเดิมได้เลย
แป๊บเดียวก็ได้ตัวแปลงรหัส (transcoder) มาใช้เองแล้วว่ะ รับรหัสจากรีโมทหนึ่ง แล้วส่งออกไปใหม่เหมือนมาจากอีกเครื่องนึง "Piece of Pi" หรือจะ Piece of Arduino ดีหว่า? เราใส่ฟังก์ชันโอเวอร์เลย์เริ่มต้นไปด้วย จะได้ใช้ปุ่มทั้งหมดบนรีโมทควบคุมทีวีได้ถ้าอุปกรณ์เดิมปิดอยู่ ใช้ LED RGB เป็นตัวบอกโหมดเพื่อไม่ให้งง
ทีนี้สิ่งที่เหลือก็คือ ยื่นรีโมทให้คนในบ้านทดลองใช้และเสนอแนะ ในขณะที่เราคอยจับบั๊กอยู่เงียบๆ นั่นแหละ

วงจร

ง่ายมากๆ เพราะตัวรับสัญญาณ IR (IR receiver) ทำงานหนักให้ส่วนใหญ่แล้ว มันมี Automatic Gain Control และฟีเจอร์อื่นๆ ที่จำเป็นสำหรับการ demodulate สัญญาณ 38 kHz ก่อนส่งให้ Arduino เราไม่ได้ใช้ตัวต้านทาน (Resistor) จำกัดกระแสกับ LED IR สองตัวนั้นเลย คิดว่าตอนทดลองคงได้กลิ่นไหม้จากโซฟาแน่ๆ แต่ปรากฏว่าใช้ไฟ 5V กับ LED ที่ซื้อมาได้ปกติดี การลองแบบนี้เกิดจากตอนใช้กระแส 20 mA แล้วระยะส่งได้แค่แย่ๆ เลยคิดว่า "More power Igor !" (เพิ่มพลังอีกหน่อยอีกอร์!)

ขั้นตอนเบต้าทดสอบ สังเกตุดู Adaptor โทรศัพท์มือถือเก่าที่รีไซเคิลมาเป็นแหล่งจ่ายไฟ

เห็นมั้ยล่ะ ตัวทดสอบ Proof of Concept กับเบรดบอร์ดทางซ้ายของทีวี ส่วน Arduino Nano ถูกติดตั้งบน Prototype Shield ทางขวา โปรโตไทป์ชีลด์พวกนี้เจ๋งมาก ทุกชุดเครื่องมือควรมีติดไว้!

ไม่ใช่เรื่องเล่นๆ ทั้งหมดนะ

มีรายละเอียดปลีกย่อยบางอย่างในโปรเจคนี้ โดยเฉพาะเรื่องจังหวะเวลา (timing) ในการรับและส่งรหัสใหม่ แต่เหมือนเคย "Professor Google" มีคำตอบให้เกือบทุกเรื่องที่เราอยากรู้อยู่แล้ว

คุ้มมั้ย?

คุ้มแน่นอน! ตอนนี้เราต้องใช้รีโมทแค่เดียว และไม่ต้องซื้อเพิ่มด้วย สามารถเปลี่ยนฟังก์ชันการทำงานได้ถ้าอยาก (เช่นใส่แมโครบางอัน) และที่สำคัญที่สุดคือ เราได้เรียนรู้เกี่ยวกับรีโมทอินฟราเรดเพิ่มขึ้นอีกเพียบ

แต่เดี๋ยวก่อน... มีอีกน่ะ ESP มาช่วยแล้ว!

ชิ้นส่วนทั้งหมดสำหรับการประกอบชิ้นงานสุดท้ายนอนรออยู่บนโต๊ะทำงานเป็นปี หลังจากที่ประสบความสำเร็จบางส่วนกับการบัดกรีและซ่อมรีโมททีวีตัวจริง ในระหว่างนั้นเราได้รู้จักกับ ESP8266 พอถึงเวลาจะเอาใส่กล่อง ก็คิดว่า ทำไมไม่ให้มันรันบนบอร์ด NodeMCU ล่ะ? ด้วยความคิดนี้ บทสุดท้ายและการประกอบชิ้นงานจริงจึงเริ่มต้นขึ้น

ดังนั้นซอฟต์แวร์จึงถูกปรับโครงสร้างและรีแฟคเตอร์ใหม่ให้เข้ากับไลบรารี IR ตัวใหม่ที่ดีกว่าสำหรับ ESP8266 เราใช้ LED สามสี (Tri-color LED) ดังนี้: แสงสีแดงกระพริบ = กำลังส่งสัญญาณ IR, แสงสีน้ำเงินกระพริบ = กำลังรับข้อมูลผ่าน WiFi, แสงสีเขียวกระพริบ = กำลังรับสัญญาณ IR LED สีน้ำเงินยังกระพริบเร็วในช่วงบูตระบบ ขณะที่พยายามเชื่อมต่อ WiFi ส่วน LED ในตัวบอร์ด (Built-in LED) ถูกใช้เป็นตัวบอกความเชื่อมั่น / จุดเต้นของหัวใจ (heart beat)

เจ้านี่มีทั้งโหมด Soft AP และโหมด Client แบบ WiFi อยู่ในตัวเลย ทำให้การตั้งค่าโคตรง่าย เพราะเรามีพอร์ตสำหรับตั้งค่าตลอดเวลา ไม่ต้องกลัวหลงทาง

หน้าเว็บรีโมทคอนโทรลที่พี่ทำเนี่ย ใช้ CSS แบบ inline ในการตกแต่งปุ่มต่างๆ ให้ดูดี ซึ่งเป็นพื้นฐานของหน้าควบคุมทั้งหมด มันทำงานบนมือถือได้ลื่นมาก เพราะพี่ใส่คำสั่ง "viewport" ไปช่วยให้มือถือเข้าใจว่า "เฮ้ย ต้องแสดงผลยังไง" นี่ถือเป็นการออกนอกกรอบจากสไตล์เว็บเดิมๆ ของพี่เลยแหละ แต่ก็ถือว่าได้อัพสกิลตัวเองบ้าง

แต่เดี๋ยวก่อน... จะสร้างรีโมทที่ควบคุมผ่าน WiFi ได้ยังไง โดยไม่ให้มันโปรแกรมผ่านพอร์ต WiFi และ IR ได้ด้วยล่ะ? พี่เลยออกแบบหน้าเว็บและอินเทอร์เฟซใหม่ขึ้นมา เพื่อให้เราสามารถ "จับ" สัญญาณ IR มาเก็บ แล้วเอามากำหนดให้ปุ่มไหนก็ได้บนรีโมทเสมือนจริง แถมเราสามารถโปรแกรมมันใหม่ทั้งหมดผ่านหน้านี้ได้เลย มีตัวฟังค์ชันรีเซ็ตโรงงานไว้ด้วย ถ้าน้องมั่วจนกลับมาไม่ถูกทางก็กดนี่เลย กลับสู่จุดเริ่มต้น

บอกตรงๆ เลยนะ น้อง พี่พบว่ารีโมทเสมือนบนมือถือนี่ใช้ง่ายกว่าที่คิด ไม่ใช่แค่ของเล่นอีกต่อไป ทุกคนในบ้านมีมือถือกันหมด ตอนนี้ใครก็เปิดทีวีได้ แม้ว่ารีโมทตัวจริงจะหายเข้าไปในซอกโซฟาลึกแค่ไหนก็ตาม 555

Universal Wireless Protocol HUB

IR Station ตัวเทพตัวนี้สามารถ "เรียนรู้", "ถอดรหัส", และ "ส่งสัญญาณ IR กลับ" สำหรับเครื่องใช้ไฟฟ้าในบ้านได้ทุกชนิด เป็นตัวเชื่อมระหว่างเทคโนโลยี IR แบบเก่ากับ IoT สมัยใหม่เลย

  • Protocol Sniffing & Buffering: ใช้ตัวรับสัญญาณ IR ความไวสูงเพื่อจับความถี่และรูปแบบบิตของรีโมทที่ไม่รู้จัก Arduino จะถอดรหัสโปรโตคอล NEC, Sony และ Samsung แบบเรียลไทม์ และแสดงรหัส HEX บน Serial Console ให้ดู
  • Custom Macro Sequences: ให้น้องสามารถโปรแกรม "แมโคร" ได้ (เช่น "โหมดดูหนัง" = เปิดทีวี + เปิดซาวด์บาร์ + ปิดม่าน) แค่ส่งคำสั่งผ่าน serial หรือ IoT หนึ่งครั้ง Arduino ก็จะยิงสัญญาณ IR หลายๆ ลำดับออกมาอย่างถูกต้องเป๊ะ

Connectivity

  • Web-Based Remote Dashboard: โปรเจคนี้มี Dashboard เว็บเป็นของตัวเอง อย่างในรูปมือถือด้านบนเลย น้องสามารถกดปุ่มเสมือนบนเว็บ เพื่อให้ตัวเครื่องยิงสัญญาณ IR จริงๆ ออกมาได้จากอีกมุมห้อง

อืมมม... ทำงานได้ดี แต่ยังดีกว่านี้ได้อีก พี่รู้สึกอยากได้ปุ่มบนรีโมทเสมือนเพิ่มอีก มันมีพื้นที่ EEPROM เหลืออยู่เยอะเลย งั้นลองทำเป็น 3 หน้า หน้าละ 48 ปุ่ม (4x12) ดีกว่า การเปลี่ยนแปลงนี้แทบไม่กระทบโค้ดส่วนอื่นเลย แค่เพิ่มตารางค้นหา (lookup table) ให้ฟังก์ชันถอดรหัสเท่านั้น itself งานนี้ต้องเป็นอัพเกรดต่อไปแน่นอน

อาจจะออกมาแบบนี้มั้ง?

ที่แปลกก็คือ กล่องถอดรหัสเล็กๆ นี้ช่วยไขความลับของรีโมททีวีตัวเก่งที่ชอบมีปัญหาของเราได้ พี่เคยคิดว่ามันส่งสัญญาณไม่ได้ซะแล้ว แต่พี่สังเกตเห็นไฟเขียวกระพริบ (รับรหัสได้) แต่ทีวีไม่ตอบสนอง สงสัยเลยพาไปที่หน้าการตั้งค่า แล้วก็พบความจริงว่ารีโมทมันส่งรหัสผิดไปซะนี่! ไม่แปลกใจเลยที่ทีวีไม่ตอบ แต่ตอนนี้เรามีความรู้แล้ว การแก้ไขก็อยู่ไม่ไกลเกินเอื้อมแล้วล่ะ สู้งานนะน้อง!

เหมือนเดิมนะน้อง ขอบคุณทุกคนที่ช่วยกันมา และขอให้โค้ดกันอย่างมีความสุข!

อัพเดท มิถุนายน 2019

ใช่แล้วว่ะ เราเขียนโค้ดสำหรับเวอร์ชั่น Multipad ที่เห็นด้านบนเสร็จแล้วแหละ (แบบคร่าวๆ) มันอยู่ใน GitHub แล้วตอนนี้ก็กำลังทำงานอยู่ที่ห้องนั่งเล่นบ้านเราเลย ใครมีคอมเมนต์ดีๆ แบบสร้างสรรค์ก็ส่งมาได้นะ รับฟังหมด

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "dougal"
category: "Home & Automation"
components:
  - "1x Wemos D1 Mini"
  - "1x Arduino Nano R3"
  - "1x Soldering iron (generic)"
  - "1x General Purpose Transistor NPN"
  - "1x USB-A to Micro-USB Cable"
  - "1x Plastic Enclosure (clear lid)"
  - "2x Generic IR LED  (940nm)"
  - "1x Veroboard"
  - "1x NodeMCU ESP8266 Breakout Board"
  - "2x IR receiver (generic)"
  - "3x resistor 470 Ohm"
  - "1x ESP8266 ESP-12E"
  - "4x Resistor 330 ohm"
  - "1x Generic RGB LED"
description: "ใส่โค้ดหนึ่งเข้าไป อีกโค้ดหนึ่งออกมา... วิธีเทพๆ ในการใช้รีโมตเดียวควบคุมทุกอย่าง แบบไม่ต้องพึ่ง universal remote งานง่ายแต่หล่อ!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles:
  - "https://github.com/Dougal121/ESP8266_IR_TRANSCODER"
  - "https://github.com/Dougal121/ESP8266_IR_TRANSCODER"
encryptedPayload: "U2FsdGVkX184J7Ml0J1bs15qPnun+BTktLhNhIy1rCVzJfLiOOc16DHWVl3x+OkZFRhZF4jawZFkPjcc++GIjqKjRHyylcKZttkdANl26kI="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/iot-ir-programmable-transcoder-tv-remote-on-steroids-375cf4_cover.jpg"
lang: "en"
likes: 6
passwordHash: "7b13fd524523017f0d69f04adef9d54e9502eade804cbdaa1e8809cf7fa16a62"
price: 2450
seoDescription: "Build an IoT IR Programmable Transcoder to control multiple devices with one TV Remote using Arduino."
tags:
  - "ir"
  - "transcoder"
  - "iot"
  - "esp8266"
  - "universal remote"
title: "IoT IR Programmable Transcoder - รีโมต TV อัปเกรดเวอร์ชั่นจัดเต็ม!"
tools: []
videoLinks: []
views: 12427