เรยี นรู้และลองเล่น Arduino เบ้ืองต้น ครูประภาส สุวรรณเพชร
ก เรียนรู้และลองเล่น Arduino เบื้องต้น โดย ครูประภาส สุวรรณเพชร สงวนลิขสิทธ์ิสำหรับกำรพมิ พเ์ พอื่ จำหน่ำย © โดยครูประภำส สุวรรณเพชร ไม่สงวนลิขสิทธ์ิสำหรับกำรพมิ พเ์ พื่อเป็นวทิ ยำทำน หากพบเจอข้อผดิ พลาดใด ๆ ในหนังสือเล่มนี้ กรุณำแจง้ [email protected] จกั เป็นพระคุณอยำ่ งสูง ท้งั น้ีเพอื่ ปรับปรุงแกไ้ ขใหส้ มบูรณ์ตอ่ ไป หนงั สือเล่มน้ีจดั ไวส้ ำหรับกำรพิมพส์ องดำ้ นหนำ้ กระดำษ ครูประภำส สุวรรณเพชร แผนกวชิ ำช่ำงอิเล็กทรอนิกส์ วทิ ยำลยั เทคเทคนิคชยั ภูมิ www.praphas.com [email protected]
ก คำนำ ปัจจุบนั ไมโครคอนโทรลเลอร์มีการนามาใช้งานกนั แพร่หลายมากข้ึน โดยมีการฝังตวั ของ ไมโครคอนโทรลเลอร์อยใู่ นเคร่ืองใชไ้ ฟฟ้าหลาย ๆ ประเภท เช่น เคร่ืองซกั ผา้ แบบอตั โนมตั ิ เตาอบไฟฟ้า เตาไมโครเวฟ เครื่องปรับอากาศที่สามารถกาหนดอุณหภูมิได้และอื่น ๆ อีกมากมาย Arduino เป็ น ไมโครคอนโทรลเลอร์แพลทฟอร์มหน่ึงท่ีไดร้ ับความนิยมมาก อนั เนื่องจากเป็ นแพลทฟอร์มแบบเปิ ดท้งั ฮาร์ดแวร์และซอฟต์แวร์การใช้งานง่ายไม่ซับซ้อนมีต้นทุนในการสร้างวงจรต่า ซ่ึงในการใช้งาน ไมโครคอนโทรลเลอร์จะตอ้ งประกอบดว้ ยองคป์ ระกอบ 2 อย่างคือ ตวั เครื่องหรือท่ีเรียกว่า ฮาร์ดแวร์ (Hardware) และโปรแกรมหรือชุดคาสง่ั ที่เรียกวา่ ซอฟตแ์ วร์ (Software) ที่ใชส้ งั่ ใหไ้ มโครคอนโทรลเลอร์ ทาตามความตอ้ งการของผูอ้ อกแบบ หนงั สือเล่มน้ีอธิบายถึงหลกั การออกแบบฮาร์ตแวร์และการเขียน ซอฟทแ์ วร์เพ่ือใชค้ วบคุม เอกสารเล่มน้ีขา้ พเจา้ ไดเ้ รียบเรียงข้ึนจากประสบการณ์ท่ีสอนนกั ศึกษาเป็ นเวลากวา่ 25 ปี ได้ ศึกษาคน้ ควา้ และพฒั นาเน้ือหาใหท้ นั ต่อการพฒั นาของเทคโนโลยี โดยนาเสนอเน้ือหาจากพ้ืนฐานของ ไมโครคอนโทรลเลอร์ เพื่อให้ผูอ้ ่านที่มีความสนใจศึกษาด้านน้ีแต่ไม่มีพ้ืนความรู้มาก่อน ตลอดจน นักศึกษาสามารถศึกษาเรียนรู้ทดลองปฏิบตั ิได้ โดยเร่ิมแนะนาให้รู้จกั พ้ืนฐานต้งั แต่ระบบเลขฐาน โครงสร้างภายในของไมโครคอนโทรลเลอร์ วงจรเชื่อมต่อ การเขียนโปรแกรมควบคุมด้วยภาษาซี ขา้ พเจา้ หวงั เป็ นอย่างย่ิงว่าผูอ้ ่านจะสามารถเรียนรู้และนาความรู้ไปประยุกต์ใช้งานได้ หากเอกสาร ประกอบการเรียนรู้เล่มน้ีมีขอ้ ผดิ พลาดประการใดขา้ พเจา้ ตอ้ งขออภยั ไว้ ณ ที่น้ีดว้ ย ขา้ พเจา้ ยนิ ดีนอ้ มรับ คาแนะนาเพื่อนามาปรับปรุงใหส้ มบูรณ์ยงิ่ ข้ึน เอกสารประกอบการสอนเล่มน้ีขา้ พเจา้ ไดพ้ ากเพียรคน้ ควา้ พฒั นาปรับปรุงให้มีความสมบูรณ์ มากท่ีสุด หากมีคุณความดีประการใดข้าพเจ้าขอมอบแด่บิดามารดาผูซ้ ่ึงเล้ียงดูและอบรมส่ังสอน ครูอาจารยท์ ี่ประสิทธ์ิประศาสตร์วชิ าความรู้และภรรยาบุตรธิดาท่ีใหก้ าลงั ใจในการจดั ทาเอกสารเล่มน้ี ประภาส สุวรรณเพชร ผเู้ รียบเรียง
สำรบญั ข คานา หนา้ สารบญั ก บทท่ี 1 ควำมรู้เบือ้ งต้นเกย่ี วกบั ไมโครคอนโทรลเลอร์ ข 1 1.1 ระบบตวั เลขและรหสั 2 1.2 ดิจิทลั พ้ืนฐาน 9 1.3 โครงสร้างพ้ืนฐานของระบบคอมพิวเตอร์ 12 1.4 ไมโครคอนโทรลเลอร์ Arduino 14 บทท่ี 2 กำรเขยี นโปรแกรมภำษำซีสำหรับไมโครคอนโทรลเลอร์ 17 2.1 ข้นั ตอนในการพฒั นาโปรแกรม 18 2.2 ภาษาซีสาหรับไมโครคอนโทรลเลอร์ 21 2.3 การสร้างฟังกช์ น่ั รองข้ึนใชเ้ อง 33 บทที่ 3 เคร่ืองมือช่วยพฒั นำงำนไมโครคอนโทรลเลอร์ 45 3.1 เครื่องมือแปลงภาษาซีเป็ นภาษาเคร่ือง 46 3.2 การติดต้งั ไดร์เวอร์ USB 50 3.2 เครื่องมือจาลองการทางาน 51 บทท่ี 4 ใบงำนกำรทดลอง 55 ใบงานท่ี 4.1 การทดสอบบอร์ดเบ้ืองตน้ 57 ใบงานที่ 4.2 การเขียนโปรแกรมสื่อสารทางพอร์ตอนุกรม 63 ใบงานท่ี 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ที่เอาทพ์ ุทพอร์ตเบ้ืองตน้ 71 ใบงานที่ 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั 79 ใบงานที่ 4.5 การเขียนโปรแกรมอ่านค่าจากพอร์ตแอนาลอกและการใช้ PWM 89 ใบงานท่ี 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 99 ใบงานที่ 4.7 การเขียนโปรแกรมวดั อุณหภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC ใบงานท่ี 4.8 การเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 109 ใบงานที่ 4.9 การเขียนโปรแกรมใชง้ านไอซีวดั อุณหภูมิ DS18B20 119 ใบงานที่ 4.10 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 127 ใบงานท่ี 4.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์ 139 ใบงานท่ี 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์ 151 163
ค สำรบัญ (ต่อ) หนา้ 173 ใบงานที่ 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์ 181 ใบงานที่ 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์ 193 ใบงานท่ี 4.15 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM 203 ใบงานที่ 4.16 การเขียนโปรแกรมใชง้ านคียแ์ พด 213 ใบงานที่ 4.17 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมต่อแบบ 4 บิต 221 ใบงานท่ี 4.18 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เชื่อมต่อแบบ I2C 231 ใบงานที่ 4.19 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219 245 ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 263 ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 275 ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลที่ LCD 4 bit กบั เซนเซอร์ต่าง ๆ 289 ใบงานท่ี 4.23 การประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ต่าง ๆ 303 ใบงานที่ 4.24 การประยกุ ตก์ ารแสดงผลดว้ ยโมดูล MAX7219 กบั เซนเซอร์ตา่ ง ๆ 317 ใบงานท่ี 4.25 การประยกุ ตก์ ารแสดงผลที่ OLED กบั เซนเซอร์ต่าง ๆ บรรณานุกรม 329 ภาคผนวก 330
บทท่ี 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 1 บทที่ 1 ความรู้เบื้องต้นเกยี่ วกบั ไมโครคอนโทรลเลอร์ หวั ขอ้ เรื่อง 1.1 ระบบตวั เลขและรหสั 1.2 ดิจิทลั พ้ืนฐาน 1.3 โครงสร้างพ้ืนฐานของระบบคอมพวิ เตอร์ 1.4 ไมโครคอนโทรลเลอร์ Arduino สาระสาคญั ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ในบทน้ีกล่าวถึง ระบบตวั เลขท่ีเกี่ยวข้องกบั ไมโครคอนโทรลเลอร์ มีหวั ขอ้ ความรู้ดา้ นดิจิทลั พ้ืนฐานท่ีมีใชง้ านในไมโครคอนโทรลเลอร์ และความรู้ ทว่ั ไปของไมโครคอนโทรลเลอร์ Arduino สมรรถนะประจาหน่วยการเรียนรู้ แสดงความรู้เกี่ยวกบั ไมโครคอนโทรลเลอร์ Arduino จุดประสงคก์ ารเรียนรู้ จุดประสงค์ทวั่ ไป 1. เพ่ือใหม้ ีความรู้เกี่ยวกบั ระบบตวั เลขและดิจิทลั พ้ืนฐาน 2. เพือ่ ใหม้ ีความรู้เก่ียวกบั โครงสร้างพ้ืนฐานของระบบคอมพิวเตอร์ 3. เพ่อื ใหม้ ีความรู้เก่ียวกบั ไมโครคอนโทรลเลอร์ Arduino จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีการแปลงเลขฐานในระบบตวั เลขและดิจิทลั พ้ืนฐานได้ 2. บอกเกี่ยวกบั โครงสร้างพ้ืนฐานของระบบคอมพวิ เตอร์ได้ 3. บอกเกี่ยวกบั ไมโครคอนโทรลเลอร์ Arduino ได้ 4. ทาแบบฝึกหดั เสร็จทนั เวลาและทาแบบทดสอบผา่ นเกณฑท์ ่ีกาหนด
2 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ความรู้เบื้องต้นเกย่ี วกบั ไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ ( Microcontroller) มาจากคา 2 คา คาหน่ึงคือ ไมโคร (Micro) หมายถึง ขนาดเล็กและคาว่า คอนโทรลเลอร์ (Controller) หมายถึงตัวควบคุมหรืออุปกรณ์ควบคุม ดังน้ัน ไมโครคอนโทรลเลอร์ จึงหมายถึงอุปกรณ์ควบคุมขนาดเล็ก แต่ในตวั อุปกรณ์ควบคุมขนาดเล็กน้ี ได้ บรรจุความสามารถท่ีคล้ายคลึงกับระบบคอมพิวเตอร์ที่คนโดยส่วนใหญ่ค้นเคย กล่าวคือภายใน ไมโครคอนโทรลเลอร์ ไดร้ วมเอาหน่วยประมวลผลหลกั หน่วยความจา และพอร์ต ซ่ึงเป็นส่วนประกอบ หลกั สาคญั ของระบบคอมพิวเตอร์เขา้ ไวด้ ว้ ยกนั โดยทาการบรรจุเขา้ ไวใ้ นตวั ถงั เดียวกนั ความแตกต่าง ของไมโครคอนโทรลเลอร์กบั ไมโครโปรเซสเซอร์ คือไมโครคอนโทรลเลอร์น้นั มีความสมบูรณ์ภายใน ตวั ของมนั เอง คือ มีส่วนประกอบต่าง ๆ ครบถ้วน ส่วนไมโครโปรเซสเซอร์น้ันตอ้ งทางานร่วมกบั อุปกรณ์ขา้ งเคียงท่ีเช่ือมตอ่ จากภายนอก เช่น หน่วยความจา (Memory) หน่วยอินพตุ เอาตพ์ ุต (I/O) ฯลฯ 1 เพื่อให้เขา้ ใจการทางานของไมโครคอนโทรลเลอร์พร้อมท้งั วงจรต่อพ่วงแบบต่าง ๆ ส่ิงแรกที่ จะตอ้ งทาความเขา้ ใจก่อนที่จะเขา้ เร่ืองไมโครคอนโทรลเลอร์จะตอ้ งเขา้ ใจเก่ียวกบั ระบบตวั เลข ระบบ การเขา้ รหัส ระบบลอจิกเกต โดยระบบท้งั หมดเป็ นการทางานภายในคอมพิวเตอร์ เน้ือหาบทน้ีจะเป็ น พ้ืนฐานในการเรียนรู้ และทาความเขา้ ใจเกี่ยวกบั ไมโครคอนโทรลเลอร์ในบทถดั ไป 1.1 ระบบตัวเลขและรหัส แนวคิดเก่ียวกบั จานวนและการนบั มีมาแต่โบราณ มนุษยส์ ามารถนบั จานวนสิ่งต่าง ๆ โดยมี ความคิดวา่ เม่ือเพ่ิมสิ่งใดสิ่งใดก็จะไดส้ ิ่งน้นั “มากข้ึน” และถา้ เอาส่ิงน้นั ออกไปจะทาใหส้ ิ่งน้นั “ลดลง” ต่อเมื่อสังคมเจริญข้ึนก็ใชว้ ิธีการจบั คู่สิ่งน้นั เช่น อาจใช้นิ้วมือแทนส่ิงเหล่าน้นั เช่น หน่ึงนิ้วแทนสัตว์ หน่ึงตวั และอาจใชก้ อ้ นหินบนั ทึกจานวนสิ่งน้นั หรืออาจใชข้ ีดเขียนบนพ้ืนดิน หรือสลกั บนตน้ ไม้ ต่อมา จึงใชส้ ัญลกั ษณ์แทนจานวนข้ึน และพบวา่ การนบั และการเขียนในสมยั โบราณน้นั จะไม่มี “ศูนย”์ มีหลกั ฐานยืนยนั เมื่อปี ค.ศ. ท่ี 9 ใชเ้ รียกเป็ นตวั เลขอาระบิกเป็ นช่ือท่ีเรียกตวั เลขที่ประดิษฐ์ข้ึน ข้ึนในประเทศอินเดียยคุ โบราณโดยนกั คณิตศาสตร์ชาวอินเดียนประมาณ 500 ปี ก่อนคริสตศกั ราชจากน้นั จึงไปถ่ายทอดไปยงั ประเทศในแถบยุโรปในยุคกลางท้งั ๆ ท่ีเร่ิมตน้ ที่ประเทศอินเดีย แต่เร่ิมรู้จกั ในฝั่ง ตะวนั ตกในชื่อวา่ ตวั เลขอาระบิก ท้งั น้ีเน่ืองจากในยโุ รปไดใ้ ชต้ าราของอาหรับ (Arabic texts) เช่น “ The calculation with Hindu numerals” เป็ นตน้ ทาให้ชาวยุโรปพากนั เรียกตวั เลขน้ีว่าตวั เลขอาระบิกและใน ปัจจุบนั จึงเรียกตวั เลขน้ีว่าตวั เลขฮินดูอาระบิกดว้ ยตวั เลขอาระบิกน้ีเรียกในภาษาอาระบิกว่า \"Hindu numerals\",\" \" أرقام هنديةต่อมาเรี ยกว่า Hindu-Arabic numerals หรื อ Indian numerals อันเป็ น สัญลกั ษณ์ที่ใชแ้ ทนจานวนกนั ทว่ั โลก 1Mechanical Engineering, เอกสารประกอบการอบรมค่ายหุ่นยนต์ปลาคร้ังที่ 2, หนา้ 1.
บทท่ี 1 ความรู้เบ้ืองตน้ เก่ียวกบั ไมโครคอนโทรลเลอร์ 3 ตวั เลขที่ใชอ้ ยใู่ นปัจจุบนั ซ่ึงเรียกวา่ ตวั เลขฮินดูอาระบิกน้ีใชแ้ ทนดว้ ยตวั เลข 10 ตวั คือ 1, 2, 3, 4, 5, 6, 7, 8, 9 และ 0 ตวั เลขเหล่าน้ีได้มีข้ึนในยุโรปในศตวรรษที่ 12 โดย Leonardo Pissano ซ่ึงเป็ นนกั คณิตศาสตร์ชาวอิตาเลียน เขาไดร้ ับการศึกษาจากประเทศในแถบแอฟริกาเหนือแลว้ นาความรู้กลบั มาใช้ ในประเทศอิตาลี ระบบตวั เลขฮินดู เป็ นระบบที่มีค่าประจาตาแหน่งค่าของตวั เลขข้ึนกบั ตาแหน่งของ ตวั เลขน้นั เช่น “2” ใน 205 มีค่าเป็น 10 เท่าของ “2” ใน 25 ดงั น้นั จึงตอ้ งมี “0” เพอ่ื บอกตาแหน่งหรือหลกั สิบ ใน“205” ดว้ ย การคน้ พบตวั เลข 0 เกิดข้ึนหลงั จากมีสญั ลกั ษณ์แทนจานวนเตม็ 9 จานวนแลว้ ตวั เลข 0 ใชแ้ ทนตาแหน่งวา่ งเปล่า เรียกวา่ “ตวั ร้ังตาแหน่ง” (Place holder)2 จากความก้าวหน้าทางเทคโนโลยีได้มีการพฒั นาเครื่องคอมพิวเตอร์ข้ึนมาใช้งาน โดยเคร่ือง คอมพิวเตอร์เป็ นเคร่ืองใช้ไฟฟ้าซ่ึงถูกออกแบบมาเพ่ือท่ีจะรับรู้สภาวะเพียงสองสภาวะเท่าน้ัน เพ่ือ ป้องกันการผิดพลาดของข้อมูลคือ สภาวะมีแรงดันไฟฟ้าโดยเรี ยกว่าลอจิก 1 และสภาวะไม่มี แรงดนั ไฟฟ้าโดยเรียกวา่ ลอจิก 0 ในระบบคอมพิวเตอร์ที่มีความเร็วต่าแรงดนั ไฟฟ้าสาหรับลอจิก 1 จะมี ค่าเท่ากบั 5 โวลตแ์ ละแรงดนั ไฟฟ้าสาหรับลอจิก 0 จะมีค่าเท่ากบั 0 โวลต์ แต่สาหรับคอมพิวเตอร์ท่ีมี ความเร็วสูงค่าระดบั แรงดนั ลอจิก 1 จะลดลงเพ่อื ลดความร้อนท่ีเกิดข้ึนกบั ตวั ประมวลผลกลาง ดงั น้นั การประมวลผลต่าง ๆ ของคอมพิวเตอร์จึงใช้งานในระบบตวั เลขฐาน 2 หรือที่เรียกว่า เลขไบนาร่ี (Binary) ตวั เลขที่ใช้ระบบเลขฐาน 10 คือ 0, 1, 2, … 9 และในระบบเลขฐาน 2 มีเพียงเลข 0 กบั 1 เท่าน้นั การแปลงเลขฐาน 10 เป็นเลขใด ๆ ในการเขียนโปรแกรมคอมพิวเตอร์จาเป็นตอ้ งใชเ้ ลขฐานหลกั ๆ 3 เลขฐานไดแ้ ก่ เลขฐาน 10 เลข ฐาน 2 และเลขฐาน 16 ซ่ึงในแตล่ ะฐานมีความสัมพนั ธ์กนั จาเป็นจะตอ้ งมีความรู้ในการแปลงเลขฐานเพ่ือ นาไปใชป้ ระโยชน์ในการเขียนโปรแกรมคอมพิวเตอร์ การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐานใด ๆ น้นั ทาไดโ้ ดยการหารเลขฐาน 10 ท่ีตอ้ งการแปลงดว้ ย ตัวเลขของเลขฐานที่ต้องการแปลงและเก็บค่าผลลัพธ์ โดยเศษของการหารคร้ังแรกจะเป็ น เลขฐานที่ตอ้ งการแปลงในบิตต่าสุด (LSB: Least significant bit) ส่วนผลหารจะไปหารคร้ังถดั ไปดว้ ยเลข ฐานที่ตอ้ งการแปลง เศษของการหารในคร้ังน้ีจะเป็ นเลขฐานที่ตอ้ งการแปลงในบิตถดั ข้ึนมา ส่วนผลลพั ธ์ ก็นาไปหารดว้ ยเลขฐานท่ีตอ้ งการแปลงทาอยา่ งน้ีไปจนกระทงั่ ผลหารมีคา่ เป็น 0 2รศ. รัตนพร บ่อคา, ประวตั ขิ องจานวนและตวั เลข, วารสารวทิ ยาศาสตร์ ฉบบั ที่ 1-2, หนา้ 48.
4 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตวั อย่าง การแปลงเลขฐาน 10 เป็นเลขฐาน 2 โจทย์ จงแปลงคา่ 4510 เป็นเลขฐาน 2 วธิ ีทา ผลลพั ธ์ เศษ 45/2 = 22 1 บิตคา่ ต่าสุด (LSB: Least significant bit) บิตคา่ สูงสุด (MSB: Most significant bit) 22/2 = 11 0 11/2 = 5 1 5/2 = 2 1 2/2 = 1 0 1/2 = 0 1 คาตอบ 4510 = 1011012 ตวั อย่าง การแปลงเลขฐาน 10 เป็นเลขฐาน 3 โจทย์ จงแปลงคา่ 4510 เป็นเลขฐาน 3 วธิ ีทา ผลลพั ธ์ เศษ 45/3 = 15 0 บิตคา่ ต่าสุด (LSB: Least significant bit) บิตค่าสูงสุด (MSB: Most significant bit) 15/3 = 5 0 5/3 = 1 2 1/3 = 0 1 คาตอบ 2510 = 12003 ตวั อย่าง การแปลงเลขฐาน 10 เป็นเลขฐาน 4 โจทย์ จงแปลงค่า 4510 เป็นเลขฐาน 4 วธิ ีทา ผลลพั ธ์ เศษ 45/4 = 11 1 บิตคา่ ต่าสุด (LSB: Least significant bit) บิตค่าสูงสุด (MSB: Most significant bit) 11/4 = 2 3 2/4 = 0 2 คาตอบ 2510 = 2314
บทท่ี 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 5 การแปลงเลขฐานใด ๆ เป็นเลขฐาน 10 การแปลงเลขฐานใด ๆ ใหเ้ ป็ นเลขฐาน 10 ตอ้ งทาความเขา้ ใจเก่ียวกบั น้าหนกั ของตวั เลขที่อยใู่ น ตาแหน่งต่าง ๆ ก่อน น้าหนกั ของตวั เลขท่ีอยู่ขวาสุด (LSB: Least significant bit) จะมีค่าเท่ากบั เลขฐาน น้นั ๆ ยกกาลงั ศูนยแ์ ละเลขตาแหน่งถดั มาจะมีน้าหนกั เท่ากบั เลขฐานน้นั ๆ ยกกาลงั หน่ึง เป็ นเช่นน้ีไป เรื่อย ๆ ครบทุกหลกั สาหรับการหาคา่ เลขฐานใด ๆ ใหเ้ ป็นเลขฐานสิบจะหาไดจ้ ากการรวมกนั ของผลคูณ ในตวั เลขในตาแหน่งตา่ ง ๆ กบั น้าหนกั ของตวั เลขในตาแหน่งน้นั ๆ ดงั ตวั อยา่ ง ตัวอย่าง การแปลงเลขฐาน 8 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 8 ของเลข 765438 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 84 83 82 81 80 4 3 เลข 7 6 5 4×81=32 3×80=3 3209910 ผลคูณ 7×84=28672 6×83=3072 5×82=320 765438 = 28672+3072+320+32+3 = ตัวอย่าง การแปลงเลขฐาน 5 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 5 ของเลข 434215 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 54 53 52 51 50 2 1 เลข 4 3 4 2×51=10 1×50=1 298610 ผลคูณ 4×54=2500 3×53=375 4×52=100 434215 = 2500+375+100+10+1 = ตัวอย่าง การแปลงเลขฐาน 2 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 2 ของเลข 110102 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 24 23 22 21 20 1 0 เลข 1 1 0 1×21=2 0×20=0 2610 ผลคูณ 1×24=16 1×23=8 0×22=0 110102 = 16+8+0+2+0 =
6 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] หากคานวณจากน้าหนกั ในแต่ละตาแหน่งก่อนจะทาใหก้ ารหาค่าง่ายข้ึน ดงั ตวั อยา่ ง ตวั อย่าง การแปลงเลขฐาน 5 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 5 ของเลข 434215 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 54 53 52 51 50 625 125 25 5 1 1 เลข 4 3 4 2 1×1=1 ผลคูณ 4×625=2500 3×125=375 4×25=100 2×5=10 434215 = 2500+375+100+10+1 = 298610 ตวั อย่าง การแปลงเลขฐาน 2 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 2 ของเลข 110102 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 24=16 23=8 22=4 21=2 20=1 1 0 เลข 1 1 0 1×2=2 0×1=0 2610 ผลคูณ 1×16=16 1×8=8 0×4=0 110102 = 16+8+0+2+0 = ระบบเลขฐาน 16 ตารางที่ 1-1 ความสัมพนั ธ์ของเลขฐาน เลขฐาน 10 เลขฐาน 2 เลขฐาน 16 ระบบเลขฐาน 16 (HEX: Hexadecimal) เป็ นเลข ท่ีถูกเรียกใชใ้ นระบบคอมพิวเตอร์ซ่ึงใชแ้ ทนตวั เลขที่เป็ น 0 0000 0 เลขฐาน 2 เพื่อใหง้ ่ายต่อการใชง้ านเน่ืองจากเลขฐาน 2 มี แค่เลข 0 และ 1 เท่าน้ัน ดงั เช่น 1000100101102 แต่เมื่อ 1 0001 1 เขียนเป็ นเลขฐาน 16 จะไดเ้ พียง 89616 ในระบบเลขฐาน 2 ที่มีเพียงเลข 2 ตวั คือ 0 กบั 1 ในระบบเลขฐาน 10 มีเลข 2 0010 2 10 ตวั คือ 0, 1, 2, … 9 และในระบบเลขฐาน 16 มีตวั เลข 16 ตวั โดย 10 เลขแรกใชเ้ ลขเดียวกบั เลขฐาน 10 คือ 0 ถึง 3 0011 3 9 ส่วนที่เหลืออีก 6 ตวั จะใช้ตวั อกั ษรภาษาองั กฤษแทน คือ A, B, C, D, E, Cและ F ดงั ตารางที่ 1-1 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F
บทที่ 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 7 การแปลงเลขฐานระหวา่ งเลขฐาน 2 กบั เลขฐาน 16 ในการแปลงเลขฐาน 2 ให้เป็ นเลขฐาน 16 สามารถทาไดโ้ ดยการแบ่งกลุ่มตวั เลขของเลขฐาน 2 เริ่มจากขวาไปซ้ายเป็ นกลุ่ม ๆ ละ 4 บิต และใช้จากตารางแสดงความสัมพนั ธ์ของเลขฐานในการแปลง เลขฐานไดโ้ ดยตรงดงั ตวั อยา่ ง ตวั อย่าง การแปลงเลขฐาน 2 ใหเ้ ป็นเลขฐาน 16 โดยการแบ่งกลุ่มตวั เลข โจทย์ จงแปลงค่า 1001111101012 เป็นเลขฐาน 16 วธิ ีทา แบ่งกลุ่มตวั เลขของเลขฐาน 2 เริ่มจากขวาไปซา้ ยเป็นกลุ่ม ๆ ละ 4 บิต 1001 1111 0101 จากโจทย์ 9 F5 คาตอบ 1001111101012 = 9F5H ตัวอย่าง การแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 2 โดยการแบ่งกลุ่มตวั เลข โจทย์ จงแปลงค่า A72B16 เป็ นเลขฐาน 2 วธิ ีทา A 7 2 B จากโจทย์ 1010 0111 0010 1011 คาตอบ A72B16 = 10100111001010112 การแปลงเลขฐาน 10 เป็นเลขฐาน 16 ในการแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 สามารถทาได้ 2 แนวทางคือ 1. แปลงเลขฐาน 10 ให้เป็ นเลขฐาน 2 ก่อนใชว้ ิธีการกระจายตามน้าหนกั ของแต่ละบิตแลว้ ทาการ แปลงเลขฐาน 2 ใหเ้ ป็นเลขฐาน 16 ดงั ตวั อยา่ ง ตัวอย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โดยการแปลงเป็นเลขฐาน 2 ก่อน โจทย์ จงแปลงคา่ 4510 เป็นเลขฐาน 16 วธิ ีทา น้าหนกั บิตฐาน 2 32 16 8 4 2 1 4510 กระจายได้ 1 0 1101 คาตอบ 4510 = 32+0+8+4+0+1 = 1011012 = 0010 11012 = 2DH
8 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตัวอย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โจทย์ จงแปลงคา่ 171410 เป็ นเลขฐาน 16 วธิ ีทา น้าหนกั บิต 1024 512 256 128 64 32 16 8 4 2 1 171410 1 1 0 1 0 1 1 0 0 1 0 คาตอบ 171410 = 110101100102 = 0110 1011 00102 = 6B216 2. แปลงโดยตรงทาไดโ้ ดยการหารเช่นเดียวกบั การแปลงเลขฐาน 2 เป็ นเลขฐาน 10 ตา่ งตรงที่ใช้ 16 เป็นตวั หาร ดงั ตวั อยา่ ง ตวั อย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โดยการหาร โจทย์ แปลงคา่ 4510 เป็นเลขฐาน 16 เศษ วธิ ีทา ผลหาร 45/16 2 13 =D 2/16 0 2 =2 คาตอบ 4510 =2D16 ตวั อย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โดยการหาร โจทย์ แปลงค่า 23410 เป็นเลขฐาน 16 วธิ ีทา ผลหาร เศษ 234/16 14 10 =A 14/16 0 14 =E คาตอบ 23410 =EA16 การแปลงเลขฐาน 16 เป็นเลขฐาน 10 ในการแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 10 สามารถทาได้ 2 แนวทางคือ 1. แปลงเลขฐาน 16 ให้เป็ นเลขฐาน 2 ก่อนแลว้ ทาการแปลงจากเลขฐาน 2 ที่ไดใ้ หเ้ ป็ นเลขฐาน 10 อีกคร้ัง ดงั ตวั อยา่ ง
บทที่ 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 9 ตัวอย่าง การแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 10 โดยการแปลงเป็นเลขฐาน 2 ก่อน 4 21 0 10 โจทย์ จงแปลงค่า 6B216 เป็นเลขฐาน 10 วธิ ีทา จากโจทย์ 6 B 2 ฐาน2 110 1011 0010 น้าหนกั ฐาน 2 1024 512 256 128 64 32 16 8 11010110 คาตอบ (1024+512+0+128+32+16+0+0+2+0) = 171410 2. แปลงโดยตรงโดยรวมจากน้าหนกั ของแต่ละหลกั ดงั ตวั อยา่ ง ตัวอย่าง การแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 10 โดยรวมจากน้าหนกั ในแต่ละหลกั โจทย์ จงแปลงคา่ 6B216 เป็นเลขฐาน 10 วธิ ีทา น้าหนกั ฐาน 16 162 161 160 6 B(11) 2 6B216 = (6×162)+(11×161)+(2×160) = 1536+176+2 คาตอบ = 171410 ตวั อย่าง การแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 10 โดยรวมจากน้าหนกั ในแตล่ ะหลกั โจทย์ จงแปลงค่า ABC16 เป็นเลขฐาน 10 วธิ ีทา น้าหนกั ฐาน 16 162 161 160 A(10) B(11) C(12) ABC16 = (10×162)+(11×161)+(12×160) = 2560+176+12 คาตอบ = 274810 1.2 ดิจทิ ลั พืน้ ฐาน ดิจิทลั (Digital) เป็ นการอธิบายเทคโนโลยีอิเล็กทรอนิกส์ที่ใชส้ ร้าง เก็บ และประมวลขอ้ มูลใน ลกั ษณะ 2 สถานะท่ีเรียกวา่ ลอจิก คือ บวกแสดงดว้ ยลอจิก 1 และไม่บวกแสดงดว้ ยลอจิก 0 ดงั น้นั ขอ้ มูล ส่งผ่านหรือเก็บดว้ ยเทคโนโลยีดิจิทลั เป็ นการแสดงดว้ ยลอจิก 0 และ 1 แต่ละค่าของตาแหน่งสถานะ
10 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] เหล่าน้ีเป็นการอา้ งแบบ Binary digital ดิจิทลั มีความเกี่ยวขอ้ งกบั ไมโครคอนโทรลเลอร์ท้งั ฮาร์ดแวร์และ ซอฟต์แวร์ สาหรับหน่วยการเรียนน้ีจะกล่าวถึงระดบั แรงดนั ไฟฟ้าของลอจิกดิจิทลั และคุณสมบตั ิของ ลอจิกเกตชนิดต่าง ๆ ท่ีเกี่ยวขอ้ งกบั การใชง้ านของไมโครคอนโทรลเลอร์ ดงั น้ี ระดบั ลอจิก ระดบั ลอจิกท่ีใชง้ านในวงจรจริง สถานะของลอจิกดิจิทลั 2 สถานะจะแทนค่าดว้ ยแรงดนั ไฟฟ้า คือ ลอจิก 0 แทนแรงดนั 0 โวลต์ และลอจิก 1 แทนแรงดนั 5 โวลต์ แต่ในเป็นความจริงอุปกรณ์ที่นามาใช้ งานจะสามารถรับรู้ลอจิกไดก้ วา้ งพอสมควร โดยการรับรู้ลอจิก 0 กไ็ ม่จาเป็นตอ้ งมีค่าแรงดนั เป็ น 0 โวลต์ โดยสามารถท่ีจะรับรู้ค่าของแรงดนั ท่ีสูงกว่า 0 โวลต์ไดเ้ ล็กน้อย และในทานองเดียวกนั ลอจิก 1 ก็ไม่ จาเป็นตอ้ งเป็น 5 โวลตเ์ ช่นกนั ดงั รูปท่ี 1-1 5 ระดบั ลอจิก 1 4 3 2 1 ระดบั ลอจิก 0 รูปท่ี 1-1 ระดบั แรงดนั ของลอจิก สาหรับไมโครคอนโทรลเลอร์ในปัจจุบนั บางเบอร์บางตระกูลใชแ้ รงดนั ไฟเล้ียงที่ต่ากวา่ 5 โวลต์ ลอจิก 1 ก็มีขนาดแรงดนั ที่ต่าลงไปดว้ ย โดยค่าลอจิก 1 จะเป็นค่าใกลเ้ คียงกบั แรงดนั ไฟเล้ียงในวงจร ลอจิกเกตของเลขฐาน 2 ระบบเลขฐาน 2 สามารถนาลอจิกผา่ นวงจรต่าง ๆ เพ่อื ใหไ้ ดล้ อจิกท่ีเปลี่ยนไป โดยวงจรดงั กล่าว เรียกวา่ วงจรลอจิกเกตโดยมีวงจรตา่ ง ๆ ดงั น้ี 1. แอนดเ์ กต (AND gate) 2. ออร์เกต (OR gate) 3. เอก็ ซ์คลูซีฟออร์เกต (XOR gate) 4. แนนดเ์ กต (NAND gate) 5. นอร์เกต (NOR gate) 6. น็อตเกต (NOT gate)
บทท่ี 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 11 แอนดเ์ กต (AND gate) แอนด์เกตเป็ นวงจรท่ีมีอินพุตต้งั แต่ 2 แอนเกต (AND Gate) อินพุตข้ึนไป เมื่อนาค่าลอจิกมาผ่านวงจรแลว้ ให้ค่าลอจิกทางเอาต์พุตท่ีมีความสัมพนั ธ์กบั อินพุต เอาตพ์ ุต อินพุตคือ เมื่ออินพุตทุกอินพุตมีลอจิกเป็ น 1 จะส่งผลให้ลอจิกทางเอาต์พุตเป็ นลอจิก 1 แต่ AB QA Q ถา้ หากอินพุตมีค่าลอจิก 0 ในอินพุตใดอินพุต 00 0 หน่ึงหรือท้งั หมดจะส่งผลใหล้ อจิกทางเอาตพ์ ุต 01 0 B เป็นลอจิก 0 10 0 11 1 ออร์เกต (OR gate) ออร์เกต (OR Gate) ออร์เกตเป็ นวงจรท่ีมีอินพุตต้งั แต่ 2 อินพตุ เอาตพ์ ุต อินพุตข้ึนไป เม่ือนาค่าลอจิกมาผา่ นวงจรแลว้ ให้ค่าลอจิกทางเอาต์พุตที่มีความสัมพนั ธ์กบั AB Q A Q อินพุตคือ เมื่ออินพุตใดอินพุตหน่ึงหรือทุก 00 0 Q อินพุตมีลอจิกเป็ น 1 จะส่งผลให้ลอจิกทาง 01 1B เอาตพ์ ตุ เป็นลอจิก 1 หากทุกอินพตุ มีคา่ ลอจิก 0 จะส่งผลใหเ้ อาตพ์ ุตมีลอจิก 0 10 1 เอก็ ซค์ ลูซีฟออร์เกต (XOR gate) 11 1 เอ็กคลูซีฟออร์เกตเป็ นวงจรท่ีมีอินพุต เอก็ ซ์คลูซีฟออร์เกต ต้งั แต่ 2 อินพุต เมื่อนาค่าลอจิกมาผ่านวงจร แลว้ ให้ค่าลอจิกทางเอาตพ์ ุตที่มีความสัมพนั ธ์ (XOR Gate) กับอินพุตคือ เมื่ออินพุตท้ังสองอินพุตมีค่า ลอจิกเดียวกนั (ลอจิก 0 ท้งั สองอินพุต หรือ อินพุต เอาตพ์ ุต ลอจิก 1 ท้งั สองอินพุต)จะทาให้เอาต์พุตมีค่า ลอจิกเป็ น 0 และถ้าอินพุตมีค่าลอจิกต่างกนั A B QA ส่งผลใหล้ อจิกทางเอาตพ์ ุตเป็นลอจิก 1 00 0B 01 1 10 1 11 0
12 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] น็อตเกต (NOT gate) น็อตเกตหรือบางคร้ังเรียกวา่ อินเวอร์เตอร์ น็อตเกต (NOT Gate) Q เป็ นวงจรท่ีมีอินพุตเพียงอินพุตเดียว เม่ือนาค่า อินพตุ เอาตพ์ ุต ลอจิกมาผา่ นวงจรแลว้ ใหค้ ่าลอจิกทางเอาตพ์ ุตมีค่า ลอจิกตรงขา้ มกบั อินพตุ A QA 01 10 แนนดเ์ กต (NAND gate), นอร์เกต (NOR gate) แนนด์เกตเป็ นการรวมกนั สองลอจิกเกตคือ แอนด์เกตกบั น็อตเกต โดยเอาตพ์ ุตของแอนดเ์ กตถูก ส่งใหก้ บั น็อตเกต ดงั น้นั เอาตพ์ ตุ ของแนนดเ์ กตจะมีสภาวะตรงกนั ขา้ มกบั แอนดเ์ กต นอร์เกตเป็ นการรวมกนั สองลอจิกเกตคือ ออร์เกตกบั น็อตเกต โดยเอาต์พุตของออร์เกตถูกส่ง ใหก้ บั น็อตเกต ดงั น้นั เอาตพ์ ุตของนอร์เกตจะมีสภาวะตรงกนั ขา้ มกบั ออร์เกต 1.3 โครงสร้างพืน้ ฐานของระบบคอมพวิ เตอร์ ถา้ พูดถึงระบบคอมพิวเตอร์แลว้ หลายท่านอาจมองถึงเคร่ืองคอมพิวเตอร์ที่ใชง้ านกนั ทวั่ ไปท่ีมี จอภาพ ตวั เคร่ือง แป้นพิมพ์ เหล่าน้ี แต่ในความเป็นจริงระบบคอมพิวเตอร์ไม่จาเป็นตอ้ งมีหนา้ ตาอยา่ งท่ี รู้จกั กนั เทา่ น้นั เพียงแตจ่ ะตอ้ งประกอบดว้ ยส่วนตา่ ง ๆ ดงั น้ี 1. ส่วนรับขอ้ มูลหรืออินพุต (Input) 2. ส่วนส่งขอ้ มูลหรือเอาตพ์ ุต (Output) 3. ส่วนประมวลผลกลาง (Central processing unit) 4. ส่วนเกบ็ ขอ้ มูลหรือคาสงั่ ท่ีเรียกวา่ หน่วยความจา (Memory) อินพตุ หน่วยประมวลผลกลาง เอาตพ์ ุต หน่วยความจา รูปที่ 1-2 โครงสร้างพ้นื ฐานของระบบคอมพวิ เตอร์
บทที่ 1 ความรู้เบ้ืองตน้ เกี่ยวกบั ไมโครคอนโทรลเลอร์ 13 โดยส่วนต่าง ๆ ท้ังหมดประกอบข้ึนด้วยอุปกรณ์วงจรอิเล็กทรอนิกส์ ดังน้ันถ้าหากวงจร อิเล็กทรอนิกส์ใด ๆ ก็ตามที่มีส่วนประกอบครบท้งั 4 ส่วนท่ีกล่าวมาขา้ งตน้ ก็จะเป็ นระบบคอมพิวเตอร์ ทนั ที ซ่ึงไม่จาเป็นตอ้ งมีลกั ษณะเหมือนกบั คอมพิวเตอร์ส่วนบุคคล (PC: Personal computer) ที่ใชง้ านกนั ทวั่ ไป ส่วนรับขอ้ มูลหรืออินพุต เป็ นส่วนหรือวงจรที่ใชเ้ ช่ือมต่อคอมพิวเตอร์กบั อุปกรณ์ภายนอกโดยทาหน้าที่แปลงสัญญาณ จากอุปกรณ์ภายนอกให้มีระดับลอจิกที่เหมาะสมกบั วงจรภายใน เรียกทบั ศพั ท์ว่าวงจรอินเตอร์เฟช (Interface circuit) เพื่อส่งตอ่ ใหห้ น่วยประมวลผลใชเ้ ป็นขอ้ มูลประกอบการประมวลผลตามชุดคาส่ังท่ีได้ เขียนข้ึน เช่นวงจรแป้นพิมพเ์ ป็ นวงจรที่เปลี่ยนพลงั งานกลจากการกดแป้นพิมพเ์ ป็ นพลงั งานไฟฟ้าใน ระดบั แรงดนั 5 โวลตแ์ ละ 0 โวลตเ์ พือ่ เป็นลอจิก 1 และลอจิก 0 ส่วนส่งขอ้ มูลหรือเอาตพ์ ตุ เป็นส่วนหรือวงจรท่ีใชเ้ ช่ือมต่อคอมพิวเตอร์กบั อุปกรณ์ภายนอกโดยทาหนา้ ท่ีรับสัญญาณไฟฟ้า จากหน่วยประมวลผลที่เป็ นลอจิก 1 และลอจิก 0 ที่ระดบั แรงดนั 5 โวลตแ์ ละ 0 โวลต์ ส่งให้กบั อุปกรณ์ ภายนอกท่ีนาระดบั แรงดนั น้ีไปใชง้ าน ส่วนประมวลผลกลาง ส่วนประมวลผลกลางเป็ นหวั ใจของระบบคอมพิวเตอร์ โดยทาหนา้ ท่ีคิดประมวลผลซ่ึงมีส่วน การประมวลผลทางคณิตศาสตร์และลอจิก (Arithmetic and logic unit) หรือท่ีเรียกว่าทบั ศพั ท์ว่า ALU โดยการประมวลผลจะกระทาตามชุดคาสงั่ ที่เกบ็ ไวใ้ นหน่วยความจา ส่วนเกบ็ ขอ้ มูลหรือคาส่งั ที่เรียกวา่ หน่วยความจา เป็ นส่วนที่ใชเ้ ก็บขอ้ มูลหรือใชเ้ ก็บชุดคาส่ังที่เขียนข้ึนเพื่อให้ระบบคอมพิวเตอร์ทางานอย่างใด อยา่ งหน่ึงตามตอ้ งการ โดยหน่วยความจาท่ีใชใ้ นระบบคอมพิวเตอร์มี 2 แบบดว้ ยกนั คือ 1. หน่วยความจาถาวร เป็นหน่วยความจาที่มกั ใชเ้ กบ็ โปรแกรม ซ่ึงหน่วยความจาชนิดน้ีจะตอ้ งเป็ น หน่วยความจาท่ีสามารถคงขอ้ มูลไวไ้ ดแ้ มก้ ระท้งั ไม่มีไฟเล้ียง เพื่อรักษาคาสั่งหรือโปรแกรมไวเ้ มื่อมี ไฟเล้ียงจ่ายให้แก่ระบบ คอมพิวเตอร์จะไดส้ ามารถทางานได้ จากคุณสมบตั ิดงั กล่าว มีหน่วยความจา กลุ่มหน่ึงที่รักษาขอ้ มูลไวไ้ ดแ้ ต่มีคุณสมบตั ิอ่ืนเพ่ิมเติมข้ึนมาคือเป็ นหน่วยความจาที่สามารถอ่านไดเ้ พยี ง อยา่ งเดียวหรือเรียกกนั วา่ ROM (Read only memory) ซ่ึงมีอยหู่ ลายชนิดไดแ้ ก่ a) ROM คุณสมบตั ิ โปรแกรมจากโรงงานและลบไมไ่ ด้ b) PROM คุณสมบตั ิ โปรแกรมเองไดค้ ร้ังเดียวและลบไม่ได้ c) EPROM คุณสมบตั ิ โปรแกรมเองไดห้ ลายคร้ังและลบไดด้ ว้ ยแสง UV
14 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] d) E2PROM คุณสมบตั ิ โปรแกรมเองไดห้ ลายคร้ังและลบไดด้ ว้ ยไฟฟ้า e) Flash memory คุณสมบตั ิ โปรแกรมเองไดห้ ลายคร้ังและลบไดด้ ว้ ยไฟฟ้า โดยสามารถ ลบหรือแก้ไขขอ้ มูลที่จดั เก็บไวใ้ นยูนิตของหน่วยความจาท่ีเรียกว่า \"บล็อก\" (Block) ได้ ขอ้ แตกต่าง ระหวา่ ง E2PROM กบั Flash memory คือการลบหรือแกไ้ ขขอ้ มูล ซ่ึง E2PROM จะกระทาในระดบั ไบต์ 2. หน่วยความจาชั่วคราว เป็ นหน่วยความจาท่ีใช้พกั ขอ้ มูลในระหว่างการประมวลผล โดยเป็ น หน่วยความจาที่สามารถอ่านไดแ้ ละเขียนขอ้ มูลกลบั ไดใ้ นระดบั ไฟเล้ียงปกติ และรักษาขอ้ มูลไวไ้ ดต้ ราบ ท่ียงั มีไฟเล้ียงอยู่ หรือรักษาข้อมูลไวไ้ ด้ตราบที่ยงั ไม่มีข้อมูลใหม่มาทบั ขอ้ มูลเดิม จากคุณสมบตั ิที่ ตอ้ งการดงั กล่าวมีหน่วยความจาที่มีใหใ้ ชง้ านเพียงแต่จะไม่สามารถรักษาขอ้ มูลไวไ้ ดถ้ า้ ไม่มีไฟเล้ียง ซ่ึง หน่วยความจาแบบน้ีสามารถอ่านและเขียนขอ้ มูลแบบสุ่มตาแหน่งไดท้ ่ีเรียกว่า RAM (Random access memory) 1.4 ไมโครคอนโทรลเลอร์ Arduino \"Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.\" [ www.arduino.cc] “Arduino เป็ นแพลตฟอร์มต้นแบบด้าน อิเล็กทรอนิกส์แบบโอเพ่นซอร์ส ซ่ึงใช้ฮาร์ดแวร์และซอฟท์แวร์ที่ยืดหยุ่นและใชง้ านง่าย มีไวส้ าหรับ ศิลปิ น นกั ออกแบบ งานอดิเรกและทุกคนที่สนใจในการสร้างวตั ถุเชิงโตต้ อบหรือสภาพแวดลอ้ ม” โครงการ Arduino เดิมก่อต้งั มาดว้ ยผูร้ ่วมก่อต้งั 5 คน ไดแ้ ก่ Massimo Banzi, David Cuartielles, David Mellis, Tom Igoe, และ Gianluca Martino โดยเร่ิมโครงการมาต้งั แตช่ ่วงปี 2005 ความหมายของคา ว่า Arduino แปลว่า เพ่ือนแท้ (Strong friend หรือ Brave friend) ในภาษาอิตาลี โดยผูก้ ่อต้งั มีความต้งั ใจ ใหร้ าคาของอุปกรณ์น้นั ถูกเม่ือเทียบกบั ไมโครคอนโทรลเลอร์ตระกูลอื่น ๆ เพื่อให้ทุกคนสามารถเขา้ ถึง ไดโ้ ดยง่าย แพลตฟอร์ม Arduino ไดอ้ อกแบบมาเพ่ือใหใ้ ชง้ านง่าย ผใู้ ชง้ านไมจ่ าเป็นตอ้ งมีความรู้เก่ียวกบั โครงสร้างสถาปัตยกรรมภายในซีพียูโดยรู้เพียงว่าบอร์ด Arduino ท่ีเลือกมาใช้งานน้ันมีขาท่ีใช้งาน อะไรบา้ งมีคุณสมบตั ิต่าง ๆ อะไรบา้ งก็สามารถใชง้ านได้ ดว้ ยประสบการณ์และจานวณการใชง้ านของ ผใู้ ชจ้ านวนมาก Arduino จึงถูกใชง้ านดา้ นต่าง ๆ มากมาย เน่ืองจากการเขียนโคด้ โปรแกรมควบคุมการ ทางานของ Arduino มีความง่ายและยดื หยุน่ สามารถใชง้ านในระดบั สูงไดอ้ ีกดว้ ย เคร่ืองมือที่ใชส้ าหรับ เขียนโคด้ ควบคุมมีเวอร์ชน่ั ท่ีสามารถรันไดใ้ นทุกระบบปฏิบตั ิการไม่ว่าจะเป็ น แมคอินทอช วินโดวส์ หรือแมก้ ระท้งั ลีนุกซ์ก็ตามทาใหไ้ ดร้ ับความนิยมเป็นอยา่ งสูง แพลตฟอร์ม Arduino ประกอบไปดว้ ย - ฮาร์ตแวร์ - ซอฟตแ์ วร์
บทที่ 1 ความรู้เบ้ืองตน้ เก่ียวกบั ไมโครคอนโทรลเลอร์ 15 ฮาร์ตแวร์ (Hardware) เป็ นบอร์ดอิเล็กทรอนิกส์ขนาดเล็กท่ีมีไมโครคอนโทรลเลอร์เป็ นชิ้นส่วนหลกั ประกอบร่วมกบั อุปกรณ์อิเล็กทรอนิกส์อ่ืน ๆ เพื่อให้ง่ายต่อการใช้งานหรือท่ีเรียกกนั ว่า “บอร์ด Arduino” โดยบอร์ด Arduino ก็มีหลายรุ่นให้เลือกใชต้ ามความเหมาะสมของงาน โดยในแต่ละรุ่นอาจมีความแตกต่างกนั ใน เรื่องของขนาดของบอร์ด หรือสเปค เช่น จานวนของขารับส่งสัญญาณ, แรงดนั ไฟที่ใช้, ประสิทธิภาพ ของ MCU เป็นตน้ ซอฟต์แวร์ (Software) - ภาษาที่ใช้เขียนโคด้ ควบคุมบอร์ด Arduino เป็ นภาษาสาหรับเขียนโปรแกรมควบคุมท่ีมีไวยากรณ์ แบบเดียวกบั ภาษา C/C++ - Arduino IDE เป็ นเครื่องมือสาหรับเขียนโค้ดโปรแกรม การคอมไพล์โปรแกรม (การแปลงไฟล์ ภาษาซีใหเ้ ป็นภาษาเครื่อง) และอปั โหลดโปรแกรมลงบอร์ด ตวั อยา่ งบอร์ด Arduino ที่นิยมนามาใชง้ าน รูปท่ี 1-3 บอร์ด Arduino UNO รูปที่ 1-4 บอร์ด Arduino Nano รูปที่ 1-5 บอร์ด Arduino Mega
ตารางเปรียบเทียบคุณสมบตั ิของบอร์ด Arduino รุ่นต่าง ๆ (เฉพาะบางรุ่น) Name Processor Operating CPU A Input Voltage Speed 101 Intel® Curie 3.3 V / 7-12V 32MHz Gemma ATtiny85 3.3 V / 4-16 V 8 MHz ATmega168V 2.7-5.5 V LilyPad ATmega328P 2.7-5.5 V 8MHz LilyPad ATmega328P 2.7-5.5 V 8 MHz SimpleSnap LilyPad USB ATmega32U4 3.3 V / 3.8-5 V 8 MHz Mega 2560 ATmega2560 5 V / 7-12 V 16 MHz Micro ATmega32U4 5 V / 7-12 V 16 MHz ATmega168 3.3 V / 3.35-12 V 8 MHz Pro ATmega328P 5 V / 5-12 V 16 MHz 3.3 V / 3.35-12 V 8 MHz Pro Mini ATmega328P 5 V / 5-12 V 16 MHz 5 V / 7-12 V 16 MHz Uno ATmega328P 3.3 V / 7-12 V 48 MHz Zero ATSAMD21G18 3.3 V / 7-12 V 84 MHz Due ATSAM3X8E 5 V / 7-12 V 16 MHz Esplora ATmega32U4 5 V / 7-12 V 16 MHz Ethernet ATmega328P 5 V / 7-12 V 16 MHz Leonardo ATmega32U4 5 V / 7-12 V 16 MHz Mega ADK ATmega2560 5 V / 7-9 V 16 MHz Mini ATmega328P ATmega168 5 V / 7-9 V 16 MHz Nano ATmega328P ATmega32U4 5V 16 MHz Yùn AR9331 Linux 400MHz
Analog Digital EEPROM SRAM Flash USB UART In/Out IO/PWM [kB] [kB] [kB] 6 /0 196 Regular - 1 /0 14 / 4 - 24 Micro 0 0.5 8 6 /0 3 /2 0.5 16 14 / 6 0.512 1 -- 4 /0 9 /4 1 2 32 - - 4 /0 9 /4 2.5 32 Micro - 16 / 0 54 / 15 1 8 256 Regular 4 12 / 0 20 / 7 4 2.5 32 Micro 1 1 1 16 - 6 /0 14 / 6 0.512 2 32 1 1 6 /0 14 / 6 2 32 - 1 1 6 /0 14 / 6 2 32 Regular 1 6 /1 14 / 10 1 32 256 2 Micro 2 12 / 2 54 / 12 - 96 512 2 Micro 4 - 2.5 32 Micro - - - 1 32 Regular - 6 /0 14 / 4 1 2 32 Micro 1 12 / 0 20 / 7 1 2.5 256 Regular 4 16 / 0 54 / 15 4 32 - 8 /0 14 / 6 1 8 16 - 0.512 2 32 1 8 /0 14 / 6 1 1 32 Mini 2 64MB 1 12 / 0 20 / 7 1 2.5 Micro 16MB
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 17 บทที่ 2 การเขยี นโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ หวั ขอ้ เร่ือง 2.1 ข้นั ตอนในการพฒั นาโปรแกรม 2.2 ภาษาซีสาหรับไมโครคอนโทรลเลอร์ 2.3 การสร้างฟังกช์ นั่ รองข้ึนใชเ้ อง สาระสาคญั การเขียนโปรแกรมควบคุมการทางานไมโครคอนโทรลเลอร์ดว้ ยภาษาซี เป็นการเขียนโปรแกรม ที่มีความยดื หยนุ่ มากกวา่ และสามารถพฒั นางานไดเ้ ร็วกวา่ การเขียนโปรแกรมดว้ ยภาษาแอสเซมบลี การ เขียนโปรแกรมเพื่อควบคุมการทางานของ Arduino ยดึ หลกั วิธีการเขียนตามไวยากรณ์ภาษาซี ดงั น้นั เม่ือ สามารถเขียนโปรแกรมควบคุมการทางานไมโครคอนโทรลเลอร์ Arduino น้ีไดก้ ็สามารถนาความรู้ไป เขียนโปรแกรมภาษาซีไมโครคอนโทรลเลอร์อ่ืน ๆ ได้ สมรรถนะประจาหน่วยการเรียนรู้ แสดงความรู้เก่ียวกบั การเขียนผงั งาน (Flow chart) การตรวจสอบความถูกตอ้ งของการเขียน โปรแกรมจากผงั งาน และสามารถเขียนโปรแกรมจากผงั งาน จุดประสงคก์ ารเรียนรู้ จุดประสงค์ทวั่ ไป 1. เพอ่ื ใหม้ ีความรู้เก่ียวกบั ข้นั ตอนในการพฒั นาโปรแกรม 2. เพ่ือใหม้ ีความรู้เก่ียวกบั ภาษาซีสาหรับไมโครคอนโทรลเลอร์ 3. เพ่ือใหม้ ีความรู้เก่ียวกบั การสร้างฟังกช์ นั่ รองข้ึนใชเ้ อง จุดประสงค์เชิงพฤตกิ รรม 1. บอกเก่ียวกบั ข้นั ตอนในการพฒั นาโปรแกรมได้ 2. บอกเกี่ยวกบั ภาษาซีสาหรับไมโครคอนโทรลเลอร์ได้ 3. บอกวธิ ีการสร้างฟังกช์ นั่ รองข้ึนใชเ้ องได้ 4. ทาแบบฝึกหดั เสร็จทนั เวลาและทาแบบทดสอบผา่ นเกณฑท์ ี่กาหนด
18 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การเขยี นโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ การใชง้ านไมโครคอนโทรลเลอร์นอกจากจะตอ้ งมีวงจรไมโครคอนโทรลเลอร์และมีส่วนของ วงจรเชื่อมต่อกับอุปกรณ์ภายนอกเพ่ือใช้ในการควบคุมงานต่าง ๆ ตามต้องการท่ีเรียกว่าฮาร์ดแวร์ (Hardware) แลว้ จาเป็ นตอ้ งมีชุดคาสั่งหรือโปรแกรมไวส้ าหรับสั่งงานใหไ้ มโครคอนโทรลเลอร์ทางาน ตามที่ตอ้ งการซ่ึงเรียกวา่ ซอฟท์แวร์ (Software) ในบทน้ีเป็ นการเรียนรู้หลกั การเขียนโปรแกรมควบคุม การทางานของไมโครคอนโทรลเลอร์ 2.1 ข้นั ตอนในการพฒั นาโปรแกรม โปรแกรมคอมพิวเตอร์ท่ีนามาใช้งานได้น้ัน ไม่สามารถเร่ิ มต้นจากการเขียนคาสั่งด้วย ภาษาคอมพิวเตอร์ไดท้ นั ที จะตอ้ งมีการวิเคราะห์ วางแผน และปฏิบตั ิตามกระบวนการทางาน ซ่ึงแบ่ง ออกเป็น 5 ข้นั ตอน คือ 1. วเิ คราะห์ปัญหา โดยจะเร่ิมจากการวิเคราะห์ผลลพั ธ์ท่ีตอ้ งการ (Output) แลว้ ยอ้ นกลบั ไปยงั ขอ้ มูลที่นาเขา้ สู่ระบบ (Input) ตลอดจนขอ้ มูลอ่ืน ๆ ท่ีเกี่ยวขอ้ งในการที่จะนาไปใชใ้ นการ ประมวลผล 2. ออกแบบวิธีการแก้ปัญหา เม่ือทราบผลลพั ธ์ท่ีตอ้ งการและขอ้ มูลที่นาเขา้ สู่ระบบแลว้ ตอ้ ง กาหนดการวางแผนในการแกป้ ัญหา โดยใชว้ ิธีเขียนลาดบั ข้นั ตอนการแกป้ ัญหาท่ีเรียกว่า อลั กอริทึม (Algorithm ) และใชเ้ คร่ืองมือสาหรับช่วยในการเขียนอลั กอริทึมเช่น การเขียน รหสั จาลอง (Pseudo code) การเขียนผงั งาน (Flowchart) เป็นตน้ 3. เขียนโปรแกรม เลือกภาษาคอมพิวเตอร์ท่ีเหมาะสม โดยพิจารณาจากความสามารถของ ผเู้ ขียนโปรแกรมและประสิทธิภาพของภาษาคอมพิวเตอร์น้นั ๆ ใหเ้ หมาะสมกบั ระบบงานที่ ตอ้ งการแลว้ เขียนชุดคาสั่งเป็นภาษาคอมพิวเตอร์ตามอลั กอริทึมที่ไดอ้ อกแบบไว้ 4. ทดสอบและแก้ไขโปแกรม ภายหลงั จากเขียนโปรแกรมเสร็จสิ้น จะตอ้ งทาการทดสอบ โปรแกรมเพ่ือหาขอ้ ผดิ พลาด (Error) ซ่ึงขอ้ ผิดพลาดที่พบในข้นั ตอนการทดสอบโปรแกรม น้นั จะตอ้ งนามาปรับปรุงแกไ้ ขโปรแกรมเพื่อใหส้ ามารถทางานไดต้ ามตอ้ งการ 5. จัดทาเอกสารประกอบ เม่ือโปรแกรมผา่ นการทดสอบแลว้ ก็จะตอ้ งจดั ทาเอกสารประกอบ ซ่ึงมีรายละเอียดของวิธีการใชง้ านโปรแกรม วิธีการติดต้งั โปรแกรม ตลอดจนข้นั ตอนใน การพฒั นาโปรแกรม รวมถึงอลั กอริทึมและโปรแกรมตน้ ฉบบั (Source code) เพือ่ ประโยชน์ ในกรณีท่ีตอ้ งการแกไ้ ขหรือปรับปรุงโปรแกรมภายหลงั 1 1ดร. ศรีไพร ศกั ด์ิรุ่งไพรศาลกลุ “หลกั การเขียนโปรแกรม” http://www.gotoknow.org/blogs/posts/269964
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 19 ข้ันตอนวธิ ี หรือ Algorithm (ภาษาไทย : อลั กอริทึม) หมายถึงกระบวนการแกป้ ัญหาท่ีสามารถ เขา้ ใจได้ มีลาดบั หรือวธิ ีการในการแกไ้ ขปัญหาใดปัญหาหน่ึงอยา่ งเป็ นข้นั เป็ นตอนและชดั เจน เมื่อนาเขา้ อะไรแล้วจะต้องได้ผลลัพธ์เช่นไร ซ่ึงแตกต่างจากการแก้ปัญหาแบบสามัญสานึกหรือฮิวริสติก (Heuristic) โดยทวั่ ไปข้นั ตอนวิธี จะประกอบดว้ ย วิธีการเป็ นข้นั ๆ และมีส่วนที่ตอ้ งทาแบบวนซ้า หรือ เวยี นเกิดโดยใชต้ รรกะ และ/หรือ ในการเปรียบเทียบในข้นั ตอนต่าง ๆ จนกระทง่ั เสร็จสิ้นการทางาน ในการทางานอยา่ งเดียวกนั เราอาจจะเลือกข้นั ตอนวธิ ีที่ต่างกนั เพ่ือแกป้ ัญหาไดโ้ ดยท่ีผลลพั ธ์ท่ีได้ ในข้นั สุดทา้ ยจะออกมาเหมือนกนั หรือไม่ก็ได้ และจะมีความแตกต่างที่จานวนและชุดคาสั่งท่ีใชต้ ่างกนั ซ่ึงส่งผลใหเ้ วลาและขนาดหน่วยความจาท่ีตอ้ งการต่างกนั หรือเรียกไดอ้ ีกอยา่ งวา่ มีความซบั ซอ้ นต่างกนั การนาข้นั ตอนวิธีไปใชไ้ ม่จากดั เฉพาะการเขียนโปรแกรมคอมพิวเตอร์ แต่สามารถนาไปใช้กบั ปัญหาอื่น ๆ ได้เช่น การออกแบบวงจรไฟฟ้า, การทางานเคร่ืองจักรกล, หรือแม้กระทง่ั ปัญหาใน ธรรมชาติ เช่น วธิ ีของสมองมนุษยใ์ นการคิดเลข หรือวธิ ีการขนอาหารของแมลง2 ผังงาน (Flowchart) คือ รูปภาพ (Image) หรือสัญลักษณ์(Symbol) ท่ีใช้เขียนแทนข้ันตอน คาอธิบาย ขอ้ ความ หรือคาพูดที่ใช้ในอลั กอริทึม (Algorithm) เพราะการนาเสนอข้นั ตอนของงานให้ เขา้ ใจตรงกนั ระหวา่ งผเู้ ก่ียวขอ้ ง ดว้ ยคาพดู หรือขอ้ ความทาไดย้ ากกวา่ 3 ผงั งานในการเขียนโปรแกรมเป็ นรูปทรงเลขาคณิต ที่บรรจุรายละเอียดกระบวนการประมวลผล โดยมีรูปทรงในการใชง้ านหลกั ๆ (เฉพาะงานไมโครคอนโทรลเลอร์) ดงั น้ี ตารางท่ี 2-1 ผงั งานหลกั ที่ใชง้ านไมโครคอนโทรลเลอร์ รูปทรง ชนิดการประมวลผล ตวั อยา่ งเส้นทาง จุดเร่ิ มต้นหรื อจุ ดสิ้ นสุ ด ของโปรแกรม กระบวนการประมวลผล การตดั สินใจ ชุ ดกระบวนการที่ เตรี ยม ไวแ้ ลว้ (โปรแกรมยอ่ ย) 2 http://www.com5dow.com 3http://158.108.203.7/student/simple/?t46.html
20 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตารางท่ี 2-1 ผงั งานหลกั ที่ใชง้ านไมโครคอนโทรลเลอร์ (ตอ่ ) รูปทรง ชนิดการประมวลผล ตวั อยา่ งเส้นทาง จุดเชื่อมในหนา้ เดียวกนั จุดเชื่อมในหนา้ อ่ืน ตวั อยา่ งการเขียนลาดบั ข้นั ข้นั ตอนวธิ ี และการแปลงเป็นผงั งาน ยกตวั อยา่ งในชีวติ ประจาวนั เพ่ือใหง้ ่ายตอ่ การจินตนาการ โจทยก์ ารทาไขเ่ จียวหมูสับ ข้นั ท่ี 1 เขียนลาดบั ข้นั (Algorithm) 1. เตรียมวสั ดุ ไข่,หมูสับ,กระทะ,เตาไฟ,น้ามนั พชื ,ถว้ ย,จาน 6. ถา้ กระทะร้อนใส่ไขล่ งไป 2. เอากระทะต้งั ไฟ (อุ่นกระทะ) 7. รอใหห้ น่ึงดา้ นสุก 3. ใส่น้ามนั พชื 8. กลบั ดา้ น 4. ตอกไข่ใส่ถว้ ยใส่หมูสับ 9. รอใหด้ า้ นที่ 2 สุก 5. ตีจนเขา้ กนั 10. ตกั ออกใส่จาน (เสร็จ) ข้นั ท่ี 2 แปลงลาดบั ข้นั เป็นผงั งาน (Flowchart) เร่ิม เตรียมวสั ดุ ไข่,หมูสับ,กระทะ... B เอากระทะต้งั ไฟ ใส่ไขล่ งกระทะ ใส่น้ามนั พชื ตอกไขใ่ ส่ถว้ ยใส่หมูสบั ดา้ น 1 สุกหรือไม่ ไมใ่ ช่ ใช่ กลบั ดา้ น ตีไข่ ไมใ่ ช่ ดา้ น 2 สุกหรือไม่ ไม่ใช่ ไม่ใช่ ใช่ เขา้ กนั หรือไม่ ตกั ใส่จาน ใช่ กระทะร้อนหรือไม่ เสร็จ ใช่ B
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 21 ตวั อยา่ งการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ตวั อยา่ งจงเขียนโปรแกรมไฟกระพริบ LED ท่ีตอ่ อยทู่ ่ีขา D13 ข้นั ท่ี 1 เขียนลาดบั ข้นั (Algorithm) ข้นั ที่ 2 แปลงลาดบั ข้นั เป็นผงั งาน (Flowchart) 1. กาหนดช่ือ LED กบั ขาท่ีเช่ือมตอ่ START 2. กาหนดโหมดของขาใชง้ าน กาหนดช่อ LED 3. เขียนลอจิก 1 ไปที่ขาเช่ือม LED 4. หน่วงเวลา เขียนลอจิก 1 ไปทขี่ า 5. เขียนลอจิก 2 ไปท่ีขาเชื่อม LED หนวงเวลา 6. หน่วงเวลา 7. กระโดดกลบั ไปทาในข้นั ตอนที่ 3 เขียนลอจกิ 0 ไปทข่ี า หนวงเวลา ข้นั ท่ี 3 แปลงผงั งานเป็นโปรแกรม #define LED 13 // turn the LED on (HIGH is the voltage level) void setup() // wait for a second { // turn the LED off by making the voltage LOW // wait for a second pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); } 2.2 ภาษาซีสาหรับไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ไม่วา่ จะเป็นตระกลู ใดก็ตามจะทางานไดก้ ็ต่อเมื่อมีชุดคาสงั่ ท่ีส่งั ใหท้ างาน ตามที่ตอ้ งการที่เรียกว่าโปรแกรม โดยคาส่ังหรือโปรแกรมท่ีไมโครคอนโทรลเลอร์เขา้ ใจและสามารถ ทางานไดอ้ ยใู่ นรูปของรหสั ลอจิก 0 และ 1 หากนาลอจิกมาจบั กลุ่มกเ็ ป็นเลขฐาน 16 ท่ีเรียกวา่ ภาษาเครื่อง ซ่ึงภาษาเครื่องเป็ นภาษาท่ีมนุษยไ์ ม่สามารถเขา้ ใจไดเ้ นื่องจากเป็ นเลขฐาน 16 ท้งั หมด ดงั น้นั ในการเขียน โปรแกรมจึงจาเป็ นตอ้ งใชภ้ าษาที่มนุษยส์ ามารถเขา้ ใจได้ โดยภาษาที่มนุษยเ์ ขา้ ใจไดแ้ ละใกล้เคียงกบั ภาษาเคร่ืองมากท่ีสุดคือภาษาแอสเซมบลีแต่เน่ืองจากการพฒั นางานโดยใชภ้ าษาแอสเซมบลีเป็ นไปได้ ยากและซับซ้อน เพื่อให้ง่ายและรวดเร็วต่อการพฒั นาโปรแกรมใช้งานไมโครคอนโทรลเลอร์ภาษาที่ เหมาะสมคือภาษาซี
22 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] โครงสร้างของภาษาซี ภาษาซีเป็ นภาษาที่ไดร้ ับความนิยมสูงเป็ นภาษาโครงสร้างง่ายต่อการทาความเขา้ ใจง่ายต่อการ นาไปพฒั นาต่อ สามารถเขียนโปรแกรมแยกเป็ นส่วน ๆ โดยแต่ละส่วนสามารถเรียกใชง้ านไดจ้ ากส่วน อื่นของโปรแกรมทาให้สามารถแบ่งงานให้หลายคนไปพฒั นาได้ การเขียนโปรแกรมเป็ นส่วน ๆ เรียกวา่ ฟังก์ช่ัน โครงสร้างของภาษาซีมีส่วนประกอบ 2 ส่วนคือ ส่วนหัวโปรแกรมและส่วนตวั โปรแกรม ส่วนตวั โปรแกรมจะมีฟังกช์ นั่ หลกั ชื่อวา่ main( ) เพ่ือเป็ นส่วนหลกั ในการทางาน และอาจมีฟังก์ชน่ั อ่ืนท่ี ผใู้ ชเ้ ขียนข้ึนเพอ่ื ใชง้ านเรียกวา่ ฟังกช์ น่ั รอง หวั โปรแกรม ตวั โปรแกรม ฟังกช์ นั่ หลกั main( ) ฟังกช์ น่ั รองที่เขียนเพิม่ ข้ึน รูปที่ 2-1 โครงสร้างภาษาซี โครงสร้างของภาษาซีสาหรับ Arduino โครงสร้างภาษาซีสาหรับ Arduino ถูกจดั ใหม่ใหง้ ่ายต่อผใู้ ชง้ านเบ้ืองตน้ ซ่ึงผอู้ อกแบบไดจ้ ดั วาง ใหผ้ ใู้ ชง้ านไดใ้ ชง้ านง่ายซ่ึงโครงสร้างหลกั ๆ จะมีเพยี ง 2 ส่วนเท่าน้นั คือ 1. setup เป็ นส่วนที่เกบ็ ฟังกช์ น่ั ที่ทางานคร้ังเดียว 2. loop เป็นส่วนท่ีเกบ็ ฟังกช์ น่ั ที่เมื่อทางานครบแลว้ จะวนกลบั มาทาซ้าใหม่ต้งั แต่ตน้ แต่ถา้ ตอ้ งการเขียนโปรแกรมข้นั สูงสามารถเขียนในส่วนหวั โปรแกรมและส่วนของฟังกช์ น่ั รอง ที่เขียนข้ึนใชง้ านเองเพอื่ ใหใ้ ชง้ านสะดวกมากยงิ่ ข้ึนไดเ้ ช่นเดียวกบั ภาษาซีมาตรฐาน หวั โปรแกรม ตวั โปรแกรม ตวั โปรแกรม ฟังกช์ นั่ ท่ีทางานคร้ังเดียว setup( ) ฟังกช์ น่ั ที่ทางานคร้ังเดียว setup( ) ฟังกช์ นั่ ที่เวยี นกลบั ทางานวนซ้า loop( ) ฟังกช์ นั่ ที่เวยี นกลบั ทางานวนซ้า loop( ) ฟังกช์ นั่ รองท่ีเขียนข้ึนเอง (พ้นื ฐาน) (ข้นั สูง) รูปที่ 2-2 โครงสร้างภาษาซีสาหรับ Arduino
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 23 ตวั อยางโปรแกรมทเี่ ขียนด้วยโครงสร้างแบบพน้ ฐาน void setup() ฟังกช์ น่ั ท่ีทางานคร้ังเดียว setup( ) { ฟังกช์ นั่ ที่เวยี นกลบั ทางานวนซ้า loop( ) Serial.begin(9600); pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); } void loop() { digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); delay(200); digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,LOW); digitalWrite(5,LOW); delay(200); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,HIGH); digitalWrite(5,LOW); delay(200); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); delay(200); } ตัวอยางโปรแกรมทเี่ ขียนด้วยโครงสร้างแบบข้ันสูง (ทใ่ี ห้ผลแบบเดยี วกบั ข้ันพน้ ฐาน) #define LED1 2 #define LED2 3 #define LED3 4 หวั โปรแกรม #define LED4 5 char LED_pin[] = {LED1,LED2,LED3,LED4}; void send2port(byte data); void setup() { Serial.begin(9600); for(char i=0;i<4;i++) ฟังกช์ นั่ ท่ีทางานคร้ังเดียว setup( ) { pinMode(LED_pin[i],OUTPUT); } } void loop() { send2port(0B1000);delay(200); ฟังกช์ น่ั ที่เวยี นกลบั ทางานวนซ้า loop( ) send2port(0B0100);delay(200); send2port(0B0010);delay(200); send2port(0B0001);delay(200); } ฟังกช์ น่ั รองท่ีเขียนข้ึนเอง void send2port(byte data) { if (data & 1 ){digitalWrite(LED_pin[0],HIGH);} else {digitalWrite(LED_pin[0],LOW);} if (data & 2 ){digitalWrite(LED_pin[1],HIGH);} else {digitalWrite(LED_pin[1],LOW);} if (data & 4 ){digitalWrite(LED_pin[2],HIGH);} else {digitalWrite(LED_pin[2],LOW);} if (data & 8 ){digitalWrite(LED_pin[3],HIGH);} else {digitalWrite(LED_pin[3],LOW);} }
24 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตวั แปรในภาษาซี การประกาศตวั แปรคือการจองพ้ืนที่ในหน่วยความจาเพื่อนาไปใชง้ านในฟังก์ชนั่ โดยการใชช้ ื่อ ตวั แปรแทนการกาหนดเป็นค่าแอดเดรสของหน่วยความจา รูปแบบของการประกาศตวั แปรเป็นดงั น้ี ชนิดของตวั แปร ช่ือตวั แปร; หรือ ชนิดของตวั แปร ช่ือตวั แปรท่ี1,ชื่อตวั แปรที่ 2,… ; หลกั การต้งั ช่ือตวั แปรในภาษาซี หลกั การต้งั ชื่อตวั แปรมีขอ้ กาหนดหลกั ๆ อยู่ 4 ประการดว้ ยกนั คือ 1. ช่ือที่ต้งั ตอ้ งไมซ่ ้ากบั คาสงวนของภาษาซี (คาท่ีภาษาซีมีใชง้ านอยแู่ ลว้ ) 2. การใชต้ วั อกั ษรใหญก่ บั ตวั อกั ษรเลก็ ถือวา่ เป็นคนละตวั 3. ตวั แรกของช่ือตวั แปรตอ้ งเป็ นตวั อกั ษรเท่าน้นั ตวั ถดั ไปเป็ นตวั เลขได้ 4. ชื่อตวั แปรหา้ มเวน้ วรรค ชนิดของตวั แปรในภาษาซีสาหรับไมโครคอนโทรลเลอร์ Arduino ตารางที่ 2-2 ชนิดของตวั แปรในภาษาซีสาหรับไมโครคอนโทรลเลอร์ Arduino ชนิด ขนาด ขอบเขต บิต ไบต์ boolean 8 1 true, false char 8 1 -128 ถึง +127 unsigned char 8 1 0 ถึง 255 byte 8 1 0 ถึง 255 int 16 2 -32768 ถึง +32767 unsigned int 16 2 0 ถึง 65535 long 32 4 -2147483648 ถึง +2147483647 unsigned long 32 4 0 ถึง 4294967295 float 32 4 ±3.4E±38 (~7 digits) double 64 8 ±1.7E±308 (~15 digits)
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 25 พอยนเ์ ตอร์ พอยนเ์ ตอร์เป็นตวั ช้ีตาแหน่งขอ้ มูลของตวั แปรอ่ืนที่เก็บในหน่วยความจา โดยตวั พอยนเ์ ตอร์เป็ น ตวั เก็บตาแหน่งแทนการเก็บข้อมูล ในการใช้งานพอยน์เตอร์จะใช้เครื่องหมาย * นาหน้าและใช้ เคร่ืองหมาย & เมื่อตอ้ งการค่าตาแหน่งของตวั แปรอ่ืนโดยมีรูปแบบดงั น้ี รูปแบบ ชนิดของตวั แปร * ช่ือตวั แปร; ตัวอยาง int *n; int i; i=10; n=&i; อาร์เรย์ อาร์เรยเ์ ป็ นการเพ่ิมความสามารถในการเก็บขอ้ มูลของตวั แปรให้สามารถเก็บเป็ นชุดได้ โดยใช้ ชื่อตวั แปรเดิมได้ การใชง้ านตวั แปรอาร์เรยจ์ ะใช้เครื่องหมาย [ ] ต่อทา้ ยตวั แปรโดยภายในวงเล็บเป็ น ตวั เลข ซ่ึงสามารถใชง้ านไดห้ ลายมิติ มีรูปแบบดงั น้ี รูปแบบ ชนิดของตวั แปร ชื่อตวั แปร[ตวั เลข]; // เป็ นอาร์เรย์ 1 มิติ ชนิดของตวั แปร ช่ือตวั แปร[ตวั เลข,ตวั เลข]; // เป็ นอาร์เรย์ 2 มิติ ชนิดของตวั แปร ชื่อตวั แปร[ตวั เลข,ตวั เลข,ตวั เลข]; // เป็ นอาร์เรย์ 3 มิติ ตัวอยางอาร์เรย์ 1 มิติ x[0] x[1] x[2] x[3] int x[4]; x[0,0] x[0,1] x[0,2] ตวั อยางอาร์เรย์ 2 มติ ิ x[1,0] x[1,1] x[1,2] int x[3,3]; x[2,0] x[2,1] x[2,2] ตัวอยางอาร์เรย์ 3 มติ ิ x[0,x0[0,,00] ,1x][0,x1[0,,01] ,1x][0,x2[0,,02] ,1] int x[3,3,2]; x[1,x0[1,,00] ,0x][1,x1[1,,01] ,0x][1,x2[1,,02] ,1] x[2,x0[2,,00] ,0x][2,x1[2,,01] ,0x][2,x2[2,,02] ,1]
26 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตวั ดาเนินการในภาษาซี ตวั ดาเนินการในภาษาซีแบง่ ตามลกั ษณะการกระทาได้ 5 กลุ่มดว้ ยกนั คือ 1. ตวั กระทาทางคณิตศาสตร์ 2. ตวั กระทาทางลอจิกระดบั บิต 3. ตวั กระทาบูลีน 4. ตวั กระทาเปรียบเทียบ 5. ตวั กระทาประสม โดยในแตล่ ะลกั ษณะมีรายละเอียดดงั ต่อไปน้ี ตารางท่ี 2-3 ตวั กระทาทางคณิตศาสตร์ เคร่ืองหมาย การกระทา ตวั อยา่ ง คาอธิบาย x เท่ากบั ค่าในตวั แปร y บวกกบั ค่าในตวั แปร z + บวก x=y+z; x เท่ากบั คา่ ในตวั แปร y ลบดว้ ยคา่ ในตวั แปร z x เท่ากบั คา่ ในตวั แปร y คูณดว้ ยคา่ ในตวั แปร z - ลบ x=y-z; x เทา่ กบั ค่าในตวั แปร y หารดว้ ยค่าในตวั แปร z x เทา่ กบั เศษของการหารระหวา่ งตวั แปร y กบั ตวั แปร z * คูณ x=y*z; / หาร x=y/z; % หารเอาเศษ x=y%z; ตารางที่ 2-4 ตวั กระทาทางลอจิก ตวั อยา่ ง คาอธิบาย เครื่องหมาย การกระทา x=y&z; x เท่ากบั คา่ ในตวั แปร y แอนดก์ บั คา่ ในตวั แปร z & แอนด์ x=y|z; x เท่ากบั ค่าในตวั แปร y ออร์กบั คา่ ในตวั แปร z | ออร์ x=y^z; x เท่ากบั คา่ ในตวั แปร y เอก็ ซ์คลูซิฟออร์กบั z ^ เอก็ ซ์คลูซิฟออร์ x=~y; x เท่ากบั คา่ ตรงขา้ มของคา่ ในตวั แปร y ~ วนั คอมพลีเมนต์ x=x<<1; เล่ือนขอ้ มูลใน x ไปทางซา้ ยไป 1 บิต << เล่ือนไปทางซา้ ย x=x>>2; เล่ือนขอ้ มูลใน x ไปทางขวาไป 2 บิต >> เล่ือนไปทางขวา ตารางท่ี 2-5 ตวั กระทาบูลีน เคร่ืองหมาย การกระทา คาอธิบาย && แอนด์ เช่ือมเงื่อนไข 2 เงื่อนไขดว้ ยคาว่า “และ” || ออร์ เชื่อมเงื่อนไข 2 เงื่อนไขดว้ ยคาว่า “หรือ” ! อินเวริ ์ส ใชต้ รวจสอบตวั แปรว่าเท่ากบั ศูนยห์ รือไม่เช่น if (!x)
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 27 ตารางท่ี 2-6 ตวั กระทาการเปรียบเทียบ เคร่ืองหมาย การกระทา ตวั อยา่ ง คาอธิบาย x มากกวา่ 10 > มากกว่า x>10 x นอ้ ยกว่า 10 x มากกวา่ หรือเท่ากบั 10 < นอ้ ยกว่า x<10 x นอ้ ยกว่าหรือเท่ากบั 10 x เท่ากบั 10 >= มากกวา่ หรือเท่ากบั x>=10 x ไม่เท่ากบั 10 <= นอ้ ยกวา่ หรือเท่ากบั x<=10 = = เท่ากบั x= =10 != ไม่เท่ากบั x!=10 ตารางที่ 2-7 ตวั กระทาประสม ตวั อยา่ ง คาอธิบาย เคร่ืองหมาย การกระทา x++; เพ่ิมค่า x ข้ึน 1 ค่า ++ เพิ่มค่า 1 ค่า x--; ลดค่า x ลง 1 ค่า -- ลดค่า 1 ค่า x+=2; x ใหมเ่ ท่ากบั x เดิมบวกกบั 2 += บวก x-=2; x ใหม่เท่ากบั x เดิมลบดว้ ย 2 -= ลบ x*=2; x ใหม่เท่ากบั x เดิมคูณดว้ ย 2 *= คูณ x/=2; x ใหม่เท่ากบั x เดิมหารดว้ ย 2 /= หาร x%=2; x ใหมเ่ ท่ากบั x เดิมหารดว้ ย 2 แลว้ เอาเศษ %= หารเอาเศษ x&=2; x ใหมเ่ ท่ากบั x เดิมแอนดด์ ว้ ย 2 &= แอนด์ x|=2; x ใหมเ่ ท่ากบั x เดิมออร์ดว้ ย 2 |= ออร์ ไวยากรณ์ภาษาซี 1. ประกาศช่อแทน เป็ นการประกาศใช้ชื่ออ่ืนแทนค่าที่ต้องการเพ่ือให้สะดวกต่อการเขียน โปรแกรม รูปแบบเป็นดงั น้ี #define constantName value constantName: ช่ือที่ตอ้ งการกาหนดต้งั value: ค่าท่ีตอ้ งการกาหนดใหช้ ่ือน้นั มีคา่ เท่ากบั ตัวอยาง #define LED 13 หมายถึง กาหนดใหค้ าวา่ LED มีค่าเทา่ กบั 13
28 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. การรวมไฟล์อ่นเข้ามารวม เป็ นการประกาศไฟล์อ่ืน ๆ เขา้ มารวมกบั ตวั โปรแกรมก่อนการ คอมไพล์ รูปแบบเป็นดงั น้ี #include <file> #include \"file\" file: ช่ือไฟลท์ ี่ตอ้ งการนาเขา้ มารวมกบั โคด้ โปรแกรมที่กาลงั เขียนข้ึน ตวั อยาง #include <SPI.h> หมายถึง ใหโ้ ปรแกรมคอมไพลเลอร์ทาการรวมไฟลท์ ี่ช่ือ SPI.h ก่อนทาการคอมไพล์ 3. การใสหมายเหตุลงในโค้ดโปรแกรม เป็ นการใส่ขอ้ ความใด ๆ ลงในโคด้ โปรแกรมเพ่ือท่ีจะ อธิบายโปรแกรมหรือเพ่ือบนั ทึกความจาวา่ โคด้ ในตาแหน่งน้นั ๆ เขียนข้ึนเพ่ือประสงคส์ ่ิง ใด การใส่หมายเหตุจะตอ้ งใส่เครื่องหมายเพื่อให้คอมไพล์เลอร์ขา้ มการคอมไพล์ในส่วนน้ี รูปแบบเป็นดงั น้ี //................ ใช้ในกรณบี รรทดั เดียว /*..............*/ ใช้ในกรณหี ลายบรรทดั 4. การใสเคร่องหมายท้ายฟังก์ชั่น ภาษาซีเป็ นภาษาท่ีมีการใส่เครื่องหมายทา้ ยฟังก์ชนั่ ซ่ึง เป็นส่ิงที่แตกต่างและโดดเด่นกวา่ โปรแกรมในภาษาอื่น ๆ โดยมีหลกั คิดดงั น้ี ; สาหรับฟังก์ชั่นทท่ี างานเสร็จสิ้นในตวั { } สาหรับฟังก์ชั่นทมี่ ฟี ังก์ชั่นอ่นรวมเข้าไปด้วย ฟังก์ช่ันการดาเนินการแบบทางเลอก ในการเขียนโปรแกรมเพือ่ ใหไ้ มโครคอนโทรลเลอร์ทางานในส่ิงที่ตอ้ งการ นอกจากฟังกช์ นั่ ที่สง่ั ใหท้ างานเป็ นลาดบั แลว้ จาเป็ นตอ้ งใช้ฟังกช์ น่ั ท่ีมีการทางานแบบให้เลือกเส้นทางการทางาน โดยการทา ตามเงื่อนไข หรือการให้ทาซ้าแบบมีเงื่อนไขหรือไม่มีเงื่อนไข โดยฟังกช์ นั่ ที่มีการทางานแบบทางเลือก ในภาษาซีมีดว้ ยกนั 4 ฟังกช์ นั่ คือ
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 29 1. ฟังกช์ นั่ if 2. ฟังกช์ น่ั if-else 3. ฟังกช์ น่ั if-else if-else 4. ฟังกช์ น่ั switch ฟังกช์ นั่ if (ทางเลือกเดียว) ฟังกช์ นั่ if เป็นฟังกช์ นั่ ท่ีมีการตรวจสอบเง่ือนไข โดยถา้ เงื่อนไขเป็นจริงจะทางานตามชุดฟังกช์ น่ั ที่กาหนดไว้ รูปแบบเป็นดงั น้ี if (เง่อนไขทต่ี รวจสอบ) ผงั งาน โค้ดโปรแกรม เง่อนไข ไมใ่ ช่ if (conditional) { ใช่ ชุดฟังกช์ ัน่ เมอ่ เง่อนไข // put your code here // if conditional true เป็ นจริง } Example: if (value<50) { digitalWrite(13,HIGH); } *หากชุดฟังกช์ นั่ ท่ีใหท้ างานเม่ือเง่ือนไขเป็นจริงมีเพียงฟังกช์ นั่ เดียว ไม่ตอ้ งใส่วงเลบ็ ปี กกา {…} กไ็ ด้ ฟังกช์ นั่ if-else (สองทางเลือก) การตรวจสอบเงื่อนไขท่ีมีชุดฟังก์ชน่ั ให้ทางานเม่ือเง่ือนไขเป็ นจริงและมีชุดฟังก์ชนั่ ให้ทางาน เม่ือเง่ือนไขเป็นเทจ็ เราจะใชฟ้ ังกช์ น่ั if-else มาใชง้ าน มีรูปแบบดงั น้ี if (เง่อนไขทต่ี รวจสอบ) else ผงั งาน โค้ดโปรแกรม ใช่ เง่อนไข ไมใ่ ช่ if (conditional) { ชุดฟงั กช์ ั่นเม่อ ชุดฟังกช์ ั่นเม่อ เง่อนไขเป็ นจริง เง่อนไขเป็ นเทจ็ // put main code here // if conditional true } else { //put main code here //if conditional false }
30 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ฟังกช์ นั่ if-else if....else (หลายทางเลือก) เป็นฟังกช์ นั่ ที่มีการตรวจสอบเง่ือนไขหลายเง่ือนไข และมีชุดฟังกช์ นั่ ที่เตรียมใหท้ างานในแต่ละ เงื่อนไขหากเงื่อนไขน้นั ๆ ถูกตอ้ ง if (เง่อนไขทตี่ รวจสอบ) else if (เง่อนไขทตี่ รวจสอบ) ผงั งาน โค้ดโปรแกรม เง่อนไขที่ 1 ใช่ ชุดฟงั ก์ชั่นเม่อ if (conditional1) ไม่ใช่ ใช่ เง่อนไข 1 เป็ นจริง { เง่อนไขท่ี 2 ชุดฟงั กช์ ัน่ เมอ่ // put main code here ไม่ใช่ เง่อนไข 2 เป็ นจริง // if conditional1 true } else if (conditional2) { //put main code here //if conditional2 true } ฟังกช์ นั่ switch...case (หลายทางเลือก) ฟังกช์ นั่ switch…case เป็ นฟังก์ชน่ั หลายทางเลือกอีกฟังกช์ น่ั หน่ึงท่ีมีการทางานคลา้ ย ๆ ฟังกช์ นั่ if-else if…else ตา่ งตรงท่ีการตรวจสอบเงื่อนไขจะใชก้ ารตรวจสอบการเทา่ กนั ของตวั แปรที่ใชต้ รวจสอบ เทา่ น้นั โดยเมื่อตรวจสอบคา่ แลว้ เทา่ กบั คา่ ท่ีกาหนดใหท้ าฟังกช์ นั่ ท่ีเตรียมไว้ ผงั งาน โค้ดโปรแกรม ตัวแปรทใี่ ช้ตรวจสอบ switch (variable) { เทากับคาท่ี 1 จริง ชุดฟังกช์ ั่นเม่อ คาตัวแปรตรงกบั คาท่ี 1 case 1: เทจ็ // put code here for case 1 เทากบั คาท่ี 2 จริง ชุดฟงั กช์ ัน่ เมอ่ คาตัวแปรตรงกบั คาที่ 2 break; เทจ็ case 2: // put code here for case 2 break; default: // put code here for default break; } ชุดฟังก์ชั่นทตี่ วั แปร ตรวจสอบไมตรงกับคาใด
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 31 ฟังก์ช่ันการดาเนินการแบบวนซา้ การเขียนโปรแกรมส่ังงานไมโครคอนโทรลเลอร์ ตอ้ งมีการทางานแบบวนซ้าหรือวนรอบ เพื่อท่ีจะทางานในชุดคาสั่งเดิม ลกั ษณะการทางานมีท้งั แบบมีเง่ือนไขหรือไม่มีเงื่อนไข ในภาษาซีมี ฟังกช์ นั่ ส่งั งานใหไ้ มโครคอนโทรลเลอร์ทางานซ้ามีดงั น้ี 1. ฟังกช์ น่ั for 2. ฟังกช์ น่ั while 3. ฟังกช์ นั่ while(1) 4. ฟังกช์ น่ั do-while ฟังกช์ นั่ for ฟังกช์ นั่ for เป็นฟังกช์ นั่ ที่ใชใ้ นกรณีที่ทราบจานวนรอบท่ีจะทางานซ้า โดยมีรูปแบบดงั น้ี รูปแบบ ผงั งาน for(คา่ เร่ิมตน้ ;เง่ือนไข;เพิม่ หรือลดค่า ) { คาตัวแปรนับรอบเร่มิ ต้น //ชุดฟังกช์ นั่ ท่ีตอ้ งการทาซ้า เง่อนไข เท็จ } จริง ชุดฟงั กช์ ั่นที่ต้องการ ทางานวนซ้า เพมิ่ /ลดตัวแปรนับรอบ ตัวอยาง คาอธิบาย โค้ดโปรแกรม ประกาศและกาหนดตวั แปรนบั รอบเป็นตวั แปร i เป็นตวั แปรชนิด integer โดยใหม้ ีคา่ เริ่มตน้ เท่ากบั ศูนย์ ทาวนซ้า for(int i=0;i<10;i++) ไปเร่ือย ๆ หากคา่ ตวั แปรยงั นอ้ ยกวา่ 10 โดยในรอบถดั ไป { ใหเ้ พิม่ ค่าในตวั แปรนบั รอบข้ึน 1 ค่า digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500); }
32 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ฟังกช์ นั่ while ฟังกช์ น่ั while เป็นฟังกช์ นั่ ที่ใหท้ างานวนซ้าหรือวนรอบโดยมีการตรวจสอบเง่ือนไขก่อนถา้ หาก เงื่อนไขเป็ นจริงจะทางานตามชุดฟังกช์ น่ั ท่ีเตรียมไว้ เมื่อทางานในชุดฟังกช์ นั่ ท่ีเตรียมไวเ้ สร็จจะมีการวน กลบั ไปตรวจสอบเงื่อนไขอีก หากเง่ือนไขเป็ นจริงจะทางานในชุดฟังก์ชน่ั ที่เตรียมไวโ้ ดยทาแบบน้ีไป เรื่อย ๆ จนกวา่ เง่ือนไขจะเป็นเทจ็ จะออกจากวงรอบการทาซ้า โดยมีรูปแบบดงั น้ี รูปแบบ ผงั งาน while(เง่ือนไข ) { เง่อนไข เทจ็ //ชุดฟังกช์ น่ั ที่ตอ้ งการทาซ้า จริง } ชุดฟังกช์ ั่นทต่ี ้องการ ทางานวนซ้า ตัวอยาง คาอธิบาย โค้ดโปรแกรม ตรวจสอบก่อนว่าเงื่อนไขเป็ นจริงอยู่หรือไม่ ( i ยงั น้อย กว่า 10 ) หากเง่ือนไขเป็ นจริงให้ทางานท่ีเตรียมไว้ เมื่อ i=0; ทางานครบให้กลบั มาตรวจสอบเง่ือนไขใหม่วนซ้าไป while(i<10) เร่ือย ๆ จนกวา่ เงื่อนไขจะเป็นเทจ็ { digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500); i++; } ฟังกช์ นั่ while(1) ฟังกช์ นั่ while เป็นฟังกช์ น่ั ท่ีใหท้ างานวนซ้าหรือวนรอบไมร่ ู้จบ เนื่องจาก 1 คือเป็ นจริงตลอดไป ในโปรแกรม Arduino ก็คือฟังกช์ นั่ loop( ) นน่ั เอง รูปแบบ ผงั งาน while(1) { ชุดฟงั ก์ชัน่ ทีต่ ้องการ //ชุดฟังกช์ น่ั ที่ตอ้ งการทาซ้า ทางานวนซ้า }
บทท่ี 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 33 ฟังกช์ นั่ do-while ฟังก์ชน่ั do-while เป็ นฟังก์ชนั่ ท่ีให้ทางานวนซ้าหรือวนรอบ โดยมีการตรวจสอบเง่ือนไขการ ทางานคลา้ ยกบั ฟังก์ชนั่ while ต่างตรงที่ฟังก์ช่นั do-while จะทางานในชุดฟังก์ชนั่ ท่ีเตรียมไวท้ าซ้าไป ก่อน 1 รอบแลว้ จึงตรวจสอบเง่ือนไข รูปแบบ ผงั งาน do { ชุดฟังก์ชัน่ ที่ต้องการ //ชุดฟังกช์ น่ั ที่ตอ้ งการทาซ้า ทางานวนซ้า } while(เง่ือนไข ) เง่อนไข เทจ็ จริง ตัวอยาง คาอธิบาย โค้ดโปรแกรม ทางานในฟังก์ชนั่ ท่ีเตรียมไว้ แลว้ ตรวจสอบเงื่อนไขวา่ ตวั แปร i ยงั มีค่าน้อยกว่า 10 หรือไม่หากยงั น้อยกว่าให้วน i=0; กลบั ไปทาใหมซ่ ้า ๆ จนกวา่ เง่ือนไขจะเป็นเทจ็ do { digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500); i++; } while(i<10) 2.3 การสร้างฟังก์ชั่นรองขนึ้ ใช้เอง ฟังก์ชนั่ ต่าง ๆ ที่ได้กล่าวมาแล้วเป็ นฟังก์ชั่นท่ีภาษาซีมีให้ใช้งาน แต่ถ้าหากผูใ้ ช้งานตอ้ งการ ฟังกช์ นั่ ที่มีการทางานตามลกั ษณะเฉพาะส่วนอยา่ งใดอยา่ งหน่ึงที่มีการเรียกใชง้ านซ้า ๆ หรือเพื่อแยกงาน ให้เป็ นส่วน ๆ ให้ง่ายต่อการเขียนโปรแกรมสามารถเขียนข้ึนเพื่อใช้งานเองได้ การจดั วางตาแหน่งของ ฟังกช์ น่ั รองสามารถทาไดส้ องแบบคือ 1. วางกอนฟังก์ช่ันทเี่ รียกใช้งาน ตาแหน่งการวางลกั ษณะในน้ีไม่ตอ้ งประกาศรูปแบบของฟังกช์ น่ั (Prototype) ซ่ึงจะต้องวางฟังก์ช่ันรองต่อจากหัวโปรแกรมและก่อนฟังก์ชั่น setup การวาง ลกั ษณะน้ีมีขอ้ ดีตรงท่ีไม่ตอ้ งเขียนประกาศรูปแบบ แต่จะทาให้ฟังก์ชัน่ ที่ใช้งานหลกั (setup, loop) ถูกดนั ลงไปทา้ ย ๆ โปรแกรมซ่ึงหากมีฟังก์ชนั่ รองหลาย ๆ ฟังกช์ น่ั ย่งิ ถูกดนั ไปล่าง ๆ ของ โปรแกรมมากข้ึน หากโปรแกรมมีฟังก์ช่ันรองหลายสิบหลายร้อยบรรทดั จะส่งผลให้หา โปรแกรมหลกั เพ่อื เขียนโปรแกรมยากข้ึนการแกไ้ ขโปรแกรมก็จะยากข้ึนตาม
34 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. วางหลังฟังก์ชั่นท่ีเรียกใช้งาน ตาแหน่งการวางลกั ษณะน้ีจะตอ้ งประกาศรูปแบบของฟังก์ชน่ั (Prototype) ซ่ึงจะตอ้ งมีเคร่ืองหมาย ; ปิ ดทา้ ยดว้ ย โดยประกาศไวใ้ นทา้ ยของส่วนหวั โปรแกรม การวางลกั ษณะน้ีมีขอ้ ดีตรงท่ีฟังกช์ นั่ หลกั (setup, loop) ยงั อยตู่ อนบนของโปรแกรมตลอดไม่วา่ จะมีฟังกช์ นั่ รองก่ีฟังกช์ น่ั ก็ตามทาใหก้ ารตรวจสอบแกไ้ ขปรับปรุงในคร้ังหลงั ทาไดส้ ะดวก หวั โปรแกรม หวั โปรแกรม ประกาศรูปแบบฟังกช์ น่ั รอง ตวั โปรแกรม ตวั โปรแกรม ฟังกช์ นั่ รอง ฟังกช์ นั่ ที่ setup( ) ฟังกช์ น่ั loop( ) ฟังกช์ นั่ ท่ี setup( ) ฟังกช์ น่ั loop( ) ฟังกช์ น่ั รอง (วางก่อนฟังกช์ น่ั ท่ีเรียกใชง้ าน) (วางหลงั ฟังกช์ น่ั ที่เรียกใชง้ าน) รูปท่ี 2-3 โครงสร้างการจดั วางฟังกช์ นั่ รองในภาษาซี วางกอนฟังก์ชั่นทีเ่ รียกใช้งาน วางหลงั ฟังก์ช่ันทเี่ รียกใช้งาน #define LED1 2 #define LED1 2 #define LED2 3 #define LED2 3 #define LED3 4 #define LED3 4 void pattern1(void) void pattern1(void); { void pattern2(void); void pattern3(void); digitalWrite(LED1,HIGH); void setup() digitalWrite(LED2,LOW); { digitalWrite(LED3,LOW); } pinMode(LED1,OUTPUT); void pattern2(void) pinMode(LED2,OUTPUT); { pinMode(LED3,OUTPUT); digitalWrite(LED1,LOW); } digitalWrite(LED2,HIGH); void loop() digitalWrite(LED3,LOW); { } pattern1(); delay(200); void pattern3(void) pattern2(); delay(200); { pattern3(); delay(200); digitalWrite(LED1,LOW); } digitalWrite(LED2,LOW); void pattern1(void){ digitalWrite(LED3,HIGH); digitalWrite(LED1,HIGH); } digitalWrite(LED2,LOW); void setup() digitalWrite(LED3,LOW); { } pinMode(LED1,OUTPUT); void pattern2(void){ pinMode(LED2,OUTPUT); digitalWrite(LED1,LOW); pinMode(LED3,OUTPUT); digitalWrite(LED2,HIGH); } digitalWrite(LED3,LOW); void loop() } { void pattern3(void){ pattern1(); delay(200); digitalWrite(LED1,LOW); pattern2(); delay(200); digitalWrite(LED2,LOW); pattern3(); delay(200); digitalWrite(LED3,HIGH); } }
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 35 ฟังกช์ น่ั รองท่ีเขียนข้ึนใชเ้ องมีดว้ ยกนั 4 ประเภทคือ - ฟังกช์ น่ั ที่ไม่รับคา่ และไมส่ ่งคืนคา่ - ฟังกช์ นั่ ท่ีรับคา่ แตไ่ ม่ส่งคืนค่า - ฟังกช์ นั่ ท่ีไม่รับคา่ แต่ส่งคืนค่า - ฟังกช์ นั่ ที่รับคา่ และส่งคืนค่า ฟังกช์ นั่ ท่ีไม่รับค่าและไม่ส่งคืนค่า เป็ นฟังก์ชน่ั รองท่ีเขียนข้ึนโดยการรวมชุดฟังกช์ น่ั เพื่อให้ทางานอยา่ งหน่ึงอยา่ งใดเป็ นอิสระจาก ฟังกช์ นั่ หลกั ไม่มีการรับค่าใด ๆ จากฟังก์ชนั่ หลกั เพื่อนาใชง้ านในตวั ของฟังกช์ นั่ รอง และไม่มีการส่งคา่ ใด ๆ กลบั มายงั ฟังกช์ น่ั หลกั ท่ีเป็ นผูเ้ รียกใชง้ าน ซ่ึงขอ้ กาหนดในการประกาศใชข้ องฟังกช์ น่ั ประเภทน้ีมี ดงั น้ี 1. ขอ้ กาหนดในการไมรับคา ทาโดยใส่ (void) หลงั ช่ือฟังกช์ นั่ 2. ขอ้ กาหนดในการไมสงคนคา ทาโดยใส่ void หนา้ ช่ือฟังกช์ นั่ ตวั อยา่ งโปรแกรมท่ีมีฟังกช์ นั่ รองที่ไม่รับค่าและไมส่ ่งคืนค่า void pattern1(void); 1 #define LED1 2 2 #define LED2 3 3 #define LED3 4 4 void pattern1(void); 5 void pattern2(void); 6 void pattern3(void); 7 void setup() 8{ 9 pinMode(LED1,OUTPUT); 10 pinMode(LED2,OUTPUT); 11 pinMode(LED3,OUTPUT); 12 } 13 void loop() 14 { 15 pattern1(); delay(200); 16 pattern2(); delay(200); 17 pattern3(); delay(200); 18 } 19 void pattern1(void) 20 { 21 digitalWrite(LED1,HIGH); 22 digitalWrite(LED2,LOW); 23 digitalWrite(LED3,LOW); 24 } 25 void pattern2(void) 26 { 27 digitalWrite(LED1,LOW); 28 digitalWrite(LED2,HIGH); 29 digitalWrite(LED3,LOW); 30 } 31 void pattern3(void) 32 { 33 digitalWrite(LED1,LOW); 34 digitalWrite(LED2,LOW); 35 digitalWrite(LED3,HIGH); 36 }
36 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 4, 5, 6 เป็นการประกาศรูปแบบของฟังกช์ น่ั รองท่ีจะเขียนข้ึนใชง้ าน (มี ; ปิ ดทา้ ย) และ เป็นฟังกช์ นั่ ท่ีไมร่ ับค่าและไมส่ ่งคืนค่า (มี void หนา้ ฟังกช์ น่ั และหลงั ฟังกช์ น่ั ) - บรรทดั ที่ 14, 15, 16 เป็ นการเรียกใช้งานโดยการชื่อฟังกช์ น่ั ท่ีตอ้ งการตามดว้ ย ( ) ที่ภายในวา่ ง เปล่าเน่ืองจากไม่มีการส่งคา่ เขา้ ในฟังกช์ นั่ - บรรทดั ท่ี 19-24 เป็นฟังกช์ นั่ รองฟังกช์ น่ั แรกที่เขียนข้ึนใชง้ านโดยภายในบรรจุฟังกช์ นั่ ที่ตอ้ งการ ใหท้ างานเม่ือมีการเรียกใช้ - บรรทดั ท่ี 25-30, บรรทดั ที่ 25-30, บรรทดั ที่ 31-36 เป็นฟังกช์ นั่ รองถดั ๆ มาที่เขียนข้ึนใชง้ าน ฟังกช์ นั่ ท่ีรับค่าแต่ไม่ส่งคืนค่า เป็ นฟังกช์ น่ั ที่เขียนข้ึนเพื่อแบ่งยอ่ ยการทางานของฟังกช์ นั่ หลกั โดยมีการส่งค่าจากฟังกช์ น่ั หลกั ในข้นั ตอนการเรียกใชฟ้ ังกช์ น่ั รองเพื่อใหฟ้ ังกช์ น่ั รองที่เขียนข้ึนนาไปประมวลผลอยา่ งใดอยา่ งหน่ึงตามที่ ผสู้ ร้างฟังกช์ นั่ ตอ้ งการ ซ่ึงขอ้ กาหนดในการประกาศใชข้ องฟังกช์ น่ั ประเภทน้ีมีดงั น้ี 1. ขอ้ กาหนดในการรับคา ทาโดยกาหนดชนิดตวั แปร พร้อมตวั แปรที่จะรับค่าทา้ ยช่ือฟังก์ชน่ั รองท่ีสร้างข้ึน เช่น (byte data) 2. ขอ้ กาหนดในการไมสงคนคา ทาโดยใส่ void หนา้ ช่ือฟังกช์ นั่ ตวั อยา่ งโปรแกรมท่ีมีฟังกช์ น่ั รองที่รับคา่ และไม่ส่งคืนคา่ void send2port(byte data); 1 #define LED1 2 2 #define LED2 3 3 #define LED3 4 4 #define LED4 5 5 char LED_pin[] = {LED1,LED2,LED3,LED4}; 6 void send2port(byte data); 7 void setup() 8{ 9 Serial.begin(9600); 10 for(char i=0;i<4;i++) 11 { 12 pinMode(LED_pin[i],OUTPUT); 13 } 14 } 15 void loop() 16 { 17 send2port(0B1000);delay(200); 18 send2port(0B0100);delay(200); 19 send2port(0B0010);delay(200); 20 send2port(0B0001);delay(200); 21 } 22 void send2port(byte data) 23 { 24 if (data & 1 ){digitalWrite(LED_pin[0],HIGH);} else {digitalWrite(LED_pin[0],LOW);} 25 if (data & 2 ){digitalWrite(LED_pin[1],HIGH);} else {digitalWrite(LED_pin[1],LOW);} 26 if (data & 4 ){digitalWrite(LED_pin[2],HIGH);} else {digitalWrite(LED_pin[2],LOW);} 27 if (data & 8 ){digitalWrite(LED_pin[3],HIGH);} else {digitalWrite(LED_pin[3],LOW);} 28 }
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 37 รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 6 เป็ นการประกาศรูปแบบของฟังก์ช่ันรองท่ีจะเขียนข้ึนใช้งาน (มี ; ปิ ดทา้ ย) เป็ น ฟังก์ชนั่ ที่ไม่มีการส่งคืนค่า (มี void อยูห่ นา้ ฟังกช์ นั่ ) แต่เป็ นฟังก์ชนั่ ที่รับค่าเพียงอยา่ งเดียว โดย ในวงเล็บหลงั ฟังก์ชนั่ จะเป็ นตวั แปรที่ใชส้ าหรับรับค่าซ่ึงจะตอ้ งประกาศชนิดของตวั แปรพร้อม ช่ือตวั แปรสาหรับรับคา่ ไวใ้ นวงเล็บทา้ ยฟังกช์ นั่ - บรรทดั 17-20 เป็ นการเรียกใช้ฟังก์ชน่ั รองโดยการเรียกช่ือฟังก์ช่นั รองพร้อมส่งค่าเขา้ ไปใน ฟังก์ชนั่ โดยค่าที่ส่งไปจะใส่ในวงเล็บทา้ ยช่ือฟังก์ชน่ั รองที่เรียกใช้ ค่าที่ส่งไปจะเขา้ ไปเก็บไวใ้ น ตวั แปรที่ฟังก์ช่นั รองประกาศไว้ เช่น send2port(0B1000); เป็ นการเรียกใช้ฟังก์ชัน่ send2port โดยส่งค่าตวั เลข 1000 ซ่ึงเป็ นเลขฐานสองเขา้ ไปในฟังกช์ น่ั รองน้นั ดว้ ย ค่าตวั เลขดงั กล่าวจะถูก เกบ็ ไวใ้ นตวั แปร data ซ่ึงฟังกช์ นั่ รองไดเ้ ตรียมเอาไว้ - บรรทดั ที่ 20-28 เป็ นฟังกช์ นั่ รองท่ีเขียนข้ึน ภายในฟังกช์ นั่ มีการนาค่าที่ถูกส่งเขา้ มาผา่ นตวั แปร data นามาใชง้ าน ฟังกช์ นั่ ท่ีไม่รับค่าแต่ส่งคืนค่า เป็ นฟังก์ชั่นที่เขียนข้ึนเพื่อแบ่งย่อยการทางานของฟังก์ช่ันหลัก เพียงแต่ไม่ได้ส่งข้อมูลเข้า โปรแกรมเพื่อช่วยใหท้ าการประมวลผลแต่มีการส่งขอ้ มูลกลบั มายงั ฟังก์ชน่ั หลกั เช่นฟังก์ชน่ั ตรวจสอบ การกดสวิตช์ซ่ึงฟังก์ชน่ั น้ีไม่จาเป็ นตอ้ งรับขอ้ มูลใดมาประมวลผลมีเพียงตรวจสอบว่ามีการกดสวิตช์ หรือไม่แลว้ ส่งค่าการกดสวิตช์กลบั ไปยงั ฟังก์ช่ันหลกั เพ่ือนาไปใช้งานต่อไป โดยค่าท่ีส่งกลบั ผูเ้ ขียน โปรแกรมจะเป็ นผกู้ าหนดข้ึนมาเอง เช่น เม่ือสวติ ช์ 1 ถูกกดให้ส่งค่า 1 กลบั และเมื่อสวิตช์ 2 ถูกกดใหส้ ่ง ค่า 2 หากไมม่ ีการกดใด ๆ ใหส้ ่งกลบั ค่า 0 เป็นตน้ การเขียนฟังกช์ นั่ รองลกั ษณะน้ีมีขอ้ กาหนดในการประกาศใชข้ องฟังกช์ นั่ ดงั น้ี 1. ขอ้ กาหนดในการไมรับคา ทาโดยใส่ (void) หลงั ช่ือฟังกช์ น่ั 2. ขอ้ กาหนดในการสงคนคา ทาโดยใส่กาหนดชนิดของขอ้ มูลที่จะส่งคืนหนา้ ช่ือฟังกช์ น่ั รอง ท่ีสร้างข้ึน ตวั อยา่ งโปรแกรมท่ีมีฟังกช์ น่ั รองท่ีไม่รับคา่ แตส่ ่งคืนค่า byte readSW(void); 1 #define LED 2 2 #define SW1 3 3 #define SW2 4 4 byte readSW(void); 5 void setup() 6{ 7 pinMode(LED,OUTPUT); 8 pinMode(SW1,INPUT_PULLUP); 9 pinMode(SW2,INPUT_PULLUP); 10 }
38 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 11 void loop() 12 { 13 byte x=readSW(); 14 if(x==1) 15 digitalWrite(LED,HIGH); 16 else if(x==2) 17 digitalWrite(LED,LOW); 18 } 19 byte readSW(void) 20 { 21 byte Status=0; 22 if(digitalRead(SW1)==LOW) 23 Status=1; 24 else if(digitalRead(SW2)==LOW) 25 Status=2; 26 return Status; 27 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 4 เป็นการประกาศรูปแบบของฟังก์ชน่ั รอง byte readSW(void); ซ่ึงเป็นฟังกช์ นั่ ที่มีการ ส่งคา่ กลบั คืนฟังกช์ นั่ หลกั โดยคา่ ท่ีส่งกลบั มีขนาดเป็นคา่ ของตวั แปร byte - บรรทดั ท่ี 13 เป็ นการเป็ นการเรียกใชฟ้ ังกช์ นั่ รอง byte x=readSW(); เมื่อฟังก์ชน่ั รองทางานเสร็จ สิ้นจะส่งค่าเขา้ มายงั ตวั แปร x ซ่ึงเป็ นตวั แปรไดป้ ระกาศชนิดที่มีขนาดที่เพียงพอท่ีสามารถรับ ขอ้ มูลท่ีส่งกลบั มาจากฟังกช์ น่ั รองน้ีได้ - บรรทดั 19-27 เป็นฟังกช์ นั่ รองท่ีเขียนข้ึนเพอ่ื ใชง้ านที่มีการส่งคา่ คืนไปยงั ฟังกช์ นั่ หลกั - บรรทดั ท่ี 21 การประกาศตวั แปรท่ีมีชนิดเดียวกนั กบั คา่ ที่ฟังกช์ น่ั รองส่งออก - บรรทดั ท่ี 26 ฟังกช์ นั่ return เป็ นฟังก์ชนั่ ท่ีใชส้ าหรับส่งค่าออกจากฟังก์ชน่ั รอง โดยค่าท่ีส่งออก จะอยู่ในตวั แปรทา้ ยฟังก์ช่ัน return ซ่ึงมีขนาดเดียวกันกบั ชนิดของค่าท่ีประกาศของฟังก์ช่ัน (หนา้ ชื่อฟังกช์ น่ั รอง) ฟังกช์ นั่ ที่รับค่าและส่งคืนค่า เป็ นฟังก์ชน่ั ที่เขียนข้ึนเพ่ือแบ่งย่อยการทางานของฟังก์ชนั่ หลกั โดยมีการส่งค่าจากฟังกช์ ั่นหลกั เพื่อให้ฟังก์ชนั่ รองที่เขียนข้ึนนาไปประมวลค่าอย่างใดอย่างหน่ึงและส่งค่ากลบั มายงั ฟังก์ชนั่ หลกั ซ่ึง ฟังกช์ น่ั รองชนิดน้ีมกั ใชบ้ ่อยเม่ือตอ้ งการสร้างกลุ่มฟังกช์ น่ั ที่ตอ้ งการคานวณสิ่งใดสิ่งหน่ึงโดยมีขอ้ มูลที่ ใชใ้ นการคานวณน้นั ๆ ดว้ ย และเมื่อคานวณเสร็จสิ้นฟังก์ชนั่ หลกั มีความตอ้ งการผลการคานวณน้นั ดว้ ย เช่น ฟังกช์ น่ั แปลงค่าจากการอา่ นคา่ จากเทอร์มิสเตอร์ NTC และตอ้ งการผลเป็นอุณหภูมิ ซ่ึงขอ้ กาหนดใน การประกาศใชข้ องฟังกช์ น่ั ประเภทน้ีมีดงั น้ี 1. ขอ้ กาหนดในการรับคา ทาโดยกาหนดชนิดตวั แปร พร้อมตวั แปรท่ีจะรับค่าทา้ ยชื่อฟังกช์ น่ั รองท่ีสร้างข้ึน เช่น (int x) 2. ขอ้ กาหนดในการสงคนคา ทาโดยใส่กาหนดชนิดของขอ้ มูลที่จะส่งคืนหนา้ ช่ือฟังกช์ นั่ รอง
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 39 ตวั อยา่ งโปรแกรมที่มีฟังกช์ นั่ รองท่ีรับค่าและส่งคืนคา่ double Thermistor(int RawADC); 1 #define NTC A5 2 double Thermistor(int RawADC); 3 void setup() 4{ 5 Serial.begin(9600); 6} 7 void loop() 8{ 9 float Temp=Thermistor(analogRead(NTC)); 10 Serial.print(\"Temperature is : \"); Serial.print(Temp); 11 Serial.println(\" 'C\"); 12 delay(1000); 13 } 14 double Thermistor(int RawADC) 15 { 16 double Cal; 17 Cal = log(10000.0/((1024.0/RawADC-1))); 18 Cal = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Cal * Cal ))* Cal ); 19 Cal = Cal - 273.15; // Convert Kelvin to Celcius 20 return Cal; 21 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 2 เป็ นการประกาศรูปแบบของฟังก์ชนั่ รอง double Thermistor(int RawADC); ที่จะ เขียนข้ึนใชง้ าน (มี ; ปิ ดทา้ ย) เป็ นฟังกช์ น่ั ท่ีมีการรับค่าและส่งค่ากลบั คืนฟังกช์ น่ั หลกั โดยค่าที่ รับจะถูกเกบ็ ไวใ้ นตวั แปรชื่อ RawADC ถูกกาหนดใหเ้ ป็นชนิด integer และส่งคืนคา่ กลบั มีขนาด เป็นคา่ ของตวั แปร double - บรรทดั ท่ี 9 เป็ นการเรียกใชฟ้ ังก์ชน่ั รอง float Temp=Thermistor(analogRead(NTC)); โดยส่งค่า เขา้ ฟังก์ชนั่ รองในวงเล็บหลงั ช่ือฟังก์ช่ัน และประกาศตวั แปรไวร้ ับค่า (Temp) ท่ีไดจ้ ากการ ส่งกลบั จากฟังก์ชน่ั รอง จากตวั อยา่ งจะเห็นวา่ ใช้ตวั แปรท่ีใชร้ ับค่ามีขนาดเล็กกวา่ ค่าที่ส่งกลบั ดงั น้นั จะมีขอ้ มูลหายไปบางส่วน แต่ถา้ หากผูเ้ ขียนโปรแกรมยอมรับการสูญหายของขอ้ มูลน้นั ไดโ้ ดยผลการทางานของโปรแกรมยงั เทา่ เดิมก็สามารถทาได้ - บรรทดั ที่ 14-21 เป็ นฟังก์ชนั่ รองท่ีเขียนข้ึนมาเพ่ือประมวลผลตามตอ้ งการท่ีมีการรับค่าเขา้ มา คานวณและส่งค่ากลบั คืนยงั ฟังกช์ นั่ หลกั 2.4 ขอบเขตของตวั แปร ขอบเขตของตวั แปรหมายถึงบริเวณหรือตาแหน่งหรือพิกดั ของตวั แปรท่ีฟังกช์ นั่ สามารถเรียกใช้ งานได้ ท้งั น้ีข้ึนอยกู่ บั ตวั แปรตวั น้นั ๆ วา่ ประกาศไวท้ ี่จุดใด โดยขอบเขตของตวั แปรมีดว้ ยกนั 2 แบบ 1. ตัวแปรประเภทโกลบอล (global) เป็ นตวั แปรท่ีประกาศนอกฟังก์ชน่ั ซ่ึงจะประกาศไวใ้ น ส่วนของหวั โปรแกรม ตวั แปรเหล่าน้ีสามารถถูกนาไปใชง้ านไดท้ ุกฟังก์ชนั่ หรืออาจกล่าว ไดว้ า่ ทุกฟังกช์ นั่ สามารถมองเห็นตวั แปรประเภทน้ี
40 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. ตัวแปรประเภทโลคอล (local) เป็ นตวั แปรท่ีประกาศภายในฟังก์ชนั่ ซ่ึงสามารถใช้งานได้ เฉพาะภายในฟังกช์ นั่ ที่ประกาศเท่าน้นั นอกฟังกช์ นั่ ไม่สามารถใชง้ านได้ หรืออาจกล่าวไดว้ า่ ตวั แปรโลคอลมองเห็นเฉพาะภายในเทา่ น้นั ตวั อยา่ งการประกาศตวั แปรในขอบเขตที่ตา่ งกนั 1 byte LED1=2; 2 byte LED2=3; 3 void setup() 4{ 5 pinMode(LED1,OUTPUT); 6 pinMode(LED2,OUTPUT); 7} 8 void loop() 9{ 10 int i; 11 for(i=0;i<10;i++) 12 { 13 digitalWrite(LED1,HIGH);delay(100); 14 digitalWrite(LED1,LOW);delay(100); 15 } 16 for(i=0;i<10;i++) 17 { 18 digitalWrite(LED2,HIGH);delay(100); 19 digitalWrite(LED2,LOW);delay(100); 20 } 21 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 เป็นการประกาศตวั แปร LED1, LED2 ซ่ึงประกาศอยนู่ อกฟังกช์ น่ั เป็ นการประกาศ ตวั แปรในตาแหน่งโกลบอล นน่ั หมายความวา่ ทุกฟังกช์ นั่ จะสามารถใช้ (มองเห็น) ตวั แปรน้ีได้ สามารถนาไปใช้งานได้ เช่นในฟังก์ชั่น setup ได้นาไปกาหนดโหมดการทางานในฟังก์ชน่ั pinMode และในฟังกช์ นั่ loop ไดน้ าไปใชใ้ นฟังกช์ น่ั digitalWrite - บรรทดั ที่ 10 เป็ นการประกาศตวั แปร i ซ่ึงจะนาไปใช้นับรอบในคาส่ัง forโดยตวั แปรน้ีจะ มองเห็นและใช้งานได้เฉพาะภายในฟังก์ชนั่ loop เท่าน้นั นอกฟังก์ชนั่ (เช่นฟังก์ชนั่ setup ใน ตวั อยา่ ง) ไมส่ ามารถใชง้ านตวั แปรน้ีได้ หรือกล่าวไดว้ า่ มองไม่เห็นตวั แปร i น้ี 2.5 การประกาศตัวแปรแบบสตรัคเจอร์ (Structure) และยูเนียน (Union) การใชง้ านตวั แปรที่มีจานวนตวั แปรมาก ๆ อาจเกิดการสับสนในการใชง้ านได้ ภาษาซีสามารถ จดั รวมกลุ่มตวั แปรเพื่อใหเ้ กิดความสะดวกต่อการเรียกใชง้ านได้ ซ่ึงตวั แปรท่ีนามารวมกลุ่มน้นั สามารถ รวมกลุ่มตวั แปรที่เป็นชนิดแตกตา่ งกนั ได้ โดยมีวธิ ีการประกาศดว้ ยกนั 2 แบบคือ 1. แบบสตคั เจอร์ (Structure) 2. แบบยเู นียน (Union) โดยในแตล่ ะแบบมีคุณสมบตั ิในการจดั การท่ีแตกต่างกนั
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 41 การประกาศตวั แปรแบบสตคั เจอร์ (Structure) เป็ นการประกาศตวั แปรท่ีสามารถรวมกลุ่มของขอ้ มูลไดห้ ลายชนิดไม่วา่ จะเป็ นตวั เลขจานวน เต็ม ตวั เลขท่ีเป็ นทศนิยมหรือเป็ นตวั อกั ษรก็ตาม โดยสามารถใชง้ านไดใ้ นเวลาเดียวกนั เนื่องจากตวั แปร ยอ่ ย ๆ ภายในสตคั เจอร์ไดถ้ ูกแยกพ้ืนท่ีหน่วยความจาสาหรับการเก็บขอ้ มูล วธิ ีการประกาศมีรูปแบบดงั น้ี การประกาศ struct ชื่อตวั แปรสตคั เจอร์ { ชนิดตวั แปร ช่ือตวั แปรตวั ที่ 1; ชนิดตวั แปร ชื่อตวั แปรตวั ที่ 2; --- }; การใช้งาน ช่ือตวั แปรสตคั เจอร์ ช่ือตวั แปรใหม่ที่ตอ้ งการต้งั ช่ือ={ค่าเร่ิมตน้ ของตวั แปรตวั ที่ 1, 2, …}; ตวั อยางเชน 1 struct VALUE 2{ 3 byte a; 4 int b; 5 float c; 6 }; 7 VALUE data={123,12345,123.45}; 8 void setup() 9{ 10 Serial.begin(9600); 11 Serial.println(data.a); 12 Serial.println(data.b); 13 Serial.println(data.c); 14 } 15 void loop() 16 { 17 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-6 เป็นการประกาศตวั แปรแบบสตคั เจอร์โดยต้งั ชื่อวา่ VALUE มีตวั แปรภายใน 3 ตวั ท่ีเก็บขอ้ มูลแตกต่างกนั - บรรทดั ท่ี 7 เป็ นการกาหนดค่าเริ่มตน้ โดยสามารถเปลี่ยนช่ือเรียกใหม่ได้ ในที่น้ีเปลี่ยนชื่อจาก VALUE เป็ นช่ือวา่ data และสามารถกาหนดค่าเริ่มตน้ เขา้ ไปในทุกตวั แปรภายในไดใ้ นข้นั ตอน น้ี จากตวั อยา่ งกาหนดตวั แปร data.a=123 ตวั แปร data.b=12345 และตวั แปร data.c=123.45
42 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ผลการรันเป็ นดงั รูป รูปที่ 2-4 ผลการรันโปรแกรมท่ีใชง้ านตวั แปรแบบสตคั เจอร์ การประกาศตวั แปรแบบยเู นียน (Union) เป็ นการประกาศตวั แปรที่สามารถรวมกลุ่มของขอ้ มูลไดห้ ลายชนิดเช่นเดียวกบั แบบสตคั เจอร์ แต่มีความแตกต่างตรงท่ีแบบยูเนียนใชห้ น่วยความจาเก็บขอ้ มูลในตาแหน่งเดียวกนั ในทุกตวั แปรดงั น้นั เวลาใชง้ านจึงไม่สามารถใช้พร้อมกนั ได้ เนื่องจากตวั แปรที่กาหนดค่าตวั หลงั สุดจะเป็ นตวั ท่ีไดใ้ ชง้ าน หน่วยความจาในตาแหน่งน้นั ๆ ทาใหข้ อ้ มูลในตวั แปรแรก ๆ ถูกแทนที่ไปดว้ ยค่าในตวั แปรล่าสุดแทน รูปแบบการประกาศดงั น้ี การประกาศ union ชื่อตวั แปรยเู นียน { ชนิดตวั แปร ชื่อตวั แปรตวั ท่ี 1; ชนิดตวั แปร ช่ือตวั แปรตวั ที่ 2; --- }; การใช้งาน ช่ือตวั แปรยเู นียน ช่ือตวั แปรใหม่ท่ีตอ้ งการต้งั ชื่อ;
บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 43 ตวั อยางเชน 1 union VALUE 2{ 3 byte a; 4 int b; 5 float c; 6 }; 7 VALUE data; 8 void setup() 9{ 10 Serial.begin(9600); 11 data.a=123; Serial.println(data.a); 12 data.b=12345; Serial.println(data.b); 13 data.c=123.45; Serial.println(data.c); 14 } 15 void loop() 16 { 17 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-6 เป็ นการประกาศตวั แปรแบบยูเนียนโดยต้งั ช่ือวา่ VALUE มีตวั แปรภายใน 3 ตวั ที่ เก็บขอ้ มูลแตกตา่ งกนั - บรรทดั ที่ 7 เป็ นการกาหนดช่ือเรียกใหม่ในท่ีน้ีเปล่ียนช่ือจาก VALUE เป็ นช่ือว่า data แต่ไม่ สามารถกาหนดคา่ เร่ิมตน้ แบบตวั แปรสตรัคเจอร์ได้ - บรรทดั ที่ 11 เป็นการกาหนดค่าใหก้ บั ตวั แปรตวั แรก data.a พร้อมนาไปใชง้ านทนั ที โดยตวั อยา่ ง ดงั กล่าวเป็นการนาส่งขอ้ มูลออกทางพอร์ตอนุกรมเพื่อแสดงผลหนา้ จอคอมพวิ เตอร์ - บรรทดั ที่ 12 เป็ นการกาหนดค่าให้กบั ตวั แปรตวั แรก data.b ค่าของตวั แปรน้ีจะไปทบั ขอ้ มูลของ data.a ซ่ึงตอนน้ีไม่ไดใ้ ชง้ านแลว้ - บรรทดั ที่ 13 เป็ นการกาหนดค่าให้กบั ตวั แปรตวั แรก data.c ค่าตวั แปรน้ีจะไปทบั ขอ้ มูลของตวั แปร data.b เน่ืองจากใชต้ าแหน่งของหน่วยความจาเดียวกนั ในการเก็บขอ้ มูล ผลการรันเป็ นดงั รูป รูปที่ 2-5 ผลการรันโปรแกรมท่ีใชง้ านตวั แปรแบบยเู นียน
44 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] หากกาหนดคา่ ตวั แปรตอ่ เนื่องกนั ตวั แปรตวั สุดทา้ ยจะไปทบั ขอ้ มูลตวั แปรตวั แรก ๆ ของตวั แปรยเู นียน ตวั อยางเชน 1 union VALUE 2{ 3 byte a; 4 int b; 5 float c; 6 }; 7 VALUE data; 8 void setup() 9{ 10 data.a=123; 11 data.b=12345; 12 data.c=123.45; 13 Serial.begin(9600); 14 Serial.println(data.a); 15 Serial.println(data.b); 16 Serial.println(data.c); 17 } 18 void loop() 19 { 20 } ผลการรันเป็ นดงั รูป รูปท่ี 2-6 ผลการรันโปรแกรมที่ใชง้ านตวั แปรแบบยเู นียนท่ีกาหนดคา่ ตวั แปรพร้อมกนั
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338