Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ณัฐวุฒิ มณีวรรณ์ 615

ณัฐวุฒิ มณีวรรณ์ 615

Published by Nattawut Maneewan, 2021-03-11 02:02:08

Description: ณัฐวุฒิ มณีวรรณ์ 615

Search

Read the Text Version

ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ 4 บิต  247 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ช่ันหน่วงเวลา หรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยุดคา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 2. ฟังก์ช่ันส่งค่าเวลาต้ังแต่บอร์ดเร่ิมทางาน ตวั เลขท่ีส่งกลบั มาจากฟังก์ชนั่ เป็ นเลขของเวลา ต้งั แต่บอร์ดเริ่มทางานมีหน่วยเป็ นมิลลิวินาที ซ่ึงตวั เลขจะวนกลบั เป็ นศูนยอ์ ีกคร้ัง (Over Flow) เมื่อเวลาผา่ นไปประมาณ 50 วนั หลงั จากบอร์ดเริ่มทางาน รูปฟังชน่ั เป็นดงั น้ี millis(); ตวั อย่าง unsigned long time=millis(); หมายถึง เกบ็ ค่าเวลาต้งั แตบ่ อร์ดเร่ิมทางานโดยเก็บค่าลงในตวั แปร time ฟังก์ชั่นใช้งานของไลบรารี่ LCD การใชง้ านแสดงผลท่ี LCD ชนิดตวั อกั ษรจาเป็นตอ้ งใชไ้ ลบราร่ีช่วยงาน ซ่ึงไลบราร่ีถูกเพมิ่ เขา้ มา ในตวั โปรแกรม Arduino IDE แลว้ ไมต่ อ้ งติดต้งั เพิม่ เติม ไลบรารี่ แหล่งดาวน์โหลด LiquidCrystal.h ไม่ตอ้ งดาวนโ์ หลดเนื่องจากมาพร้อมกบั Arduino IDE มีฟังกช์ นั่ ใหใ้ ชง้ านดงั น้ี 1. ฟังก์ช่ันกาหนดขาเชื่อมต่อ ใชใ้ นการระบุขาที่ใชเ้ ชื่อมต่อให้ตวั โปรแกรมรับรู้ การเช่ือมต่อ จะใชก้ ารสื่อสารแบบ 4 บิตฟังชนั่ น้ีเป็นการกาหนดคา่ ในส่วนหวั โปรแกรม รูปแบบเป็นดงั น้ี LiquidCrystal lcd_name(RS, EN, D4, D5, D6, D7); ตวั อย่าง LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); หมายถึง ต่อไปในโปรแกรมจะใชช้ ื่อ lcd ในการเรียกใชง้ านโดยมีการเชื่อมต่อสายสัญญาณ ดงั ในวงเล็บโดยตวั เลขแรกเป็ นขา RS ไล่ไปจนตวั เลขสุดทา้ ยเป็ นขา D7 ซ่ึงเป็ นช่ือท้งั หมดเป็ นชื่อ ขาของ LCD

248  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. ฟังก์ช่ันกาหนดขนาดของ LCD ใชก้ าหนดขนาดของ LCD ท่ีกาลงั เช่ือมตอ่ รูปแบบเป็นดงั น้ี .begin(cols, rows); ตัวอย่าง cols: ตวั เลขจานวนตวั อกั ษรต่อหน่ึงบรรทดั rows: ตวั เลขจานวนบรรทดั ของจอ LCD lcd.begin(16, 2); หมายถงึ ใช้ LCD ขนาด 16 ตวั อกั ษร 2 บรรทดั 3. ฟังก์ชั่นแสดงผลออกจอ LCD ใชแ้ สดงขอ้ ความ ตวั เลข หรือค่าในตวั แปร รูปแบบเป็นดงั น้ี .print(data); .print(data, BASE); data: คือขอ้ มูลที่ตอ้ งการแสดงผลซ่ึงอาจเป็ นขอ้ ความ ตวั เลข หรือค่าในตวั แปร โดยถา้ เป็นขอ้ ความจะตอ้ งใส่ “-” คร่อมขอ้ ความน้นั ๆ BASE: รูปแบบการแสดงผลของค่าตวั เลข (เลขฐาน) ไดแ้ ก่ BIN,DEC,OCT,HEX 4. ฟังก์ชั่นล้างหน้าจอ ใช้ลา้ งขอ้ มูลบนหน้าจอแลว้ ให้เคอร์เซอร์กลบั ไปรอท่ีตาแหน่งมุมบน ซา้ ยของจอ รูปแบบเป็นดงั น้ี .clear(); 5. ฟังก์ชั่นกาหนดตาแหน่งเคอร์เซอร์ก่อนการพิมพ์ ใชก้ าหนดพิกดั ให้เคอร์เซอร์ไปรอก่อน การแสดงผลในฟังกช์ น่ั lcd.print() รูปแบบเป็นดงั น้ี .setCursor(col, row); col: ตาแหน่งของคอลมั นท์ ่ีเคอร์เซอร์ตอ้ งไปรอ (คอลมั นแ์ รกคือ 0) row: ตาแหน่งของบรรทดั ท่ีเคอร์เซอร์ตอ้ งไปรอ (บรรทดั แรกคือ 0) ตัวอย่าง lcd.setCursor (6, 1); หมายถงึ ใหเ้ คอร์เซอร์ไปรอท่ีตาแหน่งคอลมั น์ 6 บรรทดั 1 7. วงจรทใ่ี ช้ทดลอง วงจรเพื่อใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus

ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ 4 บิต  249 กรณีท่ีใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 7,20 ATMEGA328 10k VCC SW1 1 RST AVCC C1 D2 4 11 D4 0.1uF D3 5 12 D5 D4 6 13 D6 D5 11 14 D7 USB to UART (TTL Level) R2,R3 3 E R/W RS Vo VCC GND 1k 2 6 54321 DTR RXD D1(TXD) D6 12 VCC TXD D0(RXD) D7 13 10k +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.20-1 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป VCC ARDUINO 5V D2 11 D4 D3 12 D5 VCC D4 13 D6 10k D5 14 D7 E R/W RS Vo VCC GND 654321 D6 D7 GND รูปท่ี 4.20-2 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 D11 D10 D9 D8 5 D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 ABCDE ABCDE D13 3V3 REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปท่ี 4.20-3 การต่อลงบอร์ดทดลอง

250  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตอ่ วงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.20-4 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมแสดงขอ้ ความ “hello, world!” ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <LiquidCrystal.h> // set up the LCD's connection pins 2 /* The circuit: // set LCD size 3 * LCD RS pin to digital pin 7 4 * LCD E pin to digital pin 6 5 * LCD D4 pin to digital pin 2 6 * LCD D5 pin to digital pin 3 7 * LCD D6 pin to digital pin 4 8 * LCD D7 pin to digital pin 5 9 * LCD R/W pin to ground 10 */ 11 LiquidCrystal lcd(7,6,2,3,4,5); 12 void setup() 13 { 14 lcd.begin(16, 2); 15 lcd.print(\"hello, world!\"); 16 } 17 void loop() {} รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ LiquidCrystal.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2-10 เป็นส่วนอธิบายวา่ ขาใดของ LCD เชื่อมต่อกบั ขาใดของ Arduino

ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ท่ีเช่ือมตอ่ แบบ 4 บิต  251 - บรรทดั ที่ 11 กาหนดจานวนขาพอร์ตท่ีใชเ้ ชื่อมต่อกบั LCD - บรรทดั ที่ 14 ประกาศเร่ิมใชง้ านไลบรารี่ LCD พร้อมกาหนดขนาดของ LCD - บรรทดั ท่ี 15 แสดงขอ้ ความบนหนา้ จอ LCD ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนรูปแบบการแสดงผล การทดลองที่ 2 เขียนโปรแกรมแสดงเวลาที่บอร์ดเริ่มทางาน โดยแสดงเวลาหน่วยเป็นวนิ าทีแสดงผลดว้ ย จอ LCD ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง อ่านค่าเวลาจากบอร์ด แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <LiquidCrystal.h> // set up the LCD's connection pins 2 /* The circuit: // set LCD size 3 * LCD RS pin to digital pin 7 4 * LCD E pin to digital pin 6 5 * LCD D4 pin to digital pin 2 6 * LCD D5 pin to digital pin 3 7 * LCD D6 pin to digital pin 4 8 * LCD D7 pin to digital pin 5 9 * LCD R/W pin to ground 10 */ 11 LiquidCrystal lcd(7,6,2,3,4,5); 12 void setup() 13 { 14 lcd.begin(16, 2); 15 lcd.print(\"Running time\"); 16 lcd.setCursor(13,1); 17 lcd.print(\"sec\"); 18 } 19 void loop() 20 { 21 lcd.setCursor(8,1); 22 lcd.print(millis()/1000); 23 delay(1000); 24 }

252  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ LiquidCrystal.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2-10 เป็นส่วนอธิบายวา่ ขาใดของ LCD เช่ือมตอ่ กบั ขาใดของ Arduino - บรรทดั ที่ 11 กาหนดจานวนขาพอร์ตท่ีใชเ้ ชื่อมต่อกบั LCD - บรรทดั ที่ 14 ประกาศเริ่มใชง้ านไลบรารี่ LCD พร้อมกาหนดขนาดของ LCD - บรรทดั ท่ี 15 แสดงขอ้ ความบนหนา้ จอ LCD \"Running time\" - บรรทดั ที่ 16 ขยบั เคอร์เซอร์ไปยงั ตาแหน่งที่ระบุ - บรรทดั ที่ 22 แสดงขอ้ มูลท่ีเกิดจากการคานวนค่าเวลาบนหนา้ จอ LCD ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนแปลงรูปแบบการแสดงผล 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมแสดงผลใหค้ ลา้ ยลกั ษณะไฟวงิ่ โดยใช้ * แทนไฟ กาหนดรูปแบบของการวงิ่ ตามความต้องการแสดงผลในบรรทดั ล่าง สาหรับบรรทดั บนให้แสดงข้อความค้างไว้ ขอ้ ความวา่ “Light Running” วงจรที่ใชท้ ดลองเป็นดงั รูป VCC ARDUINO 5V D2 11 D4 D3 12 D5 D4 13 D6 D5 14 D7 E R/W RS Vo VCC GND 654321 D6 VCC D7 10k GND รูปท่ี 4.20-5 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ I2C  253 ใบงานที่ 4.21 การเขยี นโปรแกรมแสดงผลด้วยจอ LCD ทเ่ี ชื่อมต่อแบบ I2C 1. จุดประสงค์ทวั่ ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ท่ีเช่ือมต่อแบบ I2C ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เชื่อมต่อแบบ I2C ได้ 2. บอกข้นั ตอนการต่อวงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. บอร์ด Arduino Nano 3.0 1 ตวั 3. LCD ชนิดตวั อกั ษรขนาด 16x2 1 ตวั 4. โมดูลส่ือสาร I2C สาหรับ LCD 1 ตวั 5. สายเช่ือมต่อ USB (Mini USB) 1 เส้น 6. สายเช่ือมต่อวงจร 1 ชุด 7. คอมพิวเตอร์ 1 เคร่ือง 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

