กลับไปหน้ารวมไฟล์
interface-a-16x2-character-lcd-20373f.md

จัดไปวัยรุ่น! อย่าลืมเตรียมอุปกรณ์ให้ครบก่อนเริ่มงานนะ

บทนำ

การมี LCD (Liquid Crystal Display) เป็นส่วนหนึ่งของดีไซน์งานช่างมันมีประโยชน์เพียบเลยน้อง! มันเอาไว้แสดงข้อมูลจากเซ็นเซอร์ต่างๆ สร้างเมนูให้กดเล่นได้ หรือจะเอาไว้เป็นเครื่องมือดีบั๊กเวลางานติดขัดก็ยังได้ แถมยังสร้างตัวอักษรแบบพิเศษขึ้นมาเองได้อีกด้วย! ในโปรเจคนี้ เราจะมาทำการเชื่อมต่อ LCD แบบ 16×2 ตัวอักษร (ในโหมด 4-bit) เข้ากับบอร์ด Arduino Uno Rev3 (Uno) กัน ซึ่งจะใช้ขา Digital Output จาก Uno ทั้งหมด 6 ขาเพื่อขับ LCD (4 ขาสำหรับข้อมูล และ 2 ขาสำหรับควบคุม)

Liquid Crystal Display (LCD)

เจ้า LCD ตัวนี้มีขาทั้งหมด 16 ขา ใช้สำหรับจ่ายไฟ, ควบคุม, และส่งข้อมูล มันใช้คอนโทรลเลอร์มาตรฐานของ Hitachi ดังนั้นการทำงานพื้นฐานก็จะคล้ายๆ กันในทุกยี่ห้อที่ขายกัน มันมีอินเตอร์เฟสแบบขนานทั้งแบบ 4-bit และ 8-bit เราจะใช้มันในโหมด 4-bit แทนที่จะเป็น 8-bit นั่นหมายความว่าเราต้องส่ง nibble สูง (1 nibble = 4 bits) ก่อน แล้วตามด้วย nibble ต่ำ เพื่อส่งข้อมูล 1 ไบต์ที่จำเป็นสำหรับแต่ละคำสั่งหรือตัวอักษร LCD ที่เห็นบ่อยสุดก็คือแบบ 16×2 หรือ 20×4 ซึ่งหมายถึงมันสามารถแสดงตัวอักษรได้ 16 ตัวในแต่ละบรรทัด (2 บรรทัด) และ 20 ตัวในแต่ละบรรทัด (4 บรรทัด) ตามลำดับ ด้านล่างคือแผนผังขา (pinout) ของ LCD

หมายเหตุ: LCD ส่วนใหญ่จะไม่ได้มาพร้อมกับเฮดเดอร์ชาย (male header) 16 ขา น้องต้องบัดกรีใส่เข้าไปเองนะจ๊ะ

LCD Pinout

ขาที่ 1 และขาที่ 2 ใช้จ่ายไฟให้ LCD ควรต่อเข้ากับ GND และ +5Vdc ตามลำดับ ขาที่ 3 ใช้ปรับความคมชัด (contrast) – จะต่อเข้ากับโพเทนชิโอมิเตอร์ (pot) 10KΩ เพื่อให้สามารถปรับแรงดันเอาต์พุตไปที่ขา 3 ได้ Register Select (RS) ที่ขา 4 ใช้เพื่อส่งคำสั่งเมื่อมันเป็นลอจิกต่ำ (low) หรือส่งข้อมูลเมื่อมันเป็นลอจิกสูง (high) ขาที่ 5 คือ Read/Write (R/W) ใช้สำหรับอ่านหรือเขียนข้อมูลจาก LCD ตัว LCD มีความสามารถในการรันโปรแกรมและแสดงข้อมูล ซึ่งเป็นเหตุผลที่ต้องมีขานี้ อย่างไรก็ตาม เราจะแค่เขียนข้อมูลไปที่ LCD เท่านั้น ดังนั้นเราสามารถต่อขานี้ลงกราวด์ได้ ซึ่งจะทำให้มันอยู่ในโหมดเขียน (write mode) ตลอดเวลา ขาแปดขาต่อไป (7-14) ใช้สำหรับส่งข้อมูล เนื่องจากเราใช้ LCD ในโหมด 4-bit, D0-D3 (ขา 7-10) จะไม่ถูกใช้ ขาที่ 15 และ 16 คือแอโนดและแคโทดของ LED แบ็คไลท์ ตามลำดับ เราจำเป็นต้องใช้ตัวต้านทาน (Resistor) ภายนอกต่ออนุกรมกับแบ็คไลท์นี้เพื่อจำกัดกระแส ไม่เช่นนั้น LED อาจจะไหม้ได้

