Arduino: Wireless long-distance Infrared remote control via nRF24L01 module

สวัสดีครับ

ช่วงนี้ก็อยู่ในช่วงฟุตบอลยูโร – โคปาอเมริกา ดูบอลทีก็ตั้งแต่สองทุ่มยันสว่างคาตาน่ะครับ *-*)  โชคดีที่ปิดเทอมเลยนอนตื่นสายเท่าไหร่ก็ได้

ปัญหามันมีอยู่ว่า ที่บ้านผมมันมีแต่กล่องดาวเทียมอยู่ชั้นล่าง แต่ที่นอนที่ผมดูบอลมันอยู่ชั้นบน ก็เลยต้องใช้การลากสายไฟที่ดัดแปลงหัวท้ายเป็น AV Jack จากชั้นล่างขึ้นมาชั้นบน ตรงนี้ไม่ค่อยเป็นปัญหา ยาวไปหน่อยแต่ก็พอกล้อมแกล้มไปได้ แต่การจะควบคุมกล่องดาวเทียมนี่สิครับ ด้วยความที่มันไม่สามารถเสียบสายไฟแล้วควบคุมได้แบบ AV ได้ (ถึงได้แต่ผมไม่มีสายไฟที่ยาวพอเหลือแล้ว -3-) ครั้นจะทำวงจรเฉพาะก็ดูจะไม่คุ้มเพราะใช้แค่ชั่วคราวครับ กลับมหาวิทยาลัยก็ถอดกลับเลยใช้ (อีกอย่างคือร้านขายอุปกรณ์อิเล็กทรอนิกส์ในต่างจังหวัดนี่แทบหาไม่ได้เลยครับ สั่ง ปณ. ก็ไม่คุ้มอีก) Arduino คู่กับโมดูล 2.4 GHz Transceiver เพื่อช่วยยืดระยะสัญญาณจึงดูตอบโจทย์ดีครับครับ

สำหรับ Code ตัวอย่างสามารถดาวน์โหลดได้จาก Github ครับ

GitHub-Mark-Light-32px Arduino IR Download

อุปกรณ์หลักๆ

  1. Arduino 2 ตัว
  2. nRF24L01 (จริงๆ เป็น Transceiver ตัวอื่นก็ได้ครับ รับ/ส่ง ASCII Code ได้เป็นพอ) 2 ตัว
  3. Infrared receiver (อันนี้ไปแงะเอาจากทีวีเก่าๆ ก็ได้ครับ หรือจะซื้อใหม่ก็ไม่แพง ของผมซื้อจาก ES 16 บาทครับ) สำหรับตัวรับสัญญาณ remote 1 ตัว
  4. Infrared LED (เช่นเคย ไปแงะเอาจาก remote เก่าๆ ก็ได้ครับ หรือซื้อจาก ES แค่ 3 บาทเอง) สำหรับตัวส่งสัญญาณ remote 1 ตัว
  5. LED สีอะไรก็ได้ ไว้ต่อดูสถานะไฟ infrared และลดแรงดันไฟฟ้าตกคร่อม Infrared LED ด้วย สำหรับตัวส่งสัญญาณ remote 1 ตัว
  6. ตัวต้านทานเพื่อการจำกัดกระแสไฟฟ้า คำนวนขนาดได้จาก http://ledcalc.com/ ได้เลยครับ สำหรับตัวส่งสัญญาณ remote 1 ตัว

อุปกรณ์อื่น เช่น USB Cable, Jumper wire อันนี้ก็แล้วแต่ชอบเลยครับ

ส่วนที่ 1 : การรับ/ส่งสัญญาณ Infrared จาก Remote control

สำหรับการรับและส่งสัญญาณจาก Remote control จริงๆ แล้วเราสามารถเขียน Code ดิบๆ เพื่อการเฉพาะได้ครับ เพราะจริงๆ แล้วมันเป็นแค่ PWM Pulse ที่เข้ารหัสไว้ ถ้ามีเครื่องมืออย่าง Oscilloscope หรืออื่นๆ  (เดี๋ยวนี้แบบถูกๆ 20$ ก็มีครับ) ก็สามารถวิเคราะห์สัญญาณที่รับมาแล้วจำลองสัญญาณใหม่ได้ครับ ลองดูทฤษฎีและตัวอย่างจาก Clip ของ Dave Jones ใน EEVBlog ตอนนี้ดูครับ

แต่ด้วยความที่ผมขี้เกียจ (โคตรขี้เกียจ) ผมก็เลยเรียกใช้ IRemote library ที่มีทั้งการอ่านค่า การถอดรหัสเข้ารหัสสัญญาณ และการส่งออกครบครัน (เกือบ) ทุกชนิดครับ

ขั้นตอนหลักๆ มีแค่ 2 ขั้นครับ คือทดลองรับสัญญาณแล้วบันทึกรหัส HEX ที่ได้จาก remote แต่ละปุ่ม อันนี้สามารถต่อ Infrared receiver กับ Arduino อัพโหลด demo IRrecvDump ของ library ลองกดปุ่มบน remote แล้วอ่านดูค่าบน Serial monitor ได้เลยครับ

ตัวอย่างการ setup เพื่อการทดลองอ่านรหัสปุ่ม remote control

ตัวอย่างการ setup เพื่อการทดลองอ่านรหัสปุ่ม remote control