254  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน I2C Bus ย่อมาจาก Inter Integrate Circuit Bus (IIC) (ออกเสียงว่า ไอ-แสคว-ซี-บสั ) เป็ นการ ส่ือสารอนุกรม แบบซิงโครนสั (Synchronous) เพ่ือใช้ ติดต่อส่ือสาร ระหวา่ ง ไมโครคอนโทรลเลอร์กบั อุปกรณ์ต่อพว่ งภายนอกใชส้ ายสัญญาณสื่อสาร 2 เส้นคือ Serial data (SDA) และ Serial clock (SCL) ซ่ึง สามารถเช่ือมตอ่ อุปกรณ์จานวนหลาย ๆ ตวั เขา้ ดว้ ยกนั โดยใชข้ าพอร์ตเพยี ง 2 ขาเท่าน้นั VDD Rpullup SCL SDA Master Slave #1 Slave #2 Slave #n รูปท่ี 4.21-1 ผงั การต่อเชื่อมระหวา่ งไมโครคอนโทรลเลอร์กบั อุปกรณ์ I2C วิธีการที่จะเลือกสื่อสารกบั อุปกรณ์ต่อพ่วงใชก้ ารควบคุมที่ไบตข์ องรหสั ควบคุม (Control byte) ประกอบดว้ ยรหสั ประจาตวั อุปกรณ์ (Device ID) เป็ นรหสั ท่ีเปลี่ยนแปลงไม่ได้ และรหสั ที่เป็ นแอดเดรส ของตัวอุปกรณ์ซ่ึงผู้ใช้งานสามารถกาหนดได้โดยมีแอดเดรสจานวน 3 ขาคือ A0, A1, A2 นั่นก็ หมายความว่าหากต่อพ่วงอุปกรณ์ I2C ท่ีเป็ นชนิดเดียวกนั มีรหัสประจาตวั เดียวกนั สามารถกาหนด แอดเดรสตา่ งกนั ได้ 8 ตวั ซ่ึงหมายถึงสามารถต่อพว่ งอุปกรณ์ชนิดเดียวกนั ได้ 8 ตวั ID ID ID ID A2 A1 A0 R/W Device ID Control byte Address Mode รูปท่ี 4.21-2 คอนโทรลไบตข์ องอุปกรณ์ I2C การใชง้ านจอแสดงผล LCD ท่ีใชก้ ารสื่อสารแบบ I2C ตวั อุปกรณ์จริงเป็ นการใช้ LCD ธรรมดา เช่นเดียวกบั ใบงานท่ีผา่ นมาเพียงแต่เพ่มิ โมดูลส่ือสารแบบ I2C เสียบเพ่มิ เขา้ ที่ตวั จอ หากไมไ่ ดแ้ กไ้ ขใด ๆ ท่ีตวั โมดูลขาแอดเดรสของโมดูลจะไม่ได้ถูกชอร์ตลงกราวด์ดงั น้ันขาแอดเดรสท้งั 3 ขาจะเป็ นลอจิก HIGH ท้งั หมดดงั รูป รูปท่ี 4.21-3 โมดูลส่ือสารแบบ I2C สาหรับขบั จอ LCD

ใบงานที่ 4.21 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ I2C  255 รูปท่ี 4.21-4 โมดูลส่ือสารแบบ I2C เมื่อเช่ือต่อกบั จอ LCD แอดแดรสของโมดูลสามารถแกไ้ ขเป็ นตาแหน่งอ่ืนไดโ้ ดยการบดั กรีเช่ือมต่อให้ถึงกนั (Low) หรือปลดลอย (High) เพื่อกาหนดแอดเดรส (A0 A1 A2) ท่ีตวั โมดูลโดยสามารถกาหนดแอดเดรสเป็ น ตาแหน่งอ่ืนได้ หมายเลขของแอดเดรส (รวมรหัสประจาตวั ) ของโมดูลท่ีใช้ชิพเบอร์ต่างกันจะได้ แอดเดรสท่ีต่างกนั ดงั น้ันหากโมดูลท่ีใช้ชิพเบอร์ PCF8574 แอดเดรสจะเป็ น 27H และเม่ือใช้ชิพเบอร์ PCF8574A แอดเดรสจะเป็น 3FH (กรณีท่ีไม่ไดบ้ ดั กรีแกไ้ ขแอดเดรส) รูปที่ 4.21-5 แอดเดรสของโมดูลส่ือสารแบบ I2C สาหรับจอ LCD ท่ีสามารถแกไ้ ขได้ การเขียนโค้ดโปรแกรมเพ่ือใช้งานการแสดงผลจอ LCD ท่ีสื่อสารด้วยโมดูลส่ือสาร I2C จาเป็นตอ้ งใชไ้ ลบรารี่ช่วยงานพร้อม ๆ กนั ถึงสองตวั ดงั น้ี - Wire.h มีมาพร้อมกบั โปรแกรม Arduino IDE - LiquidCrystal_I2C.h ตอ้ งดาวน์โหลดเพ่ิมเติมเนื่องจากโปรแกรม Arduino IDE ไม่ได้มีการ ติดต้งั มาใหต้ ้งั แตเ่ ริ่มตน้ ไลบรารี่ แหล่งดาวน์โหลด Wire.h ไมต่ อ้ งดาวน์โหลดเนื่องจากมาพร้อมกบั Arduino IDE LiquidCrystal_I2C.h https://github.com/marcoschwartz/LiquidCrystal_I2C

256  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การติดต้งั ไลบราร่ีมีข้นั ตอนการดาเนินการเพอ่ื นาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวน์โหลดไลบราร่ีซ่ึงเป็นไฟล์ Zip ดงั รูป รูปที่ 4.21-6 การดาวน์โหลดไลบรารี่ที่นามาใชง้ าน 2. ทาการเพ่มิ ไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิม่ จากไฟล์ zip แลว้ ทาการหาไฟล์ zip ที่ไดจ้ ากการดาวน์โหลดในขอ้ 1 รูปท่ี 4.21-7 การเพิม่ ไลบราร่ีลงในโปรแกรม Arduino IDE 6. ฟังก์ช่ัน Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยุดคา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 2. ฟังก์ช่ันส่งค่าเวลาต้ังแต่บอร์ดเริ่มทางาน ตวั เลขที่ส่งกลบั มาจากฟังก์ชน่ั เป็ นเลขของเวลา ต้งั แต่บอร์ดเริ่มทางานมีหน่วยเป็ นมิลลิวินาที ซ่ึงตวั เลขจะวนกลบั เป็ นศูนยอ์ ีกคร้ัง (Over Flow) เม่ือเวลาผา่ นไปประมาณ 50 วนั หลงั จากบอร์ดเริ่มทางาน รูปฟังชน่ั เป็นดงั น้ี millis();

ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ I2C  257 ฟังก์ช่ันใช้งานของไลบรารี่ LCD I2C การใชง้ านแสดงผลท่ี LCD ที่สื่อสารดว้ ยโมดูล I2C มีฟังก์ชนั่ การใชง้ านคลา้ ย ๆ กบั การใช้ LCD ธรรมดาเช่นเดียวกบั ใบงานที่ผา่ นมาไดแ้ ก่ 1. ฟังก์ชั่นกาหนดแอดเดรสและขนาดของ LCD ใชใ้ นการระบุแอดเดรสของโมดูลสื่อสาร I2C ท่ีเช่ือมตอ่ กบั LCD และขนาดของจอ LCD ที่ใชง้ าน รูปแบบเป็นดงั น้ี LiquidCrystal_I2C lcd_name(address,col,row); address: แอดเดรสของโมดูล I2C cols: จานวนตวั อกั ษรตอ่ หน่ึงบรรทดั ของจอ LCD rows: จานวนบรรทดั ของจอ LCD ตวั อย่าง LiquidCrystal_I2C lcd(0x3F,16,2); หมายถงึ ต่อไปในโปรแกรมจะใช้ชื่อ lcd ในการเรียกใช้งานโดยโมดูลเชื่อมต่อมี แอดเดรสเป็น 3FH และเป็นจอ LCD ขนาด 16 ตวั อกั ษร 2 บรรทดั 2. ฟังก์ชั่นกาหนดขนาดของ LCD ใชก้ าหนดขนาดของ LCD ที่กาลงั เชื่อมตอ่ รูปแบบเป็นดงั น้ี .begin(cols, rows) ตัวอย่าง cols: ตวั เลขจานวนตวั อกั ษรต่อหน่ึงบรรทดั หมายถงึ rows: ตวั เลขจานวนบรรทดั ของจอ LCD lcd.begin(16, 2); ใช้ LCD ขนาด 16 ตวั อกั ษร 2 บรรทดั 3. ฟังก์ช่ันแสดงผลออกจอ LCD ใชแ้ สดงขอ้ ความ ตวั เลข หรือคา่ ในตวั แปร รูปแบบเป็นดงั น้ี .print(data); .print(data, BASE); data: คือขอ้ มูลท่ีตอ้ งการแสดงผลซ่ึงอาจเป็ นขอ้ ความ ตวั เลข หรือคา่ ในตวั แปร โดยถา้ เป็นขอ้ ความจะตอ้ งใส่ “-” คร่อมขอ้ ความน้นั ๆ BASE: รูปแบบการแสดงผลของค่าตวั เลข (เลขฐาน) ไดแ้ ก่ BIN,DEC,OCT,HEX

258  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 4. ฟังก์ช่ันล้างหน้าจอ ใชล้ า้ งหนา้ จอแลว้ ใหเ้ คอร์เซอร์กลบั ไปรอท่ีตาแหน่งมุมบนซา้ ยของจอ รูปแบบเป็นดงั น้ี .clear(); 5. ฟังก์ช่ันกาหนดตาแหน่งเคอร์เซอร์ก่อนการพิมพ์ ใช้กาหนดพิกดั ให้เคอร์เซอร์ไปรอก่อน การแสดงผลในฟังกช์ น่ั lcd.print() รูปแบบเป็นดงั น้ี .setCursor(col, row); col: ตาแหน่งของคอลมั นท์ ่ีเคอร์เซอร์ตอ้ งไปรอ (คอลมั น์แรกคือ 0) row: ตาแหน่งของบรรทดั ท่ีเคอร์เซอร์ตอ้ งไปรอ (บรรทดั แรกคือ 0) ตัวอย่าง lcd.setCursor (6, 1); หมายถงึ ใหเ้ คอร์เซอร์ไปรอท่ีตาแหน่งคอลมั น์ 6 บรรทดั 1 7. วงจรทใ่ี ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit VCC VCC R1 SDA 10k 7,20 ATMEGA328 SCL VCC GND SW1 1 RST AVCC C1 0.1uF A4(SDA) 27 A5(SCL) 28 USB to UART (TTL Level) R2,R3 3 1k 2 DTR RXD D1(TXD) TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.21-8 วงจรที่ใชไ้ อซี AVR ในการทดลอง

