ปุ่มกดทีวีทำงานยังไง จากสายสัญญาณเส้นเดียว

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

จากภาพด้านบนคือปุ่มกดของชุดลำโพงบลูทูธ ที่ผมถอดออกมา โดยสามารถเขียนเป็นผังวงจรได้ดังด้านล่างนี้
อินพุต คือ ไฟบวก 5V
เอาพุต คือ ค่ากระแส ที่แตกต่างกันหลังจากผ่านตัวต้านทาน แต่ละค่า

อธิบาย

อุปกรณ์หลักที่ทำหน้าที่แบ่งให้แต่ละปุ่มกด กดลงแล้วแตกต่างกันคือ ตัวต้านทานโดยหน้าที่หลักของตัวต้านทานก็คือ การต้านทานกระแสไฟฟ้า สามารถจำแนกจากภาพด้านบนของ SW แต่ละตัวได้ดังนี้
  • SW1 ไม่มีตัวต้านทาน กระแสมาเท่าไรออกเท่านั้น
  • SW2 ตัวต้านทานค่า 820k กระแสที่ออก 0.0000061A
  • SW3 ตัวต้านทานค่า 150k กระแสที่ออก 0.00003333A
  • SW4 ตัวต้านทานค่า 47k กระแสที่ออก 0.00010638A
  • SW5 ตัวต้านทานค่า 12k กระแสที่ออก 0.00041667A

คำนวณจากสูตร I=E/R

I = กระแสที่เราหา
E = ค่าแรงดันไฟฟ้า ของเราที่นี้คือ 5V
R = ค่าความต้านทานของตัวต้านทานแต่ละตัว

จะเห็นว่าเราสามารถคำนวณค่ากระแสออกมาได้ แต่เราไม่สามารถรู้ได้เพราะเป็นค่าทางไฟฟ้า สิ่งที่ใช้คำนวณแยกแยะคือ ไมโครคอนโทรลเลอร์
       โดยผมจะยกตัวอย่างโดยใช้ บอร์ด Arduino อ่านค่า analog read ซึ่งค่าที่แสดงออกมาจะมีค่า 0 จนถึง 1024

แนะนำให้ต่อวงจร เพิ่มตัวต้านทานค่า ประมาณ 10k ต่อระหว่าง GND กับ ขา OUT จะทำให้ arduino อ่านค่าได้ครับ
จากภาพด้านบน จะเรียงลงมาคือ SW1 - SW5 ครับคือค่าที่อ่านได้จากการกดแต่ละปุ่มด้วย arduino
การเข้าเงื่อนไข โปรแกรมสามารถเขียนโค้ดได้ดังนี้

int SWPin = A0;
int SWValue;

void setup() {
  SWPin = 0;
  Serial.begin(9600);
}
void loop() {
  SWValue = analogRead(SWPin);
  if(SWValue != 0){
    if(SWValue > 1020 && SWValue < 1025)
    {  
      Serial.println(String(SWValue) + " กดปุ่ม SW01");
    }
    if(SWValue > 500 && SWValue < 520)
    {  
      Serial.println(String(SWValue) + " กดปุ่ม SW02");
    }
    if(SWValue > 200 && SWValue < 220)
    {  
      Serial.println(String(SWValue) + " กดปุ่ม SW03");
    }
    if(SWValue > 70 && SWValue < 80)
    {  
      Serial.println(String(SWValue) + " กดปุ่ม SW04");
    }
    if(SWValue > 10 && SWValue < 20)
    {  
      Serial.println(String(SWValue) + " กดปุ่ม SW05");
    }
  }
  delay(1000);
}

ผลลัพธ์
นี่คือข้อดีของการใช้ตัวต้านทานค่าห่างกันมากๆ จะทำให้ค่าที่อ่านได้ไม่มาปนกัน กรณีที่ controller อ่านค่าเข้าเงื่อนไขแล้วค่าเหวี่ยงเล็กน้อยครับ

แสดงความคิดเห็น

0 ความคิดเห็น