The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by Thidacha Saengjan, 2023-07-17 10:04:52

ใบความรู้

ใบความรู้

ภาพที่ 6.2 โครงสรางของ LED แสดงผล 7 สวน การตอใชงานแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแอโนดรวมกับไมโครคอนโทรลเลอร Arduino ทำไดโดยการนำเอาขาควบคุม a, b, c, d, e, f, g และ dot ไปตอเขากับพอรตดิจิตอลของไมโครคอนโทรลเลอร Arduino ไดทันที สวนขาคอมมอน (Common) นำไปตอที่ไฟบวก VCC หรือ +5V ภาพที่ 6.3 การตอใชงาน Arduino กับแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแอโนด การสงขอมูลให LED 7-Segment ชนิดคอมมอนแอโนด แสดงตัวเลข 0-9


2.2 การตอใชงาน Arduino กับแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแคโนด แอลอีดีแสดงผล 7 สวนชนิดคอมมอนแคโทด (Common Cathode) เปนการนำเอาไดโอด เปลงแสง จำนวน 8 ตัวมาตอเขาดวยกันโดยโดยขาแคโทดของไดโอดเปลงแสงทั้ง 8 ตัวมาตอรวมกันเปนขาคอมมอน (Common) สวนขาแอโนดของไดโอดเปลงแสงแตละตัวถูกตอเปนขาควบคุมเพื่อใหไดโอดเปลงแสงติดเปนตัวเลขตางๆ กัน ชื่อเรียก ของขาควบคุมมีดังตอไปนี้a, b, c, d, e, f, g และ dot Common ภาพที่ 6.4 รูปรางและโครงสรางของ LED แสดงผล 7 สวน การตอใชงานแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแคโทดรวมกับไมโครคอนโทรลเลอร Arduino ทำ ไดโดยการนำเอาขาควบคุม a, b, c, d, e, f, s และ dot ปตอเขากับพอรตดิจิตอลของไมโครคอนโทรลเลอร Arduino ไดทันทีสวนขาคอมมอน (Common) นำไปตอที่ไฟลบหรือกราวด (GND) ภาพที่ 6.5 การตอใชงาน Arduino กับแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแคโทด 2.3 ภาษาซีสำหรับไมโครคอนโทรลเลอร Arduino การตอใชงานแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแอโนดรวมกับไมโครคอนโทรลเลอร Arduino ทำ ไดโดยการนำเอาขาควบคุม a, b, c, d, e, f, g และ dot ไปตอเขากับพอรตดิจิตอลของไมโครคอนโทรลเลอรArduino ไดทันที สวนขาคอมมอน (Common) นำไปตอที่ไฟบวก VCC หรือ +5V ภาพที่ 6.6 การตอใชงาน Arduino กับแอลอีดีแสดงผล 7


การสงขอมูลให LED 7-Segment ชนิดคอมมอนแคโทด แสดงตัวเลข 0-9


แบบฝกหัดหนวยที่ 6 เรื่อง... Arduino กับแอลอีดีแสดงผล 7 ตอนที่ 1 ใหนักเรียนทำเครื่องหมายกากบาท (X) ลงบนคำตอบที่ถูกที่สุดเพียงคำตอบเดียว 1. แอลอีดีแสดงผล 7 สวนแบงออกเปนกี่ชนิด ก. 1 ข. 2 ค. 3 ง. 4 2. แอลอีดีแสดงผล 7 สวน มีไดโอดเปลงแสง ทั้งหมดกี่ดวง ก. 6 ดวง ข. 7 ดวง ค. 8 ดวง ง. 9 ดวง จากรูปขางลาง ใชในคำถามขอที่ 3 - 6 3. จากรูปหมายเลข 3 มีชื่อเซ็กเมนตวา ก. เซ็กเมนต d ข. เซ็กเมนต f ค. เซ็กเมนต b ง. เซ็กเมนต g 4. จากรูปหมายเลข 4 มีชื่อเซ็กเมนตวา ก. เซ็กเมนต g ข. เซ็กเมนต b ค. เซ็กเมนต f ง. เซ็กเมนต d 5. จากรูปหมายเลข 5 มีชื่อเซ็กเมนตวา ก. เซ็กเมนต d ข. เซ็กเมนต b ค. เซ็กเมนต f ง. เซ็กเมนต g 6. จากรูปหมายเลข 6 มีชื่อเซ็กเมนตวา ก. เซ็กเมนต g ข. เซ็กเมนต f ค. เซ็กเมนต b ง. เซ็กเมนต d 7. แอลอีดีแสดงผล 7 สวนชนิดคอมมอนแอโนด ควรตอขาคอมมอนอยางไร ก. ตอลง GND ข. ตอไปลบ 5 โวลต ค. ตอไฟบวก 5 โวลต ง. ตอกับขา CLOCK 8. แอลอีดีแสดงผล 7 สวน ชนิดคอมมอนแอโนด ตองการใหแสดงผลเปนตัวเลข 3 ตองสงขอมูลไปที่ เอาตพุตเปนเลขฐานสิบหกคาเทาใด ก. F9 ข. 92 ค. A4 ง. B0 9. แอลอีดีแสดงผล 7 สวนชนิดคอมมอนแคโทด ควรตอขาคอมมอนแบบใด ก. ตอลง GND ข. ตอไปลบ 5 โวลต ค. ตอไฟบวก 5 โวลต ง. ตอกับขา CLOCK 10. แอลอีดีแสดงผล 7 สวน ชนิดคอมมอนแคโทด ตองการใหแสดงผลเปนตัวเลข 3 ตองสงขอมูลไปที่ เอาตพุตเปนเลขฐานสิบหกคาเทาใด ก. 7D ข. 66 ค. 4F ง. 6


แบบฝกหัดหนวยที่ 6 เรื่อง... Arduino กับแอลอีดีแสดงผล 7 ตอนที่ 2 ใหนักเรียนตอบคำถามตอไปนี้ใหถูกตอง 1. จงอธิบายการตอการตอใชงาน Arduino กับแอลอีดีแสดงผล 7 สวนชนิดคอมมอนแอโนด ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. 2. จงอธิบายการแกปญหาโดยฮารดแวร ดีเบาว (Hardware Debouncing) พรอมเขียนวงจร ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………….


ใบความรู หนวยที่ 7 Arduino กับโมดูลแสดงผล LCD 1. หัวขอเรื่อง 2. สาระสำคัญ 2.1 โครงสรางโดยทั่วไปของ LCD โครงสรางของ LCD ทั่วไปจะประกอบขึ้นดวยแผนแกว 2 แผนประกบกันอยู โดยเวนชองวางตรงกลาง ไว6-10 ไมโครเมตร ผิวดานในของแผนแกวจะเคลือบดวยตัวนำไฟฟาแบบใสเพื่อใชแสดงตัวอักษร ตรงกลางระหวาง ตัวนำไฟฟาแบบใสกับผลึกเหลว มีชั้นของสารที่ทำใหโมเลกุลของผลึกรวมตัวกันในทิศทางที่แสงสองมากระทบ เรียกวา Alignment Layer และผลึกเหลวที่ใชโดยทั่วไปจะเปนแบบ Magnetic โดย LCD สามารถแสดงผลใหเรามองเห็นได ทั้งหมด 3 แบบดวยกันคือ 2.1.1 แบบใชการสะทอนแสง (Reflective Mode) LCD แบบนี้ใชสารประเภทโลหะเคลือบอยูที่แผนหลังของ LCD ซึ่ง LCD ประเภทนี้เหมาะกับการนำมาใช งานใน ที่ที่มีแสงสวางเพียงพอ 2.1.2 แบบใชการสงผาน (Transitive Mode) LCD แบบนี้วางหลอดไฟไวดานหลังจอ เพื่อทำใหการอานคาที่แสดงผลทำไดชัดเจน 2.1.3 แบบสงผานและสะทอน (Transflective Mode) LCD แบบนี้เปนการนำเอาขอดีของจอแสดงผล LCD ทั้ง 2 แบบมารวมกัน ในบทนี้จะกลาวถึงจอ LCD ที่ แสดงผลเปนอักขระหรือตัวอักษร ตามทองตลาดทั่วไปจะมีหลายแบบดวยกันมีทั้ง 16 ตัวอักษร 20 ตัวอักษรหรือ มากกวา และจำนวนบรรทัดจะมีตั้งแต 1 บรรทัด 2 บรรทัด 4 บรรทัดหรือมากกวา ตามแตความตองการและลักษณะ ของงานที่ใช หรืออาจจะมีแบบสั่งทำเฉพาะงานก็เปนได ในบทนี้จะยกตัวอยางจอ LCD ขนาด 16x2 Character หรือที่ นิยมเรียกกันวาจอ LCD 16 ตัวอักษร 2 บรรทัด สามารถหาซื้อไดงายและมีราคาไมสูง เหมาะสมกับการใชงานแสดงผล ไมมากในหนาจอเดียวจอ LCD 16x2 Character ที่นิยมวางจำหนายจะมีอยู 2 แบบดวยกันคือ LCD แบบปกติที่


เชื่อมตอแบบขนาน (Parallel) และ LCD แบบที่เชื่อมตออนุกรม (Serial) แบบ I2C โดยทั้ง 2 แบบตัวจอมีลักษณะ เดียวกันเพียงแตแบบ I2C จะมีบอรดเสริมทำใหสื่อสารแบบ I2C ไดเชื่อมตอไดสะดวกขึ้น ภาพที่ 7.1 จอ LCD 16x2 Character (Parallel) (ที่มา www.Thaieasyelec.com) ภาพที่ 7.2 จอ LCD 16x2 Character (I2C) (ที่มา www.Thaieasyelec.com) 2.2 การเชื่อมตอสัญญาณขาขอมูลระหวาง Arduino กับ LCD Controller ในการควบคุมหรือสั่งงาน โดยทั่วไปจอ LCD จะมีสวนควบคุม (Controller) อยูในตัวแลว ผูใช สามารถสงรหัสคำสั่งสำหรับควบคุมการทำงานของจอ LCD (I2C) เชนเดียวกันกับจอ LCD แบบธรรมดา พูดงายๆ คือ รหัสคำสั่งที่ใชในการควบคุมนั้นเหมือนกัน แตตางกันตรงที่รูปแบบในการรับสงขอมูล ในบทความนี้เราจะมาพูดถึงจอ LCD 16x2 ที่มีการสงขอมูลรูปแบบ I2C ที่ใชขาเพียง 4 ขาที่ใชในการเชื่อมตอเทานั้น ในการควบคุมหรือสั่งงานจอ LCD Controller ของจอนี้เปน Hitachi เบอร HD44780 และขาในการ เชื่อมตอระหวาง LCD กับ Arduino มีดังนี้ 1) GND เปนกราวดใชตอระหวาง Ground ของ Arduino กับ LCD 2) VCC เปนไฟเลี้ยงวงจรที่ปอนใหกับ LCD ขนาด +5VDC 3) VO ใชปรับความสวางของหนาจอ LCD 4) RS ใชบอกให LCD Controller ทราบวา Code ที่สงมาทางขา Data เปนคำสั่งหรือขอมูล 5) R/W ใชกำหนดวาจะอานหรือเขียนขอมูลกับ LCD Controller


