ใบงานที่ 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อณุ หภูมิ DS18B20 147 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <OneWire.h> 2 #include <DallasTemperature.h> 3 OneWire ds(4); //sensor on pin D4 4 DallasTemperature sensor(&ds); 5 float temp; //variable keep temp value 6 void temp_read(); //prototype of function read temp 7 void setup(void) 8{ 9 Serial.begin(9600); 10 Serial.println(\"Dallas Temperature IC Control Library Demo\"); 11 sensor.begin(); 12 } 13 void loop(void) 14 { 15 temp_read(); 16 Serial.print(\"Temperature is: \"); 17 Serial.println(temp); 18 Serial.println(\"-----------Next read---------------\"); 19 delay(1000); 20 } 21 void temp_read() // Temperature read 22 { 23 sensor.requestTemperatures(); 24 temp = sensor.getTempCByIndex(0); //Read Temp 25 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 รวมไฟลไ์ ลบรารี่ OneWire.h และ DallasTemperature.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 3 ประกาศใชง้ านไลบรารี่ OneWire พร้อมกาหนดช่ืออุปกรณ์และขาพอร์ตท่ีเชื่อมต่อ - บรรทดั ที่ 4 ประกาศใชง้ านไลบราร่ี DallasTemperature พร้อมกาหนดช่ืออุปกรณ์และขาพอร์ตท่ี เชื่อมตอ่ - บรรทดั ท่ี 5 ประกาศตวั แปรเกบ็ อุณหภูมิท่ีสามารถเกบ็ ทศนิยมได้ - บรรทดั ที่ 6 ประกาศตวั แปรฟังกช์ นั่ รองสาหรับอ่านค่าอุณหภูมิจากไอซี DS18B20 - บรรทดั ที่ 9 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 11 ส่ังใหอ้ ุปกรณ์เริ่มทางาน - บรรทดั ที่ 15 เรียกใชง้ านฟังกช์ นั่ รองใหอ้ ่านค่าอุณภูมิ - บรรทดั ที่ 17 แสดงผลอุณภูมิจากตวั แปรที่เก็บค่าทางจอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทดั ท่ี 21-25 ฟังกช์ น่ั รองที่มีหนา้ ที่อา่ นคา่ อุณภูมิ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus (ใช้ Arduino IDE v. 1.6.5 ในการคอมไพล)์ 2. ทดลองดว้ ยวงจรจริง 3. ทดลองใหอ้ ุณหภูมิที่ตวั ไอซีเปล่ียนแปลงแลว้ สังเกตผล
148 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมแสดงค่าอุณหภูมิที่วดั จากไอซี DS18B20 จานวน 2 ตวั โดยแสดงผลที่ จอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง อ่านค่าจากไอซี แสดงค่าท่ีอ่านได้ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <OneWire.h> 2 #include <DallasTemperature.h> 3 OneWire ds_1(4); //sensor 1 on pin D4 4 OneWire ds_2(5); //sensor 2 on pin D5 5 DallasTemperature sensor_1(&ds_1); 6 DallasTemperature sensor_2(&ds_2); 7 float temp_1; //variable keep temp value 8 float temp_2; //variable keep temp value 9 void temp_read(); 10 void setup(void) 11 { 12 Serial.begin(9600); 13 Serial.println(\"Dallas Temperature IC Control Library Demo\"); 14 sensor_1.begin(); 15 sensor_2.begin(); 16 } 17 void loop(void) 18 { 19 temp_read(); 20 Serial.print(\"Temperature for Device 1 is: \"); 21 Serial.println(temp_1); 22 Serial.print(\"Temperature for Device 2 is: \"); 23 Serial.println(temp_2); 24 Serial.println(\"-----------Next read---------------\"); 25 delay(1000); 26 } 27 void temp_read() 28 { 29 sensor_1.requestTemperatures(); 30 sensor_2.requestTemperatures(); 31 //------------------------------------------ 32 temp_1 = sensor_1.getTempCByIndex(0); //read temp from sensor_1 33 temp_2 = sensor_2.getTempCByIndex(0); //read temp from sensor_2 34 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 รวมไฟลไ์ ลบราร่ี OneWire.h และ DallasTemperature.h เขา้ มาในโคด้ โปรแกรม - บรรทัดที่ 3 ประกาศใช้งานไลบรารี่ OneWire พร้อมกาหนดช่ืออุปกรณ์ตวั ที่ 1 และขาพอร์ตที่ เชื่อมตอ่
ใบงานท่ี 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อณุ หภมู ิ DS18B20 149 - บรรทัดที่ 4 ประกาศใช้งานไลบราร่ี OneWire พร้อมกาหนดช่ืออุปกรณ์ตวั ท่ี 2 และขาพอร์ตที่ เช่ือมตอ่ - บรรทัดที่ 5 ประกาศใชง้ านไลบราร่ี DallasTemperature พร้อมกาหนดชื่ออุปกรณ์ตวั ที่ 1 และขา พอร์ตที่เชื่อมตอ่ - บรรทดั ท่ี 6 ประกาศใชง้ านไลบรารี่ DallasTemperature พร้อมกาหนดชื่ออุปกรณ์ตวั ท่ี 2 และขา พอร์ตที่เช่ือมต่อ - บรรทดั ที่ 7,8 ประกาศตวั แปรเกบ็ อุณหภูมิท่ีอา่ นไดจ้ ากอุปกรณ์ตวั ท่ี 1 และ 2 ตามลาดบั - บรรทดั ท่ี 9 ประกาศตวั แปรฟังกช์ นั่ รองสาหรับอา่ นค่าอุณหภูมิจากไอซี DS18B20 - บรรทดั ที่ 12 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 14,15 สง่ั ใหอ้ ุปกรณ์ตวั ท่ี 1 และ 2 เร่ิมทางาน - บรรทดั ที่ 19 เรียกใชง้ านฟังกช์ น่ั รองใหอ้ ่านค่าอุณภูมิ - บรรทัดท่ี 21 แสดงผลอุณภูมิจากตัวแปรที่เก็บค่าอุณหภูมิจากไอซีตัวที่ 1 โดยแสดงผลท่ี จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทัดท่ี 22 แสดงผลอุณภูมิจากตัวแปรที่เก็บค่าอุณหภูมิจากไอซีตัวที่ 2 โดยแสดงผลท่ี จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทัดท่ี 21-25 ฟังก์ชนั่ รองที่มีหน้าที่อ่านค่าอุณภูมิโดยค่าท่ีอ่านไดเ้ ก็บลงในตวั แปรท่ีใช้เก็บ อุณหภูมิที่ประกาศไวโ้ ดยเป็นประเภทตวั แปรโกลบอล ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus (ใช้ Arduino IDE v. 1.6.5 ในการคอมไพล)์ 2. ทดลองดว้ ยวงจรจริง 3. ทดลองใหอ้ ุณหภูมิที่ตวั ไอซีเปล่ียนแปลงแลว้ สงั เกตผล 9. สรุปผลการปฏบิ ัติงาน
150 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมควบคุมการติดดบั ของ LED ท้งั 2 ตวั จากอุณหภูมิที่วดั ไดจ้ ากไอซี DS18B20 โดยแสดงผลการทางานและอุณภูมิท่ีจอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ARDUINO R1-R2 LED1-LED3 D2 220 D3 4R.73k VCC 3 DS18B20 D4 2 DQ VCC GND 1 R4 VCC 4.7k 3 DS18B20 D5 2 VCC GND DQ GND 1 รูปที่ 4.10-6 วงจรท่ีใชท้ ดลอง
ใบงานท่ี 4.11 การเขียนโปรแกรมวดั อุณหภมู ิและความช้ืนดว้ ยโมดูล DHT22 151 ใบงานที่ 4.11 การเขยี นโปรแกรมวดั อุณหภูมแิ ละความชื้นด้วยโมดูล DHT22 1. จุดประสงค์ทว่ั ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 ได้ 2. บอกข้นั ตอนการต่อวงจรเพือ่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 2 ตวั 2.1 ตวั ตา้ นทาน 4.11 k 1 ตวั 2.3 LED 3mm 1 ตวั 1 ตวั 2.2 ตวั ตา้ นทาน 220 ohm 2 ตวั 1 เส้น 1 ชุด 3. บอร์ด Arduino Nano 3.0 1 เคร่ือง 4. โมดูลวดั อุณหภูมิ DHT22 5. สายเช่ือมต่อ USB (Mini USB) 6. สายเชื่อมต่อวงจร 7. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ัติงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
152 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การวดั อุณหภูมิและความช้ืนสัมพทั ธ์ ปัจจุบนั มีเซนเซอร์ชนิดหน่ึงท่ีถูกออกแบบมาทางานน้ี โดยเฉพาะเซนเซอร์ตวั น้นั คือ DHT11 และ DHT22 ซ่ึงท้งั สองเป็นโมดูลท่ีทางานแบบเดียวกนั ทุกประการ เป็ นอุปกรณ์ที่ใช้ขาสื่อสารเพียงเส้นเดียวเป็ นการส่ือสารสองทิศทางและเป็ นการสื่อสารท่ีให้ขอ้ มูลแบบ ดิจิทลั ความแตกต่างกนั ของโมดูลท้งั สองเป็นดงั ตาราง DHT11 DHT22 1. Ultra low cost 1. Low cost 2. 3 to 5V power and I/O 2. 3 to 5V power and I/O 3. 2.5mA max current use during conversion 3. 2.5mA max current use during conversion (while requesting data) (while requesting data) 4. Good for 20-80% humidity readings with 5% 4. Good for 0-100% humidity readings with 2-5% accuracy accuracy 5. Good for 0-50°C temperature readings ±2°C 5. Good for -40 to 125°C temperature readings accuracy ±0.5°C accuracy 6. No more than 1 Hz sampling rate (once every 6. No more than 0.5 Hz sampling rate (once every second) 2 seconds) 7. Body size 15.5mm x 12mm x 5.5mm 7. Body size 15.1mm x 25mm x 7.7mm 8. 4 pins with 0.1\" spacing 8. 4 pins with 0.1\" spacing จากตารางเปรียบเทียบจะเห็นความแตกต่างของโมดูลวดั อุณหภูมิและความช้ืนสัมพทั ธ์ท้งั สอง เบอร์ไดพ้ อสมควร ใบงานน้ีเลือกใชเ้ บอร์ DHT22 (เวลาเขียนโคด้ โปรแกรมไม่ต่างกนั ) รูปร่างหน้าตา และขนาดของโมดูลตลอดจนหนา้ ท่ีของแตล่ ะขาเป็นดงั รูป รูปที่ 4.11-1 รูปร่างของโมดูลวดั อุณหภูมิและความช้ืนสัมพทั ธ์ DHT22 การต่อใช้งานโมดูล DHT11, DHT22 จะต้องใช้ตวั ตา้ นทานพูลอพั ที่ขาสัญญาณข้อมูลที่มีค่า เท่ากบั 4.7k ดงั รูป 3.3V-6V 4k7 DHT22 MCU DATA รูปท่ี 4.11-2 การตอ่ ใชง้ านโมดูล DHT11, DHT22
ใบงานท่ี 4.11 การเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 153 การเขียนโค้ดโปรแกรมเพื่ออ่านค่าอุณหภูมิและความช้ืนสัมพทั ธ์ท้งั DHT11 และ DHT22 ปัจจุบนั มีไลบรารี่ช่วยงานทาให้ผูเ้ ขียนโคด้ สามารถเขียนโคด้ ไดง้ ่ายข้ึน ซ่ึงไลบราร่ีที่ตอ้ งเอามาใช้งาน เพอ่ื อ่านคา่ จากโมดูลดงั กล่าวจะตอ้ งใชไ้ ลบรารี่ 2 ตวั โดยสามารถดาวนโ์ หลดไดท้ ี่ ไลบราร่ี แหล่งดาวน์โหลด DHT.h https://github.com/adafruit/DHT-sensor-library Adafruit_Sensor.h https://github.com/adafruit/Adafruit_Sensor มีข้นั ตอนการดาเนินการเพ่ือนาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวนโ์ หลดไลบราร่ีตวั ที่ 1 ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.11-2 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ านตวั ที่ 1 2. ดาวนโ์ หลดไลบราร่ีตวั ท่ี 2 ซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.11-3 การดาวน์โหลดไลบรารี่ท่ีนามาใชง้ านตวั ท่ี 2 3. ทาการเพ่มิ ไลบราร่ีท้งั 2 ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แลว้ ทาการหา ไฟล์ zip ที่ไดจ้ ากการดาวนโ์ หลดในขอ้ 1 และ 2 รูปที่ 4.11-4 การเพิ่มไลบราร่ีท่ีเป็นไฟล์ zip ลงในโปรแกรม Arduino IDE
154 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 2. ฟังก์ช่ันกาหนดความเร็วในการส่ือสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการส่ือสารผา่ นพอร์ตอนุกรม 3. ฟังก์ชั่นส่งข้อมูลออกพอร์ต เป็ นฟังก์ช่ันท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พิมพข์ อ้ มูลออกทางพอร์ตเพือ่ แสดงผลที่จอคอมพิวเตอร์เมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ที่ทา้ ยส่ิงที่พิมพน์ ้นั ๆ Serial.print(val); Serial.print(val, format); 4. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชั่น Serial.print ต่างกนั ตรงที่เม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เม่ือสั่งพิมพค์ ร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนที่จะต่อทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val); Serial.println(val, format); ฟังก์ชั่นใช้งานของไลบราร่ี DHT การอ่านค่าจากโมดูล DHT จาเป็ นตอ้ งใชไ้ ลบราร่ีช่วยงาน ซ่ึงไลบรารี่ไม่ไดถ้ ูกเพ่ิมเขา้ มาในตวั โปรแกรม Arduino IDE ต้งั แต่แรกจาเป็นตอ้ งติดต้งั เพ่มิ เติม โดยมีฟังกช์ นั่ ใหใ้ ชง้ านดงั น้ี 1. ฟังก์ช่ันกาหนดขาเช่ือมต่อ ใชใ้ นการระบุขาท่ีใชเ้ ช่ือมต่อให้ตวั โปรแกรมรับรู้ รูปแบบเป็ น ดงั น้ี DHT dht(DHTPIN, DHTTYPE); DHTPIN: ตวั เลขระบุขาพอร์ตท่ีใชเ้ ช่ือมต่อกบั โมดูล DHTTYPE: ชนิดของโมดูลที่เชื่อมต่อไดแ้ ก่ DHT11, DHT21, DHT22
ใบงานท่ี 4.11 การเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 155 ตวั อย่าง DHT dht(8, DHT22); หมายถึง ต่อไปในโปรแกรมจะใช้ชื่อ dht ในการเรียกใช้งานโมดูล โดยมีการเช่ือมต่อ สายสัญญาณเขา้ ท่ีขาพอร์ต D8 และใชโ้ มดูลชนิด DHT22 2. ฟังก์ชั่นอ่านค่าความชื้น ค่าที่ไดจ้ ากฟังก์ชน่ั อยูใ่ นรูปของตวั แปร float หน่วยเป็ นเปอร์เซนต์ ของความช้ืนในอากาศที่วดั ได้ รูปแบบของฟังกช์ น่ั ดงั น้ี dht.readHumidity(); 3. ฟังก์ชั่นอ่านค่าความอุณหภูมิ ค่าท่ีไดจ้ ากฟังกช์ น่ั อยใู่ นรูปของตวั แปร float หน่วยเป็ นองศา เซลเซียส รูปแบบของฟังกช์ นั่ ดงั น้ี dht.readTemperature(); 7. วงจรทใี่ ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC VCC C1 0.1uF R4 4k7 DHT22 DATA R2,R3 D8 14 1k USB to UART (TTL Level) 3 2 D1(TXD) DTR D0(RXD) RXD TXD +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.11-5 วงจรที่ใชไ้ อซี AVR ในการทดลอง
รูปที่ 4.11-7 การต่อลงบอร์ดทดลอง AB C DE F GH I J GND 156 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การต่อวงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 รูปท่ี 4.11-8 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน D11 5 รูปที่ 4.11-6 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป 3V3 D10 การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง REF D9 10 ARDUINO A0 D8 5 A1 D7 15 A2 D6 A3 D5 A4 D4 A5 D3 10 A6 D2 A7 5V GND RST RST GND 15 VIN D0 D1 20 20 25 25 D8 DATA 30 30 R1 4k7 35 35 VCC 40 40 DHT22 45 45 50 50 55 55 60 60 AB C DE F GH I J
ใบงานท่ี 4.11 การเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 157 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมอ่านค่าอุณหภูมิและความช้ืนสัมพทั ธ์จากโมดูล DHT22 แสดงผลท่ี จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง อ่านค่าจากโมดลู DHT22 แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <DHT.h> 2 #define DHTPIN 8 // pin to connect DHT22 3 #define DHTTYPE DHT22 // Type of use DHT11,DHT21,DHT22 4 5 DHT dht(DHTPIN, DHTTYPE); 6 void setup() 7{ 8 Serial.begin(9600); 9 Serial.println(\"DHTxx test!\"); 10 dht.begin(); 11 } 12 void loop() 13 { 14 delay(2000); 15 float h = dht.readHumidity(); 16 float t = dht.readTemperature(); 17 if (isnan(h) || isnan(t)) 18 { 19 Serial.println(\"Failed to read from DHT sensor!\"); 20 return; 21 } 22 Serial.print(\"Humidity: \"); 23 Serial.print(h); 24 Serial.print(\" %\\t\"); 25 Serial.print(\" Temperature: \"); 26 Serial.print(t); 27 Serial.println(\" *C \"); 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ DHT.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 กาหนดชื่อ DHTPIN ใหแ้ ทน 8 (เป็นขาที่ DHT22 ตอ่ เขา้ ที่ขา D8 ของ Arduino) - บรรทัดที่ 3 กาหนดชื่อ DHTTYPE ให้แทน DHT22 เมื่อวงจรต่อใช้งานโมดูล DHT22 แต่ถ้า ผใู้ ชง้ านใชโ้ มดูล DHT11 หรือ DTH21 ใหเ้ ปล่ียนการกาหนดชื่อตาม - บรรทดั ที่ 5 ประกาศใชง้ านไลบราร่ีโดยสามารถกาหนดช่ือเรียกโมดูลตามตอ้ งการไดต้ วั อยา่ งน้ี กาหนดชื่อเรียกเป็น dht
158 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ท่ี 8 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 10 ส่งั ใหไ้ ลบรารี่ DHT.h เร่ิมทางานโดยใชช้ ่ือเรียกโมดูลวา่ dht - บรรทดั ที่ 15 เรียกใชฟ้ ังกช์ น่ั อา่ นค่าความช้ืนที่ตรวจวดั ไดแ้ ลว้ เอามาเก็บไวใ้ นตวั แปร h - บรรทดั ท่ี 16 เรียกใชฟ้ ังกช์ น่ั อา่ นคา่ อุณหภูมิท่ีตรวจวดั ไดแ้ ลว้ เอามาเก็บไวใ้ นตวั แปร t - บรรทดั ท่ี 17 ตรวจสอบคา่ ในตวั แปร h และ t วา่ มีตวั ใดตวั หน่ึงหรือท้งั สองตวั มีค่าที่ไม่ใช่ตวั เลข หรือไม่ - บรรทัดที่ 19-20 หากตรวจสอบจากบรรทดั ท่ี 17 แลว้ พบว่ามีค่าของตวั แปรที่ไม่ใช่ตวั เลขให้ แสดงขอ้ ความพร้อมกลบั ใหอ้ อกไปเริ่มตน้ ใหม่ - บรรทดั ท่ี 23,26 แสดงคา่ ความช้ืนจากตวั แปร h และคา่ อุณหภูมิจากตวั แปร t ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพม่ิ /ลด อุณหภูมิและความช้ืนสมั พทั ธ์ท่ีตวั โมดูล สงั เกตคา่ ที่อา่ นได้ 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมควบคุมการติดดับของ LED 2 ตัว ให้ LED1 ถูกควบคุมการติดดับตาม อุณหภูมิและ LED2 ถูกควบคุมการติดดบั ตามความช้ืนสัมพทั ธ์ โดยใชส้ ามารถติดหรือดบั ท้งั หมดตามอุณหภูมิและความช้ืนที่สามารถทดลองได้ วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO VCC R1 DHT22 4k7 D8 DATA R2 LED1 220 D3 2R230 LED2 D2 GND รูปท่ี 4.11-9 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 159 ใบงานท่ี 4.12 การเขยี นโปรแกรมวดั ระยะด้วยโมดูลอลั ตร้าโซนิค 1. จุดประสงค์ทว่ั ไป เพ่ือใหส้ ามารถเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิคได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิคได้ 2. บอกข้นั ตอนการต่อวงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.2 LED 3mm 3. บอร์ด Arduino Nano 3.0 1 ตวั 4. โมดูลอลั ตร้าโซนิค HC-SR04 1 ตวั 5. สายเชื่อมตอ่ USB (Mini USB) 1 เส้น 6. สายเชื่อมตอ่ วงจร 1 ชุด 7. คอมพิวเตอร์ 1 เคร่ือง 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
160 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน เสียงเป็นคล่ืนชนิดหน่ึงที่สามารถเดินทางผา่ นอากาศไดด้ งั น้นั ถา้ ใชค้ ุณสมบตั ิน้ีมาสร้างเคร่ืองวดั ระยะทางโดยอาศยั การเดินทางของเสียงผา่ นอากาศกส็ ามารถทาไดเ้ ช่นกนั เน่ืองจากความถ่ีเสียงจะมีช่วง ของความถ่ีช่วงหน่ึงท่ีมนุษยส์ ามารถไดย้ ินเสียงไดค้ ืออยใู่ นช่วง 20Hz-20kHz ดงั น้นั หากใชเ้ สียงในช่วงน้ี ก็จะเป็ นการรบกวนการได้ยินของมนุษยด์ ้วย ดงั น้ันจึงต้องใช้ความถ่ีท่ีสูงกว่าความถ่ีเสียงปกติเพ่ือ หลีกเลี่ยงการไดย้ นิ ของมนุษยใ์ นปัจจุบนั ไดม้ ีการใช้ความถี่ 40kHz เพ่ือใชใ้ นการวดั ระยะทางความถี่น้ี เป็นความถ่ีท่ีสูงกวา่ เสียงที่มนุษยไ์ ดย้ นิ จึงเรียกเสียงน้ีวา่ “อลั ตร้าโซนิค” โมดูลวดั ระยะทางโดยใชอ้ ลั ตร้า- โซนิคจะประกอบดว้ ยลาโพงท่ีส่งคล่ืนเสียงและไมโครโฟนท่ีทาหนา้ ท่ีเป็ นตวั รับเสียง แต่เนื่องจากตวั ลาโพงในโมดูลมีขนาดเล็กเสียงท่ีส่งออกจึงมีเสียงเบาทาใหร้ ะยะของการวดั ไม่ไกลนกั ซ่ึงจะมีระยะไม่ เกิน 5 เมตรและมีมุมที่ใชง้ านแคบดงั รูป รูปท่ี 4.12-1 รูปร่างของมุมกระจายคลื่นเสียงของโมดูลอลั ตร้าโซนิค โมดูลอลั ตราโซนิคสาหรับวดั ระยะทางถูกสร้างมีให้เลือกใชห้ ลายรุ่นแต่ละรุ่นมีขอ้ แตกต่างกนั อยา่ งเดียวคือความแม่นยาของการวดั ดงั ตาราง การเลือกใชง้ านหากระดบั ความแม่นยาไม่สาคญั มากนกั โมดูล HR-SC04 จึงเหมาะท่ีจะนามาทดลองใช้ในใบงานเน่ืองจากเป็ นโมดูลวดั ระยะที่มีราคาถูกกว่ารุ่น อื่น ๆ ตารางท่ี 4.12-1 1. Sensor angle HR-SC04 HY-SRF05 US-100 2. Detection distance 3. precision < 15 degrees < 15 degrees < 15 degrees 4. Working Voltage 2cm-450cm 2cm-450cm 2cm-450cm 5. Static current ~3 mm ~2 mm ~1 mm 5VDC 5VDC 5VDC < 2mA < 2mA < 2mA การเขียนโคด้ โปรแกรมเพ่ือวดั ระยะทางดว้ ยโมดูลอลั ตา้ โซนิคสามารถเขียนโดยไม่พึงไลบรารี่ก็ ได้ หรือถา้ หากตอ้ งการใชไ้ ลบรารี่เพอ่ื ใหก้ ารเขียนโคด้ ง่ายข้ึนสามารถดาวนโ์ หลดไดท้ ่ี ไลบรารี่ แหล่งดาวน์โหลด Ultrasonic.h https://github.com/ErickSimoes/Ultrasonic
ใบงานท่ี 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 161 มีข้นั ตอนการดาเนินการเพ่ือนาไลบราร่ีมาใชง้ านดงั น้ี 1. ดาวนโ์ หลดไลบราร่ีซ่ึงเป็นไฟล์ Zip ดงั รูป รูปที่ 4.12-2 การดาวน์โหลดไลบรารี่ท่ีนามาใชง้ าน 2. ทาการเพ่ิมไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แลว้ ทาการหาไฟล์ zip ท่ีไดจ้ ากการดาวนโ์ หลดในขอ้ 1 รูปท่ี 4.12-3 การเพม่ิ ไลบราร่ีที่เป็นไฟล์ zip ลงในโปรแกรม Arduino IDE 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กับขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการให้ทางานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ น่ั เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 2. ฟังก์ช่ันส่งค่าลอจิกดิจิทลั ไปยงั ขาพอร์ต คา่ HIGH เป็นการส่งลอจิก 1 และค่า LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ซ่ึงฟังกช์ น่ั น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalWrite(pin, value); pin: หมายเลขขาท่ีตอ้ งการเขียนลอจิกออกพอร์ต value: HIGH or LOW
162 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 3. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ช่ันหน่วงเวลาเป็ นไมโครวนิ าที เน่ืองจากฟังกช์ นั่ หน่วงเวลาปกติเวลาต่าสุดที่ทาไดค้ ือ 1 มิลลิวนิ าที ดงั น้นั หากตอ้ งการหน่วงเวลาที่ต่ากวา่ จ่ึงตอ้ งใชฟ้ ังชนั่ น้ีซ่ึงสามารถหน่วงเวลาได้ ในระดบั ไมโครวนิ าที รูปฟังชน่ั เป็นดงั น้ี delayMicroseconds(us); us: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยไมโครวนิ าที (unsigned int) 5. ฟังก์ชั่นกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการส่ือสารผา่ นพอร์ตอนุกรม 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็ นฟังก์ชั่นที่ใช้ในการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พมิ พข์ อ้ มูลออกทางพอร์ตเพือ่ แสดงผลท่ีจอคอมพิวเตอร์เมื่อพมิ พเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยส่ิงที่พิมพน์ ้นั ๆ Serial.print(val); Serial.print(val, format); 7. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชนั่ Serial.print ต่างกนั ตรงท่ีเมื่อพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เม่ือสั่งพิมพ์คร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนท่ีจะตอ่ ทา้ ยเหมือนกบั ฟังกช์ นั่ Serial.print Serial.println(val); Serial.println(val, format); 8. ฟังก์ชั่นวดั ความกว้างของพลั ซ์ โดยค่าที่วดั ไดเ้ ป็นเวลาหน่วยเป็นไมโครวนิ าที (uS) ผใู้ ชง้ าน สามารถระบุลอจิกของสัญญาณท่ีใช้ในการวดั ได้ เช่นเม่ือกาหนดลอจิกท่ีใช้ตรวจจบั เป็ น HIGH ฟังก์ช่นั จะเร่ิมนับเวลาเม่ือขาสัญญาณที่ตรวจจบั เป็ นลอจิก HIGH โดยนบั เวลาไป จนกวา่ สัญญาณจะเป็ นเป็ น LOW เวลาท่ีไดเ้ ป็ นตวั เลขที่มีหน่วยเป็ นไมโครวนิ าที รูปฟังชนั่ เป็นดงั น้ี
ใบงานที่ 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 163 pulseIn(pin, value); pin: ขาพอร์ตที่ใชใ้ นการตรวจจบั สัญญาณพลั ซ์ value: ค่าลอจิกท่ีใช้กาหนดเพื่อใช้ในนับเวลาโดยฟังก์ชั่นจะหยุดนบั เม่ือค่า ลอจิกเป็นตรงขา้ ม ตวั อย่างเช่น duration = pulseIn(12, HIGH); หมายถึง วัดความกว้างของพัลซ์โดยการจับเวลา เมื่อขา D12 เป็ นลอจิก HIGH จนกระทั่งขา D12 มีการเปล่ียนลอจิกเป็ น LOW โดยค่าที่ได้เป็ นตัวเลขหน่วยเป็ น ไมโครวนิ าทีแลว้ เอาไปเกบ็ ไวใ้ นตวั แปร duration ฟังก์ชั่นใช้งานของไลบราร่ี Ultrasonic.h การอา่ นค่าจากโมดูล Ultrasonic จาเป็นตอ้ งใชไ้ ลบรารี่ช่วยงาน ซ่ึงไลบรารี่ไม่ไดถ้ ูกเพ่มิ เขา้ มาใน ตวั โปรแกรม Arduino IDE ต้งั แตแ่ รกจาเป็นตอ้ งติดต้งั เพิม่ เติม โดยมีฟังกช์ น่ั ใหใ้ ชง้ านดงั น้ี 1. ฟังก์ช่ันกาหนดขาเช่ือมต่อ ใชใ้ นการระบุขาท่ีใชเ้ ช่ือมตอ่ ใหต้ วั โปรแกรมรับรู้ รูปแบบดงั น้ี Ultrasonic ultrasonic(Trig PIN,Echo PIN); Trig PIN: ตวั เลขระบุขาพอร์ตที่ใชเ้ ช่ือมต่อกบั ขา Trig ของโมดูล Echo PIN: ตวั เลขระบุขาพอร์ตท่ีใชเ้ ช่ือมตอ่ กบั ขา Echo ของโมดูล ตัวอย่างเช่น Ultrasonic ultrasonic(9,8); หมายถึง ต่อไปในโปรแกรมจะใช้ช่ือ ultrasonic ในการเรียกใช้งานโมดูล โดยมีการ เชื่อมตอ่ ขาพอร์ต D9 เขา้ ท่ีขา Trig และขาพอร์ต D8 เขา้ ท่ีขา Echo ของโมดูล 2. ฟังก์ชั่นอ่านค่าระยะทาง ใชอ้ ่านค่าระยะทางจากตวั โมดูลโดยสามารถระบุหน่วยที่ตอ้ งการ วดั ได้ 2 แบบคือ เซนติเมตร (CM) และหน่วยท่ีเป็นนิ้ว (INC) รูปแบบเป็นดงั น้ี .distanceRead(); Unit: หน่วยที่ตอ้ งการวดั CM, INC ตวั อย่างเช่น Serial.print(ultrasonic. distanceRead (CM)); หมายถงึ แสดงผลระยะที่วดั ไดห้ น่วยเป็นเซนติเมตรทางพอร์ตอนุกรม
164 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การเปลย่ี นค่า time out เพื่อปรับระยะการวดั (สาหรับเมื่อใช้งานไลบราร่ี) ค่าเริ่มต้นของไลบรารี่ กาหนดค่า time out ไวท้ ี่ 20000UL ทาให้สามารถวดั ระยะได้ไกลสุด ประมาณ 3.4 เมตร กาใชฟ้ ังกช์ น่ั ที่มีการป้อนคา่ 2 ค่าที่เป็นขาเชื่อมตอ่ ดงั น้ี Ultrasonic ultrasonic(Trig PIN,Echo PIN); Trig PIN : ขา Trig ของโมดูลอลั ตร้าโซนิค Echo PIN : ขา Echo ของโมดูลอลั ตร้าโซนิค ผใู้ ชส้ ามารถเปล่ียนคา่ ระยะการวดั ได้ โดยการกาหนดค่า TimeOut เขา้ ในฟังกช์ นั่ ตวั อยา่ งเช่น Ultrasonic ultrasonic(Trig PIN,Echo PIN,MaxTimeout); Trig PIN : ขา Trig ของโมดูลอลั ตร้าโซนิค Echo PIN : ขา Echo ของโมดูลอลั ตร้าโซนิค Max.TimeOut: ค่าเวลา Time out สูงสุดสาหรับวดั ระยะที่ตอ้ งการวดั (µs) ตวั อย่างเช่น Ultrasonic ultrasonic(9,8,29000UL); หมายถึง ใชช้ ่ือ ultrasonic แทนตวั เซนเซอร์ ขา Trig ของเซนเซอร์เช่ือมต่อเขา้ ท่ีขา D9 ขา Echo ของเซนเซอร์เช่ือมต่อเขา้ ท่ีขา D8 ค่า TimeOut เท่ากบั 29000 µs ซ่ึง สามารถวดั ระยะไดส้ ูงสุดประมาณ 5 เมตร วธิ ีการคานวณค่า TimeOut เพ่ือให้ได้ระยะการวดั ทตี่ ้องการ ระยะการสูงสุดท่ีตอ้ งการวดั สูตร ตวั อยา่ งการคานวณ หน่วยเป็ นเซนติเมตร TimeOut = Max.Distance(cm) * 58 500 cm * 58 = 29000 µs หน่วยเป็ นนิ้ว TimeOut = Max.Distance(inc) * 148 25 inc * 148 = 3700 µs หมายเหตุ คา่ Time out ไมค่ วรเกินค่าระยะทางที่โมดูลอลั ตร้าโซนิคทางานไดน้ นั่ คือ 450 cm 7. วงจรทใ่ี ช้ทดลอง วงจรเพอื่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus
ใบงานที่ 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 165 กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC C1 0.1uF USB to UART (TTL Level) R2,R3 3 D9 15 VCC HC-SR04 1k 2 D8 14 1 VCC DTR 2 Trig RXD D1(TXD) 3 Echo TXD D0(RXD) 4 GND +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.12-4 วงจรที่ใชไ้ อซี AVR ในการทดลอง HC-SR04 กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO VCC 1 VCC D9 2 Trig D8 3 Echo 4 GND GND รูปท่ี 4.12-5 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง F GH I J 20 20 VCC 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 Trig D11 Echo D10 GND D9 D8 5 D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 AB C DE HC-SR04 AB C DE 1 D13 3V3 REF A0 5 A1 A2 A3 A4 A5 10 A6 A7 5V RST GND 15 VIN รูปท่ี 4.12-6 การตอ่ ลงบอร์ดทดลอง
166 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การต่อวงจรเพอื่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.12-7 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน เน่ืองจากโปรแกรมจาลองการทางานไม่มีโมเดลอลั ตราโซนิครุ่น HR-SC04 ให้จาลองจึงตอ้ งใช้ โมเดลจากไลบรารี่ท่ีเพ่ิมเขา้ มา ซ่ึงไลบรารี่ดงั กล่าวภายในเป็ นซีพยี ทู ี่เขียนโคด้ ให้ส่งค่าเลียนแบบอลั ตร้า โซนิคซ่ึงสามารถปรับค่าไดโ้ ดยอาศยั แรงดนั ควบคุมผา่ นการปรับโพเทนธิโอมิเตอร์ ดงั น้นั เม่ือใชง้ าน จะตอ้ งโหลดไฟล์โปรแกรมควบคุมเขา้ โมเดลเช่นเดียวกบั การจาลองไมโครคอนโทรลเลอร์ ไฟล์ที่ตอ้ ง โหลดเขา้ โมเดลเป็นไฟลภ์ าษาเครื่องที่มาพร้อมกบั ไลบรารี่ดงั รูป รูปท่ี 4.12-8 ไฟลภ์ าษาเครื่องสาหรับโมเดลอลั ตร้าโซนิค 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมวดั ระยะโดยการใช้โมดูลอลั ตร้าโซนิคแบบไม่ใช้ไลบราร่ี แสดงผลที่ จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง ส่งพลั ซ์ 10uS ทีข่ า Trig จบั เวลาที่ขา Echo คานวณเป็ นระยะทาง แสดงผล
ใบงานที่ 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 167 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define TRIGGER_PIN 9 // digital pin D9 2 #define ECHO_PIN 8 // digital pin D8 3 void setup() 4{ 5 Serial.begin (9600); 6 pinMode(TRIGGER_PIN, OUTPUT); 7 pinMode(ECHO_PIN, INPUT); 8} 9 void loop() 10 { 11 double duration, distance; 12 digitalWrite(TRIGGER_PIN, LOW); // Get Start 13 delayMicroseconds(2); // stable the line 14 digitalWrite(TRIGGER_PIN, HIGH); // sending 10 us pulse 15 delayMicroseconds(10); // delay 16 digitalWrite(TRIGGER_PIN, LOW); // waiting to receive signals 17 duration = pulseIn(ECHO_PIN, HIGH); // calculating time 18 distance = (duration/2) / 29.1; // single path 19 Serial.print(distance); 20 Serial.println(\" cm\"); 21 delay(500); 22 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 กาหนดช่ือ TRIGGER_PIN ให้แทน 9 และ ECHO_PIN ใหแ้ ทน 8 (ขา Triger ต่อ เขา้ ที่ขา D9 และขา Echo ของโมดูลอลั ตร้าโซนิคต่อเขา้ ที่ขา D8 ของ Arduino) - บรรทดั ท่ี 5 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 6,7 กาหนดโหมดการทางานของขาท่ีใชเ้ ช่ือมตอ่ กบั โมดูลอลั ตราโซนิค - บรรทดั ที่ 11 ประกาศตวั แปรท่ีใชป้ ระกอบการคานวณระยะทาง - บรรทดั ที่ 12-16 ส่งสญั ญาณพลั ส์ไปกระตุน้ การทางานของโมดูลอลั ตร้าโซนิค - บรรทดั ท่ี 17 เก็บค่าเวลาท่ีมีสญั ญาณสะทอ้ นกลบั - บรรทดั ที่ 18 คานวณระยะทางที่วดั ได้ - บรรทดั ท่ี 19 แสดงคา่ ระยะทางท่ีวดั ได้ ท่ีจอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองวดั ระยะวตั ถุในตาแหน่งที่ตา่ ง ๆ กนั สงั เกตค่าที่อา่ นได้
168 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมวดั ระยะโดยการใช้โมดูลอลั ตร้าโซนิคแบบใช้ไลบราร่ี แสดงผลที่ จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง อ่านคา่ ระยะทาง แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Ultrasonic.h> 2 Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN) 3 void setup() { 4 Serial.begin(9600); 5} 6 void loop() 7{ 8 Serial.print(ultrasonic.distanceRead(CM)); // CM or INC 9 Serial.println(\" cm\" ); 10 delay(100); 11 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบราร่ี Ultrasonic.h เขา้ มาในโคด้ โปรแกรม - บรรทัดท่ี 2 ประกาศใช้งานไลบรารี่พร้อมระบุขาพอร์ตท่ีใช้เช่ือมต่อกบั โมดูลและกาหนดชื่อ เรียกโมดูลตวั อยา่ งน้ีกาหนดชื่อเรียกเป็น ultrasonic - บรรทดั ที่ 4 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 8 เรียกใชง้ านไลบรารี่พร้อมแสดงค่าที่วดั ไดท้ ี่จอคอมพวิ เตอร์ผา่ นพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองวดั ระยะวตั ถุในตาแหน่งท่ีตา่ ง ๆ กนั สงั เกตค่าที่อา่ นได้ 4. เปรียบเทียบความแตกต่างของการการวดั ระหวา่ งโคด้ ที่ใชก้ บั ไมใ่ ชไ้ ลบรารี่
ใบงานท่ี 4.12 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค 169 การทดลองที่ 3 เขียนโปรแกรมควบคุมการติดดบั ของ LED จากระยะห่างของวตั ถุท่ีวดั ได้ หากวตั ถุวางอยู่ ในระยะต่ากว่า 30 cm ให้ LED ติดหากระยะของวตั ถุเกิน 30 cm ให้ LED ดบั พร้อมแสดงผลระยะท่ี จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง วดั ระยะของวัตถุ แสดงค่าทอ่ี ่านได้ จริง ค่าสงู กว่าที่กาหนด? เทจ็ สัง่ ให้ LED ติด สั่งให้ LED ดบั แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Ultrasonic.h> 2 #define LED 5 3 Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN) 4 void setup() { 5 Serial.begin(9600); 6 pinMode(LED,OUTPUT); 7} 8 void loop() 9{ 10 int distance=ultrasonic.distanceRead(CM); 11 Serial.print(distance); 12 Serial.println(\" cm\" ); 13 digitalWrite(LED, distance>30? HIGH:LOW); 14 delay(100); 15 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบราร่ี Ultrasonic.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 3 ประกาศใชง้ านไลบรารี่พร้อมระบุขาพอร์ตท่ีใชเ้ ช่ือมต่อกบั โมดูล - บรรทดั ที่ 10 ประกาศตวั แปรเกบ็ ค่าระยะพร้อมทาการวดั คา่ แลว้ ทาการเกบ็ คา่ ลงตวั แปร - บรรทดั ที่ 13 ส่ังให้ LED ติดดบั จากการตรวจสอบคา่ ในเง่ือนไข (ใช้ if-else แบบยอ่ ) โค้ดโปรแกรมฟังก์ช่ัน if-else แบบปกติ โค้ดโปรแกรมฟังก์ชั่น if-else แบบย่อ if (distance >30){ digitalWrite(LED,( distance >30)? HIGH:LOW); digitalWrite(LED,HIGH); } Else{ digitalWrite(LED,LOW); }
170 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองวดั ระยะวตั ถุในตาแหน่งท่ีต่าง ๆ กนั สงั เกตคา่ ท่ีอ่านไดแ้ ละการติดดบั ของ LED 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมแจง้ เตือนการเขา้ ใกล้ (เช่นเดียวกบั เซนเซอร์ถอยหลงั ของรถยนต)์ แสดงผลท่ี LED จานวน 4 ตวั โดยมีเง่ือนไขการแสดงผลดงั น้ี ระยะตรวจจบั การติดดบั ของ LED s 1.5m 1.0m s 1.5m 0.5m s 1.0m 0s 0.5m วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO D9 VCC HC-SR04 D8 1 VCC 2 Trig 3 Echo 4 GND R1-R4 LED1-LED4 220 D5 D4 D3 D2 GND รูปท่ี 4.12-9 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 171 ใบงานที่ 4.13 การเขยี นโปรแกรมควบคุมดซี ีมอเตอร์ 1. จุดประสงค์ทวั่ ไป เพือ่ ใหส้ ามารถเขียนโปรแกรมควบคุมดีซีมอเตอร์ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมควบคุมดีซีมอเตอร์ได้ 2. บอกข้นั ตอนการต่อวงจรเพ่อื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 1 ตวั 1 ตวั 2.1 ไอซี L298D 1 ตวั 2.4 Potentiometer 10k 2.5 มอเตอร์ไฟตรง 6V 1 ตวั 2.2 ไดโอด 1N4001 1 ตวั 1 เส้น 1 ชุด 2.3 ตวั เก็บประจุ 100 uF 1 ตวั 1 เครื่อง 3. บอร์ด Arduino Nano 3.0 4. สายเชื่อมตอ่ USB (Mini USB) 5. สายเชื่อมต่อวงจร 6. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
172 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน มอเตอร์ไฟฟ้ากระแสตรง (DC motor) เป็ นเครื่องกลไฟฟ้าชนิดหน่ึงท่ีมีหน้าท่ีเปลี่ยนพลงั งาน งานไฟฟ้าไปเป็ นพลงั งานกล เม่ือไดร้ ับการป้อนพลงั งานไฟฟ้าท่ีเป็ นไฟฟ้ากระแสตรงจะทาให้แกนของ มอเตอร์หมุน แต่เน่ืองจากการทางานของมอเตอร์ไฟฟ้ากระแสตรงตอ้ งการกระแสไฟฟ้าในปริมาณสูง กว่าความสามารถที่ไมโครคอนโทรลเลอร์จะจ่ายโดยตรงได้ จึงจาเป็ นท่ีจะต้องมีวงจรขบั มอเตอร์ โดยเฉพาะเพ่ือทาหนา้ ที่ขบั มอเตอร์ใหท้ างานไดต้ ามตอ้ งการ รูปท่ี 4.13-1 ตวั อยา่ งมอเตอร์ไฟฟ้ากระแสตรงขนาดเล็กแบบปกติ รูปที่ 4.13-2 ตวั อยา่ งมอเตอร์ไฟฟ้ากระแสตรงขนาดเลก็ แบบท่ีมีชุดเฟื องทดรอบ มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็กจะถูกนามาใช้ในโครงงานท่ีมีกลไกการเคลื่อนไหวมีค่า แรงดนั ไฟฟ้าในการทางานในช่วง 1.5 โวลตถ์ ึง 12 โวลต์ การควบคุมการทางานของมอเตอร์ไฟฟ้ากระแสตรงน้นั สามารถทาไดง้ ่ายเพียงป้อนไฟเขา้ ท่ีข้วั มอเตอร์เมื่อตอ้ งการใหม้ อเตอร์หมุนและเมื่อตอ้ งการใหม้ อเตอร์หยดุ หมุนกเ็ พียงหยดุ การป้อนไฟฟ้า หรือ ถา้ หากตอ้ งการให้มอเตอร์หมุนกลบั ทิศทางก็สามารถทาไดโ้ ดยการสลบั ข้วั ไฟฟ้าท่ีจ่ายให้กบั มอเตอร์ เพียงเท่าน้ีมอเตอร์ไฟฟ้ากระแสตรงก็จะสามารถหมุนกลบั ทิศทางไดใ้ นทนั ที สาหรับวงจรขบั มอเตอร์ที่ สามารถควบคุมทิศทางการหมุนได้ประกอบด้วยอุปกรณ์ท่ีถูกจัดวางที่มีลักษณะคล้ายตัว H ใน ภาษาองั กฤษจึงเรียกวงจรขบั มอเตอร์ไฟฟ้ากระแสตรงในลกั ษณะน้ีว่าวงจรขบั แบบ H-Bridge ลกั ษณะ ของวงจรเป็นดงั รูปท่ี 4.13-3
ใบงานท่ี 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 173 S1 S3 Vs M S2 S4 รูปที่ 4.13-3 วงจรขบั แบบ H-Bridge จากรูปที่ 4.13-3 เป็ นวงจรขบั แบบ H-Bridge ท่ีใช้สวิตช์ ในสภาวะแรกเร่ิมท่ีสวิตช์ทุกตวั ยงั ไม่ ทางานมอเตอร์จะไม่ไดร้ ับกระแสไฟฟ้าทาให้มอเตอร์ไม่หมุน เมื่อทาการควบคุมใหส้ วิตซ์ทางานโดยให้ S1 และ S4 ทางาน มอเตอร์จะหมุนตามเข็มนาฬิกา (CW: Clock wise) หากตอ้ งการให้มอเตอร์หมุนกลบั ทิศทางโดยให้มอเตอร์หมุนทวนเข็มนาฬิกา (CCW: Counter clock wise) ก็เพียงสลบั การทางานของ สวติ ช์โดยให้ S1, S4 ไม่ทางานและใหส้ วติ ช์ S2, S3 ทางานแทน การควบคุมดงั กล่าวจะมีลกั ษณะดงั รูปท่ี 14.13-4 S1 S3 S1 S3 Vs M Vs M S2 S4 S2 S4 (a) (b) รูปท่ี 4.13-4 การควบคุมการหมุนของมอเตอร์ดว้ ยวงจรขบั แบบ H-Bridge ตารางที่ 4.13-1 การควบคุมมอเตอร์ดว้ ยวงจรขบั แบบ H-Bridge แบบใชส้ วติ ช์ สถานะของสวติ ช์ สถานะของมอเตอร์ไฟฟ้ากระแสตรง S1 S2 S3 S4 OFF OFF OFF OFF ไมห่ มุน ON OFF OFF ON หมุนตามเขม็ นาฬิกา (CW) OFF ON ON OFF หมุนทวนเขม็ นาฬิกา (CCW) วงจรขบั มอเตอร์ที่เป็ นลกั ษณะ H-Bridge สามารถเปลี่ยนจากการใชส้ วิตช์มาเป็ นรีเลย์ โดยใช้ รีเลยท์ ี่เป็ นชนิด SPDT (Single pole double throw) ดงั รูปท่ี 4.13-5 และการควบคุมทิศทางการหมุนเป็ น ดงั รูป 4.13-6
174 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] +Vs RY1 M RY2 S1 รูปท่ี 4.13-5 วงจรขบั มอเตอร์แบบ H-Bridge ท่ีใชร้ ีเลย์ S2 V2 V1 RY1 RY2 +Vs +Vs M RY2 RY1 M (a) (b) รูปที่ 4.13-6 การควบคุมการหมุนของมอเตอร์ดว้ ยวงจรขบั แบบ H-Bridge ที่ใชร้ ีเลย์ การใช้งานจริงมีไอซีที่ถูกออกแบบมาเพ่ือการน้ีโดยเฉพาะมีคุณสมบัติเป็ นวงจรขับแบบ H-Bridge ในกรณีที่ใช้กบั มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็กที่ใช้กระแสไม่เกิน 600 มิลลิแอมป์ จะใช้ ไอซีเบอร์ L293D แตห่ ากมอเตอร์ไฟฟ้ากระแสตรงใชก้ ระแสสูงเกินค่าดงั กล่าวแต่ไม่เกิน 4 แอมป์ จะตอ้ ง ใช้ไอซีเบอร์ L298 ในใบงานน้ีใชม้ อเตอร์ไฟฟ้ากระแสตรงขนาดเล็กซ่ึงจะใชไ้ อซีเบอร์ L293D ในการ ทดลองโดยโครงสร้างของไอซีเป็นดงั รูปที่ 4.13-7 VCC 4A 4Y GND GND 3Y 3A EN3,4 16 15 14 13 12 11 10 9 12345678EN1,2 1A รูปที่ 4.13-7 โครงสร้างไอซีขบั มอเตอร์กระแสตรงขนาดเลก็ เบอร์ L293D1Y 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน GND GND 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กับขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่2Y ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน2A โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี VS
ใบงานท่ี 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 175 pinMode(pin, mode) pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 2. ฟังก์ช่ันส่งค่าลอจิกดจิ ิทลั ไปยงั ขาพอร์ต คา่ HIGH เป็นการส่งลอจิก 1 และคา่ LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ซ่ึงฟังกช์ นั่ น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalWrite(pin, value) pin: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต 3. ฟังก์ช่ันหน่วงเวลา หรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาที่ ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms) ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ช่ันกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม Serial.begin(speed) speed: ตวั เลขของอตั ราเร็วในการส่ือสารผา่ นพอร์ตอนุกรม 5. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็ นฟังก์ชน่ั ท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พิมพข์ อ้ มูลออกทางพอร์ตเพื่อแสดงผลที่จอคอมพิวเตอร์เม่ือพมิ พเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยส่ิงที่พิมพน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชัน่ Serial.print ต่างกนั ตรงที่เม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเมื่อสั่งพิมพ์คร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยู่ที่ บรรทดั ใหม่ แทนท่ีจะตอ่ ทา้ ยเหมือนกบั ฟังกช์ นั่ Serial.print Serial.println(val) Serial.println(val, format)
176 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็ นฟังก์ช่ันอ่านสัญญาณแอนาลอกท่ีปรากฏอยู่ที่ขาท่ี ตอ้ งการอา่ นน้นั ๆ ค่าท่ีอา่ นไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณแอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรที่เป็น int สาหรับเก็บคา่ ท่ีอ่านได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกท่ีตอ้ งการอา่ นค่าสัญญาณแอนาลอก 8. ฟังก์ชั่นให้ขาพอร์ตส่งสัญญาณ PWM เป็นฟังกช์ น่ั ท่ีให้ขาพอร์ตดิจิทลั ขา 3, 5, 6, 9, 10 และ 11 (ซ่ึงเป็ นขาท่ีส่งสัญญาณ PWM ได)้ ส่งสัญญาณ PWM ออกตามค่าดิวติ้ไซเคิลท่ีกาหนด ดว้ ยความถ่ี 490 Hz analogWrite(pin, value) pin: ขาพอร์ตดิจิทลั ที่ตอ้ งการส่งสัญญาณ PWM value: ค่าดิวติ้ไซเคิลท่ีอยรู่ ะหวา่ ง 0 ถึง 255 9. ฟังก์ช่ันแปลงช่วงตัวเลข เป็ นฟังก์ชน่ั ทาหนา้ ที่เปลี่ยนแปลงค่าที่ไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งคา่ หน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหม่ที่ตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh) value: ตวั แปรท่ีตอ้ งการอา่ นค่านามาเปล่ียนช่วงตวั เลข fromLow: ตวั เลขสเกลล่างสุดของคา่ จากตวั แปร fromHigh: ตวั เลขสเกลสูงสุดของค่าจากตวั แปร toLow: ตวั เลขสเกลล่างสุดของคา่ ท่ีตอ้ งการเปลี่ยนไป toHigh: ตวั เลขสเกลสูงสุดของคา่ ที่ตอ้ งการเปลี่ยนไป 7. วงจรทใ่ี ช้ทดลอง วงจรเพ่อื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป
ใบงานที่ 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 177 1DN15819 VCC Peripheral circuit R1 CPU circuit VCC D2 C4 10k 1N4001 100uF 7,20 ATMEGA328 SW1 VCC 1 RST AVCC 16 8 C1 GND VCC M1 0.1uF GND GND M (PWM)D11 17 1 EN1,2 GND VS 1Y 3 D12 18 2 1A 2Y 6 M2 D13 19 7 2A 3Y 11 M USB to UART (TTL Level) R2,R3 3 (PWM)D10 16 9 EN3,4 4Y 14 1k 2 15 10 3A DTR 14 RXD D1(TXD) D9 15 4A TXD +5V D0(RXD) D8 GND 3V3 4 5 12 13 L293D X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.13-4 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO VCC 1DN14001 C1 16 8 100uF (PWM)D11 1 EN1,2 GND VCC 1Y 3 M1 D12 2 GND 2Y 6 D13 7 1A GND M 2A GND VS 3Y 11 (PWM)D10 4Y 14 M2 D9 9 EN3,4 D8 10 3A M 15 4A GND 4 5 12 13 L293D รูปที่ 4.13-5 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 D11 D10 D9 D8 5 D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 ABCDE L293D ABCDE D13 3V3 รูปที่ 4.13-6 การต่อลงบอร์ดทดลอง REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15
178 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตอ่ วงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.13-7 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมควบคุมการทางานของดีซีมอเตอร์โดยควบคุมทิศทางการหมุนให้มีท้งั หมุนตามเขม็ นาฬิกา (CW) ทวนเขม็ นาฬิกา (CCW) และหยดุ หมุน การกลบั ทิศทางการหมุนจะตอ้ งมีการ สงั่ ใหห้ ยดุ หมุนก่อนช่วงเวลาหน่ึงเพ่อื ไม่ใหเ้ กิดกระแสสูงกวา่ ปกติท่ีเกิดจากการตา้ นทิศทางการหมุน ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง มอเตอร์ 1 และ 2 หมุน (CW) มอเตอร์ 1 และ 2 หยดุ หมุน มอเตอร์ 1 และ 2 หมุน (CCW) มอเตอร์ 1แสแดละงผ2ลหยดุ หมุน แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define EN1 11 2 #define EN2 10 3 #define IN1 12 4 #define IN2 13 5 #define IN3 9 6 #define IN4 8 7 void AllStop(void); 8 void setup() 9{ 10 pinMode(EN1,OUTPUT);pinMode(EN2,OUTPUT); 11 pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT); 12 pinMode(IN3,OUTPUT);pinMode(IN4,OUTPUT); 13 digitalWrite(EN1,HIGH);digitalWrite(EN2,HIGH); 14 AllStop(); 15 } 16 void loop() 17 {
ใบงานท่ี 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 179 18 digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);delay(3000); 19 digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);delay(2000); 20 AllStop(); 21 digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);delay(3000); 22 digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);delay(2000); 23 AllStop(); 24 } 25 void AllStop(void) 26 { 27 digitalWrite(IN1,LOW);digitalWrite(IN2,LOW); 28 digitalWrite(IN3,LOW);digitalWrite(IN4,LOW); 29 delay(250); 30 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1,2 กาหนดชื่อ EN1, EN2 ใหแ้ ทน 11, 10 (เป็นขา Enable ของมอเตอร์ตวั ท่ี 1 และ 2 ท่ี ตอ่ อยกู่ บั ขา D11, D10 ของ Arduino) - บรรทัดท่ี 3,4 กาหนดช่ือ IN1, IN2 ให้แทน 12, 13 (เป็ นขาควบคุมการหมุนของมอเตอร์ตวั ที่ 1 ตอ่ อยกู่ บั ขา D12, D13 ของ Arduino) - บรรทดั ที่ 5,6 กาหนดช่ือ IN3, IN4 ให้แทน 9, 8 (เป็ นขาควบคุมการหมุนของมอเตอร์ตวั ที่ 2 ต่อ อยกู่ บั ขา D12, D13 ของ Arduino) - บรรทดั ที่ 7 ประกาศรูปแบบฟังกช์ นั่ รองท่ีใชห้ ยดุ การหมุนของมอเตอร์ท้งั 2 ตวั - บรรทดั ท่ี 10-12 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ท่ี 13 ส่งั ใหไ้ อซี L293D พร้อมการทางานโดยการกระตุน้ ที่ขา Enable - บรรทดั ที่ 14 เรียกใชฟ้ ังกช์ น่ั รองหยดุ การหมุนของมอเตอร์ - บรรทดั ท่ี 18 สง่ั ใหม้ อเตอร์ตวั ท่ี 1 หมุนตามเขม็ เป็นเวลา 3 วนิ าที - บรรทดั ที่ 19 สงั่ ใหม้ อเตอร์ตวั ท่ี 2 หมุนตามเขม็ เป็นเวลา 2 วนิ าที - บรรทดั ท่ี 20 เรียกใชฟ้ ังกช์ นั่ รองหยดุ การหมุนของมอเตอร์ - บรรทดั ท่ี 21 สง่ั ใหม้ อเตอร์ตวั ท่ี 1 หมุนทวนเป็นเวลา 3 วนิ าที - บรรทดั ที่ 22 สง่ั ใหม้ อเตอร์ตวั ท่ี 2 หมุนทวนเขม็ เป็นเวลา 2 วนิ าที - บรรทดั ท่ี 23 เรียกใชฟ้ ังกช์ น่ั รองหยดุ การหมุนของมอเตอร์ - บรรทดั ท่ี 25-30 ฟังกช์ น่ั รองท่ีสงั่ งานใหห้ ยดุ การหมุนของมอเตอร์ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมใหม้ อเตอร์ทางานในรูปแบบอ่ืน ๆ แลว้ สงั เกตผล
180 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมควบคุมการหมุนของมอเตอร์ท่ีมีการหมุนท้งั ทิศทางตามเขม็ และทวนเขม็ นาฬิกาโดยสามารถปรับความเร็วของการหมุนดว้ ย PWM ได้ โดยใชโ้ พเทนธิโอมิเตอร์ต่อเขา้ พอร์ตรับ สญั ญาณแอนาลอกเป็นตวั ปรับความเร็วในการหมุนของมอเตอร์ดงั รูป VCC D1 C1 1N4001 100uF ARDUINO 16 8 VCC (PWM)D11 1 EN1,2GND VCC 1Y 3 M1 10k D12 2 1A GND 2Y 6 D13 7 2A GND M 9 EN3,4 GND VS 3Y 11 A0 (PWM)D10 10 3A 4Y 14 M2 D9 15 4A D8 M GND 4 5 12 13 L293D รูปท่ี 4.13-8 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง B A ครบ 100 รอบ? จริง ครบ 100 รอบ? จริง เทจ็ เท็จ อ่านค่าจาก POT แล้วส่ง PWM อ่านค่าจาก POT แล้วส่ง PWM มอเตอร์ 1 และ 2 หมุน (CW) มอเตอร์ 1 และ 2 หมนุ (CCW) มอเตอร์ 1 และ 2 หยุดหมนุ มอเตอร์ 1 และ 2 หยุดหมุน AB แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define EN1 11 2 #define EN2 10 3 #define IN1 12 4 #define IN2 13 5 #define IN3 9 6 #define IN4 8 7 #define POT A0 8 void AllStop(void); 9 void setup() 10 { 11 pinMode(EN1,OUTPUT);pinMode(EN2,OUTPUT); 12 pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT); 13 pinMode(IN3,OUTPUT);pinMode(IN4,OUTPUT); 14 AllStop(); 15 }
ใบงานท่ี 4.13 การเขียนโปรแกรมควบคุมดีซีมอเตอร์ 181 16 void loop() 17 { 18 int PWM; 19 for(int i=0;i<100;i++) 20 { 21 PWM=analogRead(POT); 22 PWM=map(PWM,0,1023,50,255); 23 analogWrite(EN1,PWM);analogWrite(EN2,PWM); 24 digitalWrite(IN1,LOW);digitalWrite(IN2,HIGH);delay(30); 25 digitalWrite(IN3,LOW);digitalWrite(IN4,HIGH);delay(20); 26 } 27 AllStop(); 28 for(int i=0;i<100;i++) 29 { 30 PWM=analogRead(POT); 31 PWM=map(PWM,0,1023,50,255); 32 analogWrite(EN1,PWM);analogWrite(EN2,PWM); 33 digitalWrite(IN1,HIGH);digitalWrite(IN2,LOW);delay(30); 34 digitalWrite(IN3,HIGH);digitalWrite(IN4,LOW);delay(20); 35 } 36 AllStop(); 37 } 38 void AllStop(void) 39 { 40 digitalWrite(IN1,LOW);digitalWrite(IN2,LOW); 41 digitalWrite(IN3,LOW);digitalWrite(IN4,LOW); 42 delay(250); 43 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1,2 กาหนดช่ือ EN1, EN2 ใหแ้ ทน 11, 10 (เป็นขา Enable ของมอเตอร์ตวั ท่ี 1 และ 2 ท่ี ต่ออยกู่ บั ขา D11, D10 ของ Arduino) - บรรทัดที่ 3,4 กาหนดช่ือ IN1, IN2 ให้แทน 12, 13 (เป็ นขาควบคุมการหมุนของมอเตอร์ตวั ที่ 1 ตอ่ อยกู่ บั ขา D12, D13 ของ Arduino) - บรรทัดที่ 5,6 กาหนดช่ือ IN3, IN4 ให้แทน 9, 8 (เป็ นขาควบคุมการหมุนของมอเตอร์ตวั ที่ 2 ต่อ อยกู่ บั ขา D12, D13 ของ Arduino) - บรรทดั ท่ี 7 กาหนดช่ือ POT ใหแ้ ทน A0 (เป็นขาโพเทนธิโอมิเตอร์ต่ออยกู่ บั ขา A0 ของ Arduino) - บรรทดั ท่ี 8 ประกาศรูปแบบฟังกช์ น่ั รองท่ีใชห้ ยดุ การหมุนของมอเตอร์ท้งั 2 ตวั - บรรทดั ที่ 19-26 วนทาซ้า 100 รอบ - บรรทดั ท่ี 21-22 อ่านคา่ จาก POT มาปรับคา่ ใหอ้ ยใู่ นยา่ นท่ีจะส่งคา่ PWM ได้ - บรรทัดท่ี 23 ส่งสัญญาณ PWM เขา้ ที่ขา Enable ของไอซี L293D เพ่ือให้สามารถปรับความเร็ว ในการหมุนได้ - บรรทดั ท่ี 24 สงั่ ใหม้ อเตอร์ตวั ที่ 1 หมุนตามเขม็ เป็นเวลา 30 มิลลิวนิ าที - บรรทดั ท่ี 25 สง่ั ใหม้ อเตอร์ตวั ที่ 2 หมุนตามเขม็ เป็นเวลา 20 มิลลิวนิ าที - บรรทดั ท่ี 27 เรียกใชฟ้ ังกช์ น่ั รองหยดุ การหมุนของมอเตอร์ - บรรทดั ท่ี 28-37 มีข้นั ตอนเดียวกนั กบั บรรทดั ที่ 19-27 เพยี งแต่ส่ังใหม้ อเตอร์หมุนทวนเขม็ - บรรทดั ที่ 38-43 ฟังกช์ นั่ รองท่ีสง่ั งานใหห้ ยดุ การหมุนของมอเตอร์
182 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมใหม้ อเตอร์หมุนในรูปแบบอ่ืน ๆ แลว้ สังเกตผล 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมควบคุมการหมุนโดยให้สามารถปรับความเร็วของการหมุนของมอเตอร์ใน แต่ละตวั ไดอ้ ยา่ งอิสระดว้ ยโพเทนธิโอมิเตอร์ 2 ตวั โดยโพเทนธิโอมิเตอร์ตวั ที่ 1 ให้ควบคุม ความเร็วของมอเตอร์ตวั ที่ 1 และโพเทนธิโอมิเตอร์ตวั ที่ 2 ใหค้ วบคุมความเร็วของมอเตอร์ ตวั ที่ 2 วงจรที่ใชท้ ดลองเป็นดงั รูป VCC ARDUINO VCC D1N14001 C1 10k 16 8 100uF A0 VCC 1 EN1,2GND VCC 1Y 3 M1 (PWM)D11 2 1A GND 2Y 6 D12 GND M D13 7 2A GND VS 3Y 11 4Y 14 M2 (PWM)D10 9 EN3,4 D9 10 3A M D8 15 4A A1 4 5 12 13 L293D 10k GND รูปที่ 4.13-9 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.14 การเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 183 ใบงานท่ี 4.14 การเขยี นโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 1. จุดประสงค์ทวั่ ไป เพอื่ ใหส้ ามารถเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ได้ 2. บอกข้นั ตอนการต่อวงจรเพือ่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 1 ตวั 2.1 ไอซี ULN2803 1 ตวั 2.2 สเตป็ เปอร์มอเตอร์ 1 ตวั 3. บอร์ด Arduino Nano 3.0 1 เส้น 4. สายเช่ือมตอ่ USB (Mini USB) 1 ชุด 5. สายเชื่อมตอ่ วงจร 1 เคร่ือง 6. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเก่ียวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
184 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน สเตป็ เปอร์มอเตอร์หรือที่บางคนเรียกวา่ สเตป็ ปิ้ งมอเตอร์ เป็นมอเตอร์ที่ทางานโดยอาศยั พลงั งาน จากไฟฟ้ากระแสตรงเช่นเดียวกบั มอเตอร์กระแสตรง แต่มีความความแตกต่างจากมอเตอร์กระแสตรงท่ี เมื่อป้อนไฟให้กับสเต็ปเปอร์มอเตอร์จะขยบั เพียงเล็กน้อยเพ่ือเข้าสเต็ป ในขณะท่ีมอเตอร์ ไฟฟ้า กระแสตรงทว่ั ไปจะหมุนตราบท่ียงั มีพลงั งานจา่ ยใหแ้ ก่ตวั มนั ท้งั น้ีเป็นเพราะโครงสร้างของสเตป็ เปอร์ มอเตอร์นนั่ เอง โดย สเตป็ เปอร์มอเตอร์มีดว้ ยกนั 2 แบบคือ 1. Bipolar เป็ นสเตป็ เปอร์มอเตอร์ท่ีมีขดลวด 2 ขดมีสายไฟใหต้ อ่ ใชง้ าน 4 เส้นดงั รูปท่ี 4.14-1 (a) 2. Unipolar เป็ นสเตป็ เปอร์มอเตอร์ที่มีขดลวด 4 ขด (2 ขดแบบมีแทป็ กลาง) โดยมี 2 แบบ 2.1 แบบมีสายไฟใหต้ ่อใชง้ าน 5 เส้น ดงั รูปที่ 4.14-1 (b) 2.2 แบบมีสายไฟใหต้ ่อใชง้ าน 6 เส้น ดงั รูปที่ 4.14-1 (c) MMM (a) (b) (c) รูปที่ 4.14-1 โครงสร้างสเตป็ เปอร์ Bipolar และ Unipolar ใบงานน้ีเลือกใช้สเต็ปเปอร์มอเตอร์แบบ Unipolar ซ่ึงมีขดลวดอยู่ภายในจานวน 4 ขด (ท่ีจริง เป็น 2 ขดที่มีจุดแทป็ กลาง) โดยจานวนรอบของขดลวดท้งั 4 ขดจะมีค่าความตา้ นทานเท่ากนั ดงั น้นั ก่อน ใช้งานตอ้ งทาการหาตาแหน่งสายท่ีใช้งานว่าเป็ นสายตาแหน่งใดของขดลวด ค่าความตา้ นทานของ ขดลวดของสเตป็ เปอร์มอเตอร์ที่มีสายต่อแบบ 5 เส้นเมื่อวดั ค่าความตา้ นทานของสายทุกเส้นจะสามารถ อ่านค่าไดท้ ุกเส้นนน่ั หมายความวา่ ทุกเส้นเช่ือมต่อถึงกนั และมีสายไฟเพียงเส้นเดียวเท่าน้นั ที่วดั ค่าความ ตา้ นทานเทียบกบั เส้นอ่ืน ๆ แลว้ มีค่าความตา้ นทานที่วดั ไดใ้ นแต่ละเส้นเท่ากนั ท้งั หมด สายไฟเส้นน้นั เป็นสายร่วม นาสายร่วมต่อกบั ไฟบวก 5 โวลต์ นาสายไฟเส้นท่ีเหลือตอ่ ลงกราวดค์ ร้ังละเส้นเรียงกนั โดย สลบั กนั ไปมา จนกวา่ สเตป็ เปอร์มอเตอร์หมุนไปทางดา้ นเดียวกนั สาหรับสเตป็ เปอร์มอเตอร์ ที่มีสายต่อ แบบ 6 เส้น เม่ือทาการวดั ค่าความตา้ นทานจะมีเพียง 3 เส้น 2 ชุดที่วดั แลว้ อ่านค่าความตา้ นทานได้ และ ในแต่ละชุดจะมีเส้นเดียวที่มีสายร่วม โดยเมื่อวดั ค่าความตา้ นทานของสายร่วมกบั สายเส้นอื่น จะมีค่า ความตา้ นทานเท่ากนั เมื่อนามาใชง้ านจะตอ้ งนาสายร่วมท้งั 2 เส้นของท้งั 2 ชุดมาต่อร่วมกนั (แบบ 5 เส้นต่อไวแ้ ล้วภายในตวั มอเตอร์) สาหรับวงจรขบั ต้องใช้วงจรขบั ท่ีออกแบบมาสาหรับขบั ขดลวด เช่นเดียวกบั วงจรขบั รีเลย์โดยวงจรตอ้ งมีไดโอดต่อคร่อมขดลวดเพ่ือใช้ขจดั แรงดนั ยอ้ นกลบั (Back EMF) ท่ีเกิดข้ึนเม่ือทรานซิสเตอร์หยดุ นากระแส วงจรเป็นดงั รูปท่ี 4.14-2
ใบงานที่ 4.14 การเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 185 +VS ABCD รูปที่ 4.14-2 แสดงวงจรขบั สเตป็ เปอร์มอเตอร์ท่ีใชท้ รานซิสเตอร์ ในทางปฏิบตั ิสามารถใช้ไอซีที่เป็ นทรานซิสเตอร์อาร์เรย์อยูภ่ ายในแทนการใชท้ รานซิสเตอร์ได้ โดยไอซีน้ีมีวงจรภายในเป็ นวงจรทรานซิสเตอร์จานวนหลายชุด ไดแ้ ก่เบอร์ ULN2003, ULN2803 ซ่ึง เบอร์ ULN2003 มีวงจรทรานซิสเตอร์ภายใน 7 ชุด และเบอร์ ULN2803 มี 8 ชุดโดยในแต่ละชุดเป็นวงจร ทรานซิสเตอร์ที่มีการจดั วงจรภายในเป็ นแบบวงจรทรานซิสเตอร์ท่ีต่อแบบดาร์ลิงตนั ซ่ึงสามารถขบั โหลดกระแสสูงโดยใชก้ ระแสเบสต่า (ลอจิกท่ีป้อนเขา้ มาทางอินพุท) จากลกั ษณะการทางานของวงจรใน แต่ละชุดจะมีลกั ษณะการทางานเช่นเดียวกบั วงจรน็อตเกตในวงจรดิจิทลั สาหรับการขบั สเต็ปเปอร์ มอเตอร์จะใชง้ านเพียง 4 ชุดเท่าน้นั ดงั รูปท่ี 4.14-3 (a) ในกรณีที่ตอ้ งการขบั สเตป็ เปอร์มอเตอร์ท่ีมีกาลงั มากเป็ นมอเตอร์ท่ีต้องการกระแสสูง ซ่ึงการขับกระแสสูงสามารถใช้ไอซีเบอร์ ULN2803 มีวงจร ทรานซิสเตอร์ 8 ชุด โดยทาการขนานกนั 2 ชุดต่อการขบั มอเตอร์ 1 ขด ดงั รูปที่ 4.14-3 (b) ภายในไอซีมี ไดโอดป้องกนั แรงดนั ยอ้ นกลบั (Back EMF) เตรียมไวส้ าหรับโหลดที่เป็ นขดลวด ดงั น้นั เม่ือใชง้ านจริง ไมต่ อ้ งตอ่ ไดโอดเพิ่มภายนอก เพยี งแต่ตอ้ งตอ่ ขาร่วมของไดโอดเขา้ กบั แหล่งจ่ายที่เชื่อมเขา้ ที่จุดร่วมของ ขดลวด A1 18 +VS 1 18 +VS B2 17 A 17 C3 16 2 16 D4 15 15 14 3 14 5 13 B 13 6 12 12 7 11 4 11 8 10 10 9 5 C 6 7 D 8 9 (a) (b) รูปที่ 4.14-3 วงจรขบั สเตป็ เปอร์มอเตอร์แบบใชไ้ อซี ULN2803 การขบั สเต็ปเปอร์มอเตอร์ การขบั สเตป็ เปอร์มอเตอร์เป็นการขบั ใหม้ อเตอร์ขยบั ไปตามจานวนสเตป็ ที่ตอ้ งการซ่ึงคุณสมบตั ิ ในการขยบั ในแต่ละสเต็ปของมอเตอร์มีหลายขนาดใหเ้ ลือกใชง้ านเช่น 1.8 องศาต่อสเต็ป และ 7.5 องศา ต่อสเตป็ การควบคุมการหมุนของมอเตอร์สามารถควบคุมการทางานได้ 3 แบบ คือ
186 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 1. แบบเต็มสเต็ป 1 เฟส (Full step 1 phase) เป็ นการขบั คร้ังละ 1 เฟสเรียงกนั ไป ทาให้มอเตอร์ หมุนไปคร้ังละ 1 สเต็ป ถา้ มอเตอร์มีคุณสมบตั ิ 1.8 องศาต่อสเต็ปก็จะหมุนไปคร้ังละ 1.8 องศา โดยมี ข้นั ตอนขบั เฟสดงั รูปที่ 4.14-4 AAAA D BD BD BD B CCCC (a) (b) (c) (d) รูปที่ 4.14-4 แสดงการเคล่ือนท่ีเม่ือขบั มอเตอร์แบบเตม็ สเตป็ 1 เฟส ตารางที่ 4.14-1 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบเตม็ สเตป็ 1 เฟส สเตป็ ท่ี ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปท่ี 4.14-4 1 ON OFF OFF OFF (a) (b) 2 OFF ON OFF OFF (c) (d) 3 OFF OFF ON OFF 4 OFF OFF OFF ON 2. แบบเต็มสเต็ป 2 เฟส (Full step 2 phase) เป็ นการขบั คร้ังละ 2 เฟส โดยมีคุณสมบตั ิที่ดีข้ึนคือ แรงบิดมากข้ึนเน่ืองจากมีการขบั คร้ังละ 2 เฟส ทาใหเ้ กิดสนามแมเ่ หลก็ มากข้ึนนนั่ เอง แตม่ ุมในการหมุน จะมีคา่ เทา่ กนั กบั แบบเตม็ สเตป็ 1 เฟส โดยมีข้นั ตอนขบั เฟสดงั รูปที่ 4.14-5 AAAA D BD BD BD B CCCC (a) (b) (c) (d) รูปท่ี 4.14-5 แสดงการเคล่ือนที่เม่ือขบั มอเตอร์แบบเตม็ สเตป็ 2 เฟส ตารางที่ 4.14-2 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบเตม็ สเตป็ 2 เฟส สเตป็ ที่ ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปที่ 4.14-5 1 ON ON OFF OFF (a) (b) 2 OFF ON ON OFF (c) (d) 3 OFF OFF ON ON 4 ON OFF OFF ON 3. แบบคร่ึงสเต็ป (Haft step) เป็ นการควบคุมให้มอเตอร์หมุนไปคร้ังละคร่ึงของสเต็ปดงั น้ันหาก มอเตอร์มอเตอร์มีคุณสมบตั ิ 1.8 องศาตอ่ สเตป็ ก็จะหมุนไปคร้ังละ 0.9 องศาทาไดต้ าแหน่งที่เท่ียงตรงมาก ข้ึนเมื่อนาไปประยกุ ตใ์ ชง้ านวธิ ีการขบั จะใชก้ ารผสมกนั ระหวา่ งแบบเตม็ สเตป็ 1 เฟสกบั แบบเตม็ สเตป็ 2 เฟส ซ่ึงมีข้นั ตอนขบั เฟสดงั รูปที่ 4.14-6
ใบงานท่ี 4.14 การเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 187 AAAA D BD BD BD B CCCC (a) (b) (c) (d) AAAA D BD BD BD B CCCC (e) (f) (g) (h) รูปท่ี 4.14-6 แสดงการเคล่ือนท่ีเม่ือขบั มอเตอร์แบบคร่ึงสเตป็ ตารางท่ี 4.14-3 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบคร่ึงสเตป็ สเตป็ ที่ ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปท่ี 4.14-6 1 ON OFF OFF OFF (a) (b) 2 ON ON OFF OFF (c) (d) 3 OFF ON OFF OFF (e) (f) 4 OFF ON ON OFF (g) (h) 5 OFF OFF ON OFF 6 OFF OFF ON ON 7 OFF OFF OFF ON 8 ON OFF OFF ON 6. ฟังก์ช่ัน Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกที่ตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไมส่ ามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode) pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 2. ฟังก์ชั่นส่งค่าลอจิกดิจิทลั ไปยงั ขาพอร์ต คา่ HIGH เป็นการส่งลอจิก 1 และคา่ LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ฟังกช์ นั่ น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ น่ั pinMode ก่อน digitalWrite(pin, value) pin: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต
188 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 3. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms) ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ชั่นกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม Serial.begin(speed) speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม 5. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็ นฟังก์ชนั่ ท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พิมพข์ อ้ มูลออกทางพอร์ตเพอ่ื แสดงผลที่จอคอมพิวเตอร์เม่ือพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยสิ่งที่พมิ พน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 6. ฟังก์ชั่นส่งข้อมูลออกพอร์ต คลา้ ยกบั ฟังก์ชนั่ Serial.print ต่างกนั ตรงท่ีเมื่อพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเมื่อส่ังพิมพ์คร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนท่ีจะต่อทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val) Serial.println(val, format) 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ท่ีอา่ นสัญญาณแอนาลอกท่ีปรากฏอยทู่ ่ีขาพอร์ต แอนาลอกท่ีตอ้ งการอ่านน้นั ๆ คา่ ท่ีอ่านไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรที่เป็น int สาหรับเกบ็ คา่ ที่อ่านได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกท่ีตอ้ งการอา่ นค่าสัญญาณแอนาลอก 8. ฟังก์ชั่นแปลงช่วงตัวเลข เป็ นฟังก์ชนั่ ทาหนา้ ท่ีเปลี่ยนแปลงค่าที่ไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งคา่ หน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหมท่ ่ีตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh) value: ตวั แปรท่ีตอ้ งการเปลี่ยนแปลงค่า toLow: ตวั เลขต่าสุดของค่าท่ีตอ้ งการเปลี่ยนไป fromLow: ตวั เลขต่าสุดของค่าจากตวั แปร toHigh: ตวั เลขสูงสุดของคา่ ที่ตอ้ งการเปลี่ยนไป fromHigh: ตวั เลขสูงสุดของค่าจากตวั แปร
ใบงานที่ 4.14 การเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 189 7. วงจรทใี่ ช้ทดลอง วงจรเพ่ือใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 ULN2803 1 RST AVCC VCC C1 OUT1 18 A M1 0.1uF OUT2 17 OUT3 16 M D7 13 1 IN1 OUT4 15 12 2 COM 10 B D6 11 3 IN2 CD D5 IN3 D4 6 4 IN4 VCC USB to UART (TTL Level) R2,R3 1k 3 DTR 2 RXD D1(TXD) TXD D0(RXD) +5V GND GND 3V3 9 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.14-7 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO ULN2803 VCC M1 D7 13 1 IN1 OUT1 18 D6 12 2 IN2 OUT2 17 A D5 11 3 IN3 OUT3 16 D4 6 4 IN4 OUT4 15 M GND COM 10 GND B 9 CD VCC รูปท่ี 4.14-8 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
F GH I J190 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]20 2025 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 D11การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง D10 D9 รูปที่ 4.14-9 การตอ่ ลงบอร์ดทดลอง D8 5การตอ่ วงจรเพอื่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 ABCDE ULN2803A 1 D13 ABCDE 3V3 REF A0 5 A1 A2 A3 A4 A5 10 A6 A7 5V RST GND 15 VIN รูปที่ 4.14-10 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมควบคุมการทางานของสเตป็ เปอร์มอเตอร์โดยให้หมุนในทิศทางเดียวเป็ น จานวน 360 องศา (ตวั อยา่ งโปรแกรมใชส้ เตป็ เปอร์มอเตอร์ที่มีขนาด 1.8 องศาต่อสเตป็ ) ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง กาหนดรปู แบบการขบั สเตป็ ครบ 360 อง า? จริง เท็จ สั่งขับสเตป็ ดั ไป STOP
ใบงานท่ี 4.14 การเขียนโปรแกรมควบคุมสเตป็ เปอร์มอเตอร์ 191 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define phaseA 4 2 #define phaseB 5 3 #define phaseC 6 4 #define phaseD 7 5 char PinCon[] = {phaseA,phaseB,phaseC,phaseD}; 6 byte pattern[]={ 7 0B1000, 8 0B0100, 9 0B0010, 10 0B0001}; 11 void send2port(byte data); 12 void setup() 13 { 14 for(char i=0;i<4;i++) 15 { 16 pinMode(PinCon[i],OUTPUT); 17 } 18 } 19 void loop() 20 { 21 for(int j=0;j<50;j++) 22 { 23 for(char i=0;i<4;i++) 24 { 25 send2port(pattern[i]); 26 delay(55); 27 } 28 } 29 send2port(0B0000); 30 while(1); 31 } 32 void send2port(byte data) 33 { 34 digitalWrite(PinCon[0],(data & 1 )? HIGH:LOW); 35 digitalWrite(PinCon[1],(data & 2 )? HIGH:LOW); 36 digitalWrite(PinCon[2],(data & 4 )? HIGH:LOW); 37 digitalWrite(PinCon[3],(data & 8 )? HIGH:LOW); 38 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-4 กาหนดช่ือเฟสขาของสเตป็ เปอร์มอเตอร์แทนขาพอร์ตท่ีเชื่อมต่อ - บรรทดั ท่ี 5 ประกาศตวั แปรแบบอาร์เรยเ์ กบ็ ค่าตาแหน่งของขา Arduino ท่ีเชื่อมต่อกบั มอเตอร์ - บรรทดั ท่ี 6-10 ประกาศตวั แปรเกบ็ ค่ารูปแบบการขบั สเตป็ เปอร์มอเตอร์เป็ นแบบฟูลสเตป็ 1 เฟส - บรรทดั ท่ี 14-17 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็นเอาตพ์ ุทพอร์ต - บรรทดั ท่ี 21-28 วนซ้าจานวน 50×4=200 รอบ - บรรทดั ที่ 25 เรียกใชง้ านฟังกช์ น่ั รองสาหรับขบั สเตป็ พร้อมส่งคา่ รูปแบบเขา้ ในฟังกช์ น่ั - บรรทัดที่ 33-38 ฟังกช์ นั่ รองขบั สเตป็ เปอร์มอเตอร์ตามรูปแบบท่ีรับเขา้ มา ภายในฟังก์ชนั่ รองมี การใชฟ้ ังกช์ น่ั if-else แบบยอ่ โค้ดโปรแกรมฟังก์ช่ัน if-else แบบปกติ โค้ดโปรแกรมฟังก์ช่ัน if-else แบบย่อ if (data & 1){ digitalWrite(PinCon[0],(data & 1 )? HIGH:LOW); digitalWrite(PinCon[0],HIGH); } Else{ digitalWrite(PinCon[0],LOW); }
192 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus (จากการทดลองหากใช้ delay ต่ากวา่ 53 จะทาให้ มอเตอร์เกิดอาการสะดุดทาใหม้ ุมที่ควรจะไดค้ ลาดเคลื่อนไป) 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมใหม้ อเตอร์ทางานในรูปแบบอ่ืน ๆ แลว้ สังเกตผล 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมควบคุมการหมุนของสเต็ปเปอร์มอเตอร์ โดยให้มีการหมุนทวนเขม็ และตาม เขม็ นาฬิกาในองศาที่กาหนดข้ึนเอง วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO ULN2803 VCC A M1 D7 13 1 IN1 OUT1 18 D6 12 2 IN2 OUT2 17 M 11 3 OUT3 16 D5 6 4 IN3 OUT4 15 B D4 IN4 COM 10 CD VCC GND GND 9 รูปที่ 4.14-11 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง หมายเหตุ สเต็ปเปอร์ที่นามาใชท้ ดลองอาจมีคุณสมบตั ิในการขยบั ตาแหน่งมีมุมที่ต่างไปจาก ตวั อย่างดงั น้ันการทดลองจะตอ้ งทราบค่าคุณสมบตั ิของมอเตอร์ที่นามาใช้งานก่อนการเขียน โปรแกรม
ใบงานที่ 4.15 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์ 193 ใบงานท่ี 4.15 การเขยี นโปรแกรมควบคุมเซอร์โวมอเตอร์ 1. จุดประสงค์ทวั่ ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมควบคุมเซอร์โวมอเตอร์ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมควบคุมเซอร์โวมอเตอร์ได้ 2. บอกข้นั ตอนการต่อวงจรเพื่อทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 1 ตวั 1 ตวั 2.1 Potentiometer 10 k 1 ตวั 2.3 ตวั ตา้ นทาน 220 ohm 1 ตวั 2.4 LED 3mm 1 เส้น 2.2 คนั โยกแบบตวั ตา้ นทาน 1 ตวั 2 ตวั 1 ชุด 3. บอร์ด Arduino Nano 3.0 1 เคร่ือง 4. สายเชื่อมต่อ USB (Mini USB) 5. อาร์ซีเซอร์โวมอเตอร์ 6. สายเช่ือมตอ่ วงจร 7. คอมพิวเตอร์ 4. ลาดบั ข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เก่ียวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
194 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน เซอร์โวมอเตอร์เป็ นมอเตอร์ที่สามารถควบคุมการเคล่ือนท่ีไปยงั มุมท่ีต้องการได้ด้วยวงจร ควบคุมแบบป้อนกลบั ภายใน เซอร์โวมอเตอร์ขนาดเล็กนิยมใชก้ นั มากในเคร่ืองเล่นบงั คบั วทิ ยุ เช่น รถ เรือ เคร่ืองบิน เซอร์โวมอเตอร์ประกอบข้ึนจากส่วนประกอบหลกั ๆ 3 ส่วนคือ 1. มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก 2. ชุดเกียร์ทดรอบ 3. วงจรควบคุม รูปที่ 4.15-1 ภายในเซอร์โวมอเตอร์1 เซอร์โวมอเตอร์มีคอนเน็คเตอร์สาหรับต่อใช้งาน 3 ขา โดยใชต้ ่อกบั แหล่งจ่ายไฟ 2 ขาและอีก หน่ึงขาจะใชต้ ่อกบั สัญญาณควบคุม เซอร์โวมอเตอร์ใชไ้ ฟฟ้ากระแสตรงในการทางานมีแรงดนั ใชง้ านอยู่ ในช่วง 4-6 โวลต์ (สาหรับรุ่นกาลงั แรงบิดสูงจะใชแ้ รงดนั สูงถึง 12 โวลต)์ การเรียงขาคอนเน็คเตอร์เป็น มาตรฐานแบบเดียวกนั มีความต่างกนั บา้ งตรงสีของสายไฟข้ึนอยกู่ บั บริษทั ผผู้ ลิตดงั รูปที่ 4.15-2 รูปท่ี 4.15-2 คอนเน็คเตอร์เซอร์โวมอเตอร์ของแต่ละบริษทั 2 1รูปจาก http://www.pyroelectro.com 2รูปจาก http://www.imagesco.com/servo/connection-types.html
ใบงานท่ี 4.15 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์ 195 การควบคุมเซอร์โวมอเตอร์ให้เคล่ือนไปยงั มุมท่ีต้องการ สามารถทาได้โดยการส่งพลั ส์ท่ีมี ค่าประมาณ 1 ms - 2 ms ดงั รูปที่ 4.15-3 โดยสัญญาณของพลั ส์ใน 1 ลูกคลื่นมีคาบเวลาประมาณ 20 ms เซอร์โวมอเตอร์สามารถเคล่ือนที่ต้งั แต่มุม 0 องศาจนถึง 180 องศา (ซ่ึงบางตาราอาจกล่าววา่ เคลื่อนต้งั แต่ มุม -90 องศาถึง +90 องศา) ซ่ึงโครงสร้างของเซอร์โวมอเตอร์ไมส่ ามารถที่จะหมุนท่ีมุมเกินกวา่ ที่กาหนด ไวไ้ ด้ ในการใช้งานเซอร์โวมอเตอร์ที่มีการรับภาระโหลดอาจจะทาให้ตาแหน่งเคล่ือนไดห้ ากไม่ส่ง สัญญาณควบคุมแบบต่อเนื่อง โดยปกติโครงสร้างภายในท่ีเป็ นเฟื องทดรอบจะทาการล็อกตาแหน่งไว้ แลว้ ในระดบั หน่ึงแต่ไม่สามารถคงตาแหน่งเดิมไวไ้ ดห้ ากการต่อใช้งานมีการรับภาระโหลด ในกรณีที่ ตอ้ งการลอ็ กตาแหน่งจะตอ้ งส่งพลั ส์ควบคุมตาแหน่งอยา่ งต่อเน่ือง รูปที่ 4.15-3 สญั ญาณพลั ส์ท่ีใชค้ วบคุมเซอร์โวมอเตอร์ การเขียนโคด้ โปรแกรมเพื่อใชค้ วบคุมการเคล่ือนที่ของเซอร์โวมอเตอร์สามารถเขียนโคด้ โดยไม่ พ่ึงไลบรารี่ก็สามารถทาได้ แต่ถา้ ใช้ไลบรารี่การเขียนโคด้ โปรแกรมก็ง่ายข้ึนซ่ึงไลบราร่ีที่ใช้มีช่ือว่า Servo.h เป็ นไลบราร่ีท่ีมาพร้อมกบั โปรแกรม Arduino IDE ต้งั แต่ตอนติดต้งั ดงั น้นั จึงไม่ตอ้ งติดต้งั ใหม่ สามารถใชง้ านไดท้ นั ที 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กับขาพอร์ต โดยสามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่ เพียงตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการให้ทางานในโหมดดิจิทลั แต่ การใส่ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไมส่ ามารถใช้ งานในโหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode);
196 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. ฟังก์ชั่นส่งค่าลอจิกดจิ ิทลั ไปยงั ขาพอร์ต ค่า HIGH เป็นการส่งลอจิก 1 และคา่ LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ฟังกช์ น่ั น้ีทางานไดต้ อ้ งมีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalWrite(pin, value); 3. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็ นฟังก์ชั่นที่อ่านสัญญาณแอนาลอกที่ปรากฏอยู่ที่ขาท่ี ตอ้ งการอ่านน้นั ๆ ค่าท่ีอ่านไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณแอนาลอกที่ 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรที่เป็น int สาหรับเกบ็ คา่ ที่อา่ นได้ analogRead(pin); 5. ฟังก์ชั่นแปลงช่วงตัวเลข เป็ นฟังก์ชนั่ ทาหน้าที่เปลี่ยนแปลงค่าที่ไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งค่าหน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหมท่ ่ีตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh); ฟังก์ช่ันใช้งานของไลบราร่ี Servo.h การใชง้ านเซอร์โวมอเตอร์หากใชไ้ ลบราร่ีช่วยงานจะทาใหส้ ะดวก การควบคุมเซอร์โวมอเตอร์ จานวนหลาย ๆ ตวั พร้อม ๆ กนั เขียนโคด้ ง่าย ซ่ึงไลบรารี่มีมาพร้อมกบั โปรแกรม Arduino IDE แลว้ ไลบรารี่ แหล่งดาวน์โหลด Servo.h ไมต่ อ้ งดาวน์โหลดเนื่องจากมาพร้อมกบั Arduino IDE 1. ฟังก์ชั่นประกาศช่ือเซอร์โวมอเตอร์ ใช้ในการระบุชื่อใช้แทนเซอร์โวมอเตอร์ที่ใช้งาน รูปแบบเป็นดงั น้ี Servo myservo; หมายถึง ต่อไปในโปรแกรมจะใชช้ ่ือ myservo ในการเรียกใชง้ านเซอร์โวมอเตอร์ท่ีกาลงั ต่อใช้ งานกบั Arduino
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
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445