ตัวอย่างผลลัพธ์ที่ได้จาก Serial monitor ของ IR Receiver

ตัวอย่างผลลัพธ์ที่ได้จาก Serial monitor ของ IR Receiver ของ Remote Sony รุ่น RM-952 (ไล้กดตั้งแต่ 1-0 และลงมาเรื่อยๆ)

อ่านแล้วอาจจะตกใจว่าค่าหอยหลอดอะไรเยอะแยะ ไม่ต้องตกใจครับ เราใช้แค่ 2 อย่าง คือประเภทของรีโมต (ในที่นี้คือ Sony ส่วนของดาวเทียมเป็น NEC ครับ) กับรหัสปุ่ม ซึ่งจะบันทึกเป็น HEX code ครับ สามารถนำไปใช้ในการส่งได้โดยการเก็บค่าแบบ unsigned long เช่นปุ่มปิดเครื่องของ remote Sony จะเป็น unsign long power_off_btn = 0xA90 เป็นต้นครับ

ส่วนที่ 2 : การพูดคุยระหว่าง Arduino ด้วย nRF24L01

เนื่องจากตัวนี้ออกแบบมาให้ใช้งานง่าย (และ, เช่นเคย, ขี้เกียจ) ลองทำตาม Tutorial ของ ArduinoAll ได้เลยครับ หรือต่อ Module แบบ SPI ทั้งสองผั่งแล้วลองเล่นกับ Example 0x00 String ของ nRF24L01 library ดูครับ

ส่วนที่ 3 : เอามารวมกัน

ส่วนนี้ก็ไม่มีอะไรครับ Flow  หลักๆ ก็จะมี

ฝั่งรับสัญญาณ Remote

Wiring Diagram ของฝั่งรับสัญญาณ Remote

Wiring Diagram ของฝั่งรับสัญญาณ Remote (ของผมใส่ 7 segments เพื่้อไว้โชว์ค่าที่กำลังจะส่งด้วย แต่ไม่ใส่ก็ไม่เป็นไรครับ ใช้ได้เหมือนกัน)

อุปกรณ์ฝั่งรับสัญญาณ remote จริง

อุปกรณ์ฝั่งรับสัญญาณ remote จริง อันนี้ผมใช้ Arduino Mega การต่อสาย SPI สำหรับ nRF จะต่างไปจาก UNO-based นิดหน่อย แต่ Software ใช้เหมือนกันครับ

  1. เช็คสัญญาณ Infrared (วนไปค่ะ) ว่ามีการกดปุ่มหรือไม่ แล้วกดแล้วเป็นรีโมตที่เราใช้รึเปล่า (irrecv.decode(&results) && results.decode_type == SONY)
  2. กำหนดรหัสเพื่อส่งออกทางวิทยุ (อาจจะกำหนดเป็นข้อความ เช่น POWER_OFF, CH01 ทำนองนี้ก็ได้ แต่ผมใช้เป็นอักษร 1 ตัวเพื่อให้สั้นที่สุด และง่ายเวลาส่งสัญญาณเป็นชุด (เผื่อไว้ควบคุมอุปกรณ์อื่นในอนาคตด้วยครับ เครื่องส่งสัญญาณ remote เดียวคุมได้ครอบจักรวาลไรงี้))
  3. ส่งสัญญาณออกไป
Wiring diagram ของฝั่งส่งสัญญาณ remote

Wiring diagram ของฝั่งส่งสัญญาณ remote

ฝั่งส่งสัญญาณจริงครับ จริงๆ ไม่จำเป็นต้องวางใกล้ขนาดนี้ก็ได้ แต่พอดีที่วางของผมสะดวกก็ตรงกล่องฯ เลย

ฝั่งส่งสัญญาณจริงครับ จริงๆ ไม่จำเป็นต้องวางใกล้ขนาดนี้ก็ได้ แต่พอดีที่วางของผมสะดวกก็ตรงกล่องฯ เลย

ส่วนฝั่งรับก็ทำคล้ายกันครับ เช็คว่ามีคนส่งรหัสอะไรมารึเปล่า ถ้ามีก็ถอดรหัสว่าจะให้ยิงคำสั่งอะไร แล้วก็ยิงสัญญาณ remote ออกไป (ตรงนี้ถ้าตอนแรกเรารู้ว่าเป็น remote ของเจ้าไหนก็ใช้ method ของเจ้านั้นได้เลยครับ เช่น Sony ก็ .sendSony NEC ก็ .sendNEC หรือกรณีจับไม่ได้ว่าเป็นเจ้าไหนก็ส่ง .sendRaw ได้เช่นกันครับ)

ผลการใช้งาน

เท่าที่ลองใช้งานมา 3 วันที่ผ่านมา ก็นับว่าใช้ดีเลยครับ จะมีปัญหาที่ฝั่งรับไปบ้างที่บางครั้งก็ค้างที่ .decode เฉยๆ เลย ต้องไปกด reset บ้าง

เช่นเคยครับ สงสัยหรืออยากแนะนำอะไรเพิ่มเติม Comment มาได้เลยครับ

TL;DR

กสทช. คร้าบ รีบแจกคูปองทีวีดิจิตอลรอบเก็บตกซักทีเถอะคร้าบ บ้านผมรอมา 3 ปีแล้วยังไม่ได้เลย ;3;)