รูปที่ 4.21-11 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน ABCDE GNDF GH I JA4(SDA) ARDUINO กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป 1 D13 D12 1 A5(SCL) VCC VCC รูปที่ 4.21-9 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลองD11 3V3 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD10 REF D9 A0 GNDD8 5 5 A1 VCCD7 A2 SDAD6 A3 SCLD5 A4 D4 A5รูปที่ 4.21-10 การต่อลงบอร์ดทดลองD3 10 10 A6การต่อวงจรเพ่ือทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD2 A7 5V GND RST RST GND 15 VIN D0 D1 15 20 20 ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เชื่อมตอ่ แบบ I2C  259 25 25 30 30 GND VCC SDA SCL 35 35 40 40 45 45 50 50 55 55 60 60 ABCDE F GH I J

260  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมแสดงขอ้ ความ “Hello, world!” ในบรรทดั บนและ “LCD i2c Lab” บรรทดั ล่าง ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <LiquidCrystal_I2C.h> 3 LiquidCrystal_I2C lcd(0x3F,16,2); //0x27 for PCF8574 and 0x3F for PCF8574A 4 void setup() 5{ 6 lcd.init(); 7 lcd.backlight(); 8 lcd.setCursor(2,0); 9 lcd.print(\"Hello, world!\"); 10 lcd.setCursor(4,1); 11 lcd.print(\"LCD i2c Lab\"); 12 } 13 void loop() 14 { 15 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 รวมไฟลไ์ ลบราร่ี LiquidCrystal_I2C.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 3 กาหนดแอดเดรสของโมดูล I2C และขนาดของ LCD ท่ีใชง้ าน - บรรทดั ที่ 6 ประกาศเริ่มใชง้ านไลบราร่ี - บรรทดั ที่ 7 สั่งเปิ ดไฟแบลค็ ไลต์ - บรรทดั ที่ 8 ขยบั เคอร์เซอร์ไปยงั ตาแหน่งที่ระบุ (Colum ที่ 2, Row ที่ 0) - บรรทดั ท่ี 9 แสดงขอ้ ความบนหนา้ จอ LCD \"Hello, world!\" ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนรูปแบบการแสดงผล

ใบงานที่ 4.21 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ I2C  261 การทดลองท่ี 2 เขียนโปรแกรมแสดงเวลาที่บอร์ดเริ่มทางาน โดยแสดงเวลาหน่วยเป็นวนิ าทีแสดงผลดว้ ย จอ LCD ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง อ่านคา่ เวลาจากบอร์ด แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <LiquidCrystal_I2C.h> 3 LiquidCrystal_I2C lcd(0x3F,16,2); //0x27 for PCF8574 and 0x3F for PCF8574A 4 void setup() 5{ 6 lcd.init(); 7 lcd.backlight(); 8 lcd.setCursor(2,0); 9 lcd.print(\"Running time\"); 10 lcd.setCursor(13,1); 11 lcd.print(\"sec\"); 12 } 13 void loop() 14 { 15 lcd.setCursor(8,1); 16 lcd.print(millis()/1000); 17 delay(1000); 18 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 รวมไฟลไ์ ลบรารี่ LiquidCrystal_I2C.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 3 กาหนดแอดเดรสของโมดูล I2C และขนาดของ LCD ที่ใชง้ าน - บรรทดั ท่ี 6 ประกาศเร่ิมใชง้ านไลบรารี่ - บรรทดั ท่ี 7 สงั่ เปิ ดไฟแบลค็ ไลต์ - บรรทดั ท่ี 8 ขยบั เคอร์เซอร์ไปยงั ตาแหน่งที่ระบุ - บรรทดั ที่ 9 แสดงขอ้ ความบนหนา้ จอ LCD \"Hello, world!\" - บรรทดั ที่ 15 ขยบั เคอร์เซอร์ไปยงั ตาแหน่งที่ระบุ - บรรทดั ที่ 16 แสดงขอ้ มูลท่ีเกิดจากการคานวนคา่ เวลาบนหนา้ จอ LCD

262  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนแปลงรูปแบบการแสดงผล 4. เปลี่ยนเทียบความแตกตา่ งของการเขียนโคด้ ระหวา่ งใช้ LCD ธรรมดากบั แบบ I2C 9. สรุปผลการปฏบิ ตั งิ าน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมรับค่าจากคียแ์ พด โดยมีเงื่อนไขคือเมื่อมีการกดคียต์ วั เลขจะมีตวั เลขปรากฏที่ LCD คล้ายการกดเคร่ืองคิดเลขกล่าวคือเมื่อมีการกดตวั เลขคร้ังที่สองเป็ นต้นไปตวั เลข หลงั สุดจะดนั ตวั เลขหนา้ สุดไปทางซา้ ยเร่ือย ๆ และเม่ือกดคีย์ * จะลา้ งขอ้ มูลหนา้ จอท้งั หมด วงจรท่ีใชท้ ดลองเป็นดงั รูป VCC ARDUINO VCC A4(SDA) GND VCC SDA SCL A5(SCL) D12 D11 1 2 3 D10 D9 4 5 6 D8 7 8 9 D7 D6 * 0 # GND รูปที่ 4.21-12 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

ใบงานที่ 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  263 ใบงานท่ี 4.22 การเขยี นโปรแกรมแสดงผลด้วยโมดูลตวั เลข MAX7219 1. จุดประสงค์ทวั่ ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219 ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219 ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. บอร์ด Arduino Nano 3.0 1 ตวั 3. โมดูลตวั เลข MAX7219 1 ตวั 4. สายเช่ือมต่อ USB (Mini USB) 1 เส้น 5. สายเชื่อมตอ่ วงจร 1 ชุด 6. คอมพวิ เตอร์ 1 เคร่ือง 4. ลาดบั ข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

264  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน MAX7219 เป็ นไอซีที่ถูกออกแบบมาสาหรับการแสดงตวั เลขดว้ ย 7-Segment ไดม้ ากกว่าหน่ึง หลกั และยงั สามารถนาไปประยกุ ตใ์ ชก้ บั LED (Dot) matrix ไดอ้ ีกดว้ ย ใบงานน้ีเป็นการใชง้ านเฉพาะการ แสดงผลท่ีเป็ นตวั เลขเท่าน้นั ซ่ึงปัจจุบนั มีผูผ้ ลิตเป็ นโมดูลสาเร็จรูปจาหน่ายมีจานวนตวั เลขในโมดูล จานวนท้งั สิ้น 8 ตวั ตอ่ หน่ึงโมดูล ขอ้ ดีของการแสดงผลที่เป็นตวั เลขดว้ ยโมดลู MAX7219 คือสามารถต่อ พ่วงโมดูลไดอ้ ีกหลายโมดูลจึงทาให้สามารถแสดงตวั เลขไดจ้ านวนมากโดยใชส้ ายสัญญาณจานวนนอ้ ย เพยี ง 3 เส้นคือ DIN, CS และ CLK รูปที่ 4.22-1 โมดูลแสดงผลตวั เลข 8 หลกั ดว้ ยไอซี MAX7219 รูปที่ 4.22-2 การตอ่ พว่ งโมดูลแสดงผลหลายหลกั (1) การเขียนโคด้ โปรแกรมเพื่อใช้งานการแสดงผลโมดูลตวั เลข 8 หลักด้วยไอซี MAX7219 มี ไลบรารี่ใหเ้ ลือกช่วยงานได้ 2 ตวั ซ่ึงแตล่ ะตวั ก็มีขอ้ ดีขอ้ ดอ้ ยแตกต่างกนั ไปไลบรารี่ดงั กล่าวคือ - LedControl.h - HCMAX7219.h LedControl.h เป็ นไลบราร่ีสาหรับแสดงผลโมดูลท่ีใชไ้ อซี MAX7219 ไลบราร่ีน้ีไม่มีมาพร้อมโปรแกรม Aduino IDE ดงั น้นั การใชง้ านจึงตอ้ งมีการติดต้งั เพม่ิ เติ่มเขา้ ไปในโปรแกรม ซ่ึงสามารถสามารถดาวน์โหลดไดท้ ่ี ไลบราร่ี แหล่งดาวน์โหลด LedControl.h https://github.com/wayoda/LedControl/releases (1)http://embedded-lab.com/blog/introducing-a-new-serial-spi-8-digit-seven-segment-led-display-module-using-max7219/

ใบงานท่ี 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  265 การติดต้ังไลบรารี่ มีข้นั ตอนการดาเนินการเพื่อนาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวน์โหลดไลบราร่ีซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.22-3 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ าน 2. ทาการเพ่ิมไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แลว้ ทาการหาไฟล์ zip ที่ไดจ้ ากการดาวน์โหลดในขอ้ 1 รูปที่ 4.22-4 การเพ่ิมไลบรารี่ลงในโปรแกรม Arduino IDE ข้อดีของไลบรารี่ LedControl.h 1. เลือกใชข้ าเช่ือมตอ่ ใดกไ็ ด้ 2. สามารถสร้างรูปแบบการติดของเซกเมนตไ์ ดจ้ ากฟังกชน่ั ท่ีมีใหม้ า ข้อเสียของไลบรารี่ LedControl.h 1. ไม่สามารถส่งั แสดงผลท่ีเป็ นตวั เลขหรือค่าจากตวั แปรที่มีตวั เลขจานวนหลายหลกั ได้ (ตอ้ งเขียน ฟังกช์ น่ั แยกหลกั เอาเอง) 2. ไม่สามารถสงั่ แสดงขอ้ ความที่เป็นประโยคได้ (ตอ้ งเขียนฟังกช์ นั่ แยกเอง) HCMAX7219.h เป็ นไลบรารี่สาหรับแสดงผลโมดูลท่ีใชไ้ อซี MAX7219 ไลบรารี่น้ีจะตอ้ งใชไ้ ลบราร่ีเพ่ิมอีก 1 ตวั คือ SPI.h ซ่ึงมีมาพร้อมโปรแกรม Aduino IDE ไม่ตอ้ งติดต้งั เพ่ิมเติม แต่จะติดต้งั เพิ่มเติมเฉพาะไลบราร่ี HCMAX7219.h ซ่ึงสามารถดาวนโ์ หลดไดท้ ี่ ไลบรารี่ แหล่งดาวน์โหลด HCMAX7219.h https://github.com/HobbyComponents/HCMAX7219

266  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตดิ ต้งั ไลบราร่ี มีข้นั ตอนการดาเนินการเพื่อนาไลบราร่ีมาใชง้ านดงั น้ี 1. ดาวน์โหลดไลบรารี่ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.22-5 การดาวน์โหลดไลบรารี่ท่ีนามาใชง้ าน 2. ทาการเพม่ิ ไลบราร่ีลงในโปรแกรม Arduino IDE โดยการเพม่ิ จากไฟล์ zip แลว้ ทาการหาไฟล์ zip ที่ไดจ้ ากการดาวน์โหลดในขอ้ 1 รูปที่ 4.22-6 การเพมิ่ ไลบรารี่ลงในโปรแกรม Arduino IDE ข้อดีของไลบรารี่ HCMAX7219.h 1. มีฟังกช์ นั่ พมิ พข์ อ้ ความใหใ้ ชง้ าน 2. มีฟังกช์ น่ั แสดงตวั เลข (หลายหลกั ได)้ ท้งั เลขจานวนบวก/ลบ และแสดงทศนิยมได้ ข้อเสียของไลบราร่ี HCMAX7219.h 1. เน่ืองจากใชก้ ารสื่อสารดว้ ย SPI ดงั น้นั ขาเช่ือมต่อท่ีเป็น MOSI,SCLK จึงเปลี่ยนเป็นขาอื่นไม่ได้ 2. การสร้างรูปแบบการแสดงของแตล่ ะเซกเมนตต์ อ้ งเขา้ ไปแกใ้ นไลบรารี่ 6. ฟังก์ช่ัน Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long)