6) E เปนขา Enable หรือ Chips Select เพื่อกำหนดการทำงานใหกับ LCD Controller 7) DB0-DB7 เปนขาสัญญาณ Data ใชสำหรับเขียนหรืออานขอมูล/คำสั่ง กับ LCD Controller วิธีการสั่งงานจะแตกตางกันไปโดย LCD Controller สามารถรับรหัสคำสั่งจาก Arduino ไดจากสัญญาณ RS R/W และ DB0-DB7 ในขณะที่สัญญาณ E มีคา Logic เปน “1” ซึ่งสัญญาณเหลานี้จะใชรวมกันเพื่อกำหนด เปนรหัสคำสั่งสำหรับสั่งงาน LCD โดยหนาที่ของแตละสัญญาณสรุปไดดังนี้ 1) E เปนสัญญาณ Enable เมื่อมีคาเปน “1” เปนการบอกให LCD ทราบวาอุปกรณภายนอก ตองการติดตออานหรือเขียนขอมูล “0” ให LCD ไมสนใจสัญญาณ RS R/W และ DB7-DB0 2) RS เปนสัญญาณสำหรับก าหนดให LCD ทราบวาอุปกรณภายนอกตองการติดตอกับ LCD ในขณะ นั้นเปนรหัสคำสั่งหรือขอมูล โดย 3) R/W เปนสัญญาณสำหรับบอกให LCD ทราบวาอุปกรณภายนอกตองการอานหรือเขียนกับ LCD โดย R/W = “0” หมายถึง เขียน R/W = “1” หมายถึง อาน 4) DB0-DB7 เปนสัญญาณแบบ 2 ทิศทาง โดยจะสัมพันธกับสัญญาณ R/W ใชสำหรับรับคำสั่งและ ขอมูลระหวาง LCD กับอุปกรณภายนอก โดยถา R/W = “0” สัญญาณ DB7-DB0 จะสงจากอุปกรณภายนอกมาที่ LCD แตถา R/W = “1” สัญญาณ DB7-DB0 จะสงจาก LCD ไปยังอุปกรณภายนอก การเชื่อมตอสัญญาณขาขอมูล ระหวาง Arduino กับ LCD Controller สามารถทำได 2 ลักษณะ คือ การเชื่อมตอแบบ 8 บิต (DB0-DB7) และการ เชื่อมตอแบบ 4 บิต (DB4-DB7) ทั้งสองแบบแตกตางกันเพียงจำนวนขาที่ใชคือ 8 หรือ 4 ขา และยังสามารถทำงานได เหมือนกัน อยางที่แนนอนในการสงขอมูลแบบ 4 ขา ผลยอมทำไดชากวา 8 ขา แตไมไดชามากจนสังเกตไดดวยสายตา ในการตอกับ Arduino นั้นจึงนิยมตอเพียง 4 ขาหรือ 4 บิตเทานั้น เพื่อเปนการประหยัดขาในการตอ ใชงานไปไวตอกับอุปกรณอื่น ตัวอยางเชน Arduino UNO R3 นั้นมีขาใหใชงานคอนขางนอย ภาพที่ 7.3 ขาที่ใชในการเชื่อมตอกับ Arduino UNO R3 (ที่มา www.Thaieasyelec.com)


ภาพที่ 7.4 ขาที่ใชในการเชื่อมตอกับ Arduino UNO R3 (ที่มา www.Thaieasyelec.com) ภาพที่ 7.5 การรับ-สงขอมูลแบบ I2C BUS (ที่มา www.Ioxhop.com) ลำดับขั้นตอนการการรับ-สงขอมูลแบบ I2C BUS มีดังนี้ 1. MCU จะทำการสงสถานะเริ่มตน (START Conditions) เพื่อแสดงการขอใชบัส 2. แลวตามดวยรหัสควบคุม (Control Byte) ซึ่งประกอบ ดวยรหัสประจำตัวอุปกรณ Device ID, Device Address และ Mode ในการเขียนหรืออานขอมูล 3. เมื่ออุปกรณรับทราบวา MCU ตองการจะติดตอดวย ก็ตองสงสถานะรับรู (Acknowledge) หรือแจงให MCU รับรูวาขอมูลที่ไดสงมามีความถูกตอง 4. เมื่อสิ้นสุดการสงขอมูล MCU จะตองสงสถานะสิ้นสุด (STOP Conditions) เพื่อบอกกับอุปกรณวาสิ้นสุด การใชบัส 2.3 การเชื่อมตอ Arduino กับจอ Character LCD 1) การเชื่อมตอแบบขนาน - เปนการเชื่อมตอจอ LCD เขากับบอรด Arduino โดยตรง โดยจะ แบงเปนเชื่อมตอแบบ 4 บิต และการเชื่อมตอแบบ 8 บิต ใน Arduino จะนิยมเชื่อมตอแบบ 4 บิต เนื่องจากใชตอนอย กวา 2) การเชื่อมตอแบบอนุกรม - เปนการเชื่อตอกับจอ LCD ผานโมดูลแปลงรูปแบบการเชื่อมตอกับจอ LCD จากแบบขนานมาเปนการเชื่อมตอแบบอื่นที่ใชสายนอยกวา เชน การใชโมดูล I2C Serial Interface จะเปนการ นำโมดูลเชื่อมเขากับตัวจอ LCD แลวใชบอรด Arduino เชื่อมตอกับบอรดโมดูลผานโปรโตคอล I2C ท าใหใชสายเพียง 4 เสนก็สามารถทำใหหนาจอแสดงผลขอความตางๆออกมาได


ภาพที่ 7.6 รายละเอียดการตอขาจอ LCD 16x2 Character (I2C) (ที่มา www.Thaieasyelec.com) 2.3.1 การเชื่อมตอ Arduino กับจอ LCD แบบขนาน การเชื่อมตอแบบขนาน 4 บิต สามารถตอไดตามวงจรดานลางนี้ ภาพที่ 7.7 การใชงาน Character LCD กับ Arduino การเชื่อมตอแบบขนาน (ที่มา www.Ioxhop.com) เมื่อตอวงจรเรียบรอยแลวตอสาย USB เขากับบอรด Arduino จะเห็นกลองสีเหลี่ยมทั้งหมด 16 ตัว (หากเปนจอ 16x2) ในบรรทัดแรกหากไมพบกลองใหปรับความชัดไดจาก VR ที่ตออยูกับขา V0 ภาพที่ 7.8 ขาของจอ LCD 16x2 แบบขนาน (ที่มา www.Ioxhop.com) 2.3.2 การเชื่อมตอ Arduino กับจอ LCD แบบอนุกรม


จอ LCD ที่มีการเชื่อมแบบ I2C หรือเรียกอีกอยางวาการเชื่อมตอแบบ Serial เปนจอ LCD ธรรมดา ทั่วไปที่มาพรอมกับบอรด I2C Bus ที่ท าใหการใชงานไดสะดวกยิ่งขึ้นและมาพรอมกับ VR สำหรับปรับความเขมของ จอในรูปแบบ I2C ใชขาในการเชื่อมตอกับ Arduino เพียง 4 ขา (แบบ Parallel ใช16 ขา) ซึ่งท าใหใชงานไดงายและ สะดวกมากยิ่งขึ้น ภาพที่ 7.9 แสดงขาของจอ LCD 16x2 แบบอนุกรม (I2C) (ที่มา www.Ioxhop.com) ภาพที่ 7.10 แสดงขาของจอ LCD 16x2 แบบขนาน (ที่มา www.Ioxhop.com) สำหรับการเชื่อมตอสัญญาณระหวาง Arduino กับ LCD ที่มีบอรด I2C อยูแลวนั้น การสงขอมูลจาก Arduino ถูกสงออกมาในรูปแบบ I2C ไปยังบอรด I2C และบอรดจะมีหนาที่จัดการขอมูลใหออกมาในรูปแบบปกติ หรือแบบ Parallel เพื่อใชในการติดตอไปยังจอ LCD โดยที่รหัสค าสั่งที่ใชในการสั่งงานจอ LCD ยังคงไมตางกับจอ LCD ที่เปนแบบ Parallel โดยสวนใหญบอรด I2C จะเชื่อมตอกับตัวควบคุมของจอ LCD เพียง 4 บิตเทานั้น วงจร ภายในระหวางจอ LCD กับบอรด I2C นั้น มีการตอไวดังนี้


ภาพที่ 7.11 การเชื่อมตอระหวาง Arduino กับ LCD (I2C) (ที่มา www.Ioxhop.com) จากภาพที่ 7.11 วงจรจอ LCD และบอรด I2C ไดมีการเชื่อมตอขาสำหรับการรับสงขอมูลเปนแบบ 4 บิต ขาที่เชื่อมตอไวคือ ขา P4 > DB4, P5 > DB5, P6 > DB6, P7 > DB7 และขา P2 > E (Enable), P1 > R/W, P0 > RS รวมไปถึงตัวตานทานสำหรับปรับคาความเขมของตัวอักษร และ Switch Blacklight จากวงจรขาที่จำเปน ในการใชงานถูกเชื่อมตอเขากับตัวบอรด I2C และอุปกรณอิเล็กทรอนิกสเรียบรอยแลว ภาพที่ 7.12 โมดูล I2C Serial Interface Board Module (ที่มา www.Ioxhop.com) อีกลักษณะหนึ่งการเชื่อมตอระหวาง Arduino กับจอ LCD (I2C) แบบอนุกรมใชงานโมดูล I2C Serial Interface Board Module มาเชื่อมตอระหวาง Arduino กับจอ LCD วงจรที่เชื่อมตอจะเปนไปตามภาพที่ 7.12 (กรณี ใชบอรดรุนอื่นตองตอ SDA เขา A4 และ SCL เขากับ A5) ภาพที่ 7.13 การเชื่อมตอโมดูล I2C Serial Interface Board Module (ที่มา www.Ioxhop.com)


2.4 รายละเอียดคำสั่งในการสั่งงานระหวาง Arduino กับ จอ LCD คำสั่งในการควบคุมจอ LCD ของ Arduino นั้น ทาง Arduino.cc เขียนเปน Library มาใหเพื่อ สะดวกในการนำไปใชงาน หลังจากตอสายเสร็จเรียบรอย ขั้นตอนแรกในการเริ่มเขียนโปรแกรมคือการเรียกใช Library ของ LCD จากไฟลชื่อ LiquidCrystal.h ฟงกชั่น LiquidCrystal(); ใชประกาศขาที่ตองการสงขอมูลไปยังจอ LCD รูปแบบในการสั่งงานคือ - LiquidCrystal lcd(rs, enable, d4, d5, d6, d7) <<< ในกรณีใชงานแบบ 4 บิต - LiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) <<< ในกรณีใชงานแบบ 8 บิต - ใชแบบ 4 บิต คือ LiquidCrystal lcd(12, 11, 4, 5, 6, 7); ก็หมายถึงการเชื่อมตอ rs ที่ขา 12 , Enable ที่ขา 11 , และ DB4-DB7 ที่ขา 4-7 ของ Arduino ตามล าดับ ฟงกชั่น begin(); ใชก าหนดขนาดของจอ ใชขนาด 16 ตัวอักษร 2 บรรทัด จึงประกาศเปน lcd.begin (16, 2); ฟงกชั่น setCursor(); ใชกำหนดตำแหนงและบรรทัดของ Cursor เชน lcd.setCursor(0, 1); คือให เคอรเซอรไปที่ตำแหนงที่ 0 บรรทัดที่1 การนับตำแหนงเริ่มจาก 0 ดังนั้น LCD 16x2 มีตำแหนง 0 – 15 บรรทัด คือ 0 กับ 1 ฟงกชั่น print(); ใชกำหนดขอความที่ตองการแสดง เชน lcd.print("TEST"); คือใหแสดงขอความ “TEST” ออกทางหนาจอ LCD โปรแกรมที่ 7.1


