รูปแบบฟังกช์ นั toggle _a (x); toggle _b (x); toggle _c (x); toggle _d (x); โดยที่ x คอื การกาหนดพอรต์ ท่ตี ้องการกลบั ค่าสัญญาณดจิ ิตอล มคี ่าต้งั แต่ 0 ถงึ 7 ตวั อยา่ งที่ 6.4 // กลบั ค่าสญั ญาณดิจติ อลท่ีพอร์ต PB2 toggle _b (2); // กลบั ค่าสญั ญาณดิจติ อลที่พอรต์ PC5 toggle _c (5); 6.1.4 ฟงั กช์ นั sw เป็นฟังก์ชันสาหรับตรวจสอบสถานสวิตช์ SW1 ถึง SW3 บนแผงวงจร Display-POWER ประกอบดว้ ย sw1( ) : ตรวจสอบสถานะการกดสวิตช์ sw1 sw2( ) : ตรวจสอบสถานะการกดสวิตช์ sw2 sw3( ) : ตรวจสอบสถานะการกดสวิตช์ sw3 รปู แบบฟงั กช์ นั เป็นมาโครฟงั กช์ ันสาหรับอา่ นค่าระดับสัญญาณดิจติ อลทต่ี ่อวงจรเข้ากับสวติ ช์ การคนื คา่ 0 เมอ่ื สวิตชถ์ ูกกด และ 1 เมื่อไมถ่ ูกกด ตวั อย่างท่ี 6.5 #include <in_out.h> // เชือ่ มโยงไลบรารี in_out.h เพอ่ื เรยี กใช้ฟังก์ชนั sw1 #include <lcd.h> // เชอ่ื มโยงไลบรารี lcd.h เพอ่ื เรียกใชฟ้ งั ก์ชนั lcd #include <sleep.h> // เช่อื มโยงไลบรารี sleep.h เพื่อเรยี กใช้ฟงั กช์ ัน sleep void main() { // โปรแกรมหลัก (Main Function) while(1) { // วนรอบไม่ร้จู บ if (sw1() == 0) { // ตรวจสอบสวิตช์ sw1 ถกู กดหรอื ไม่ lcd (“sw1 active!”); // แสดงข้อความวา่ สวิตชถ์ ูกกด sleep(500); // หน่วงเวลาเพอื่ แสดงข้อความ } 96
else { // กรณีที่สวติ ช์ sw1 ไมถ่ กู กด lcd (“#c”); // ลา้ งขอ้ ความที่โมดลู LCD } } } 6.1.5 ฟังกช์ ัน sw_press เป็นฟังก์ชันสาหรับอ่านค่าสถานะของสวิตช์ SW1 ถึง SW2 บนแผงวงจร Display-POWER ประกอบดว้ ย sw1_press( ) : ตรวจสอบสถานะการกดสวิตช์ sw1 ในลักษณะรอจนกว่าจะมีการกดสวติ ช์ sw1 sw2_press( ) : ตรวจสอบสถานะการกดสวติ ช์ sw2 ในลกั ษณะรอจนกวา่ จะมีการกดสวติ ช์ sw2 sw3_press( ) : ตรวจสอบสถานะการกดสวิตช์ sw3 ในลักษณะรอจนกว่าจะมีการกดสวติ ช์ sw3 รปู แบบฟงั ก์ชัน เปน็ มาโครฟังกช์ ันสาหรบั ตรวจสอบการกดสวิสต์ ตัวอย่างท่ี 6.6 // เชอ่ื มโยงไลบรารี in_out.h เพอ่ื เรยี กใช้ฟงั ก์ชัน sw1 #include <in_out.h> // เชอ่ื มโยงไลบรารี lcd.h เพ่ือเรียกใช้ฟงั กช์ ัน lcd #include <lcd.h> // เช่ือมโยงไลบรารี sleep.h เพอ่ื เรยี กใชฟ้ ังก์ชัน sleep #include <sleep.h> // โปรแกรมหลกั (Main Function) void main() { // ประกาศตวั แปร i เพอ่ื เกบ็ คา่ การนับ // แสดงข้อใหก้ ดสวิตช์ sw2 เพื่อเข้าสกู่ ารนบั คา่ int i = 0; // รอจนกว่าจะมีการกดสวติ ช์ sw2 lcd (“Press sw2 to run#c”); sw2_press( ); while(1) { // วนรอบไมร่ ้จู บ lcd(“Count : %d”, i++); // แสดงคา่ การนบั ของตวั แปร i ทโ่ี มดูล LCD sleep(1000); // หน่วงเวลาประมาณ 1 วนิ าที } } 97
6.2 sleep.h เป็นไลบรารีสนบั สนุนชุดคาส่ังเก่ียวกับการหน่วงเวลาในหน่วยมิลลวิ ินาที การเรียกใช้งานฟงั ก์ชันภายใน ไลบรารีต้องผนวกไลบรารีที่ตอนตน้ ของโปรแกรมดว้ ยคาสงั่ #include <sleep.h> รปู แบบฟงั กช์ ัน sleep (ms) โดยท่ี ms คือ การกาหนดคา่ เวลาท่ีต้องการหนว่ ง หน่วยเปน็ มลิ ลิวินาที มีค่า 0 ถึง 65,535 ตัวอยา่ งที่ 6.7 // หนว่ งเวลาประมาณ 20 มลิ ลวิ ินาที sleep (20); // หน่วงเวลาประมาณ 1 วนิ าที sleep (1000); 6.3 analog.h เป็นไลบรารีสนับสนุนการอ่านค่าจากขาพอร์ตอินพุตอนาลอกของไมโครคอนโทรลเลอร์ การเรียกใช้งาน ฟังก์ชนั ภายในไลบรารีตอ้ งผนวกไลบรารีท่ีตอนตน้ ของโปรแกรมดว้ ยคาสง่ั #include <analog.h> 6.3.1 ฟังกช์ นั analog เป็นฟังก์ชันอ่านค่าค่าจากโมดูลแปลงสัญญาณอนาลอกเป็นดิจิตอลของพอร์ต A โดย โมดูลแปลงสัญญาณอนาลอกเป็นดิจิตอลของไมโครคอนโทรลเลอร์ ATmega16 ที่ใช้ในแผงวงจรหลัก MicroBOX ของชุดหุ่นยนต์ IPST-BOT มีความละเอียดในการแปลงสญั ญาณ 10 บิต รปู แบบฟังก์ชัน analog (channel) โดยที่ channel คือ การกาหนดพอร์ตอินพุทอนาลอกที่ต้องการอ่านค่า มีค่า 0 ถึง 7 ซึ่งตรงกับพอร์ต PA0 ถงึ PA7 การคนื ค่า ข้อมูลดิจิตอลท่ีได้จากการแปลงสัญญาณของโมดูลสัญญาณอนาลอกเป็นดิจิตอลของพอร์ต A คา่ ท่เี ปน็ ไปได้ คอื 0 จนถึง 1,023 98
ตัวอยา่ งท่ี 6.8 // กาหนดตัวแปรสาหรบั เกบ็ คา่ อนาลอกที่อ่านได้ int adc_val = 0; // อ่านค่าอนาลอกพอร์ต PA2 แล้วเก็บค่าที่อ่านได้ท่ีตัวแปร adc_val = analog(2); adc_val 6.3.2 ฟังกช์ ัน knob เป็นฟังก์ชันอ่านค่าค่าจากโมดูลแปลงสัญญาณอนาลอกเป็นดิจิตอลของพอร์ต A7 โดย เฉพาะ เนื่องจากพอร์ต A7 ต่อตัวต้านทานปรับค่าได้ 10Ω ไว้ และที่ปลายท้ังสองขาต่อกับไฟเลี้ยง +5V และ กราวด์ โดยวงจรของตวั ต้านทานปรับค่าได้ทาหน้าทเ่ี สมือนเป็นแหล่งจ่ายแรงดันปรับคา่ ได้ 0 ถึง +5V สาหรับ ใช้สาหรับทดสอบการทางานของโมดูลแปลงสัญญาณอนาลอกเป็นดิจิตอลของไมโครคอนโทรลเลอร์ ATmega16 มคี วามละเอียดในการแปลงสญั ญาณ 10 บติ รปู แบบฟงั กช์ ัน knob ( ) การคนื คา่ ขอ้ มูลดิจิตอลมราได้จากการแปลงสัญญาณของโมดูลสัญญาณอนาลอกเป็นดิจิตอลของพอร์ต A7 ค่าทเ่ี ปน็ ไปได้ คอื 0 จนถึง 1,023 ตัวอย่างที่ 6.9 // กาหนดตัวแปรสาหรับเกบ็ ค่าอนาลอกที่อา่ นได้ int adc_val = 0; // อ่านค่าอนาลอกพอร์ต A7 แล้วเก็บค่าที่อ่านได้ที่ตัวแปร adc_val = knob( ); adc_val 6.4 lcd.h เป็นไลบรารีสนับสนุนชุดคาส่ังเก่ียวกับการแสดงข้อความที่โมดูล LCD บนแผงวงจร Display-POWER การเรียกใชง้ านฟงั ก์ชันภายในไลบรารตี ้องผนวกไลบรารที ่ีตอนต้นของโปรแกรมด้วยคาส่ัง #include <lcd.h> 6.4.1 ฟงั กช์ ัน lcd หรือ LCD เป็นฟงั ก์ชันแสดงผลข้อความที่โมดูล LCD แบบ 16 ตัวอักษร 2 บรรทดั รูปแบบฟังก์ชัน lcd (p) พารามเิ ตอร์ p คือ การกาหนดรูปแบบการแสดงผลที่โมดูล LCD โดยสามารถกาหนดรูปแบบการแทรก สัญญาณพเิ ศษ เพ่อื ร่วมแสดงผลคา่ ข้อมูลและตัวเลขได้ มรี ายละเอยี ดดงั นี้ 99
รหสั บังคบั การทางาน %c หรือ %C แสดงผลตัวอักษร 1 ตวั %d หรือ %D แสดงผลตวั เลขฐานสบิ ในช่วง –32,768 ถงึ +32,767 %l หรอื %L แสดงผลตวั เลขฐานสบิ ในช่วง –2,147,483,648 ถึง +2,147,483,647 %f หรอื %F แสดงผลขอ้ มูลแบบจานวนจริงทศนิยม 3 ตาแหนง่ #c ป้อนคาสั่งพิเศษเพื่อล้างข้อความก่อนแสดงผลในคร้ังถัดไป #n ปอ้ นคาสั่งพเิ ศษเพ่ือนาข้อความไปแสดงในบรรทดั ที่ 2 หมายเหตุ การกาหนดลาดับในการแสดผลจะต้องตรงกับลาดับรหัสท่ีจะทางานน้ันๆ หากไม่ กาหนดตามลาดบั อาจเกดิ ความผิดพลาดในการแสดงผล ท่ี 2 ทนั ที ตัวอยา่ งท่ี 6.10 lcd (“abcdefghijklmnopqrstuvwxyz”); // แสดงผลข้อความในกรณีที่ชุดตัวอกั ษรเกิน 16 ตัวอักษร ตัวอักษรถัดไปจะถูกแสดงในบรรทัด ผลลพั ธ์ abcdefghijklmnop qrstuvwxyz ตวั อย่างที่ 6.12 // แสดงผลข้อความร่วมกับตวั เลข lcd (“Value : %d units”, 518); ผลลัพธ์ Value : 518 units ตัวอยา่ งที่ 6.13 // อ่านค่าอนาลอกท่ีพอร์ต PA4 แลว้ แสดงผล lcd (“Value : %d”, analog(4)); ผลลพั ธ์ Value :xxx โดยที่ xxx คอื ค่าทอ่ี ่านได้ มีค่าตงั้ แต่ 0 ถงึ 1,023 ตวั อย่างที่ 6.14 // แสดงตัวอกั ษร j ร่วมกบั ข้อความอ่ืนๆ char c_test = ‘j’; lcd (“abcd%cxyz”, c_test); ผลลัพธ์ abcdjcxyz 100
6.5 serial.h เป็นไลบรารีสนับสนุนชุดคาสั่งสาหรับรับ-ส่งข้อมูลผ่านโมดูลส่ือสารข้อมูลอนุกรรม UART ของ ไมโครคอนโทรลเลอร์ ATmega16 ผ่านวงจรเช่ือมต่อพอร์ตอนุกรม RS-232 บนแผงวงจร Display-MOTOR การเรยี กใชง้ านฟงั ก์ชันภายในไลบรารตี ้องผนวกไลบรารีท่ีตอนตน้ ของโปรแกรมด้วยคาส่งั #include <serial.h> การเช่อื มตอ่ ต่อสายเชื่อมต่อพอร์ตอนุกรม หรือสาย CX-4 เข้ากับจุดต่อพอร์ตอนุกรมบนแผงวงจร Display-MOTOR และปลายอีกข้างหนึ่งเป็นตัวเชื่อมแบบ DB-9 ตัวผู้ต่อเข้ากับพอร์ตอนุกรมของคอมพิวเตอร์ ในกรณีท่ี คอมพิวเตอรม์ ีเฉพาะพอร์ต USB ตอ้ งใชต้ วั แปลงสญั ญาณพอรต์ USB เป็นพอรต์ RS-232 6.5.1 ฟงั กช์ นั uart เปน็ ฟังก์ชันสง่ ขอ้ มูลออกทางวงจรภาคสง่ ของโมดูล UART โดยกาหนดอตั ราในการถ่ายโอนขอ้ มูล เป็นค่าตัง้ ต้นที่ 9,600 บิตต่อวนิ าที รูปแบบฟงั ก์ชัน uart (p) พารามเิ ตอร์ p คือ การกาหนดรูปแบบของข้อความท่ีต้องการส่งออกทางโมดูล UART โดยสามารถกาหนด รปู แบบการแทรกสัญญาณพิเศษ เพ่ือร่วมแสดงผลค่าข้อมลู และตัวเลขได้ มีรายละเอยี ดดงั นี้ รหสั บังคับ การทางาน %c หรอื %C แสดงผลตัวอักษร 1 ตวั %d หรอื %D แสดงผลตัวเลขฐานสบิ ในช่วง –32,768 ถึง +32,767 %l หรอื %L แสดงผลตวั เลขฐานสบิ ในช่วง –2,147,483,648 ถงึ +2,147,483,647 %f หรอื %F แสดงผลข้อมลู แบบจานวนจรงิ ทศนิยม 3 ตาแหน่ง \\r คาสั่งพเิ ศษเพ่ือกาหนดให้ข้อความชิดไปทางดา้ นซ้ายของบรรทดั \\n คาสั่งพเิ ศษเพ่ือกาหนดให้ข้อความข้นึ บรรทัดใหม่ 6.5.2 ฟงั ก์ชนั uart_set_baud เป็นฟังก์ชันกาหนดอัตราความเร็วในการถ่ายโอนข้อมูล หรืออัตราบอด (baud rate) ระหว่าง โมดลู UART ของไมโครคอนโทรลเลอร์กบั คอมพวิ เตอร์ รูปแบบฟังก์ชนั uart_set_baud (baud) 101
โดยที่ baud คือ การกาหนดอัตราความเร็วในการถ่ายโอนข้อมลู หรืออตั ราบอดในหน่วยบิตต่อวินาที ตัวอย่างที่ 6.17 uart_set_baud (4800); // กาหนดอัตราความเรว็ บอดเป็น 4800 บิตต่อวนิ าที 6.5.3 ฟังก์ชัน uart_getkey เป็นฟังก์ชันรับข้อมูลผ่านโมดูล UART ของไมโครคอนโทรลเลอร์ ATmega16 โดยเป็นการส่ง ข้อมลู ผ่านพอรต์ อนุกรม รปู แบบฟังก์ชัน uart_getkey ( ) การคืนค่า 0 เม่อื ไมม่ กี ารรบั ตวั อักษรใดๆ เข้ามาในวงจรภาครับของโมดลู UART รหสั ASCII ของตัวอักษรที่ไดร้ บั เข้ามายงั วงจรภาครับของโมดลู UART ตัวอยา่ งท่ี 6.18 #include <serial.h> // เช่ือมโยงไลบรารี serial.h เพ่ือเรียกใช้ฟังก์ชัน uart_getkey #include <lcd.h> // เช่ือมโยงไลบรารี lcd.h เพือ่ เรียกใช้ฟงั กช์ นั lcd #include <sleep.h> // เช่อื มโยงไลบรารี sleep.h เพอื่ เรยี กใชฟ้ ังกช์ นั sleep void main() { // โปรแกรมหลกั (Main Function) while(1) { // วนรอบไมร่ ูจ้ บ if(uart_getkey( ) == ‘a’) { // ตรวจจับการกดตวั อักษร ‘a’ lcd(“Key a Active”); // แสดงขอ้ ความเมื่อได้รับค่ารหสั ASCII ‘a’ sleep(1000); // หน่วงเวลาประมาณ 1 วนิ าที } else lcd(“#c”); // ลา้ งหนา้ จอแสดงผลโมดูล LCD } } หมายเหตุ สาหรับการเรียกใช้งานฟังก์ชัน uart เพ่ือส่งข้อมูลออกทาง UART และฟังก์ชัน uart_getkey เพ่ือตรวจจับการกดตัวอักษรใดๆ นั้น อัตรบอดในการสื่อสารข้อมูลระหว่างโมดูล UART ได้ถูก กาหนดเป็น 9600 บติ ตอ่ วินาที 8 บิตข้อมูล และไม่ใช้งานบิตความสาคัญอัตโนมัติ (เป็นค่าตั้งตน้ ) เพือ่ ลดความ 102
ซับซ้อนในการเขียนโปรแกรมลง แต่ในการพัฒนาโปรแกรมสามารถเปลี่ยนแปลงค่าอัตราบอดในการส่ือสาร ข้อมูลได้โดยใช้ฟังก์ชัน uart_set_baud แต่มีข้อแม้ คือ เม่ืออัตราบอดในการส่ือสารข้อมูลสูงข้ึนอาจส่งผลต่อ ความถกู ตอ้ งในการสื่อสารข้อมูลดว้ ย 6.6 motor.h เป็นไลบรารีสนับสนุนชุดคาสั่งเก่ียวกับการควบคุมมอเตอร์ไฟตรง โดยทางานร่วมกับวงจรขับมอเตอร์ ไฟตรงบนแผงวงจร Display-MOTOR การเรยี กใช้งานฟังก์ชันภายในไลบรารีต้องผนวกไลบรารีท่ีตอนต้นของ โปรแกรมด้วยคาสง่ั #include <motor.h> การเชื่อมตอ่ ทางฮาร์ดแวร์ มอเตอร์ชอ่ ง 1 (M1) - ต่อพอร์ต PD2 ของแผงวงจรหลักเข้ากับอินพุต 1A ของวงจรขับมอเตอร์ - ต่อพอรต์ PD2 ของแผงวงจรหลักเข้ากับอนิ พุต 1B ของวงจรขบั มอเตอร์ - ตอ่ พอรต์ PD2 ของแผงวงจรหลกั เข้ากับอินพุต 1E ของวงจรขบั มอเตอร์ มอเตอร์ชอ่ ง 2 (M2) - ต่อพอรต์ PD7 ของแผงวงจรหลกั เข้ากับอนิ พุต 2A ของวงจรขบั มอเตอร์ - ต่อพอรต์ PD6 ของแผงวงจรหลักเข้ากับอินพุต 2B ของวงจรขับมอเตอร์ - ตอ่ พอร์ต PD5 ของแผงวงจรหลกั เข้ากับอินพุต 2E ของวงจรขับมอเตอร์ 6.6.1 ฟังก์ชัน motor เป็นฟงั ก์ชันสาหรบั ขบั มอเตอรไ์ ฟตรง รูปแบบฟงั กช์ ัน motor (char _channel, int _opwer) โดยท่ี _channel กาหนดชอ่ งของวงจรมอเตอร์ที่ต้องการใชง้ าน _power กาหนดกาลงั ขับของวงจรขับมอเตอร์ มีคา่ –100 ถึง 100 ถ้ากาหนดค่า _power ใหม้ คี ่าเปน็ บวก (1 ถึง 100) มอเตอร์หมนุ ไปทศิ ทางหนึ่ง ถา้ กาหนดค่า _power ให้มีคา่ เป็นลบ (-1 ถงึ -100) มอเตอร์หมุนไปทิศทางตรงข้าม และในกรณกาหนดค่า _power เป็น 0 มอเตอร์จะหยุดหมุน แกนหมุนของมอเตอร์ เป็นอิสระ (หากต้องการบังคับหรือหยุดการทางานของวงจรขับมอเตอร์ ควรเรียกใช้คาสั่ง motor_stop ซงึ่ สามารถทางานไดส้ มบูรณ์มากกวา่ ) 103
ตวั อย่างที่ 6.19 // ขับมอเตอร์ชอ่ ง 1 ด้วยกาลัง 60% ของกาลังสงู สุด motor (1, 60); // ขับมอเตอร์ช่อง 1 ด้วยกาลัง 60% ของกาลังสูงสุด motor (1, -60); โดยใหห้ มนุ ในทศิ ทางตรงขา้ ม motor (2, 100); // ขับมอเตอร์ชอ่ ง 2 ด้วยกาลัง 100% 6.6.2 ฟงั กช์ ัน motor_stop เปน็ ฟังก์ชนั สาหรับบังคับแกนหมุ คอื การหยดุ การทางานของมอเตอร์ รปู แบบฟังกช์ ัน motor_stop (char _channel) โดยที่ _channel กาหนดชอ่ งของวงจรมอเตอรท์ ี่ใหห้ ยุดทางาน 1 คือ หยุดการทางานของมอเตอรช์ ่องที่ 1 (M1) 1 คอื หยุดการทางานของมอเตอรช์ ่องท่ี 1 (M2) ALL คือ หยดุ การทางานของมอเตอรท์ ั้งหมด (M1 และ M2) ตวั อย่างท่ี 6.20 motor_stop (1); // หยดุ การทางานมอเตอรช์ อ่ ง 1 motor_stop (2); // หยุดการทางานมอเตอร์ช่อง 2 motor_stop (ALL); // หยดุ การทางานมอเตอรท์ ง้ั หมด (ช่อง1 และชอ่ ง 2) 6.7 sound.h เป็นไลบรารีสนับสนุนชุดคาส่ังเก่ียวกับการกาเนิดเสียง โดยทางานร่วมกับแผงวงจรลาโพง ZX- SPEAKER การเรยี กใช้งานฟงั กช์ นั ภายในไลบรารตี อ้ งผนวกไลบรารที ี่ตอนตน้ ของโปรแกรมด้วยคาสง่ั #include <sound.h> 6.7.1 ฟงั กช์ นั sound เป็ น ฟั งก์ ชัน กาเนิ ด สั ญ ญ าณ ค ว าม ถี่ เพ่ื อขั บ เสี ย งออ ก ยั งพ อ ร์ ต ขอ งไม โค ร ค อน โท รล เล อ ร์ ATmega16 ซ่ึงประกอบไปดว้ ย sound_a กาเนดิ เสียงทีพ่ อร์ตใดๆ ของพอรต์ A sound_b กาเนิดเสยี งที่พอร์ตใดๆ ของพอรต์ B sound_c กาเนิดเสียงท่ีพอร์ตใดๆ ของพอร์ต C sound_d กาเนดิ เสียงท่ีพอร์ตใดๆ ของพอร์ต D รปู แบบฟงั ก์ชนั sound_a (char ch, int freq, int time) 104
sound_b (char ch, int freq, int time) sound_c (char ch, int freq, int time) sound_d (char ch, int freq, int time) โดยท่ี ch ใช้สาหรบั กาหนดพอร์ตทีต่ ้องการใชง้ าน มคี า่ 0 ถึง 7 freq กาหนดคา่ ความถี่ของสัญญาณเสยี งท่ีต้องการส่งออก time กาหนดช่วงเวลาของเสียง มีหนว่ ยเปน็ จานวนเต็มเท่าของ 0.1 มลิ ลวิ นิ าที 6.7.2 ฟงั ก์ชนั beep เป็นฟังก์ชันสาหรับกาเนิดสัญญาณความถ่ี 2 kHz เป็นเวลา 10 วินาที เพื่อขับเสียงออกยัง พอร์ตใดของไมโครคอนโทรลลเลอร์ ATmega16 เม่ือต่อแผงวงจรลาโพงเข้าที่พอร์ต เสียงท่ีได้ยินจะเป็น เสียง “ตด๊ิ ” รปู แบบฟังก์ชัน beep_a (char ch) beep_b (char ch) beep_c (char ch) beep_d (char ch) โดยท่ี ch ใช้สาหรับกาหนดพอร์ตท่ตี ้องการใช้งาน มคี ่า 0 ถงึ 7 ตวั อย่างที่ 6.21 // กาเนิดเสียงความถ่ี 2 kHz นาน 10 มิลลิวินาที ที่ beep_d (2); พอรต์ PA2 sound_b (4, 800, 500); // กาเนิดเสียงความถี่ 800 Hz นาน 50 มิลลิวินาที ท่ี พอร์ต PB4 6.8 servo.h เป็นไลบรารีสนับสนุนชุคาสั่งเก่ียวกับการควบคุมเซอร์โวมอเตอร์ มีความสามารถในการควบคุม ตาแหน่งของเซอร์โวมอเตอรไ์ ด้ถึง 5 ตัวในเวลาเดียวกัน โดยทางานร่วมกบั แผงวงจร Display-MOTOR การ เรยี กใชง้ านฟังกช์ นั ภายในไลบรารตี อ้ งไลบรารที ี่ตอนต้นของโปรแกรมด้วยคาส่งั #include <sound.h> 105
การกาหนดพอร์ตสาหรับควบคมุ การทางานของเซอร์โวมอเตอร์ ตอ้ งกาหนดพอรต์ ดงั น้ี - เซอร์โวมอเตอรช์ ่อง 0 คือ กาหนดพอร์ต PB0 - เซอรโ์ วมอเตอร์ช่อง 1 คอื กาหนดพอร์ต PB1 - เซอร์โวมอเตอรช์ อ่ ง 2 คือ กาหนดพอรต์ PB2 - เซอรโ์ วมอเตอรช์ ่อง 3 คอื กาหนดพอร์ต PB3 - เซอร์โวมอเตอรช์ อ่ ง 4 คือ กาหนดพอรต์ PB4 ดังน้ัน เม่ือต้องการใช้พอร์ตเซอร์โวมอเตอร์ จาเป็นต้องหลีกเลี่ยงการใช้งานพอร์ตดังกล่าว เพื่อให้การ ทางานเป็นไปอย่างถูกต้อง เช่น เม่ีอต้องการใช้งานเซอร์โวมอเตอร์ 2 ตัว โดยเลือกใช้งานช่อง 0 และ 1 ที่ พอร์ต PB0 และ PB1 จะต้องไม่มีอุปกรณ์ใดๆ ใช้งานพอร์ตดังกล่าว และในส่วนของพอร์ต PB2 PB3 และ PB4 ยังสามารถใชง้ านได้ตามปกติ การเช่อื มต่อ ติดตั้งแผงวงจร Display-MOTOR เข้ากับแผงวงจรหลัก MicroBOX และต่อเซอร์โวมอเตอร์เข้าที่จุด ตอ่ เซอร์โวมอเตอร์บนแผงวงจร Display-MOTOR สามารถต่อใชง้ านเซอรโวมอเตอรไ์ ดพ้ รอ้ มกนั 5 ตวั 6.8.1 ฟังกช์ นั servo เป็นฟังก์ชันกาเนิดตาแหน่งแกนหมุนของเซอร์โวมอเตอร์ สามารถใช้งานกับเซอร์โวมอเตอร์ แบบมาตรฐาน (หมุนได้ 120 ถึง 180 องศา) ทีย่ ังไมม่ กี ารปรับแต่งให้หมุนได้ 360 องศา รูปแบบฟงั ก์ชนั servo (char _ch, int _pos) โดยท่ี การกาหนดชอ่ งเซอรโ์ วมอเตอร์ _ch คอื 0 เมอ่ื ต้องการให้เซอรโ์ วมอเตอร์ชอ่ ง 0 ทางาน 1 เมื่อต้องการใหเ้ ซอรโ์ วมอเตอร์ชอ่ ง 1 ทางาน _pos คือ 2 เมื่อต้องการให้เซอรโ์ วมอเตอร์ช่อง 2 ทางาน 3 เมอื่ ต้องการให้เซอร์โวมอเตอร์ชอ่ ง 3 ทางาน 4 เม่อื ต้องการให้เซอร์โวมอเตอรช์ อ่ ง 4 ทางาน การกาหนดตาแหน่งเซอร์โวมอเตอร์ มีค่า 20 ถึง 190 (ต้องปรับค่าตาแหน่งให้ เหมาะสมกบั เซอรโ์ วมอเตอรแ์ ตล่ ะรุน่ และแตล่ ะยีห่ อ้ ) 6.8.2 ฟงั ก์ชนั servo_stop เปน็ ฟงั กช์ ันสาหรบั หยุดเซอรโ์ วมอเตอร์ทกุ ช่องพร้อมกนั รปู แบบฟังก์ชนั servo_stop ( ) 106
6.8.3 ฟังก์ชัน servo_pause เป็นฟังก์ชนั สาหรับหยุดเซอร์โวมอเตอร์ในชอ่ งที่กาหนด รูปแบบฟังก์ชนั servo_pause (char _ch) โดยท่ี _ch คอื การกาหนดช่องเซอรโ์ วมอเตอร์ มคี า่ 0 ถึง 4 6.8.4 ฟงั กช์ ัน servo_resume เป็นฟังก์ชันขับเซอร์โวมอเตอร์ในช่องที่กาหนด เพื่อขับแกนหมุนให้ทางานโดยเป็นการทางาน ต่อเนอ่ื งจากฟงั ก์ชัน servo_pause รูปแบบฟังก์ชนั servo_resume (char _ch) โดยที่ _ch คอื การกาหนดชอ่ งเซอรโ์ วมอเตอร์ มคี า่ 0 ถงึ 4 6.8.5 ฟงั กช์ นั servo_get_status เปน็ ฟังก์ชันอา่ นสถานะการใช้งานของเซอรโ์ วมอเตอร์ในชอ่ งทก่ี าหนด รปู แบบฟงั ก์ชนั servo_get_status (char _ch) โดยที่ _ch คอื การกาหนดชอ่ งเซอรโ์ วมอเตอร์ มีคา่ 0 ถึง 4 การคนื ค่า 1 เมื่อเซอร์โวมอเตอร์ช่องที่กาหนดหรือต้องการติดต่ออยู่ในสถานะ “ถูกใช้งาน” (สามารถ บังคบั แกนหรอื หยุดการทางานได)้ 0 เม่ือเซอร์โวมอเตอร์ช่องท่ีกาหนดหรือต้องการติดต่ออยู่ในสถานะ “ไม่ได้ถูกใช้งาน” (แกน หมุนเปน็ อิสระ) 107
บทที่ 7 การขบั เคลอ่ื นหุน่ ยนต์ IPST-BOT 7.1 การจดั การควบคมุ มอเตอร์ไฟตรงของห่นุ ยนต์ IPST-BOT หุ่นยนต์ IPST-BOT ใช้แผงวงจร Display-MOTOR เป็นอุปกรณ์หลักในการจัดการพลังงานและเช่ือมต่อ พอร์ต PD2 – PD7 ของไมโครคอนโทรลเลอร์จากแผงวงจรหลัก MicorBOX มายังวงจรขับไฟตรง 2 ช่อง คือ M1 และ M2 สาหรบั มอเตอรช์ ่อง 1 (M1) - ตอ่ พอรต์ PD2 ของแผงวงจรหลกั เข้ากับอินพุต 1A ของวงจรขับมอเตอร์ - ตอ่ พอร์ต PD3 ของแผงวงจรหลกั เข้ากับอินพุต 1B ของวงจรขับมอเตอร์ - ตอ่ พอร์ต PD4 ของแผงวงจรหลักเข้ากับอินพุต 1E ของวงจรขบั มอเตอร์ สาหรบั มอเตอรช์ ่อง 2 (M2) - ต่อพอรต์ PD7 ของแผงวงจรหลกั เข้ากับอนิ พุต 2A ของวงจรขบั มอเตอร์ - ตอ่ พอรต์ PD6 ของแผงวงจรหลักเข้ากับอินพุต 2B ของวงจรขบั มอเตอร์ - ต่อพอรต์ PD5 ของแผงวงจรหลกั เข้ากับอนิ พุต 2E ของวงจรขับมอเตอร์ แรงดันไฟสาหรับชุดเฟืองขับมอเตอร์ (มอเตอร์ไฟตรง) มาจากแบตเตอรี่ AA จานวน 5 ก้อน ที่ต่อกับ DC Input โดยระดับแรงดันไฟเล้ยี งชุดเฟีองขับมอเตอร์ คอื +6 ถึง +7.5 โวลต์ บนแผงวงจร Display-MOTOR มีวงจรตรวจสอบระดับไฟเล้ียง โดยแจ้งผลการทางานด้วย LED 5 ดวง หาก LED สีแดงในตาแหน่งขวาสุดกระพริบ คือ แจ้งเตือนว่าขณะน้ีไฟเล้ียงมีค่า 7.5V หรือมากกว่า หากนา เซอร์โวมอเตอร์มาต่อใช้งานจะต้องระมัดระวังด้วย แต่สาหรับชุดเฟืองขับมอเตอร์สามารถใช้ได้ เน่ืองจากรับ แรงดันไฟได้ +4.8 ถงึ +12V 7.2 การกาหนดตาแหน่งของมอเตอร์สาหรับหุน่ ยนต์ IPST-BOT สาหรับตวั หนุ่ ยนต์ IPST-BOT ใช้มอเตอร์ไฟตรงพรอ้ มชดุ เฟืองขบั 2 ชดุ ในการขับเคลื่อน โดย มอเตอร์ M1 ขับลอ้ ซา้ ย มอเตอร์ M2 ขบั ล้อขวา 108
ชุดเฟอื งมอเตอรแ์ ละล้อซ้าต่อกับ M1 ชุดเฟอื งมอเตอรแ์ ละล้อซ้าต่อกับ M2 รูปที่ 7.1 แสดงการกาหนดตาแหน่งของมอเตอร์ไฟตรงและลอ้ ของชดุ หุน่ ยนต์ IPST-BOT 109
การทดลองที่ 7.1 ทดสอบการขบั และทศิ ทางการหมนุ ของชดุ เฟอื งขับมอเตอรไ์ ฟตรง การทดลองน้ีเป็นการเขียนโปรแกรมเพ่ือทดสอบการทางานของวงจรขับมอเตอรไฟตรงของหุ่นยนต์ IPST-BOT ทัง้ ในดา้ นขว้ั ของแรงดันทีจ่ ่ายไปยงั มอเตอรแ์ ละทิศทางการหมนุ การเชอื่ มตอ่ อุปกรณ์ ต่อชุดเฟืองมอเตอร์ไฟตรงเข้ากับ M1 และ M2 ของแผงวงจร Display-MOTOR โดยมอเตอร์ท่ีต่อกับ จุด M1 เปน็ มอเตอร์ทางซ้าย และมอเตอรท์ ่ีต่อกับ M2 เป็นมอเตอรท์ างขวา ขัน้ ตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชอื่ motor_test และพมิ พ์โปรแกรม 1-1 2. คอมไพลใ์ ห้ไดผ้ ลลัพธน์ ามสกุล .hex แล้วนาไปดาวน์โหลดลงสู่แผงวงจรควบคมุ หลกั ของหุ่นยนต์ 3. ปิดไฟเลี้ยง ปลดชุดโปรแกรมข้อมูลออกจากหุ่นยนต์ จากน้ันเปิดไฟเลี้ยงเพื่อเตรียมทดสอบการ ทางาน 4. ตอ่ มอเตอรด์ ้านซา้ ยเข้ากับ M1 แลว้ รนั โปแรแกรมดว้ ยการกดสวิตช์ RESET 5. ตอ่ เมอเตอรด์ า้ นขวาเข้ากบั M2 สงั เกตการทางานของมอเตอร์ โปรแกรม 7.1 #include <motor.h> void main () { motor(1,80); motor(2,80); } คาอธบิ ายโปรแกรม โปรแกรมส่ังขับมอเตอร์ช่อง 1 และ 2 ด้วยกาลัง +80% ของกาลังขับสูงสุด LED แสดงสถานะการ ทางานของวงจรขับมอเตอร์บนแผงวงจร Display-MOTOR จะเป็นสีเขียว (ในกรณีที่ขับมอเตอร์ด้วยกาลัง ค่าลบ LED จะเป็นสแี ดง) โดยทั่วไปไฟแสดงผลของวงจรขับมอเตอร์แต่ละช่องควรจะสอดคล้องกับทิศทางการเคลื่อนที่ของ หนุ่ ยนต์ คือ - หากวงจรขับมอเตอรถ์ ูกขับด้วยกาลังไฟฟ้าค่าบวก มอเตอร์ท่ีตอ่ กับเอาท์พตุ ของวงจรขบั มอเตอร์ช่อง น้นั ๆ ควรจะหมนุ เพ่อื ขับเคลอ่ื นห่นุ ยนตไ์ ปขา้ งหนา้ ไฟแสดงสถานะต้องตดิ สวา่ งเป็นสเี ขียว 110
- หากวงจรขับมอเตอร์ถูกขับด้วยกาลังไฟฟ้าค่าลบ มอเตอร์ที่ต่อกับเอาท์พุตของวงจรขับมอเตอร์ช่อง นั้นๆ ควรจะหมุนเพ่ือขับเคลือ่ นห่นุ ยนตถ์ อยหลงั ไฟแสดงสถานะต้องตดิ สว่างเป็นสแี ดง รปู ท่ื 7.2 การเชือ่ มต่อชุดโปรแกรมเพ่ือดาวนโ์ หลดโปรแกรมไปยังห่นุ ยนต์ IPST-BOT 111
7.3 สร้างฟงั กช์ นั การขบั เคล่ือนหุ่นยนต์พ้ืนฐาน ในการสร้างฟังก์ชันควบคุมการเคลื่อนที่นี้จะใช้ฟังก์ชันพ้ืนฐานในการควบคุมมอเตอร์จากไฟล์ไบบรารี motor.h และฟงั กช์ นั การหนว่ งเวลาจากไลบรารี sleep.h 7.3.1 ฟงั กช์ นั ขับเคลื่อนหนุ่ ยนต์ให้เคล่ือนท่ีตรงไปข้างหน้า หุ่นยนต์ IPST-BOT สามารถเคลื่อนท่ีไปข้างหน้าได้เม่ือชุดเฟืองขับมอเตอร์ท้ังคู่ถูกขับไปข้างหน้า หน้าท่ีของฟังก์ชันน้ี คือ ควบคุมให้มอเตอร์หุ่นยนต์หมุนไปในทิศทางที่ทาให้หุ่นยนต์เคล่ือนที่ไปข้างหน้า สาหรับชื่อของฟังก์ชันน้ี คือ forward มีตวั แปร delay สาหรบั รบั ค่าเวลาที่ต้องการกาหนดให้หุ่นยนต์เคลื่อนท่ี ตรงไปข้างหน้าในหนว่ ยวนิ าที #define POW 70 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } 112
7.3.2 ฟังก์ชนั ขบั เคล่ือนหนุ่ ยนต์ถอยหลังตรง หุ่นยนต์ IPST-BOT สามารถเคลื่อนที่ถอยหลังตรงได้เมื่อชุดเฟืองขับมอเตอร์ท้ังคู่ถูกขับไปข้างหลัง หน้าท่ีของฟังก์ชันนี้ คือ ควบคุมให้มอเตอร์ของหุ่นยนต์หมุนไปในทิศทาที่ทาให้หุ่นยนต์เคลื่อนท่ีถอยหลัง สาหรับช่ือของฟังก์ชัน คือ backward มีตัวแปร delay สาหรับรับค่าเวลาท่ีต้องการกาหนดให้หุ่นยนต์ เคลอ่ื นที่ถอยหลงั ตรงในหน่วยวนิ าที #define POW 70 void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } 113
7.3.3 ฟังก์ชันขับเคล่อื นหุ่นยนตเ์ ล้ียวซา้ ย หุ่นยนต์ IPST-BOT สามารถเล้ียวซ้ายได้เมื่อมอเตอร์ซ้ายหมุนถอยหลัง ส่วนมอเตอร์ขวาหมุนไป ขา้ งหน้า ตงั้ ช่อื ฟังกช์ ันนวี้ ่า turn_left มตี วั แปร dalay สาหรบั กาหนดค่าเวลาทตี่ ้องการใหห้ ุ่นยนตเ์ ล้ียวซา้ ย #define POW 70 void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } 114
7.3.4 ฟังก์ชันขบั เคลือ่ นหนุ่ ยนตเ์ ลี้ยวขวา หุ่นยนต์ IPST-BOT สามารถเล้ียวขวาได้เมื่อมอเตอร์ซ้ายหมุนไปข้างหน้า ส่วนมอเตอร์ขวาหมุน ถอยหลัง ต้งั ชื่อฟังก์ชันนวี้ า่ turn_right มตี ัวแปร dalay สาหรับกาหนดคา่ เวลาทต่ี ้องการใหห้ ุ่นยนต์เล้ยี วขวา #define POW 70 void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } 115
7.3.5 ฟงั กช์ นั หยุดหุ่นยนต์ เกิดจากการที่ชุดเฟืองขับมอเตอร์ทั้งสองตัวของหุ่นยนต์ IPST-BOT ถูกหยุดขับสัญญาณ ต้ังชื่อ ฟังก์ชันวา่ pause void pause( ) { motor_stop(1); motor_stop(2); } จะสังเกตวา่ ทุกฟังก์ชันจะมีการกาหนดกาลังขับมอเตอร์ภายในโปรแกรม โดยการกาหนดค่าตัวแปร POW ในตอนต้นของโปรแกรมทีค่ าส่ัง #define POW 70 ดังนั้นในการทางานของฟังก์ชันขับเคลอ่ื นหุ่นยนต์ดว้ ยมอเตอร์ทง้ั 2 ช่อง จะใช้ระดับกาลังขับท่ี 70% ของ กาลังสูงสุด ในกรณีที่ต้องการเปลี่ยนแปลงค่ากาลังขับทาได้ง่ายๆ ด้วยการแก้ไขค่าตัวเลขที่บรรทัดคาส่ัง ดงั กล่าว ซงึ่ จะสง่ ผลเปล่ยี นแปลงไปยงั คา่ ของตวั แปร POW ทุกจดุ ภายในโปรแกรม การทดลองท่ี 7.2 ทดสอบขบั เคลือ่ นหุ่นยนต์ IPST-BOT แบบพ้ืนฐาน การทดลองน้ีเป็นการทดสอบควบคุมให้หุ่นยนต์ IPST-BOT เคลื่อนทีแบบพื้นฐาน โดยกาหนดให้เคลื่อนท่ี ไปขา้ งหนา้ 2 วนิ าที แลว้ เลีย้ วซา้ ยเปลี่ยนทศิ ทางเปน็ เวลา 0.5 วินาทสี ลบั ไปมา ขนั้ ตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ช่ือ robo_basic และพมิ พโ์ ปรแกรมภาษา C ตามโปรแกรมที่ 7.2 2. คอมไพล์และดาวน์โหลดโปรแกรมเพ่ือทดสอบผลลัพธก์ ารทางาน 3. เร่มิ ต้นรนั โปรแกรม โมดูล LCD ของหุ่นยนต์แสดงข้อความ Press SW1 เพื่อแจ้งให้กดสวิตช์ SW1 ท่ีแผงวงจร Diplay-MOTOR บนหุ่นยนต์ IPST-BOT เพื่อสั่งให้หุ่นยนต์ เคลอ่ื นที่ 4. กดสวติ ช์ SW1 ทหี่ ่นุ ยนต์ IPST-BOT สังเกตการทางานของหุ่นยนต์ 116
โปรแกรมท่ี 7.2 #include <motor.h> #include <sleep.h> #include <in_out.h> #include <lcd.h> #define POW 70 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void main ( ) { lcd(“Press SW1”); sw1_press(); while(1) { forward(2000); turn_left(500); } } 117
คาอธบิ ายโปรแกรม เมื่อเร่ิมทางาน โปรแกรมจะแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพ่ือรอการกดสวิตช์ SW1 ซ่ึงต่อ เนื่องมาจากบรรทัดคาส่ัง sw1_press เมื่อมีการกดสวิตช์ SW1 โปรแกรมจึงจะกระทาคาส่ังในบรรทัดถัดไปซ่ึง ก็คือ การเข้าไปทางานภายในลูป while (1) ซึ่งกาหนดให้หุ่นยนต์เคล่ือนที่ตรงไปข้างหน้า 2 วินาทีแล้วเลี้ยว ซ้ายเพ่อื เปลย่ี นทางช่วงส้ันๆ เป็นเวลา 0.5 วนิ าที โปรแกรมจะวนกระทา 2 บรรทดั คาส่ังน้ีอย่างต่อเนื่อง ดงั นั้น จะสังเกตเห็นหุ่นยนตเ์ คล่ือนทใี่ นทศิ ทางวนทวนเข็มนาฬิกา 118
บทที่ 8 หนุ่ ยนต์ IPST-BOT กับการหลบหลกี สิง่ กีดขวางแบบสมั ผัส ในบทนีจ้ ะกลา่ วถึงการประยุกต์ใชง้ านแผงวงจรสวิตช์ร่วมกับหุน่ ยนต์ IPST-BOT เพื่อนามาใช้ตรวจจับ การชน ทาให้หุ่นยนต์รับรู้ได้ว่าเคล่ือนที่ไปพบส่ิงกีดขวาง จากน้ันประมวลผลเพื่อกาหนดการเคลื่อนที่ให้ สามารถเคลือ่ นทพ่ี น้ ส่ิงกดี ขวางไปได้ อุปกรณ์ท่ีใช้ในการเรียนรู้นี้ คือ แผงวงจรสวิตช์ มีวงจรการทางานแสดงในรูปที่ 3.13 จุดต่อที่ใช้เป็น หลักในการเรียนรู้ในที่น้ีคือ จุดต่อเอาท์พุต LOW คือ เม่ือสวิตช์ถูกกดซึ่งเทียบได้กับการชนกับสิ่งกีดขวาง สญั ญาณลอจิกเอาท์พุตจะเปลยี่ นจากลอจิก “1” เป็น “0” จนกว่าจะปล่อยหรือไม่เกิดการชน สัญญาณจะ เปลยี่ นกลบั ไปเป็น “1” อีกครั้ง เราสามารถนาคุณสมบัติการทางานของตัวตรวจจับน้ีมากาหนดเงื่อนไขในการเคลื่อนท่ีให้กับหุ่นยนต์ IPST-BOT โดยให้ติดตั้งสวิตช์เข้าท่ีด้านหน้าของหุ่นยนต์ เม่ือหุ่นยนต์เคล่ือนที่ไปชนกับส่ิงกีดขวางจะทาให้ สวิตช์ถูกกด ตัวควบคุมรับการเปลี่ยนแปลงของอินพุตท่ีต่อกับสวิตช์ แล้วทาการควบคุมให้หุ่นยนต์เคลื่อน ถอยหลัง ต่อดว้ ยการเปล่ียนทิศทางการเคลื่อนท่ี เพียงเทา่ นี้หุ่นยนต์ก็จะสามารถเคลื่อนที่ผา่ นส่งิ กดี ขวางไป ได้ การทดลองท่ี 8.1 ตรวจจบั การชนดว้ ยสวติ ช์ 1 ตวั การทดลองน้ีเป็นการเขียนโปรแกรมภาษา C เพื่ออ่านค่าสถานะการทางานของแผงวงจรสวิตช์ซึ่งต่อ กับขาพอร์ต PA0 ของหุ่นยนต์ IPST-BOT มาแสดงผลทโ่ี มดูล LCD การเชอ่ื มต่ออุปกรณ์ - ต่อสายจากพอร์ต PA0 เข้ากับช่อง LOW ของแผงวงจรสวิตช์ ติดต้ังด้านหน้าตรงกลางของหุ่นยนต์ IPST-BOT ตามรปู ท่ี 8.1 ขัน้ ตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชอื่ switch_test และพมิ พ์โปรแกรมภาษา C ตามโปรแกรมท่ี 8.1 2. คอมไพล์และดาวน์โหลดโปรแกรมเพื่อทดสอบผลลพั ธ์การทางาน 119
นาชน้ิ ต่อมุมฉากตดิ ตง้ั เขา้ กบั แผงวงจรสวิตช์ ติดตง้ั เข้ากับหุ่นยนต์ IPST-BOT ทด่ี า้ นหนา้ โดยใชส้ กรู 3x10 มม. และนอต 3 มม. โดยใชส้ กรู 3x10 มม. และนอต 3 มม. รปู ที่ 8.1 การเช่อื มต่ออปุ กรณแ์ ผงวงจรสวิตช์ (ZX-SWITCH) เขา้ กบั หนุ่ ยนต์ IPST-BOT 120
3. เริ่มตน้ รนั โปรแกรม โมดลู LCD ของหนุ่ ยนตแ์ สดงขอ้ ความ Switch x โดยท่ี x คือ คา่ ขอ้ มลู ทอ่ี า่ นได้จาดสถานะของแผงวงจรสวิตช์ 4. กดสวติ ช์ค้างไว้ ผลลัพธ์เมอื่ คา่ x มคี ่าเป็น 0 และเมือ่ ปลอ่ ยสวิตช์ ค่าของ x จะกลับมาเป็น 1 อีกครัง้ โปรแกรมที่ 8.1 #include <sleep.h> #include <in_out.h> #include <lcd.h> void main( ) { while (1) { lcd(“Switch1 : %d”, in_a(0)); sleep(10); } } คาอธบิ ายโปรแกรม โปรแกรมจะทางานภายในลูป while(1) โดยภายในจะเป็นการอ่านค่าสถานะอินพุตของแผงวงจร สวิตช์ที่ต่อเข้ากับพอร์ต PA0 ข้ึนมาแสดงผลท่ีโมดูล LCD น้ันคือ เมื่อแผงวงจรสวิตช์ถูกกดจะให้ค่าผลลัพธ์ เปน็ “0” นั้นเอง หมายเหตุ ในกรณีที่ผู้พัฒนาเลือกต่อใช้งานแผงวงจรสวิตช์จากข่องเอาท์พุต HIGH จะให้ผลลัพธ์ตรง ข้ามกับช่อง LOW กล่าวคือ จะอ่านค่าได้เป็น “0” เมื่อไม่มีการกดสวิตช์และอ่านค่าได้เป็น “1” เม่ือมีการ กดสวติ ช์ 121
การทดลองที่ 8.2 หุ่นยนตห์ ลบหลีกสิ่งกดี ขวาง การทดลองนี้เป็นการเขียนโปรแกรมภาษา C เพื่อควบคุมหุ่นยนต์ให้สามารถตรวจจับส่ิงกีดขวางด้วย การชน แล้วเคลื่อนทเี่ ปลยี่ นทิศทางเพอื่ หลบหลกึ สิ่งกีดขวาง โดยใชต้ ัวตรวจจับการชนหรอื แผงวงจรสวิตช์ 1 ตวั ซึ่งตดิ ตั้งไว้ดา้ นหน้าของหนุ่ ยนต์ โดยมเี งือ่ นไขดงั น้ี - ในกรณที ่ีหนุ่ ยนตไ์ ม่พบการชน หุ่นยนต์จะเคล่อื นท่ีตรงไปข้างหน้าอย่างตอ่ เน่ือง - ในกรณีท่ีหุ่นยนต์เกิดการชน จะมีการขับเสียงเตือนออกมา 1 ครั้ง จากน้ันเคลื่อนที่ถอยหลังแล้ว เปลย่ี นทศิ ทางการเคลือ่ นท่ีมาทางซา้ ย แล้วเคล่ือนท่ตี รงตอ่ ไปเพื่อหลบหลีกส่งิ กีดขวาง การเชอ่ื มต่ออปุ กรณ์ - ต่อสายจากพอร์ต PA0 เข้ากับช่อง LOW ของแผงวงจรสวิตช์ ตดิ ตั้งด้านหน้าตรงกลางของหุ่นยนต์ IPST-BOT - ตอ่ สายจากพอร์ต PB4 เข้ากบั แผงวงจรลาโพงเปียโซ ขน้ั ตอนการทดลอง 1. สรา้ งไฟลโ์ ปรเจคทช์ ่อื robo_bumper1 และพมิ พโ์ ปรแกรมภาษา C ตามโปรแกรมท่ี 8.2 2. คอมไพลแ์ ละดาวนโ์ หลดโปรแกรมเพื่อทดสอบผลลัพธก์ ารทางาน 3. เริ่มตน้ รันโปรแกรม โมดลู LCD ของหุ่นยนตแ์ สดงข้อความ Press SW1 เพื่อแจง้ เตือนให้ผ้ใู ชง้ านกดสวติ ช์ SW1 ท่ีหุ่นยนต์ 4. กดสวติ ช์ SW1 ท่หี ุ่นยนต์ หุ่นยนต์จะเคล่ือนที่ตรงไปข้างหน้าหากชนสิ่งกีดขวางหุ่นยนต์จะเคล่ือนท่ีถอยหลัง แล้วเปลี่ยน ทิศทางไปทางซ้าย จากนัน้ จะเคลื่อนทต่ี รงต่อไป โปรแกรมท่ี 8.2 #include <sleep.h> #include <in_out.h> #include <lcd.h> #include <motor.h> 122
#include <sound.h> #define POW 70 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void main( ) { char mid; lcd(“Press SW1”); sw1_press(); while (1) { mid = in_a(0); if (mid == 0) { beep_b(4); backward(1000); turn_left(800); } 123
รปู ท่ี 8.2 การเชอื่ มต่ออุปกรณ์แผงวงจรสวิตช์ (ZX-SWITCH) และลาโพงเปยี โซเขา้ กบั หุ่นยนต์ IPST-BOT รูปท่ี 8.3 แสดงการทางานของหุ่นยนตใ์ นการทดลองที่ 8.2 124
else forward(10); } } คาอธบิ ายโปรแกรม เมื่อโปรแกรมเริ่มทางานจะมีการแสดงข้อความ Press SW1 ที่โมดูล LCD เพื่อรอการกดสวิตช์ SW1 ด้วยการทางานของฟังก์ชัน sw1_press เมื่อมีการกดสวิตช์ SW1 โปรแกรมจึงสามารถกระทาคาสั่งใน บรรทัดถัดไปได้ คือ เข้าไปทางานภายในลูป while(1) ซ่ึงเป็นการวนอ่านค่าสถานะอินพุตที่พอร์ต PA0 ซึ่ง ต่อกับแผงวงจรสวิตช์มาเก็บท่ีตัวแปร mid คือ เม่ือแผงวงจรสวิตช์ถูกกดจะให้ค่าผลลัพธ์เป็น “0” จากนั้น โปรแกรมจะนาค่าของตวั แปรไปเปรียบเทยี บตามกรณดี งั นี้ กรณี if(mid==0) เป็นการตรวจสอบว่า แผงวงจรสวิชต์ถูกกดหรือไม่ ซง่ึ ถ้าเป็นจริง จะตอบสนองให้ หนุ่ ยนต์กาเนิดเสียงแล้วถอยหลัง จากน้ันเล้ียวซ้ายเพื่อหลบส่ิงกีดขวาง (สามารถปรับค่าของการหน่วงเวลา ได้ตามความเหมาะสม) กรณี else เป็นกรณีท่หี ุ่นยนต์ไม่พบสงิ่ กีดขวาง ซึ่งถา้ เป็นจริง จะตอบสนองให้หุ่นยนตเ์ คลื่อนทีต่ รงไป ข้างหนา้ เป็นระยะเวลาสน้ั ๆ (สามารถปรบั ค่าของการหน่วงเวลาได้ตามความเหมาะสม) การทดลองท่ี 8.3 ตรวจจบั การชนดว้ ยสวิตช์ 2 ตัว การทดลองนี้เป็นการเขียนโปรแกรมการทางานของแผงวงจรสวิตช์ 2 ตัวท่ีต่อเข้ากับพอร์ต PA0 และ PA1 ของหุน่ ยนต์ IPST-BOT มาแสดงผลท่โี มดลู LCD การเชอ่ื มต่ออุปกรณ์ - ตอ่ สายจากพอรต์ PA0 เขา้ กบั ช่อง LOW ของแผงวงจรสวิตช์ตัวท่ี 1 - ตอ่ สายจากพอรต์ PA1 เขา้ กบั ช่อง LOW ของแผงวงจรสวิตช์ตัวท่ี 2 ขั้นตอนการทดลอง 1. สรา้ งไฟล์โปรเจคท์ชื่อ switch2_test และพิมพโ์ ปรแกรมภาษา C ตามโปรแกรมท่ี 8.3 2. คอมไพลแ์ ละดาวน์โหลดโปรแกรมเพอ่ื ทดสอบผลลพั ธก์ ารทางาน 125
3. เรมิ่ ต้นรนั โปรแกรม โมดูล LCD ของหุน่ ยนต์แสดงขอ้ ความ Switch : x Switch : y โดยที่ x และ y คอื ค่าข้อมลู ท่ีอ่านได้จากสถานะของแผงวงจรสวิตชต์ ัวที่ 1 ท่ีตอ่ กับ PA0 และตัวท่ี 2 ซ่งึ ตอ่ กับ PA1 ตามลาดับ 4. กดสวิตชต์ วั ที่ 1 คา้ งไว้ ผลลพั ธค์ ่า x จากขอ้ 3 มคี ่าเป็น 0 และเมอื่ ปล่อยสวติ ชค์ ่า x จะกลบั มาเปน็ 1 อกี ครง้ั 5. กดสวิตช์ตัวที่ 2 คา้ งไว้ ผลลัพธค์ ่า y จากขอ้ 3 มีคา่ เปน็ 0 และเมอื่ ปล่อยสวิตช์คา่ y จะกลับมาเป็น 1 อีกครัง้ โปรแกรมที่ 8.3 #include <sleep.h> #include <in_out.h> #include <lcd.h> void main( ) { while (1) { lcd(“Switch1 : %d #nSwitch2 : %d”, in_a(0), in_a(1)); sleep(10); } } คาอธิบายโปรแกรม โปรแกรมจะทางานภายในลูป while(1) ซึ่งเป็นการวนอ่านค่าสถานะของแผงวงจรสวิตชที่ต่อเข้ากับ พอรต์ PA0 และ PA1 มาแสดงทโ่ี มดูล LCD เม่อื แผงวงจรสวติ ชต์ วั ใดถกู กดจะให้คา่ ผลลัพธเ์ ป็น 0 126
รูปที่ 8.4 การเช่อื มต่ออุปกรณแ์ ผงวงจรสวติ ช์ (ZX-SWITCH) ท้งั 2 ตัวเข้ากบั หนุ่ ยนต์ IPST-BOT 127
การทดลองที่ 8.4 หุน่ ยนตห์ ลบหลีกสง่ิ กดี ขวางจากตวั ตรวจจบั การชน 2 ตัว การทดลองนี้เป็นการเขียนโปรแกรมควบคุมหุ่นยนต์หลบหลีกส่ิงกีดขวางจากการชนแบบสัมผัสด้วย แผงวงจรสวติ ช์ 2 ตวั โดยตดิ ตงั้ ไวด้ ้านหน้าทางซา้ ยและขวาของตวั หุน่ ยนต์ โดยมเี งื่อนไขดงั นี้ - กรณที ี่หนุ่ ยนตไ์ มพ่ บการชน หนุ่ ยนตจ์ ะเคลอื่ นทไ่ี ปขา้ งหนา้ อย่างตอ่ เนื่อง - กรณที ่หี ุ่นยนต์พบการชนของแผงวงจรสวิตช์ด้านซ้าย หุ่นยนตจ์ ะส่งเสยี งสัญญาณ “ตด๊ิ ” ดงั 1 คร้ัง จากนั้นเคลือ่ นที่ถอยหลงั แล้วเปล่ียนเส้นทางการเคลื่อนทเ่ี พอ่ื เล้ยี วขวา - กรณที ี่หุ่นยนตพ์ บการชนของแผงวงจรสวติ ชด์ ้านขวา หุ่นยนตจ์ ะส่งเสยี งสญั ญาณ “ตด๊ิ ” ดงั 1 ครั้ง จากนั้นเคล่อื นทถ่ี อยหลัง แล้วเปลย่ี นเส้นทางการเคลอ่ื นทีเ่ พ่อื เลีย้ วซ้าย - กรณีที่หุ่นยนต์พบการชนของแผงวงจรสวิตช์ทั้งสองด้าน หุ่นยนต์จะส่งเสียงสัญญาณ “ติ๊ด” ดัง 1 ครัง้ จากน้นั เคลื่อนทีถ่ อยหลงั แลว้ เปลีย่ นเสน้ ทางการเคลอ่ื นท่ีเพอ่ื เลี้ยวซา้ ย การเชอ่ื มต่ออปุ กรณ์ - ตอ่ สายจากพอร์ต PA0 เขา้ กับช่อง LOW ของแผงวงจรสวติ ชต์ ัวที่ 1 - ต่อสายจากพอร์ต PA1 เขา้ กบั ชอ่ ง LOW ของแผงวงจรสวิตช์ตัวท่ี 2 - ตอ่ สายจากพอร์ต PB4 เขา้ กบั แผงวงจรลาโพงเปียโซ ข้นั ตอนการทดลอง 1. สร้างไฟล์โปรเจคท์ช่ือ robo_bumper2 และพมิ พ์โปรแกรมภาษา C ตามโปรแกรมท่ี 8.4 2. คอมไพล์และดาวนโ์ หลดโปรแกรมเพ่ือทดสอบผลลัพธ์การทางาน 3. เรม่ิ ตน้ รนั โปรแกรม โมดูล LCD ของหุน่ ยนต์แสดงขอ้ ความ Press SW1 แจ้งให้กดสวิตช์ SW1 ท่ีแผงวงจร Display-MOTOR บนตัวหุ่นยนต์ IPST-BOT เพ่ือสั่งให้หุ่นยนต์ เคล่อื นท่ี 4. กดสวติ ช์ SW1 ทแ่ี ผงวงจร Display-MOTOR แลว้ สงั เกตการเคลือ่ นที่ของหนุ่ ยนต์ IPST-BOT หุ่นยนต์ IPST-BOT จะเคลือนท่ีตรงไปข้างหน้าอย่างต่อเนื่อง หากพบสิ่งกีดขวางและเกิดการชน ตรงตามเงอ่ื นไขที่กาหนดไว้ หนุ่ ยนต์จะเปล่ียนการเคล่ือนท่เี พ่ือหลบหลกี สิง่ กดี ขวางได้ 128
โปรแกรมท่ี 8.4 #include <sleep.h> #include <in_out.h> #include <lcd.h> #include <motor.h> #include <sound.h> #define POW 70 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } 129
1. ติดตั้งชิ้นต่อมุมฉากเข้ากับแผงวงจรสวิตช์ โดยใชส้ กรู 3x10 มม. และนอต 3 มม. 2 ชดุ 2. นาแผงวงจรสวิตช์ท้ังสองมาติดต้ังเข้าที่ มมุ ซ้ายและมุมขวาทางดา้ นหน้าหุ่นยนต์ IPST- BOT โดยติดต้ังให้เอียงทามุมประมาณ 45 องศา จากนั้นใช้สกรู 3x10 มม. และนอต 3 มม. ขนั ยึดชิ้นส่วนทงั้ สองใหแ้ น่น รปู ที่ 8.5 การเชื่อมต่ออุปกรณแ์ ผงวงจรสวติ ช์ (ZX-SWITCH) 2 ตวั และลาโพงเปยี โเขา้ กับหุ่นยนต์ IPST-BOT 130
void main( ) { char left, right lcd(“Press SW1”); sw1_press; while (1) { left = in_a(0); right = in_a(1); if(left == 1 && right == 1) { forward(10); } if(left == 0 && right == 1) { beep_b(4); backward(1000); turn_right(800); } if(left == 1 && right == 0) { beep_b(4); backward(1000); turn_left(800); } if(left == 0 && right == 0) { beep_b(4); backward(1000); turn_left(1500); } } } 131
คาอธบิ ายโปรแกรม โปรแกรมจะแสดงข้อความ Press SW1 ที่โมดูล LCD เพื่อรอการกดสวิตช์ SW1 เมื่อพบการกดสวิตช์ SW1 โปรแกรมจึงเรม่ิ ทางานคาสั่งภายในลปู while(1) เพอื่ วนอา่ นค่าสถานะของแผงวงจรสวิตช์ท่ีต่อเขา้ กับ ขาพอร์ต PA0 และ PA1 มาเก็บที่ตัวแปร left และ right เม่ือแผงวงจรสวิตช์ตัวใดถูกกดจะให้ค่าผลลัพธ์ เปน็ “0” จากน้ันโปรแกรมจะนาคา่ ของตัวแปรท้งั สองไปเปรยี บเทียบท้งั 4 กรณี ดังนี้ กรณีที่ 1 : if(left == 1 && right == 1) ตรวจสอบว่า ไม่มีการกดสวิตช์ทั้งสองตัวหรือไม่ ซึ่งถ้า เป็นจริง (ไม่มีการกดสวิตช์) จะตอบสนองให้หุ่นยนต์เคล่ือนที่ตรงไปข้างหน้าเป็นระยะส้ันๆ เนื่องจากยังไม่ พบส่ิงกดี ขวาง กรณีที่ 2 : if(left == 0 && right == 1) ตรวจสอบการกดสวิตช์ด้านซ้ายเพียงตัวเดียว ซ่ึงถ้าเป็น จริง (มีการกดสวิตช์) จะสง่ เสียงสญั ญาณ “ติ๊ด” 1 คร้ัง จากน้ันหุ่นยนต์เคลอื่ นท่ีถอยหลัง แล้วเลยี้ วขวาเพื่อ หลบส่งิ กดี ขวาง (สาหรบั การหนว่ งเวลาสามารถปรบั ใหเ้ หมาะสมได้อีก) กรณีที่ 3 : if(left == 1 && right == 0) ตรวจสอบการกดสวิตช์ด้านขวาเพียงตัวเดียว ซึ่งถ้าเป็น จรงิ (มีการกดสวติ ช์) จะส่งเสียงสัญญาณ “ต๊ิด” 1 ครงั้ จากนั้นหุ่นยนต์เคลื่อนที่ถอยหลงั แล้วเลี้ยวซา้ ยเพ่ือ หลบสิ่งกีดขวาง กรณีท่ี 4 : if(left == 0 && right == 0) ตรวจสอบการกดสวิตช์ทั้งสองตัว ซ่ึงถ้าเป็นจริง (มกี ารกด สวิตช์ท้ัง 2 ตัวพร้อมกัน) จะส่งเสยี งสัญญาณ “ตด๊ิ ” 1 ครั้ง จากนั้นหุ่นยนต์เคลื่อนท่ีถอยหลัง แล้วเล้ียวขวา เพอ่ื หลบสง่ิ กดี ขวาง 132
รูปที่ 8.6 แสดงการเคล่อื นที่ในกรณีที่ 2 ของการทดลองที่ 8.4 133
รูปที่ 8.7 แสดงการเคล่อื นที่ในกรณีที่ 3 ของการทดลองที่ 8.4 134
รูปที่ 8.8 แสดงการเคล่อื นที่ในกรณีที่ 4 ของการทดลองที่ 8.4 135
การทดลองที่ 8.5 หนุ่ ยนต์หลบหลกี ส่ิงกดี ขวางดว้ ยการชนแบบสมุ่ ทิศทาง การทดลองนี้จะดัดแปลงโปรแกรมควบคุมการทดลองที่ 8.4 โดยในการทดลองนี้จะทาการสุ่มคา่ ตวั เลข เพื่อใช้เปน็ ตัวแปรหน่ึงในการกาหนดเง่ือนไขของการเปล่ียนทิศทางการเคลื่อนที่ วิธีการน้ีจะช่วยให้หุ่นยนต์ สามารถหลบหลีกส่งิ กดี ขวางในลักษณะมมุ ฉากได้ดีในระดบั หนง่ึ โดยมีเง่ือนไขการทางานดงั นี้ - กรณีทห่ี นุ่ ยนต์ไมพ่ บการชน หนุ่ ยนต์จะเคล่อื นท่ีไปขา้ งหน้า - กรณีท่ีหุ่นยนต์พบการชนท่ีด้านใดด้านหน่ึงหรือท้ังสองด้านพร้อมกัน จะส่งเสียงสัญญาณ “ติ๊ด” 1 คร้ัง จากนัน้ เคลอื่ นที่ถอยหลัง แลว้ ทาการสมุ่ ค่าเพ่อื ตัดสินใจเลือกทิศทางในการเลี้ยว ฟงั ก์ชนั ส่มุ คา่ ตวั เลข ฟงั ก์ชันการสุม่ ตัวเลขเพ่อื ใชใ้ นการทดลองนี้ คอื ฟังก์ชัน rand ซง่ึ บรรจุอยู่ในไลบรารี stdlib.h ซ่งึ เป็น ไฟล์ไลบรารีมาตรฐานของ WinAVR คอมไพเลอร์ (ไม่จาเป็นต้องผนวกไฟล์ไลบรารีเพ่ิมเติม) ฟังก์ชันนี้ให้ ผลลัพธ์จากการสุ่มตวั เลขตง้ั 0 ถงึ 32767 ตวั อย่างท่ี 1 int x; x = rand( ); ผลลัพธ์ x มีคา่ ไดต้ ้ังแต่ 0 ถงึ 32767 ตัวอยา่ งที่ 2 int x; x = rand( )%10; ผลลพั ธ์ x มคี า่ ไดต้ ง้ั แต่ 0 ถงึ 9 ตัวอย่างท่ี 3 int x; x = rand( )%50; ผลลพั ธ์ x มีคา่ ได้ต้งั แต่ 0 ถงึ 49 ตวั อย่างที่ 4 int x; x = rand( )%2; ผลลพั ธ์ x มคี า่ ได้ตงั้ แต่ 0 ถึง 1 136
ตัวอย่างที่ 5 int x; x = 5 + rand( )%11; ผลลพั ธ์ x มคี ่าไดต้ งั้ แต่ 5 ถึง 15 การเชื่อมต่อทางฮารด์ แวร์ - ต่อสายจากพอรต์ PA0 เข้ากบั ชอ่ ง LOW ของแผงวงจรสวิตช์ตัวที่ 1 - ตอ่ สายจากพอร์ต PA1 เข้ากบั ชอ่ ง LOW ของแผงวงจรสวติ ช์ตัวที่ 2 - ตอ่ สายจากพอรต์ PB4 เขา้ กับแผงวงจรลาโพงเปยี โซ ข้ันตอนการทดลอง 1. สรา้ งไฟลโ์ ปรเจคท์ช่ือ robo_bumper3 และพิมพโ์ ปรแกรมภาษา C ตามโปรแกรมที่ 8.5 2. คอมไพลแ์ ละดาวนโ์ หลดโปรแกรมเพือ่ ทดสอบผลลพั ธ์การทางาน 3. เริ่มตน้ รันโปรแกรม โมดลู LCD ของหนุ่ ยนต์แสดงขอ้ ความ Press SW1 แจ้งใหก้ ดสวิตช์ SW1 ทแ่ี ผงวงจร Display-MOTOR เพื่อส่งั ใหห้ นุ่ ยนต์เคลื่อนที่ 4. กดสวิตช์ SW1 ทแ่ี ผงวงจร Display-MOTOR ของหุน่ ยนต์ IPST-BOT แล้วสังเกตการเคลื่อนท่ีของ หุ่นยนต์ หุ่นยนต์ IPST-BOT จะเคลื่อนที่ตรงไปข้างหน้าอย่างต่อเน่ือง หากพบส่ิงกีดขวางและเกิดการชน หนุ่ ยนต์ IPST-BOT จะเปลยี่ นการเคลอ่ื นทเี่ พื่อหลบหลีกส่งิ กีดขวางด้วยค่าทสี่ มุ่ ได้จากคาสั่งในโปรแกรม ทา ให้เราไม่สามารถทราบได้ลว่ งหน้าว่าหุ่นยนต์จะเคล่ือนที่หลบหลีกสิ่งกีดขางไปในทิศทางใด ด้วยวิธีการนี้จะ เหมาะสาหรับการแก้ปัญหาในกรณีท่ีหุ่นยนต์เคลื่อนที่เข้าไปในมุมอับท่ีมีลักษณะเป็นมุมฉาก ซ่ึงหากใช้ โปรแกรมในการทดลองที่ 8.4 ที่กาหนดว่าเม่ือเกิดการชนทางซ้ายให้เลี้ยวขวา และชนทางขวาให้เล้ียวซ้าย จะทาให้หุ่นยนต์ไม่สามารถเคล่ือนที่ออกจากมุมได้ แต่ด้วยการใช้เทคนิคการสุ่มค่าจะทาให้ทิศทางในการ เล้ยี วซ้ายหรือขวาไมแ่ น่นอน หุ่นยนต์จงึ สามารถออกจากมุมอบั ท่ีมีลักษณะเปน็ มุมฉากได้ โปรแกรมท่ี 8.5 #include <sleep.h> #include <in_out.h> #include <lcd.h> #include <motor.h> #include <sound.h> 137
#define POW 70 void forward(unsigned int delay) { motor(1,POW); motor(2,POW); sleep(delay); } void backward(unsigned int delay) { motor(1,-POW); motor(2,-POW); sleep(delay); } void turn_left(unsigned int delay) { motor(1,-POW); motor(2,POW); sleep(delay); } void turn_right(unsigned int delay) { motor(1,POW); motor(2,-POW); sleep(delay); } void main( ) { char left, right lcd(“Press SW1”); sw1_press; 138
while (1) { left = in_a(0); right = in_a(1); if(left == 0 || right == 0) { beep_b(4); backward(1000); if (rand()%2 == 1) turn_left(800); else rurn_right(800); } else forward(10); } } คาอธิบายโปรแกรม โปรแกรมแสดงข้อความ Press SW1 ท่ีโมดูล LCD เพื่อรอการกดสวิตช์ SW1 เมื่อพบการกดสวิตช์ SW1 โปรแกรมจงึ เริ่มทางานคาส่ังภายในลูป while(1) เพื่อวนอ่านคา่ สถานะของแผงวงจรสวิตชท์ ตี่ ่อเขา้ กับ ขาพอร์ต PA0 และ PA1 มาเก็บท่ีตัวแปร left และ right จากน้ันโปรแกรมจะนาค่าของตัวแปรท้ังสองไป เปรยี บเทียบ ดงั น้ี กรณีท่ี if(left == 0 || right == 0) ตรวจสอบการชนของสวิตช์ตัวใดตวั หน่ึงหรือทัง้ สองตวั พรอ้ มกัน ถ้าเป็นจริง (มีการกดสิตช์ หรือเกิดการชน) จะตอบสนองโดยสง่ เสียงสัญญาณ “ตด๊ิ ” 1 คร้ัง จากนัน้ หุ่นยนต์ เคล่ือนที่ถอยหลังแล้วทาการสุ่มค่าตัวเลขรหว่าง “0” หรือ “1” เท่าน้ัน เพ่ือนามากาหนดทิศทางในการ เลี้ยง กรณีที่ else เป็นกรณีท่ีหุ่นยนต์ไม่พบส่ิงกีดขวาง ซ่ึงถ้าเป็นจริง (ไม่มีการกดสวิตช์หรือไม่มีการชน เกิดข้ึน) จะตอบสนองให้หุ่นยนต์เคล่ือนที่ตรงไปข้างหน้า (สามารถปรับค่าของการหน่วงเวลาได้ตามความ เหมาะสม) 139
บทที่ 9 ตรวจจบั และวดั ระยะทางด้วยแสงอนิ ฟราเรด ในบทน้ีจะกล่าวถึงการประยุกต์ใช้งานโมดูลตรวจจับและวัดระยะทางด้วยแสงอินฟราเรด เบอร์ GP2D120 ร่วมกับหุ่นยนต์ IPST-BOT ทาให้หุ่นยนต์มคี วามสามารถในการตรวจจับวัตถุไดโ้ ดยไม่ตอ้ งสมั ผัส กับวัตถุ ทาให้หนุ่ ยนต์ IPST-BOT สามารถเคลอื่ นทเี่ ข้าหาหรือหลบหลีกได้ รูปที่ 9.1 โมดูล GP2D120 และคุณลักษณะของโมดลู 9.1 คุณสมบัติของโมดูล GP2D120 GP2D120 เป็นโมดูลตรวจจับระยะทางแบบอินฟราเรด มีขาต่อใช้งาน 3 ขา คือ ขาต่อไฟเล้ียง (Vcc), ขา กราวน์ (GND) และขาแรงดันเอาท์พุต (Vout) การอ่านค่าแรงดันจาก GP2D120 จะต้องรอให้พ้นช่วงเตรียม ความพรอ้ มของโมดูลก่อน ซง่ึ ใช้เวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที (1 มิลลิวินาที = 0.001 วินาที) ดงั นั้น การอ่านค่าแรงดันจึงควรรอใหพ้ ้นชว่ งเวลาดังกล่าวไปก่อน ค่าแรงดันเอาท์พุตของ GP2D120 ท่ีระยะทาง 30 เซนติเมตร ที่ไฟเลี้ยง +5V อยู่ในช่วง 0.25 – 0.55V โดยคา่ กลาง คอื 0.4V ชว่ งของการเปลี่ยนแปลงแรงดันเอาท์พุตท่รี ะยะทาง 4 เซนติเมตร คอื 2.25V±0.3V รูปท่ี 9.2 แสดงระยะเวลาทโ่ี มดลู GP2D120 ใช้ในการตรวจจบั ระยะทางแบบอนิ ฟราเรด 140
หมายเหตุ การทดลองนี้ใช้กระดาษเทาขาว รุ่น R-27 ของ Kodak ซ่ึงด้านขวามีอัตราการ สะทอ้ นแสง 90% เปน็ วัตถุสาหรับสะท้อนแสง เพอ่ื วัดระยะทาง รปู ท่ี 9.3 กราฟแสดงการทางานของโมดูล GP2D120 9.2 ไฟล์ไลบรารี gp2d120_lib.h สาหรับใช้งานเพ่ือตดิ ต่อกับโมดลู GP2D120 ไฟล์ไลบรารี gp2d120_lib.h บรรจุวชุดคาสั่งหรอื ฟังกช์ ันโปรแกรมภาษา C เพ่ือใชง้ านโมดูล GP2D120 ก่อนเรียกใช้งานฟังกช์ นั ภายในไลบรารี ผู้พฒั นาต้องผนวกไฟลไ์ ลบรารใี นตอนต้นของโปรแกรมดว้ ยคาสั่ง #include <gp2d120_lib.h> 9.2.1 การเชื่อมต่ออุปกรณ์ เน่ืองจากโมดูล GP2D120 เป็นตัวตรวจจับที่ให้ผลการทางานเป็นแรงดันไฟตรงทส่ี ัมพันธก์ ับ ระยะทางทีว่ ัดได้ ในการใชง้ านจงึ ต้องต่อกับช่องอนิ พุตอนาล็อกใดๆ ของแผงวงจรควบคุมหุ่นยนต์ ในทนี่ ้ี คือ จุดต่อขาพอรต์ PA0 – PA7 9.2.2 ฟังกช์ ัน getdist ในไลบรารี gp2d120_lib.h มฟี ังกช์ นั ทส่ี นับสนุนการทางาน คือ getdist ใชอ้ า่ นค่าระยะทางทว่ี ัด ไดจ้ ากโมดูล GP2D120 ในหน่วย เซนตเิ มตร รูปแบบ unsigned int getdist (char adc_ch) ตวั แปร adc_ch ใช้กาหนดช่องอนิ พตุ อนาล็อกที่ตอ่ กับโมดูล GP2D120 การคนื คา่ คนื ค่าเปน็ ระยะทางในหน่วย เซนติเมตร 141
9.3 การตดิ ตั้งโมดลู GP2D120 เขา้ กับหุ่นยนต์ IPST-BOT 1. นาโมดูล GP2D120 ยึดกับฉากโลหะ 2x2 ด้วยสกรู 3x10 มม. จากน้ันนาฉากโลหะ 3x2 ขันยึดกับ ปลายอีกด้านของฉากโลหะ 2x2 ดว้ ยสกรู 3x10 มม. และนอต 3 มม. 2. นาโมดูล GP2D120 ยึดเข้ากับด้านหน้าของหุ่นยนต์ โดยใช้สกรู 3x10 มม. และนอต 3 มม. ขันยึดใน ตาแหนง่ ดงั รปู จากน้นั ทาการปรับแนวของโมดูล GP2D120 ให้อยู่ในแนวระนาบและขันสกรยู ึดให้แนน่ 142
3. เสียบสายสัญญาณของโมดูล GP2D120 เข้าที่จุดต่อ PA4 จะได้หุ่นยนต์ IPST-BOT ท่ีสามารถตรวจจับ สิง่ กดี ขวางแบบไมส่ ัมผัส พรอ้ มสาหรบั การทดลองต่อไป การทดลองที่ 9.1 ตรวจจับและวดั คา่ ระยะทางจากโมดูล GP2D120 การทดลองนี้เป็นการเขียนโปรแกรมเพ่ืออ่านค่าระยะทางจากโมดูล GP2D120 โดยนาค่าท่ีอ่านได้มา แสดงที่โมดูล LCD การเชอ่ื มตอ่ อปุ กรณ์ - ตอ่ สายจากพอรต์ PA4 เข้ากับโมดลู GP2D120 ขน้ั ตอนการทดลอง 1. สร้างไฟล์โปรเจคท์ช่ือ gp2d120_test และพมิ พโ์ ปรแกรม 9.1 2. คอมไพล์และดาวนโ์ หลดโปรแกรมเพอื่ ทดสอบผลลัพธ์การทางาน 3. รันโปรแกรม โมดูล LCD ของหุ่นยนตแ์ สดงข้อความ Distance : xxx cm 143
โดยท่ี xxx คอื ค่าระยะทางท่ีวัดได้ในหนว่ ย เซนติเมตร และแสดงผลเปน็ Out of Range! เมื่อระยะทางทีว่ ัดไดอ้ ยู่นอกเหนือขอบเขต 4 – 32 เซนตเิ มตร 4. นาวัตถุหรือมือขวางด้านหน้าของโมดูล GP2D120 ในระยะขอบเขต คือ 4 – 32 เซนติเมตร จากน้นั เล่อื นวัตถเุ ข้าและออกจากโมดลู GP2D120 สงั เกตคา่ ระยะทางทอ่ี ่านไดท้ ่ีโมดลู LCD ถา้ หากวัตถอุ ยู่ในระยะขอบเขต 4 – 32 เซนตเิ มตร ที่โมดูล LCD จะแสดงค่าของระยะห่างระหว่าง วัตถุกับโมดูล GP2D120 แต่ถ้าหากวัตถุหรือสิ่งกีดขวางไม่อยู่ในระยะขอบเขต ที่โมดูล LCD จะแสดง ขอ้ ความ Out of Range! แทน รปู ท่ี 9.4 จาลองภาพการทางานของอินฟราเรดของโมดูล GP2D120 โปรแกรม 9.1 #include <sleep.h> #include <lcd.h> #include <gp2d120_lib.h> void main () { int dist; 144
while (1) { dist = getdist (4); if (dist > 4 && dist <= 32) lcd(“Distance : %d cm.”, dist); else lcd(“Out of Range!”); sleep(200); } } คาอธิบายโปรแกรม โปรแกรมจะทางานภายในลูป while(1) โดยค่าระยะทางท่ีอ่านได้จากโมดูล GP2D120 จากคาส่ัง getdist จะถกู เก็บไว้ที่ตัวแปร dist จากนั้นจะถกู นาไปวิเคราะหว์ ่าอยใู่ นช่วง 4 – 32 เซนตเิ มตรหรือไม่ แล้ว แสดงผลทโ่ี มดลู LCD โดยถ้าพบวา่ อยู่นอกเหนือขอบเขตดังกล่าวจะถือว่าขอ้ มลู ที่ได้มานั้นไม่สามารถเชื่อถือ ได้ซ่ึงจะแสดงข้อความที่โมดูล LCD เป็น “Out of Range!” และกระบวนการท้ังหมดจะทาซ้าๆ ภายใต้ เงอื่ นไขทเ่ี ป็นจริงตลอดกาลของ while(1) 145
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189