ใบงานที่ 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  267 2. ฟังก์ชั่นส่งค่าเวลาต้ังแต่บอร์ดเริ่มทางาน ตวั เลขท่ีส่งกลบั มาจากฟังก์ชนั่ เป็ นเลขของเวลา ต้งั แต่บอร์ดเริ่มทางานมีหน่วยเป็ นมิลลิวินาที ซ่ึงตวั เลขจะวนกลบั เป็ นศูนยอ์ ีกคร้ัง (Over Flow) เมื่อเวลาผา่ นไปประมาณ 50 วนั หลงั จากบอร์ดเร่ิมทางาน รูปฟังกช์ น่ั เป็นดงั น้ี millis(); ฟังก์ชั่นใช้งานของไลบรารี่ LedControl.h 1. ฟังก์ช่ันกาหนดขาเชื่อมต่อ ใชใ้ นการระบุขาที่ใชเ้ ชื่อมต่อใหต้ วั โปรแกรมรับรู้วา่ ขาสญั ญาณ ชนิดใดเชื่อมต่ออยทู่ ี่ขาใด รูปแบบเป็นดงั น้ี LedControl lc=LedControl(dataPin,clkPin,csPin,numDevices); dataPin: ขาพอร์ตที่ใชเ้ ชื่อมต่อกบั ขา DIN ของโมดูล clkPin: ขาพอร์ตที่ใชเ้ ชื่อมต่อกบั ขา CLK ของโมดูล csPin: ขาพอร์ตที่ใชเ้ ชื่อมต่อกบั ขา CS ของโมดูล numDevices: จานวนโมดูลที่ใชเ้ ช่ือมตอ่ ตวั อย่าง LedControl lc=LedControl(11,13,12,1); หมายถงึ ต่อไปในโปรแกรมจะใช้ช่ือ lc ในการเรียกใช้งานโมดูลโดยมีการเชื่อมต่อ สายสัญญาณ ดงั ในวงเล็บโดยตวั เลขแรกเป็ นขา DIN ไล่ไปจนตวั เลขสุดทา้ ยเป็ นการบอกวา่ มี การเช่ือมต่อใชง้ านโมดูลจานวน 1 ตวั 2. ฟังก์ชั่นสั่งให้ทางานหรือไม่ทางาน ใชก้ าหนดการทางานของโมดูล รูปแบบเป็นดงั น้ี .shutdown(addr,false); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 false: เริ่มทางาน ตวั อย่าง lc.shutdown(0,false); หมายถึง ใหโ้ มดูลตวั แรก (แอดเดส 0) เร่ิมทางาน 3. ฟังก์ชั่นกาหนดความสว่าง ใชก้ าหนดความสวา่ งของ LED 7 Segment บนตวั โมดูล รูปแบบ เป็นดงั น้ี .setIntensity(addr,value); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 value: ตวั เลขของลาดบั ความสวา่ งมีคา่ ต้งั แต่ 0-15 (ดบั สุดจนถึงสวา่ งสุด)

268  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 4. ฟังก์ชั่นล้างข้อมูล ใชล้ า้ งขอ้ มูลหนา้ จอหรือการทาใหห้ นา้ จอไม่มีอะไรแสดงผลรูปแบบเป็ น ดงั น้ี .clearDisplay(addr); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 5. ฟังก์ช่ันแสดงตัวเลข ใช้แสดงตวั เลขแสดงจุดทศนิยมในตาแหน่งท่ีระบุบนโมดูล รูปแบบ เป็นดงั น้ี .setDigit(addr, digit, value, point_decimal); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 digit: ตาแหน่งท่ีต้องการให้แสดงโดยตาแหน่งหน้าสุดเป็ นตาแหน่งที่ 7 หลงั สุดเป็นตาแหน่ง 0 value: คา่ ตวั เลขที่ตอ้ งการแสดงผลมีคา่ เท่ากบั 0-9 point_decimal: การแสดงทศนิยม ตอ้ งการแสดงใช้ true ไมต่ อ้ งการใช้ false 6. ฟังก์ชั่นแสดงตัวอักษร ใช้แสดงตวั อกั ษรแสดงจุดทศนิยมในตาแหน่งที่ระบุบนโมดูล ตวั อกั ษรท่ีแสดงไดม้ ีเพยี งบางตวั ไดแ้ ก่ A b c d E F H L P . -_ รูปแบบเป็นดงั น้ี .setChar(addr, digit, character, point_decimal); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 digit: ตาแหน่งท่ีต้องการให้แสดงโดยตาแหน่งหน้าสุดเป็ นตาแหน่งที่ 7 หลงั สุดเป็นตาแน่ง 0 character: ค่าตวั อกั ษรที่ตอ้ งการแสดง เวลาใช้ตอ้ งใช้เครื่องหมาย ‘-‘ ครอบ ตวั อกั ษรท่ีตอ้ งการใหแ้ สดงผลดว้ ย point_decimal: การแสดงทศนิยม ตอ้ งการแสดงใช้ true ไม่ตอ้ งการใช้ false 7. ฟังก์ชั่นแสดงผลท่กี าหนดรูปแบบเอง ใชเ้ มื่อตอ้ งการแสดงสิ่งท่ีตอ้ งการโดยการกาหนดการ ติดดบั ในแต่ละเซ็กเมนต์ รูปแบบเป็นดงั น้ี lc.setRow(addr, digit,value); addr: ตวั เลขแอดเดรสของโมดูล หากเป็นตวั แรกจะเป็น 0 digit: ตาแหน่งท่ีต้องการให้แสดงโดยตาแหน่งหน้าสุดเป็ นตาแหน่งท่ี 7 หลงั สุดเป็นตาแน่ง 0 value: คา่ ท่ีตอ้ งการใหต้ ิดดบั

ใบงานที่ 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  269 lc.setDigit(0,7,1,false); lc.setDigit(0,6,2,true); lc.setDigit(0,5,3,false); 76543210 VCC GND DIN CS CL K lc.setRow(0,2,B00110111); a fb Ex Want to display H g segment dp a b c d e f g e c data 0 0 1 1 0 1 1 1 d dp รูปท่ี 4.22-7 การใชฟ้ ังกช์ น่ั การแสดงผลดว้ ยไลบราร่ี LedControl.h ฟังก์ช่ันใช้งานของไลบรารี่ HCMAX7219.h 1. ฟังก์ช่ันกาหนดขาเช่ือมต่อ ใชใ้ นการระบุขาที่ใชเ้ ช่ือมต่อใหต้ วั โปรแกรมรับรู้วา่ ขาสัญญาณ ชนิดใดเชื่อมต่ออยทู่ ่ีขาใด เนื่องจากไลบราร่ีน้ีใชก้ ารสื่อสารผา่ น SPI ดงั น้นั ขาที่ใชเ้ ชื่อมต่อ แบบ SPI มีขาท่ีระบุแน่นอนไม่สามารถเปล่ียนเป็ นขาอ่ืนไดซ้ ่ึงขาท่ีใช้งานได้แก่ MOSI, MISO, CLK, SS รูปแบบเป็นดงั น้ี HCMAX7219 HCMAX7219(LOAD); LOAD: ขาพอร์ตท่ีใชเ้ ช่ือมต่อกบั ขา CS ของโมดูลซ่ึงสามารถกาหนดเองได้ 2. ฟังก์ชั่นล้างข้อมูล ใชล้ า้ งขอ้ มูลหนา้ จอหรือการทาใหห้ นา้ จอไม่มีอะไรแสดงผลรูปแบบเป็ น ดงั น้ี .Clear(); 3. ฟังก์ชั่นกาหนดความสว่าง ใชก้ าหนดความสวา่ งของ LED 7 Segment บนตวั โมดูล รูปแบบ เป็นดงั น้ี .Intensity(Level, Driver) Level: ตวั เลขของลาดบั ความสวา่ งมีค่าต้งั แต่ 0-15 (ดบั สุดจนถึงสวา่ งสุด) Driver: ตวั เลขแอดเดรสของโมดูล หากเป็นโมดูลตวั แรกจะเป็น 0

270  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 4. ฟังก์ชั่นการแสดงผล ไลบรารี่น้ีมีฟังกช์ น่ั ส่งขอ้ มูลเขา้ บฟั เฟอร์เพ่ือแสดงผลใชเ้ พียงฟังก์ชนั่ เดียวแต่สามารถแสดงผลได้ 3 รูปแบบคือ a. แสดงเป็ นข้อความ .print7Seg(\"TEXT STRING\", Offset); \"TEXT STRING\": ขอ้ ความท่ีตอ้ งการใหแ้ สดงผลซ่ึงสามารถป้อนเป็นคาได้ Offset: ตาแหน่งที่ตอ้ งการใหแ้ สดงของตวั อกั ษรแรก ตาแหน่งหนา้ สุดของโมดูลคือ 8 และหลงั สุดคือ 1 b. แสดงเป็ นตัวเลข .print7Seg(Value, Offset); Value: ค่าตวั เลขที่ตอ้ งการใหแ้ สดง (แสดงผลเป็นเลขฐาน 10) Offset: ตาแหน่งท่ีตอ้ งการใหแ้ สดงของตวั อกั ษรแรก ตาแหน่งหนา้ สุดของโมดูลคือ 8 และหลงั สุดคือ 1 c. แสดงเป็ นตวั เลขพร้อมตาแหน่งทศนิยม .print7Seg(Value, Decimal_Position, Offset); Value: คา่ ตวั เลขที่ตอ้ งการใหแ้ สดง (แสดงผลเป็นเลขฐาน 10) Decimal_Position: คา่ ตาแหน่งทศนิยมของตวั เลขน้นั ๆ Offset: ตาแหน่งท่ีตอ้ งการใหแ้ สดงของตวั อกั ษรแรก ตาแหน่งหนา้ สุดของโมดูลคือ 8 และหลงั สุดคือ 1 5. ฟังก์ช่ันแสดงผล ใชฟ้ ังก์ชนั่ ส่งค่าจากบฟั เฟอร์ที่ไดจ้ ากฟังก์ชนั่ HCMAX7219.print7Seg() เพ่อื แสดงผลรูปแบบเป็นดงั น้ี .Refresh(); HCMAX7219.print7Seg(\"ABCD\",8); 87654321 VCC GND DIN CS CL K HCMAX7219.print7Seg(123,2,3); รูปท่ี 4.22-8 การใชฟ้ ังกช์ นั่ การแสดงผลดว้ ยไลบรารี่ HCMAX7219.h

ใบงานท่ี 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  271 7. วงจรทใ่ี ช้ทดลอง วงจรเพอ่ื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป 1DN15819 VCC Peripheral circuit CPU circuit VCC MAX7219 7-Segment 4-Digit R1 7,20 ATMEGA328 VCC 10k VCC Din Load SW1 1 RST AVCC Clk GND C1 D11(MOSI) 17 0.1uF D10(SS) 16 19 D13(SCK) USB to UART (TTL Level) R2,R3 3 1k 2 DTR RXD D1(TXD) TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.22-9 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป VCC ARDUINO 5V VCC MAX7219 7-Segment 4-Digit D11(MOSI) D10(SS) VCC Din D13(SCK) Load Clk GND GND รูปท่ี 4.22-10 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

272  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]AB C DEF GHI J 1 D13 D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 5 3V3 D10 VCCREFD910 GNDA0D8 DIN5 A1D7 15 CSA2D6 CL KA3D5 A4 D4 รูปท่ี 4.22-11 การต่อลงบอร์ดทดลองA5D3 การต่อวงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus10 A6D2 A7 รูปที่ 4.22-12 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน5VGND RST RST 8. การเขยี นโค้ดโปรแกรมควบคุมGND 15 VIN D0 การทดลองที่ 1 เขียนโปรแกรมแสดงผลบนโมดูล MAX7219 โดยให้แสดงท้งั ข้อความท้งั ตวั เลขที่มีD1 ทศนิยมโดยใชไ้ ลบรารี่ LedControl.h ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี20 20 START25 25 กาหนดค่าเริม่ ต้นต่าง 30 30 แสดงผล 35 35 40 40 45 45 50 50 55 55 60 60 AB C DE F GH I J