รายละเอียดชุดคำสั่งที่ใชในการสั่งงานระหวาง Arduino กับจอ LCD คำสั่งที่ใชในการควบคุมจอ LCD ของ Arduino แบบ I2C นั้นไมตางจากจอ LCD แบบธรรมดา (Parallel) มากนัก ทั้งนี้ยังไดมีการพัฒนา Library I2C มา ใหใชงานไดอยางสะดวกมากยิ่งขึ้น 2.4 ฟงกชั่นสั่งงานจอ LCD lcd.clear() > ใชลางหนาจอ เมื่อมีตัวอักษรใดๆอยูบนหนาจอ จะถูกลางออกทั้งหมด lcd.home() > ใชปรับใหเคเซอรกลับไปอยูที่ตำแหนงแรกดานซาย เมื่อใชคำสั่ง lcd.print() จะไปเริ่มแสดงผล ทางดานบนซาย lcd.setCursor(ลำดับตัวอักษรนับจากทางซาย, บรรทัด) > ใชตั้งคาเคเซอร เชน lcd.setCursor(2, 0); หมายถึงเซ็ตเคเซอรไปตัวอักษรที่ 2 นับจากทางซาย และอยูบรรทัดแรก เมื่อใชคำสั่ง lcd.print() ตัวอักษรตัวแรกจะอยูล าดับที่ 3 นับจากทางซาย lcd.write(ขอมูลที่ตองการเขียนออกไป) > ใชสำหรับเขียนขอมูลออกไปทีละตัวอักษร lcd.print(ขอมูลที่ตองการใหเขียนออกไป [, รูปแบบขอมูล]) > ใชเขียนขอมูลออกไปทั้งขอความ lcd.cursor() > ใชสั่งใหแสดงเคอเซอรบนหนาจอ lcd.noCursor() > ใชสั่งใหไมแสดงเคเซอรบนหนาจอ lcd.display() > แสดงตัวอักษรบนหนาจอ lcd.noDisplay() > ปดการแสดงตัวอักษรในหนาจอ lcd.scrollDisplayLeft() > เลือนตัวอักษรไปทางซาย 1 ตัว lcd.scrollDisplayRight() > เลื่อนตัวอักษรไปทางขวา 1 ตัว lcd.autoscroll() > เลื่อนตัวอักษรไปทางขวาอัตโนมัติหากใชคำสั่ง lcd.print() หรือ lcd.write() เมื่อตัวอักษรเต็มหนาจอ


lcd.noAutoscroll() > ปดการเลื่อนตัวอักษรอัตโนมัติ lcd.leftToRight() > เมื่อใชคำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากซายไปขวา lcd.rightToLeft() > เมื่อใชคำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากขวาไปซาย โปรแกรมที่ 7.2


โปรแกรมที่ 7.3 2.5 การสรางตัวอักษรหรือใสรูปภาพลงจอ LCD นอกจากจะใชตัวอักษร ABCD .... ตัวเลข เครื่องหมายตางๆแลว ยังสามารถสรางตัวอักษรเองใหเปน ลักษณะของรูปภาพได เพื่อเพิ่มความเขาใจ และความสวยงามของการแสดงผลขอมูลบนหนาจอ การสรางตัวอักษร สามารถสรางไดจากลิ้ง : Maxpromer.github.io/LCD-Character-Creator/ อัพเดทเขา Arduino ภาพที่ 7.14 การสรางตัวอักษรหรือใสรูปภาพลงจอ LCD (ที่มา www.Maxpromer.github.io/LCD-Character-Creator/)


แบบฝกหัดหนวยที่ 7 เรื่อง... Arduino กับโมดูลแสดงผล LCD ตอนที่ 1 ใหนักเรียนทำเครื่องหมายกากบาท (X) ลงบนคำตอบที่ถูกที่สุดเพียงคำตอบเดียว 1. โมดูล LCD เปนอุปกรณที่ทำหนาที่ ก. รับคาอินพุต ข. เก็บคาตัวแปร ค. หนวยความจำ ง. แสดงผลขอมูล 2. ขอใดไมใช สวนประกอบภายในของโมดูล แสดงผล LCD ก. ภาคแสดงผล ข. ภาคควบคุม ค. ภาคเก็บขอมูล ง. ภาคขับ 3. LCD ยอมาจากคำวา ก. Liquid Crystal Delay ข. Liquid Crystal Display ค. Limit Crystal Display ง. Limit Crystal Delay 4. โมดูลแสดงผล LCD แบบอักขระ มีจอแสดงผล สีใด ก. ขาว-ดำ ข. ขาว-เหลือง ค. ขาว-สม ง. ขาว-แดง 5. โมดูลแสดงผล LCD แบบอักขระ มีขาตอใชงาน ทั้งหมดกี่ขา ก. 10 ขา ข. 13 ขา ค. 16 ขา ง. 18 ขา 6. ขา DATA ของโมดูลแสดงผล LCD แบบอักขระ มีทั้งหมดกี่ขา ก. 4 ขา ข. 6 ขา ค. 8 ขา ง. 10 ขา 7. ในการติดตอสื่อสารระหวางโมดูลแสดงผล LCD กับ Arduino สามารถทำไดกี่วิธี ก. 1 วิธี ข. 2 วิธี ค. 3 วิธี ง. 4 วิธี 8. คำสั่งใดเปนการกำหนดขนาดของโมดูลแสดงผล LCD ก. lcd.setCursor (); ข. lcd.print(); ค. LiquidCrystal(); ง. lcd.begin(); 9. คำสั่งใดเปนการเขียนขอความที่ตองการแสดง บนโมดูลแสดงผล LCD ก. LiquidCrystal(); ข. lcd.print(); ค. lcd.setCursor (); ง. lcd.begin(); 10. คำสั่งใดเปนการใชกำหนดตำแหนงและบรรทัด ของเคอรเซอร” ก. lcd.setCursor (); ข. lcd.print(); ค. LiquidCrystal(); ง. lcd.begin();


แบบฝกหัดหนวยที่ 7 เรื่อง... Arduino กับโมดูลแสดงผล LCD ตอนที่ 2 ใหนักเรียนตอบคำถามตอไปนี้ใหถูกตอง 1. จงเขียนรูปของโมดูลแสดงผล LCD พรอมบอกตำแหนงขาและอธิบายรายละเอียดการทำงานของขาตาง ๆ ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. 2. จงอธิบายความหมายคำสั่งตางๆ ตอไปนี้ - lcd.setCursor(3,0); ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. - lcd.setCursor(3,1); ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. - lcd.print (“My name is BOY”); ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. - lcd.display(); ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. - lcd.clear(); ………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………….


ใบความรู หนวยที่ 8 Arduino กับอนาล็อกอินพุต 1. หัวขอเรื่อง 2. สาระสำคัญ 2.1 สัญญาณอนาล็อก สัญญาณอนาล็อก (Analog Signal) คือ สัญญาณที่มีการเปลี่ยนแปลงของขอมูลแบบตอเนื่อง (Continuous Data) หรือคลื่นไซน มีความถี่และความแรงของสัญญาณไมคงที่ มีลักษณะเปนเสนโคงตอเนื่องกันไป ภาพที่ 8.1 ลักษณะสัญญาณอนาล็อก 2.2 การแปลงสัญญาณอนาล็อกเปนสัญญาณดิจิตอล เปนสัญญาณที่มีการเปลี่ยนแปลงแบบตอเนื่องทั้งขนาดความแรงของสัญญาณและเวลา ดังนั้นเมื่อวาด สัญญาณอนาล็อกออกมาเปนกราฟ จะมีลักษณะเปนเสนแบบตอเนื่องกัน สวนสัญญาณดิจิตอลเปนสัญญาณที่มีการ เปลี่ยนแปลงแบบขั้นทั้งขนาดความแรงของคาสัญญาณและเวลา ภาพที่ 8.2 การแปลงสัญญาณอนาล็อกเปนสัญญาณดิจิตอล 2.3 วิธีการอานคาอนาล็อกของบอรด Arduino บอรดไมโครคอนโทรลเลอร Arduino Uno R3 มีพอรตอนาล็อกอินพุต (Analog Input) จำนวน 6 พอรตคือ พอรต A0 ถึง A5 แตพอรตมีความละเอียดขนาด 10 บิต ซึ่งสามารถแบงระดับความแตกตางไดทั้งหมด 1,024 คา


- แรงดัน 0 โวลต = 00 0000 00002 หรือ มีเทากับ 010 - แรงดัน 5 โวลต = 11 1111 11112 หรือ มีเทากับ 102310 ภาพที่ 8.3 พอรตอนาล็อกของบอรด Arduino การตอโพเทนทิโอมิเตอรกับบอรด Arduino ซึ่งจะเห็นไดวาถาปรับคาความตานทานต่ำสุดทำใหคา แรงดันมีคาเทากับ 0 โวลต และถาปรับคาความตานทานสูงสุดทำใหคาแรงดันมีคาเทากับ 5 โวลต สัญญาณเอาตพุต ของโพเทนทิโอมิเตอรถูกสงเขาไปยังพอรตอนาล็อกของบอรด Arduino ที่ตองการ ภาพที่ 8.4 การตอโพเทนทิโอมิเตอรกับบอรด Arduino การเขียนโปรแกรมเพื่อใชงานการอานคาสัญญาณอนาล็อก มีคำสั่งเพื่อใชในการอานอนาล็อกดังนี้ คำสั่ง analog Read (); เปนคำสั่งสำหรับการอานคาสัญญาณอนาล็อกที่พอรตอินพุตที่ตองการ รูปแบบคำสั่ง analogRead (ตำแหนงพอรต INPUT) ตัวอยางการเขียนโปรแกรม int potPin = 0; // กำหนดตัวแปร potPin ตอที่พอรตอนาล็อกขา 0 int ledPin = 13; // กำหนดตัวแปร ledPin ตอที่พอรตดิจิตอลขา 13 int val = 0; // กำหนดตัวแปร val = 0