LCD มีไดอะแกรมเวลา (timing diagram) ที่ต้องทำตามเพื่อให้สามารถส่งคำสั่งและข้อมูลตัวอักษรได้ นอกจากนี้ยังมีเวลาเซ็ตอัพและโฮลด์ที่ต้องคำนึงถึงด้วย สิ่งนี้ทำให้ระดับสัญญาณคงที่และมั่นใจว่าขาจะถูกอ่านตัวอย่างถูกเวลา ไดอะแกรมด้านล่างแสดงไดอะแกรมเวลาในการส่งคำสั่งไปยัง LCD ในโหมด 4-bit ถ้าเราต้องการส่งคำสั่งล้างหน้าจอ เราต้องส่ง 0000 (nibble สูง) บนบัสข้อมูล แล้วตามด้วย 0001 (nibble ต่ำ)

Send Command to LCD in 4-bit Mode

ไดอะแกรมด้านล่างแสดงไดอะแกรมเวลาในการส่งข้อมูลไปยัง LCD ในโหมด 4-bit ตัวอย่างเช่น สมมติว่าเราต้องการส่งตัวอักษร '1' ไปที่ LCD ค่า ASCII 8-bit ที่เทียบเท่าก็คือ 0x30 หรือ 0011 0000 ดังนั้นเราจะส่ง 0011 บนบัสข้อมูลก่อน แล้วตามด้วย 0000

Send Data to LCD in 4-bit Mode

น้องไม่ต้องเขียนไดรเวอร์สำหรับ LCD เองหรอก เพราะมีไลบรารีให้ใช้ชื่อว่า LiquidCrystal.h ไลบรารีใช้ง่ายมาก แค่บอกสเปคของ LCD เช่น จำนวนคอลัมน์และแถว และจะใช้อินเตอร์เฟสแบบ 4-bit หรือ 8-bit เราก็สามารถส่งข้อมูลและคำสั่งต่างๆ ได้มากถึง 19 คำสั่งแล้ว สู้งานนะน้อง!

อินเตอร์เฟซแบบขนานความเร็วสูง

ต่างจากเวอร์ชัน I2C นะน้อง โปรเจคนี้ใช้ อินเตอร์เฟซแบบขนานมาตรฐานของจอ LCD ซึ่งให้อัตรารีเฟรชที่เร็วขึ้น เหมาะสำหรับทำแอนิเมชันข้อความเคลื่อนไหว

  • การจัดวางขา (Pin Configuration): ใช้ขา Digital 6 ขาบน Arduino (RS, EN, D4, D5, D6, D7) เพื่อสื่อสารในโหมด 4-bit สถาปัตยกรรมนี้ช่วยบาลานซ์ระหว่างจำนวนขาที่ใช้กับความเร็วในการส่งข้อมูล
  • ปรับความคมชัด (Contrast Control): ใช้ โพเทนชิโอมิเตอร์ 10kΩ ปรับแรงดันที่ขา V0 ช่วยให้เราปรับความชัดของตัวอักษรกับแบ็คไลท์ได้ตามชอบ

ซอฟต์แวร์ระดับสูง (Software Abstraction)

ไลบรารี่ LiquidCrystal จัดการเรื่องไทม์มิ่งที่ซับซ้อนของชิปควบคุม HD44780 ให้เราแล้ว

  • สร้างตัวอักษรเอง (Character Customization): Arduino สามารถเก็บตัวอักษรแบบกำหนดเองขนาด 5x8 พิกเซลได้สูงสุด 8 ตัวใน CGRAM ของ LCD ทำให้เราสร้างไอคอนแบตเตอรี่, แถบความคืบหน้า หรือสัญลักษณ์พิเศษที่ไม่มีในชุด ASCII มาตรฐานได้