ใบงานท่ี 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  273 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include \"LedControl.h\" 2 LedControl lc=LedControl(11,13,10,1); // 11->DIN,13->CLK,10->CS,1->No.devices 3 void setup() 4{ 5 lc.shutdown(0,false); // Enable display 6 lc.setIntensity(0,10); // Set brightness level (0 is min, 15 is max) 7 lc.clearDisplay(0); // Clear display register 8} 9 void loop() 10 { 11 lc.setDigit(0,7,2,false); 12 lc.setDigit(0,6,3,true); 13 lc.setDigit(0,5,4,false); 14 lc.setRow(0,4,B00110111); 15 lc.setRow(0,3,B01001111); 16 lc.setRow(0,2,B00001110); 17 lc.setRow(0,1,B00001110); 18 lc.setRow(0,0,B01111110); 19 while(1); 20 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ LedControl.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 กาหนดขาพอร์ต Arduino ที่ใชเ้ ช่ือมตอ่ กบั โมดูล MAX7219 - บรรทดั ที่ 5 สัง่ ใหโ้ มดูล MAX7219 เริ่มทางาน - บรรทดั ที่ 6 กาหนดความสวา่ งของตวั เลขบนโมดูล MAX7219 - บรรทดั ที่ 7 ลา้ งขอ้ มูลท่ีแสดงผลบนโมดูล MAX7219 - บรรทดั ที่ 11 แสดงเลข 2 ท่ีตาแหน่ง 7 และไมแ่ สดงทศนิยม - บรรทดั ที่ 12 แสดงเลข 3 ที่ตาแหน่ง 6 และแสดงทศนิยม - บรรทดั ท่ี 13 แสดงเลข 4 ที่ตาแหน่ง 5 และไม่แสดงทศนิยม - บรรทดั ที่ 14 ตาแหน่ง 4 ใหต้ ิดสวา่ งเป็นตวั “H” - บรรทดั ท่ี 15 ตาแหน่ง 3 ใหต้ ิดสวา่ งเป็นตวั “E” - บรรทดั ท่ี 16 ตาแหน่ง 2 ใหต้ ิดสวา่ งเป็นตวั “L” - บรรทดั ที่ 17 ตาแหน่ง 1 ใหต้ ิดสวา่ งเป็นตวั “L” - บรรทดั ท่ี 18 ตาแหน่ง 0 ใหต้ ิดสวา่ งเป็นตวั “O” - บรรทดั ที่ 19 สั่งใหซ้ ีพียวู นอยกู่ บั ที่ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปล่ียนรูปแบบการแสดงผล

274  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมแสดงผลบนโมดูล MAX7219 โดยให้แสดงท้งั ขอ้ ความท้งั ตวั เลขท่ีมี ทศนิยมโดยใชไ้ ลบราร่ี HCMAX7219.h ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 /* PINOUT: 2 MODULE.............Arduino 3 VCC................+5V 4 GND................GND 5 DIN................D11(MOSI) 6 CLK................D13(CLK) 7 CS.................D10(SS) 8 */ 9 #include <HCMAX7219.h> 10 #include <SPI.h> 11 #define CS 10 //Set the CS pin 12 HCMAX7219 HCMAX7219(CS); 13 void setup() 14 { 15 HCMAX7219.Intensity(10, 0); //Sets the intensity of the LED 0 to 15 16 } 17 void loop() 18 { 19 HCMAX7219.Clear(); // Clear the output buffer 20 HCMAX7219.print7Seg(\"ABCDE\",8);// Write some text to the output buffer 21 HCMAX7219.print7Seg(123,2,3); // Write value to the output buffer 22 HCMAX7219.Refresh(); // Send the output buffer to the display 23 while(1); 24 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-8 เป็นส่วนอธิบายวา่ ขาใดของโมดูล MAX7219 เชื่อมต่อกบั ขาใดของ Arduino - บรรทดั ที่ 9 รวมไฟลไ์ ลบรารี่ HCMAX7219.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 10 รวมไฟลไ์ ลบราร่ี SPI.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 11 กาหนดจานวนขาพอร์ตของ Arduino ท่ีใชเ้ ชื่อมต่อขา CS ของโมดูล - บรรทดั ท่ี 12 ประกาศเร่ิมใชง้ านไลบรารี่ - บรรทดั ที่ 15 กาหนดความสวา่ งของตวั เลขบนโมดูล MAX7219 - บรรทดั ที่ 19 ลา้ งขอ้ มูลในบฟั เฟอร์ที่แสดงผลบนโมดูล MAX7219 - บรรทดั ท่ี 20 ใส่ขอ้ ความ\"ABCD\" ลงบฟั เฟอร์โดยใหเ้ ริ่มแสดงผลตาแหน่งท่ี 8 - บรรทดั ที่ 21 ใส่ตวั เลข 123 ท่ีเป็นตวั เลขที่มีทศนิยม 2 ตาแหน่งลงบฟั เฟอร์เร่ิมตาแหน่งท่ี 3 - บรรทดั ที่ 22 แสดงผลบนโมดูล MAX7219 จากขอ้ มูลที่อยใู่ นบฟั เฟอร์

ใบงานท่ี 4.22 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219  275 ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปล่ียนแปลงรูปแบบการแสดงผล การทดลองที่ 3 เขียนโปรแกรมแสดงค่าของตวั แปรท่ีกาหนดข้ึนบนโมดูล MAX7219 โดยให้ตวั แปรเร่ิม จาก 0-999 โดยใชไ้ ลบรารี่ HCMAX7219.h ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง แสดงค่าตวั แปรบนโมดลู จริง ตัวแปร<1000? เทจ็ เพ่มิ ค่าตวั แปร ล้างค่าตวั แปร แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 /* 2 PINOUT: 3 MODULE.............Arduino 4 VCC................+5V 5 GND................GND 6 DIN................D11(MOSI) 7 NC(no connection)..D12(MISO) 8 CLK................D13(CLK) 9 CS.................D10(SS) 10 */ 11 #include <HCMAX7219.h> 12 #include <SPI.h> 13 #define CS 10 // Set the CS pin 14 int value=0; 15 HCMAX7219 HCMAX7219(CS); 16 void setup() 17 { 18 HCMAX7219.Intensity(10, 0); //Sets the intensity of the LED 0 to 15 19 HCMAX7219.Clear(); // Clear the output buffer 20 } 21 void loop() 22 { 23 HCMAX7219.print7Seg(value,8); 24 HCMAX7219.Refresh(); 25 delay(250); 26 if(value<1000) 27 value++; 28 else 29 value=0; 30 }

276  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 9 รวมไฟลไ์ ลบราร่ี HCMAX7219.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 10 รวมไฟลไ์ ลบราร่ี SPI.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 11 กาหนดจานวนขาพอร์ตของ Arduino ที่ใชเ้ ชื่อมต่อขา CS ของโมดูล - บรรทดั ท่ี 12 ประกาศเร่ิมใชง้ านไลบรารี่ - บรรทดั ท่ี 14 ประกาศใชง้ านตวั แปรท่ีจะนาไปแสดงผล - บรรทดั ที่ 15 กาหนดความสวา่ งของตวั เลขบนโมดูล MAX7219 - บรรทดั ท่ี 19 ลา้ งขอ้ มูลในบฟั เฟอร์ที่แสดงผลบนโมดูล MAX7219 - บรรทดั ท่ี 23 ใส่คา่ ขอ้ มูลจากตวั แปรลงบฟั เฟอร์โดยใหเ้ ร่ิมแสดงผลตาแหน่งที่ 8 - บรรทดั ท่ี 24 แสดงผลบนโมดูล MAX7219 จากขอ้ มูลที่อยใู่ นบฟั เฟอร์ - บรรทดั ที่ 26-29 ตรวจสอบคา่ ตวั แปรใหม้ ีคา่ อยใู่ นระหวา่ ง 0-999 ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปล่ียนแปลงรูปแบบการแสดงผล 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมแสดงเวลาที่บอร์ดเร่ิมทางานโดยแสดงผลในหน่วยวนิ าที วงจรที่ใชท้ ดลอง เป็นดงั รูป VCC ARDUINO 5V VCC MAX7219 7-Segment 4-Digit D11(MOSI) D10(SS) VCC Din D13(SCK) Load Clk GND GND รูปท่ี 4.22-13 วงจรท่ีใชท้ ดลอง

ใบงานท่ี 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  277 ใบงานท่ี 4.23 การเขยี นโปรแกรมแสดงผลด้วย LED Dot matrix 1. จุดประสงค์ทวั่ ไป เพ่ือใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยจอ LED Dot matrix ได้ 2. บอกข้นั ตอนการต่อวงจรเพอ่ื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. บอร์ด Arduino Nano 3.0 1 ตวั 3. MAX7219 Dot Matrix Module 4 in one 2 ตวั 4. สายเช่ือมตอ่ USB (Mini USB) 1 เส้น 5. สายเชื่อมต่อวงจร 1 ชุด 6. คอมพวิ เตอร์ 1 เคร่ือง 4. ลาดบั ข้นั การปฏบิ ัตงิ าน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