void setup() { pinMode(ledPin, OUTPUT); // เซตพอรตดิจิตอลขา 13 ใหเปนพอรตเอาตพุต } void loop() { val = analogRead(potPin); // อานคาอนาล็อกจากโพเทนทิโอมิเตอร digitalWrite((edPin, HIGH); // สงขอมูลออกเอาตพุตเปนลอจิก "1" delay(val); // หนวงเวลาเทากับคาที่อานไดจากโพเทนทิโอมิเตอร digitalWrite(ledPin, LOW); // สงขอมูลออกเอาตพุตเปนลอจิก "0" delay(val); // หนวงเวลาเทากับคาที่อานไดจากโพเทนทิโอมิเตอร }


แบบฝกหัดหนวยที่ 8 เรื่อง... Arduino กับโมดูลแสดงผล LCD ตอนที่ 1 ใหนักเรียนทำเครื่องหมายกากบาท (X) ลงบนคำตอบที่ถูกที่สุดเพียงคำตอบเดียว 1. ในอุปกรณอิเล็กทรอนิกสใชสัญญาณสำหรับการ ติดตอสื่อสารกี่แบบ ก. 1 แบบ ข. 2 แบบ ค. 3 แบบ ง. 4 แบบ 2. การแปลงสัญญาณอนาล็อกเปนดิจิตอล คือ ก. การเปลี่ยนกำลังไฟฟา ข. การเปลี่ยนกระแสไฟฟา ค. การเปลี่ยนความจุไฟฟา ง. การเปลี่ยนแรงดันไฟฟา 3. บอรด Arduino Uno R3 มีพอรตอนาล็อก อินพุตจำนวนเทาไร ก. 4 พอรต ข. 5 พอรต ค. 6 พอรต ง. 7 พอรต 4. การแปลงสัญญาณอนาล็อกเปนดิจิตอล ขนาด 10 บิต สามารถเปลี่ยนคาสูงสุดไดคาเทาไร ก. 1024 ข. 512 ค. 256 ง. 128 5. สัญญาณอนาล็อก (Analog Signal) คือ ขอใด ก. สัญญาณที่มีการเปลี่ยนแปลงของขอมูลแบบ คงที่ ข. สัญญาณที่มีการเปลี่ยนแปลงของขอมูลแบบ ไมตอเนื่อง ค. สัญญาณที่มีการเปลี่ยนแปลงของขอมูลแบบ ไมคงที่ ง. สัญญาณที่มีการเปลี่ยนแปลงของขอมูล แบบตอเนื่อง 6. อุปกรณเบื้องตนที่ใชในการสงคาอนาล็อกคือ ขอใด ก. ทรานซิสเตอร ข. โพเทนทิโอมิเตอร ค. มัลติมิเตอร ง. คาปาซิเตอร 7. ขอใดไมใชสัญญาณอนาล็อก (Analog Signal) ก. เสียง ข. ความรอน ค. เพลง mp3 ง. แสงสวาง 8. คำสั่งที่ใชสำหรับอานคาอนาล็อกคือ ก. analogRead(); ข. digitalRead(); ค. analogWrite(); ง. digitalWrite(); 9. ถาตองการอานคาสัญญาณอนาล็อกใหพอรต A3 ตองใชคำสั่งใด ก. analogRead(2); ข. analogRead(3); ค. analogWrite(2); ง. analogWrite(3); 10. analogRead(0); คือขอใด ก. อานคาสัญญาณอนาล็อกใหพอรต A2 ข. อานคาสัญญาณอนาล็อกใหพอรต A3 ค. อานคาสัญญาณอนาล็อกใหพอรต A1 ง. อานคาสัญญาณอนาล็อกใหพอรต A0


แบบฝกหัดหนวยที่ 8 เรื่อง... Arduino กับโมดูลแสดงผล LCD ตอนที่ 2 ใหนักเรียนตอบคำถามตอไปนี้ใหถูกตอง 1. จงอธิบายการแปลงสัญญาณอนาล็อกเปนดิจิตอล ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. 2. จงอธิบายวิธีการอานคาอนาล็อกของบอรด Arduino ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………….


ใบความรู หนวยที่ 9 Arduino กับสวิตชเมทริกซ 1. หัวขอเรื่อง 2. สาระสำคัญ 2.1 วงจรสวิตชเมทริกซ สวิตชเมทริกซ (matrix switch)หรือเรียกวา คียแพด (keypad) เปนสวิตซที่ตออยูในรูปแบบเมทริกซ ใชการปอนขอมูลรวมกับงานไมโครคอนโทรลเลอร มีสวนประกอบคือ หนาสัมผัสสวิตช ติดแผนลาเบลปดชื่อคีย และ สายตอสัญญาณ สวิตชเมทริกซหรือแปนตัวเลข (Keypad) ที่นำมาใชงานกับไมโครคอนโทรลเลอรมีขนาด 4x3 สามารถใชแทนสวิตชได 12 ตัว ใชพอรตของไมโครคอนโทรลเลอรจำนวน 7 พอรต ภาพที่ 9.1 วงจรสวิตชเมทริกซแบบ 4x3 วงจรสวิตชเมทริกซ ซึ่งการตอวงจรสวิตชใหนำสายสัญญาณแนวนอน (Row) ตั้งแตแถว Row 1- Row3 ตอเขาที่พอรตดิจิตอลขา 5, 4, 3, 2 กำหนดใหเปนพอรตเอาตพุต สวนสายสัญญาณแนวตั้ง (Column)ตั้งแต แถว Col1- Col3 ตอเขาที่พอรตดิจิตอลขา 6, 7, 8และกำหนดใหเปนพอรตอินพุต สวนการแสดงผลนำขอมูลปรากฎ บนหนาตางจอภาพคอมพิวเตอรแบบอนุกรม


ภาพที่ 9.2 วงจรคียสวิตชแบบเมทริกซ 2.2 หลักการเขียนโปรแกรมสแกนคีย (Scan key) จากวงจรรูปที่ 9.2 เปนวงจรสวิตชเมทริกซ ซึ่งการตอวงจรสวิตชใหนำสายสัญญาณแนวนอน (Row) ตั้งแตแถว Row1- Row3 ตอเขาที่พอรตดิจิตอลขา 5, 4, 3, 2 กำหนดใหเปนพอรตเอาตพุตสวนสายสัญญาณ แนวตั้ง (Column) ตั้งแตแถว Co(1- Co(3 ตอเขาที่พอรตดิจิตอลขา 6, 7, 8 และกำหนดใหเปนพอรตอินพุต สวนการ แสดงผลนำขอมูลปรากฏบนหนาตางจอภาพคอมพิวเตอรแบบอนุกรม โดยมีขั้นตอนการเขียนโปรแกรมสแกนคีย (Scan key) ดังนี้ ขั้นตอนการเขียนโปรแกรมสแกนคีย (Scan key) ดังนี้ 1) สงขอมูลไปออกที่พอรตพอรตดิจิตอลขา 5 (ROW1) เปนลอจิก "0" สวนพอรตดิจิตอลขา 4, 3, 2 (ROW2-ROW4) เปนลอจิก "1 " เพื่อทำการตรวจสอบวาสวิตชหมายเลข 1, 2 และ 3 จากวงจรถาสวิตชหมายเลขใดถูก กดขอมูลที่อานเขามาที่พอรตดิจิตอลขา 6, 7, 8 ทำใหมีคาเปนลอจิก "0" ดวย ตัวอยางเชน ถาสวิตชหมายเลข 1 ถูกกด ที่พอรตดิจิตอลขา 6 ทำใหอานคาเปนลอจิก "0" สวนพอรตดิจิตอลขา 7, 8 อานคาไดเปนลอจิก "1 "ในโปรแกรมก็ สามารถรับรูไดวาตอนนี้สวิตชหมายเลข 1 ถูกกด และสงขอมูลเลข 1 ไปบนหนาตางจอภาพคอมพิวเตอร เมื่อทำการ ตรวจสอบสสวิตชทั้ง 3 ตัวแลว จากนั้นจึงทำขั้นตอนที่ 2 ตอไป 2) จากนั้นโปรแกรมสงขอมูลไปออกที่พอรตพอรตดิจิตอลขา 4 (ROW2) เปนลอจิก"0"สวนพอรต ดิจิตอลขา 5, 3, 2 (ROW1, ROW3, ROW4) เปนลอจิก "1" เพื่อทำการตรวจสอบวาสวิตชหมายเลข 4, 5 และ 6 และ ถาสวิตชหมายเลขใดถูกกดขอมูลที่อานเขามาที่พอรตดิจิตอลขา 6, 7, 8 ทำใหมีคาเปนลอจิก "0" ดวย ตัวอยางเชน ถา คียสวิตชหมายเลข 5 ถูกกด ที่พอรตดิจิตอลขา 7 ทำใหอานคาเปนลอจิก "0" สวนพอรตดิจิตอลขา 6, 8 อานคาไดเปน ลอจิก "1 " ในโปรแกรมก็สามารถรับรูไดวาตอนนี้สวิตชหมายเลข 5 ถูกกด และสงขอมูลเลข 5 ไปบนหนาตางจอภาพ คอมพิวเตอร เมื่อทำการตรวจสอบสวิตชทั้ง 3 ตัวแลว จากนั้นจึงทำขั้นตอนที่ 3 ตอไป 3) จากนั้นโปรแกรมสงขอมูลไปออกที่พอรตพอรตดิจิตอลขา 3 (ROW3) เปนลอจิก "0" สวนพอรต ดิจิตอลขา 5, 4, 2 (ROW1, ROW2, ROW4) เปนลอจิก "1" เพื่อทำการตรวจสอบวาสวิตชหมายเลข 7, 8 และ 9 และ ถาสวิตชหมายเลขใดถูกกดขอมูลที่อานเขามาที่พอรตดิจิตอลขา 6, 7 , 8 ทำใหมีคาเปนลอจิก "0" ดวย ตัวอยางเชน ถา คียสวิตชหมายเลข 9 ถูกกด ที่พอรตดิจิตอลขา 8 ทำใหอานคาเปนลอจิก "0" สวนพอรตดิจิตอลขา 6, 7 อานคาไดเปน ลอจิก "1 " ในโปรแกรมก็สามารถรับรูไดวาตอนนี้สวิตชหมายเลข 9 ถูกกด และสงขอมูลูเลข 9 ไปบนหนาตางจอภาพ คอมพิวเตอร เมื่อทำการตรวจสอบสวิตชทั้ง 3 ตัวแลว จากนั้นจึงทำขั้นตอนที่ 4 ตอไป


4) จากนั้นโปรแกรมสงขอมูลไปออกที่พอรตพอรตดิจิตอลขา 2 (ROW4) เปนลอจิก "0" สวนพอรต ดิจิตอลขา 5, 4, 3 (ROW1, ROW2, ROW3) เปนลอจิก "1" เพื่อทำการตรวจสอบวาสวิตชหมายเลข *, 0 และ # และ ถาสวิตชหมายเลขใดถูกกดขอมูลที่อานเขามาที่พอรตดิจิตอลขา 6, 7, 8 ทำใหมีคาเปนลอจิก "0" ดวย ตัวอยางเชน ถา คียสวิตชหมายเลข * ถูกกด ที่พอรตดิจิตอลขา 6 ทำใหอานคาเปนลอจิก "0" สวนพอรตดิจิตอลขา 7, 8 อานคาไดเปน ลอจิก " 1 " ในโปรแกรมก็สามารถรับรูไดวาตอนนี้สวิตชหมายเลข * ถูกกด และสงขอมูลเลข * ไปบนหนาตางจอภาพ คอมพิวเตอร 5) เมื่อโปรแกรมทำครบทั้ง 4 ขั้นตอน โปรแกรมจะวนไปทำซ้ำในขั้นตอนขอที่ 1 ตัวอยางการเขียนโปรแกรมสแกนคีย (Scan key) int r1 = 5; // กำหนดตัวแปร r1 = 5 int r2 = 4; // กำหนดตัวแปร r2 = 4 int r3 = 3; // กำหนดตัวแปร r3 = 3 int r4 = 2; // กำหนดตัวแปร r4 = 2 int c1 = 6; // กำหนดตัวแปร c1 = 6 int c2 = 7; // กำหนดตัวแปร c2 = 7 int c3 = 8; // กำหนดตัวแปร C3 = 8 int colm1; // กำหนดตัวแปร colm1 int colm2; // กำหนดตัวแปร colm2 int colm3; // กำหนดตัวแปร colm3 void setup() { pinMode(r1,0UTPUT); // เซตพอรตดิจิตอลขา 5 ใหเปนพอรตเอาตพุต pinMode(r2,OUTPUT); // เซตพอรตดิจิตอลขา 4 ใหเปนพอรตเอาตพุต pinMode(r3,0UTPUT); // เซตพอรตดิจิตอลขา 3 ใหเปนพอรตเอาตพุต pinMode(r4,OUTPUT); // เซตพอรตดิจิตอลขา 2 ใหเปนพอรตเอาตพุต pinMode(c1,INPUT); // เซตพอรตดิจิตอลขา 6 ใหเปนพอรตอินพุต pinMode(c2,INPUT); // เซตพอรตดิจิตอลขา 7 ใหเปนพอรตอินพุต pinMode(c3,INPUT); // เซตพอรตดิจิตอลขา 8 ใหเปนพอรตอินพุต Serial.begin(9600); // เซตคาการติดตอสื่อสารแบบอนุกรม digitalWrite(c1,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 6 เอาตพุตเปนลอจิก "1" digitalWrite(c2,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 7 เอาตพุตเปนลอจิก "1" digitalWrite(c3,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 8 เอาตพุตเปนลอจิก "1" } void loop() { digitalWrite(r1,LOW); // สงขอมูลออกพอรตดิจิตอลขา 5 เอาตพุตเปนลอจิก "1" digitalWrite(r2,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 4 เอาตพุตเปนลอจิก "1" digitalWrite(r3,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 3 เอาตพุตเปนลอจิก "1" digitalWrite(r4,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 2 เอาตพุตเปนลอจิก "1"


