[IPST-SE] Simple Calculator Ep.1

 

IPST-Cal01

โครงงานเครื่องคิดเลขอย่างง่าย ตอนที่ 1

สำหรับโครงงานเครื่องคิดเลขอย่างง่ายที่ผมจะกล่าวถึงนี้ ถือว่าเป็นโครงงานเล็กๆ ที่ช่วยให้เราได้เรียนรู้เชิงโปรแกรมมิ่งขั้นพื้นฐานของภาษา C/C++ สำหรับ Arduino ไปในตัว เพื่อให้เราได้เห็นผลลัพธ์เชิงรูปธรรม เอาละครับคราวนี้เรามาดูกันว่าในโครงงานนี้จะต้องเตรียมอุปกรณ์อะไรกันบ้าง

1. กล่องสมองกล IPST-SE

IPST Board

รูปที่ 1 แสดงหน้าตากล่องสมองกล IPST-SE

 

2. บอร์ดสวิตช์เมตริกซ์เอนกประสงค์ 4×4 จุด(ZX-44) หรือเรียกสั้นๆว่า ”บอร์ดสวิตช์เมตริก” เอาไว้ทำเป็นปุ่มเครื่องคิดเลขจำลองของเรา

image

รูปที่ 2 แสดงหน้าตาZX-44

3. ลำโพงเปียโซ สำหรับเปล่งเสียงตอนเรากดปุ่มใดๆ ที่ปุ่มเครื่องคิดเลข

image

รูปที่ 3 แสดงหน้าตาลำโพงเปียโซ

เกี่ยวกับกล่องสมองกล IPST-SE

กล่องสมองกล IPST-SE ที่เรานำมาใช้ในโครงงานนี้จะมีตัวประมวลผลคือไมโครคอนโทรลเลอร์ ATMega644PA โดยมีหน่วยความจำแบบแฟลชด 64 KB และหน่วยความจำแรม 4 KB ซึ่งเรียกว่าเกินพอสำหรับการทำโครงงานนี้ นอกจากนี้ส่วนหลักๆที่เราจะใช้ก็คือจอกราฟิก LCD สำหรับใช้แสดงผลในการคิดเลขของเรานั่นเอง รวมถึงจะถูกเชื่อมต่อเข้ากับบอร์ดสวิตช์เมตริกที่ใช้เป็นปุ่มเครื่องคิดเลขจำลองผ่านทางพอร์ต RXD1(ขาสัญญาณรับข้อมูล) ซึ่งก็คือภาครับข้อมูลของ UART1 นั่นเอง นอกจากนี้ยังต่อกับลำโพงเปียโซสำหรับกำเนิดเสียงจากการกดปุ่มที่บอร์ดสวิตช์เมตริกทุกครั้ง

เกี่ยวกับบอร์ดสวิตช์เมตริกซ์เอนกประสงค์ 4x4 จุด

บอร์ดสวิตช์เมตริกซ์ที่เรานำมาใช้เป็นปุ่มเครื่องคิดเลขจำลองของนั้นจะมีการเชื่อมต่อกับ IPST-SE ด้วยการสื่อสารข้อมูลอนุกรมโดยมีจุดเชื่อมต่อในตำแหน่ง SERIAL OUTPUT นั่นเองโดยขณะต่อใช้งานจะมีการถ่ายโอนข้อมูลจากการกดปุ่มด้วยอัตราบอด 2400 บิตต่อวินาที ซึ่งการเชื่อมต่อเราจะต่อเข้ากับพอร์ต RXD1(ขาสัญญาณรับข้อมูล) ซึ่งก็คือภาครับข้อมูลของ UART1 นั่นเองครับ จากนั้นก็ตั้งค่าอัตราบอดให้ตรงกันคือ 2400 บิตต่อวินาที เพื่อให้ข้อมูลปุ่มที่ถูกกดจากบอร์ดสวิตช์เมตริกส่งเข้ามายังภาครับ RXD1 เข้าใจตรงกันไม่ผิดเพี้ยน นอกจากนี้การให้ค่าข้อมูลจากปุ่มกดยังสามารถเลือกการจัดเรียงปุ่มแบ่งเป็น 2 โหมดคือโหมด A และโหมด B จากการกำหนดจั๊มเปอร์ โดยจะมีผลให้ตำแหน่งเลย์เอาต์ของปุ่มแตกต่างกันไป

