เมนู

วันเสาร์ที่ 9 กรกฎาคม พ.ศ. 2559

Pinguino กับ LCD Keys pad shield part 2


               จากบทความที่แล้วเราสามารถติดต่อกับ LCD shield และแสดงข้อความออกที่หน้าจอได้แล้ว ในบทความต่อเนื่องชิ้นนี้เราจะมาเขียนโค้ดเพื่อให้ LCD Keys pad shield ทำงานได้เหมือนอย่างเดโมของ Arduino ที่แสดงใน link ของ shield ในบทความที่ผ่านมา ซึ่งนั่นรวมถึงการอ่านค่าจาก keys ผ่านทาง ADC โมดูล และการอัพเดทเวลาทุกๆ 1 วินาทีแล้วแสดงผล ซึ่งเดี๋ยวเราจะมาดูกันทีละส่วนครับ

               จาก schematic ของ LCD Keys pad shield เราจะเห็นว่ามีสวิตซ์กด(keys) อยู่ทั้งหมด 6 สวิตซ์ โดย 5 ใน 6 สวิตซ์ต่อเข้ากับวงจรแบ่งแรงดันและแรงดันเอ้าต์พุตต่อเข้ากับ analog input(A0) เพราะจำนวน I/O ของ Arduino มีจำกัดหากต่อแต่ละสวิตซ์เข้า I/O จะต้องใช้ถึง 5 I/O แต่หากใช้ตัวต้านทานต่อเป็นวงจรแบ่งแรงดันร่วมกับ ADC ก็จะลดจำนวน I/O ลงได้มาก ส่วนอีกสวิตซ์จะเป็น RESET ครับ


               สำหรับ Pinguino นั้นมี library สำหรับอ่านค่าจาก ADC โมดูลที่เหมือนกับของ Arduino เป๊ะแถมความละเอียดยังเป็น 10 บิตเท่ากันอีกด้วย นั่นหมายความว่าเราสามารถ copy โค้ดเดโมของ Arduino มาใช้ใน Pinguino ได้เลย ง่ายดีไหมละครับ โดยโค้ดในส่วนการอ่านค่าสวิตซ์จะเป็นดังนี้ครับ

1:  int adc_key_in = 0;  
2:  #define btnRIGHT 0  
3:  #define btnUP   1  
4:  #define btnDOWN  2  
5:  #define btnLEFT  3  
6:  #define btnSELECT 4  
7:  #define btnNONE  5  

8:  int read_LCD_buttons()  
9:  {  
10:   adc_key_in = analogRead(A0);   // read the value from the sensor  
11:   if (adc_key_in < 50)  return btnRIGHT;   
12:   if (adc_key_in < 195) return btnUP;   
13:   if (adc_key_in < 380) return btnDOWN;   
14:   if (adc_key_in < 555) return btnLEFT;   
15:   if (adc_key_in < 790) return btnSELECT;    
16:   return btnNONE; // when all others fail, return this...  
17:  }  


              เริ่มต้นจากการประกาศตัวแปรชื่อ adc_key_in ไว้สำหรับรับค่าจากการอ่านผลลัพธ์ของการแปลง A/D โดยในฟังก์ชัน read_LCD_buttons() จะมีการเรียกใช้ analogRead(A0) ซึ่งจะส่งค่าผลลัพธ์ของการแปลง A/D ของช่อง A0  มาเก็บไว้ในตัวแปรที่กล่าวข้างต้น จากนั้นจึงเปรียบเทียบค่า แล้วส่งผลลัพธ์ที่ถูกต้องกลับไปให้ฟังก์ชัน main ต่อไป โดยผลลัพธ์ที่จะส่งกลับไปก็คือตัวเลขที่ถูก define เอาไว้ก่อนแล้วเพื่อให้ง่ายในการเขียน หรืออ่านโค้ด ส่วนค่าตัวเลขที่นำมาเปรียบเทียบกับค่าที่อ่านจาก ADC นั้นเคยอ่านเจอว่าเจ้าของได้คำนวณ และวัดแรงดันตกคร่อมจริงเพื่อทดสอบ จากนั้นก็มีบวกค่าความคลาดเคลื่อนเข้าไปอีกค่าละประมาณ 50 จึงได้เป็นตัวเลขเหล่านี้ออกมา

             เมื่อมีฟังก์ชันอ่านค่าจากสวิตซ์แล้ว เราก็มาเขียนโค้ดในส่วนของ main(หรือ loop())กัน ซึ่งก็จะเป็นเพียงการเรียกใช้ฟังก์ชัน read_LCD_buttons() แล้วเขียนข้อความออกไปที่จอ LCD ให้ตรงกับสวิตซ์ที่กด( หรือตรงกับค่าที่ได้รับกลับมาหลังจากเรียกใช้ฟังก์ชัน read_LCD_buttons())เท่านั้นเอง โดยโค้ดในส่วนนี้จะเป็นดังนี้นะครับ