278  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน แอลอีดีดอตเมตริก (LED Dot Matrix) เป็ นอุปกรณ์แสดงผลท่ีประกอบข้ึนจากการนาเอา LED หลายตวั มาต่อเรียงกันให้มีลกั ษณะการจดั วางเป็ นหลกั เป็ นแถวจึงได้ชื่อว่า “ดอตเมตริก” คาว่าดอต หมายถึงจุดซ่ึงหมายถึง LED ที่จดั วางมีลกั ษณะเป็นจุดกลม ดอตเมตริกในปัจจุบนั ที่นิยมใชง้ านโดยทวั่ ไป มี 2 ขนาดคือ 5×7 และ 8×8 มีท้งั ท่ีเป็ นสีเดียวและท่ีเป็ นแบบ RGB โครงสร้างภายในดอตเมตริกมีการ เชื่อมตอ่ ขารวมกนั เป็นขาทางดา้ นแนวนอนและขาแนวต้งั เพ่อื ใหจ้ านวนขาใชง้ านมานอ้ ยลง รูปท่ี 4.23-1 แอลอีดีดอตเมตริกขนาด 5×7 รูปท่ี 4.23-2 แอลอีดีดอตเมตริกขนาด 8×8 รูปที่ 4.23-3 แอลอีดีดอตเมตริกชนิด RGB ขนาด 8×8

ใบงานท่ี 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  279 วงจรขบั แอลอีดีดอตเมตริกมีด้วยกนั หลากหลายแบบข้ึนอยู่กบั ผูใ้ ช้งานท่ีจะเลือกใช้งานตาม ความตอ้ งการได้ สาหรับใบงานน้ีใชว้ งจรขบั ท่ีใชไ้ อซี MAX7219 เป็ นตวั ควบคุมการแสดงผลขบั เคลื่อน LED ให้แสดงผล ซ่ึงไอซีดงั กล่าวใช้การส่ือสารแบบ SPI ใช้สายสัญญาณในการสื่อสารเพียง 3 เส้น (DIN, CS, CLK) และสามารถต่อพว่ งโมดูลเพอื่ เพ่มิ พ้นื ท่ีในการแสดงผล รูปที่ 4.23-4 วงจรขบั แอลอีดีดอตเมตริกขนาด 8×8 ท่ีใชไ้ อซี MAX7219 รูปที่ 4.23-5 โมดูลแอลอีดีดอตเมตริกขนาด 8×8 ที่ใชไ้ อซี MAX7219 รูปท่ี 4.23-6 การตอ่ พว่ งโมดูลแอลอีดีดอตเมตริก

280  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ปัจจุบนั มีผูผ้ ลิตโมดูลแอลอีดีดอตเมตริกท่ีเป็ นขนาด 8×8 ท่ีมีวงจรขบั ภายในจานวน 4 ชุดซ่ึงมี ลกั ษณะเช่นเดียวกบั โมดูลเด่ียว 4 โมดูลตอ่ เรียงกนั ทาใหง้ ่ายต่อการใชง้ านโมดูลน้ีเรียกวา่ MAX7219 Dot Matrix Module 4 in one หากผใู้ ชง้ านตอ้ งการเพ่ิมจานวนโมดูลสามารถต่อเพิม่ ได้ รูปท่ี 4.23-6 โมดูลแอลอีดีดอตเมตริกชนิด 4 in 1 รูปที่ 4.23-6 ลายวงจรพิมพด์ า้ นล่างของโมดูลแอลอีดีดอตเมตริกชนิด 4 in 1 6. ฟังก์ชั่น Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นหน่วงเวลา หรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยุดคา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long)

ใบงานท่ี 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  281 ฟังก์ชั่นใช้งานของไลบราร่ี การใช้งานแสดงผลท่ีดอตเมตริก 4 in 1 ที่ใช้ไอซี MAX7219 มีไลบราร่ีช่วยงานมากมายให้ ผูใ้ ชง้ านเลือกใช้ไดต้ ามความตอ้ งการ ใบงานน้ีนาเสนอการใชง้ านไลบรารี่ของ Marco Colli มีไลบราร่ี ช่วยงาน 2 ตวั ดว้ ยกนั สามารถดาวนโ์ หลดไดท้ ่ี ไลบราร่ี แหล่งดาวน์โหลด MD_Parola.h https://github.com/MajicDesigns/MD_Parola MD_MAX72XX.h https://github.com/MajicDesigns/MD_MAX72XX มีข้นั ตอนการดาเนินการเพ่ือนาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวนโ์ หลดไลบราร่ี MD_Parola.h ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.23-7 การดาวน์โหลดไลบรารี่ที่นามาใชง้ าน 2. ดาวน์โหลดไลบรารี่ MD_MAX72XX.h ซ่ึงเป็ นไฟล์ Zip ดงั รูป รูปท่ี 4.23-8 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ าน 3. ทาการเพิ่มไลบราร่ีลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แลว้ ทาการหาไฟล์ zip ท่ีไดจ้ ากการดาวน์โหลดในขอ้ 1 รูปที่ 4.23-9 การเพม่ิ ไลบราร่ีที่เป็นไฟล์ zip ลงในโปรแกรม Arduino IDE

282  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ไลบรารี่ท้งั 2 ตวั มีไฟล์ตวั อย่างให้ผูใ้ ช้งานได้ศึกษาการใช้งานไลบราร่ีหลายไฟล์ท้งั ท่ีเป็ น ตวั อย่างของไลบราร่ี MD_Parola และ MD_MAX72XX สาหรับใบงานน้ีเป็ นการแนะนาการใช้งาน เบ้ืองตน้ เทา่ น้นั ฟังกช์ น่ั ใชง้ านดงั น้ี 1. ฟังก์ช่ันกาหนดขาเช่ือมต่อที่ใช้ Hardware SPI และจานวนโมดูล ใช้ในการระบุขาที่ใช้ เช่ือมตอ่ ใหต้ วั โปรแกรมรับรู้ โดยใช้ Hardware SPI ซ่ึงขา CLK กบั ขา Data เป็นขาที่มีหนา้ ท่ี เฉพาะตามโครงสร้างของไมโครคอนโทรลเลอร์ รูปแบบเป็นดงั น้ี MD_Parola(CS_PIN, MAX_DEVICES); CS_PIN: หมายเลขขาท่ีใชเ้ ป็นขา CS MAX_DEVICES: ตวั เลขจานวนโมดูลท่ีใชง้ าน ในกรณีท่ีใช้งานโมดูล 4 in 1 จานวน 1 โมดูลจะใชค้ า่ MAX_DEVICES เป็นเลข 4 2. ฟังก์ช่ันกาหนดขาเช่ือมต่อที่ใช้ Software SPI และจานวนโมดูล ใช้ในการระบุขาที่ใช้ เช่ือมต่อใหต้ วั โปรแกรมรับรู้ โดยใช้ Software SPI ซ่ึงขาสัญญาณทุกขาสามารถเลือกใชเ้ อง ไดต้ ามความตอ้ งการ รูปแบบเป็นดงั น้ี MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); DATA_PIN: หมายเลขขาท่ีใชเ้ ป็นขา Data CLK_PI: หมายเลขขาที่ใชเ้ ป็นขา CLK CS_PIN: หมายเลขขาท่ีใชเ้ ป็นขา CS MAX_DEVICES: ตวั เลขจานวนโมดูลที่ใช้งาน ในกรณีที่ใชง้ านโมดูล 4 in 1 จานวน 1 โมดูลจะใชค้ ่า MAX_DEVICES เป็นเลข 4 3. ฟังก์ชั่นเริ่มใช้งานไลบรารี่ รูปแบบเป็นดงั น้ี .begin(); 4. ฟังก์ชั่นแสดงผลทนั ทที นั ใด ใชแ้ สดงขอ้ ความ ตวั เลข หรือค่าในตวั แปร รูปแบบเป็นดงั น้ี .print([data],[format]); data: คือขอ้ มูลที่ตอ้ งการแสดงผลซ่ึงอาจเป็ นขอ้ ความ ตวั เลข หรือคา่ ในตวั แปร โดยถา้ เป็นขอ้ ความจะตอ้ งใส่ “-” คร่อมขอ้ ความน้นั ๆ format: รูปแบบการแสดงผลของคา่ ตวั เลข (เลขฐาน) ไดแ้ ก่ BIN, DEC, OCT, HEX

ใบงานท่ี 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  283 5. ฟังก์ช่ันกาหนดค่าความสว่าง ใชก้ าหนดค่าความสวา่ งได้ 16 ระดบั คือ 0-15 ต้งั แต่สวา่ งนอ้ ย สุดไปจนถึงสวา่ งมากสุด (ฟังกช์ นั่ น้ีตอ้ งใชห้ ลงั จาก begin) รูปแบบเป็นดงั น้ี .setIntensity(); 6. ฟังก์ชั่นกาหนดข้อความแสดงผลทใี่ ส่รูปแบบได้ รูปแบบเป็นดงั น้ี .displayText(message, align, speed, pause, effectIn, effectOut); message: ข้อความโดยสามารถใส่โดยตรงใช้ “-” คร่อมข้อความน้ัน ๆ หรือเป็ น ขอ้ ความท่ีถูกเกบ็ ไวใ้ นตวั แปรอาเรยท์ ี่เป็นชนิด char กไ็ ด้ align: กาหนดการจดั วางขอ้ ความ PA_LEFT, PA_CENTER, PA_RIGHT speed: กาหนดความเร็วในการแสดงขอ้ ความ pause: กาหนดเวลาในการหยดุ คา้ งเพ่ือแสดงผล effectIn: กาหนดรูปแบบการแสดงขอ้ ความเมื่อขอ้ ความเริ่มเขา้ มา effectOut: กาหนดรูปแบบการแสดงขอ้ ความเมื่อขอ้ ความออกไป รูปแบบการแสดงขอ้ ความ PA_NO_EFFECT PA_BLINDS PA_CLOSING PA_PRINT PA_RANDOM PA_CLOSING_CURSOR, PA_SCROLL_UP PA_WIPE PA_SCROLL_UP_LEFT PA_SCROLL_DOWN PA_WIPE_CURSOR PA_SCROLL_UP_RIGHT PA_SCROLL_LEFT PA_SCAN_HORIZ PA_SCROLL_DOWN_LEFT PA_SCROLL_RIGHT PA_SCAN_HORIZX PA_SCROLL_DOWN_RIGHT PA_SLICE PA_SCAN_VERT PA_GROW_UP PA_MESH PA_SCAN_VERTX PA_GROW_DOWN PA_FADE PA_OPENING PA_DISSOLVE PA_OPENING_CURSOR 7. ฟังก์ชั่นการแสดงผล เป็นฟังกช์ นั่ เพือ่ แสดงผลจากฟังกช์ น่ั กาหนดขอ้ ความ (6) รูปแบบเป็นดงั น้ี .displayAnimate(); 8. ฟังก์ชั่นเร่ิมต้นการแสดงผลใหม่อกี คร้ัง รูปแบบเป็นดงั น้ี . displayReset(); ยงั มีฟังก์ชน่ั ให้ใช้งานอีกมาก ใบงานน้ีแนะนาเพียงเบ้ืองตน้ เท่าน้นั โดยสามารถศึกษาได้จาก ตวั อยา่ งที่มากบั ไลบรารี่ท้งั 2