image

รูปแสดงเลย์เอาต์เมื่อใช้งานโหมด A

image

รูปแสดงเลย์เอาต์เมื่อใช้งานโหมด B

สำหรับการใช้งานรูปแบบเลย์เอาต์ที่ใกล้เคียงปุ่มเครื่องคิดเลขมากที่สุดคือการใช้งานโหมด B ดังนั้นเราจะใช้รูปแบบนี้ ส่วนการใช้งานเมื่อผู้ใช้งานกดปุ่มตำแหน่งใดก็จะให้ค่าผลลัพธ์ที่ตรงกับตัวเลขนั้นออกมา เช่น กดปุ่มตำหมายเลข 1 บอร์ดสวิตช์เมตริกซ์ ก็จะส่งค่า 1 ออกมาทาง SERIAL OUTPUT ไปยัง IPST-SE ที่เราต่อใช้งานด้วย แต่หลายคนอาจจะสงสัยว่าแล้วถ้ากดเราปุ่ม A ถึง F จะส่งค่าอะไรออกมาล่ะ ตำตอบก็คือ A ถึง F คือค่าเลขฐาน 16 ครับ นั่นก็คือ

0x0A(ฐาน 16) มีค่าเท่ากับ 10(ฐาน 10)

0x0B(ฐาน 16) มีค่าเท่ากับ 11(ฐาน 10)

0x0C(ฐาน 16) มีค่าเท่ากับ 12(ฐาน 10)

0x0D(ฐาน 16) มีค่าเท่ากับ 13(ฐาน 10)

0x0E(ฐาน 16) มีค่าเท่ากับ 14(ฐาน 10)

0x0F(ฐาน 16) มีค่าเท่ากับ 15(ฐาน 10)

เกี่ยวกับลำโพงเปียโซเมื่อใช้งานร่วมกับกล่องสมองกล IPST-SE

สำหรับการใช้งานลำโพงเปียโซร่วมกับกล่องสมองกล IPST-SE เพื่อกำเนิดเสียงนั้นก็คงไม่ใช่เรี่องยากเย็นอะไรสำหรับผู้ที่เคยใช้งานกล่องสมองกล IPST-SE มาก่อนหน้านี้นะครับ การกำเนิดเสียงทำได้ง่ายๆจากการเรียกใช้งานฟังก์ชั่น beep หรือ ฟังก์ชั่น sound ภายในโปรแกรมเท่านั้นสัญญาณเสียงก็จะปรากฏออกมาแล้ว

IPST-Cal01

การเชื่อมต่อทางฮาร์ดแวร์

– เชื่อมต่อสายสัญญาณจากตำแหน่ง SERIAL OUTPUT ของบอร์ดสวิตช์เมตริกเข้ากับพอร์ต RXD1 ของ IPST-SE และเลือกกำหนดจั๊มเปอร์เป็นโหมด B

– เชื่อมต่อสายสัญญาณจากลำโพงเปียโซเข้ากับพอร์ตหมายเลข 25 ของ IPST-SE

แนวคิดในการพัฒนาโปรแกรม

สำหรับการพัฒนาโปรแกรมในตอนแรกเริ่มของเราในขณะนี้ เป้าหมายเริ่มแรกเลยก็คือจะทำการเขียนโปรแกรมเพื่อตรวจจับการกดปุ่มแต่ละปุ่มที่บอร์ดสวิตช์เมตริก พร้อมกับทำการปรับเปลี่ยนค่ารหัสตัวเลขจากการกดปุ่มไปเป็นรหัสแอสกีหรือเป็นตัวอักขระที่มีสัญญลักษณ์ที่เราเข้าใจง่ายนั่นเอง ซึ่งวิธีการนี้จะมีข้อดีคือเมื่อเรานำไปประมวลผลกับพวกสตริงภายในโปรแกรมจะทำงานได้สะดวกขึ้นนั่นเองครับ ดังนั้นเป้าหมายต่อไปที่เราจะทำการแปลงค่าปุ่มกดภายในโปรแกรมอีกชั้นหนึ่งเพื่อให้มีความใกล้เคียงกับปุ่มเครื่องคิดเลขมากขึ้นมีดังต่อไปนี้ครับ

