[2/2567] ใบงานรายวิชาการประยุกต์ไมโครคอนโทรลเลอร์ สัปดาห์ที่ 8

ใบงานประจำสัปดาห์ รายวิชาการประยุกต์ไมโครคอนโทรลเลอร์


จงเขียนไมโครคอนโทรลเลอร์ โดยกำหนดให้เชื่อมต่อกับโมดูลการแสดงผล lcd16x2 เพื่อควบคุมการแสดงผลให้ได้ตามโจทย์ที่กำหนด. โดยใช้ความรู้ในการเขียนโปรแกรมพื้นฐานที่เรียนในสัปดาห์ที่ผ่านมา นำมาประยุกต์ใช้งาน if , if else , while ,for , switch case

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

การต่อตรงเข้ากับ lcd โดยใช้สายทั้งหมด 8 เส้น (รวมขอ Vcc , Gnd ), และการต่อด้วยโมดูลไดร์โดยสื่อสารผ่าน บัส I2C

ณ ที่นี้ผู้เขียนเลือกวิธีการต่อจอ lcd ด้วยโมดูลไดร์ I2C เนื่องจากมีข้อดีคือใช่สายในการต่อใช้งานเพียงแค่ 4 เส้น ทำให้เรายังมีขา pin ที่คงเหลือใช้งานสำหรับการเชื่อมต่อกับอุปกรณ์อิเล็กทรอนิก หรือโมดูลอื่นๆ หากนักเรียนนักศึกษาต้องการเรียนรู้เกี่ยวกับการต่อใช้งานด้วย lcd16x2 แบบต่อตรงให้ หาข้อมูลเพิ่มเติมการต่อใน internet หรือลิ้งดังต่อไปนี้ คลิก!!

ความแตกต่างระหว่างการต่อตรงกับแบบมีโมดูลไดร์

หากพิจารณาตามรูปจะเห็นได้ว่าการต่อสายสัญญาณระหว่าง ไมโครคอนโทรลเลอร์กับ lcd1602 แบบชนิดต่อตรงนั้น จะต้องใช้งานสายไฟถึง 8 เส้น (รวม Vcc,Gnd) ถือว่าเป็นการใช้ pin ในการสื่อสารเยอะมากสำหรับการต่อเพื่อใช้งานโมดูลแค่โมดูลเดียว ทำให้เราเหลือสายไฟหรือ pin อื่นๆที่จะใช้เชื่อมต่อกับโมดูลอื่นๆ หรืออุปกรณ์อิเล็กทรอนิกส์อื่นๆ นั้นน้อยลงมีข้อดีคือการสื่อสารแบบนี้จะเป็นการรับส่งข้อมูลที่เร็วมากๆ *แต่การแสดงผลนั้นอาจจะไม่จำเป็นต้องใช้งานคุณสมบัติความเร็วในการรรับส่งข้อมูล.

การใช้งานจอ lcd16x2 แบบต่อตรง


การใช้งานจอ lcd16x2 แบบโมดูลไดร์ I2C

ในการต่อใช้งานจอแสดงผล lcd16x2 เข้ากับไมโครคอนโทรลเลอร์ด้วยโมดูลไดร์ I2C มีการเชื่อมต่อดังต่อไปนี้
  • Vcc -- > Vcc (5v)
  • Gnd --> Gnd
  • SCL --> A5
  • SDA -- >A4
เมื่อนักเรียนทำการเชื่อมต่อโมดูลไดร์ I2Cเข้ากับ ไมโครคอนโทรลเลอร์แล้ว การเขียนคำสั่งเพื่อใช้งานจอ lcd นั้นต้องพึ่งพาชุดคำสั่งที่ซับซ้อน เราสามารถเขียนเพื่อเรียกใช้งานคำสั่งเหล่านั้นได้ เพราผู้พัฒนาได้ทำการเตรียมชุดคำสั่งเหล่านั้นไว้แล้ว เราต้องทำคือการเรียกใช้งานไลบรารี่ การที่เราจะเรียกใช้งานไลบรารี่ได้นั้นก็ต้องทำการติดตั้งไลบรารี่ก่อน การติดตั้งไลบรารี่ให้ทำตามขั้นตอนไปพร้อมๆกัน (ทำพร้อมครูผู้สอน)

การใช้งาน LCD1602 I2C กับ Arduino

การใช้งาน LCD1602 I2C เป็นวิธีที่ง่ายและประหยัดพินมากกว่าการต่อแบบปกติ เนื่องจากใช้โปรโตคอล I2C ซึ่งต้องการเพียง 2 สายสัญญาณคือ SDA (ข้อมูล) และ SCL (นาฬิกา) โดยสิ่งที่เราจะต้องระบุคือค่า adress ของตัวอุปกรณ์ก่อนเพื่อที่จะสามารถสื่อสารกันได้ เพราะความสามารถในการสื่อสารของ I2C สามารถต่ออุปกรณ์แบบขนานกันได้หลายๆอุปกรณ์ ถัดไปจะแสดงตัวอย่างของ ชุดคำสั่งที่ใช้ในการหาที่อยู่ address ของอุปกรณ์ I2C.

โค้ด I2C Scanner (หา Address ของจอ LCD)


#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Scanning...");
}

void loop() {
  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Serial.print("I2C device found at address 0x");
      Serial.println(address, HEX);
      delay(500);
    }
  }
  delay(2000);
}
    

ผลลัพธ์ใน Serial Monitor จะแสดงที่อยู่ (Address) เช่น 0x27 หรือ 0x3F (ชุดคำสั่งนี้สามารถนำไปใช้งานกับอุปกรณ์อื่นๆได้ที่เป็น interface แบบ I2C ไม่ใช่เฉพาะแต่ lcd1602 เท่านั้น.

โค้ดพื้นฐานการใช้งาน LCD1602 I2C


#include <LCD_I2C.h>

// กำหนดที่อยู่ I2C และขนาดของ LCD (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // เริ่มต้นการทำงานของ LCD
  lcd.begin(); // คำสั่งเริ่มต้นโมดูล LCD
  lcd.backlight(); // เปิดแสงพื้นหลัง หากไม่ต้องการสามารถกำหนด ปิดได้

  // แสดงข้อความ
  lcd.setCursor(0, 0); // กำหนดตำแหน่งคอลัมน์ 0 แถว 0
  lcd.print("Hello, World!"); // แสดงข้อความ
  lcd.setCursor(0, 1); // กำหนดตำแหน่งคอลัมน์ 0 แถว 1
  lcd.print("I2C LCD Ready!"); // แสดงข้อความ
}

void loop() {
  // ไม่มีกิจกรรมใน loop
}
    

คำอธิบายโค้ด

  • LCD_I2C lcd(0x27, 16, 2); สร้างตัวแปรแบบ object ชื่อ lcd โดยกำหนดพารามิเตอร์ 3 ตัวคือ Address I2C (เช่น 0x27) และขนาดจอ LCD (16 คอลัมน์ x 2 แถว)
  • lcd.begin(); เริ่มต้นการทำงานของโมดูล LCD
  • lcd.backlight(); เปิดแสงไฟพื้นหลังของ LCD
  • lcd.setCursor(คอลัมน์, แถว); กำหนดตำแหน่งของตัวอักษรที่จะพิมพ์บนจอ LCD ใช้เป็นการมาร์คตำแหน่งเริ่มต้นเพื่อเป็นการบอกว่า ตัวอักษรตัวแรกต้องอยู่ ณ ตำแหน่งใด
  • lcd.print("ข้อความ"); แสดงข้อความบนจอ LCD

ผลลัพธ์

เมื่ออัพโหลดโค้ดไปที่ Arduino:

  • จะแสดงข้อความ "Hello, World!" ในแถวแรก
  • และข้อความ "I2C LCD Ready!" ในแถวที่สอง
หมายเหตุ:
  1. หากจอไม่แสดงผล ให้ตรวจสอบที่อยู่ I2C อีกครั้งด้วย I2C Scanner
  2. ตรวจสอบการเชื่อมต่อสาย SDA/SCL
  3. ปรับไลบรารีหรือเวอร์ชันของ LiquidCrystal_I2C หากมีปัญหาเกี่ยวกับความเข้ากันได้



ให้นักเรียนนักศึกษาทำไปทีละข้อย่อยแล้วเรียกตรวจ พร้อมอธิบาย

  • 1 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 โดยให้แสดงผลการทำงานดังต่อไปนี้ แสดงชื่อจริงของนักเรียนนักศึกษาที่บรรทัดแรก และนามสกุลที่บรรทัดที่สอง (นั้งคู่กำหนดให้การเลือกชื่อคนใดคนนึ่ง)
  • 2 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 โดยแสดงผลตัวเลขเป็นเลขที่ของนักเรียนนักศึกษาตัดเลข 0 ออก (เช่น 031 = 31 นั้งคู่เลือกของคนใดคนหนึ่ง) ณ ตำแหน่งสุดท้ายของบรรทัดที่ 1 ในจอ lcd ค้างไว้ 3 วินาทีแล้วหายไป (เขียนไว้ใน void loop)
  • 3 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 โดยให้แสดงผลในบรรทัดที่ 2 ให้มีข้อความและค่าตัวเลขดังต่อไปนี้ "Number 1" ตัวเลขที่แสดงผลเลข 1 จะต้องทำการเพิ่มขึ้นทุกๆ 1 วินาทีไปเรื่อยๆ
  • 4 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 ให้แสดงผลคำว่า "TC" โดยมีลักษณะการแสดงผลคือ ข้อความจะเลื่อนตำแหน่งครั้งละ 1 วินาที ที่ตำแหน่งซ้ายมือสุด แล้วเลื่อนไปขวามือสุดให้บรรทัดที่ 1 และเมื่อจบบรรทัดที่ 1 ให้ลงไปแสดงผลในลักษณะเดียวกันในบรรทัดที่ 2 และเขียนการทำงานทั้งหมดนี้ให้อยู่ในคำสั่ง for loop
  • 5 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 ให้แสดงผลตัวเลข โดยมีค่าเริ่มต้นเท่ากับ 1 และให้ทำการนับค่าเพิ่มขึ้นทุกๆ 10 ครั้งละ 1 วินาที ที่ตำแหน่งขวามือสุด (ตัวเลขต้องแสดงครบทุกหลักและเริ่มนับจาก 1 ถึง 1001)

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

[16/07/67] ใบงานรายวิชาไมโครโปรเซสเซอร์และ ไมโครคอนโทรลเลอร์ สัปดาห์ที่ 9

[11/08/2567] ใบงานรายวิชาไมโครคอนโทรลเลอร์และโปรเซส สัปดาห์ที่ 13

[04/08/2567] ใบงานรายวิชาไมโครคอโทรเลอร์และโปรเซส สัปดาห์ที่ 12