colm1=digitalRead(c1); // อานคาพอรตดิจิตอลขา 6 เก็บคาที่ตัวแปร colm1 colm2=digitalRead(c2); // อานคาพอรตดิจิตอลขา 7 เก็บคาที่ตัวแปร colm2 colm3=digitalRead(c3); // อานคาพอรตดิจิตอลขา 8 เก็บคาที่ตัวแปร colm3 if(colm1==LOw) // ถาตัวแปร colm1 เทากับ 0 {Serial.println("1"); // แสดงเลข 1 บนจอคอมพิวเตอร delay(200); // หนวงเวลา 0.2 วินาที } else { if(colm2==LOW) // ถาตัวแปร colm2 เทากับ 0 {Serial.println("2"); // แสดงเลข 2 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else{ if(colm3==LOW) // ถาตัวแปร colm3 เทากับ 0 {Serial.println("3"); // แสดงเลข 3 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที } } digitalWrite(r1,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 5 เอาตพุตเปนลอจิก "1" digitalWrite(r2,LOW); // สงขอมูลออกพอรตดิจิตอลขา 4 เอาตพุตเปนลอจิก "0" digitalWrite(r3,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 3 เอาตพุตเปนลอจิก "1 " digitalWrite(r4,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 2 เอาตพุตเปนลอจิก "1" colm1=digitalRead(c1); // อานคาพอรตดิจิตอลขา 6 เก็บคาที่ตัวแปร colm1 colm2=digitalRead(c2); // อานคาพอรตดิจิตอลขา 7 เก็บคาที่ตัวแปร colm2 colm3=digitalRead(c3); // อานคาพอรตดิจิตอลขา 8 เก็บคาที่ตัวแปร colm3 if(colm1==LOW) // ถาตัวแปร colm1 เทากับ 0 {Serial.println("4"); // แสดงเลข 4 บนจอคอมพิวเตอร delay(200); // หนวงเวลา 0.2 วินาที else { if(colm2==LOW) // ถาตัวแปร colm2 เทากับ 0 {Serial.println("5"); // แสดงเลข 5 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else { if(colm3==LOW) // ถาตัวแปร colm3 เทากับ 0 {Serial.println("6"); // แสดงเลข 6 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที }


