เอกสารประกอบการอบรม การเขียนโปรแกรมเพ่ือควบคมุ Arduino ธวทั ชัย สุวรรณพงค์ สาขาวชิ าการจัดการเทคโนโลยีสารสนแทศ คณะพาณชิ ยศาสตรแ์ ละการจัดการ มหาวิทยาลยั สงขลานครินทร์ วทิ ยาเขตตรงั
การเขียนโปรแกรมเพ่อื ควบคมุ Arduino * ใช้สำหรับอบรมให้กับนักศึกษำ สำขำวิชำกำรจดั กำรเทคโนโลยีสำรสนเทศ เท่ำนัน้ ปรบั ปรงุ มีนำคม 2562
สารบัญ หน้า เรือ่ ง 1 10 Arduino Uno 13 กำรทดลองที่ 1 กำรเชอื่ มต่อ Arduino และกำรเขียนโปรแกรมเบ้ืองตน้ 16 กำรทดลองที่ 2 Light Emitting Diode (LED) 19 กำรทดลองที่ 3 Push Button Switch 21 กำรทดลองท่ี 4 Piezoelectric (Buzzer) 23 กำรทดลองที่ 5 Sound Detection 25 กำรทดลองท่ี 6 Temperature and Humidity 29 กำรทดลองท่ี 7 7-Segment LED 33 กำรทดลองท่ี 8 Dot Matrix LED 37 กำรทดลองท่ี 9 Water Sensor 41 กำรทดลองท่ี 10 Relay Module 45 กำรทดลองที่ 11 Pulse Width Modulation 47 กำรทดลองท่ี 12 Servo Motor 50 กำรทดลองท่ี 13 Joystick Module 53 กำรทดลองท่ี 14 Serial Communication 57 กำรทดลองที่ 15 Ethernet Shield แหล่งข้อมลู เกยี่ วกบั Arduino
Arduino Uno คณุ สมบตั ิ Microcontroller ATmega328P Operating Voltage 5V Input Voltage (recommended) 7 – 12 V Input Voltage (limit) 6 – 20 V Digital I/O Pins 14 (of which 6 provide PWM output) PWM Digital I/O Pins 6 Analog Input Pins 6 DC Current per I/O Pin 20 mA DC Current for 3.3V Pin 50 mA Flash Memory 32 KB (ATmega328P) of which 0.5 KB used by bootloader SRAM 2 KB (ATmega328P) EEPROM 1 KB (ATmega328P) Clock Speed 16 MHz LED_BUILTIN 13 Length 68.6 mm Width 53.4 mm Weight 25 g ทมี่ ำ: https://store.arduino.cc/usa/arduino-uno-rev3 สำหรบั บอรด์ แบบอนื่ ๆ ของ Arduino ดูได้จำก https://store.arduino.cc/usa/ Page | 1
การเชือ่ มต่อกบั วงจรภายนอก บอร์ด Arduino Uno ประกอบดว้ ยจุดเชือ่ มต่อ และชิ้นสว่ นทสี่ ำคญั ได้แก่ - จุดเชื่อมตอ่ แรงดันอ้ำงอิง (AREF) - จุดเชอ่ื มต่อกรำวด์สญั ญำณดิจติ อล (GND) - จดุ เชื่อมตอ่ สัญญำณดิจติ อลสำหรับรับ-ส่งข้อมลู ทั่วไป (GPIO 2-13) - จดุ เชอ่ื มตอ่ สัญญำณดิจติ อล 0-1 (GPIO 0-1) หรอื Serial In/Out หรือ TX/RX จดุ เชอ่ื มต่อเหล่ำนี้ไม่ สำมำรถใช้รบั -ส่งข้อมลู ทว่ั ไปเหมอื น GPIO 2-13 (เช่น คำส่งั digitalRead หรอื digitalWrite) แต่ใช้ได้ เฉพำะคำสง่ั ทเ่ี กีย่ วข้องกับกำรสอ่ื สำรแบบอนุกรม (เช่น คำส่ัง Serial.begin) - จุดเชื่อมต่อสำหรบั In-circuit Serial Programmer (ICSP) - จดุ เชื่อมตอ่ สัญญำณแอนะล็อก ADC 0-5 - จดุ เชื่อมตอ่ แรงดนั ไฟฟ้ำและกรำวด์ (POWER) - จดุ ตอ่ แหล่งจำ่ ยไฟภำยนอก (External Power Supply In 7-12 VDC) Page | 2
- พอร์ท USB (Type B) สำหรับรบั -ส่งขอ้ มลู ระหวำ่ งบอร์ดกับ Arduino IDE รวมท้ังจ่ำยไฟใหก้ ับบอร์ด - ปุ่มรเี ซต็ (Reset Button) Arduino IDE ใช้สำหรับเขยี นโปรแกรมเพื่อควบคุมบอรด์ Arduino (รองรบั เฉพำะภำษำ C/C++) สำมำรถดำวน์โหลดได้ ท่ี https://www.arduino.cc/en/Main/Software สำหรับกำรตดิ ต้งั โปรแกรมในห้องปฏิบัติกำร ให้ใช้ตัวเลอื ก Windows Installer, for Windows XP and up (ไฟล์ arduino-1.8.8-windows.exe) การติดตั้งและใชง้ าน Arduino IDE ให้ติดตั้งตำมปกติเหมือนโปรแกรมทว่ั ไป จำกนั้นเรียก arduino.exe ขึ้นมำเพื่อเร่ิมต้นเขยี นโปรแกรม กรณี ทต่ี อ้ งกำรกำหนดคำ่ ตำ่ ง ๆ ใหก้ บั Arduino IDE ใหเ้ ขำ้ ไปทเ่ี มนู File | Preferences เพือ่ ระบุตำแหนง่ ท่เี กบ็ โปรแกรม (Sketchbook Locations) ตง้ั ขนำดตัวอกั ษร (Editor Font Size) ต้ังคำ่ เกีย่ วกบั ระบบเครือข่ำย (Network) หรอื อ่นื ๆ ตำมควำมตอ้ งกำร Page | 3
Page | 4
การเขียนโปรแกรม โปรแกรมควบคุมบอรด์ Arduino แบ่งออกเป็น 2 ส่วน ประกอบดว้ ย 1) Setup โปรแกรมที่อยู่ใน setup() จะทำงำนเพียงครั้งเดียว สว่ นใหญค่ ือตั้งคำ่ กำรสื่อสำร กำรกำหนดสถำนะ ใหก้ บั พอร์ทตำ่ ง ๆ ดังตวั อยำ่ ง #define LED 8 #define SWITCH 9 void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); pinMode(SWITCH, INPUT); } 2) Loop โปรแกรมในฟังก์ชนั loop() จะทำงำนซำ้ ไปเรื่อย ๆ ตรำบเทำ่ ท่ียงั จำ่ ยพลังงำนไฟฟำ้ ให้กับบอร์ด ส่วน รูปแบบและวธิ กี ำรเขยี นโปรแกรมขึน้ อยกู่ บั ควำมต้องกำรใช้งำนเป็นหลัก รวมท้ังตอ้ งสัมพันธก์ ันระหว่ำงฮำรด์ แวร์ และซอฟตแ์ วร์ void loop() { if (SWITCH == HIGH) { delay(200); if (SWITCH == HIGH) { digitalWrite(LED, HIGH); digitalWrite(LED_BUILTIN, HIGH); Serial.println(\"LED On!\"); } else { digitalWrite(LED, LOW); digitalWrite(LED_BUILTIN, HIGH); Serial.println(\"LED Off!\"); } } delay(200); } Page | 5
การสัง่ โปรแกรมทางาน ผู้ใช้สำมำรถทดสอบโปรแกรมที่เขียนเสร็จแล้วโดยกำรเลอื กเมนู Sketch | Verify/Compile (หรือใชค้ ีย์ลดั Ctrl + R) หรือสง่ โปรแกรมไปยงั บอร์ด Arduino โดยเลอื กจำกเมนู Sketch | Upload (หรือใช้คีย์ลัด Ctrl + U) ถ้ำ ตอ้ งกำรสง่ ข้อควำมจำกบอรด์ ไปยัง Arduino IDE ผำ่ น Serial Monitor ให้เลอื กเมนู Tools | Serial Monitor (หรือ ใช้คยี ล์ ัด Ctrl + Shift + M) Page | 6
Arduino Shields ไดแ้ กบ่ อรด์ เสริมสำหรบั ขยำยควำมสำมำรถของ Arduino เพ่มิ เตมิ จำกที่มีอยู่ ตัวอย่ำงเช่น บอร์ดเช่อื มตอ่ ระบบเครือขำ่ ย (Ethernet Shield) บอร์ด Input/Output อเนกประสงค์ (Multifunctional Expansion Board) บอรด์ รองรบั กำรเชือ่ มตอ่ ตวั ตรวจจบั แบบต่ำง ๆ (Sensor Shield) Page | 7
บอร์ดบนั ทึก-เล่นไฟล์ MP3 (MP3 Shield) บอรด์ แสดงผลและปมุ่ ควบคุม (LCD Keypad Shield) บอรด์ สำหรบั ใช้สร้ำงวงจรตน้ แบบ (Prototype Shield) Page | 8
แผงต่อวงจรต้นแบบ (Breadboard/Protoboard) แผงต่อวงจรตน้ แบบ ใชส้ ำหรับวำงและเช่ือมต่ออปุ กรณ์ที่ใช้ในกำรทดลองต่ำง ๆ ถ้ำเป็นแผงทดลองขนำด กลำง (Half-size Breadboard มจี ำนวนจดุ เชอื่ มต่อไมเ่ กนิ 400 จุด) จะมโี ครงสรำ้ งกำรเชอ่ื มต่อดังรปู ตวั อย่ำง โดย สว่ นที่อยดู่ ำ้ นบนสดุ (A) และด้ำนลำ่ งสุด (B) จะเชือ่ มถึงกันในแนวนอน สว่ นทีอ่ ย่ตู รงกลำง (B และ C) จะเช่ือมถงึ กนั แนวต้งั ตวั อย่ำงกำรวำงอุปกรณ์ เช่น ถ้ำต้องกำรเชอ่ื มตอ่ สำยไฟ 2 เส้นเข้ำดว้ ยกัน โดยปลำยสำยเสน้ แรกตอ่ อยู่ ทจ่ี ุด A1 ปลำยสำยเสน้ ที่สองต้องต่อท่ีจดุ B1, C1, D1 หรอื E1 เทำ่ นัน้ A B C D Page | 9
การทดลองที่ 1 การเขยี นโปรแกรมเบ้ืองต้น อุปกรณ์ 1) บอร์ด Arduino UNO 2) สำย USB กำรทดลองน้ีเปน็ กำรสง่ ขอ้ ควำมจำกบอรด์ Arduino ไปแสดงผลท่ี Serial Monitor เริม่ จำกตอ่ สำย USB ทีใ่ ห้มำกับบอร์ดเขำ้ กบั พอรท์ USB ของเครือ่ งคอมพิวเตอร์ (Type A) สว่ นปลำยอกี ดำ้ นหนง่ึ (ปกตเิ ป็น Type B แต่ บอร์ดบำงรุ่นอำจเป็น Mini หรือ Micro USB) ให้ตอ่ เขำ้ กบั บอร์ด Arduino Uno (สงั เกตไดจ้ ำกไฟสีเขยี วบนบอร์ด จะสวำ่ งขนึ้ ) จำกน้นั เปิดโปรแกรม Arduino IDE เขำ้ ไปที่ Tools | Board เลอื ก Arduino/Genuino Uno และ เลือกพอร์ททม่ี องเห็นบอรด์ ดังรปู ตวั อย่ำง Page | 10
ท่ี Tool | Serial Monitor ใหต้ ั้ง Baud Rate ของกำรสอ่ื สำรอนุกรมเป็น 9600 (หรอื มำกกว่ำ) และทำ เครื่องหมำยถกู ท่ี Autoscroll จำกนน้ั เขยี นโปรแกรมทดสอบดงั ตัวอยำ่ งขำ้ งล่ำง (กรณีที่ต้ัง Baud Rate มำกกว่ำ 9600 ให้เปล่ยี นตวั เลข ในโปรแกรมให้ตรงกบั ที่ต้ังไว้) โปรแกรม 1 void setup() { Serial.begin(9600); } void loop() { Serial.println(\"Hello, world!\"); delay(1000); } Page | 11
ขน้ั ตอนต่อไป ท่โี ปรแกรม Arduino IDE เลอื กเมนู Sketch | Upload หรอื กดคยี ์ลัด Ctrl + U เพอื่ คอมไพล์ โปรแกรมและส่งโปรแกรมไปทบี่ อร์ด ถำ้ ไม่มอี ะไรผิดพลำด จะได้ผลกำรทำงำนดังรปู ลำ่ งสุด Page | 12
การทดลองที่ 2 Light Emitting Diode (LED) อุปกรณ์ 1) LED 1 หลอด 2) ตวั ตำ้ นทำน 330 โอห์ม 1 ตัว LED เป็นอปุ กรณส์ ำรกงึ่ ตวั นำ (Semiconductor Device) ชนิดหนง่ึ มีควำมสำมำรถในกำรเปลง่ แสงจำก กำรปลดปลอ่ ยพลังงำนของอิเลก็ ตรอนที่กระโดดขำ้ มรอยต่อ (P-N Junction) ในรปู ของคลน่ื แสง (Photon) โดยสี ของ LED ขึน้ อยู่กบั ชนดิ ของวัสดทุ ี่ใช้ทำเปน็ หลัก วงจร LED เบอื้ งตน้ ประกอบด้วย แหล่งจำ่ ยแรงดันไฟฟำ้ ไฟตรง (DC Voltage Source) หรือแบตเตอร่ี (Battery) ตัวต้ำนทำนไฟฟำ้ (Resistor) และ LED ทีต่ ้องต่อขัว้ ไฟฟำ้ ให้ ถกู ต้องจึงจะทำงำนได้ นอกจำกนน้ั อำจมสี วทิ ซ์ (Switch) ทำหนำ้ ทีค่ วบคุมกำรไหล-หยุดไหลของกระแสไฟฟ้ำ ตวั ตำ้ นทำน มีไวเ้ พื่อจำกัดกระแสไฟฟ้ำ (Current) ท่ีไหลผ่ำนอปุ กรณอ์ เิ ล็กทรอนิกส์ เพื่อไม่ใหเ้ กดิ อันตรำย แก่วงจร เนอ่ื งจำกกระแสไฟฟำ้ สูงเกินไปจะทำให้เกดิ ควำมร้อนสูงจำกกำรสูญเสยี กำลังไฟฟำ้ (Power) ค่ำคร่ำว ๆ ของตวั ต้ำนทำนหำได้โดยใช้ กฏของโอหม์ (Ohm’s Law) R = E / I เมอ่ื R คือควำมตำ้ นทำนไฟฟ้ำ (หนว่ ยคือ Ohm) E คอื แรงดนั ไฟฟำ้ (หนว่ ยคือ Volt) และ I คอื กระแสไฟฟำ้ (หนว่ ยคอื Ampere) Page | 13
ตวั อยำ่ ง LED ต้องกำรกระแสไฟฟ้ำในกำรทำงำน 15 mA ถ้ำนำ LED น้ีไปตอ่ กบั แรงดันไฟฟำ้ 5 V ตวั ตำ้ นทำนทใี่ ช้คือ 5 V / 15 mA = 333.33 โอหม์ (สมมมตุ ิว่ำ VLED = 0) หรอื ใชต้ ัวตำ้ นทำนมำตรฐำน 330 โอห์ม การเชอื่ มตอ่ อุปกรณ์ Page | 14
โปรแกรม 1 #define LED 8 #define DELAY_TIME 250 void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); delay(DELAY_TIME); digitalWrite(LED, LOW); delay(DELAY_TIME); } นอกจำกกำรต่อ LED ภำยนอกแล้ว สำมำรถใช้ Built-in LED บนบอร์ด (ตำแหนง่ แนวเดียวกับจดุ เช่อื มต่อ DIGITAL 13) เพื่อทำกำรทดลองได้ ดังโปรแกรมตวั อย่ำง โปรแกรม 2 #define DELAY_TIME 250 void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(DELAY_TIME); digitalWrite(LED_BUILTIN, LOW); delay(DELAY_TIME); } Page | 15
การทดลองท่ี 3 Push Button Switch อปุ กรณ์ 1) สวทิ ซแ์ บบกดติด-ปล่อยดบั (Push Button Switch) 1 ตวั 2) ตวั ต้ำนทำน 10 กิโลโอหม์ 1 ตวั (ก) วงจร Pull-down (ข) วงจร Pull-up วงจร Pull-down Resistor ในรูป (ก) ท่ใี ชส้ วิทซแ์ บบ SPST (Single Pole Single Throw) ปกติ ค่ำที่ อำ่ นได้จำกจดุ D จะเปน็ ลอจิก 0 เสมอ (LOW หรือ VD = GND) เม่อื สวทิ ซ์ถกู กด ระดบั ของลอจิกจะเปลีย่ นไปเปน็ 1 แทน (HIGH หรือ VD = 5 V) สว่ นวงจรแบบ Pull-up Resistor ในรูป (ข) ค่ำทีอ่ ่ำนได้จำก D จะเปน็ 1 เสมอ (VD = 5 V) เมอ่ื กดสวทิ ซ์ ระดบั ลอจิกทจี่ ดุ D จะเปลย่ี นไปเปน็ 0 (VD = GND) เนื่องกระแสไฟฟำ้ จะไหลจำกจดุ ท่มี ีควำม ต้ำนทำนสงู ไปยังจุดทมี่ ีควำมต้ำนทำนตำ่ ทำให้แรงดันตกครอ่ มสวทิ ซ์เป็นศนู ย์ กรณีของสวทิ ซ์แบบกดตดิ -ปล่อยดับ กำรตรวจสอบค่ำที่ D ควรทำซ้ำ 2 ครัง้ เนือ่ งจำกต้องให้แน่ใจว่ำสวิทซถ์ กู กดจริง ๆ (กำรกดเพยี งคร้งั เดยี วอำจทำให้ คำ่ ทอี่ ่ำนได้ไม่แน่นอน เน่ืองจำกกำรกระเด้งของหนำ้ สัมผัสหรือ Switch Debouncing) Page | 16
การเชอื่ มต่ออุปกรณ์ 1 โปรแกรม 1 // pull-down resistor circuit #define BUTTON 12 void setup() { pinMode(BUTTON, INPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); } void loop() { if (digitalRead(BUTTON) == HIGH) { delay(200); if (digitalRead(BUTTON) == HIGH) { digitalWrite(LED_BUILTIN, HIGH); } } else { digitalWrite(LED_BUILTIN, LOW); } } Page | 17
การเชอื่ มตอ่ อุปกรณ์ 2 โปรแกรม 2 // pull-up resistor circuit #define BUTTON 12 void setup() { pinMode(BUTTON, INPUT); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); } void loop() { if (digitalRead(BUTTON) == LOW) { delay(200); if (digitalRead(BUTTON) == LOW) { digitalWrite(LED_BUILTIN, HIGH); } } else { digitalWrite(LED_BUILTIN, LOW); } } Page | 18
การทดลองท่ี 4 Piezoelectric (Buzzer) อุปกรณ์ 1) Push Button Switch 1 ตวั 2) ตวั ตำ้ นทำน 10 กิโลโอหม์ 1 ตวั 3) Piezoelectric 1 ตัว การเช่ือมต่ออปุ กรณ์ Page | 19
Piezoelectric ทำงำนโดยป้อนควำมถ่ี 2,300 ± 500 Hz เข้ำไปท่ีขำ + (ส่วนขำ – ต่อลงกรำวด์) กำรสร้ำง ควำมถสี่ ำมำรถใช้วิธีกำรง่ำย ๆ เชน่ สรำ้ งลอจิก 0 และ 1 สลับกันไปที่จดุ เช่ือมต่อ DIGITAL 11 เมื่อกดสวทิ ซ์ จะได้ ยินเสียง Piezoelectric ดงั ข้ึน และจะหยุดสง่ เสยี งเมื่อปล่อยมือจำกสวิทซ์ สำหรับกำรต่อสวิทซ์จะใช้วงจร Pull-up ในกำรทดลองที่ 3 โปรแกรม #define BUTTON 12 #define BUZZER 11 void setup() { pinMode(BUTTON, INPUT); pinMode(BUZZER, OUTPUT); digitalWrite(BUZZER, LOW); } void loop() { if (digitalRead(BUTTON) == LOW) { delay(200); if (digitalRead(BUTTON) == LOW) { sound(); } } } void sound() { for (int i = 0; i < 80; i++) { digitalWrite(BUZZER, HIGH); delay(1); } digitalWrite(BUZZER, LOW); delay(1); } Page | 20
การทดลองท่ี 5 Sound Detection อปุ กรณ์ 1) LED 1 หลอด 2) ตัวตำ้ นทำน 330 โอหม์ 1 ตวั 3) Sound Detection Module 1 ช้นิ การเช่ือมตอ่ อุปกรณ์ Page | 21
Sound Detection Sensor ดงั รูปข้ำงต้น จะอำ่ นค่ำจำกจุดเชอ่ื มตอ่ ANALOG 0 (A0) เพื่อตรวจสอบ ระดบั เสยี งภำยนอก ถ้ำระดบั เสียงตำ่ กว่ำท่กี ำหนด LED จะดับ มิฉะนัน้ LED จะตดิ ค่ำควำมดังของเสียงนอกจำก แสดงผลด้วย LED แล้ว ยังนำไปแสดงผลใน Serial Monitor ของ Arduino IDE ด้วย (เลือก Tools | Serial Monitor หรอื กดคีย์ลดั Ctrl + Shift + M) โปรแกรม #define LED 8 #define SOUND A0 int value = 0; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); digitalWrite(LED, LOW); } void loop() { value = analogRead(SOUND); Serial.println(value); if (value < 100) { digitalWrite(LED, LOW); } else { digitalWrite(LED, HIGH); } delay(200); } Page | 22
การทดลองที่ 6 Temperature and Humidity อุปกรณ์ 1) Temperature and Humidity Sensor (DHT11) 1 ตวั การเชือ่ มตอ่ อปุ กรณ์ ก่อนทจี่ ะทำกำรเขียนโปรแกรม ให้ดำวนโ์ หลดไฟล์ DHTLib.zip มำเกบ็ ในเครื่องก่อน จำกนั้นเขำ้ ไปท่ีเมนู Sketch | Include Library | Add .ZIP Library… ของ Arduino IDE ตำมดว้ ยเลอื กไฟล์ท่ดี ำวน์โหลด Page | 23
เนอ่ื งจำก DHT11 จำกบำงผู้ผลติ อำจมีจำนวนขำ (เชน่ อำจมี 3 หรือ 4 ขำ) รวมทัง้ มีช่อื ขำสญั ญำณไม่ ตรงกนั ในกำรต่ออปุ กรณ์จึงขอให้ดวู ิธีกำรต่อขำสญั ญำณตำมตำรำงต่อไปนี้เป็นหลัก ขำสญั ญำณของตวั วัดอณุ หภมู ิ ขำสัญญำณที่บอร์ด Arduino VCC หรือ + 5V GND หรอื - GND A0 DATA หรอื out โปรแกรม #include <dht.h> #define DATA A0 dht DHT; void setup() { Serial.begin(9600); delay(500); Serial.println(\"DHT11 Humidity & temperature Sensor\\n\"); delay(1000); } void loop() { DHT.read11(DATA); Serial.print(\"Current humidity = \"); Serial.print(DHT.humidity); Serial.print(\"% \"); Serial.print(\"temperature = \"); Serial.print(DHT.temperature); Serial.println(\"C \"); delay(5000); } Page | 24
การทดลองท่ี 7 7-Segment LED อปุ กรณ์ 1) ตัวตำ้ นทำนขนำด 220 โอห์ม 1 ตวั 2) 7-Segment LED แบบ Common Anode 1 ตวั ตัวอย่ำงกำรออกแบบกำรแสดงผลบน 7-Segment กำรแสดงผล a b Segment f g cde “0” 1 1 1 1 1 1 0 “1” 0 1 1 0 0 0 0 “8” 1 1 1 1 1 1 1 Page | 25
การเชื่อมตอ่ อปุ กรณ์ Arduino I/O Segment ขำ D2 a 7 D3 b 6 D4 c 4 D5 d 2 D6 e 1 D7 f 9 D8 g 10 5V - 3, 8 Page | 26
โปรแกรม #define A 2 #define B 3 #define C 4 #define D 5 #define E 6 #define F 7 #define G 8 void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); } void loop() { for (int i = 0; i < 10; i++) { display(i); delay(500); } } void display (int n) { switch(n) { case 0: segment(1, 1, 1, 1, 1, 1, 0); break; case 1: segment(0, 1, 1, 0, 0, 0, 0); break; case 2: segment(1, 1, 0, 1, 1, 0, 1); break; case 3: segment(1, 1, 1, 1, 0, 0, 1); break; case 4: segment(0, 1, 1, 0, 0, 1, 1); break; case 5: segment(1, 0, 1, 1, 0, 1, 1); break; case 6: segment(1, 0, 1, 1, 1, 1, 1); break; case 7: segment(1, 1, 1, 0, 0, 0, 0); break; case 8: segment(1, 1, 1, 1, 1, 1, 1); break; case 9: segment(1, 1, 1, 1, 0, 1, 1); break; Page | 27
} } void segment (int a, int b, int c, int d, int e, int f, int g) { if (!a) { digitalWrite(A, HIGH); } else { digitalWrite(A, LOW); } if (!b) { digitalWrite(B, HIGH); } else { digitalWrite(B, LOW); } if (!c) { digitalWrite(C, HIGH); } else { digitalWrite(C, LOW); } if (!d) { digitalWrite(D, HIGH); } else { digitalWrite(D, LOW); } if (!e) { digitalWrite(E, HIGH); } else { digitalWrite(E, LOW); } if (!f) { digitalWrite(F, HIGH); } else { digitalWrite(F, LOW); } if (!g) { digitalWrite(G, HIGH); } else { digitalWrite(G, LOW); } } Page | 28
การทดลองที่ 8 Dot Matrix LED อปุ กรณ์ 1) Dot Matrix LED ขนำด 8x8 1 ตวั กำรแสดงผลดว้ ย 7-Segment LED อำจมีขอ้ จำกดั ตรงจำนวน/แบบ ของตวั เลขและตวั อกั ษร จึงได้มีกำร ออกแบบ Dot Matrix LED ขน้ึ เพอื่ เพ่ิมควำมหลำกหลำยในกำรแสดงผล กำรแสดงผลในทีน่ ี้ อำจเป็นได้ทั้ง ตัวเลข ตัวอักษร (ภำษำตำ่ ง ๆ) รวมถึงรปู ภำพอย่ำงง่ำย ขึ้นอยู่กับจินตนำกำรของผู้นำไปใช้ Page | 29
การเชอื่ มต่ออปุ กรณ์ โปรแกรมแรก เป็นกำรตรวจสอบจดุ (Dot) ในแต่ละแถวและคอลมั น์ (รวม 4 แถว 4 คอลัมน์) โดยแต่ละจดุ ซง่ึ แทนดว้ ย LED 1 หลอด จะติดและดบั สลบั กันไป โปรแกรม 1 void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } for (int i = 2; i <= 5; i++) { digitalWrite(i, HIGH); } } void loop() { for (int i = 2; i <= 5; i++) { Page | 30
digitalWrite(i, LOW); for (int j = 6; j <= 9; j++) { digitalWrite(j, HIGH); delay(100); digitalWrite(j, LOW); } digitalWrite(i, HIGH); } } โปรแกรมถดั ไป เป็นตวั อย่ำงกำรวนรอบเพ่ือแสดงผลตัวอักษร “I”, “o” และ “T” บนพ้ืนท่ีขนำด 4x4 จุด โดยระยะเวลำกำรเปลยี่ นตัวอักษรถูกกำหนดโดย TRANSITION ซ่งึ 1 รอบ จะใชเ้ วลำ 1 วินำที โดยประมำณ (คำ่ ของ TRANSITION คือ 2,900) โปรแกรม 2 #define TRANSITION 2900 int I[4][4] { {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0} }; int o[4][4] { {0, 0, 0, 0}, {1, 1, 1, 0}, {1, 0, 1, 0}, {1, 1, 1, 0} }; int T[4][4] { {1, 1, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0} }; void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } for (int i = 2; i <= 5; i++) { Page | 31
digitalWrite(i, HIGH); } } void loop() { show(I, TRANSITION); show(o, TRANSITION); show(T, TRANSITION); } void show (int x[4][4], int t) { for (int i = 0; i < t; i++) { writeDot(x); } } void writeDot (int x[4][4]) { for (int c = 0; c < 4; c++) { for (int r = 0; r < 4; r++) { digitalWrite(2 + c, LOW); digitalWrite(6 + r, x[r][c]); digitalWrite(6 + r, LOW); digitalWrite(2 + c, HIGH); } } } Page | 32
การทดลองท่ี 9 Water Sensor อุปกรณ์ 1) Water Level Sensor 1 ชุด 2) Tree Colors LED 1 ชดุ การเช่อื มตอ่ อปุ กรณ์ 1 ขอ้ ควรระวงั ! ให้จุ่ม Sensor เฉพำะส่วนท่เี ปน็ แถบยำว ๆ ลงนำ้ เท่ำน้นั สว่ นทเ่ี หลอื หำ้ มโดนน้ำอยำ่ งเดด็ ขำด! Page | 33
โปรแกรมแรก เป็นกำรอำ่ นค่ำระดบั น้ำจำก ANALOG 0 แลว้ นำคำ่ ทีไ่ ด้ไปแสดงผลใน Serial Monitor (กด คยี ์ Ctrl + Shift + M) โดยควำมสงู ของระดบั น้ำจะแปรผันกับคำ่ ที่อ่ำนได้ ท้ังน้ี พ้ืนทต่ี รวจระดบั น้ำของ Sensor ใน ชดุ ทดลอง มีควำมยำว 40 มลิ ลิเมตร สูง 16 มิลลเิ มตร (คณุ สมบัตขิ อง Water Level Sensor ร่นุ ที่ใช้ทดลอง ท่ีพบ ตำมเว็บไซตต์ ่ำง ๆ ไม่ได้ระบุควำมสงู เทยี บกับคำ่ ท่ีอ่ำนได้) โปรแกรม 1 #define SENSOR A0 int value = 0; void setup() { Serial.begin(9600); } void loop() { Serial.print(\"Water level Sensor Value: \"); value = analogRead(SENSOR); Serial.println(value); delay(1000); } โปรแกรมถัดไป เปน็ กำรแสดงระดบั นำ้ ดว้ ย LED สำมสี (RGB LED) โดย LED จะเปล่ยี นสเี ม่ือมรี ะดับนำ้ แตกตำ่ งกัน ดงั กำหนดในตำรำงข้ำงลำ่ ง ระดับนำ้ สี LED ตำ่ เขยี ว นำ้ เงิน ปำนกลำง แดง สงู Page | 34
การเชอ่ื มต่ออปุ กรณ์ 2 โปรแกรม 2 #define SENSOR A0 #define R_LED 2 #define G_LED 3 #define B_LED 4 int value = 0; void setup() { pinMode(R_LED, OUTPUT); pinMode(G_LED, OUTPUT); pinMode(B_LED, OUTPUT); } void loop() { value = analogRead(SENSOR); if (value > 560) { digitalWrite(R_LED, HIGH); digitalWrite(G_LED, LOW); digitalWrite(B_LED, LOW); } else if (value > 460) { Page | 35
digitalWrite(R_LED, LOW); digitalWrite(G_LED, LOW); digitalWrite(B_LED, HIGH); } else if (value > 220) { digitalWrite(R_LED, LOW); digitalWrite(G_LED, HIGH); digitalWrite(B_LED, LOW); } else { digitalWrite(R_LED, LOW); digitalWrite(G_LED, LOW); digitalWrite(B_LED, LOW); } delay(1000); } Page | 36
การทดลองท่ี 10 Relay Module อปุ กรณ์ 1) Push Button Switch 1 ตวั 2) ตัวตำ้ นทำน 10 กิโลโอหม์ 1 ตวั 3) Relay Module 1 ชุด 4) Temperature and Humidity Sensor 1 ตวั การเชื่อมต่ออุปกรณ์ 1 Page | 37
หลกั กำรทำงำนของ Relay คล้ำยกับกำรเปิด-ปิด LED น่ันคอื ส่งสญั ญำณ 1 หรอื 0 ไปยังพอร์ททีก่ ำหนด แตส่ ิ่งท่ีแตกตำ่ งกนั คือ Relay จะมีฝ่ังหน้ำสมั ผสั ไฟสูง (220 V) เพ่อื ใช้เป็นสวิทซ์เปดิ -ปิดอุปกรณ์ไฟฟำ้ เช่น หลอดไฟ พดั ลม หรอื เครอ่ื งไฟฟำ้ อน่ื ๆ โดยต้องมคี วำมระมัดระวังเป็นอยำ่ งย่งิ ในกำรต่อใช้งำน กำรนำ Relay ไปตอ่ กบั อุปกรณ์ไฟฟำ้ ทวั่ ไป มสี ิ่งที่ต้องพิจำรณำคือ ใชห้ นำ้ สัมผสั แบบปกติเปิด (Normally Open หรอื NO) หรอื ใชห้ นำ้ สัมผสั แบบปกตปิ ิด (Normally Closed หรอื NC) โดยท่ัวไปจะใช้แบบ NO ซงึ่ คล้ำย กับกำรต่อสวิทซไ์ ฟฟำ้ ภำยในบำ้ น (เปิดสวทิ ซ์-ไฟติด ปดิ สวิทซ์-ไฟดับ เปน็ ตน้ สว่ น NC จะทำงำนตรงกนั ข้ำม) โปรแกรม 1 #define RELAY 2 #define BUTTON 12 int state = 1; void setup() { pinMode(BUTTON, INPUT); pinMode(RELAY, OUTPUT); toggle(state); } void loop() { if (digitalRead(BUTTON) == HIGH) { delay(200); if (digitalRead(BUTTON) == HIGH) { state = !state; toggle(state); } } } Page | 38
void toggle (int state) { if (state) { digitalWrite(RELAY, HIGH); } else { digitalWrite(RELAY, LOW); } } โปรแกรมถัดไป เปน็ กำรเปิด-ปิด Relay โดยอัตโนมตั ิเมอื่ อุณภูมสิ ูงเกินคำ่ ทกี่ ำหนด ถำ้ อุณหภมู ติ ำ่ กวำ่ หรอื เท่ำกบั 25 องศำเซลเซยี ส ให้ปดิ Relay แตถ่ ้ำอุณหภมู สิ งู กว่ำ 25 องศำเซลเซียส (กำหนดด้วยค่ำ THRESHOLD) Relay จะทำงำน สำหรบั โปรแกรมกำรวัดอุณหภูมิ ให้ดูตวั อยำ่ งจำกกำรทดลองที่ 6 (Temperature & Humidity) ตวั อย่ำงกำรประยุกตใ์ ชง้ ำนของโปรแกรมน้ี เช่น กำรเปิด-ปิดพดั ลมในบ้ำน ในฟำรม์ หรือเปิด-ปดิ เครื่องปรับอำกำศ แบบอตั โนมัติ เปน็ ต้น การเชอื่ มต่ออุปกรณ์ 2 Page | 39
โปรแกรม 2 #include <dht.h> #define DATA A0 #define RELAY 2 #define THRESHOLD 25 dht DHT; int state = 1; float temperature = 0.0; void setup() { Serial.begin(9600); pinMode(RELAY, OUTPUT); toggle(state); } void loop() { DHT.read11(DATA); temperature = DHT.temperature; Serial.println(temperature); if (temperature > THRESHOLD) { state = 0; } else { state = 1; } toggle(state); delay(5000); } void toggle (int state) { if (state) { digitalWrite(RELAY, HIGH); } else { digitalWrite(RELAY, LOW); } } Page | 40
การทดลองที่ 11 Pulse Width Modulation อุปกรณ์ 1) LED 1 หลอด 2) Push Button Switch 2 ตวั 3) ตวั ต้ำนทำน 220 โอห์ม 1 ตัว 4) ตวั ตำ้ นทำน 10 กิโลโอห์ม 2 ตัว หลักกำรทำงำนของ Pulse Width Modulation (PWM) คอื กำรปรบั ช่วงเวลำของระดับลอจกิ 1 (HIGH) ใหส้ ัน้ ลงหรือยำวนำนขนึ้ (ควำมกว้ำงของพลั ซ์หรอื Pulse Width หรอื กำรปรบั Duty Cycle) ในขณะท่ีคำบเวลำ ท้ังหมด (T) คงท่ี จำกตัวอย่ำงในรูป เมอ่ื ปรบั Duty Cycle ใหแ้ คบลง (Duty Cycle ต่ำ หรือมชี ่วงเวลำท่ลี อจิกเปน็ 1 สัน้ หรือ Narrow Pulse) แรงดันเฉลย่ี ของรูปคลน่ื จะลดลง (Low Voltage Average) ถ้ำปรบั Duty Cycle เพิม่ ขึ้น (Duty Cycle สูง หรือมชี ่วงเวลำท่ีลอจิกเปน็ 1 ยำวนำนข้นึ หรอื Wide Pulse) แรงดนั เฉลี่ยของรปู คล่นื จะ สงู ขนึ้ (High Voltage Average) ถ้ำนำสญั ญำณน้ีไปต่อกบั LED ชว่ งทีแ่ รงดนั เฉลี่ยลดลง LED จะสวำ่ งน้อย แตถ่ ำ้ แรงดันเพิ่มขึน้ LED จะสวำ่ งมำกข้นึ (เมือ่ องค์ประกอบอืน่ ๆ ในวงจร LED เช่น ควำมตำ้ นทำน กระแสไฟฟ้ำคงที่) . Page | 41
การเชอ่ื มต่ออปุ กรณ์ 1 โปรแกรม 1 #define LED 9 void setup() { pinMode(LED, OUTPUT); } void loop() { for (int i = 0; i <= 30; i++) { analogWrite(LED, i); delay(100); } for (int i = 30; i >= 0; i--) { analogWrite(LED, i); delay(100); } } Page | 42
การเชอ่ื มต่ออุปกรณ์ 2 โปรแกรม 2 // pull-down resistor circuit #define LED 9 #define UP_SWITCH 2 #define DN_SWITCH 3 byte brightness = 0; void setup() { pinMode(LED, OUTPUT); pinMode(UP_SWITCH, INPUT); pinMode(DN_SWITCH, INPUT); analogWrite(LED, brightness); } void loop() { if (digitalRead(UP_SWITCH) == HIGH) { delay(200); if (digitalRead(UP_SWITCH) == HIGH) { brightness++; if (brightness >= 30) { brightness = 30; Page | 43
} analogWrite(LED, brightness); } } if (digitalRead(DN_SWITCH) == HIGH) { delay(200); if (digitalRead(DN_SWITCH) == HIGH) { if (brightness > 0) { brightness--; if (brightness < 0) { brightness = 0; } } else { brightness = 0; } analogWrite(LED, brightness); } } } Page | 44
การทดลองที่ 12 Servo Motor อุปกรณ์ 1) Server Motor 1 ตวั (สีของสำยไฟใหด้ ตู ำมตำรำงขำ้ งล่ำง) Servo Motor Arduino I/O แดง 5V นำ้ ตำล GND ส้ม 9 Servo Motor คือ มอเตอร์ไฟฟำ้ กระแสตรง (Direct Current Motor หรือ DC Motor) ทน่ี ำมำประกอบ ร่วมด้วยชุดเกยี ร์ และสว่ นควบคมุ ต่ำง ๆ ไว้ในตัวถงั เดียวกัน โดยใช้สญั ญำณควบคุมเพียง 1 เสน้ ทเ่ี หลอื อีก 2 เส้น ได้แก่แรงดันไฟฟ้ำ (5V หรอื VCC) และกรำวด์ (GND) กำรควบคมุ Servo Motor ใหห้ มุนซ้ำยหรือขวำ (ปกตคิ ือ +90 องศำ และ -90 องศำ รวมเป็น 180 องศำ) ทำไดโ้ ดยกำรปอ้ นสญั ญำณพัลส์ทีป่ รบั เปลย่ี นควำมกว้ำงได้ใหก้ ับ มอเตอร์ ซง่ึ ส่งผลตอ่ ทิศทำงกำรหมุนและตำแหน่งของกำรหมุน เชน่ ต้องกำรให้หมนุ ไปทำงซำ้ ย 10 องศำ หรือไป ทำงขวำ 5 องศำได้ โดยท่ีไมต่ ้องใช้วงจรตรวจจบั องศำและทิศทำงอกี ทำให้ง่ำยและสะดวกต่อกำรนำไปประยกุ ต์ใช้ งำนทำงด้ำนต่ำง ๆ เช่น กำรขับเคล่ือนล้อรถอัตโนมัติตำมข้อมูลที่ไดจ้ ำกตัวตรวจจับสภำพแวดลอ้ ม (Environment Sensor) ใชค้ วบคุมแขนกลหรอื ข้อตอ่ ของหนุ่ ยนต์ เป็นตน้ Page | 45
การเชือ่ มต่ออุปกรณ์ โปรแกรม #include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { for (pos = 0; pos < 180; pos += 1) { myservo.write(pos); delay(15); } for (pos = 180; pos >= 1; pos -= 1) { myservo.write(pos); delay(15); } } Page | 46
การทดลองที่ 13 Joystick Module อปุ กรณ์ 1) Joystick Module 1 ชุด หลกั กำรทำงำนของ Joystick แบบง่ำย ๆ คือใช้ตวั ต้ำนทำนปรบั ค่ำได้ (Variable Resistor) 2 ตวั สำหรับ รับค่ำในแกนนอน (แกน X หรอื Horizontal) และแกนต้งั (แกน Y หรือ Vertical) ควบคู่กับกลไกทใ่ี ช้หมนุ ตวั ต้ำนทำนทง้ั สอง เมื่อจ่ำยแรงดนั ไฟฟ้ำให้กับตัวตำ้ นทำนและผูใ้ ช้โยกแกนจับของ Joystick จะส่งผลใหค้ ่ำของควำม ต้ำนทำนเปลีย่ นไปดังแสดงในรปู (ก) คำ่ ของตัวตำ้ นทำนทเี่ ปลย่ี นไปนี้ (อำจเปน็ L หรือ a) สง่ ผลใหแ้ รงดันขำออก (Vout) เปล่ยี นไป โดยแรงดันขำออกจะสมั พันธ์กับทศิ ทำงกำรเคล่ือนท่ีของ Joystick ดงั แสดงในรปู (ข) (ก) กำรเปลยี่ นคำ่ ควำมตำ้ นทำนสง่ ผลตอ่ แรงดันไฟฟำ้ ขำออก Page | 47
Search