50 Arduino IDE 2.6 การเปรยี บเทียบสตรงิ ดวยโอเปอเรเตอร == และ != ผูพฒั นาโปรแกรมสามารถเปรยี บเทียบสตริง 2 ชดุ วา เกบ็ คาตรงกนั หรอื ไมด ว ยโอเปอเรเตอร == หรอื อาจเรยี กผานเมธอด equals และเม่ือตอ งการเปรยี บเทียบวา สตริง 2 ชุดเกบ็ คาสตริงไมต รง กันหรอื ไม จะใชโอเปอเรเตอร != รูปแบบ boolean equals(param) ทาํ หนา ทเ่ี ปรียบเทยี บสตรงิ 2 ชดุ พารามเิ ตอร param คอื สตริงทนี่ าํ มาเปรียบเทยี บ การคืนคา - เปน true เมอื่ ขอความของสตริงทเ่ี ปรียบเทยี บตรงกนั - เปน false เมอื่ ขอความของสตริงทเี่ ปรียบเทยี บไมต รงกนั ตัวอยา งที่ 2-24 Serial.begin(9600); // กาํ หนดคา อตั ราเร็วของการสือ่ สารขอ มูล 9600 บิตตอวนิ าที String s1 = \"Hello\"; // กาํ หนดใหต ัวแปร s1 เปน ออบเจก็ ตส ตรงิ เกบ็ ขอความ \"Hello\" String s2 = \"Hello\"; // กาํ หนดใหต ัวแปร s2 เปน ออบเจก็ ตส ตรงิ เกบ็ ขอความ \"Hello\" if(s1==s2) // เปรียบเทยี บ สตรงิ s1 และ s2 วา มีขอ ความตรงกนั หรอื ไม { Serial.println(\"s1 and s2 is equals.\"); // พมิ พขอ ความออกไปยังหนา ตาง Serial Monitor ในกรณีทส่ี ตรงิ s1 และ s2 มีขอ ความตรงกนั } else { Serial.println(\"s1 and s2 is not equals.\"); // พมิ พขอ ความออกไปยงั หนา ตาง Serial Monitor ในกรณีทส่ี ตรงิ s1 และ s2 มีขอ ความไมต รงกนั } ผลลพั ธค อื เงอื่ นไขการเปรยี บเทยี บสตรงิ s1 และ s2 จะเปนจริงเนอ่ื งจากท้ังคมู ีขอ ความตรงกันทําใหม ี การพมิ พขอ ความแสดงผลลพั ธอ อกที่ Serial Monitor เปน \"s1 and s2 is equals.\"
Arduino IDE51 ตัวอยางที่ 2-25 Serial.begin(9600); // กาํ หนดคา อตั ราเรว็ ในการสอื่ สารขอ มลู อนกุ รม 9600 บติ ตอ วนิ าที String s1 = \"Hello\"; // กาํ หนดใหต วั แปร s1 เปน ออบเจก็ ตส ตจรงิ เกบ็ ขอ ความ \"Hello\" String s2 = \"Hello\"; // กาํ หนดใหต ัวแปร s2 เปน ออบเจก็ ตส ตรงิ เก็บขอความ \"Hello\" if(s1!=s2) // เปรยี บเทยี บ สตรงิ s1 และ s2 วา มีขอ ความไมต รงกนั หรอื ไม { Serial.println(\"YES!\"); // พมิ พข อ ความ YES! ไปยงั หนา ตา ง Serial Monitor ในกรณที สี่ ตรงิ s1 และ s2 มขี อ ความไมต รงกนั } else { Serial.println(\"NO!\"); // พมิ พข อ ความ NO! ออกไปยงั หนา ตา ง Serial Monitor ในกรณที สี่ ตรงิ s1 และ s2 มขี อ ความตรงกนั } ผลลพั ธค อื เงอ่ื นไขการเปรยี บเทยี บสตรงิ s1 และ s2 จะเปนเทจ็ เน่ืองจากท้ังคมู ีขอ ความตรงกนั ทาํ ให มีการพมิ พขอ ความแสดงผลลพั ธอ อกที่ Serial Monitor เปน \"NO!\" 2.7 ตรวจสอบจาํ นวนอกั ขระที่เกบ็ ภายในตวั แปรสตรงิ ดวยเมธอด length เมอื่ ตอ งการตรวจสอบจาํ นวนอกั ขระทเ่ีกบ็ ภายในสตรงิ วา มกี ต่ี วั ทาํ ไดโ ดยเรยี กผา นเมธอดlength รปู แบบ int length() เมธอดตรวจสอบจาํ นวนอกั ขระทเี่ กบ็ ภายในตวั แปรสตรงิ ตัวอยา งท่ี 2-26 String s1= \"Hello\"; // กาํ หนดใหต ัวแปร s1 เปน ออบเจก็ ตส ตรงิ เก็บขอความ “Hello” int result = s1.length(); //อา นคา จาํ นวนสตรงิ ทถี่ กู เกบ็ ไวใ นตวั แปรสตรงิ s1เกบ็ ไวท ต่ี วั แปรresult ผลลพั ธค อื ตัวแปร result จะมีผลลพั ธเ ทา กับ 5 ตัวอยางที่ 2-27 String s1= \"Hello World!\"; // กาํ หนดใหต วั แปร s1 เปน ออบเจก็ ตส ตรงิ เกบ็ ขอ ความ \"Hello World!\"(อกั ขระทงั้ หมด 12 ตวั ) int result = s1.length(); // อานคาจาํ นวนของสตรงิ ทถี่ ูกเกบ็ ไวใ นตวั แปรสตรงิ s1 มาเก็บไวท ตี่ ัวแปร result ผลลพั ธค อื ตัวแปร result จะมผี ลลพั ธเ ทา กับ 12 (รวมอกั ขระชอ งวา งดว ย)
52 Arduino IDE 2.8 การแปลงสตรงิ ดว ยเมธอดตา งๆ 2.8.1 แปลงสตรงิ ใหเ ปน ขอ มลู เลขจาํ นวนเตม็ ดว ยเมธอด toInt เมอ่ื ตอ งการแปลงอกั ขระทเี่ กบ็ ภายในออบเจก็ ตส ตรงิ เปน เลขจาํ นวนเตม็ ชนดิ long ทาํ ไดโ ดย ใชเมธอด toInt รูปแบบ long toInt() คืนคาเปน เลขจํานวนเตม็ ทีไ่ ดจ ากการแปลงอกั ขระทเี่ กบ็ ภายในสตริง ตัวอยา งที่ 2-28 String s1= \"200\"; // กาํ หนดใหต วั แปร s1 เปน ออบเจก็ ตส ตรงิ เกบ็ ขอ ความ \"200\" long result = s1.toInt();// แปลงสตรงิ s1 เปน ตัวเลขจํานวนเต็ม เกบ็ ไวท ต่ี ัวแปร result ผลลพั ธค อื ตัวแปร result จะมผี ลลพั ธเ ทา กับ 200 2.8.2 แปลงสตริงใหเ ปน ขอ มลู เลขทศนยิ มดว ยเมธอด toFloat กระทําไดโดยใชเมธอด toFloat รูปแบบ long toFloat() คืนคาเปนเลขทศนยิ มท่ีไดจากการแปลงอักขระท่ีเก็บภายในสตริง ตัวอยางท่ี 2-29 String s1= \"46.587\"; // กาํ หนดใหต ัวแปร s1 เปน ออบเจก็ ตส ตรงิ เก็บขอความ \"46.587\" float result = s1.toFloat(); // แปลงสตรงิ s1 ออกมาเปน ตัวเลขทศนยิ มเกบ็ ไวท ต่ี ัวแปร result ผลลพั ธค อื ตัวแปร result จะมผี ลลพั ธเ ทา กับ 46.59
Arduino IDE53 2.9 คดั ลอกซบั สตรงิ ดว ยเมธอด substring เมอื่ ตอ งการคดั ลอกอกั ขระยอ ยทเ่ี กบ็ ภายในออบเจก็ ตส ตรงิ เพอื่ นาํ ไปใชป ระมวลผลบางอยา ง ทําไดโดยใชเมธอด substring ซึ่งมีใหเลือกใชงาน 2 รปู แบบ 14.1 String substring(from) พารามเิ ตอร from คอื ตาํ แหนงดัชนชี ล้ี าํ ดบั ของอักขระภายในสตรงิ วา ตอ งการใหเ ร่ิมตน การคัดลอก ตง้ั แตด ชั นตี วั ทีก่ าํ หนดไปจนถงึ ลาํ ดบั สดุ ทา ย (ดชั นตี วั ชลี้ าํ ดบั ของอกั ขระตวั แรกเรมิ่ ที่ 0) การคืนคา คนื คา เปนสตริง ผลลพั ธอ อกมาในรูปแบบของออบเจ็กตส ตริงตามทต่ี อ งการ 14.2 String substring(from,to) พารามเิ ตอร from คอื ตาํ แหนง ดชั นตี วั ชลี้ าํ ดบั ของอกั ขระภายในสตรงิ วา ตอ งการใหเ รม่ิ ตน การคดั ลอก ตงั้ แตด ชั นีตวั ท่ีกาํ หนดไปจนถงึ ลาํ ดบั สุดทา ย (ดชั นตี วั ชลี้ ําดบั ของอักขระตวั แรกจะเร่ิมท่ี 0) to คอื ตาํ แหนงดชั นีตวั ชล้ี ําดบั ของอกั ขระตัวสดุ ทา ยบวกหนง่ึ ลําดบั การคืนคา คนื คา เปนสตริง ผลลพั ธอ อกมาในรูปแบบของออบเจ็กสตริง ตัวอยางท่ี 2-30 String s1= \"abcdefghijklmnopqrstuvwxyz\"; // กาํ หนดใหต ัวแปร s1 เปน ออบเจก็ ตส ตรงิ เกบ็ ขอความ a ถึง z String result = s1.substring(2);// คดั ลอกอกั ขระตาํ แหนง ดชั นที ่ี 2 จนถงึ ตวั สดุ ทา ย ผลลพั ธค อื ตวั แปร result จะมผี ลลพั ธเ ปน \"cdefghijklmnopqrstuvwxyz\" ตัวอยางที่ 2-31 String s1= \"abcdefghijklmnopqrstuvwxyz\"; // กาํ หนดใหต ัวแปร s1 เปน ออบเจก็ ตส ตรงิ เก็บขอความ a ถึง z String result = s1.substring(2,5); // คดั ลอกอกั ขระท่ีตําแหนง ดัชนีที่ 2 จนถึง 4 (กอนถึงดชั นลี าํ ดบั ท่ี 5) ผลลพั ธค อื ตัวแปร result จะมีผลลพั ธเ ปน \"cde\"
54 Arduino IDE 2.10 คนหาตําแหนงของอักขระภายในสตรงิ ดวยเมธอด indexOf เม่ือตองการคัดลอกอักขระยอยที่เก็บอยูภายในออบเจ็กตสตริง เพ่ือนําไปใชประมวลผล บางอยางได ทําไดโดยใชเมธอด indexOf ซึ่งมีใหเลือกใชงาน 2 รปู แบบ รูปแบบท่ี 1 int indexOf(ch) พารามเิ ตอร ch คอื อกั ขระเปาหมายทตี่ อ งการคน หาตาํ แหนงภายในสตริง การคืนคา คนื คา เปน ตาํ แหนง ตวั ชอ้ี กั ขระ ch ภายในสตรงิ ตวั แรกสดุ ทพี่ บ กรณไี มพ บ คนื คา เปน -1 รูปแบบที่ 2 int indexOf(ch,start) พารามเิ ตอร ch คอื อกั ขระเปาหมายทตี่ อ งการคน หาตาํ แหนง ภายในสตริง start คอื ตาํ แหนง ดชั นตี วั ชล้ี าํ ดบั เรมิ่ ตน สาํ หรบั การคน หาอกั ขระ การคืนคา คนื คา เปน ตาํ แหนง ตวั ชอ้ี กั ขระ ch ภายในสตรงิ ตวั แรกสดุ ทพี่ บ กรณไี มพ บ คนื คา เปน -1 ตัวอยางที่ 2-32 String s1= \"Hello World\"; // ตัวแปร s1 เกบ็ ขอความ \"Hello World\" int result = s1.indexOf('W'); // คน หาตาํ แหนง อกั ขระ 'W' ผลลพั ธเ กบ็ ทตี่ วั แปร result ผลลพั ธค อื ตัวแปร result จะมีคา เปน 6(ตาํ แหนง ของอักขระ ‘W’) ตัวอยางท่ี 2-33 String s1= \"Hello World\"; // ตัวแปร s1 เกบ็ ขอความ \"Hello World\" int first = s1.indexOf('o'); // คน หาตําแหนง อักขระ 'o' ตัวแรก เกบ็ ผลลพั ธไ วท ต่ี ัวแปร first int second = s1.indexOf('o',first+1); // คน หาตําแหนง อักขระ 'o' ตัวทส่ี องถดั ไป เกบ็ ผลลพั ธไ วทต่ี ัวแปร second ผลลพั ธค อื ตัวแปร first จะมคี า เปน 4 (ตําแหนง ของอกั ขระ 'o' ตัวแรก) ตัวแปร second จะมีคา เปน 7(ตําแหนง ของอกั ขระ 'o' ตัวทส่ี อง)
Arduino IDE55 Arduino ทางผจู ดั ทาํ ซอฟตแ วร Arduino IDE ไดจ ดั เตรยี มฟง กช นั่ พนื้ ฐาน เชน ฟง กช น่ั เกยี่ วกบั ขาพอรต อนิ พตุ เอาตพ ตุ ดจิ ติ อล, อนิ พตุ เอาตพ ตุ อะนาลอก เปน ตน ดงั นนั้ ในการเขยี นโปรแกรมจงึ เรยี กใชฟ ง กช นั่ เหลา นไ้ี ดท นั ที นอกจากฟง กช น่ั พนื้ ฐานเหลา นแ้ี ลว นกั พฒั นาทา นอนื่ ๆ ทรี่ ว มในโครงการ Arduino นกี้ ็ ไดเ พม่ิ ไลบรารอี นื่ ๆ เชน ไลบรารคี วบคมุ มอเตอร, การตดิ ตอ กบั อปุ กรณบ สั I2C ฯลฯ ในการเรยี กใชง าน ตอ งเพม่ิ บรรทดั #include เพอื่ ผนวกไฟลท เ่ี หมาะสมกอ น จงึ จะเรยี กใชฟ ง กช น่ั ได ในบทนี้จะอธบิ ายถึงการเรียกใชฟง กชน่ั และตัวอยางโปรแกรมสําหรบั ทาํ การทดลอง โดยใช แผงวงจร IPST-SE เปนอปุ กรณห ลักในการทดลอง โดยมขี ั้นตอนในการทดสอบดงั น้ี (3.1) เปดโปรแกรม Arduino IDE 1.7.10 แลวเชื่อมตอแผงวงจร IPST-SE เขากับ คอมพิวเตอรผ านพอรต USB (3.2) เลือกฮารด แวรห รอื บอรด เปน IPST-SE (3.3) เลือกพอรต เชื่อมตอใหถ ูกตอ ง (3.4) พมิ พโ ปรแกรมลงในหนา ตางเอดเิ ตอรข อง Arduino IDE (3.5) บันทึกไฟล นามสกุล .ino แลวทําการคอมไพล โดยคลิกที่ปุม หรือเลือกเมนู Sketch > Verfy/Compile (3.6) หากการคอมไพลถ ูกตอง ทําการทดสอบการทํางานบนแผงวงจร IPST-SE ดว ยการ อัปโหลดโปรแกรม โดยคลิกที่ปุม หรือเลือกท่ีเมนู File > Upload (3.7) เมอื่ การอปั โหลดเสรจ็ สน้ิ แผงวงจร IPST-SE จะทาํ งานตามโปรแกรมทกี่ าํ หนดทนั ที
56 Arduino IDE 3.1 ฟง กช น่ั ใชง านพอรต เอาตพ ตุ ดิจติ อลของแผงวงจร IPST-SE 3.1.1 คณุ สมบัตขิ องขาพอรตเอาตพ ตุ สําหรับขาพอรตท่ีกําหนดใหเปนเอาตพุตจะมีสถานะเปนอิมพีแดนซต่ํา ทําใหสามารถ จา ยกระแสไฟฟา ใหก บั วงจรภายนอกไดส งู ถงึ 20mA ซง่ึ เพยี งพอสาํ หรบั ขบั กระแสให LED สวา ง (ตอ ง ตอ ตวั ตา นทานอนกุ รมดว ย) หรอื ใชก บั ตวั ตรวจจบั ตา งๆ ได แตไ มเ พยี งพอสาํ หรบั ขบั รเี ลย โซลนี อยด หรือมอเตอร กอนที่จะใชงานขาดิจิตอลของแผงวงจร IPST-SE จะตองส่ังกอนวาใหขาพอรตนี้ทํา หนา ทเี่ ปน อนิ พตุ หรอื เอาตพ ตุ 3.1.2 การกาํ หนดโหมดของขาพอรต กอนใชงานตองกําหนดโหมดการทํางานของขาพอรตดิจิตอลใหเปนอินพุตหรือเอาตพุต กําหนดไดจากฟงกชั่น pinMode()มีรูปแบบดังนี้ pinmode(pin,mode); เมอ่ื pin คอื หมายเลขขาที่ตองการ Mode คอื โหมดการทาํ งาน (INPUT หรือ OUTPUT) หลังจากที่กําหนดใหเปนเอาตพุตแลวเมื่อตองการเขียนคาไปยังขาน้ันๆ ใหเรียกใชฟงกช่ัน digitalWrite() โดยมีรูปแบบดังนี้ digitalWrite(pin,value); เมอื่ pin คอื หมายเลขขาที่ตองการ value สถานะลอจกิ ทต่ี องการ (HIGH หรือ LOW) analogWrite(pin, value) pinMode(pin,INPUT) HIGH digitalWrite(pin, value) LOW pinMode(pin,OUTPUT) รปู ท่ี 3-1 ไดอะแกรมแสดงกลไกการกาํ หนดใหข าพอรตของ Arduino และแผงวงจร IPST-SE เปน พอรต เอาตพ ตุ ดจิ ติ อล (บลอ็ กสเี ทาแทนการทาํ งานหรอื เงอื่ นไขทตี่ อ งการ)
Arduino IDE57 3.1.3 คาํ อธิบายและการเรียกใชฟ ง กชนั่ 3.1.3.1 pinMode(pin,mode) ใชกําหนดขาพอรต ใดๆ ใหเปนพอรต ดิจติ อล พารามเิ ตอร pin - หมายเลขขาพอรต ของแผงวงจร IPST-SE (คา เปน int) mode - โหมดการทาํ งานเปน INPUT (อนิ พตุ ) หรอื OUTPUT (เอาตพ ตุ ) (คา เปน int) ตอ งใชต วั พมิ พใ หญ ตัวอยา งที่ 3-1 int ledPin = 17; // ตอ ZX-LED ทพ่ี อรต หมายเลข 17 {vv}{ oopiiddinlsMoeotoupdp(e)(()ledPin, OUTPUT); // กาํ หนดเปนเอาตพตุ digitalWrite(ledPin, HIGH); // LED ติดสวา ง delay(1000); // หนวงเวลา 1 วนิ าที digitalWrite(ledPin, LOW); // LED ดบั delay(1000); // หนวงเวลา 1 วนิ าที } 3.1.3.2 digitalWrite(pin,value) ส่ังงานใหขาพอรต มีคาสถานะเปนลอจกิ สูง (HIGH หรอื “1”) หรอื ลอจกิ ต่ํา (LOW หรอื “0”) พารามเิ ตอร pin - หมายเลขขาพอรต ของแผงวงจร IPST-SE (คา เปน int) value - มีคา HIGH หรอื LOW ตัวอยางที่ 3-2 int ledPin = 17; // ตอ ZX-LED ทพี่ อรต หมายเลข 17 {v}v{ oopiiddinlsMoeotoupdp(e)(()ledPin, OUTPUT); // กาํ หนดเปน เอาตพตุ digitalWrite(ledPin, HIGH); // LED ติดสวา ง delay(500); // หนวงเวลา 0.5 วนิ าที digitalWrite(ledPin, LOW); // LED ดบั delay(500); // หนวงเวลา 0.5 วนิ าที } กาํ หนดใหพ อรต หมายเลข 17 เปน HIGH (มีลอจกิ เปน “1”) หนวงเวลา 0.5 วนิ าที แลว จึงส่งั ใหก ลบั เปน LOW (มีลอจิกเปน “0”) อกี ครั้ง วนเชนน้ีไปตลอด
58 Arduino IDE 3.2 ฟง กช นั่ ใชง านพอรต อนิ พตุ ดิจิตอลของแผงวงจร IPST-SE 3.2.1 คณุ สมบัตขิ องขาพอรตอนิ พตุ ขาพอรต ของ Arduino และแผงวงจร IPST-SE จะถูกกําหนดเปนอนิ พตุ ตงั้ แตเร่มิ ตน จงึ ไมจ าํ เปนตองใชฟงกชั่น pinMode() ในการกําหนดใหเ ปนอนิ พตุ ขาพอรต ท่ีถกู กําหนดเปน อนิ พตุ จะมี สถานะเปน อมิ พแี ดนซส งู ทาํ ใหม ีความตอ งการกระแสไฟฟา จากอปุ กรณท ตี่ อ งการอา นคา อนิ พตุ นอ ย มาก ทาํ ใหไ มส ามารถรบั หรอื จา ยกระแสใหก บั วงจรภายนอก ทาํ ใหน าํ ขาทเ่ี ปน อนิ พตุ นไ้ี ปใชง านบาง ประเภท เชน สรา งตัวตรวจจับการสัมผัสท่ีอาศัยการวดั คาความจุไฟฟา สาํ หรบั ขาอนิ พตุ เมอื่ ไมม อี นิ พตุ ปอ นใหจ ะตอ งกาํ หนดคา แรงดนั ใหแ นน อนทาํ ไดโ ดยตอ ตวั ตา น ทานพลู อปั (pull-upresistor)โดยตอ ขาของตวั ตา นทานขาหนงึ่ ไปยงั ไฟเลย้ี งหรอื ตอ พลู ดาวน(pull-down) ซงึ่ ตอ ขาหนง่ึ ของตวั ตา นทานจากขาพอรต ลงกราวด คา ตวั ตา นทานทใี่ ชท ว่ั ไปคอื 10k ดงั รปู ท่ี 3-2 แผงวงจร POP-X2 มจี ดุ ตอ พอรต ดจิ ติ อลทกี่ าํ หนดใหเ ปน อนิ พตุ หรอื เอาตพ ตุ จาํ นวน 16 จดุ ตอ หรอื 16 ขา ถา ตอ งการกําหนดเปน อนิ พตุ ตองกาํ หนดดว ยฟง กช นั่ pinMode และอา นคา อนิ พตุ ไดจ าก ฟงกช่ัน digitalRead ซ่ึงมีรปู แบบดังนี้ digitalRead(pin); เมอ่ื pin คอื หมายเลขขาท่ีตองการอานคาสถานะ เมอื่ ฟง กช ั่นทํางาน จะคืนคาเปน สถานะของขาที่ตองการอา นคา โดยคนื คาเปน LOW (คาเปน “0”) หรอื HIGH (คาเปน “1”) +Vcc ปกตเิ ปนลอจิกต่ํา Rpull-up (LOW หรือ \"0\") Di INPUT Di INPUT ปกตเิ ปน ลอจิกสงู Rpull-down (HIGH หรอื \"1\") (ข) การตอตวั ตา นทานพลู ดาวน (ก) การตอตวั ตานทานพูลอัป รปู ท่ี 3-2 แสดงการตอ ตวั ตา นทานเพื่อกาํ หนดสภาวะของขาพอรต อินพุตของไมโครคอนโทรลเลอร ในขณะทย่ี งั ไมม อี นิ พตุ สง เขา มา
Arduino IDE59 +Vcc ส่ังใหต อ ตวั ตา นทาน 20k Digital พูลอปั ภายในดวยคําส่ัง Di input port digitalWrite(pin, HIGH) รปู ที่ 3-3 แสดงการตอ ตวั ตา นทานพูลอปั ภายในที่พอรต อินพุตดจิ ติ อลของไมโครคอนโทรลเลอรซ ึ่ง ควบคมุ ไดด ว ยกระบวนการทางซอฟตแ วร ภายในขาพอรต ของไมโครคอนโทรลเลอร ATmega644P ซง่ึ เปน ไมโครคอนโทรลเลอรห ลกั ของแผงวงจร IPST-SE จะมกี ารตอตัวตานทานพลู อปั คา 20k เตรยี มไวใ ห สงั่ การเพอื่ ตอใชง านผาน ทางซอฟตแวร ดังรปู ท่ี 3-3 ในรปู ท่ี3-4แสดงไดอะแกรมการเขยี นคาํ สงั่ เพอื่ กาํ หนดใหใ ชง านขาพอรต ของไมโครคอนโทรล เลอรห ลกั ของแผงวงจร IPST-SE ทาํ งานเปน ขาพอรต อนิ พตุ ดจิ ติ อล digitalWrite(pin, HIGH) pinMode(pin,INPUT) pinMode(pin,OUTPUT) val = digitalRead(pin); val รปู ท่ี 3-4 ไดอะแกรมแสดงกลไกการกาํ หนดใหข าพอรต ของ Arduino และแผงวงจร IPST-SE เปน พอรต อนิ พตุ ดจิ ติ อล (บลอ็ กสเี ทาแทนการทาํ งานหรอื เงอื่ นไขทตี่ อ งการ)
60 Arduino IDE 3.2.2 ตวั อยา งการเรยี กใชฟ ง กช น่ั เพอื่ ใชง านพอรต อนิ พตุ ดจิ ติ อล 3.2.2.1 int digitalRead(pin) อา นคาสถานะของขาที่ระบไุ ววา มีคาเปน HIGH หรอื LOW พารามเิ ตอร pin - ขาพอรต ทต่ี องการอา นคา ซง่ึ ตองเปน ขาพอรต ดจิ ติ อล มีคา ไดจ าก 0 ถึง 30 หรอื เปน ตัวแปรทมี่ ีคา อยใู นชวง 0 ถึง 30 กไ็ ด คาที่สงกลับ เปน HIGH หรอื LOW ตัวอยา งที่ 3-3 // ตอ ZX-LED ทพ่ี อรต หมายเลข 17 // ตอ ZX-SWITCH01 ทพี่ อรต หมายเลข 18 int ledPin = 17; // กาํ หนดเตวั แปรสําหรบั เก็บคาท่ีอานไดจ ากอนิ พุต int inPin = 18; int val = 0; // กาํ หนดใหพ อรต 29 เปน เอาตพตุ void setup() // กาํ หนดใหพ อรต 18 เปน อนิ พุต { // อา นคาจากพอรต อนิ พุต pinMode(ledPin, OUTPUT); // แสดงคา ที่อา นไดท พี่ อรต เอาตพตุ ในทนี่ ี่คอื พอรต 17 pinMode(inPin, INPUT); } void loop() { val = digitalRead(inPin); digitalWrite(ledPin, val); } เมอ่ื ไมก ดสวติ ช สถานะทพี่ อรต 18 เปน “1” ทาํ ใหพ อรต 17 มีสถานะเปน ”1” เชนกัน LED ทต่ี อกบั พอรต 17 จงึ ตดิ สวา ง เมื่อกดสวติ ช สถานะลอจกิ ทพ่ี อรต 18 จะเปน “0” พอรต 17 จึงมสี ถานะเปน “0” เชน กนั LED ทต่ี ออยจู ึงดับ หมายเหตุ : ขาพอรต ในโปรแกรมน้ีอา งถงึ จดุ ตอ พอรต ของแผงวงจร IPST-SE
Arduino IDE61 3.3 ฟง กชน่ั เก่ียวกบั การสอ่ื สารผา นพอรต อนุกรม ใชสอ่ื สารขอมลู ระหวา งฮารดแวร Arduino (ในที่นี้คือแผงวงจร IPST-SE) กับคอมพิวเตอร โดยกระทําผานพอรต USB ในรปู ที่ 3-5 แสดงกลไกการทาํ งานของฟง กชนั่ Serial ใน Arduino IDE นอกจากนี้แผงวงจร IPST-SE ยังมีพอรต สาํ หรบั ส่ือสารขอมลู อนกุ รมหรอื UART อกี หนงึ่ ชดุ นน่ั คือ UART1 ซ่ึงใชพอรต หมายเลข 2 เปนขา RxD สําหรบั รบั ขอมลู อนกุ รม และพอรต หมายเลข 3 เปน ขา TxD สาํ หรบั สง ขอ มลู อนกุ รม โดย UART1 นใ้ี ชส าํ หรบั เชอื่ มตอ อปุ กรณส อ่ื สารขอ มลู อนกุ รม ท้งั แบบมสี ายหรอื ไรส ายอยา งบลทู ธู หรอื XBEE ดว ยระดบั สัญญาณ TTL (0 และ +3.3V หรอื +5V) รวมถึงโมดลู Serial WiFi เพอ่ื ชว ยใหแ ผงวงจร IPST-SE เชอ่ื มตอกับเครอื ขายอนิ เทอรเ น็ตได อนั จะ นําไปสกู ารพฒั นาโครงงานควบคมุ อปุ กรณผ า นโครงขา ยขอ มลู ในแบบตา งๆ รวมถงึ การควบคมุ ขา ม โลกผานเว็บบราวเซอร Serial.print(data) Serial.flush() Serial.begin(speed) Serial.println(data) Serial.write(data) Serial.available() Serial.read(data) รปู ท่ี 3-5 กลไกการสอ่ื สารขอ มลู อนกุ รมของฟง กช นั่ Serial ใน Arduino 1.0.x
62 Arduino IDE 3.3.1 คาํ อธิบายและการเรียกใชฟ ง กชน่ั 3.3.1.1 Serial.begin(int datarate) กําหนดคา อตั ราบอดของการรบั สงขอมลู อนกุ รม ในหนวยบติ ตอ วินาที (bits per second : bps หรอื baud) ในกรณที ่ีติดตอกบั คอมพวิ เตอรใ หใชคาตอไปนี้ 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 หรอื 115200 พารามเิ ตอร Int datarate ในหนว ยบิตตอวนิ าที (baud หรอื bps) ตัวอยา งท่ี 3-4 void setup() // เปด พอรต อนกุ รม กาํ หนดอัตราบอดเปน 9600 บิตตอวนิ าที { Serial.begin(9600); } 3.3.1.2 Serial.available() ใชแจง วา ไดร บั ขอมลู ตัวอักษร (characters) แลว และพรอมสาํ หรบั การอา นไปใชง าน คาท่ีสงกลับจากฟงกช่ัน จาํ นวนไบตท พี่ รอ มสาํ หรบั การอา นคา โดยเกบ็ ขอ มลู ในบฟั เฟอรต วั รบั ถาไมม ีขอ มูล จะมีคา เปน 0 ถามีขอ มูล ฟง กช ั่นจะคนื คาที่มากกวา 0 โดยบัฟเฟอรเ กบ็ ขอมูลไดส งู สดุ 128 ไบต 3.3.1.3 Serial.read() ใชอานคาขอมูลที่ไดรับจากพอรตอนุกรม คาท่ีสงกลับจากฟงกชั่น เปน เลข int ทเี่ ปน ไบตแรกของขอ มูลทไี่ ดร บั (หรอื เปน -1 ถาไมมีขอ มูล) ตัวอยา งท่ี 3-5 // เปด พอรต สอ่ื สาร กาํ หนดอตั ราบอด 9600 บิตตอวนิ าที // วนสง ขอ มูลเมอ่ื ไดรบั ขอมูลเขา มา int incomingByte = 0; // อา นขอ มูลอนุกรม void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0)
Arduino IDE63 { incomingByte = Serial.read(); // เกบ็ ขอ มลู ทอี่ า นไดไ วใ นตวั แปร Serial.print(\"I received: \"); // พมิ พขอ ความออกไปยงั หนา ตาง Serial Monitor Serial.println(incomingByte, DEC); // พมิ พขอ มูลทร่ี บั ไดอ อกไปยงั หนา ตาง Serial Monitor } } ในตวั อยา งน้ี เลอื กใชอ ตั ราบอด 9600 บิตตอวนิ าที ถามีขอ มูลเขามาจะเก็บไวใ นตวั แปร incomingByte แลวนําไปแสดงผลทหี่ นาตาง Serial Monitor โดยตอทา ยขอความ I received :..... เมอื่ รนั โปรแกรม ใหเ ปด หนา ตาง Serial Monitor โดยคลกิ ทป่ี มุ ซ่งึ อยทู มี่ ุมขวาของหนา ตางหลกั เลอื กอัตราบอดของหนา ตาง Serial Monitor เปน 9600baud, เลอื ก No line Ending คลกิ ทาํ เครอ่ื งหมายทช่ี อง Autoscroll จากน้ันปอนอกั ษร a แลว คลกิ ปมุ Send เมอื่ แผงวงจร IPST-SE ไดรบั ขอมูล จะสง คา ของตวั อักษรในรูปของเลขฐานสบิ กลับมา อักษร a มีรหสั แอสกเี้ ทา กับ 61 เมอื่ แปลงเปน เลขฐานสิบ จะไดค า เปน 97 3.3.1.4 Serial.flush() ใชลางบัฟเฟอรตัวรับขอมูลของพอรตอนุกรมใหวาง
64 Arduino IDE 3.3.1.5 Serial.print(data) ใชสงขอมลู ออกทางพอรต อนุกรม พารามเิ ตอร Data - เปน ขอ มูลเลขจํานวนเต็ม ไดแ ก char, int หรอื เลขทศนิยมทต่ี ัดเศษออกเปน เลขจาํ นวนเต็ม รูปแบบฟงกช่ัน คําส่ังนี้สามารถเขียนไดหลายรูปแบบ Serial.print(b) เปน การเขยี นคาํ สง่ั แบบไมไ ดร ะบรุ ปู แบบ จะพมิ พค า ตวั แปร b เปน เลขฐานสบิ โดยพมิ พต วั อกั ษรรหสั ASCII ดงั ตวั อยา ง int b = 79; Serial.print(b); พมิ พข อ ความ 79 Serial.print(b, DEC) เปน คําส่ังพมิ พคา ตัวแปร b เปน ตัวเลขฐานสบิ โดยพมิ พตัวอกั ษรตามรหสั ASCII ดงั ตวั อยา ง int b = 79; Serial.print(b); พมิ พข อ ความ 79 Serial.print(b, HEX) เปน คําสงั่ พมิ พคา ตัวแปร b เปน ตัวเลขฐานสบิ หก โดยพมิ พตัวอักษรตามรหสั ASCII ดงั ตวั อยา ง int b = 79; Serial.print(b, HEX); พมิ พข อ ความ 4F Serial.print(b, OCT) เปน คําสง่ั พมิ พคา ตัวแปร b เปน ตัวเลขฐานแปด โดยพมิ พตัวอกั ษรตามรหสั ASCII ดงั ตวั อยา ง int b = 79; Serial.print(b, OCT); พมิ พข อ ความ 117 Serial.print(b, BIN) เปน คําสงั่ พมิ พคา ตัวแปร b เปน ตัวเลขฐานสอง โดยพมิ พตัวอกั ษรตามรหสั ASCII ดงั ตวั อยา ง int b = 79; Serial.print(b, BIN); พมิ พขอ ความ 1001111
Arduino IDE65 Serial.write(b) เปน คาํ สง่ั พมิ พค า ตัวแปร b ขนาด 1 ไบต เดมิ ทคี าํ สง่ั นี้ จะเปน Serial.print(b,BYTE) ตงั้ แต Arduino 1.0 ขน้ึ มา ไดย กเลกิ คาํ สง่ั Serial.print(b,BYTE) และใหใ ชคาํ สงั่ Serial.write(b) แทน ดงั ตวั อยา ง int b = 79; Serial.write(b); พมิ พตัวอกั ษร O ซึง่ มคี า ตามตาราง ASCII เทา กับ 79 ใหด ขู อ มูลจากตารางรหสั แอสกเ้ี พม่ิ เติม Serial.print(str) เปน คาํ สง่ั พมิ พค า ขอ ความในวงเลบ็ หรอื ขอ ความทเี่ กบ็ ในตวั แปร str ดงั ตวั อยา ง Serial.print(“Hello World!”); พมิ พข อ ความ Hello World พารามเิ ตอร b - ไบตขอ มลู ทต่ี อ งการพมิ พอ อกทางพอรต อนุกรม str - ตวั แปรสตรงิ ทเ่ี กบ็ ขอ ความสาํ หรบั สง ออกพอรต อนุกรม ตัวอยางท่ี 3-6 int analogValue = 0; // กาํ หนดตวั แปรเกบ็ คาสญั ญาณอะนาลอก void setup() { Serial.begin(9600); // เปด พอรต อนกุ รม กาํ หนดอัตราบอดเปน 9600 บิตตอวนิ าที } void loop() { analogValue = analogRead(0); // อานคาสญั ญาณอะนาลอกชอง 0 // โดยตอแผงวงจร ZX-POT เขา ทจี่ ุดตอ A0 // แสดงผลทห่ี นาตาง Serial Monitor ในหลายรูปแบบ Serial.print(analogValue); // แสดงเปน รหสั แอสกข้ี องเลขฐานสบิ Serial.print(\"\\t\"); // คน่ั ดว ยแทบ็ (tab) Serial.print(analogValue, DEC); // แสดงเปน รหสั แอสกขี้ องเลขฐานสบิ Serial.print(\"\\t\"); // คนั่ ดว ยแทบ็ (tab) Serial.print(analogValue, HEX); // แสดงเปน รหสั แอสกข้ี องเลขฐานสบิ หก Serial.print(\"\\t\"); // คน่ั ดว ยแทบ็ (tab) Serial.print(analogValue, OCT); // แสดงเปน รหสั แอสกขี้ องเลขฐานแปด Serial.print(\"\\t\"); // คน่ั ดว ยแทบ็ (tab) Serial.print(analogValue, BIN); // แสดงเปน รหสั แอสกข้ี องเลขฐานสอง Serial.print(\"\\t\"); // คน่ั ดว ยแทบ็ (tab)
66 Arduino IDE Serial.write(analogValue/4); // แสดงขอ มูลดบิ ซงึ่ ตอ งผา นการหารดว ย 4 เนื่องจากฟง กช ั่น analogRead() คนื คา 0 ถึง 1023 // แตต ัวแปรแบบไบตรบั คาไดเ พยี ง 255 Serial.print(\"\\t\"); // คนั่ ดว ยแทบ็ (tab) Serial.println(); // ขนึ้ บรรทดั ใหม delay(10); // หนวงเวลา 10 มิลลิวนิ าที } ตวั อยา งนแ้ี สดงการพมิ พข อ มลู จากฟง กช น่ั Serial.Print() ในรปู แบบตา งๆ แสดงผา นหนา ตา ง Serial Monitor ตองเลอื กอตั ราบอดของหนา ตาง Serial Monitor เปน 9600baud, เลอื ก No line Ending และคลิกทาํ เครอ่ื งหมายทชี่ อง Autoscroll ดว ย จึงจะไดผ ลการทาํ งานทถ่ี ูกตอ ง เทคนิคสําหรับการเขียนโปรแกรม Serial.print() จะตดั เศษเลขทศนยิ มเหลอื เปน เลขจาํ นวนเตม็ ทาํ ใหส ว นทศนยิ มหายไป ทางแกไ ขทางหนงึ่ คอื คณู เลขทศนยิ มดว ย 10, 100, 1000 ฯลฯ ขน้ึ อยกู บั จาํ นวนหลกั ของเลขทศนยิ ม เพือ่ แปลงเลขทศนยิ มเปนจาํ นวนเตม็ กอ นแลวจงึ สงออกพอรตอนกุ รม จากนัน้ ทฝ่ี ง ภาครับใหท าํ การ หารคาทร่ี บั ไดเพื่อแปลงกลับเปน เลขทศนิยม
Arduino IDE67 3.3.1.6 Serial.println(data) เปนฟง กชนั่ พมิ พ (หรอื สง ) ขอมลู ออกทางพอรต อนุกรมตามดวยรหสั carriage return (รหสั ASCII หมายเลข 13 หรือ \\r) และ linefeed (รหัส ASCII หมายเลข 10 หรอื \\n) เพอื่ ใหเ กิดการเล่ือน บรรทัดและข้ึนบรรทัดใหมหลังจากพิมพขอความ มีรูปแบบเหมือนคําส่ัง Serial.print() รูปแบบฟงกชั่น Serial.println(b) เปน คาํ สงั่ พมิ พข อ มลู แบบไมไ ดร ะบรุ ปู แบบ จะพมิ พค า ตวั แปร b เปน เลขฐานสบิ ตามดว ยรหสั อกั ษร carriage return และ linefeed ดงั ตวั อยา งตอ ไปน้ี Serial.println(b, DEC) เปน คําสั่งพมิ พคา ตัวแปร b เปน ตัวเลขฐานสบิ ตามดว ยรหสั อักษร carriage return และ linefeed Serial.println(b, HEX) เปน คําส่ังพมิ พคา ตัวแปร b เปน ตัวเลขฐานสบิ หก ตามดว ยรหสั อกั ษร carriage return และ linefeed Serial.println(b, OCT) เปน คําสงั่ พมิ พคา ตัวแปร b เปน ตัวเลขฐานแปด ตามดว ยรหสั อักษร carriage return และ linefeed Serial.println(b, BIN) เปน คําสั่งพมิ พคา ตัวแปร b เปน ตัวเลขฐานสอง ตามดว ยรหสั อกั ษร carriage return และ linefeed Serial.println(b, BYTE) เปน คําสง่ั พมิ พคา ตัวแปร b ขนาด 1 ไบต ตามดว ยรหสั อกั ษร carriage return และ linefeed Serial.println(str) เปน คาํ ส่งั พมิ พคา ขอ ความในวงเลบ็ หรอื ขอ ความ ทเี่ กบ็ ในตวั แปร str ตามดว ยรหสั อกั ษร carriage return และ linefeed Serial.println() เปน คําสง่ั พมิ พรหสั carriage return และ linefeed พารามเิ ตอร b - ไบตขอ มลู ทต่ี อ งการพมิ พอ อกทางพอรต อนุกรม str - ตวั แปรสตรงิ ทเ่ี กบ็ ขอ ความสาํ หรบั สง ออกพอรต อนุกรม
68 Arduino IDE ตัวอยา งท่ี 3-7 int analogValue = 0; // ประกาศตวั แปรสําหรบั เก็บคาอะนาลอก void setup() // เปด พอรต อนกุ รมและเลอื กอตั ราบอดเปน 9600 บติ ตอ วนิ าที { Serial.begin(9600); } void loop() { analogValue = analogRead(0); // อานคาอนิ พุตอะนาลอกชอง 0 // ตอแผงวงจร ZX-POT กบั พอรต อินพตุ อะนาลอก A0 // แสดงผลในรปู แบบตา งๆ Serial.println(analogValue); // แสดงเปน รหสั แอสกข้ี องเลขฐานสบิ Serial.println(analogValue, DEC); // แสดงเปน รหสั แอสกขี้ องเลขฐานสบิ Serial.println(analogValue, HEX); // แสดงเปน รหสั แอสกข้ี องเลขฐานสบิ หก Serial.println(analogValue, OCT); // แสดงเปน รหสั แอสกขี้ องเลขฐานแปด Serial.println(analogValue, BIN); // แสดงเปน รหสั แอสกข้ี องเลขฐานสอง Serial.write(analogValue); // แสดงคา ในรปู แบบขอ มลู ระดบั ไบต Serial.println(); Serial.flush(); delay(500); // หนวงเวลา 500 มิลลวิ นิ าที } ตองเลอื กอตั ราบอดของหนา ตาง Serial Monitor เปน 9600baud, เลอื ก No line Ending และคลิกทาํ เครอื่ งหมายทีช่ อง Autoscroll ดว ย จงึ จะไดผ ลการทาํ งานทถี่ ูกตอ ง
Arduino IDE69 3.4 ฟง กชนั่ อนิ พตุ เอาตพ ตุ อะนาลอก 3.4.1 ฟง กช นั่ อนิ พตุ อะนาลอก analogRead(pin) อา นคาจากขาพอรตทกี่ ําหนดใหเปนอนิ พตุ อะนาลอกของแผงวงจรหลัก IPST-SE โดยแผง วงจร IPST-SE มวี งจรแปลงสญั ญาณอะนาลอกเปน ดจิ ติ อลทม่ี คี วามละเอยี ด 10 บติ อยภู ายใน จงึ แปลง คาแรงดนั อนิ พตุ 0 ถึง +5V ใหเปนขอมลู ตัวเลขจาํ นวนเต็มระหวาง 0 ถงึ 1023 พารามเิ ตอร pin - หมายเลขของขาอินพตุ อะนาลอก มีคา 0 ถึง 5 หรอื เปน ตัวแปรทใี่ ชแทนคา 0 ถึง 5 คาท่ีสงกลับ เลขจาํ นวนเต็มจาก 0 ถึง 1023 หมายเหตุ สาํ หรบั ขาทเ่ี ปน อนิ พตุ อะนาลอกไมจ าํ เปน ตอ งประกาศแจง วา เปน อนิ พตุ หรอื เอาตพ ตุ ตัวอยา งท่ี 3-8 int ledPin = 17; // ตอแผงวงจร ZX-LED เขา ทพี่ อรต 17 int analogPin = 0; // ตอแผงวงจร ZX-POT เขา ทพี่ อรต อนิ พตุ A0 int val = 0; // กาํ หนดตวั แปรรบั คาอะนาลอก int threshold = 512; // กาํ หนดคา อา งองิ void setup() { // กาํ หนดใหพ อรต 17 เปน เอาตพตุ pinMode(ledPin, OUTPUT); // อานคาอนิ พุตอะนาลอก A0 } void loop() // ขบั LED { // ดบั LED val = analogRead(analogPin); if (val >= threshold) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } ตัวอยา งน้ีจะสง่ั ใหพ อรต 17 เปน ลอจกิ “1” เมอ่ื อานคาจากพอรต อนิ พุต A0 แลว มีคา มากกวาหรอื เทา กับ คา อา งองิ ทก่ี าํ หนดไว (ในตวั อยา ง คา อา งอิงหรอื threshold = 255) แตถ านอยกวา สถานะทพ่ี อรต 17 จะกลายเปน ลอจกิ “0” ทาํ ให LED ดบั
70 Arduino IDE 3.4.2 ฟง กช นั่ เอาตพ ตุ อะนาลอก analogWrite(pin, value) ใชเ ขยี นคา อะนาลอกไปยงั พอรต ทก่ี าํ หนดไว เพอื่ สรา งสญั ญาณ PWM มกี ระบวนการทาํ งาน ตามรปู ท่ี 3-6 พารามเิ ตอร pin - หมายเลขขาพอรต ของแผงวงจรหลกั IPST-SE เลอื กได 2 ขาคอื 19 และ 20 value - เปน คา ดวิ ต้ีไซเกลิ มีคา ระหวา ง 0 ถึง 255 เมอ่ื คา เปน 0 แรงดนั ของขาพอรต ทกี่ าํ หนดจะเปน 0V เมอ่ื มีคา เปน 255 แรงดันที่ขาพอรต จะเปน +5V สําหรบั คาระหวาง 0 ถึง 255 จะทําใหข าพอรต ทกี่ าํ หนดไวม ีคา แรงดันเปลยี่ นแปลงในยาน 0 ถึง +5V คาที่สงกลับจากฟงกชั่น เลขจํานวนเต็มจาก 0 ถึง 255 หมายเหตุ ขาพอรต ทใ่ี ชสรา งสัญญาณ PWM ดว ยฟง กช ั่น analogWrite() ของแผงวงจร IPST-SE มี 6 ขาคอื ขา 4, 5, 6, 7, 19 และ 20 แตจ ะตอออกมาเปน จดุ ตอ เพอื่ ใชงานกบั อปุ กรณภายนอกเพยี ง 2 ขาคอื พอรต 19 และ 20 สาํ หรบั ขาอ่นื ๆ ถูกตอเขา กบั วงจรขบั มอเตอรบ นแผงวงจร IPST-SE จงึ ไมสามารถทาํ การทดสอบคาํ ส่ัง analogWrite ให เห็นได ผูใชงานสามารถนําสัญญาณท่ีไดจากคําส่ังน้ีไปใชในการปรับความสวางของ LED หรือตอ ขยายกระแสเพอื่ ตอ ปรบั ความเรว็ ของมอเตอรไ ด หลงั จากเรยี กใชคําส่ังน้แี ลว ทขี่ าพอรต ที่กําหนดจะ มสี ญั ญาณ PWM สง ออกมาอยางตอเนอ่ื ง จนกวา จะมีการเรียกคําส่งั analogWrite (หรอื เรยี กคําสั่ง digitalRead หรือ digitalWrite ทข่ี าเดียวกัน) analogWrite(pin, value) รปู ท่ี 3-6 ไดอะแกรมแสดงกลไกการทาํ งานเพอ่ื สรา งสญั ญาณ PWM ของ Arduino และแผงวงจร IPST-SE
Arduino IDE71 ตัวอยา งท่ี 3-9 int ledPin = 19; // ตอแผงวงจร ZX-LED เขา ทพ่ี อรต 19 int analogPin = 0; // ตอแผงวงจร ZX-POT เขา ทพี่ อรต อนิ พตุ A0 int val = 0; // กาํ หนดตวั แปรรับคาอะนาลอก int threshold = 512; // กาํ หนดคา อา งองิ v{v{}ooiidd setup() // เกบ็ ขอ มลู ทอ่ี า นไดจ ากอนิ พตุ อะนาลอกลงในตวั แปร loop() val = analogRead(analogPin); analogWrite(ledPin, val / 4); // ปรบั คาที่ไดจ ากการแปลงสญั ญาณ 0 ถึง 1023 // เปน คา 0 ถึง 255 แลวสง ไปยังพอรต เอาตพตุ อะนาลอก } ตัวอยา งน้ีเปน การควบคุมความสวา งของ LED ทตี่ อกบั พอรต 19 ใหเ ปน ไปตามคา ที่อา นไดจากแผงวงจร ZX-POT (แผงวงจรตัวตานทานปรบั คา ได) ทต่ี อกบั พอรต A0 3.5 ฟง กชน่ั พอรต อนิ พตุ เอาตพ ตุ ขน้ั สงู (Enhanced I/O) 3.5.1 shiftOut(dataPin, clockPin, bitOrder, value) เปนฟง กชั่นสําหรบั เล่ือนขอ มลู ขนาด 1 ไบต (8 บิต) ออกจากขาพอรต ที่กําหนดไว สามารถ กําหนดไดวา จะใหเ ร่ิมเล่ือนบติ ขอมลู จากบิตที่มคี วามสาํ คัญสงู สดุ (MSB หรอื บติ ซายสุด) หรอื บติ ท่ีมคี วามสาํ คัญต่ําสดุ (LSB - บติ ขวาสุด) โดยบิตของขอมลู จะออกที่ขา dataPin และใชอ กี หนง่ึ ขาคือ clockPin เปนตัวกําหนดจังหวะการเลื่อนขอมูล การสง ขอ มลู วธิ ที ว่ี า นเี้ รยี กวา การสง ขอ มลู อนกุ รมแบบโปรโตคอลซงิ โครนสั ซงึ่ เปน วธิ ที วั่ ไป ทไ่ี มโครคอนโทรเลอรใ ชต ดิ ตอ กบั ตวั ตรวจจบั หรอื ไมโครคอนโทรลเลอรต วั อนื่ อปุ กรณท ง้ั สองตวั ตอ ง ทาํ งานประสานกนั (ซงิ โครไนซก นั ) และตดิ ตอ กนั ทคี่ วามเรว็ สงู สดุ เนอื่ งจากอปุ กรณท งั้ สองตวั จะใช สญั ญาณนาฬกิ าเดยี วกนั จะเรยี กชอ่ื อกี อยา งวา เปน การสอื่ สารแบบSPI(synchronousperipheralinterface) พารามเิ ตอร dataPin - พอรต ทกี่ าํ หนดใหเ ปน เอาตพตุ เพอ่ื สงขอ มูลออก (ตัวแปรชนิด int) clockPin - พอรต ทกี่ าํ หนดใหท าํ หนา ทส่ี ง สญั ญาณนาฬกิ าเพอื่ กาํ หนดจงั หวะการเลอ่ื นขอ มลู ของ dataPin bitOrder - กาํ หนดลาํ ดบั การเลอ่ื นบิตขอ มูล เลอื กไดว า เปน MSBFIRST หรอื LSBFIRST value - ไบตขอ มูลทต่ี องการสง แบบอนุกรม พอรต ทเ่ี ปน dataPin และ clockPin จะตอ งกาํ หนดใหเ ปน เอาตพ ตุ กอ น ดว ยการเรยี กใชฟ ง กช น่ั pinMode
72 Arduino IDE การเขียนโปรแกรมทผ่ี ิดพลาดที่พบบอ ยของฟงกช น่ั shiftOut เน่ืองจากฟง กชน่ั น้สี ามารถสง ขอมลู ไดค รัง้ ละ 1 ไบต (8 บติ ) เทาน้ัน ถา เปนตัวแปร int หนง่ึ ตัวเก็บขอมลู ขนาด 2 ไบต (16 บติ ) ทาํ ใหไมส ามารถสง คาไดโ ดยใชคําสัง่ นี้เพยี งคร้ังเดียว ถาสง่ั เพยี ง คร้ังเดียว คาที่ไดจะผิดพลาด ดังตัวอยางโปรแกรมที่ผิดพลาดตอไปน้ี ตัวอยา งที่ 3-10 int data; int clock; int cs; ... digitalWrite(cs, LOW); data = 500; shiftOut(data, clock, MSBFIRST, data) digitalWrite(cs, HIGH); ขอ มูลทต่ี องการเลอ่ื นเทา กับ 500 ดงั นน้ั จงึ มขี นาด 2 ไบต (เพราะ 1 ไบตเกบ็ คาไดส ูงสดุ 256 คา ) แต เนื่องจากในโปรแกรมเลอ่ื นเพยี ง 1 ไบต คา ท่ีไดจ งึ เทา กับ 244 เนื่องจากขอ มูล 8 บิตบนของตวั แปร data มี คา เทา กับ 244 ในตัวอยางท่ี 3-11 เปน การแกไขโปรแกรมเพอ่ื ใหส ามารถเลือ่ นขอมูลไดอยางถกู ตอง ตัวอยางที่ 3-11 ในกรณีทต่ี องการเลอื่ นบิต MSB กอ น เขยี นโปรแกรมไดด งั น้ี data = 500; shiftOut(data, clock, MSBFIRST, (data >> 8)); // เลอ่ื นขอ มูลไบตสงู shiftOut(data, clock, MSBFIRST, data); // เลอ่ื นขอ มลู ไบตต าํ่ ในกรณีทตี่ องการเลอื่ นบติ LSB กอ น เขยี นโปรแกรมไดดงั นี้ data = 500; shiftOut(data, clock, MSBFIRST, data); // เลอ่ื นขอ มลู ไบตต า่ํ shiftOut(data, clock, MSBFIRST, (data >> 8)); // เลอื่ นขอ มูลไบตสงู 3.5.2 unsigned long pulseIn(pin, value) ใชอานคาบเวลาของพัลส (ไมวาเปน HIGH หรือ LOW) ที่เกิดขึ้นท่ี pin (ขาพอรตอินพุต ดิจิตอล) ทก่ี ําหนด เชน ถากาํ หนด value เปน HIGH คําสั่ง pulseIN() จะรอใหข าทกี่ ําหนดไวม ีสถานะ เปน HIGH เพอ่ื เรมิ่ จบั เวลา และจบั เวลาตอไปจนกวาสถานะของขานั้นจะเปน LOW จงึ หยุดจับเวลา คาที่ฟงกช่ันคืนกลับมาเปนคาบเวลาของพัลสในหนวยไมโครวินาที แสดงการทํางานในรูปที่ 4 - 4
Arduino IDE73 value = HIGH value = LOW เร่มิ การนับเวลา เร่มิ การนับเวลา หยดุ การนบั เวลา หยุดการนับเวลา รปู ท่ี 3-7 การทาํ งานของฟง กช น่ั pulseIn คาฐานเวลาของฟงกช่ันประมาณคาไดจากการทดลอง และอาจผิดพลาดไดในกรณีท่ีพัลสมี ความกวางมาก ฟง กชัน่ นี้ทาํ งานไดดีกับสญั ญาณพลั สท่ีมคี าบเวลา 10 ไมโครวินาทถี งึ 3 นาที พารามเิ ตอร pin - ขาพอรต ทต่ี องการอานคา คาบเวลาพลั ส (ตัวแปรชนิด int) value - ระดบั สญั ญาณทตี่ องการตรวจจบั กาํ หนดเปน HIGH หรอื LOW (ตัวแปรชนิด int) โดย HIGH คอื ลอจกิ สงู และ LOW คอื ลอจกิ ตา่ํ คาที่สงกลับจากฟงกช่ัน คาบเวลาของพลั สใ นหนว ยไมโครวนิ าที ตัวอยา งที่ 3-12 int pin = 18; unsigned long duration; void setup() { pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); } ฟง กช ั่นน้ีไมม ีกลไกการหมดเวลา ถาไมม ีพลั สเ กดิ ขึน้ จะวนรอไปตลอดเวลา ทาํ ใหโ ปรแกรมคางได
74 Arduino IDE 3.6 ฟง กชนั่ เกี่ยวกบั เวลา (Time) 3.6.1 unsigned long millis() คนื คา เปน คา เวลาในหนว ยมลิ ลวิ นิ าที นบั ตง้ั แตไ มโครคอนโทรลเลอรเ รมิ่ รนั โปรแกรมปจ จบุ นั คา ทสี่ ง กลบั จากฟง กช น่ั คา เวลาในหนวยเปน มิลลิวนิ าทีต้ังแตเรม่ิ รนั โปรแกรมปจ จบุ ัน คนื คาเปน unsigned long คา ตัวเลขจะเกิด การโอเวอรโ ฟลว (คาเกนิ แลว กลบั เปนศูนย) เมอ่ื เวลาผา นไปประมาณ 9 ชั่วโมง ตัวอยา งที่ 3-13 // อา นคาเวลา // แสดงคา เวลา long time; }v{v{ ooSSiideedrrlsiioaaelolt..uppbpr(e)i(gn)itn(“(T9i6m0e0:);“); time = millis(); Serial.println(time); Serial.flush(); delay(1000); } 3.6.2 delay(ms) เปน ฟง กช นั่ ชะลอการทาํ งาน หรอื หนว งเวลาของโปรแกรมตามเวลาทก่ี าํ หนดในหนว ยมลิ ลวิ นิ าที พารามเิ ตอร ms - ระยะเวลาทต่ี องการหนวงเวลา หนวยเปน มิลลวิ นิ าที (1000 ms เทา กบั 1 วนิ าท)ี ตัวอยา งที่ 3-14 // ตอแผงวงจร ZX-LED กบั พอรต 29 int ledPin = 29; // กาํ หนดเปนพอรต เอาตพตุ void setup() { // ขบั LED // หนวงเวลา 1 วนิ าที pinMode(ledPin, OUTPUT); // ดบั LED } // หนวงเวลา 1 วนิ าที void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
Arduino IDE75 3.6.3 delayMicroseconds(us) เปน ฟง กช นั่ ชะลอการทาํ งาน หรอื หนว งเวลาของโปรแกรมตามเวลาทก่ี าํ หนดในหนว ยไมโคร วินาที เพ่ือใหหนวงเวลาไดอยางแมนยํา ฟงกช่ันนี้จะหยุดการทํางานของอินเตอรรัปต ทําให การทาํ งานบางอยา ง เชน การรบั ขอ มลู จากพอรต อนกุ รม หรอื การเพมิ่ คา ทจี่ ะสง กลบั คนื โดยฟง กช นั่ milis()จะไมเ กดิ ขน้ึ ดงั นน้ั ควรจะใชฟ ง กช น่ั นสี้ าํ หรบั การหนว งเวลาสนั้ ๆถา ตอ งการหนว งเวลานานๆ แนะนาํ ใหใ ชฟ ง กช นั่ delay() แทน พารามเิ ตอร us - คา หนว งเวลาในหนว ยไมโครวนิ าที (1000 ไมโครวนิ าที = 1 มลิ ลวิ นิ าที และหนงึ่ ลา นไมโครวนิ าที = 1 วนิ าท)ี ตัวอยา งท่ี 3-15 int outPin = 29; // ตอแผงวงจร ZX-LED กบั พอรต 29 void setup() // กาํ หนดเปน พอรตเอาตพตุ { // ขบั LED pinMode(outPin, OUTPUT); } void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50); // หนวงเวลา 50 ไมโครวนิ าที digitalWrite(outPin, LOW); // ดบั LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวนิ าที } จากตัวอยางนี้ กาํ หนดใหพอรต 29 ทาํ งานเปนเอาตพตุ เพอ่ื สง สญั ญาณพลั สสี่เหล่ียมท่ีมีคาบเวลา 100 ไมโครวนิ าที คําเตือน ฟงกชั่นนี้ทํางานอยางแมนยําในชวงตั้งแต 3 ไมโครวินาทีข้ึนไป ไมอาจประกันไดวา ฟงกชั่น delayMicroseconds นจี้ ะทาํ งานไดอ ยา งเทย่ี งตรงสาํ หรบั คา หนว งเวลาทตี่ ่ํากวา น้ี
76 Arduino IDE 3.7 ฟง กช น่ั ทางคณติ ศาสตร 3.7.1 min(x, y) หาคาตัวเลขท่ีนอยท่ีสุดของตัวเลขสองตัว พารามเิ ตอร x - ตัวเลขตัวแรก เปน ขอ มูลประเภทใดกไ็ ด y - ตัวเลขตัวทสี่ อง เปน ขอ มูลประเภทใดกไ็ ด คาที่สงกลับจากฟงกชั่น คา ทนี่ อยทส่ี ดุ ของตวั เลขสองตวั ทใี่ ห ตัวอยา งที่ 3-16 sensVal = min(sensVal, 100); ตัวอยา งน้ีจะไดค า ของ sensVal ท่ีไมเ กนิ 100 กลบั จากฟง กช ั่น 3.7.2 max(x, y) หาคาตัวเลขที่มากที่สุดของตัวเลขสองตัว พารามเิ ตอร x - ตัวเลขตัวแรก เปน ขอ มูลประเภทใดกไ็ ด y - ตัวเลขตัวทสี่ อง เปน ขอ มูลประเภทใดกไ็ ด คาที่สงกลับจากฟงกช่ัน คา ทมี่ ากทส่ี ดุ ของตวั เลขสองตวั ทใ่ี ห ตัวอยา งที่ 3-17 sensVal = max(senVal, 20); จากตัวอยางนี้ คา ของ sensVal จะมคี า อยางนอย 20 3.7.3 abs(x) หาคาสมั บรู ณ (absolute) ของตัวเลข พารามเิ ตอร x - ตัวเลข คาที่สงกลับจากฟงกชั่น x เมื่อ x มีคา มากกวาหรอื เทา กับศูนย (x มีคา เปน บวกหรือศนู ย) -x เมื่อ x มีคา นอยกวา ศูนย (x มีคา ติดลบ)
Arduino IDE77 3.7.4 constrain(x, a, b) ปดคาตัวเลขที่นอยกวาหรือมากกวาใหอยูในชวงท่ีกําหนด พารามเิ ตอร x - ตัวเลขทตี่ องการปด คา ใหอ ยใู นชวงทก่ี าํ หนด สามารถเปน ขอ มูลชนิดใดกไ็ ด a - คา ต่ําสดุ ของชวงทก่ี าํ หนด b - คา สูงสุดของชวงทก่ี าํ หนด คาท่ีสงกลับจากฟงกช่ัน x เม่ือ x มีคาอยูระหวา ง a และ b a เม่ือ x มีคานอยกวา a b เมอื่ x มีคา มากกวา b ตัวอยา งท่ี 3-18 sensVal = constrain(sensVal, 10, 150); จากตัวอยา งน้ี คา ของ sensVal จะอยูในชวง 10 ถึง 150
78 Arduino IDE 3.8 ฟง กชนั่ เก่ยี วกบั ตวั เลขสุม 3.8.1 randomSeed(seed) ใชกําหนดตัวแปรสําหรบั สรางตัวเลขสุม โดยสามารถใชตัวแปรไดหลากหลายรปู แบบ โดย ท่ัวไปจะใชคาเวลาปจจุบัน (จากฟงกช่ัน )milis() แตสามารถใชคาอยางอน่ื ได เชน คาที่ไดเมอื่ ผู ใชกดสวิตช หรือคาสัญญาณรบกวนที่อานไดจากขาอินพุตอะนาลอก พารามเิ ตอร seed เปน คาตัวเลขแบบ long int ตัวอยางที่ 3-19 long randNumber; void setup() { Serial.begin(9600); } void loop() { randomSeed(analogRead(0)); randNumber = random(300); Serial.println(randNumber); } ในตวั อยา งนี้ กาํ หนดใหเ กดิ การสมุ ตัวเลขเมอ่ื อานคาจากอนิ พุตอะนาลอกชอง 0 ยา นของตวั เลขสุมคือ 0 ถึง 300 เมอื่ สุม ตัวเลขแลว ใหแ สดงคา น้ันที่หนาตาง Serial Monitor
Arduino IDE79 3.8.2 long random(max), long random (min,max) ใชส รา งตวั เลขสมุ เสมอื น (pseudo-random numbers) เพอื่ นาํ ไปใชใ นโปรแกรม กอ นใชฟ ง กช น่ั นี้จะตองเรียกใชฟงกชั่น randomSeed() กอน พารามเิ ตอร min กาํ หนดคา ตวั เลขสมุ ไมนอ ยกวา คา นี้ (เปน ออปชน่ั เพม่ิ เตมิ ) max กาํ หนดคา สงู สดุ ของตวั เลขสุม คา ทสี่ ง กลบั จากฟง กช น่ั คนื คาเปน ตัวเลขสุม ในชวงทกี่ าํ หนด (เปน ตัวแปร long int) ตัวอยางที่ 3-20 // สุมคาจากการอานคาอนิ พุตอะนาลอก // สุมคาในชวง 50 ถึง 300 long randNumber; void setup() { Serial.begin(9600); } void loop() { randomSeed(analogRead(0)); randNumber = random(50,300); Serial.println(randNumber); Serial.flush(); delay(50); } เมอื่ รนั โปรแกรมนี้ คา ท่ีไดจ ากจะอยใู นชวง 50 ถึง 300 แมว า จะปรบั คาแรงดันอนิ พุตทพี่ อรต A0 เปน 0 หรอื +5V (ซง่ึ ปกติมีคา 0 ถึง 1023) ทง้ั นเ้ี ปน ผลมาจากฟง กช ั่น random(min,max)
80 Arduino IDE 3.9 ฟง กชนั่ เกี่ยวกบั อินเตอรร ปั ตจ ากภายนอก ใชร ะบวุ า เมอื่ เกดิ การอนิ เตอรร ปั ตจ ากภายนอกจะใหโ ปรแกรมกระโดดไปยงั ฟง กช นั่ ใด หรอื ถอดการระบุฟงกช่ัน 3.9.1 การอนิ เตอรรัปต (interrupt) หรอื การขดั จงั หวะการทาํ งานของซพี ยี ู นบั เปน คณุ สมบตั ทิ ตี่ อ งมใี นไมโครคอนโทรลเลอรส มยั ใหมและเปนคุณสมบัติท่ีมีบทบาทสําคัญอยางมาก ในขณะที่ระบบกําลังทําการลําเลียงขวดไปตาม สายพานเพอื่ ทาํ การบรรจนุ า้ํ ยา แลว เกดิ เหตกุ ารณข วดหมด จงึ ตอ งมกี ารขดั จงั หวะกระบวนการบรรจุ นาํ้ ยาชวั่ ขณะ จนกวา จะจดั หาขวดเขา มาในระบบเปน ทเี่ รยี บรอ ย กระบวนการทาํ งานกจ็ ะดาํ เนนิ ตอ ไป จากตัวอยางดังกลาว ถาเปรียบเทียบกับโปรแกรมควบคุมของไมโครคอนโทรลเลอร ระบบ ลําเลียงขวดเพ่ือบรรจุนํ้ายาเปรียบไดกับโปรแกรมหลัก เหตุการณขวดหมดคือ เง่ือนไขของการเกิด อินเตอรรัปตท่ีเปนจริง ทําใหเกิดอินเตอรรัปตขึ้น การจัดหาขวดมาเพิ่มเติมเปรียบไดกับซีพียู กระโดดออกจากโปรแกรมหลกั ไปทํางานท่ีโปรแกรมยอยบรกิ ารอนิ เตอรรปั ต เพอ่ื จดั หาขวด นั่นคือ เสร็จส้ินการบริการอินเตอรรัปต ซีพียูก็จะกระโดดกลับมาทํางานที่โปรแกรมหลักตอไป ระบบ สายพานลําเลียงก็จะทํางานตอไปตามปกติ 3.9.2 อินพตุ รบั สญั ญาณอนิ เตอรร ปั ต แผงวงจร IPST-SE มอี นิ พตุ สาํ หรับรับสญั ญาณอนิ เตอรร ัปตจากภายนอก 3 ขาคือ INT0 ถึง INT2 ซ่ึงตรงกับขาพอรต 2, 3 และ 18 ตามลําดบั ซึ่งใชงานรว มกบั ขา RxD, TxD (ขารบั สง ขอมูล อนกุ รม UART1) และขาพอรต อนิ พตุ เอาตพ ตุ ดิจติ อลปกติ 3.9.3 attachInterrupt(interrupt, function, mode) ใชระบุวา เมื่อขาอินพตุ ที่รบั สัญญาณอินเตอรร ปั ตจากภายนอกมีการเปลีย่ นแปลงจะกําหนด ใหซ พี ยี กู ระโดดไปยงั ฟง กช นั่ ใด โดยแผงวงจรหลกั IPST-SE มขี าอนิ พตุ รบั สญั ญาณอนิ เตอรร ปั ตจ าก ภายนอก 3 ขาคือ INT0 ถงึ INT2 ซง่ึ ตรงกบั พอรต 2,3, และ 18 ตามลําดับ ท้ังยังตรงกับพอรต UART1 ดวย (เฉพาะขา 2-RxD และขา 3 - TxD) ดังนัน้ หากเลอื กใชง านอนิ พตุ อนิ เตอรร ปั ต ก็จะใชงานพอรต อนกุ รม UART1 เพอ่ื ตดิ ตออปุ กรณภ ายนอกไมได (หากใช INT0 และ INT1) หมายเหตุ เมอ่ื เกดิ การอนิ เตอรรปั ตข น้ึ จะไมสามารถเรยี กใชฟง กช ่ัน milis() และ delay() ได เมอื่ เกดิ การตอบสนอง อินเตอรร ปั ตแ ลว ดงั นน้ั ขอ มูลทเ่ี ขา มาทางพอรต UART1 อาจสญู หายได
Arduino IDE81 พารามเิ ตอร Interrupt - หมายเลขของชองอินพตุ อินเตอรร ปั ต (เปน int) function - ฟง กช ่ันทจี่ ะกระโดดไปทาํ งานเมื่อเกดิ อนิ เตอรร ปั ต ไมรบั คา พารามิเตอรแ ละไมมีการคนื คา mode - เลอื กประเภทสัญญาณทใ่ี ชกระตุนใหเ กดิ การอนิ เตอรร ปั ต LOW เกดิ อนิ เตอรรปั ตเ มอื่ ขาสัญญาณเปน ลอจิก “0” CHANGE เกดิ อนิ เตอรร ปั ตเ มอื่ มีการเปลยี่ นแปลงลอจกิ RISING เกดิ อินเตอรรปั ตเ มอ่ื มีการเปลย่ี นลอจิก “0” เปน “1” FALLING เกดิ อินเตอรร ปั ตเ มอ่ื มีการเปลย่ี นลอจิก “1” เปน “0” ตัวอยางที่ 3-21 int pin = 17; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } ตัวอยา งน้ีเลอื กอนิ พุตอนิ เตอรร ปั ตช อง 0 กาํ หนดใหไ ปทาํ งานทฟ่ี ง กช ่ัน blink เมอื่ เกดิ อนิ เตอรรปั ตข น้ึ 3.9.4 detachInterrupt(interrupt) ยกเลิกการอินเตอรรัปต พารามเิ ตอร Interrupt - หมายเลขของชองอนิ พตุ อนิ เตอรร ปั ตทต่ี องการยกเลกิ (คา เปน 0 ถึง 3)
82 Arduino IDE
ความรเู้ ก่ยี วกับภาษา C/C++ Arduino IDEและฟงั ก์ช่ันของ สำ�หรับชดุ กล่องสมองกล หนงั สือเล่มน้ีเป็นส่วนหนงึ่ ของชุดกล่อง สมองกล IPST-MicroBOX Seconday Edition [SE] โดยใช้ประกอบในการเรยี นรู้ และฝึกฝนเกยี่ วกบั การเขยี นโปรแกรม ภาษา C/C++ เพอื่ นำ� มาพัฒนาโปรแกรม สำ� หรับกำ� หนดและควบคุมการท�ำงานของ แผงวงจรต่างๆ ในชดุ กลอ่ งสมองกล IPST-MicroBOX [SE] www.ipst-microbox.com
Search