digitalWrite(r1,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 5 เอาตพุตเปนลอจิก "1" digitalWrite(r2,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 4 เอาตพุตเปนลอจิก "1" digitalWrite(r3,LOW); // สงขอมูลออกพอรตดิจิตอลขา 3 เอาตพุตเปนลอจิก "0'" digitalWrite(r4,HIGH); // สงขอมูลออกพอรตขา 2 เอาตพุตเปนลอจิก "1 " colm1=digitalRead(c1); // อานคาพอรตดิจิตอลขา 6 เก็บคาที่ตัวแปร colm1 colm2=digitalRead(c2); // อานคาพอรตดิจิตอลขา 7 เก็บคาที่ตัวแปร colm2 colm3=digitalRead(c3); // อานคาพอรตดิจิตอลขา 8 เก็บคาที่ตัวแปร colm3 if(colm1==LOW) // ถาตัวแปร colm1 เทากับ 0 {Serial.println("7"); // แสดงเลข 7 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else{ if(colm2==LOW) // ถาตัวแปร colm2 เทากับ 0 {Serial.println("8"); // แสดงเลข 8 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else{ if(colm3==LOW) // ถาตัวแปร colm3 เทากับ 0 {Serial.println("9"); // แสดงเลข 9 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที } } digitalWrite(r1,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 5 เอาตพุตเปนลอจิก "1" digitalWrite(r2,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 4 เอาตพุตเปนลอจิก "1" digitalWrite(r3,HIGH); // สงขอมูลออกพอรตดิจิตอลขา 3 เอาตพุตเปนลอจิก "1" digitalWrite(r4,LOW); // สงขอมูลออกพอรตดิจิตอลขา 2 เอาตพุตเปนลอจิก "0" colm1=digitalRead(c1); // อานคาพอรตดิจิตอลขา 6 เก็บคาที่ตัวแปร colm1 colm2=digitalRead(c2); // อานคาพอรตดิจิตอลขา 7 เก็บคาที่ตัวแปร colm2 colm3=digitalRead(c3); // อานคาพอรตดิจิตอลขา 8 เก็บคาที่ตัวแปร colm3 if(colm1==LOW) // ถาตัวแปร colm1 เทากับ 0 {Serial.println("*"); // แสดงเลข * บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else{ if(colm2==LOW) // ถาตัวแปร colm2 เทากับ 0 {Serial.println("O"); // แสดงเลข 0 บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที else{ if(colm3==LOW) // ถาตัวแปร colm3 เทากับ 0


{Serial.println("#"); // แสดงเลข # บนจอคอมพิวเตอร delay(200);} // หนวงเวลา 0.2 วินาที } } } การประยุกตใชงานสวิตชเมทริกซนั้นทำใหประหยัดพอรตอินพุตของไมโครคอนโทรลเลอรไดมากกวา เชน ถา ตองการตอใชงานสวิตช12 ตัว ถาตอแบบปกติธรรมดาตองใชพอรตของไมโครคอนโทรลเลอรถึง 12 พอรต แตถาตอ สวิตชแบบเมทริกซนั้นใชพอรตของไมโครคอนโทรลเลอรเพียง 7 พอรตเทานั้น ตัวอยางการเขียนโปรแกรมการ ประยุกตใชงาน เชน โปรแกรมสวิตชรหัสเปด-ปดประตูโปรแกรมสวิตชเลือกโปรแกรมการทำงานเครื่องใชไฟฟาตาง ๆ เปนตน


แบบฝกหัดหนวยที่ 9 เรื่อง... Arduino กับสวิตชเมทริกซ ตอนที่ 1 ใหนักเรียนทำเครื่องหมายกากบาท (X) ลงบนคำตอบที่ถูกที่สุดเพียงคำตอบเดียว 1. ขอใดคือสวิตชแบบเมทริกซ ก. ข. ค. ง. 2. ขอใดกลาวถูกตองเกี่ยวกับการตอสวิตชเมทริกซ ก. สวิตชเมทริกซถูกตอแนวตั้ง (Column) อยาง เดียว ข. สวิตชเมทริกซถูกตอทั้งแนวตั้ง (Column) และแนวนอน (Row) ค. สวิตชเมทริกซถูกตอแนวนอน (Row) อยาง เดียว ง. คียสวิตชจะถูกตอทั้ง 2 ขา 3. ถาตองการตอสวิตชเมทริกซทั้จำนวน 10 ตัว ตองใชพอรตของไมโครคอนโทรลเลอรกี่ขา ก. 5 ขา ข. 6 ขา ค. 7 ขา ง. 8 ขา 4. ถามีคียสวิตชแบบเมทริกซทั้งหมด 14 ตัว จะตองพอรตของไมโครคอนโทรลเลอรกี่ขา ก. 7 ขา ข. 8 ขา ค. 9 ขา ง. 10 ขา 5. ถาตอสวิตชเมทริกซกับพอรตของ ไมโครคอนโทรลเลอรโดยมีพอรตเอาตพุต 4 ขา และมีพอรตอินพุต 3 ขาสามารถตอสวิตชเมทริกซ ไดทั้งหมดกี่ตัว ก. 9 ตัว ข. 10 ตัว ค. 11 ตัว ง. 12 ตัว จากรูปวงจรขางลางนี้ ใชเนื้อหาในบทที่9สำหรับ คำถามในขอ 6 - 10 6. จากรูปพอรตใดเปนพอรตเอาตพุตของสวิตชเมท ริกซ ก. พอรตดิจิตอลขา 2-5 ข. พอรตดิจิตอลขา 6-8 ค. พอรตอนาล็อกขา 2-5 ง. พอรตอนาล็อกขา 6-8 7. จากรูปพอรตใดเปนพอรตอินพุตของสวิตชเมท ริกซ ก. พอรตอนาล็อกขา 2-5 ข. พอรตอนาล็อกขา 6-8 ค. พอรตดิจิตอลขา 2-5 ง. พอรตดิจิตอลขา 6-8 8. ถาตองการตรวจสอบวาสวิตชหมายเลข 1, 2 และ 3 พอรตใดถูกสงลอจิก 0 ออกมา ก. พอรต 2 ข. พอรต 3 ค. พอรต 4 ง. พอรต 5 9. ถาตองการตรวจสอบวาสวิตชหมายเลข 4, 5 และ 6 พอรตใดถูกสงลอจิก 0 ออกมา ก. พอรต 4 ข. พอรต 3 ค. พอรต2 ง. พอรต 5 10. ถาตองการตรวจสอบวาสวิตชหมายเลข *, 0 และ # พอรตใดจะตองสงลอจิก 0 ออกมา ก. พอรต 2 ข. พอรต 5 ค. พอรต 4 ง. พอรต 3


แบบฝกหัดหนวยที่ 9 เรื่อง... Arduino กับสวิตชเมทริกซ ตอนที่ 2 ใหนักเรียนตอบคำถามตอไปนี้ใหถูกตอง 1. จงเขียนวงจรภายในของสวิตชเมทริกซ 2. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. 2. จงอธิบายขั้นตอนการเขียนโปรแกรมสวิตชเมทริกซ ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………….


ใบความรู หนวยที่ 10 Arduino กับมอเตอรไฟฟากระแสตรง 1. หัวขอเรื่อง 2. สาระสำคัญ 2.1 มอเตอรไฟฟากระแสตรง มอเตอรไฟฟากระแสตรง หรือ ดี.ซี.มอเตอร (D.C. Motor) เปนเครื่องกลชนิดหนึ่งที่เปลี่ยนจาก พลังงานไฟฟาใหเปนพลังงานกล การควบคุมมอเตอรไฟฟากระแสตรงโดยตรงตองนำพอรตของ Arduino ตอรวมกับ อุปกรณขับกระแสสูงๆ แทน เชน ทรานชิสเตอร เฟต ไอซีขับมอเตอร ภาพที่ 10.1 ตัวอยางมอเตอรไฟฟากระแสตรง มอเตอรที่ใชงานในปจจุบันแตละชนิดก็จะมีคุณสมบัติที่แตกตางกันไป เชน ความเร็วรอบ กำลัง แรงดันซึ่งมอเตอรแตละชนิดจะแบงไสตามลักษณะการใชงานกระแสไฟฟามีดวยกัน 2 แบบ คือ แบบกระแสตรงและ กระแสสลับ สวนภายในของมอเตอรจะประกอบดวยแมเหล็กภายในขดลวด ทำใหเกิดแรงดูดและผลักของ สนามแมเหล็กทั้ง 2 ที่ตัวแมเหล็กและขดลวดทำใหมอเตอรทำงาน


ภาพที่ 10.2 หลักการทำงานของมอเตอรไฟฟา มอเตอรไฟฟากระแสตรง หรือ ดี.ซี.มอเอตร (D.C.Motor) เปนเครื่องกลชนิดหนึ่งที่เปลี่ยนจาก พลังงานไฟฟาใหเปนพลังงานกล โดยปกติมีขั้วตอไฟฟาอยูสองขั้ว คือ ขั้วบวกและขั้วลบ เมื่อตอขั้วไฟฟาทั้งสองเขา แบตเตอรี่ โดยตรงมอเตอร จะหมุนไปทางหนึ่ง แตถาตอสลับขั้วไฟฟากับแบตเตอรี่มอเตอรจะหมุนในทิศทางตรงกัน ขามโดยทั่วไปมักพบเห็นมอเตอรไฟฟากระแสตรงในอุปกรณไฟฟาอิเล็กทรอนิกสตาง ๆ เชน หุนยนต, เครื่องเลน DVD, รถบังคับวิทยุ,รถจักรยานไฟฟา เปนตน 2.2 การควบคุมมอเตอรไฟฟากระแสตรงดวย Arduino วงจร ควบคุมมอเตอรไฟฟากระแสตรงดวย Arduino โดยใชทรานซิสเตอรเบอร TIP120 ซึ่งสามารถ รับคาแรงดันไดถึง 60 โวลต (V.) และจายกระแสสูงสุดได 5 แอมป (A.) ภาพที่ 10.3 วงจรควบคุมมอเตอรไฟฟากระแสตรง จากวงจรใชทรานซิสเตอรเปนอุปกรณสำหรับควบคุมการทำงานของมอเตอรใหหมุนและหยุดหมุน หรือ ON - OFF จากวงจรใชทรานซิสเตอรชนิด NPNเบอร TIP120 โดยขาเบส (B) ของทรานซิสเตอรนำมาตอที่พอรต ดิจิตอลขา 2 ขาคอลเลกเตอร (C) ตอกับมอเตอร และขาอิมิตเตอร (E) ตอลงกราวดเมื่อพอรตดิจิตอลขา 2 ของ Arduino สงลอจิก "1" มาที่ขาเบส (B) ทรานซิสเตอรทำใหทรานซิสเตอรนำกระแสสงผลใหมอเตอรหมุน แตถา Arduino สงลอจิก "0" มาที่ขาเบส (B) ของทรานซิสเตอรทำใหทรานซิสเตอรหยุดนำกระแสและสงผลใหมอเตอรหยุด หมุนทันที 2.3 การควบคุมความเร็วมอเตอรกระแสตรงดวย Arduino จากวงจรเปนรูปแบบสัญญาณพัลสวิดทมอดูเลชั่นโดยใชทรานซิสเตอรเพื่อนำมาควบคุมมอเตอร


ภาพที่ 10.4 รูปแบบสัญญาณพัลสวิดธมอดูเลชัน คำสั่ง analogWrite (); เปนคำสั่งสำหรับเขียนคาอนาล็อก (PWM wave) ในพอรตเอาตพุตที่ตองการสามารถนำไปใชในการ ควบคุมความสวางของหลอดแอลอีดี (LED) หรือควบคุมความเร็วมอเตอร คำสั่งanalogWrite) นี้เปนการสรางลูกคลื่น รูปสี่เหลี่ยมอยางตอเนื่องซึ่งมีรอบการทำงานตามที่กำหนดไว สัญญาณพัสสวิดทมอดูเลชั่น (Pulse Width Modulation :PWM) รูปแบบคำสั่ง analogWrite(ตำแหนงพอรต, คา PWM มีคาตั้งแต 0 - 255) ภาพที่ 10.5 วงจรควบคุมความเร็วมอเตอรกระแสตรง Arduino 2.4 การควบคุมมอเตอรไฟฟากระแสตรงดวยทรานซิสเตอร พอรตดิจิตอลของ Arduino สามารถจายกระแสได 40 มิลลิแอมป ที่แรงดัน 5 โวลตเทานั้น ซึ่ง มอเตอรสวนใหญตองการกระแสไฟฟาและแรงดัน ไฟฟามากกวาที่พอรต Arduino จายออกมา ลังนั้นการควบคุมจึง ตองนำอุปกรณขับกระแสสูง ๆ มาตอรวมดวย เชน ทรานซิสเตอร เฟต และไอซีขับมอเตอร


ภาพที่ 10.6 ทรานซิสเตอรและไอซี ทรานซิสเตอรเปนอุปกรณสำหรับควบคุมการทำงานของมอเตอรใหหมุนและหยุดหมุนหรือ ON OFF สามารถใชทรานซิสเตอรไดทั้ง 2 ชนิด คือ NPN และ PNP แตการตอใชงานจะแตกตางกัน โดย NPN ขาเบส (B) ตอเขากับพอรตดิจิตอลผานตัวตานทาน ขาคอลเลกเตอร (C) ตอเขากับขั้วลบของมอเตอรและขาอีมิตเตอร (E) ตอลง กราวดสวนชนิด PNP ขาเบส (B) ตอเขากับพอรตดิจิตอลผานตัวตานทานคอลเลกเตอร (C) ตอเขากับขั้วบวกของ มอเตอร และขาอีมิตเตอร (E) ตอลงไฟ 5 โวลต ภาพที่ 10.7 สัญลักษณและโครงสรางทรานซิสเตอร เมื่อพอรตดิจิตยลที่เราสงใชงานกับทรานชิสเตอรแบบ NPN สงสอจิก HIGH เขาที่ขาเบส (B) ทำให ทรานชิสเตอรนำกระแสสงผลใหมอเตอรหมุน แตถาสงลอจิก LOW เขาที่ขาเบส (B) ทำใหทรานซิสเตอรหยุดนำกระแส และสงผลไหมอเตอรหยุดหมุนทันที สวนพอรตดิจิตอลที่เราตอใชงานกับทรานซิสตอรแบบ PNP สงลอจิก LOW เขาที่ขา เบส (B) ทำใหทรานซิสเตอรนำกระแสสงผลใหมอเตอรหนุน แตถ้ำสงลอจิก HIGH เขาที่ขาเบส (B) ทำใหทรานซิสเตอร หยุดนำกระแสและสงผลใหมอเตอรหยุดหมุนทันที 2.5 การควบคุมมอเตอรไฟฟากระแสตรงดวยไอซี L293D ไอซี L293D เปนไอซีขับมอเตอรไดทั้งหมด 2 ตัว โดยมอเตอรตองกินกระแสไมเกิน 600 มิลลิแอมป (mA.) จากวงจรเปนวงจรการตอใชงาน Arduino กับไอซีควบคุมมอเตอรเบอร L293D ที่พอรตดิจิตอลขา 3 และ 4 ตอที่ขาอินพุตขา IN1 และ IN2 ใชสำหรับควบคุมทิศทางการหมุนของมอเตอร สวนพอรตดิจิตอลขา 2 ตอ เขาที่ขา EN1 ใชสำหรับการปรับความเร็วของมอเตอร ขา 16 ตอไฟเลี้ยง +5 โวลตรวมกับไฟเลี้ยง Arduino ขา 8 ตอไฟเลี้ยง ของมอเตอร เชนมอเตอรใชแรงดันไฟฟา +6 โวลต VS นำไปตอแรงดันไฟฟา +6 โวลต ขา 4, 5, 12, 13 ตอลงกราวด และขา OUT1, OUT2 ตอกับมอเตอร


ภาพที่ 10.8 การตอใชงาน Arduino กับไอซี L293D


แบบฝกหัดหนวยที่ 10 เรื่อง... Arduino กับมอเตอรไฟฟากระแสตรง ตอนที่ 1 ใหนักเรียนทำเครื่องหมายกากบาท (X) ลงบนคำตอบที่ถูกที่สุดเพียงคำตอบเดียว 1. อุปกรณประเภทใดไมมีมอเตอรไฟฟากระแสตรง ก. รถบังคับวิทยุ ข. เครื่องเลน DVD ค. หุนยนต ง. เครื่องซักผา 2. อุปกรณขอใดใชสำหรับขับกระแสเพื่อให มอเตอรไฟฟากระแสตรงสามารถทำงานได ก. ตัวเก็บประจุ ข. ตัวตานทาน ค. เฟต ง. ไดโอด จากรูปวงจรขางลางนี้ ใชสำหรับคำถามในขอ 3 - 6 3. ขอใดเปนอุปกรณสำหรับขับกระแสเพื่อให มอเตอรไฟฟากระแสตรงสามารถทำงานได ก. ไดโอด ข. ทรานซิสเตอร ค. เฟต ง. รีเลย 4. ถาตองการใหมอเตอรหมุนควรใชคำสั่งใด ก. digitalWrite( 2, HIGH ); ข. digitalWrite( 3, LOW ); ค. analogWrite( 4, HIGH ); ง. analogWrite( 5, LOW ); 5. ถาตองการใหมอเตอรหยุดหมุนควรใชคำสั่งใด ก. digitalWrite( 1, HIGH ); ข. digitalWrite( 2, LOW ); ค. analogWrite( 3, HIGH ); ง. analogWrite( 4, LOW ); 6. คำสั่งใดใชในการควบคุมความเร็วมอเตอร ก. digitalWrite( 0, HIGH ); ข. digitalWrite( 1, LOW ); ค. analogWrite( 2, 255 ); ง. analogWrite( 3, LOW ); จากรูปวงจรขางลางนี้ ใชสำหรับคำถามในขอ 7 - 10 7. จากวงจรขอใดเปนอุปกรณควบคุม มอเตอร ไฟฟากระแสตรง ก. ไอซี L293D ข. ทรานซิสเตอร ค. ไอซี L298D ง. รีเลย 8. จากวงจรไอซี L293D สามารถขับมอเตอรไฟฟา กระแสตรงไดกี่ตัว ก. 1 ตัว ข. 2 ตัว ค. 3 ตัว ง. 4 ตัว 9. ขาอีนาเบิล (EN) ทำหนาที่ใด ก. ควบคุมทิศทางมอเตอร ข. ควบคุมการหมุนทวนเข็มนาิกา ค. ควบคุมการหมุนตามเข็มนาิกา ง. ควบคุมความเร็วมอเตอร 10. เมื่อตองการควบคุมความเร็วของมอเตอรไฟฟา กระแสตรงใหหมุนดวยความเร็วครึ่งหนึ่งของ ความเร็วสูงสุด ตองใชคำสั่งใด ก. analogWrite( 2, 100 ); ข. analogWrite( 2, 127 ); ค. analogWrite( 2, 191 ); ง. analogWrite( 2, 255 );


แบบฝกหัดหนวยที่ 10 เรื่อง... Arduino กับมอเตอรไฟฟากระแสตรง ตอนที่ 2 ใหนักเรียนตอบคำถามตอไปนี้ใหถูกตอง 1. จงอธิบายการควบคุมความเร็วมอเตอรไฟฟากระแสตรงดวย Arduino ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. 2. จงอธิบายการใช Arduino กับไอซี L293D เพื่อควบคุมมอเตอรไฟฟากระแสตรง ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ………………………………………………………………………………………………………………………………………………………. ……………………………………………………………………………………………………………………………………………………….


ใบความรู หนวยที่ 11 Arduino กับเซอรโวมอเตอร 1. หัวขอเรื่อง 2. สาระสำคัญ 2.1 ความรูเบื้องตนเกี่ยวกับ Servo Motor Servo เปนคำศัพทที่ใชกันทั่วไปในระบบควบคุมอัตโนมัติ มาจากภาษาละตินคำวา Sevus หมายถึง “ทาส” (Slave) ในเชิงความหมายของ Servo Motor ก็คือ Motor ที่เราสามารถสั่งงานหรือตั้งคา แลวตัว Motor จะ หมุนไปยังตำแหนงองศาที่เราสั่งไดเองอยางถูกตอง โดยใชการควบคุมแบบปอนกลับ (Feedback Control) ในหนวยนี้ จะกลาวถึง RC Servo Motor ซึ่งนิยมน ามาใชในเครื่องเลนที่บังคับดวยคลื่นวิทยุ (RC = Radio - Controlled) เชน เรือบังคับวิทยุ รถบังคับวิทยุ เฮลิคอปเตอรบังคับวิทยุ เปนตน ภาพที่ 11.1 ตัวอยางมอเตอรไฟฟากระแสตรง Feedback Control คือระบบควบคุมที่มีการนำคาเอาตพุตของระบบนำมาเปรียบเทียบกับคาอินพุต เพื่อควบคุมและปรับแตงใหคาเอาตพุตของระบบใหมีคาเทากับหรือใกลเคียงกับคาอินพุต สวนประกอบภายนอก RC Servo Motor


ภาพที่ 11.2 สวนประกอบของเซอรโวมอเตอร (ที่มา www.Arduino.cc/en/reference/servo) - Case ตัวถัง หรือ กรอบของตัว Servo Motor - Mounting Tab สวนจับยึดตัว Servo กับชิ้นงาน - Output Shaft เพลาสงก าลัง - Servo Horns สวนเชื่อมตอกับ Output shaft เพื่อสรางกลไกล - Cable สายเชื่อมตอเพื่อ จายไฟฟา และ ควบคุม Servo Motor จะประกอบดวยสายไฟ 3 เสน และ ใน RC Servo Motor จะมีสีของสายแตกตางกันไปดังนี้ - สายสีแดง คือ ไฟเลี้ยง (4.8-6V) - สายสีดำ หรือ น้ำตาล คือ กราวด - สายสีเหลือง (สม ขาว หรือฟา) คือ สายสงสัญญาณพัลสควบคุม (3-5V) - Connector จุดเชื่อมตอสายไฟ 2.2 สวนประกอบภายใน RC Servo Motor ภาพที่ 11.3 สวนประกอบภายใน RC Servo Motor (ที่มา www.Pololu.com) หมายเลข 1 คือ ดีซีมอเตอร หมายเลข 2 คือ ชุดเฟองเกียรทดแรงมอเตอร หมายเลข 3 คือ ชุดควบคุมและปรับแตงใหคาเอาตพุตมีคาเทากับ หรือใกลเคียงกับคาอินพุต หมายเลข 4 คือ สวนที่ควบคุมและประมวลผล 2.3 บล็อกไดอะแกรมของ Servo Motor


ภาพที่ 11.4 Block Diagram Servo Motor (ที่มา www.Ebldc.com/?p=48) - Motor เปนสวนของตัวมอเตอร - Gear Train หรือ Gearbox เปนชุดเกียรทดแรง - Position Sensor เปนเซ็นเซอรตรวจจับตำแหนงเพื่อหาคาองศาในการหมุน - Electronic Control System เปนสวนที่ควบคุมและประมวลผล 2.4 หลักการทำงานของ RC Servo Motor เมื่อจายสัญญาณพัลสเขามายัง RC Servo Motor สวนวงจรควบคุม (Electronic Control System) ภายใน Servo จะทำการอานและประมวลผลคาความกวางของสัญญาณพัลสที่สงเขามาเพื่อแปลคาเปนตำแหนงองศาที่ ตองการให Motor หมุนเคลื่อนที่ไปยังตำแหนงนั้น แลวสงคำสั่งไปทำการควบคุมให Motor หมุนไปยังตำแหนงที่ ตองการ โดยมี Position Sensor เปนตัวเซ็นเซอรคอยวัดคามุมที่ Motor กำลังหมุนเปน Feedback กลับมาใหวงจร ควบคุมเปรียบเทียบกับคาอินพุตเพื่อควบคุมใหไดตำแหนงที่ตองการอยางถูกตองแมนยำสัญญาณ RC ในรูปแบบ PWM ตัว RC Servo Motor ออกแบบมาใชสำหรับรับค าสั่งจาก Remote Control ที่ใชควบคุมของเลนดวยสัญญาณวิทยุ ตางๆ เชนเครื่องบินบังคับ รถบังบังคับ เรือบังคับ เปนตน ซึ่ง Remote จำพวกนี้ที่ภาครับจะแปลงความถี่วิทยุออกมา ในรูปแบบสัญญาณ PWM (Pulse Width Modulation) ภาพที่ 11.5 Remote Control RC Servo Motor (ที่มา www.Learn.parallax.com/KickStart/900-00008) มุมหรือองศาจะขึ้นอยูกับความกวางของสัญญาณพัลสซึ่งโดยสวนมากความกวางของพัลสที่ใชใน RC Servo Motor จะอยูในชวง 1-2 ms หรือ 0.5-2.5 ms ตัวอยางเชนหากกำหนดความกวางของสัญญาณพัลสไวที่ 1 ms ตัว Servo Motor จะหมุนไปทาง ดายซายจนสุด ในทางกลับกันหากกำหนดความกวางของสัญญาณพัลสไวที่ 2 ms ตัว Servo Motor จะหมุนไปยัง ตำแหนงขวาสุด แตหากกำหนดความกวางของสัญญาณพัลสไวที่ 1.5 ms ตัว Servo Motor ก็จะหมุนมาอยูที่ตำแหนง ตรงกลางพอดี


ภาพที่ 11.6 มุมหรือองศาหมุนขึ้นอยูกับความกวางของสัญญาณพัลส (ที่มา www.Learn.parallax.com/KickStart/900-00008) ดังนั้นสามารถกำหนดองศาการหมุนของ RC Servo Motor ไดโดยการเทียบคา เชนRC Servo Motorสามารถหมุนได 180 องศา โดยที่ 0 องศาใชความกวางพัลสเทากับ 1000 us ที่ 180 องศาความกวางพัลส เทากับ 2000 us เพราะฉะนั้นคาที่เปลี่ยนไป 1 องศาจะใชความกวางพัลสตางกัน (2000-1000)/180 เทากับ 5.55 us จากการหาคาความกวางพัลสที่มุม 1 องศาขางตน หากตองก าหนดให RC Servo Motor หมุนไปที่มุม 45 องศาจะ หาคาพัลสที่ตองการไดจาก 5.55 x 45 เทากับ 249.75 us แตที่มุม 0 องศาเราเริ่มที่ความกวางพัลส1ms หรือ 1000 us เพราะฉะนั้นความกวางพัลสที่ใชก าหนดให RC Servo Motor หมุนไปที่ 45 องศา คือ 1000 +249.75 เทากับ ประมาณ 1250 us ภาพที่ 11.7 RC Servo Motor หมุนไปที่ 45 องศา (ที่มา www.Learn.parallax.com/KickStart/900-00008) 2.5 วิธีควบคุม RC Servo Motor ดวย Arduino Arduino มีไลบรารี่สำหรับสั่งงาน RC Servo Motor มาใหใชงานอยูแลว เปนฟงกชั่นสำเร็จรูปและใช งานไดงาย ในหนาเว็บไซต http://arduino.cc/en/reference/servo ไดใหขอมูลไววา Servo Library ของ Arduino สามารถสั่งงาน RC Servo Motor ไดทั้งแบบหมุนไป-กลับได 0-180 องศา (ที่กลาวถึงตามตัวอยางขางตน) และ แบบตอเนื่องที่หมุนครบรอบไดเรียกวาเปน Continuous Rotation Servo โดยสามารถรองรับการเชื่อมตอ RC Servo Motor ไดถึง 12 ตัวกับบอรด Arduino UNO และรองรับสูงสุดถึง 48 ตัวหากใชบอรด Arduino Mega ฟงกชั่นภายใน Servo Library - attach() - write() - writeMicroseconds() - read() - attached() - detach()


2.5.1 attach() - Description คือฟงกชั่นที่ใชในการก าหนดขาสัญญาณที่ Servo Motor ตอกับ Arduino และ กำหนดความกวางของพัลสที่ 0 องศาและ 180 องศา - Syntax Servo.attach(pin) Servo.attach(pin,min,max) - Parameters Pin: คือ ขาสัญญาณของ Arduino ที่ใชเชื่อมตอกับ Servo Motor Min: คือ ความกวางของพัลสที่ 0 องศาของ Servo ตัวที่ใชในหนวยไมโครวินาที (us) โดย ปกติแลวหากไมมีการตั้งคาโปรแกรมจะกำหนดคาไวที่ 544 us Max: คือ ความกวางของพัลสที่ 180 องศาของ Servo ตัวที่ใชในหนวยไมโครวินาที (us) โดยปกติแลวหากไมมีการตั้งคาโปรแกรมจะก าหนดคาไวที่ 2400 us 2.5.2 Write() - Description คือฟงกชั่นที่ใชควบคุมตำแหนงที่ตองการให Servo Motor หมุนไปยังองศาที่กำหนด สามารถกำหนดเปนคาองศาไดคือ 0-180 องศา แตใน Servo Motor ที่เปน Full Rotation คำสั่ง write จะเปนการ กำหนดความเร็วในการหมุน โดย คาเทากับ 90 คือค าสั่งให Servo Motor หยุดหมุน คาเทากับ 0 คือการหมุนดวย ความเร็วสูงสุดในทิศทางหนึ่ง คาเทากับ 180 คือการหมุนดวยความเร็วสูงสุดในทิศทางตรงกันขาม - Syntax servo.write(angle) - Parameters - Angle: คือมุมที่ตองการให RC Servo Motor แบบ 0-180 องศาหมุนไป แตหากเปน RC Servo Motor แบบ Full Rotation คา Angle คือ การกำหนดความเร็วและทิศทางในการหมุน 2.5.3 writeMicroseconds() - Description คือฟงกชั่นที่ใชควบคุมตำแหนงที่ให Servo Motor หมุนไปยังตำแหนงองศาที่กำหนด โดยกำหนดเปนคาความกวางของพัลสในหนวย us ปกติแลว RC Servo Motor จะใชความกวางของพัลสอยูที่ 1000- 2000 us ตามที่ไดกลาวไปขางตนแลว แต RC Servo Motor บางรุนหรือบางยี่หอไมไดใชชวงความกวางของพัลสตามที่ ไดกลาวเอาไวนี้ อาจจะใชชวง 700-2300 แทนก็สามารถใชฟงกชั่น writeMicroseconds นี้เพื่อกำหนดความกวาง พัลสไดเอง การใชฟงกชั่น writeMicroseconds สามารถก าหนดคาไดอิสระ ตองระวังในการใชงาน หากสั่งงาน RC Servo Motor (แบบ 0 - 180 องศา) จนหมุนไปเกินจุดสิ้นสุดคือเกินทั้งฝง 0 หรือ 180 องศา จะท าใหเกิดเสียง ครางดังจากการหมุนไปตอไมไดและมอเตอรจะกินกระแสสูงขึ้นดวยในเวลาเดียวกันนั้น ซึ่งอาจท าให RC Servo Motor เกิดความเสียหายได - Syntax servo.writeMicroseconds(uS) - Parameters uS: คือคาความกวางของพัลสที่ตองการก าหนดในหนวยไมโครวินาที(โดยตัวแปร int)


2.5.4 read() - Description คือฟงกชั่นอานคาองศาที่สั่งเขาไปดวยฟงกชั่น write() เพื่อใหรูวาตำแหนงองศา สุดทาย ที่สั่งเขาไปนั้นมีคาเทาไหร ซึ่งคาที่อานออกมานั้นจะมีคาอยูในชวง 0 - 180 - Syntax servo.read() - Parameters ไมมี: จะ Return คา 0-180 2.5.5 attached() - Description คือฟงกชั่นตรวจสอบวา Servo ที่ตองการใชก าลังตออยูกับขาสัญญาณของ Arduino หรือไม - Syntax servo.attached() - Parameters ไมมี: จะ Return คา True ออกมาหาก Servo Motor เชื่อมตออยูกับ Arduino แตถาหาก Return ออกมาเปนคาอื่นถือวาไมเชื่อมตอ 2.5.6 detach() - Description คือฟงกชั่นคืนสถานะของขาที่เรากำหนดใหเปนขาควบคุม Servo Motor ดวยคำสั่ง attached() ใหกลับคือสูการใชงานปกติ - Syntax servo.detach() - Parameters ไมมี 2.6 การเชื่อมตอ RC Servo Motor เขากับบอรด Arduino ภาพที่ 11.8 EFDV245 Futaba S3003 Servo Motor เชื่อมตอกับบอรด Arduino (ที่มา sparkfun.com/tutorials/283) โปรแกรมที่ 10.1 การควบคุมตำแหนง RC Servo Motor #include <Servo.h> Servo myservo;


void setup() { myservo.attach(9); } void loop() { myservo.write(0); delay(1000); myservo.write(90); delay(1000); myservo.write(180); delay(1000); } เมื่ออัพโหลดโปรแกรมเรียบรอย ผลการควบคุมตำแหนง RC Servo Motor เปนดังนี้ ภาพที่ 11.9 การควบคุมตำแหนง RC Servo Motor (ที่มา www.Sparkfun.com/tutorials/283) myservo.write(0); delay(1000); Servo Motor จะหมุนไปที่ตำแหนง 0 องศา และ หยุดเปนเวลา 1 วินาที ภาพที่ 11.10 Servo Motor จะหมุนไปที่ตำแหนง 0 องศา (ที่มา www.Sparkfun.com/tutorials/283)


myservo.write(90); delay(1000); Servo Motor จะหมุนไปที่ตำแหนง 90 องศา และ หยุดเปนเวลา 1 วินาที ภาพที่ 11.11 Servo Motor จะหมุนไปที่ตำแหนง 90 องศา (ที่มา www.Sparkfun.com/tutorials/283) myservo.write(90); delay(1000); Servo Motor จะหมุนไปที่ตำแหนง 180 องศา และ หยุดเปนเวลา 1 วินาที จากนั้นจะหมุนกลับไปที่ตำแหนง 0 องศา และวนรอบไปเชนนี้เรื่อย ๆ โปรแกรมที่ 9.2 การควบคุมตำแหนง RC Servo Motor แบบ Sweep #include <Servo.h> Servo myservo; //create servo object to control a servo // a maximum of eight servo objects can be created int pos = 0; // variable to store the servo position void setup(){ myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop(){ for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees } myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for(pos = 180; pos>=1; pos-=1)// goes from 180 degrees to 0 degrees { myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } }


ผลการทำงานของโคดการควบคุมตำแหนง RC Servo Motor แบบ Sweep for(pos = 0; pos < 180; pos += 1){ myservo.write(pos); delay(15); } ลูป for กำหนดใหคา position มีคาเทากับ 0 และทุกๆ การทำงานคำสั่งภายใน for loop คา position จะเพิ่มคาขึ้น 1 คาจนถึง 180 ก็จะหลุดออกจาก loop ภายใน loop for ค าสั่ง myservo.write(pos); ก็คือการ กำหนดให Servo Motor หมุนไปยังตำแหนงมุมตามคาในตัวแปร pos และหนวงเวลา 15ms ดวยคำสั่ง delay(15); ดังนั้น Servo Motor จะคอยๆ หมุนอยางชาๆ จากตำแหนง 0 องศาไปที่ 180 องศา for(pos = 180; pos>=1; pos-=1) { myservo.write(pos); delay(15); } ใน loop for ที่สองนี้จะทำงานเชนเดียวกับใน loop for แรกเพียงแตเปลี่ยนคาเริ่มตนจาก 180 เปน 0 และลดลงคาลง 1 คาทุกๆ การท างาน 1 รอบ สงผลให Servo Motor จะหมุนจากตำแหนงมุม 180 องศา ไปยังมุม 0 องศาอยางชา ๆ เมื่อเพิ่มคาในคำสั่ง delay() ใหมากขึ้นจะพบวา Servo Motor จะหมุนชาลงและในทางกลับกันหา กลดคาใน delay() ลงจะพบวา Servo Motor จะหมุนเร็วขึ้น 2.7 การควบคุมตำแหนง RC Servo Motor โดยใช Potentiometer ภาพที่ 11.12 การควบคุมตำแหนง RC Servo Motor โดยใช Potentiometer (ที่มา www.Sparkfun.com/tutorials/283) โปรแกรมที่ 9.3 การควบคุมตำแหนง RC Servo Motor โดยใช Potentiometer #include <Servo.h> Servo myservo; // create servo object to control a servo int potpin = 0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin void setup(){ myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop(){


val = analogRead(potpin); // reads the value of the potentiometer value // between 0 and 1023) val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value // between 0 and 180) myservo.write(val); // sets the servo position according to the // scaled value delay(15); // waits for the servo to get there} ผลการทำงานของโคดการควบคุมตำแหนง RC Servo Motor โดยใช Potentiometer val = analogRead(potpin); อานคา Analog จาก Potentiometer ที่ตออยูที่ขา A0 เก็บไวในตัวแปร val val = map(val, 0, 1023, 0, 179); เนื่องจาก ADC ภายใน Arduino เปน ADC ขนาด 10-bit จึงอานคา Analog ไดตั้งแต0 – 1023 แต RC Servo Motor สามารถหมุนไดเพียงแค 1-180 องศา จึงตองใช Function map เพื่อทำการสเกลคาลงจาก 0- 1023 เปน 0-179 แลวน าไปเก็บไวในตัวแปร val myservo.write(val); เมื่อสเกลคา จาก 0-1023 ลงเหลือ 0-179 แลวก็น ามาสั่งให Servo Motor หมุนไปยังตำแหนงใน คาตัวแปร val delay(15); หนวงเวลา 15 ms ผลของการทำงานทำใหสามารถปรับตำแหนงองศาของ Servo Motor ไดโดยการหมุนปรับคา Potentiometer 2.7.1 Continuous Rotation Servo ภาพที่ 11.13 RC Servo Motor แบบที่สามารถหมุนได 360 องศา (ที่มา www.Pololu.com/blog/13/gettin-all-up-in-your-servos) Continuous Rotation Servo คือ RC Servo Motor แบบที่สามารถหมุนได 360 องศา สวนประกอบ ภายนอกนั้นจะมีหนาตาคลายกับ RC Servo Motor แบบที่หมุนได 180 องศา เพียงแตจะมี Potentiometer เพื่อ ใชสำหรับปรับตำแหนง Center Stop Adjust ของตัว Servo ลักษณะการใชงาน RC Servo Motor ชนิดนี้จะแตกตางจากการใชงาน RC Servo Motor แบบ 180


องศาตรงที่ Servo ชนิดนี้จะใชความกวางของสัญญาณพัลสในการก าหนดความเร็วและทิศทางในการหมุน ไมไดใช เพื่อกำหนดมุมจึงไมสามารถกำหนดให Motor หมุนไปยังตำแหนงมุมตาง ๆ ตามความตองการได สัญญาณความ กวางของพัลสที่ใชควบคุมจะอยูในชวง 1000-2000 us แตจะมีความแตกในความหมายของแตละความกวางของพัลส ดังนี้ ความกวาง 1000 us หมายถึงการหมุนไปทางซายดวยความเร็วสูงสุดที่ Servo Motor จะหมุนได ภาพที่ 11.14 การหมุนไปทางซายดวยความเร็วสูงสุดของ Servo Motor (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos) ความกวาง 1500 us หมายถึงการสั่งให Servo Motor หยุดหมุน ภาพที่ 11.15 การสั่งให Servo Motor หยุดหมุน (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos) ความกวาง 2000 us หมายถึงการหมุนไปทางขวาดวยความเร็วสูงสุดที่ Servo Motor จะหมุนได ภาพที่ 11.16 การสั่งให Servo Motor หยุดหมุน (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos) 2.7.2 การ Calibrate Center Stop ในการใชงาน Continuous Rotation Servo เมื่อซื้อมาใหมหรือใชงานไปสักระยะหนึ่งจุด Center Stop อาจมีการคลาดเคลื่อนได ซึ่งแมเราสั่งใหสัญญาณพัลสมีความกวางเทากับ 1500 us ไป Continuous rotation


servo ก็จะไมหยุดหมุน เราจึงตองปรับตั้งคา Center Stop ดังนี้ - ตอ Continuous rotation servo เขากับ Arduino ภาพที่ 11.17 การ Calibrate Center Stop (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos) - เขียนโปรแกรมจายความกวางพัลซ 1500 us ใหกับ Servo Motor #include <Servo.h> Servo myServo; void setup() { myServo.attach(9); myServo.writeMicroseconds(1500); // Stop } - เมื่อรันโปรแกรมจายความกวางพัลส1500 us แลว Servo Motor ไมหยุดหมุน ใหใชไขควงขนาดเล็กหมุน ปรับ Center Stop Adjust จน Servo Motor หยุดหมุน ภาพที่ 11.18 การปรับ Center Stop Adjust (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos) - การควบคุม Continuous Rotation Servo โดยใช Potentiometer ปรับความเร็วและทิศทางการหมุน ภาพที่ 11.19 ควบคุม Continuous Rotation Servo โดยใช Potentiometer (ที่มา www.Pololu.com/blog/13/getting-all-up-in-your-servos)


Click to View FlipBook Version