284  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การใช้งานไลบรารี่ ใบงานน้ีใชก้ ารแสดงผลดอตเมตริกท่ีเป็ นโมดูล 4 in 1 เพ่ือให้การแสดงผลที่ถูกตอ้ งให้ผใู้ ช้งาน กาหนดชนิดฮาร์ดแวร์เป็น FC16_HW ดงั รูป รูปที่ 4.23-10 การกาหนดค่าในไลบราร่ีเพื่อใหก้ ารแสดงผลถูกตอ้ ง 7. วงจรทใ่ี ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 7,20 ATMEGA328 10k VCC SW1 1 RST AVCC VCC C1 VCC MAX7219 7-Segment 4-Digit 0.1uF GND D11(MOSI) 17 Din D10(SS) 16 CS 19 Clk D13(SCK) USB to UART (TTL Level) R2,R3 3 1k 2 DTR RXD D1(TXD) TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.23-11 วงจรท่ีใชไ้ อซี AVR ในการทดลอง

ใบงานที่ 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  285 กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป VCC ARDUINO 5V VCC MAX7219 7-Segment 4-Digit D11(MOSI) VCC D10(SS) GND Din D13(SCK) CS Clk GND รูปที่ 4.23-12 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 D11 D10 D9 D8 5 D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 AB C DE AB C DE 1 D13 3V3 REF A0 5 A1 A2 A3 A4 A5 10 A6 A7 5V RST GND 15 VIN รูปที่ 4.23-13 การตอ่ ลงบอร์ดทดลอง การต่อวงจรเพอื่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.23-14 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน

286  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมแสดงขอ้ ความและตวั เลขที่เป็ นเลขฐานต่าง ๆ ดว้ ยฟังก์ชนั่ แสดงผลแบบ ทนั ทีทนั ใด ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <MD_Parola.h> 2 #include <MD_MAX72xx.h> 3 #include <SPI.h> 4 const uint16_t WAIT_TIME = 1000; 5 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW 6 #define MAX_DEVICES 4 7 #define CLK_PIN 13 8 #define DATA_PIN 11 9 #define CS_PIN 10 10 MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); 11 void setup(void) 12 { 13 P.begin(); 14 } 15 void loop(void) 16 { 17 P.print(\"Hello\"); 18 delay(WAIT_TIME); 19 P.print(1234,DEC); 20 delay(WAIT_TIME); 21 P.print(1234,HEX); 22 delay(WAIT_TIME); 23 P.print(1234,BIN); 24 delay(WAIT_TIME); 25 P.write('A'); 26 delay(WAIT_TIME); 27 P.write('B'); 28 delay(WAIT_TIME); 29 P.write('C'); 30 delay(WAIT_TIME); 31 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-3 รวมไฟลไ์ ลบราร่ีท่ีตอ้ งใชง้ านเขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 5 กาหนดจานวนแอลอีดีเมตริก การทดลองน้ีใช้ 4 เนื่องจากใชโ้ มดูล 4 in 1 - บรรทดั ที่ 6-8 กาหนดจานวนขาพอร์ตที่ใชเ้ ชื่อมตอ่ - บรรทดั ท่ี 9 ประกาศเร่ิมใชง้ านไลบราร่ีโดยใชช้ ื่อแทนวา่ P - บรรทดั ที่ 12 สัง่ ใหไ้ ลบราร่ีเริ่มทางาน

ใบงานที่ 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  287 - บรรทดั ท่ี 16-29 แสดงขอ้ ความตามตอ้ งการ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนรูปแบบการแสดงผล การทดลองที่ 2 เขียนโปรแกรมแสดงขอ้ ความท่ีเก็บไวใ้ นตวั แปร โดยใชฟ้ ังกช์ น่ั แสดงผลที่ใส่รูปแบบได้ ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <MD_Parola.h> 2 #include <MD_MAX72xx.h> 3 #include <SPI.h> 4 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW 5 #define MAX_DEVICES 4 6 #define CLK_PIN 13 7 #define DATA_PIN 11 8 #define CS_PIN 10 9 #define BUF_SIZE 10 10 #define PAUSE 0 11 #define SPEED 100 12 char Msg[BUF_SIZE] = { \"\" }; 13 char newMsg[BUF_SIZE] = { \"Hello\" }; 14 MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); 15 void setup(void) 16 { 17 strcpy(Msg, newMsg); 18 P.begin(); 19 P.setIntensity(5); //intensity to set the display (0-15) 20 P.displayText(Msg,PA_CENTER,SPEED,PAUSE,PA_SCROLL_UP,PA_SCROLL_UP); 21 } 22 void loop(void) 23 { 24 if (P.displayAnimate()) // if end of animation then restart animate again 25 { 26 P.displayReset(); 27 } 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-3 รวมไฟลไ์ ลบราร่ีที่ตอ้ งใชง้ านเขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 4 กาหนดจานวนแอลอีดีเมตริก การทดลองน้ีใช้ 4 เนื่องจากใชโ้ มดูล 4 in 1 - บรรทดั ที่ 5-7 กาหนดจานวนขาพอร์ตที่ใชเ้ ชื่อมต่อ

288  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ท่ี 13 ประกาศเร่ิมใชง้ านไลบรารี่โดยใชช้ ื่อแทนวา่ P - บรรทดั ที่ 17 ส่ังใหไ้ ลบราร่ีเริ่มทางาน - บรรทดั ที่ 18 กาหนดระดบั ความสวา่ งใหก้ บั แอลอีดีดอตเมตริก - บรรทดั ท่ี 19 กาหนดรูปแบบการแสดงขอ้ ความ - บรรทดั ท่ี 23 ส่งั ใหเ้ ร่ิมแสดงผลพร้อมตรวจสอบการสิ้นสุดของการแสดง - บรรทดั ท่ี 25 สงั่ ใหเ้ ร่ิมแสดงผลใหม่ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนรูปแบบการแสดงผล วธิ ีการแสดงตวั เลขทส่ี ามารถใส่รูปแบบการแสดงผลได้ การแสดงผลที่สามารถใส่รูปแบบไดโ้ ดยใชฟ้ ังก์ชนั่ .displayText ตามตวั อยา่ งท่ีกล่าวมาขา้ งตน้ สามารถใชไ้ ดเ้ ฉพาะการแสดงผลที่เป็ นขอ้ ความเท่าน้นั หากตอ้ งการแสดงผลที่เป็ นตวั เลขจะตอ้ งใชว้ ิธี แปลงตวั เลขใหอ้ ยใู่ นรูปแบบของขอ้ ความ ตวั อยา่ งเช่น ตอ้ งการแสดงตวั เลข 12.34 บนจอจะใชค้ าสง่ั ดงั น้ี dtostrf(123.45, 0, 1, Msg); 123.45 : ตวั เลขที่ตอ้ งการแสดงผล ซ่ึงเป็นการป้อนโดยตรงหรืออยใู่ นตวั แปร 1 : จานวนหลกั ทศนิยมที่ตอ้ งการ Msg : ตวั แปรอาร์เรยช์ นิด char ที่ใชส้ าหรับนาไปแสดงผลในฟังกช์ น่ั .displayText ตวั อย่างโปรแกรม 1 #include <MD_Parola.h> 2 #include <MD_MAX72xx.h> 3 #include <SPI.h> 4 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW 5 #define MAX_DEVICES 4 6 #define CLK_PIN 13 7 #define DATA_PIN 11 8 #define CS_PIN 10 9 #define PAUSE 0 10 #define SPEED 100 11 #define BUF_SIZE 10 12 char Msg[BUF_SIZE] = { \"\" }; 13 char newMsg[BUF_SIZE] = { \"Hello\" }; 14 uint8_t scrollSpeed = 100; 15 MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); 16 void setup(void) 17 { 18 strcpy(Msg, newMsg); 19 P.begin(); 20 P.setIntensity(5); //intensity to set the display (0-15 21 P.displayText(Msg, PA_CENTER, SPEED, PAUSE, PA_SCROLL_UP, PA_SCROLL_UP); 22 } 23 void loop(void) 24 { 25 if (P.displayAnimate()) // if end of animation then restart animate again

ใบงานที่ 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  289 26 { //convert number 12.34 to Msg[] 27 dtostrf(123.45, 0, 1, Msg); 28 P.displayReset(); 29 } 30 } การทดลองท่ี 3 เขียนโปรแกรมแสดงขอ้ ความโดยให้สามารถปรับความเร็วในการแสดงผลไดด้ ว้ ยการ ปรับโพเทนธิโอมิเตอร์ท่ีต่อเขา้ กบั ขาพอร์ตแอนะลอก A5 ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <MD_Parola.h> 2 #include <MD_MAX72xx.h> 3 #include <SPI.h> 4 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW 5 #define MAX_DEVICES 4 6 #define CLK_PIN 13 7 #define DATA_PIN 11 8 #define CS_PIN 10 9 MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); 10 const uint8_t SPEED_DEADBAND = 5; 11 uint8_t Speed = 25; // default frame delay value 12 textEffect_t Effect = PA_SCROLL_LEFT; 13 textPosition_t Align = PA_LEFT; 14 uint16_t Pause = 0; // in milliseconds 15 #define BUF_SIZE 75 16 char Msg[BUF_SIZE] = { \"\" }; 17 char newMsg[BUF_SIZE] = { \"Hello! KruPraphas Suwanphet\" }; 18 bool newMsgAvailable = true; 19 void setup() 20 { 21 P.begin(); 22 P.setIntensity(5); //intensity to set the display (0-15) 23 P.displayText(Msg, Align, Speed, Pause, Effect, Effect); 24 } 25 void loop() 26 { 27 if (P.displayAnimate()) // if end of message then restart display 28 { 29 if (newMsg){ 30 strcpy(Msg, newMsg); 31 newMsgAvailable = false; 32 } 33 P.displayReset(); 34 } 35 setSpeed(); 36 } 37 void setSpeed() 38 { 39 int16_t newSpeed = map(analogRead(A5), 0, 1023, 10, 150); 40 if ((newSpeed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) || 41 (newSpeed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND))) 42 {

290  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 43 P.setSpeed(newSpeed); 44 Speed = newSpeed; 45 } 46 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-3 รวมไฟลไ์ ลบรารี่ที่ตอ้ งใชง้ านเขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 4 กาหนดจานวนแอลอีดีเมตริก การทดลองน้ีใช้ 4 เน่ืองจากใชโ้ มดูล 4 in 1 - บรรทดั ท่ี 5-7 กาหนดจานวนขาพอร์ตที่ใชเ้ ช่ือมต่อ - บรรทดั ท่ี 8 ประกาศเร่ิมใชง้ านไลบราร่ีโดยใชช้ ่ือแทนวา่ P - บรรทดั ท่ี 20 สง่ั ใหไ้ ลบรารี่เริ่มทางาน - บรรทดั ที่ 21 กาหนดระดบั ความสวา่ งใหก้ บั แอลอีดีดอตเมตริก - บรรทดั ท่ี 22 กาหนดรูปแบบการแสดงขอ้ ความ - บรรทดั ที่ 26 สงั่ ใหเ้ ริ่มแสดงผลพร้อมตรวจสอบการสิ้นสุดของการแสดง - บรรทดั ท่ี 32 สง่ั ใหเ้ ริ่มแสดงผลใหม่ - บรรทดั ที่ 36-45 ฟังกช์ น่ั รองท่ีใชป้ รับความเร็วในการแสดงผล ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนรูปแบบการแสดงผล การทดลองที่ 4 เขียนโปรแกรมแสดงขอ้ ความหลายขอ้ ความที่เก็บไวใ้ นตวั แปร โดยให้ขอ้ ความแต่ละ ขอ้ ความมีรูปแบบการแสดงผลท่ีแตกต่างกนั ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <MD_Parola.h> 2 #include <MD_MAX72xx.h> 3 #include <SPI.h> 4 #define HARDWARE_TYPE MD_MAX72XX::FC16_HW 5 #define MAX_DEVICES 4 6 #define PAUSE 1000 7 #define SPEED 50

