วันศุกร์ที่ 18 พฤษภาคม พ.ศ. 2561

Digital Input โดยใช้ปุ่ม

Digital Input โดยใช้ปุ่ม

บอร์ด Arduino มี Digital I/O PINs สำหรับใช้รับค่าหรือควบคุมการทำงานของอุปกรณ์ ซึ่งสัญญาณดิจิตอล หมายถึง สัญญาณทางไฟฟ้าที่มีค่าการทำงาน 2 ค่า คือ 1 (High) และ 0 (Low) ดังนั้นเมื่อใช้ Digital Pins ของ Arduino เป็นตัวรับค่าสัญญาณ ค่าที่ Arduino อ่านได้จะมีเพียง 2 ค่า คือ HIGH และ LOW

Pull-Up และ Pull-Down

เมื่อนำสายสัญญาณต่อเข้ากับ Input Pin Arduino จะไม่สามารถตีความได้ชัดเจนว่าขณะนี้ค่าที่อ่านได้เป็น Low หรือ High เพราะบางครั้งแรงดันไฟจะอยู่ครึ่ง ๆ กลาง ๆ ระหว่าง HIGH กับ LOW เพื่อป้องกันปัญหานี้ จึงต้องนำตัวต้านทานมาต่อในวงจรเพื่อให้สามารถระบุสถานะได้อย่างชัดเจน และใช้กระแสลดลงด้วย ตัวต้านทานที่นำมาใช้จะมีค่าระหว่าง 5KΩ - 10KΩ ซึ่งการต่อตัวต้นทานจะมี 2 แบบ คือ Pull-Up และ Pull-Down
ที่มา : http://commandronestore.com/learning/arduino002.php

Pull-Up
การต่อตัวต้านทานแบบนี้เมื่อไม่ได้กดปุ่ม Input pin จะอ่านสถานะเป็น High โดยกระแสปริมาณเล็กน้อยจะไหลจาก Vcc หรือแหล่งจ่ายไฟไปยัง Input pin โดยไม่ได้ไหลลง Ground ดังนั้นแรงดันที่ Input pin อ่านได้จะใกล้เคียงกับแหล่งจ่ายไฟ แต่เมื่อกดปุ่มกระแสจะไหลลง Ground แทน แรงดันที่ Input pin อ่านได้จะใกล้เคียง 0 จึงตีความเป็นสถานะ Low สาเหตุที่ต้องต่อตัวต้านทานไว้เพื่อป้องกันการลัดวงจร โดยตัวต้านทานจะทำหน้าที่จำกัดกระแส

Pull-Down
การต่อตัวต้นทานแบบนี้เมื่อไม่ได้กดปุ่ม Input pin จะอ่านสถานะเป็น Low โดยการทำงานจะตรงข้ามกับแบบ Pull-Up

อุปกรณ์

  1. Arduino UNO
  2. ปุ่มกดติดปล่อยดับแบบ 4 pin
  3. ตัวต้านทาน 10KΩ

วงจร

วงจรปุ่มกดติดปล่อยดับแบบ 4 pin
ที่มา : http://commandronestore.com/learning/arduino002.php

ที่มา : http://se.farnell.com/omron-electronic-components/b3f4055/switch-projected-12x12x7-3-260gf/dp/1960973

  • ขา 1 เชื่อมกับขา 2
  • ขา 3 เชื่อมกับขา 4
  • เมื่อกดปุ่ม ขา 1 และ 2 เชื่อมกับขา 3 และ 4

การต่อวงจร

การต่อวงจรแบบ Pull-Up

การต่อวงจรแบบ Pull-Down


ไลบรารี

-

ตัวอย่าง Code

เป็นตัวอย่างของวงจรแบบ Pull-Down

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
int pins[5] = {3,4,5,6,7};
#define NUMBUTTONS sizeof(pins)/sizeof(int)
int states[NUMBUTTONS], curStates[NUMBUTTONS];
long debouce[NUMBUTTONS];
 
void setup()
{
  byte i;
  for(i=0;i<4;i++) {
    pinMode(pins[i], INPUT);
  }
  Serial.begin(9600);
}

void loop()
{
  checkButton();

  byte i;
  for(i=0;i<NUMBUTTONS;i++) {
    Serial.println(pins[i]);
    Serial.println(states[i]);
  }
  execute(displayLCD,0,(char*)"Button 1");
  execute(displayLCD,1,(char*)"Button 2");
  execute(displayLCD,2,(char*)"Button 3");
  execute(displayLCD,3,(char*)"Button 4");
  execute(displayLCD,4,(char*)"Button 5");
}

void checkButton() {
  byte i;
  for(i=0;i<NUMBUTTONS;i++) {
    int state = digitalRead(pins[i]);
    if(state != HIGH) {
      states[i] = LOW;
      debouce[i] = millis();
      continue;
    }
    if(debouce[i]-millis()>50) {
      states[i] = HIGH;
    }
  }
}

void displayLCD(char* text) {
  Serial.println(text);
}

void execute(void f(char* text), int i, char* text) // receive address of print
{
  if(states[i]==HIGH) {
    if(curStates[i]==LOW) {
      curStates[i] = HIGH;
      f(text);
    }
  } else {
    curStates[i] = LOW;
  }
}

บรรณานุกรม

ไม่มีความคิดเห็น:

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