ภาพที่ 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)