1:  lcd_key = read_LCD_buttons(); // read the buttons  
2:   switch (lcd_key)        // depending on which button was pushed, we perform an action  
3:   {  
4:    case btnRIGHT:  
5:     {  
6:     lcd.printf("RIGHT ");  
7:     break;  
8:     }  
9:    case btnLEFT:  
10:     {  
11:     lcd.printf("LEFT  ");  
12:     break;  
13:     }  
14:    case btnUP:  
15:     {  
16:     lcd.printf("UP  ");  
17:     break;  
18:     }  
19:    case btnDOWN:  
20:     {  
21:     lcd.printf("DOWN ");  
22:     break;  
23:     }  
24:    case btnSELECT:  
25:     {  
26:     lcd.printf("SELECT");  
27:     break;  
28:     }  
29:     case btnNONE:  
30:     {  
31:     lcd.printf("NONE ");  
32:     break;  
33:     }  
34:   }  


               อันสุดท้าย  ในตัวอย่างของ Arduino จะเห็นว่ามีตัวเลขที่เพิ่มค่าทุกๆวินาทีแสดงอยู่ด้วย ซึ่งในโค้ดเดโมจะมีการเรียกใช้ฟังก์ชัน millis() ซึ่งจะเป็นฟังก์ชันที่คืนค่าที่เพิ่มขึ้นทุกๆ 1 วินาที( millisecond ) กลับมาให้ เมื่อเราหารค่าทีได้คืนกลับมาด้วย 1000 เราก็จะได้ตัวเลขที่จะแสดงผลทุกๆ 1 วินาที ซึ่งโค้ดก็จะเป็นดังตัวอย่างข้างล่างนี้


1:  lcd.setCursor(9,1);      // move cursor to second line "1" and 9 spaces over  
2:  lcd.printf("%u", millis()/1000);   // display seconds elapsed since power-up  

               เมื่อเราเข้าใจทุกส่วนแล้วเราก็เอามารวมกันก็จะได้เป็นโค้ดเดโมที่ทำงานกับ LCD Keys pad shield ได้เหมือนกับ Arduino ทุกอย่างเลยครับ โค้ดตัวเต็มจะอยู่ข้างล่างนี้นะครับ แล้วลองดูวิดีโอผลลัพธ์การทำงานได้เลยครับ


1:  /*-----------------------------------------------------  
2:  Author: --<Ekkachai Muangrodpai>  
3:  www.picgetstart.blogspot.com  
4:  Date: 2016-07-09  
5:  Board:  Pinguino 8 by Jimmy + LCD Keypads Shield V.1  
6:  Description:  
7:  -Display a message on LCD Keypads Shield, and also read a keys through analog AN0.  
8:  -At the same time, display the second time too.  
9:   * LCD RS pin to digital pin 5  
10:   * LCD E pin to digital pin 4  
11:   * LCD D4 pin to digital pin 24  
12:   * LCD D5 pin to digital pin 18  
13:   * LCD D6 pin to digital pin 17  
14:   * LCD D7 pin to digital pin 16  
15:   * LCD R/W pin to ground  
16:   note:  
17:   - don't use lcd.print() and lcd.printf() in the same program.  
18:  -----------------------------------------------------*/  
19:  #define BACK_LIGHT  2    //LCD back light control by pin2  
20:  // define some values used by the panel and buttons  
21:  int lcd_key   = 0;  
22:  int adc_key_in = 0;  
23:  #define btnRIGHT 0  
24:  #define btnUP   1  
25:  #define btnDOWN  2  
26:  #define btnLEFT  3  
27:  #define btnSELECT 4  
28:  #define btnNONE  5  
29:  // read the buttons  
30:  int read_LCD_buttons()  
31:  {  
32:   adc_key_in = analogRead(A0);   // read the value from the sensor   
33:   if (adc_key_in < 50)  return btnRIGHT;   
34:   if (adc_key_in < 195) return btnUP;   
35:   if (adc_key_in < 380) return btnDOWN;   
36:   if (adc_key_in < 555) return btnLEFT;   
37:   if (adc_key_in < 790) return btnSELECT;    
38:   return btnNONE; // when all others fail, return this...  
39:  }  
40:  void setup( void) {  
41:    // put your setup code here, to run once:  
42:    pinMode(BACK_LIGHT, OUTPUT);  
43:    digitalWrite(BACK_LIGHT, HIGH);  
44:    // initialize the library with the numbers of the interface pins    
45:    lcd.pins(5, 4, 24, 18, 17, 16, 0, 0, 0, 0); // RS, E, D4 ~ D8    
46:    // set up the LCD's number of columns and rows:   
47:    lcd.begin(16, 2);  
48:    // Print a message to the LCD.  
49:    lcd.clear();  
50:    lcd.setCursor(0,0);  
51:    lcd.printf("Push the buttons"); // print a simple message  
52:  }  
53:  void loop( void ) {  
54:   lcd.setCursor(9,1);      // move cursor to second line "1" and 9 spaces over  
55:   lcd.printf("%u", millis()/1000);   // display seconds elapsed since power-up  
56:   lcd.setCursor(0,1);      // move to the begining of the second line  
57:   lcd_key = read_LCD_buttons(); // read the buttons  
58:   switch (lcd_key)        // depending on which button was pushed, we perform an action  
59:   {  
60:    case btnRIGHT:  
61:     {  
62:     lcd.printf("RIGHT ");  
63:     break;  
64:     }  
65:    case btnLEFT:  
66:     {  
67:     lcd.printf("LEFT  ");  
68:     break;  
69:     }  
70:    case btnUP:  
71:     {  
72:     lcd.printf("UP  ");  
73:     break;  
74:     }  
75:    case btnDOWN:  
76:     {  
77:     lcd.printf("DOWN ");  
78:     break;  
79:     }  
80:    case btnSELECT:  
81:     {  
82:     lcd.printf("SELECT");  
83:     break;  
84:     }  
85:     case btnNONE:  
86:     {  
87:     lcd.printf("NONE ");  
88:     break;  
89:     }  
90:   }    
91:  }  


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

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