ใบงานท่ี 4.23 การเขียนโปรแกรมแสดงผลดว้ ย LED Dot matrix  291 8 #define CLK_PIN 13 9 #define DATA_PIN 11 10 #define CS_PIN 10 11 MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); 12 char *msg[] = 13 { 14 \"Hello!\", 15 \"world\", 16 \"KruPraphas Suwanphet\", 17 }; 18 void setup(void) 19 { 20 P.begin(); // initialise the LED display 21 P.setIntensity(5); //intensity to set the display (0-15) 22 } 23 void loop(void) 24 { 25 static uint8_t cycle = 0; 26 if (P.displayAnimate()) 26 { 28 if(cycle==0) 29 P.displayText(msg[0],PA_CENTER,SPEED+10,PAUSE,PA_PRINT,PA_SCROLL_UP); 30 if(cycle==1) 31 P.displayText(msg[1],PA_CENTER,SPEED+50,PAUSE,PA_SCROLL_DOWN,PA_SCROLL_DOWN); 32 if(cycle==2) 33 P.displayText(msg[2],PA_LEFT,SPEED,0,PA_SCROLL_LEFT,PA_SCROLL_LEFT); 34 cycle = (cycle + 1) % ARRAY_SIZE(msg); // prepare for next pass 35 } 36 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-3 รวมไฟลไ์ ลบรารี่ท่ีตอ้ งใชง้ านเขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 4 กาหนดจานวนแอลอีดีเมตริก การทดลองน้ีใช้ 4 เนื่องจากใชโ้ มดูล 4 in 1 - บรรทดั ท่ี 7-9 กาหนดจานวนขาพอร์ตที่ใชเ้ ช่ือมต่อ - บรรทดั ท่ี 10 ประกาศเร่ิมใชง้ านไลบรารี่โดยใชช้ ื่อแทนวา่ P - บรรทดั ที่ 19 สัง่ ใหไ้ ลบราร่ีเร่ิมทางาน - บรรทดั ที่ 20 กาหนดระดบั ความสวา่ งใหก้ บั แอลอีดีดอตเมตริก - บรรทดั ท่ี 20 สง่ั ใหเ้ ร่ิมแสดงผลพร้อมตรวจสอบการสิ้นสุดของการแสดง - บรรทัดท่ี 26-34 ตรวจสอบวงรอบการสิ้นสุดการแสดงผลพร้อมกาหนดรูปแบบแสดงผลใน ขอ้ ความท่ีตอ้ งการ โดยขอ้ ความจะเร่ิมแสดงผลจากขอ้ ความท่ี 1 เป็นตน้ ไปจนถึงขอ้ ความสุดทา้ ย แลว้ วนกลบั มาแสดงขอ้ ความที่ 1 วนไปตอ่ เน่ือง ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปล่ียนรูปแบบการแสดงผล

292  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 9. สรุปผลการปฏบิ ตั งิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมแสดงผลขอ้ ความหลายขอ้ ความและแตล่ ะขอ้ ความใหม้ ีรูปแบบการแสดงผล ท่ีแตกต่างกนั โดยใชว้ งจรท่ีใชท้ ดลองเป็นดงั รูป *การกาหนดอุปกรณ์ตอ้ งใช้ #define MAX_DEVICES 8 VCC ARDUINO 5V VCC VCC MAX7219 7-Segment 4-Digit MAX7219 7-Segment 4-Digit VCC VCC D11(MOSI) GND GND D10(SS) Din Din CS CS D13(SCK) Clk Clk GND รูปท่ี 4.23-15 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

ใบงานท่ี 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64  293 ใบงานท่ี 4.24 การเขยี นโปรแกรมแสดงผลด้วยจอ OLED 128×64 1. จุดประสงค์ทวั่ ไป เพ่ือใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพอ่ื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. บอร์ด Arduino Nano 3.0 1 ตวั 3. OLED ขนาด 128×64 แบบ I2C ที่ใชไ้ ดร์เวอร์เบอร์ SSD1306 1 ตวั 4. สายเชื่อมตอ่ USB (Mini USB) 1 เส้น 5. สายเชื่อมตอ่ วงจร 1 ชุด 6. คอมพิวเตอร์ 1 เครื่อง 4. ลาดับข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

294  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน OLED (Organic Light-Emitting Diode) เป็ นจอแสดงผลกราฟิ กประเภทหน่ึงท่ีสร้างจากวสั ดุ \"สารก่ึงตวั นาอินทรีย\"์ (Organic Semiconductor) ที่สามารถเปล่งแสงเองได้เมื่อได้รับพลงั งานไฟฟ้า เรียกวา่ กระบวนการอิเล็คโทรลูมิเนเซนส์ (Electroluminescence) โดยท่ีไม่ตอ้ งพ่ึงพาแสงสวา่ งท่ีส่องมา จากดา้ นหลงั (Backlight) และจะไม่มีการเปล่งแสงแสดงในบริเวณท่ีเป็ นภาพสีดาส่งผลให้สีดาน้ันดา สนิทและยงั ช่วยประหยดั พลงั งาน โมดูลแสดงผล OLED ขนาด 128×64 มีหลายแบบใหผ้ ใู้ ชง้ านสามารถ เลือกใชต้ ามความเหมาะสมของแตล่ ะงานไดด้ งั รูปท่ี 4.24-1 รูปที่ 4.24-1 โมดูลจอ OLED ที่นิยมนามาใชง้ านกบั ไมโครคอนโทรลเลอร์ โมดูลจอแสดงผลกราฟิ กแบบ OLED 128×64 ท้งั ท่ีใชก้ ารเช่ือมต่อแบบ I2C และแบบ SPI มีชิพ ไดร์เวอร์อยดู่ ว้ ยกนั 2 เบอร์ท่ีมีการใชง้ านอยา่ งแพร่หลายคือ SSD1306 และ SH1106 ดงั น้นั การเตรียมการ จดั หาอุปกรณ์เพ่ือนามาใชง้ านตอ้ งรู้วา่ โมดูลจอ OLED ใชช้ ิพไดร์เวอร์ตวั ใดเนื่องจากจะตอ้ งใชไ้ ลบรารี่ ใหต้ รงกบั ชิพไดร์เวอร์ของโมดูลจอ ใบงานน้ีเป็นการทดลองใชง้ านโมดูลจอแสดงผลกราฟิ กแบบ OLED ขนาด 128×64 พกิ เซลเป็ น จอแสดงผลแบบให้แสงเพียงสีเดียว (Monochrome) ที่ใชก้ ารเช่ือมต่อส่ือสารแบบ I2C และใชช้ ิพควบคุม เบอร์ SSD1306 การเขียนโคด้ โปรแกรมเพ่ือใชง้ านการแสดงผลจอ OLED จาเป็นตอ้ งใชไ้ ลบรารี่ช่วยงาน พร้อม ๆ กนั สองตวั ซ่ึงท้งั หมดตอ้ งดาวน์โหลดเพิ่มเติมเนื่องจากโปรแกรม Arduino IDE ไม่ไดม้ ีการ ติดต้งั มาใหต้ ้งั แต่เริ่มตน้ จึงจาเป็ นตอ้ งมีการติดต้งั เพม่ิ เติ่มเขา้ ไปในโปรแกรม ไลบราร่ีท้งั สองตวั คือ ไลบรารี่ แหล่งดาวน์โหลด Adafruit_GFX.h https://github.com/adafruit/Adafruit-GFX-Library Adafruit_SSD1306.h https://github.com/adafruit/Adafruit_SSD1306 สาหรับ OLED ที่ใชช้ ิพควบคุม SH1106.h จะตอ้ งเปล่ียนไลบราร่ีมาใช้ Adafruit_SH1106.h แทน Adafruit_SH1106.h https://github.com/wonho-maker/Adafruit_SH1106

ใบงานท่ี 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64  295 การตดิ ต้ังไลบรารี่ มีข้นั ตอนการดาเนินการเพื่อนาไลบราร่ีมาใชง้ านดงั น้ี 1. ดาวนโ์ หลดไลบราร่ี Adafruit_GFX.h ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.24-2 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ าน 2. ดาวน์โหลดไลบรารี่ Adafruit_SSD1306.h ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปที่ 4.24-3 การดาวน์โหลดไลบรารี่ท่ีนามาใชง้ าน 3. ทาการเพิม่ ไลบราร่ีท้งั สองตวั ลงในโปรแกรม Arduino IDE โดยการเพ่ิมจากไฟล์ zip แลว้ ทาการ หาไฟล์ zip ที่ไดจ้ ากการดาวนโ์ หลดในขอ้ 1 และ 2 รูปท่ี 4.24-4 การเพิม่ ไลบรารี่ลงในโปรแกรม Arduino IDE เน่ืองจากค่าเร่ิมตน้ ของไลบรารี่กาหนดขนาด OLED เป็ น 128×32 ดงั น้นั เมื่อใชง้ านกบั OLED ขนาด 128×64 จะทาให้ตวั อกั ษรยืดในแนวต้งั ซ่ึงจะตอ้ งแกไ้ ขไฟลไ์ ลบาร่ี Adafruit_SSD1306.h โดยเขา้ ไปยงั โฟลเดอร์ที่เกบ็ ไลบราร่ี แลว้ ทาการแกไ้ ขค่าในไฟลด์ งั กล่าว ซ่ึงมีข้นั ตอนดงั น้ี

296  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 1. เขา้ โฟลเดอร์ Documents ของเครื่องแลว้ เขา้ โฟลเดอร์ Arduino (คลิก 1, 2, 3) รูปท่ี 4.24-5 วธิ ีเขา้ โฟลเดอร์ Arduino 2. เขา้ ไปในโฟลเดอร์ libraries ซ่ึงอยภู่ ายในโฟลเดอร์ Arduino รูปท่ี 4.24-6 วธิ ีเขา้ โฟลเดอร์ libraries 3. เขา้ ไปในโฟลเดอร์ Adafruit_SSD1306 ซ่ึงอยภู่ ายในโฟลเดอร์ libraries รูปท่ี 4.24-7 วธิ ีเขา้ โฟลเดอร์ Adafruit_SSD1306 4. เขา้ ไปแกไ้ ขไฟล์ Adafruit_SSD1306.h โดยใชโ้ ปรแกรมท่ีใชเ้ ปิ ดไฟล์เอกสารไดเ้ ช่น WordPad รูปท่ี 4.24-8 ไฟล์ Adafruit_SSD1306.h


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook