ใบงานที่ 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 297 5. คน้ หาค่าเดิมท่ีต้งั คา่ ไวด้ งั รูป รูปท่ี 4.24-9 คา่ เดิมของไลบรารี่ Adafruit_SSD1306.h 6. ทาการแกไ้ ขใหเ้ ป็นการกาหนดคา่ ใชง้ าน OLED ขนาด 128x64 รูปที่ 4.24-10 การแกค้ ่าใหม่ ฟังก์ช่ันทม่ี ใี ห้ใช้งานของไลบราร่ี ฟังกช์ นั่ ใชง้ าน OLED จากไลบรารี่ที่ติดต้งั มีใหใ้ ชง้ านมากพอสมควรดงั ตารางที่ 4.24-1 ตารางที่ 4.24-1 รายการฟังกช์ น่ั ท่ีมีใหใ้ ชง้ าน ฟังกช์ นั่ ใชง้ าน OLED ฟังกช์ น่ั ใชง้ าน OLED .begin(SSD1306_SWITCHCAPVCC,addr); .fillRect(x0,y0,w,h,color); .clearDisplay(); .fillRoundRect(x0,y0,w,h,radius,color); .dim(dim) .fillScreen(color); .display(); .fillTriangle(x0,y0,x1,y1,x2,y2,color); .drawBitmap( x,y,*bitmap,w,h,color) .invertDisplay(i) .drawChar(x,y,c,color,background,size); .print(); .drawCircle(x0,y0,radius,color); .println(); .drawFastHLine(x0,y0,length,color); .setCursor(x0,y0); .drawFastHLineInternal(x0,y0,w,color) .setRotation(rotation); .drawFastVLine(x0,y0,length,color); .setTextColor(color); .drawFastVLineInternal(x,y,h,color) .setTextColor(color,background) .drawLine(x0,y0,x1,y1,color); .setTextSize(sizes); .drawPixel(x, y,color); .startscrolldiagleft(start,stop) .drawRect(x0,y0, w,h,color); .startscrolldiagright(start,stop) .drawRoundRect(x0,y0,w,h,radius,color); .startscrollleft(start,stop) .drawTriangle(x0,y0,x1,y1,x2,y2,color); .startscrollright(start,stop) .fillCircle(x0,y0,radius,color); .stopscroll() // Dim the display, dim = true: display is dimmed, dim = false: display is normal //i=1,0 //The rotation screen parameter can be 0, 1, 2 or 3. // printable sizes from 1 to 8; typical use is 1, 2 or 3
298 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การกาหนดพิกดั ตาแหน่งของฟังกช์ นั่ เขียนภาพในแตล่ ะฟังกช์ นั่ จะมีการกาหนดคา่ พกิ ดั ตา่ ง ๆ ในแตล่ ะฟังกช์ น่ั ตวั อยา่ งเช่น 1. ฟังกช์ น่ั พลอ๊ ตจุด .drawPixel(x, y,color); รูปท่ี 4.24-11 การกาหนดพกิ ดั ของฟังกช์ น่ั พลอ๊ ตจุด 2. ฟังกช์ น่ั ลากเส้น เช่น .drawLine(x0,y0,x1,y1,color); รูปที่ 4.24-12 การกาหนดพกิ ดั ของฟังกช์ นั่ ลากเส้น 3. ฟังกช์ นั่ วาดรูปสี่เหลี่ยม เช่น .drawRect(x0,y0, w,h,color); รูปท่ี 4.24-13 การกาหนดพิกดั ของฟังกช์ น่ั วาดรูปสี่เหล่ียม
ใบงานที่ 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 299 4. ฟังกช์ นั่ วาดรูปวงกลม เช่น .drawCircle(x0,y0,radius,color); รูปท่ี 4.24-14 การกาหนดพกิ ดั ของฟังกช์ นั่ วาดรูปวงกลม 5. ฟังกช์ น่ั วาดรูปสี่เหล่ียมหวั มน เช่น .drawRoundRect(x0,y0,w,h,radius,color); รูปที่ 4.24-15 การกาหนดพิกดั ของฟังกช์ นั่ วาดรูปส่ีเหล่ียมหวั มน 6. ฟังกช์ น่ั วาดรูปสามเหล่ียม เช่น .drawTriangle(x0,y0,x1,y1,x2,y2,color); รูปท่ี 4.24-16 การกาหนดพกิ ดั ของฟังกช์ นั่ วาดรูปสามเหลี่ยม
300 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ฟอนต์ทม่ี ใี ห้ใช้งานของไลบรารี่ การแสดงผลที่เป็ นขอ้ ความผูใ้ ช้งานสามารถเปล่ียนฟอนต์ได้ โดยไฟล์ฟอนตจ์ ะอยู่ในไลบรารี่ Adafruit_GFX ภายในโฟลเดอร์ \\libraries\\Adafruit_GFX_Library\\Fonts มีรายการฟอนตใ์ ห้เลือกใช้ได้ ดงั ตารางท่ี 4.24-2 ตารางที่ 4.24-2 รายการฟอนตท์ ี่มีใหเ้ ลือกใชง้ าน Font Font FreeMono12pt7b.h FreeSansBoldOblique12pt7b.h FreeMono18pt7b.h FreeSansBoldOblique18pt7b.h FreeMono24pt7b.h FreeSansBoldOblique24pt7b.h FreeMono9pt7b.h FreeSansBoldOblique9pt7b.h FreeMonoBold12pt7b.h FreeSansOblique12pt7b.h FreeMonoBold18pt7b.h FreeSansOblique18pt7b.h FreeMonoBold24pt7b.h FreeSansOblique24pt7b.h FreeMonoBold9pt7b.h FreeSansOblique9pt7b.h FreeMonoBoldOblique12pt7b.h FreeSerif12pt7b.h FreeMonoBoldOblique18pt7b.h FreeSerif18pt7b.h FreeMonoBoldOblique24pt7b.h FreeSerif24pt7b.h FreeMonoBoldOblique9pt7b.h FreeSerif9pt7b.h FreeMonoOblique12pt7b.h FreeSerifBold12pt7b.h FreeMonoOblique18pt7b.h FreeSerifBold18pt7b.h FreeMonoOblique24pt7b.h FreeSerifBold24pt7b.h FreeMonoOblique9pt7b.h FreeSerifBold9pt7b.h FreeSans12pt7b.h FreeSerifBoldItalic12pt7b.h FreeSans18pt7b.h FreeSerifBoldItalic18pt7b.h FreeSans24pt7b.h FreeSerifBoldItalic24pt7b.h FreeSans9pt7b.h FreeSerifBoldItalic9pt7b.h FreeSansBold12pt7b.h FreeSerifItalic12pt7b.h FreeSansBold18pt7b.h FreeSerifItalic18pt7b.h FreeSansBold24pt7b.h FreeSerifItalic24pt7b.h FreeSansBold9pt7b.h FreeSerifItalic9pt7b.h ผูใ้ ช้งานสามารถเรียกใช้ได้โดยการ include ไฟล์ฟอนต์ดงั กล่าวเขา้ ในโปรแกรมแล้วทาการ เรียกใช้ เพยี งแต่ตาแหน่งของตวั อกั ษรที่ใชก้ าหนดตาแหน่งจะแตกต่างกนั กบั ที่ไม่ไดม้ ีการใชฟ้ อนตด์ งั รูป รูปที่ 4.24-17 การกาหนดพิกดั เมื่อใชฟ้ อนตป์ กติกบั ฟอนตใ์ หม่
ใบงานท่ี 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 301 6. ฟังก์ชั่น Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยุดคา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) ฟังก์ช่ันใช้งานของไลบรารี่ (เฉพาะในใบงาน) การใช้งานแสดงผลดว้ ยโมดูลจอ OLED ที่ใช้ไลบรารี่ของ Adafruit มีฟังก์ชนั่ ให้ใช้งานจานวน มากดงั ไดก้ ล่าวมาแลว้ ขา้ งตน้ สาหรับรายละเอียดการใชง้ านของแต่ละฟังกช์ นั่ จะกล่าวเฉพาะที่นามาใช้ งานในการทดลองเพือ่ เป็นแนวทางในการใชง้ านฟังกช์ นั่ ๆ ไดแ้ ก่ 1. ฟังก์ชั่นเร่ิมต้นการใช้งานและกาหนดแอดเดรส ใช้ในการเร่ิมตน้ การใช้งานไลบรารี่และ กาหนดแอดเดรสของโมดูลจอ OLED ที่สื่อสารแบบ I2C รูปแบบเป็นดงั น้ี .begin(SSD1306_SWITCHCAPVCC,addr); addr: แอดเดรสของโมดูล I2C ตัวอย่าง OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); หมายถงึ เริ่มตน้ การใชง้ านไลบราร่ีโดยโมดูลเชื่อมตอ่ มีแอดเดรสเป็น 3CH 2. ฟังก์ชั่นล้างข้อมูลหน้าจอ ใชใ้ นการลา้ งขอ้ มูลที่แสดงผลบนหนา้ จอ OLED รูปแบบเป็นดงั น้ี .clearDisplay(); 3. ฟังก์ช่ันแสดงผล ใชใ้ นการแสดงผลบนหนา้ จอ OLED จากขอ้ มูลในบฟั เฟอร์ รูปแบบเป็ น ดงั น้ี .display(); 4. ฟังก์ช่ันวาดเส้นวงกลม ใชใ้ นการวาดเส้นวงกลมไม่มีสีพ้นื รูปแบบเป็นดงั น้ี .drawCircle(x0,y0,radius,color);
302 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตัวอย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถึง y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y radius: รัศมีของวงกลม color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.drawCircle(110, 50, 12, WHITE); วาดเส้นวงกลมสีขาวท่ีพิกดั (110,50) โดยมีรัศมี 12 พิกเซล 5. ฟังก์ช่ันวาดเส้นตรง ใชใ้ นการเส้นตรง รูปแบบเป็นดงั น้ี .drawLine(x0,y0,x1,y1,color); ตวั อย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถงึ y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y x1: พิกดั ท่ีตาแหน่งทา้ ยของการวาดเส้นตรงในแกน x y1: พกิ ดั ที่ตาแหน่งทา้ ยของการวาดเส้นตรงในแกน y color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.drawLine(0, 63, 127, 0, WHITE); วาดเส้นตรงสีขาวเร่ิมท่ีพกิ ดั (0,63) ไปสิ้นสุดที่พิกดั (127,0) 6. ฟังก์ชั่นวาดรูปสี่เหลย่ี ม วาดรูปสี่เหลี่ยมพ้ืนโปร่งใส รูปแบบเป็นดงั น้ี .drawRect(x0,y0, w,h,color); ตัวอย่าง x0: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถงึ y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y w: ความกวา้ งของรูปสี่เหล่ียม h: ความสูงของรูปสี่เหล่ียม color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.drawRect(10,10, 100,40,WHITE); วาดรูปส่ีเหล่ียมสีขาวเร่ิมท่ีพกิ ดั (10,10) ไปสิ้นสุดที่พิกดั (100,40) 7. ฟังก์ช่ันวาดรูปสามเหลยี่ ม วาดรูปสามเหล่ียมพ้ืนโปร่งใส รูปแบบเป็นดงั น้ี .drawTriangle(x0,y0,x1,y1,x2,y2,color); x0: พิกดั ที่ตาแหน่งเริ่มวาดแกน x y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y
ใบงานที่ 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 303 ตัวอย่าง x1: พิกดั จุดท่ีสองของการลากเส้นของแกน x หมายถึง y1: พิกดั ที่จุดท่ีสองของการลากเส้นของแกน y x2: พิกดั จุดท่ีสามของการลากเส้นของแกน x y2: พกิ ดั จุดท่ีสามของการลากเส้นของแกน y color: สีที่ตอ้ งการแสดง (BLACK, WHITE) OLED.drawTriangle(70, 60, 90, 60, 80, 46, WHITE); วาดรูปสามเหลี่ยมสีขาวท่ีพิกดั แกน x, y ดงั น้ี (70,60) (90,60) (80,46) 8. ฟังก์ชั่นวาดวงกลมชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี .fillCircle(x0,y0,radius,color); ตัวอย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถึง y0: พกิ ดั ที่ตาแหน่งเริ่มวาดแกน y radius: รัศมีของวงกลม color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.fillCircle(110, 50, 12, WHITE); วาดวงกลมทึบสีพ้ืนเป็นสีขาวที่พกิ ดั (110,50) โดยมีรัศมี 12 พกิ เซล 9. ฟังก์ช่ันวาดรูปส่ีเหลย่ี มชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี .fillRect(x0,y0,w,h,color); ตวั อย่าง x0: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถึง y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y w: ความกวา้ งของรูปส่ีเหลี่ยม h: ความสูงของรูปสี่เหล่ียม color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.fillRect(10,10, 100,40,WHITE); วาดรูปสี่เหลี่ยมพ้นื สีขาวเร่ิมท่ีพิกดั (10,10) ไปสิ้นสุดที่พกิ ดั (100,40) 10. ฟังก์ชั่นวาดรูปส่ีเหลย่ี มหวั มนชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี .fillRoundRect(x0,y0,w,h,radius,color); x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y
304 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตัวอย่าง w: ความกวา้ งของรูปส่ีเหล่ียม หมายถงึ h: ความสูงของรูปส่ีเหล่ียม radius: รัศมีของส่วนโคง้ หวั มน color: สีท่ีตอ้ งการแสดง (BLACK, WHITE) OLED.fillRoundRect (10,10, 100,40,WHITE); วาดรูปสี่เหล่ียมพ้นื สีขาวเร่ิมท่ีพกิ ดั (10,10) ไปสิ้นสุดที่พกิ ดั (100,40) 11. ฟังก์ชั่นพิมพ์ข้อความ เป็ นฟังก์ชนั่ ที่ใช้ในพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบนจอ OLED รูปแบบการใช้งานคลา้ ยคลึงกบั Serial.print() นน่ั คือเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะ รออยทู่ ่ีทา้ ยสิ่งที่พิมพน์ ้นั ๆ รูปแบบเป็นดงั น้ี .print(); 12. ฟังก์ช่ันพมิ พ์ข้อความ ใชใ้ นพิมพข์ อ้ ความหรือค่าในตวั แปรใหแ้ สดงบนจอ OLED รูปแบบ การใช้งานคลา้ ยคลึงกบั Serial.println() น่ันคือเมื่อพิมพ์เสร็จตวั เคอร์เซอร์จะขยบั มาข้ึน บรรทดั ใหมร่ อฟังกช์ นั่ พิมพข์ อ้ ความตอ่ ไป รูปแบบเป็นดงั น้ี .println(); 13. ฟังก์ช่ันกาหนดตาแหน่งเคอร์เซอร์สาหรับพิมพ์ข้อความ เป็ นฟังก์ช่ันกาหนดพิกดั ให้กบั เคอร์เซอร์เพื่อใชพ้ ิมพข์ อ้ ความในตาแหน่งที่ตอ้ งการ รูปแบบเป็นดงั น้ี .setCursor(x0,y0); x0: พิกดั แกน x y0: พิกดั แกน y 14. ฟังก์ชั่นเรียกใช้งานฟอนต์ เป็ นฟังก์ชน่ั ท่ีใชเ้ รียกใชง้ านฟอนต์ท่ีตอ้ งการโดยใส่ชื่อฟอนต์ที่ ตอ้ งการใชง้ าน (ช่ือฟอนตใ์ นตารางท่ี 4.24-2) รูปแบบเป็นดงั น้ี .setFont(&Font); Font: ช่ือฟอนตท์ ่ีตอ้ งการใชง้ าน(ไมต่ อ้ งใส่สกลุ .h) ตัวอย่าง OLED.setFont(&FreeMonoBold9pt7b); หมายถึง ใชง้ านฟอนตท์ ี่ชื่อวา่ FreeMonoBold9pt7b
ใบงานที่ 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 305 15. ฟังก์ช่ันกาหนดสีข้อความ ใชใ้ นการกาหนดสีของตวั ขอ้ ความและพ้ืนหลงั ขอ้ ความ รูปแบบ เป็นดงั น้ี .setTextColor(color,background) color: สีของขอ้ ความที่ตอ้ งการแสดง (BLACK, WHITE) background: สีของพ้ืนหลงั ขอ้ ความที่ตอ้ งการแสดง (BLACK, WHITE) 16. ฟังก์ช่ันกาหนดขนาดของตัวอกั ษร ใชใ้ นการกาหนดขนาดของตวั อกั ษรท่ีตอ้ งการแสดงผล บนจอ OLED รูปแบบเป็นดงั น้ี .setTextSize(sizes); sizes: ตวั เลขขนาดท่ีตอ้ งการสามารถใชง้ านไดต้ ้งั แต่ 1-8 7. วงจรทใี่ ช้ทดลอง วงจรเพื่อใชท้ ดลองในใบงานสามารถทาได้ 2 แนวทาง คือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป เนื่องจากไม่มีโมเดลจาลอง OLED ในโปรแกรม Proteus จึงไม่สามารถจาลองการทางานได้ กรณีที่ใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็ น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit VCC R1 10k 7,20 ATMEGA328 VCC GND SCL SDA VCC 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.24-18 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
306 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป VCC ARDUINO VCC A4(SDA) A5(SCL) VCC GND SCL SDA GND รูปท่ี 4.24-19 วงจรท่ีใชบ้ อร์ด 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 VCC GND S CL S DA D13 3V3 ABCDE REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปท่ี 4.24-20 การต่อลงบอร์ดทดลอง 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมแสดงผลบนจอ OLED ท่ีมีท้งั ขอ้ ความและค่าในตวั แปร ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <Adafruit_GFX.h> 3 #include <Adafruit_SSD1306.h> 4 Adafruit_SSD1306 OLED(4); 5 int x; 6 void setup() 7{ 8 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C 9} 10 void loop() 11 { 12 OLED.clearDisplay();
ใบงานท่ี 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 307 13 OLED.setTextColor(WHITE,BLACK); //Text is white ,background is black 14 OLED.setCursor(0, 0); 15 OLED.setTextSize(2); 16 OLED.println(\"OLED \"); 17 OLED.setTextSize(1); 18 OLED.println(\"Arduino Laboratory\"); 19 OLED.setTextColor(BLACK,WHITE); // 'inverted' text 20 OLED.print(\"www.praphas.com\"); 21 OLED.setTextColor(WHITE,BLACK); // 'inverted' text again 22 OLED.setCursor(60,0); 23 OLED.setTextSize(2); 24 OLED.println(x,DEC); 25 OLED.display(); // 26 x++; 27 delay(250); 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบราร่ี Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 4 กาหนดชื่อเรียกโมดูลจอวา่ OLED - บรรทดั ที่ 8 ประกาศเริ่มใชง้ านไลบรารี่พร้อมระบุแอดเดรสจอ OLED - บรรทดั ที่ 12 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ - บรรทดั ท่ี 13 กาหนดสีตวั อกั ษรและสีพ้นื หลงั ของตวั อกั ษร - บรรทดั ที่ 14 กาหนดพิกดั ที่จะพิมพข์ อ้ ความ - บรรทดั ที่ 15 กาหนดขนาดของตวั อกั ษร - บรรทดั ท่ี 16 แสดงผลขอ้ ความแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอท่ีบรรทดั ใหม่ - บรรทดั ที่ 24 แสดงผลจากคา่ ของตวั แปรแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอที่บรรทดั ใหม่ - บรรทดั ที่ 25 สัง่ ใหแ้ สดงผล ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองเปล่ียนรูปแบบการแสดงผล การทดลองที่ 2 เขียนโปรแกรมวาดวตั ถุแบบต่าง ๆ โดยแสดงผลท่ีจอ OLED ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง วาดวัตถแุ บบต่าง แสดงผล
308 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <Adafruit_GFX.h> 3 #include <Adafruit_SSD1306.h> 4 Adafruit_SSD1306 OLED(4); 5 void setup() 6{ 7 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); //initialize I2C addr 0x3c 8} 9 void loop() 10 { 11 OLED.clearDisplay(); 12 OLED.setTextColor(WHITE,BLACK); 13 OLED.drawRect(10,10, 100,40,WHITE); 14 OLED.drawLine(0, 63, 127, 0, WHITE); 15 OLED.drawCircle(110, 50, 12, WHITE); 16 OLED.fillCircle(45, 50, 8, WHITE); 17 OLED.drawTriangle(70, 60, 90, 60, 80, 46, WHITE); 18 OLED.fillRect(15,15,20,20,WHITE); 19 OLED.fillRoundRect(50,15,50,20,10,WHITE); 20 OLED.setCursor(5,30); 21 OLED.setTextSize(1); 22 OLED.println(\"www.praphas.com\"); 23 OLED.display(); // 24 delay(250); 25 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบราร่ี Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 3 รวมไฟลไ์ ลบราร่ี Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 4 กาหนดชื่อเรียกโมดูลจอวา่ OLED - บรรทดั ที่ 7 ประกาศเร่ิมใชง้ านไลบรารี่พร้อมระบุแอดเดรสจอ OLED - บรรทดั ที่ 11 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ - บรรทดั ที่ 12 กาหนดสีตวั อกั ษรและสีพ้นื หลงั ของตวั อกั ษร - บรรทดั ท่ี 13 วาดรูปส่ีเหลี่ยมพ้นื โปร่งใส - บรรทดั ที่ 14 วาดเส้นตรง - บรรทดั ท่ี 15 วาดรูปวงกลมพ้นื โปร่งใส - บรรทดั ที่ 16 วาดรูปวงกลมพ้ืนทึบสีขาว - บรรทดั ที่ 17 วาดรูปสามเหลี่ยมพ้นื โปร่งใส - บรรทดั ที่ 25 สั่งใหแ้ สดงผล ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองเปลี่ยนรูปแบบการแสดงผล
ใบงานท่ี 4.24 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 309 การทดลองที่ 3 เขียนโปรแกรมแสดงขอ้ ความโดยเปลี่ยนฟอน์ตการแสดงผล ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง เลือกใช้ฟอนต์ แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <Adafruit_GFX.h> 3 #include <Adafruit_SSD1306.h> 4 #include <Fonts/FreeMonoBold9pt7b.h> //include font MonoBold size 9pt7b 5 Adafruit_SSD1306 OLED(4); 6 void setup() 7{ 8 OLED.setFont(&FreeMonoBold9pt7b); // Use font from file include 9 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C 10 } 11 void loop() 12 { 13 OLED.clearDisplay(); 14 OLED.setTextColor(WHITE,BLACK); //Text is white ,background is black 15 OLED.setCursor(0,20); 16 OLED.setTextSize(1); 17 OLED.println(\"Change font\"); 18 OLED.setCursor(0,50); 19 OLED.print(\"OLED 128x64\"); 20 OLED.display(); // 21 delay(250); 22 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 รวมไฟลไ์ ลบรารี่ Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 4 รวมไฟลฟ์ อนตเ์ ขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 5 กาหนดชื่อเรียกโมดูลจอวา่ OLED - บรรทดั ท่ี 8 ประกาศใชง้ านฟอนต์ - บรรทดั ที่ 9 ประกาศเร่ิมใชง้ านไลบราร่ีพร้อมระบุแอดเดรสจอ OLED - บรรทดั ท่ี 13 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ - บรรทดั ที่ 14 กาหนดสีตวั อกั ษรและสีพ้ืนหลงั ของตวั อกั ษร - บรรทดั ที่ 15 กาหนดพิกดั ที่จะพิมพข์ อ้ ความ
310 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ที่ 16 กาหนดขนาดของตวั อกั ษร - บรรทดั ที่ 17 แสดงผลขอ้ ความแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอที่บรรทดั ใหม่ - บรรทดั ท่ี 20 สั่งใหแ้ สดงผล ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองเปล่ียนรูปแบบการแสดงผล 9. สรุปผลการปฏบิ ตั งิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมแสดงผลเวลาที่บอร์ดเริ่มทางานโดยให้แสดงผลเวลาหน่วยเป็ นวินาทีพร้อม ขอ้ ความบอกรายละเอียดต่าง ๆ พอสมควร วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO VCC VCC A4(SDA) A5(SCL) VCC GND SCL SDA GND รูปที่ 4.24-21 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 311 ใบงานที่ 4.25 การเขยี นโปรแกรมแสดงผลรูปภาพด้วยจอ 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. สรุปผลการปฏิบตั ิงาน
312 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน รูปภาพที่แสดงผลบนจอ OLED ขนาด 128×64 สามารถทาได้ 2 วิธีหลกั ๆ คือ เขียนข้ึนมาใหม่ และใชร้ ูปภาพท่ีมีอยูแ่ ลว้ สาหรับการเขียนรูปภาพข้ึนมาใหม่สามารถใช้โปรแกรมวาดรูปภาพทว่ั ๆ ไป เขียนรูปภาพที่ตอ้ งการไดเ้ พียงการเขียนรูปภาพให้ไดต้ ามตอ้ งการมีความซบั ซอ้ นมากพอสมควรสาหรับ ผทู้ ่ีไมม่ ีทกั ษะในการวาดรูปดว้ ยแลว้ แทบจะเป็ นไปไม่ไดเ้ ลย งานคร้ังน้ีเสนอการนารูปภาพที่มีอยแู่ ลว้ ซ่ึง เป็นวธิ ีที่ง่ายสุดคือการคน้ หารูปภาพที่ตอ้ งการทางอินเตอร์เน็ตมีข้นั ตอนการดาเนินการดงั น้ี ข้นั ตอนการดาเนินการ 1. เปิ ดหาภาพทต่ี ้องการ เป็นการหารูปภาพจากแหล่งตา่ ง ๆ ที่มีลกั ษณะตามท่ีตอ้ งการและมีขนาดท่ี สามารถใช้งานได้ ตวั อย่างเช่นจากเวปไซต์ http://www.alessioatzeni.com/meteocons ซ่ึงเป็ น ภาพขาวดาและมีขนาดใกลเ้ คียงกบั ท่ีตอ้ งการ หากภาพเล็กหรือใหญ่เกินความตอ้ งการสามารถ ปรับขยาย/ยอ่ การแสดงผลในโปรแกรมบราวน์เซอร์ (โปรแกรมท่ีกาลงั เปิ ดเวป) เพือ่ ใหไ้ ดข้ นาด ที่ตอ้ งการและมีขนาดไม่เกินขนาดของหนา้ จอ OLED ที่ใชง้ าน การปรับขยาย/ยอ่ ทาไดโ้ ดยการ กดแป้นพมิ พ์ Ctrl คา้ งไวแ้ ลว้ กลิ้งเมาส์ใหไ้ ดข้ นาดตามตอ้ งการ รูปท่ี 4.25-1 ตวั อยา่ งภาพจากเวปไซตท์ ี่ตอ้ งการจบั ภาพ 2. จับภาพหน้าจอด้วยโปรแกรมจับภาพ เช่นโปรแกรม SnagIt สามารถดาวน์โหลดโปรแกรมไดท้ ี่ https://www.techsmith.com/download/snagit ทาการจบั ภาพเฉพาะไอคอนท่ีตอ้ งการ โดยขนาด ของภาพท้งั แนวต้งั และแนวนอนจะตอ้ งเป็นค่าที่เลข 8 สามารถหารไดล้ งตวั ถึงจะสามารถนาไป แสดงผลไดถ้ ูกตอ้ ง เช่น 56×56 ดงั รูป รูปท่ี 4.25-2 จบั ภาพท่ีตอ้ งการโดยขนาดที่ใชเ้ ลข 8 หารลงตวั
ใบงานท่ี 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 313 รูปท่ี 4.25-3 ภาพท่ีจบั ไดจ้ ากหนา้ จอดว้ ยโปรแกรม Snagit 3. ใช้โปรแกรมแปลงภาพเป็ นรหัส \"LCD Image Converter\" สามารถดาวน์โหลดโปรแกรมไดท้ ี่ http://www.riuson.com/lcd-image-converter ทาการเปิ ดให้โปรแกรมค้างไว้ แล้วกลับไปยงั โปรแกรม Snagit (รูปที่ 4.25-3) ทาการคดั ลอกภาพโดยใช้ Ctrl+c แลว้ กลบั มายงั โปรแกรม LCD Image Converter อีกคร้ังทาการวางภาพท่ีคดั ลอกมาโดยใช้ Ctrl+v ทาการซูมภาพเพื่อใหส้ ามารถ ปรับสีในแต่ละพิกเซลได้ถนัดโดยการกดคีย์ Ctrl คา้ งไวแ้ ล้วกลิ้งลูกกลิ้งเมาส์ให้ได้ขนาดที่ สามารถแกไ้ ขภาพไดอ้ ยา่ งถนดั ตามความตอ้ งการ ทาการปรับสีภาพแต่ละพิกเซลให้ไดต้ ามท่ี ตอ้ งการโดยใชก้ ารคลิกเมาส์ที่เคร่ืองมือดินสอ แลว้ มาคลิกที่ภาพดงั น้ี - คลิกซา้ ยจะเติมสีดา - คลิกขวาจะเติมสีขวา รูปที่ 4.25-4 ภาพท่ีนาเขา้ โปรแกรม LCD Image Converter รูปที่ 4.25-5 ภาพท่ีตกแต่งเรียบร้อยแลว้
314 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 4. การดูขนาดรูปภาพ วา่ ใชง้ านไดห้ รือไม่ หากเป็ นขนาดที่เลข 8 หารไม่ลงตวั จะตอ้ งทาการปรับ เพม่ิ /ลดขนาดใหห้ ารลงตวั ใหไ้ ด้ การดูขนาดดูไดท้ ่ีมุมขวาล่างของโปรแกรมดงั รูป รูปที่ 4.25-6 ดูขนาดภาพ 5. ปรับขนาดรูปภาพให้แสดงผลได้ ขนาดรูปภาพท่ีใชง้ านไดจ้ ะตอ้ งมีขนาดพกิ เซลไม่เกินจอคือไม่ เกิน 128×64 และตอ้ งเป็ นขนาดท่ีเลข 8 หารลงตวั หากดูขนาดจากข้นั ตอนท่ี 4 แลว้ เห็นวา่ ขนาด ยงั ไมถ่ ูกตอ้ งจะตอ้ งปรับขนาดโดยดาเนินการดงั รูป รูปที่ 4.25-7 ดูขนาดภาพ รูปที่ 4.25-8 ปรับขนาดภาพเพม่ิ ลดซา้ ย/ขวา/บน/ล่าง 6. กลบั สีรูปภาพเป็ นตรงข้าม ในกรณีท่ีรูปภาพที่ไดต้ อ้ งการใหต้ ิดสวา่ งบริเวณที่เป็ นสีขาวและให้ มืดบริเวณท่ีเป็นสีดาจะตอ้ งทาการกลบั สีภาพโดยใชเ้ มนู Image-> Inverse ดงั รูป รูปท่ี 4.25-9 กลบั สีภาพ
ใบงานที่ 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 315 รูปท่ี 4.25-10 ผลของการกลบั สีรูปภาพ 7. เตรียมการคัดลอกโค้ด คลิกที่เมนู Option เลือก Conversion คลิกเลือก Monochrome(1) และ Show Preview(2) รูปที่ 4.25-11 เตรียมการคดั ลอกโคด้ รูปภาพ 8. คดั ลอกโค้ดรูปภาพ โดยการคลิกขวาท่ีบริเวณโคด้ เลือก Select All และ Copy ตามลาดบั รูปท่ี 4.25-12 เลือกโคด้ ภาพท้งั หมด รูปท่ี 4.25-13 คดั ลอกโคด้ ภาพ
316 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 9. นาโค้ดรูปภาพไปวางในโปรแกรม โดยวางไวใ้ นตวั แปรอาเรยท์ ี่เก็บขอ้ มูลไวใ้ นหน่วยความจา เกบ็ โปรแกรม const unsigned char logo [] PROGMEM = { รูปท่ี 4.25-14 วางโคด้ รูปภาพในตวั แปรอาเรย์ 10. แก้ขนาดรูปภาพทกี่ าหนด ทาการแกข้ นาดรูปภาพใหต้ รงตามขนาดจริงในฟังกช์ น่ั .drawBitmap รูปที่ 4.25-15 แกข้ นาดใหต้ รงกบั ขนาดภาพท่ีใชง้ าน 6. ฟังก์ชั่น Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่ ตอ้ งการหยดุ คา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) ฟังก์ชั่นใช้งานของไลบราร่ี (เฉพาะในใบงาน) ฟังกช์ นั่ ท่ีใชใ้ นการทดลองในใบงาน ไดแ้ ก่ 1. ฟังก์ช่ันเร่ิมต้นการใช้งานและกาหนดแอดเดรส ใช้ในการเริ่มตน้ การใช้งานไลบรารี่และ กาหนดแอดเดรสของโมดูลจอ OLED ท่ีสื่อสารแบบ I2C รูปแบบเป็นดงั น้ี .begin(SSD1306_SWITCHCAPVCC,addr); addr: แอดเดรสของโมดูล I2C
ใบงานที่ 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 317 2. ฟังก์ช่ันวาดรูปภาพ ใชใ้ นวาดรูปภาพท่ีเก็บไวใ้ นตวั แปร รูปแบบเป็นดงั น้ี .drawBitmap( x,y,*bitmap,w,h,color) ตวั อย่าง x: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x หมายถงึ y: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน y *bitmap: ชื่อตวั แปรท่ีเกบ็ รูปภาพ w: ขนาดพกิ เซลดา้ นความกวา้ งของรูปภาพ h: ขนาดพิกเซลดา้ นความสูงของรูปภาพ color: สีท่ีใชว้ าด (0,1) OLED.drawBitmap(20,10,logo,56,56,1); วาดรูปภาพจากตวั แปร logo ที่พกิ ดั (20,10) โดยขนาดของรูปภาพคือ (56,56) 3. ฟังก์ชั่นล้างข้อมูลหน้าจอ ใชใ้ นการลา้ งขอ้ มูลท่ีแสดงผลบนหนา้ จอ OLED รูปแบบเป็นดงั น้ี .clearDisplay(); 4. ฟังก์ชั่นแสดงผล ใชใ้ นการแสดงผลบนหนา้ จอ OLED จากขอ้ มูลในบฟั เฟอร์ รูปแบบเป็ น ดงั น้ี .display(); 5. ฟังก์ชั่นพมิ พ์ข้อความ เป็ นฟังก์ชนั่ ที่ใชใ้ นการพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบน จอ OLED โดยรูปแบบการใช้งานคล้ายคลึงกับ Serial.print() นั่นคือเมื่อพิมพ์เสร็จตัว เคอร์เซอร์จะรออยทู่ ี่ทา้ ยส่ิงที่พมิ พน์ ้นั ๆ รูปแบบเป็นดงั น้ี .print(); 6. ฟังก์ชั่นพมิ พ์ข้อความ ใชใ้ นการพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบนจอ OLED โดย รูปแบบการใชง้ านคลา้ ยคลึงกบั Serial.println() นนั่ คือเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะขยบั มา ข้ึนบรรทดั ใหม่รอฟังกช์ น่ั พมิ พข์ อ้ ความตอ่ ไป รูปแบบเป็นดงั น้ี .println(); 7. ฟังก์ช่ันกาหนดตาแหน่งเคอร์เซอร์สาหรับพิมพ์ข้อความ เป็ นฟังก์ชน่ั กาหนดพิกดั ให้กบั เคอร์เซอร์เพอื่ ใชพ้ มิ พข์ อ้ ความในตาแหน่งท่ีตอ้ งการ รูปแบบเป็นดงั น้ี
318 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] .setCursor(x0,y0); x0: พกิ ดั แกน x y0: พกิ ดั แกน y 8. ฟังก์ช่ันเรียกใช้งานฟอนต์ เป็ นฟังก์ชนั่ ท่ีใช้เรียกใชง้ านฟอนต์ท่ีตอ้ งการโดยใส่ช่ือฟอนตท์ ่ี ตอ้ งการใชง้ าน (ช่ือฟอนตใ์ นตารางท่ี 4.25-2) รูปแบบเป็นดงั น้ี .setFont(&Font); Font: ช่ือฟอนตท์ ี่ตอ้ งการใชง้ าน (ไม่ตอ้ งใส่สกุล .h) 9. ฟังก์ชั่นกาหนดสีข้อความ ใชใ้ นการกาหนดสีของตวั ขอ้ ความและพ้ืนหลงั ขอ้ ความ รูปแบบ เป็นดงั น้ี .setTextColor(color,background) color: สีของขอ้ ความท่ีตอ้ งการแสดง (BLACK, WHITE) background: สีของพ้ืนหลงั ขอ้ ความที่ตอ้ งการแสดง (BLACK, WHITE) 10. ฟังก์ช่ันกาหนดขนาดของตัวอักษร ใชใ้ นการกาหนดขนาดของตวั อกั ษรที่ตอ้ งการแสดงผล บนจอ OLED รูปแบบเป็นดงั น้ี .setTextSize(sizes); sizes: ตวั เลขขนาดท่ีตอ้ งการสามารถใชง้ านไดต้ ้งั แต่ 1-8 7. วงจรทใ่ี ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 2 แนวทาง คือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป เนื่องจากไม่มีโมเดลจาลอง OLED ในโปรแกรม Proteus จึงไมส่ ามารถจาลองการทางานได้ กรณีที่ใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป
ใบงานท่ี 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 319 1DN15819 VCC Peripheral circuit R1 CPU circuit VCC 10k 7,20 ATMEGA328 VCC GND SCL SDA SW1 VCC 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.25-16 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป VCC ARDUINO VCC A4(SDA) A5(SCL) VCC GND SCL SDA GND รูปท่ี 4.25-17 วงจรที่ใชบ้ อร์ด 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 VCC GND S CL S DA D13 3V3 ABCDE REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปที่ 4.25-18 การต่อลงบอร์ดทดลอง
320 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมแสดงภาพบนจอ OLED ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Wire.h> 2 #include <Adafruit_GFX.h> 3 #include <Adafruit_SSD1306.h> 4 Adafruit_SSD1306 OLED(4); 5 const unsigned char logo [] PROGMEM = { 6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 10 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 11 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 12 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 13 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 14 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 15 0x00, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00, 16 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 17 0x00, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00, 18 0x00, 0x06, 0x07, 0xf8, 0x30, 0x00, 0x00, 19 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 20 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00, 21 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00, 22 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x00, 23 0x00, 0x01, 0xe0, 0x03, 0x80, 0x00, 0x00, 24 0x00, 0x01, 0xc0, 0x01, 0xc0, 0x00, 0x00, 25 0x00, 0x03, 0x80, 0x01, 0xc0, 0x00, 0x00, 26 0x00, 0x03, 0x80, 0x00, 0xe0, 0x00, 0x00, 27 0x03, 0xc3, 0x80, 0xff, 0xe1, 0xe0, 0x00, 28 0x07, 0xe3, 0x81, 0xff, 0xf3, 0xf0, 0x00, 29 0x03, 0xc3, 0x87, 0xff, 0xf9, 0xe0, 0x00, 30 0x00, 0x03, 0x8f, 0x80, 0x7c, 0x00, 0x00, 31 0x00, 0x01, 0xfe, 0x00, 0x1e, 0x00, 0x00, 32 0x00, 0x01, 0xfc, 0x00, 0x0f, 0x00, 0x00, 33 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xfc, 0x00, 34 0x00, 0x3f, 0xf0, 0x00, 0x03, 0xff, 0x00, 35 0x00, 0x7f, 0xc0, 0x00, 0x01, 0xff, 0x80, 36 0x00, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xc0, 37 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xe0, 38 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xf0, 39 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 40 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 41 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 42 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 43 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 44 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 45 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 46 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 47 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0, 48 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xf0,
ใบงานท่ี 4.25 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 321 49 0x01, 0xe0, 0x30, 0x00, 0x01, 0x83, 0xe0, 50 0x00, 0xfc, 0x78, 0x00, 0x07, 0xc7, 0xc0, 51 0x00, 0x7f, 0xfc, 0x00, 0x1f, 0xff, 0x80, 52 0x00, 0x3f, 0xff, 0x00, 0x3f, 0xff, 0x00, 53 0x00, 0x0f, 0xcf, 0xe0, 0xfe, 0x7c, 0x00, 54 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 55 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00, 56 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 62 }; 63 void setup() 64 { 65 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C 66 OLED.clearDisplay(); 67 OLED.drawBitmap(20,10,logo,56,56,1); 68 OLED.display(); 69 } 70 void loop() 71 { 72 delay(250); 73 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 4 กาหนดช่ือเรียกโมดูลจอวา่ OLED - บรรทดั ที่ 5-62 ตวั แปรท่ีใชเ้ ก็บรูปภาพ - บรรทดั ท่ี 65 ประกาศเร่ิมใชง้ านไลบราร่ีพร้อมระบุแอดเดรสจอ OLED - บรรทดั ที่ 66 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ - บรรทดั ที่ 67 วาดรูปภาพจากตวั แปรเกบ็ รูปภาพ - บรรทดั ที่ 68 ส่งั ใหแ้ สดงผล ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองเปลี่ยนรูปภาพในการแสดงผล 9. สรุปผลการปฏบิ ตั งิ าน
322 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมแสดงรูปภาพ (เป็ นรูปภาพท่ีเลือกเองตามตอ้ งการ) พร้อมแสดงขอ้ ความ ประกอบและเวลาท่ีบอร์ดเปิ ดใชง้ านผา่ นมา (หน่วยเป็นวนิ าที) วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO VCC VCC A4(SDA) A5(SCL) VCC GND SCL SDA GND รูปท่ี 4.25-19 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.26 การเขียนโปรแกรมใชง้ าน Watch Dog Timer 323 ใบงานท่ี 4.26 การเขยี นโปรแกรมใช้งาน Watch Dog Timer 1. จุดประสงค์ทว่ั ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมใชง้ าน Watch Dog Timer ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมใชง้ าน Watch Dog Timer ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพือ่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 4 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.2 LED 3mm 1 ตวั 3. บอร์ด Arduino Nano 3.0 1 เส้น 4. สายเช่ือมตอ่ USB (mini USB) 1 ชุด 5. สายเชื่อมต่อวงจร 1 เครื่อง 6. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
324 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน ว็อชด็อก (Watch dog ) หากแปลตรง ๆ น่าจะแปลได้ความว่า “หมาเฝ้ายาม” ในซีพียูที่เป็ น ไมโครคอนโทรลเลอร์ปัจจุบนั โดยส่วนใหญ่จะมีวงจรวอ็ ชด็อกไทมเ์ มอร์บรรจุอยภู่ ายในเป็ นวงจรที่คอย เฝ้าระวงั การหยุดทางานของไมโครคอนโทรลเลอร์โดยไม่ทราบสาเหตุหรือท่ีเรียกกนั วา่ “การแฮง้ ค์” โดยวงจรวอ็ ชด็อกจะเป็ นตวั คอยรีเซตซีพียูเม่ือเกิดการแฮงค์ ภายในวงจรวอ็ ชด็อกจะมีการทางานคลา้ ย กบั วงจรต้งั เวลา เมื่อส่งั ใหว้ งจรวอ็ ชด็อกเริ่มทางานตวั นบั ค่าจะเริ่มนบั ค่าไปเร่ือย ๆ จนถึงคา่ สูงสุดของค่า ท่ีต้งั ไวว้ งจรวอ็ ชด็อกส่งสัญญาณไปรีเซ็ตซีพียู แต่ถา้ เขียนโคด้ โปรแกรมไปลา้ งตวั นบั ในวงจรวอ็ ชด็อก ก่อนที่จะนบั ถึงค่าสูงสุดซีพียูจะไม่ถูกรีเซตจากวงจรว็อชด็อก ดงั น้ันเพื่อให้ไมโครคอนโทรลเลอร์ สามารถทางานเดิมไดอ้ ยา่ งต่อเนื่องจะตอ้ งเขียนโคด้ ลา้ งตวั นบั ของวงจรวอ็ ชด็อกภายในเวลาที่กาหนดอยู่ ตลอดเวลาซ่ึงถ้าหากไมโครคอนโทรลเลอร์เกิดการแฮงค์ (โปรแกรมปกติหยุดทางานโดยไม่ทราบ สาเหตุ) จะไม่มีการลา้ งตวั นบั ในวงจรวอ็ ชด็อกเมื่อตวั นบั ถึงค่าสูงสุดวงจรวอ็ ชด็อกจะส่งสัญญาณไปทา การรีเซ็ตซีพยี ใู หไ้ มโครคอนโทรลเลอร์เร่ิมทางานใหม่ต้งั แต่ตน้ อตั โนมตั ิ Reset RestaWrtatchTDimogeout Timer CPU Clock รูปท่ี 4.26-1 โครงสร้างบล็อกไดอะแกรมการทางานของวงจร WDT ซีพียทู ่ีใชใ้ น Arduino โดยส่วนใหญจ่ ะใชซ้ ีพยี ทู ่ีเป็นไมโครคอนโทรลเลอร์ตระกลู AVR ซ่ึงมีอยู่ ดว้ ยกนั หลายเบอร์ ในแต่ละเบอร์จะสามารถใชง้ านคา่ ช่วงเวลาไม่เหมือนกนั ดงั ตาราง ตารางท่ี 4.26-1 ค่าช่วงเวลาทางานของวงจรวอ็ ชดอ็ ก ช่วงเวลา ช่ือท่ีใชใ้ นโคด้ ซีพียทู ่ีรองรับ 15 ms WDTO_15MS ATMega 8, 168, 328, 1280, 2560 30 ms WDTO_30MS ATMega 8, 168, 328, 1280, 2560 60 ms WDTO_60MS ATMega 8, 168, 328, 1280, 2560 120 ms WDTO_120MS ATMega 8, 168, 328, 1280, 2560 250 ms WDTO_250MS ATMega 8, 168, 328, 1280, 2560 500 ms WDTO_500MS ATMega 8, 168, 328, 1280, 2560 1 s WDTO_1S ATMega 8, 168, 328, 1280, 2560 2 s WDTO_2S ATMega 8, 168, 328, 1280, 2560 4 s WDTO_4S ATMega 168, 328, 1280, 2560 8 s WDTO_8S ATMega 168, 328, 1280, 2560
ใบงานที่ 4.26 การเขียนโปรแกรมใชง้ าน Watch Dog Timer 325 6. ฟังก์ชั่น Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการให้ทางานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 2. ฟังก์ช่ันส่งค่าลอจิกดจิ ิทลั ไปยงั ขาพอร์ต ค่า HIGH เป็นการส่งลอจิก 1 และค่า LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ฟังกช์ น่ั น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ น่ั pinMode ก่อน digitalWrite(pin, value); pin: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต 3. ฟังก์ช่ันอ่านค่าลอจิกดจิ ิทลั ท่ีขาพอร์ต เป็นการอา่ นค่าเขา้ มาซ่ึงอาจนามาเก็บไวใ้ นตวั แปรไว้ ตรวจสอบลอจิกทีหลงั หรือจะตรวจสอบลอจิกแบบทนั ทีก็ได้ ซ่ึงฟังกช์ น่ั น้ีจะทางานไดต้ อ้ ง มีการใชฟ้ ังกช์ น่ั pinMode ก่อน digitalRead(pin); pin: หมายเลขขาพอร์ตที่ตอ้ งการอา่ นลอจิก 4. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่ ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 5. ฟังก์ชั่นกาหนดความเร็วในการส่ือสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม
326 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็ นฟังก์ช่ันท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พิมพข์ อ้ มูลออกทางพอร์ตเพื่อแสดงผลที่จอคอมพิวเตอร์เม่ือพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยสิ่งท่ีพิมพน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 7. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชั่น Serial.print ต่างกนั ตรงท่ีเม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเมื่อสั่งพิมพค์ ร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนที่จะต่อทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val) Serial.println(val, format) ฟังก์ชั่นใช้งานวงจรวอ็ ชดอ็ กไทม์เมอร์ (WDT) การใช้งานวงจรวอ็ ชด็อกไทมเ์ มอร์ (WDT) เป็ นตอ้ งใช้ไลบรารี่ช่วยงาน ซ่ึงไลบรารี่มีมาพร้อม กบั โปรแกรม Arduino IDE แลว้ ไม่ตอ้ งติดต้งั ใหม่ ไลบรารี่ แหล่งดาวน์โหลด wdt.h ไม่ตอ้ งดาวน์โหลดเนื่องจากมาพร้อมกบั Arduino IDE รูปแบบการเพิ่มไลบราร่ีใช้งานวงจรวอ็ ชด็อกไทม์เมอร์ (WDT) จะมีความแตกต่างกบั การเพิ่ม ไลบราร่ีตวั อ่ืน ๆ โดยรูปแบบจะเป็นดงั น้ี #include <avr/wdt.h> ฟังกช์ น่ั เกี่ยวกบั วงจรวอ็ ชด็อกไทมเ์ มอร์ ใหใ้ ชง้ านหลกั ๆ ดงั น้ี 1. ฟังก์ช่ันเปิ ดการใช้งานวงจรวอ็ ชด็อกไทม์เมอร์ เป็นฟังกช์ นั่ ที่ใชส้ าหรับเปิ ดใชง้ านพร้อมกบั ต้งั คา่ คาบเวลารีเซต รูปแบบ wdt_enable (period time); period time: คาบเวลารีเซตซีพียู (ดูจากตารางท่ี 4.26-1) 2. ฟังก์ช่ันรีเซตวงจรว็อชด็อกไทม์เมอร์ เป็ นฟังก์ชน่ั ใชส้ าหรับรีเซตวงจรว็อชด็อกไทเมอร์ ก่อนเกิดการไทมเ์ อาตจ์ ะตอ้ งใชแ้ ทรกในโคด้ โปรแกรมเป็ นระยะ ๆ โดยในแต่ละช่วงระยะ ของโคด้ ที่แทรกการทางานของโคด้ ในส่วนน้ันจะตอ้ งไม่ใช้เวลานานกว่าเวลาไทม์เอาต์ รูปแบบดงั น้ี wdt_reset();
ใบงานท่ี 4.26 การเขียนโปรแกรมใชง้ าน Watch Dog Timer 327 7. วงจรทใี่ ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1N15819 VCC Peripheral circuit R1 CPU circuit 10k 7,20 ATMEGA328 SW1 VCC 1 RST AVCC C1 R4-R7 0.1uF 220 LED1-LED4 USB to UART (TTL Level) R2,R3 3 D2 4 1k 2 D3 5 DTR D4 6 RXD D1(TXD) D5 11 TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.26-2 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป LED1-LED4 ARDUINO R1-R2420 D2 D3 D4 D5 GND รูปท่ี 4.26-3 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
328 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]F GH I J20 2025 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 D10 รูปที่ 4.26-4 การตอ่ ลงบอร์ดทดลองD9 การต่อวงจรเพ่ือทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD8 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.26-5 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลอง เขียนโปรแกรมทดสอบการใช้งานวงจรวอ็ ชด็อกไทม์เมอร์โดยใชฟ้ ังก์ชนั่ หน่วงเวลาพร้อม แสดงการนบั เลขสังเกตผลท่ีเกิดข้ึน ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START A กาหนดค่าเริม่ ต้นต่าง แสดงเลขที่ LED เปิ ดวงจร WDT ท่ีเวลา 2s ส่งค่าตัวเลขไปแสดงผล ตัง้ ค่าตัวนับเลข รเี ซต WDT เพ่มิ คา่ ตวั นบั B เลข<=255 เท็จ B จริง A
ใบงานท่ี 4.26 การเขียนโปรแกรมใชง้ าน Watch Dog Timer 329 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <avr/wdt.h> 2 #define LED1 2 3 #define LED2 3 4 #define LED3 4 5 #define LED4 5 6 7 char LED_pin[] = {LED1,LED2,LED3,LED4}; 8 void send2port(byte data); 9 void setup() 10 { 11 Serial.begin(9600); 12 for(char i=0;i<4;i++) 13 { 14 15 pinMode(LED_pin[i],OUTPUT); 16 } 17 wdt_enable(WDTO_2S); 18 } 19 void loop() 20 { 21 for(byte i=0;i<=255;i++) 22 { 23 24 send2port(i); 25 Serial.println(i); 26 delay(100); 27 wdt_reset(); 28 } 29 } 30 void send2port(byte data) 31 { 32 33 if (data & 1 ){digitalWrite(LED_pin[0],HIGH);} else 34 {digitalWrite(LED_pin[0],LOW);} 35 if (data & 2 ){digitalWrite(LED_pin[1],HIGH);} else 36 {digitalWrite(LED_pin[1],LOW);} 37 if (data & 4 ){digitalWrite(LED_pin[2],HIGH);} else {digitalWrite(LED_pin[2],LOW);} if (data & 8 ){digitalWrite(LED_pin[3],HIGH);} else {digitalWrite(LED_pin[3],LOW);} } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ wdt.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2-5 ประกาศชื่อแทนพอร์ตเช่ือมต่อดว้ ยคาวา่ LED - บรรทดั ท่ี 10 กาหนดความเร็วในการส่ือสารผา่ นพอร์ตอนุกรมที่ 9600 bps - บรรทดั ท่ี 11-14 กาหนดโหมดใหก้ บั ขาพอร์ตที่ต่อกบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ท่ี 15 เปิ ดการใชง้ านวงจรวอ็ ชดอ็ กไทมเ์ มอร์โดยกาหนดคาบเวลาเป็ น 2 วนิ าที - บรรทดั ที่ 19-26 วนแสดงเลขนบั รอบพร้อมสั่งให้ LED ติด/ดบั - บรรทดั ท่ี 22 แสดงตวั เลขที่ทาการนบั ออกทางจอคอมพวิ เตอร์ - บรรทดั ท่ี 24 รีเซตวงจรวอ็ ชดอ็ กไทมเ์ มอร์ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus
330 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. ทดลองดว้ ยวงจรจริง 3. ทดลองปิ ดคาสัง่ รีเซตวงจรวอ็ ชดอ็ กไทมเ์ มอร์สังเกตผลที่เกิดข้ึน 9. สรุปผลการปฏบิ ตั งิ าน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมไฟวิ่ง LED 4 ตวั โดยกาหนดรูปแบบการติด/ดบั ตามตอ้ งการพร้อมท้งั ใชง้ าน วงจรวอ็ ชด็อกไทมเ์ มอร์โดยใชค้ าบเวลาต่าง ๆ ทดลองเปิ ดและปิ ดคาส่ังรีเซตวงจรวอ็ ชด็อก ไทมเ์ มอร์แลว้ สังเกตผล วงจรที่ใชท้ ดลองดงั รูป ARDUINO LED1-LED4 R1-R4 220 D2 D3 D4 D5 GND รูปท่ี 4.26-6 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 331 ใบงานที่ 4.27 การเขยี นโปรแกรมควบคุมผ่านพอร์ตอนุกรมด้วย Visual Basic 1. จุดประสงค์ทว่ั ไป เพอื่ ใหส้ ามารถเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic ได้ 2. ทดสอบการทางานของบอร์ด Arduino ได้ 3. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 1 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.2 LED 3mm 4 ตวั 2.3 Tack Switch 3. บอร์ด Arduino Nano 3.0 1 ตวั 4. สายเช่ือมตอ่ USB (Mini USB) 1 เส้น 5. คอมพวิ เตอร์ 1 เครื่อง 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ ว่ั ไปจุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
332 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การทดลองในใบงานที่ 4.2 เป็นการสื่อสารแบบอนุกรมระหวา่ ง Arduino กบั คอมพิวเตอร์โดยใช้ หนา้ ต่างการส่ือสารในคอมพิวเตอร์เป็ น Serial monitor ของโปรแกรม Arduino IDE ซ่ึงสามารส่งขอ้ มูล เขา้ บอร์ดเพื่อส่ังงานให้ LED ติดดบั ไดต้ ามตอ้ งการหรือแสดงผลจากขอ้ มูลท่ีส่งมาจากบอร์ด Arduino สาหรับใบงานน้ีเป็ นการสร้างโปรแกรมส่ือสารท่ีนามาใช้แทน Serial monitor โดยผูใ้ ช้งานสามารถ ออกแบบหนา้ ตา่ งโปรแกรมตามตอ้ งการไดซ้ ่ึงโปรแกรมที่นามาใชส้ ร้างคือ Visual basic 2010 Express 1Visual Basic เป็ นภาษารุ่นท่ีสามในการเขียนโปรแกรมแบบ event-driven programming (การ เขียนโปรแกรมที่ข้ึนกบั เหตุการณ์) ซ่ึงมาพร้อมกบั เคร่ืองมือพฒั นาจาก Microsoft เปิ ดตวั คร้ังแรกในปี 1991 และไดร้ ับการพฒั นาให้ดีมากข้ึนจนถึงปี 2008 โดย ภาษา Visual Basic น้นั ถูกออกแบบมาเพ่ือให้ ง่ายต่อการเรียนรู้และง่ายต่อการใชง้ าน ภาษา Visual Basic น้นั ถูกพฒั นามาจากภาษา Basic ภาษาเขียน โปรแกรมที่เข้าใจง่ายสาหรับผู้เริ่ มต้น ซ่ึงสนับสนุนการพัฒนาโปรแกรมแบบ rapid application development (RAD) และ graphical user interface (GUI) Visual Basic สนบั สนุนการเขียนโปรแกรมเชิง วตั ถุอยา่ งเตม็ รูปแบบ 2การเขียนโปรแกรมเชิงวตั ถุ (Object-oriented programming :OOP) คือหน่ึงในรูปแบบการเขียน โปรแกรมคอมพิวเตอร์ที่ใหค้ วามสาคญั กบั วตั ถุ ซ่ึงสามารถนามาประกอบกนั และนามาทางานรวมกนั ได้ โดยการแลกเปลี่ยนข่าวสารเพื่อนามาประมวลผลและส่งข่าวสารท่ีไดไ้ ปให้วตั ถุอ่ืน ๆ ที่เก่ียวขอ้ งเพื่อให้ ทางานต่อไป แนวคิดการเขียนโปรแกรมแบบดงั เดิมมกั นิยมใช้ การเขียนโปรแกรมเชิงกระบวนการ (Procedural Programming) ซ่ึงให้ความสาคญั กบั ข้นั ตอนกระบวนการที่ทา โดยแบ่งโปรแกรมออกเป็ น ส่วนๆตามลาดบั ข้นั ตอนการทางาน แต่แนวคิดการเขียนโปรแกรมเชิงวตั ถุน้นั ใหค้ วามสาคญั กบั ขอ้ มูล (data) และ พฤติกรรม(behavior) ของวตั ถุ และความสมั พนั ธ์กนั ระหวา่ งวตั ถุกนั มากกวา่ 6. ฟังก์ช่ัน Arduino ทใ่ี ช้ในใบงาน 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกที่ตอ้ งการให้ทางานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไมส่ ามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 1 http://marcuscode.com/lang/visual-basic/introduction 2 https://th.wikipedia.org/wiki/การเขียนโปรแกรมเชิงวตั ถุ
ใบงานท่ี 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 333 2. ฟังก์ชั่นส่งค่าลอจิกดจิ ิทลั ไปยงั ขาพอร์ต คา่ HIGH เป็นการส่งลอจิก 1 และคา่ LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ซ่ึงฟังกช์ นั่ น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalWrite(pin, value); pin: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต value: HIGH or LOW 3. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่ ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ชั่นกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม เพื่อให้สามารถส่ือสารระหวา่ ง อุปกรณ์ท้งั สองฝั่งได้จะตอ้ งกาหนดอตั ราเร็วในการสื่อสารหรือเรียกว่าอตั ราบอด (Baud rate) ซ่ึงค่าความเร็วน้ีมีหน่วยเป็ นบิตต่อวินาที (bps: bit per second) ค่าความเร็วน้ีได้แก่ 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, หรือ 115200 Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม 5. ฟังก์ช่ันตรวจสอบว่ามีข้อมูลเข้ามายังพอร์ตอนุกรมหรือไม่ โดยค่าท่ีได้จากฟังก์ชั่นเป็ น จานวนของขอ้ มูลท่ีเขา้ มา แต่ถา้ หากไมม่ ีขอ้ มูลเขา้ คา่ ท่ีไดจ้ ากฟังกช์ นั่ จะมีคา่ เป็นศูนย์ Serial.available(); 6. ฟังก์ช่ันอ่านข้อมูลทเ่ี ข้ามายงั พอร์ตอนุกรม Serial. read(); 7. ฟังก์ช่ันล้างข้อมูลในบัฟเฟอร์ของพอร์ตอนุกรมฝ่ังดา้ นรับใหว้ า่ ง Serial.flush()
334 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็นฟังกช์ นั่ ท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรืออาจ เรียกวา่ ฟังกช์ น่ั พิมพข์ อ้ มูลออกทางพอร์ตเพ่ือแสดงผลท่ีจอคอมพิวเตอร์ท่ีเชื่อมต่อกบั วงจร Arduino ฟังกช์ นั่ น้ีเม่ือพมิ พเ์ สร็จตวั เคอร์เซอร์จะรออยทู่ ี่ทา้ ยสิ่งท่ีพิมพน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 9. ฟังก์ชั่นส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชั่น Serial.print ต่างกนั ตรงท่ีเมื่อพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เม่ือสั่งพิมพ์คร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยูท่ ี่ บรรทดั ใหม่ แทนที่จะตอ่ ทา้ ยเหมือนกบั ฟังกช์ นั่ Serial.print Serial.println(val) Serial.println(val, format) 7. วงจรทใี่ ช้ทดลอง วงจรเพ่ือใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 VCC SW1 R1-R3 LED1-LED3 1 RST AVCC D2 4 220 C1 D3 5 0.1uF D4 6 USB to UART (TTL Level) R21,kR3 3 D5 11 2 DTR D1(TXD) VCC RXD D0(RXD) TXD Internal pull up +5V GND R4-R7 SW1 3V3 220 x4 D9 15 D10 16 SW2 D11 17 SW3 X1 9 XTAL1 D12 18 SW4 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.27-1 วงจรที่ใชไ้ อซี AVR ในการทดลอง
ใบงานท่ี 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 335 กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป SW1 R1-R4 ARDUINO R5-R8 LED1-LED3 SW2 220 220 SW3 D2 SW4 D9 D3 D10 D4 D11 D5 D12 GND รูปท่ี 4.27-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.27-3 การต่อลงบอร์ดทดลอง 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 รับขอ้ มูลจากพอร์ตอนุกรมซ่ึงส่งมาจากคอมพวิ เตอร์ หากขอ้ มูลเป็ นตวั อกั ษร A ให้ LED ที่ต่ออยทู่ ่ีขา D13 สวา่ งแต่ถา้ ขอ้ มูลท่ีเขา้ มาไมใ่ ช่ตวั อกั ษร A ให้ LED น้นั ดบั ส่วนทเี่ ป็ นโค้ด Arduino ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง มขี ้อมลู เข้า ? ไม่ใช่ LED ติด ใช่ ใช่ LED ดบั ใช่ ใช่ A ? ไม่ใช่ ใช่ a ? ไม่ใช่
336 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 13 2 int dataIn = 0; 3 void setup(){ 4 Serial.begin(9600); 5 pinMode(LED,OUTPUT); 6} 7 void loop(){ 8 if (Serial.available() > 0) 9{ 10 dataIn = Serial.read(); 11 if (dataIn =='A') 12 digitalWrite(LED,HIGH); 13 if (dataIn =='a') 14 digitalWrite(LED,LOW); 15 } 16 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 กาหนดช่ือ LED ใหแ้ ทน 13 (ในวงจรจริง LED ตอ่ อยกู่ บั ขา D13) - บรรทดั ที่ 2 ประกาศตวั แปรสาหรับเก็บคา่ ขอ้ มูลท่ีรับเขา้ มาทางพอร์ตอนุกรม - บรรทดั ท่ี 8 ตรวจสอบวา่ มีขอ้ มูลเขา้ มาหรือไม่ - บรรทดั ท่ี 10 อา่ นค่าจากพอร์ตอนุกรมนาเขา้ มาเกบ็ ลงในตวั แปรที่เตรียมไว้ - บรรทดั ท่ี 11 ตรวจสอบคา่ ในตวั แปร (ขอ้ มูลท่ีรับเขา้ มา) มีคา่ เทา่ กบั ตวั อกั ษร a หรือไม่ - บรรทดั ท่ี 13 ถา้ คา่ ในตวั แปรมีค่าเทา่ กบั ตวั อกั ษร A ใหส้ ่งลอจิก 1 ออกพอร์ต - บรรทดั ท่ี 17 ถา้ คา่ ในตวั แปรมีค่าเท่ากบั ตวั อกั ษร a ใหส้ ่งลอจิก 0 ออกพอร์ต ส่วนทเี่ ป็ นโค้ด Visual Basic วตั ถุที่มีใหใ้ ชง้ านใน Visual Basic ในการทดลองที่ 1 มีดงั ตาราง วตั ถุ คาอธิบาย แสดงขอ้ ความ ป่ ุมกด ใชเ้ กบ็ รายการ พอร์ตสื่อสารอนุกรม ใชบ้ รรจุออปเจคตวั อ่ืน ๆ ใหเ้ ป็นกลุ่ม ดาเนินการออกแบบหนา้ ต่างโปรแกรมใชง้ านตามตอ้ งการโดยใช้ Visual Basic 2010 โดยใชว้ ตั ถุ ตามตารางที่กล่าวมาแลว้ จดั วางและปรับขนาดของวตั ถุตามตอ้ งการพร้อมท้งั แกไ้ ขขอ้ ความที่ปรากฏ หนา้ วตั ถุ การแกไ้ ขขอ้ ความใหค้ ลิกท่ีวตั ถุที่ตอ้ งการแลว้ จะแกค้ ่าไดท้ ่ีหนา้ ต่าง Properties ในหวั ขอ้ Text การทางานของโปรแกรมตอ้ งการให้ส่ง “A” เม่ือคลิกป่ ุม ON และให้ส่ง “a” เม่ือคลิกป่ ุม OFF แนวทาง ออกแบบและจดั วางเป็นดงั รูป
ใบงานที่ 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 337 รูปท่ี 4.27-5 หนา้ ต่างโปรแกรมท่ีออกแบบ วตั ถุที่ใชง้ าน 1. Form1 4. Bottom3 7. Label2 2. Bottom1 3. Bottom2 5. ListBox1 8. SerialPort 6. Label1 9. GroubBox1 โค้ดโปรแกรมในวตั ถุ Object Code Form1 ListBox1.Items.Clear() For Each sp As String In My.Computer.Ports.SerialPortNames Bottom1 ListBox1.Items.Add(sp) ListBox1 Next Bottom2 Label1.Text = ListBox1.Items.Item(0) Bottom3 ListBox1.Items.Clear() For Each sp As String In My.Computer.Ports.SerialPortNames ListBox1.Items.Add(sp) Next Label1.Text = ListBox1.SelectedItem SerialPort1.PortName = ListBox1.SelectedItem SerialPort1.PortName = Label1.Text SerialPort1.BaudRate = 9600 SerialPort1.Open() SerialPort1.Write(\"A\") SerialPort1.Close() SerialPort1.PortName = Label1.Text SerialPort1.BaudRate = 9600 SerialPort1.Open() SerialPort1.Write(\"a\") SerialPort1.Close() รายละเอยี ดโค้ดโปรแกรม - Form1 วตั ถุ Form1 ถูกกระตุน้ ใหท้ างานเมื่อเปิ ดโปรแกรมโดยมีงานใหท้ าตามคาสง่ั คือ ลา้ งขอ้ มูลในช่องรายการแสดงพอร์ตอนุกรม คน้ หาพอร์ตอนุกรมท่ีคอมพวิ เตอร์มองเห็น ทาการเลือกรายการแรกไปแสดงผลท่ี Label1
338 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - Bottom1 วตั ถุน้ีเป็ นป่ ุมกดเมื่อผูใ้ ช้งานตอ้ งการให้คอมพิวเตอร์คน้ หาพอร์ตอนุกรมอีกคร้ัง ซ่ึง คอมพิวเตอร์จะมีรายการพอร์ตอนุกรมเพิ่มลดไดเ้ มื่อผูใ้ ชง้ านเสียบอุปกรณ์ท่ีสื่อสารทางพอร์ต อนุกรมกบั คอมพิวเตอร์ เม่ือกดป่ ุมคาสั่งท่ีใหท้ างานคือ ลา้ งขอ้ มูลในช่องรายการแสดงพอร์ตอนุกรม คน้ หาพอร์ตอนุกรมท่ีคอมพิวเตอร์มองเห็น - ListBox1 วตั ถุ ListBox1 ถูกกระตุน้ เมื่อผูใ้ ช้งานมีการคลิกรายการที่ปรากฏในช่องรายการของ ListBox คาสั่งที่ใหท้ างานคือ คดั ลอกรายการท่ีผใู้ ชค้ ลิกเลือกไปแสดงที่ Label1 - Bottom2 เป็ นวตั ถุท่ีผใู้ ชต้ อ้ งการส่งตวั อกั ษร A ออกทางพอร์ตอนุกรมเมื่อมีการคลิกท่ีป่ ุมโดยมี งานใหท้ าตามคาสัง่ คือ กาหนดช่ือพอร์ตโดยนามาจาก Label1 กาหนดความเร็วสื่อสาร เปิ ดพอร์ต ส่งขอ้ ความเป็นตวั อกั ษร A ปิ ดพอร์ต - Bottom3 เป็ นวตั ถุที่ผใู้ ชส้ ่งตวั อกั ษรเช่นเดียวกบั Bottom2 เพียงแต่ส่งตวั อกั ษร a ดงั น้นั โคด้ จึงมี ลกั ษณะเหมือนกนั ยกเวน้ คาส่งั ที่ส่งตวั อกั ษรเท่าน้นั ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองแกไ้ ขโปรแกรมใหส้ ามารถรับค่าจากตวั อกั ษรอื่น ๆ ได้ การทดลองท่ี 2 ส่งขอ้ มูลจากการคา่ จากขาแอนะลอกส่งไปแสดงผลที่คอมพวิ เตอร์ผา่ นพอร์ตอนุกรม ส่วนทเี่ ป็ นโค้ด Arduino ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง อ่านคา่ จากพอร์ตแอนะลอก ปรบั ค่าและส่งออกพอร์ ตอนุกรม หน่วงเวลา
ใบงานที่ 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 339 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 void setup() { 2 Serial.begin(9600); 3} 4 void loop() { 5 int Value = analogRead(A0); 6 Value = map(Value, 0, 1023, 0, 255); 7 Serial.println(Value); 8 delay(100); 9} รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 2 ประกาศตวั แปรสาหรับเกบ็ คา่ ขอ้ มูลที่รับเขา้ มาทางพอร์ตอนุกรม - บรรทดั ท่ี 5 อ่านคา่ จากพอร์ตแอนะลอกเขา้ มาเก็บลงในตวั แปรท่ีเตรียมไว้ - บรรทดั ที่ 6 ปรับยา่ นตวั เลขของคา่ ที่อ่านได้ - บรรทดั ที่ 7 ส่งคา่ หลกั จากปรับยา่ นออกพอร์ตอนุกรม ส่วนทเี่ ป็ นโค้ด Visual Basic การออกแบบหนา้ ต่างโปรแกรมในการทดลองที่ 2 มีลกั ษณะคลา้ ยกบั การทดลองที่ 1 เพยี งแต่ไม่ มีวตั ถุท่ีใชใ้ นการส่งขอ้ มูลแตม่ ีวตั ถุในการแสดงขอ้ มูลมาแทน วถั ตุท่ีใชด้ งั ตาราง วตั ถุ คาอธิบาย แสดงขอ้ ความ ป่ ุมกด ใชเ้ กบ็ รายการ พอร์ตสื่อสารอนุกรม ใชบ้ รรจุออปเจคตวั อ่ืน ๆ ใหเ้ ป็นกลุ่ม เป็นตวั จดั การและควบคุมท่ีเกี่ยวกบั เวลา ดาเนินการออกแบบหนา้ ต่างโปรแกรมใชง้ านตามตอ้ งการโดยมีลกั ษณะคลา้ ยกบั การทดลองที่ 1 เพยี งแตก่ ารทดลองน้ีไมม่ ีป่ ุมส่งคา่ ออกพอร์ตและเพ่ิมส่วนที่แสดงผลขอ้ มูลที่เขา้ มาทางพอร์ตอนุกรม รูปท่ี 4.27-6 หนา้ ต่างโปรแกรมที่ออกแบบ
340 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] รูปท่ี 4.27-7 คา่ ท่ีตอ้ งกาหนดใน Timer1 เป็นค่าเริ่มตน้ วตั ถุท่ีใชง้ าน 1. Form1 4. ListBox1 7. SerialPort 10.Label3 2. Bottom1 11.GroupBox2 3. Bottom2 5. Label1 8. Timer1 6. Label2 9. GroubBox1 โค้ดโปรแกรมในวตั ถุ Object Code Form1 ListBox1.Items.Clear() Bottom1 For Each sp As String In My.Computer.Ports.SerialPortNames ListBox1 Bottom2 ListBox1.Items.Add(sp) Next Timer1 Label1.Text = ListBox1.Items.Item(0) ListBox1.Items.Clear() For Each sp As String In My.Computer.Ports.SerialPortNames ListBox1.Items.Add(sp) Next Label1.Text = ListBox1.SelectedItem SerialPort1.PortName = ListBox1.SelectedItem If Button2.Text = \"Connect\" Then Button2.Text = \"Connected\" SerialPort1.PortName = Label1.Text SerialPort1.BaudRate = 9600 SerialPort1.Open() Timer1.Start() Else Button2.Text = \"Connect\" Label3.Text = \"----\" SerialPort1.Close() Timer1.Stop() End If If SerialPort1.BytesToRead > 0 Then Dim ReadValue() As String = Split(SerialPort1.ReadLine, \",\") Label3.Text = ReadValue(0) End If SerialPort1.DiscardInBuffer() รายละเอยี ดโค้ดโปรแกรม - Form1 วตั ถุ Form1 ถูกกระตุน้ ใหท้ างานเม่ือเปิ ดโปรแกรมโดยมีงานใหท้ าตามคาสง่ั คือ ลา้ งขอ้ มูลในช่องรายการแสดงพอร์ตอนุกรม
ใบงานท่ี 4.27 การเขียนโปรแกรมควบคุมผา่ นพอร์ตอนุกรมดว้ ย Visual Basic 341 คน้ หาพอร์ตอนุกรมที่คอมพวิ เตอร์มองเห็น ทาการเลือกรายการแรกไปแสดงผลที่ Label1 - Bottom1 วตั ถุน้ีเป็ นป่ ุมกดเมื่อผูใ้ ช้งานตอ้ งการให้คอมพิวเตอร์คน้ หาพอร์ตอนุกรมอีกคร้ัง ซ่ึง คอมพิวเตอร์จะมีรายการพอร์ตอนุกรมเพิ่มลดไดเ้ ม่ือผูใ้ ชง้ านเสียบอุปกรณ์ที่ส่ือสารทางพอร์ต อนุกรมกบั คอมพวิ เตอร์ เม่ือกดป่ ุมคาส่ังท่ีใหท้ างานคือ ลา้ งขอ้ มูลในช่องรายการแสดงพอร์ตอนุกรม คน้ หาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น - ListBox1 วตั ถุ ListBox1 ถูกกระตุน้ เมื่อผูใ้ ชง้ านมีการคลิกรายการท่ีปรากฏในช่องรายการของ ListBox คาสั่งท่ีใหท้ างานคือ คดั ลอกรายการท่ีผใู้ ชค้ ลิกเลือกไปแสดงที่ Label1 - Bottom2 เป็นวตั ถุที่ผใู้ ชต้ อ้ งการเชื่อมตอ่ หรือตดั การเชื่อมตอ่ กบั พอร์ตอนุกรมเพ่ืออ่านขอ้ มูล เม่ือตอ้ งการเช่ือมต่อใหท้ าการเปิ ดพอร์ตและเปิ ดการทางานของ Timer1 เม่ือตอ้ งการตดั การเช่ือมตอ่ ใหท้ าการปิ ดพอร์ตและปิ ดการทางานของ Timer1 - Timer1 เป็นวตั ถุที่ถูกกระตุน้ การทางานเมื่อครบเวลาท่ีต้งั ไวใ้ นการทดลองน้ีต้งั ไวท้ ่ี 50mS คาสง่ั ที่ใหท้ างานในโปรแกรมคือ ตรวจสอบวา่ มีขอ้ มูลใหมเ่ ขา้ มายงั พอร์ตอนุกรมหรือไม่ หากมีขอ้ มูลเขา้ ใหอ้ า่ นไปเก็บในตวั แปร นาขอ้ มูลข้ึนแสดงผล ลา้ งขอ้ มูลในบฟั เฟอร์ ทดลองการทางาน 1. ทดลองดว้ ยวงจรจริง 2. ทดลองแกไ้ ขโปรแกรมใหส้ ามารถรับคา่ จากตวั อกั ษรอ่ืน ๆ ได้ 9. สรุปผลการปฏบิ ตั ิงาน
342 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมควบคุมการติดดับของ LED จานวน 4 ตัวโดยสั่งมาจากโปรแกรม คอมพวิ เตอร์ที่สร้างข้ึนดว้ ยโปรแกรม Visual Basic วงจรเชื่อมต่อเป็นดงั รูป ARDUINO R1-R4 LED1-LED3 220 D2 D3 D4 D5 GND รูปที่ 4.27-8 วงจรทดลองสาหรับงานท่ีมอบหมาย 2. เขียนโปรแกรมแสดงสถานการกดสวิตช์จานวน 4 ตวั โดยแสดงผลท่ีโปรแกรมคอมพิวเตอร์ ที่สร้างข้ึนดว้ ยโปรแกรม Visual Basic วงจรเช่ือมต่อเป็นดงั รูป ARDUINO SW1 R1-R4 SW2 220 SW3 SW4 D9 D10 D11 D12 GND รูปท่ี 4.27-9 วงจรทดลองสาหรับงานท่ีมอบหมาย 3. เขียนโปรแกรมควบคุมการติดดบั ของ LED และแสดงสถานการกดสวิตช์จานวน 4 ตวั โดย ใชโ้ ปรแกรมคอมพวิ เตอร์ท่ีสร้างข้ึนดว้ ยโปรแกรม Visual Basic วงจรเชื่อมต่อเป็นดงั รูป ARDUINO SW1 R1-R4 R5-R8 LED1-LED3 SW2 220 220 SW3 SW4 D9 D2 D10 D3 D11 D4 D12 D5 GND รูปท่ี 4.27-10 วงจรทดลองสาหรับงานที่มอบหมาย
ใบงานที่ 4.28 การประยกุ ตก์ ารแสดงผลท่ี 7 Segment 4 Digit กบั เซนเซอร์ต่าง ๆ 343 ใบงานที่ 4.28 การประยุกต์การแสดงผลท่ี 7 Segment 4 Digit กบั เซนเซอร์ต่าง ๆ 1. จุดประสงค์ทวั่ ไป เพื่อใหส้ ามารถประยกุ ตก์ ารแสดงผลท่ี 7 Segment 4 Digit กบั เซนเซอร์ต่าง ๆ ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีประยกุ ตก์ ารแสดงผลท่ี 7 Segment 4 Digit กบั เซนเซอร์ต่าง ๆ ได้ 2. บอกข้นั ตอนการต่อวงจรเพอื่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 4 ตวั 2.1 Potentiometer 10k 1 ตวั 2.5 LED 3mm 1 ตวั 2.6 ตวั ทา้ นทาน 220 ohm 1 ตวั 2.2 Thermistor NTC 10k 1 ตวั 2.7 ตวั ทา้ นทาน 4.7k 2.8 ตวั ทา้ นทาน 10k 1 เส้น 2.3 IC DS18B20 1 ตวั 1 ชุด 3.5 สายเชื่อมต่อ USB (Mini) 1 เครื่อง 2.4 IC LM35 1 ตวั 3.6 สายเชื่อมต่อวงจร 3.7 คอมพิวเตอร์ 3. อุปกรณ์ร่วมอื่น ๆ 3.1 บอร์ด Arduino Nano 3.0 1 ตวั 3.2 7-Segment 4 Digit 1 ตวั 3.3 โมดูลวดั อุณหภูมิ DHT22 1 ตวั 3.4 โมดูลอลั ตร้าโซนิค HC-SR04 1 ตวั 4. ลาดบั ข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
344 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การประยุกตใ์ ชง้ านในใบงานน้ีเป็ นการเปล่ียนเป้าหมายการแสดงผลจากเดิมในใบงานที่ 4.5 ถึง ใบงานท่ี 4.12 ท่ีเป็นการอา่ นคา่ จากเซนเซอร์แบบต่าง ๆ แลว้ นาผลมาคานวณ (หรือนามาใชไ้ ดเ้ ลยในบาง ใบงาน) ไปแสดงผลผ่านทางจอคอมพิวเตอร์ผ่านทางการส่ือสารทางพอร์ตอนุกรมซ่ึงการดาเนินการ ดงั กล่าวเป็ นการเขียนโคด้ โปรแกรมเพื่อใชท้ ดสอบผลการทางานกบั เซนเซอร์ต่าง ๆ ในเบ้ืองตน้ ซ่ึงไม่ ตอ้ งต่อตวั แสดงผลอ่ืน ๆ สาหรับใบงานน้ีเป็นการเปลี่ยนเป้าหมายจากการแสดงผลจากจอคอมพวิ เตอร์มา เป็น 7 Segment 4 Digit 6. วงจรทใ่ี ช้ทดลอง วงจรเพ่อื ใชท้ ดลองในใบงานเป็นการทดลองจากเซนเซอร์ท้งั 6 แบบโดยแสดงผลที่ 7 Segment 4 Digit วงจรท่ีใชท้ ดลองมีดงั น้ี 1. วงจรท่ีใชเ้ ซนเซอร์เป็นตวั ตา้ นทานปรับค่าได้ 2. วงจรท่ีใชเ้ ซนเซอร์วดั อุณหภูมิเป็นเทอร์มิสเตอร์ 3. วงจรที่ใชเ้ ซนเซอร์วดั อุณหภูมิเป็นไอซี LM35 4. วงจรที่ใชเ้ ซนเซอร์วดั อุณหภูมิเป็นไอซี DS18B20 5. วงจรท่ีใชเ้ ซนเซอร์เป็น DHT22 6. วงจรที่ใชเ้ ซนเซอร์เป็น Ultrasonic วงจรทใ่ี ช้เซนเซอร์เป็ นตวั ต้านทานปรับค่าได้ D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 R4-R11 220 SW1 VCC LTC-4727JS RST AVCC R12-R15 C1 1 D13 19 1k 14 ab 0.1uF D1(TXD) D12 18 16 cd 3 D0(RXD) D11 17 13 ef 2 D10 16 3 dgp 15 5 D9 14 11 D8 13 15 D7 12 7 D6 USB to UART (TTL Level) R2,R3 1268 1k Q1 DTR BC547 RXD D5 11 Q2 TXD BC547 +5V Q3 GND BC547 3V3 Q4BC547 D4 6 D3 5 D2 4 VCC X1 9 XTAL1 A5 28 16MHz 10 XTAL2 C2,C3 10k 22pF GND 8,22 รูปท่ี 4.28-1 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
ใบงานที่ 4.28 การประยกุ ตก์ ารแสดงผลที่ 7 Segment 4 Digit กบั เซนเซอร์ต่าง ๆ 345 ARDUINO R1-R8 LTC-4727JS 220 VCC D13 14 ab 10k D12 R91-kR12 16 cd D11 13 e D10 3 f 5 g D9 11 dp D8 15 D7 7 D6 A5 1268 Q1 D5 BC547 Q2BC547 D4 Q3 BC547 D3 Q4 BC547 D2 GND รูปที่ 4.28-2 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.28-3 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน การทดลองท่ี 1 เขียนโปรแกรมแสดงคา่ ที่อ่านไดจ้ ากโพเทนธิโอมิเตอร์ ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กา นดคา่ เริม่ ต้นต่าง ๆ อ่านค่าจาก POT แสดงค่าทอ่ี ่านได้
346 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <send2seg.h> 2 #define POT A5 3 byte digitPins[] = {2,3,4,5}; // LSB to MSB 4 byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6}; // seg a to g and dp 5 void setup(){ 6 send2seg::set(1, 4, digitPins, segmentPins); // initialize 7} 8 void loop(){ 9 int value=analogRead(POT); 10 send2seg::loadValue(value,0); 11 delay(100); 12 } ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเปลี่ยนแปลงค่าโพเทนธิโอมิเตอร์แลว้ สังเกตผล วงจรทใี่ ช้เซนเซอร์เป็ นเทอร์มสิ เตอร์วดั อณุ ภูมิ D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 R4-R11 LTC-4727JS 220 SW1 1 VCC D13 19 14 ab RST AVCC D12 18 R12-R15 16 cd D11 17 1k 13 ef C1 D10 16 3 gdp 0.1uF 15 5 D9 14 11 D8 13 15 D7 12 7 D6 USB to UART (TTL Level) R2,R3 1268 1k 3 Q1 DTR 2 BC547 RXD D1(TXD) D5 11 Q2 TXD D0(RXD) D4 6 BC547 +5V D3 5 Q3 GND D2 4 BC547 3V3 Q4BC547 VCC X1 9 XTAL1 A5 28 R16 16MHz 10 XTAL2 10k C2,C3 NTC 22pF GND T Thermistor 10k 8,22 รูปที่ 4.28-4 วงจรท่ีใชไ้ อซี AVR ในการทดลอง ARDUINO R1-R8 LTC-4727JS 220 VCC D13 14 a D12 R91-kR12 16 b D11 13 cd D10 3 ef 5 g D9 11 dp D8 15 D7 7 D6 1R013k NTC 1268 T1h0ekrmistor A5 Q1 T BC547 D5 Q2BC547 Q3 D4 BC547 Q4 D3 BC547 GND D2 รูปที่ 4.28-5 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445