IPST-SE-Call02

 

 

โปรแกรม Calculator01

#include <ipst.h> // ผนวกไลบรารีหลัก IPST-SE 
void setup() {
  uart1_set_baud(2400); // กำหนดอัตราบอดรับ/ส่งข้อมูลที่ 2400 บิตต่อวินาที
  setTextSize(2); // กำหนดขนาดตัวอักษร GLCD เป็นขนาด 2x
}
char switchToChar(int dat) // ฟังก์ชั่นสำหรับแปลงค่าตัวเลขจากปุ่มกดจากบอร์ดสวิตช์เมตริก
// เป็นแอสกี(เลือกใช้งานจั๊มเปอร์ MODE B)
{
  char result = 0; // กำหนดตัวแปรเก็บค่าผลลัพธ์จากการแปลงค่าไปเป็นอักขระ
  if (dat >= 0 && dat <= 9) // ในกรณีที่ปุ่ม 0-9 ถูกกด
  {
    result = dat + 0x30; // แปลงค่าไปเป็นอักขระ ‘0’-‘9’ ตามปุ่มที่ถูกกด
  }
  else if (dat == 10) // ในกรณีที่ปุ่ม A ถูกกด
  {
    result = '='; // แปลงค่าไปเป็นอักขระ ‘=’ เพื่อใช้แทนปุ่มเครื่องหมายเท่ากับของเครื่องคิดเลข
  }
  else if (dat == 11) // ในกรณีที่ปุ่ม B ถูกกด
  {
    result = '.'; // แปลงค่าไปเป็นอักขระ ‘.’ เพื่อใช้แทนปุ่มเครื่องหมายจุดทศนิยมของเครื่องคิดเลข
  }
  else if (dat == 12) // ในกรณีที่ปุ่ม C ถูกกด
  {
    result = '+'; // แปลงค่าไปเป็นอักขระ ‘+’ เพื่อใช้แทนปุ่มเครื่องหมายบวกของเครื่องคิดเลข
  }
  else if (dat == 13) // ในกรณีที่ปุ่ม D ถูกกด
  {
    result = '-'; // แปลงค่าไปเป็นอักขระ ‘-’ เพื่อใช้แทนปุ่มเครื่องหมายลบของเครื่องคิดเลข
  }
  else if (dat == 14) // ในกรณีที่ปุ่ม E ถูกกด
  {
    result = '*'; // แปลงค่าไปเป็นอักขระ ‘*’ เพื่อใช้แทนปุ่มเครื่องหมายคูณของเครื่องคิดเลข
  }
  else if (dat == 15) // ในกรณีที่ปุ่ม F ถูกกด
  {
    result = '/'; // แปลงค่าไปเป็นอักขระ ‘/’ เพื่อใช้แทนปุ่มเครื่องหมายหารของเครื่องคิดเลข
  }
  return result; // คืนค่าผลลัพธ์จากการแปลง
}
void loop(){
  if (uart1_available()) // ถ้ามีการรับข้อมูลจากการกดปุ่มที่บอร์ดสวิตช์เมตริกซ์เงื่อนไขนี้จะเป็นจริง
  {
    int data = uart1_getkey(); // อ่านค่าจากกการกดปุ่มที่บอร์ดสวิตช์เมตริกซ์ผลลัพธ์ช่วงตั้งแต่(0-15)
    char key = switchToChar(data); // แปลงค่าข้อมูลการกดปุ่มให้เป็นอักขระเครื่องคิดเลข
    glcd(0, 0, "%c", key); // แสดงอักขระผลลัพธ์จากการแปลงที่ GLCD
    beep(25); // สั่งเสียงดัง beep สำหรับการกดปุ่ม
  }
}