ต่อสายให้กับ LCD

เราใช้ Modulus Canister ในการติดตั้ง LCD ดูวิดีโอด้านล่างนี้ถ้าน้องใช้ Modulus นะ

พอติดตั้ง LCD กับ Modulus เสร็จแล้ว ก็มาต่อสายจัมเปอร์ (หัวผู้) เข้ากับขาพิน (หัวเมีย) ของ Uno กัน ต้องใช้ทั้งหมด 6 เส้นนะ: ต่อที่ขา 4, 6, และ 11-14 ของ LCD ไปที่ขา 2, 3, และ 4-7 ของ Uno ตามลำดับ

ถ้าน้องใช้เบรดบอร์ด ลองดูแผนผังระดับสูงด้านล่างนี้ เราจะจ่ายไฟ +5V และ GND ให้เบรดบอร์ดผ่าน FuelCan ซึ่งจะอธิบายในหัวข้อถัดไป

Circuit Schematic with LCD Mounted to Breadboard

ต่อสายกับ FuelCan

ถ้ายังไม่ได้ติดตั้ง Uno ลงบนพื้นที่โปรโตไทป์ของ FuelCan ก็จัดไปเลยวัยรุ่น ถ้าใช้เบรดบอร์ดแทน Modulus ให้นำเบรดบอร์ดไปวางในช่องเก็บของด้านล่าง จะได้ไม่ต้องใช้สายจัมเปอร์ยาวเกินไป เราต้องจ่ายไฟ +5V และ GND ไปที่รางไฟและกราวด์บนเบรดบอร์ด โดยใช้สายแปลงจาก Banana Jack ไปเป็นคลิปทดสอบ (test-lead clip) ต้องใช้พินหัวผู้ 2 อันเพื่อติดตั้งคลิปทดสอบที่ด้านเบรดบอร์ด เสียบปลาย Type A ของสาย USB เข้ากับช่อง USB1 และปลาย Type B เข้ากับช่องของ Uno เสียบอะแดปเตอร์ AC-DC เพื่อจ่ายไฟให้ FuelCan

ซอฟต์แวร์

พอต่อสายเสร็จและจ่ายไฟให้ FuelCan แล้ว ก็ถึงเวลาอัพโหลดสเก็ตช์ลง Uno ได้แล้ว สเก็ตช์อยู่ด้านล่างนี้ ไลบรารี่ LiquidCrystal มีฟังก์ชันให้ใช้ตั้ง 19 ฟังก์ชัน พี่ไม่แสดงให้ดูทั้งหมดหรอก แต่จะแสดงตัวที่ใช้บ่อยๆ เช่น lcd.print, lcd.clear, lcd.home, lcd.createChar, lcd.write, lcd.setCursor, lcd.blink, lcd.noBlink, lcd.cursor, lcd.noCursor, lcd.scrollDisplayLeft และ lcd.scrollDisplayRight แถมยังมีตัวอย่างการแสดงตัวอักษรแบบกำหนดเองบน LCD ด้วย! สู้งานนะน้อง

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "ejshea"
category: "Screens & Displays"
components: []
description: "Add an LCD to your projects to display data acquired from sensors, display your own custom characters, or use it as a debugging tool."
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19pGlJVv513Fv75Rmc/e6OnjRcU48ugbhxN/Te/7UFCmUTbAq5xtzvmcxc+67mo8/IckEz1FuIPc4UvxEaY7344F+4qZW4FmCA="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/interface-a-16x2-character-lcd-20373f_cover.jpg"
lang: "en"
likes: 10
passwordHash: "bf93db9aec906357f8152bcc5d35a2681aa10232c522ac5db2c74ed2d78d5030"
price: 870
seoDescription: "Learn how to interface a 16x2 Character LCD with Arduino to display sensor data and custom characters or for debugging projects."
tags:
  - "debugging tools"
  - "display"
title: "งานง่ายแต่หล่อ! ต่อจอ LCD 16x2 กับ Arduino ให้ตึง"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/HDSkxAJ_sfc"
  - "https://www.youtube.com/embed/O_D4lDRPng4"
views: 22856