สวัสดีครับ
ช่วงนี้ก็อยู่ในช่วงฟุตบอลยูโร – โคปาอเมริกา ดูบอลทีก็ตั้งแต่สองทุ่มยันสว่างคาตาน่ะครับ *-*) โชคดีที่ปิดเทอมเลยนอนตื่นสายเท่าไหร่ก็ได้
ปัญหามันมีอยู่ว่า ที่บ้านผมมันมีแต่กล่องดาวเทียมอยู่ชั้นล่าง แต่ที่นอนที่ผมดูบอลมันอยู่ชั้นบน ก็เลยต้องใช้การลากสายไฟที่ดัดแปลงหัวท้ายเป็น AV Jack จากชั้นล่างขึ้นมาชั้นบน ตรงนี้ไม่ค่อยเป็นปัญหา ยาวไปหน่อยแต่ก็พอกล้อมแกล้มไปได้ แต่การจะควบคุมกล่องดาวเทียมนี่สิครับ ด้วยความที่มันไม่สามารถเสียบสายไฟแล้วควบคุมได้แบบ AV ได้ (ถึงได้แต่ผมไม่มีสายไฟที่ยาวพอเหลือแล้ว -3-) ครั้นจะทำวงจรเฉพาะก็ดูจะไม่คุ้มเพราะใช้แค่ชั่วคราวครับ กลับมหาวิทยาลัยก็ถอดกลับเลยใช้ (อีกอย่างคือร้านขายอุปกรณ์อิเล็กทรอนิกส์ในต่างจังหวัดนี่แทบหาไม่ได้เลยครับ สั่ง ปณ. ก็ไม่คุ้มอีก) Arduino คู่กับโมดูล 2.4 GHz Transceiver เพื่อช่วยยืดระยะสัญญาณจึงดูตอบโจทย์ดีครับครับ
สำหรับ Code ตัวอย่างสามารถดาวน์โหลดได้จาก Github ครับ
อุปกรณ์หลักๆ
- Arduino 2 ตัว
- nRF24L01 (จริงๆ เป็น Transceiver ตัวอื่นก็ได้ครับ รับ/ส่ง ASCII Code ได้เป็นพอ) 2 ตัว
- Infrared receiver (อันนี้ไปแงะเอาจากทีวีเก่าๆ ก็ได้ครับ หรือจะซื้อใหม่ก็ไม่แพง ของผมซื้อจาก ES 16 บาทครับ) สำหรับตัวรับสัญญาณ remote 1 ตัว
- Infrared LED (เช่นเคย ไปแงะเอาจาก remote เก่าๆ ก็ได้ครับ หรือซื้อจาก ES แค่ 3 บาทเอง) สำหรับตัวส่งสัญญาณ remote 1 ตัว
- LED สีอะไรก็ได้ ไว้ต่อดูสถานะไฟ infrared และลดแรงดันไฟฟ้าตกคร่อม Infrared LED ด้วย สำหรับตัวส่งสัญญาณ remote 1 ตัว
- ตัวต้านทานเพื่อการจำกัดกระแสไฟฟ้า คำนวนขนาดได้จาก 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 ได้เลยครับ
อ่านแล้วอาจจะตกใจว่าค่าหอยหลอดอะไรเยอะแยะ ไม่ต้องตกใจครับ เราใช้แค่ 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
- เช็คสัญญาณ Infrared (วนไปค่ะ) ว่ามีการกดปุ่มหรือไม่ แล้วกดแล้วเป็นรีโมตที่เราใช้รึเปล่า (
irrecv.decode(&results) && results.decode_type == SONY
) - กำหนดรหัสเพื่อส่งออกทางวิทยุ (อาจจะกำหนดเป็นข้อความ เช่น
POWER_OFF
,CH01
ทำนองนี้ก็ได้ แต่ผมใช้เป็นอักษร 1 ตัวเพื่อให้สั้นที่สุด และง่ายเวลาส่งสัญญาณเป็นชุด (เผื่อไว้ควบคุมอุปกรณ์อื่นในอนาคตด้วยครับ เครื่องส่งสัญญาณ remote เดียวคุมได้ครอบจักรวาลไรงี้)) - ส่งสัญญาณออกไป
ส่วนฝั่งรับก็ทำคล้ายกันครับ เช็คว่ามีคนส่งรหัสอะไรมารึเปล่า ถ้ามีก็ถอดรหัสว่าจะให้ยิงคำสั่งอะไร แล้วก็ยิงสัญญาณ remote ออกไป (ตรงนี้ถ้าตอนแรกเรารู้ว่าเป็น remote ของเจ้าไหนก็ใช้ method ของเจ้านั้นได้เลยครับ เช่น Sony ก็ .sendSony
NEC ก็ .sendNEC
หรือกรณีจับไม่ได้ว่าเป็นเจ้าไหนก็ส่ง .sendRaw
ได้เช่นกันครับ)
ผลการใช้งาน
เท่าที่ลองใช้งานมา 3 วันที่ผ่านมา ก็นับว่าใช้ดีเลยครับ จะมีปัญหาที่ฝั่งรับไปบ้างที่บางครั้งก็ค้างที่ .decode เฉยๆ เลย ต้องไปกด reset บ้าง
เช่นเคยครับ สงสัยหรืออยากแนะนำอะไรเพิ่มเติม Comment มาได้เลยครับ
TL;DR
กสทช. คร้าบ รีบแจกคูปองทีวีดิจิตอลรอบเก็บตกซักทีเถอะคร้าบ บ้านผมรอมา 3 ปีแล้วยังไม่ได้เลย ;3;)