การทำงานของโปรแกรม

การทำงานของโปรแกรมจะเริ่มต้นด้วยการกำหนดอัตราบอด UART1 เป็น 2400 บิตต่อวินาที เพื่อให้ขาสัญญาณ RXD1 ที่ต่อเข้ากับบอร์ดสวิตช์เมตริกซ์รับข้อมูลได้ในอัตราส่งข้อมูลเดียวกับบอร์ดสวิตช์เมตริกซ์ซึ่งจะทำให้การส่งและรับข้อมูลไม่เกิดความผิดพลาด จากนั้นส่วนหลักๆคือการทำงานภายในฟังก์ชั่น loop ซึ่งโปรแกรมจะวนตรวจสอบข้อมูลที่เข้ามายังภาครับของ UART1 จากการตรวจสอบเงื่อนไข if(uart1_available()) ถ้ามีการกดปุ่มใดๆบอร์ดสวิตช์เมตริกซ์จะมีข้อมูลประจำปุ่มถูกส่งเข้ามาทำให้ฟังก์ชั่น uart1_available() คืนค่าเป็นจำนวนไบต์ที่รับได้ โดยจะทำให้เงื่อนไขนี้เป็นจริงนั่นเอง จากนั้นโปรแกรมจะทำการอ่านค่าข้อมูลประจำปุ่ม 0-15 จากฟังก์ชั่น uart1_getkey() จากปุ่มที่ถูกกดแล้วส่งไปแปลงเป็นอักขระประจำตัวปุ่มใหม่ด้วยฟังก์ชั่น switchToChar ตามรูปด้านล่าง เพื่อให้ปุ่มเรียงตัวใกล้เคียงกับปุ่มเครื่องคิดเลข

 

image

หลังจากนั้นค่าอักขระประจำตัวปุ่มกดนี้จะนำไปแสดงผลทดสอบที่หน้าจอ GLCD เพื่อตรวจสอบความถูกต้องอีกครั้งหนึ่งพร้อมกับเปล่งเสียงด้วยฟังก์ชั่น beep ทุกครั้ง

ขั้นตอนการทดสอบ

ในขณะที่โปรแกรมทำงานให้เรากดปุ่มที่บอร์ดสวิตช์เมตริกซ์ไปเรื่อยๆพร้อมกับสังเกตอักขระที่แสดงผลมุมบนด้านซ้ายสุดของหน้าจอ GLCD ว่าตรงกับตำแหน่งปุ่มตามรูปที่เราต้องการหรือไม่ไปเรื่อยๆจนกระทั่งครบทั้ง 16 ปุ่ม แต่ถ้าหากพบว่ามีปุ่มตำแหน่งที่สลับกัน อาจเป็นไปได้ว่าเราอาจลืมเซตจั๊มเปอร์ ให้กลับไปตรวจสอบให้แน่ใจว่าเราทำการกำหนดจำเปอร์ใช้งานในโหมดB เป็นที่เรียบร้อยแล้วหรือยัง

สำหรับในโครงงานเครื่องคิดเลขอย่างง่าย ตอนที่ 1 นี้จะเป็นเพียงจุดเริ่มต้นเตรียมตัวพื้นฐานการใช้งานปุ่มกดของบอร์ดสวิตช์เมตริกซ์กันก่อนนะครับ ส่วนในตอนต่อๆไปเราจะค่อยๆเพิ่มเติมในส่วนของโปรแกรมให้มีความสามารถในการรับการป้อนค่าอินพุตตัวเลข รวมไปถึงในส่วนการคำนวณผลลัพธ์ด้วยตัวดำเนินการ บวก,ลบ,คูณ และหารกันต่อไป ซึ่งเหล่านี้ถือเป็นการเรียนรู้โครงสร้างการเขียนโปรแกรมภาษา C/C++ ของ Arduino ไปในตัว ที่จะนำเสนอกันต่อไปนะครับ

Facebook Comments