ใบงานที่ 4.5 การเขียนโปรแกรมอ่านค่าจากพอร์ตแอนาลอกและการใช้ PWM 97 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ท่ีอา่ นสัญญาณแอนาลอกที่ปรากฏอยทู่ ี่ขาพอร์ต แอนาลอกท่ีตอ้ งการอ่านน้นั ๆ คา่ ที่อา่ นไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรท่ีเป็น int สาหรับเกบ็ ค่าท่ีอ่านได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกที่ตอ้ งการอ่านคา่ สัญญาณแอนาลอก ตวั อย่างเช่น int adc analogRead(0) หมายถึง อา่ นสญั ญาณแอนาลอกที่ขา A0 นามาเกบ็ ในตวั แปร adc 8. ฟังก์ช่ันให้ขาพอร์ตส่งสัญญาณ PWM เป็นฟังกช์ นั่ ที่ใหข้ าพอร์ตดิจิทลั ขา 3, 5, 6, 9, 10 และ 11 (ซ่ึงเป็ นขาที่ส่งสัญญาณ PWM ได)้ ส่งสัญญาณ PWM ออกตามค่าดิวติ้ไซเคิลท่ีกาหนด ดว้ ยความถี่ 490 Hz analogWrite(pin, value) pin: ขาพอร์ตดิจิทลั ที่ตอ้ งการส่งสญั ญาณ PWM value: ค่าดิวติไ้ ซเคิลที่อยรู่ ะหวา่ ง 0 ถึง 255 ตวั อย่างเช่น analogWrite(3, 100); หมายถึง ส่งสัญญาณ PWM ออกทางขา D3 โดยให้สัญญาณ ท่ีส่งออกน้นั ขนาดดิวต้ีไซเคิลท่ี 100 ( ประมาณ 39.216 %) 9. ฟังก์ชั่นแปลงช่วงตัวเลข เป็ นฟังก์ชนั่ ทาหน้าที่เปล่ียนแปลงค่าที่ไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งค่าหน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหมท่ ี่ตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh) value: ตวั แปรที่ตอ้ งการอา่ นค่านามาเปลี่ยนช่วงตวั เลข fromLow: ตวั เลขสเกลล่างสุดของค่าจากตวั แปร fromHigh: ตวั เลขสเกลสูงสุดของค่าจากตวั แปร toLow: ตวั เลขสเกลล่างสุดของค่าที่ตอ้ งการเปล่ียนไป toHigh: ตวั เลขสเกลสูงสุดของค่าท่ีตอ้ งการเปล่ียนไป ตวั อย่างเช่น int x map(y,0,1023,0,255) หมายถึง แปลงค่าที่อ่านจากตวั แปร y เก็บลงในตวั แปร x โดยท่ีค่าตวั แปร y มีค่าอยู่ ในช่วง 0-1023 โดยใหแ้ ปลงคา่ ไปสู่คา่ ใหม่ใหอ้ ยใู่ นช่วง 0-255
98 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 7. วงจรทใี่ ช้ทดลอง วงจรเพอ่ื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 7,20 ATMEGA328 10k VCC SW1 1 RST AVCC R4-R7 220 LED1-LED3 C1 D2 4 0.1uF (PWM)D3 5 D4 6 USB to UART (TTL Level) R2,R3 3 (PWM)D5 11 1k 2 D1(TXD) DTR D0(RXD) RXD TXD +5V GND 3V3 VCC X1 9 XTAL1 A5 28 10k 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.5-4 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO R1-R4 LED1-LED4 D2 220 (PWM)D3 D4 (PWM)D5 VCC A5 10k GND รูปท่ี 4.5-5 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.5 การเขียนโปรแกรมอา่ นคา่ จากพอร์ตแอนาลอกและการใช้ PWM 99F GH I J20 2025 2530 3035 3540 4045 4550 5055 5560 60F GH I J D12 1 การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 D10 รูปท่ี 4.5-6 การตอ่ ลงบอร์ดทดลองD9 การตอ่ วงจรเพื่อทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD8 5 D7 รูปที่ 4.5-7 การต่อวงจรทดลองในโปรแกรมจาลองการทางานD6 หมายเหตุ D5 D4 1. จากการจาลองการทางานดว้ ยโปรแกรม Proteus ขาพอร์ต D3, D5, D6 ไม่มีสัญญาณ PWMD3 10 ออก แกไ้ ขโดยการเปลี่ยนไปใชข้ าพอร์ต D9, D10, D11 แทนD2 2. การทดลอง PWM เม่ือต่อโหลดดว้ ย LED จะไม่เห็นการเปลี่ยนแปลงของระดบั ความสว่างGND แต่จะเห็นวา่ LED กระพริบ แกไ้ ขโดยการใชส้ โคปจบั สัญญาณเพ่ือดูรูปคลื่นแทนRST 8. การเขยี นโค้ดโปรแกรมควบคุม D0 D1 15 การทดลองท่ี 1 เขียนโปรแกรมควบคุมระดบั ความสวา่ งของ LED ที่ต่ออยทู่ ่ีขาพอร์ตดิจิทลั D9 ซ่ึงเป็นขา ที่สามารถส่งสัญญาณ PWM ออกมาไดด้ ว้ ยคาสั่ง analogWrite(pin,value) โดยควบคุมความสว่างด้วยABCDE ABCDE โพเทนธิโอมิเตอร์ท่ีต่ออยู่ที่ขาพอร์ตแอนาลอก A5 ค่าที่อ่านไดจ้ ะมีค่าอยู่ระหว่าง 0-1023 แต่ค่าที่ใช้D13 ควบคุมดิวต้ีไซเคิลอยรู่ ะหวา่ ง 0-255 การดาเนินการลดคา่ ใหใ้ ชค้ า่ ท่ีอา่ นไดห้ ารดว้ ย 4 ก่อนเอาไปใชง้ าน3V3 REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15
100 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง อ่านค่าจาก POT เขยี นค่า PWM แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 9 //LED Connected to D9 2 #define POT 5 //POT Connected to A5 3 void setup() 4{ 5 pinMode(LED,OUTPUT); 6 Serial.begin(9600); 7} 8 void loop() 9{ 10 int adc=analogRead(POT); 11 analogWrite(LED,adc/4); 12 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 กาหนดชื่อ LED ใหแ้ ทน 9 (เป็นขาที่ LED ต่ออยกู่ บั Arduino) - บรรทดั ท่ี 2 กาหนดช่ือ POT ใหแ้ ทน 5 (เป็นขาที่ Potentiometer ต่ออยกู่ บั Arduino) - บรรทดั ท่ี 5 กาหนดโหมดใหก้ บั ขาพอร์ตที่ตอ่ กบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ท่ี 6 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 10 อา่ นคา่ แอนาลอกจาก POT โดยนาเขา้ มาเก็บไวใ้ นตวั แปร adc - บรรทัดท่ี 11 เขียนค่าแอนาลอก (ส่งสัญญาณพลั ส์แบบ PWM) ออกทางขาท่ีใชช้ ื่อวา่ LED โดย นาค่าตวั แปรที่เก็บค่าจาก POT มาหารดว้ ย 4 เนื่องจากค่าท่ีอ่านจาก POT มีค่าสูงสุดท่ี 1023 และ คา่ ที่กาหนด duty cycle ของฟังกช์ นั่ analogWrite มีคา่ สูงสุดเพียง 255 ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอ่ืน ๆ แลว้ สงั เกตผล
ใบงานท่ี 4.5 การเขียนโปรแกรมอา่ นคา่ จากพอร์ตแอนาลอกและการใช้ PWM 101 การทดลองท่ี 2 เขียนโปรแกรมควบคุมความสว่างแก่ LED จานวน 2 ตวั ที่อยู่ท่ีขา D9, D10 ซ่ึงเป็ นขาที่ สามารถส่งสัญญาณ PWM ได้ โดยใชโ้ พเทนธิโอมิเตอร์เป็ นตวั ปรับความสวา่ งโดยให้ LED ท้งั สองตวั มี ความสวา่ งท่ีตรงขา้ มกนั โดยใหม้ ีการแสดงค่าสัญญาณแอนาลอกที่อ่านไดจ้ ากขาท่ีต่อโพเทนธิโอมิเตอร์ ออกทางพอร์ตอนุกรมแสดงผลที่จอคอมพิวเตอร์ ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง อ่านค่าจาก POT แสดงค่าออกที่อา่ นได้ เขยี นค่า PWM แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED1 9 //LED1 Connected to D9 2 #define LED2 10 //LED2 Connected to D10 3 #define POT 5 //POT Connected to A5 4 void setup() 5{ 6 pinMode(LED1,OUTPUT); 7 pinMode(LED2,OUTPUT); 8 Serial.begin(9600); 9} 10 void loop() 11 { 12 int adc=analogRead(POT); 13 Serial.print(\"Analog Read value : \"); 14 Serial.print(adc); 15 adc=map(adc,0,1023,0,255); 16 Serial.print(\" map value to : \"); 17 Serial.println(adc); 18 analogWrite(LED1,adc); 19 analogWrite(LED2,255-adc); 20 delay(500); 21 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 กาหนดชื่อ LED1,2 ใหแ้ ทน 9,10 (เป็นขาท่ี LED ตอ่ อยกู่ บั Arduino) - บรรทดั ท่ี 3 กาหนดชื่อ POT ใหแ้ ทน 5 (เป็นขาท่ี Potentiometer ตอ่ อยกู่ บั Arduino) - บรรทดั ที่ 6,7 กาหนดโหมดใหก้ บั ขาพอร์ตที่ต่อกบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ท่ี 8 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 12 อา่ นคา่ แอนาลอกจาก POT โดยนาเขา้ มาเก็บไวใ้ นตวั แปร adc - บรรทดั ที่ 14 แสดงค่าที่อา่ นไดจ้ าก POT
102 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ที่ 15 ใชฟ้ ังกช์ นั่ เปลี่ยนยา่ นตวั เลขของตวั แปรจาก 0-1023 ไปเป็น 0-255 - บรรทดั ที่ 18 เขียนค่าแอนาลอก (ส่งสญั ญาณพลั ส์แบบ PWM) ออกทางขาที่ใชช้ ื่อวา่ LED1 - บรรทดั ท่ี 19 เขียนคา่ แอนาลอก ซ่ึงเปลี่ยนแปลงค่าตวั เลขท่ีกาหนด duty cycle โดยใชก้ ารคานวณ ทางคณิตศาสตร์ออกทางขาที่ใช้ชื่อว่า LED2 (ใช้ 255 ลบออกจากค่าตวั แปรจะทาให้ค่า duty cycle ท่ีไดต้ รงขา้ มกบั คา่ ตวั แปรเดิม) ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอ่ืน ๆ แลว้ สังเกตผล 9. สรุปผลการปฏบิ ัติงาน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมไฟวง่ิ LED 4 ตวั (กาหนดรูปแบบเอง)โดยใหส้ ามารถปรับความเร็วในการว่งิ ไดด้ ว้ ยโพเทนธิโอมิเตอร์ วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO R1-R4 LED1-LED4 D2 220 (PWM)D3 D4 (PWM)D5 VCC A5 10k GND รูปที่ 4.5-8 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 103 ใบงานที่ 4.6 การเขยี นโปรแกรมรับสวิตช์ทางพอร์ตแอนาลอก 1. จุดประสงค์ทวั่ ไป เพื่อใหส้ ามารถเขียนโปรแกรมรับสวติ ช์ทางพอร์ตแอนาลอกได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอกได้ 2. บอกข้นั ตอนการต่อวงจรเพอื่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 1 ตวั 4 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.5 ตวั ตา้ นทาน 2.7k 4 ตวั 2.6 LED 3mm 2.2 ตวั ตา้ นทาน 1k 1 ตวั 2.7 Tack Switch 1 ตวั 1 เส้น 2.3 ตวั ตา้ นทาน 680 ohm 1 ตวั 1 ชุด 1 เครื่อง 2.4 ตวั ตา้ นทาน 820 ohm 1 ตวั 3. บอร์ด Arduino Nano 3.0 4. สายเช่ือมต่อ USB (Mini USB) 5. สายเชื่อมต่อวงจร 6. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไปจุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เก่ียวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
104 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน สวติ ชท์ ่ีนามาใชง้ านกบั ไมโครคอนโทรลเลอร์จะเป็นสวติ ชช์ นิดกดติดปล่อยดบั เม่ือนามาใชง้ าน จาเป็ นจะตอ้ งใชพ้ อร์ตในการเช่ือมต่อ 1 ช่องต่อสวติ ช์ 1 ตวั ดงั ใบงานรับค่าจากพอร์ตดิจิทลั ที่ผา่ นมา ซ่ึง หากมีการใชง้ านสวติ ช์จานวนมากจานวนพอร์ตก็จะยง่ิ มากตาม ดงั รูป ARDUINO VCC Internal pull up R1-R4 SW1 220 x4 D9 SW2 D10 SW3 D11 SW4 D12 GND รูปท่ี 4.6-1 การตอ่ ใชง้ านสวิตช์กบั พอร์ตดิจิทลั ใบงานอา่ นค่าจากพอร์ตแอนาลอกที่ผา่ นมาเป็ นการเรียนรู้เก่ียวกบั การใชง้ านพอร์ตท่ีรับสัญญาณ เขา้ ท่ีเป็ นแอนาลอกซ่ึงสามารถแยกความแตกต่างได้ 1024 ระดบั ในช่องรับเพียงช่องเดียว ดงั น้ันหาก ผใู้ ชง้ านออกแบบวงจรสวติ ชใ์ ห้สามารถสร้างแรงดนั ที่แตกต่างกนั ไดเ้ ม่ือกดสวิตช์แต่ละตวั (ใชว้ งจรแบ่ง แรงดนั ) ก็สามารถใชง้ านสวติ ช์หลายตวั โดยใชพ้ อร์ตรับสัญญาณเพยี งช่องเดียวได้ ดงั รูป ARDUINO VCC A0 R1 GND 1k SW1 R2 680 SW2 8R230 SW3 R4 2.7k SW4 รูปท่ี 4.6-2 การตอ่ ใชง้ านสวิตช์กบั พอร์ตแอนาลอก
ใบงานที่ 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 105 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: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต 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)
106 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชน่ั Serial.print ต่างกนั ตรงท่ีเม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเม่ือสั่งพิมพ์คร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยูท่ ี่ บรรทดั ใหม่ แทนที่จะตอ่ ทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val) Serial.println(val, format) 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ นั่ ที่อา่ นสัญญาณแอนาลอกที่ปรากฏอยทู่ ่ีขาพอร์ต แอนาลอกที่ตอ้ งการอ่านน้นั ๆ คา่ ท่ีอ่านไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรท่ีเป็น int สาหรับเกบ็ คา่ ที่อา่ นได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกท่ีตอ้ งการอ่านค่าสญั ญาณแอนาลอก 7. วงจรทใี่ ช้ทดลอง วงจรเพอ่ื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 7,20 ATMEGA328 10k VCC SW1 1 RST AVCC D2 4 R4-R7 LED1-LED3 220 C1 D3 5 0.1uF D4 6 USB to UART (TTL Level) R2,R3 3 D5 11 VCC 1k 2 DTR R8 RXD D1(TXD) 1k SW1 TXD D0(RXD) R9 +5V 680 SW2 GND R10 3V3 820 SW3 R11 A0 2.7k SW4 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.6-3 วงจรที่ใชไ้ อซี AVR ในการทดลอง
รูปท่ี 4.6-6 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน รูปที่ 4.6-5 การตอ่ ลงบอร์ดทดลอง ABCDE F GH I J รูปที่ 4.6-4 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป การตอ่ วงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง D11 ARDUINO 3V3 D10 D2 REF D9 D3 A0 D8 5 D4 5 A1 D7 D5 A2 D6 A3 D5 VCC A4 D4 A5 D3 10 10 A6 D2 A7 5V GND RST RST GND 15 VIN D0 D1 15 20 20 A0 GND 25 25 ใบงานที่ 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 107 30 30 35 35 R4 1k SW1 R5 680 SW2 R6 820 SW3 R7 2.7k SW4 40 40 R1-R3 220 45 45 LED1-LED3 50 50 55 55 60 60 ABCDE F GH I J
108 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมอ่านค่าแอนาลอกจากการกดสวติ ช์แตล่ ะตวั โดยแสดงผลท่ีจอคอมพิวเตอร์ ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง อ่านค่าจากสวิตช์ แสดงค่าทอ่ี ่านได้ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define sw 0 // switch connectec A0 2 void setup() 3{ 4 Serial.begin(9600); 5} 6 void loop() 7{ 8 int adc=analogRead(sw); 9 Serial.print(\"value from sw is: \"); 10 Serial.println(adc); 11 delay(100); 12 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 กาหนดช่ือ sw ใหแ้ ทน 0 (เป็นขาที่วงจรสวติ ช์ต่อเขา้ ท่ีขา A0 ของ Arduino) - บรรทดั ท่ี 4 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 8 อ่านค่าแอนาลอกจากวงจรสวติ ชโ์ ดยนาเขา้ มาเก็บไวใ้ นตวั แปร adc - บรรทดั ที่ 10 แสดงค่าแอนาลอกจากการกดสวติ ช์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. บนั ทึกผลค่าท่ีอ่านได้จากการกดสวิตช์แต่ละตัวและบนั ทึกผลเพื่อนาไปใช้งานในการ ทดลองถดั ไป การกดสวติ ช์ ไมก่ ดสวติ ช์ กดสวติ ช์ SW1 กดสวติ ช์ SW2 กดสวติ ช์ SW3 กดสวติ ช์ SW4 ค่าท่ีอ่านได้
ใบงานที่ 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 109 การทดลองท่ี 2 เน่ืองจากค่าที่อ่านจากการกดสวิตช์เขา้ มาทางพอร์ตแอนาลอกมีโอกาสท่ีตวั เลขจะแกวง่ ได้ ดงั น้นั หากเขียนโปรแกรมโดยวธิ ีการตรวจสอบการเท่ากนั ของค่าที่กาหนดมีโอกาสจะคลาดเคลื่อนได้ ทางแกป้ ัญหาการแกวง่ ของค่าทาไดโ้ ดยเพ่ิมช่วงในการตรวจสอบแทนท่ีจะตรวจสอบเพียงค่าเดียว การ ทดลองน้ีเป็นการทดลองการกดสวติ ช์ที่รับเขา้ มาทางพอร์ตแอนาลอกและมีการเพิม่ ช่วงในการตรวจสอบ เป็น 30 คา่ และแสดงผลเป็นขอ้ ความวา่ สวติ ชใ์ ดถูกกด หมายเหตุ ค่าที่ใชต้ รวจสอบจะตอ้ งใชผ้ ลจากการทดลองในการทดลองที่ 1 สาหรับตวั อยา่ งการทดลองที่ 2 สมมุติวา่ ไดค้ า่ ดงั รูปที่ 4.6-7 (สาหรับการทดลองจริงใหใ้ ชค้ ่าจริงท่ีไดจ้ ากการทดลอง) Value Value 1024 No sw presses 1024 No sw presses 827 sw4 is pressed 827 sw4 is pressed 614 sw3 is pressed 614 sw3 is pressed 415 sw2 is pressed 415 sw2 is pressed 0 sw1 is pressed Time 0 sw1 is pressed Time รูปที่ 4.6-7 การตรวจสอบแบบคา่ เดียว รูปที่ 4.6-8 การตรวจสอบแบบช่วง ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง อ่านคา่ จากพอร์ต อย่ใู นช่วงท่ี 1 จริง แสดงข้อความ เท็จ จริง แสดงข้อความ จริง แสดงข้อความ อย่ใู นช่วงที่ 2 จริง แสดงข้อความ เท็จ อย่ใู นช่วงที่ 3 เท็จ อย่ใู นช่วงที่ 4 เทจ็
110 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino แบบท่ี 1 ตรวจสอบคา่ ที่อ่านไดแ้ บบคา่ เดียวไมเ่ พมิ่ ช่วงตรวจสอบ 1 #define sw 0 // switch connectec A0 2 void setup() 3{ 4 Serial.begin(9600); 5} 6 void loop() 7{ 8 int adc=analogRead(sw); 9 if (adc==0) 10 { 11 Serial.print(\"SW1 is pressed : value adc is: \"); 12 Serial.println(adc); 13 } 14 else if(adc==415) 15 { 16 Serial.print(\"SW2 is pressed : value adc is: \"); 17 Serial.println(adc); 18 } 19 else if(adc==614) 20 { 21 Serial.print(\"SW3 is pressed : value adc is: \"); 22 Serial.println(adc); 23 } 24 else if(adc==827) 25 { 26 Serial.print(\"SW4 is pressed : value adc is: \"); 27 Serial.println(adc); 28 } 29 delay(100); 30 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือ sw ใหแ้ ทน 0 (เป็นขาท่ีวงจรสวติ ชต์ อ่ เขา้ ที่ขา A0 ของ Arduino) - บรรทดั ที่ 4 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 8 อา่ นคา่ แอนาลอกจากวงจรสวติ ชโ์ ดยนาเขา้ มาเกบ็ ไวใ้ นตวั แปร adc - บรรทดั ที่ 9 ตรวจสอบวา่ ใช่คา่ ที่เกิดจากการกดสวติ ช์ 1 หรือไม่ (ถา้ กดคา่ ท่ีอ่านไดจ้ ะมีค่าเป็น 0) - บรรทัดท่ี 11-12 แสดงค่าขอ้ ความพร้อมค่าท่ีอ่านจากพอร์แอนาลอกจากการกดสวิตช์ผา่ นทาง พอร์ตอนุกรม - บรรทัดท่ี 14 หากไม่ใช่เง่ือนไขในบรรทดั ที่ 9 ให้ตรวจสอบว่าใช่ค่าที่เกิดจากการกดสวิตช์ 2 หรือไม่ (ถา้ กดค่าท่ีอ่านไดจ้ ะมีค่าเป็น 415) - บรรทัดท่ี 16-17 แสดงค่าขอ้ ความพร้อมค่าที่อ่านจากพอร์แอนาลอกจากการกดสวิตช์ผ่านทาง พอร์ตอนุกรม - บรรทดั ท่ี 19-28 ทากระบวนการตรวจสอบและแสดงผลเช่นเดียวกบั บรรทดั ที่ 14-17 แต่เป็ นการ ตรวจสอบคา่ จากการกดสวติ ช์ 3 และ 4 ตามลาดบั - บรรทดั ท่ี 29 หน่วงเวลา 100mS (1/10 วนิ าที)
ใบงานที่ 4.6 การเขียนโปรแกรมรับสวติ ชท์ างพอร์ตแอนาลอก 111 แบบที่ 2 ตรวจสอบคา่ ที่อา่ นไดช้ นิดเพ่มิ ช่วงตรวจสอบ 1 #define sw 0 // switch connectec A0 2 #define range 30 3 void setup() 4{ 5 Serial.begin(9600); 6} 7 void loop() 8{ 9 int adc=analogRead(sw); 10 if (adc<0+range) 11 { 12 Serial.print(\"SW1 is pressed : value adc is: \"); 13 Serial.println(adc); 14 } 15 else if((adc<415+range) && (adc>415-range)) 16 { 17 Serial.print(\"SW2 is pressed : value adc is: \"); 18 Serial.println(adc); 19 } 20 else if((adc<614+range) && (adc>614-range)) 21 { 22 Serial.print(\"SW3 is pressed : value adc is: \"); 23 Serial.println(adc); 24 } 25 else if((adc<827+range) && (adc>827-range)) 26 { 27 Serial.print(\"SW4 is pressed : value adc is: \"); 28 Serial.println(adc); 29 } 30 delay(100); 31 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือ sw ใหแ้ ทน 0 (เป็นขาท่ีวงจรสวติ ช์ตอ่ เขา้ ท่ีขา A0 ของ Arduino) - บรรทดั ท่ี 2 กาหนดชื่อ range ใหแ้ ทน 30 เป็นค่าท่ีใชใ้ นการเพม่ิ ช่วงการตรวจสอบ - บรรทดั ที่ 5 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 9 อา่ นค่าแอนาลอกจากวงจรสวติ ช์โดยนาเขา้ มาเกบ็ ไวใ้ นตวั แปร adc - บรรทดั ที่ 10 ตรวจสอบวา่ ใช่คา่ ที่เกิดจากการกดสวติ ช์ 1 หรือไม่ โดยตรงสอบค่าต้งั แตช่ ่วง 0-30 - บรรทัดที่ 12-13 แสดงค่าขอ้ ความพร้อมค่าท่ีอ่านจากพอร์แอนาลอกจากการกดสวิตช์ผา่ นทาง พอร์ตอนุกรม - บรรทัดที่ 15 หากไม่ใช่เงื่อนไขในบรรทดั ท่ี 9 ให้ตรวจสอบว่าใช่ค่าท่ีเกิดจากการกดสวิตช์ 2 หรือไม่ โดยตรวจสอบคา่ ในช่วง 415 30 - บรรทัดที่ 17-18 แสดงค่าขอ้ ความพร้อมค่าท่ีอ่านจากพอร์แอนาลอกจากการกดสวิตช์ผา่ นทาง พอร์ตอนุกรม - บรรทดั ที่ 20-28 ทากระบวนการตรวจสอบและแสดงผลเช่นเดียวกบั บรรทดั ที่ 15-18 แต่เป็ นการ ตรวจสอบคา่ จากการกดสวติ ช์ 3 และ 4 ตามลาดบั - บรรทดั ที่ 30 หน่วงเวลา 100mS (1/10 วนิ าที)
112 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. สงั เกตผลแลว้ เปรียบเทียบความแตกตา่ งระหวา่ งทดสอบค่าเดียวกบั แบบเพิม่ ช่วง 9. สรุปผลการปฏบิ ัติงาน 10. งานทมี่ อบหมาย 1. ปรับปรุงโปรแกรมในการทดลองที่ 2 โดยใหส้ ามารถตรวจสอบการปล่อยคียไ์ ดด้ ว้ ย และให้ สวติ ช์แตล่ ะตวั ควบคุมการติดดบั ของ LED ดงั น้ี สวติ ช์ที่ถูกกด ผลที่ตอ้ งการ SW1 LED 1 ติดสวา่ ง พร้อมแสดงขอ้ ความ SW2 LED 2 ติดสวา่ ง พร้อมแสดงขอ้ ความ SW3 LED 3 ติดสวา่ ง พร้อมแสดงขอ้ ความ SW4 LED ทุกตวั ดบั ท้งั หมด พร้อมแสดงขอ้ ความ ARDUINO R1-R3 LED1-LED3 D2 220 D3 D4 VCC D5 R4 A0 1k SW1 R5 GND 680 SW2 R6 820 SW3 R7 2.7k SW4 รูปท่ี 4.6-9 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.7 การเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ ง 113 ใบงานที่ 4.7 การเขยี นโปรแกรมควบคุมเอาต์พตุ พอร์ตด้วยแสงสว่าง 1. จุดประสงค์ทว่ั ไป เพอื่ ใหส้ ามารถเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ งได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ งได้ 2. บอกข้นั ตอนการตอ่ วงจรเพอื่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 1 ตวั 2.1 ตวั ตา้ นทาน 10k 1 ตวั 2.3 LED 3mm 1 ตวั 2.4 LDR 1 เส้น 2.2 ตวั ตา้ นทาน 220 ohm 4 ตวั 1 ชุด 1 เคร่ือง 3. บอร์ด Arduino Nano 3.0 4. สายเชื่อมต่อ USB (Mini USB) 5. สายเช่ือมตอ่ วงจร 6. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ัตงิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
114 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน อุปกรณ์อิเล็กทรอนิกส์ที่สามารถเปลี่ยนแปลงคุณสมบตั ิไดต้ ามความเขม้ ของแสงมีอยหู่ ลายชนิด หน่ึงในน้ันได้แก่ตวั ตา้ นทานเปลี่ยนแปลงตามแสงท่ีเรียกกนั ว่า “แอลดีอาร์” (LDR: Light Dependent Resistor) LDR บางคร้ังเรียกว่าโฟโตรีซีสเตอร์หรือโฟโตคอนดคั เตอร์ โดยทว่ั ไป LDR จะมีค่าความ ตา้ นทานต่ามากขณะได้รับแสงความเขม้ สูงและมีค่าความตา้ นทานสูงหากไม่ได้รับแสง ซ่ึงค่าความ ตา้ นทานโดยประมาณเป็นดงั น้ี - เม่ือระดบั แสงที่ 1000 lux (สวา่ งมาก) ค่าความตา้ นทานจะต่ากวา่ 400 Ω - เมื่อระดบั แสงที่ 10 lux (ระดบั ความสวา่ งต่ามาก) คา่ ความตา้ นทานจะสูงกวา่ 10.43 MΩ1 (a) (b) LDR รูปที่ 4.7-1 (a) รูปร่าง LDR (b) กราฟคุณสมบตั ิ และ (c) สัญลกั ษณ์ของ LDR (c) LDR ผลิตมาจากสารก่ึงตวั นาประเภทแคดเม่ียม ซ่ึงเมื่อทาเป็ นสารก่ึงตวั นาจะมีประสิทธิภาพใน การนากระแสแตกต่างกันอย่างชัดเจนในขณะได้รับแสงท่ีความเขม้ ต่างกนั สารก่ึงตวั นาชนิดน้ีเม่ือ เจือสารอ่ืนจะทาใหต้ อบสนองตอ่ ยา่ นแสงต่างกนั ไดแ้ ก่ 1. แคดเม่ียมซลั ไฟด์ ( Cds : Cadmium Sulfide) ไวตอ่ แสงสีเขียว 2. แคดเมี่ยมซิลินายส์ ( CdSe : Cadmium Selenide) ไวต่อแสงสีแดงจนถึงอินฟาเรด 3. แคดเมี่ยมซัลไฟด์ซิลินายส์ ( Cd(S-Se) : Cadmium Sulfide Selenide) ไวต่อแสงสีส้มถึงสี แดง รูปที่ 4.7-2 กราฟความไวต่อแสงสีของ LDR ท่ีผลิตจากสารตา่ งชนิด 1 http://www.technologystudent.com/elec1/ldr1.htm
ใบงานที่ 4.7 การเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ ง 115 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: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต 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);
116 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชั่น Serial.print ต่างกนั ตรงท่ีเม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเม่ือส่ังพิมพ์คร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนที่จะตอ่ ทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val); Serial.println(val, format); 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ที่อ่านสัญญาณแอนาลอกท่ีปรากฏอยทู่ ี่ขาพอร์ต แอนาลอกที่ตอ้ งการอ่านน้นั ๆ คา่ ท่ีอา่ นไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรท่ีเป็น int สาหรับเกบ็ ค่าท่ีอา่ นได้ analogRead(pin); pin: ขาพอร์ตแอนาลอกที่ตอ้ งการอา่ นค่าสญั ญาณแอนาลอก ตัวอย่างเช่น int ADC analogRead(0) หมายถึง อา่ นสัญญาณแอนาลอกท่ีขา A0 นามาเกบ็ ในตวั แปร ADC 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 C1 R4-R7 LED1-LED3 0.1uF 220 USB to UART (TTL Level) R21,kR3 3 D2 4 2 D3 5 DTR D1(TXD) D4 6 RXD D0(RXD) D5 11 TXD +5V GND 3V3 X1 9 XTAL1 A5 28 VCC 16MHz 10 XTAL2 R8 10k C2,C3 GND 22pF LDR 8,22 รูปที่ 4.7-3 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
ใบงานที่ 4.7 การเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ ง 117 กรณีที่ใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป R1-R4 LED1-LED4 220 ARDUINO D2 D3 D4 D5 A5 VCC GND R5 10k LDR รูปท่ี 4.7-4 วงจรท่ีใชบ้ อร์ด 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 ABCDE D13 3V3 REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปที่ 4.7-5 การตอ่ ลงบอร์ดทดลอง การตอ่ วงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.7-6 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน
118 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมอ่านค่าจาก LDR แสดงผลค่าที่อ่านไดท้ ่ีจอคอมพิวเตอร์ผา่ นทางพอร์ต อนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง อ่านคา่ จาก LDR แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LDRPin A5 2 void setup() 3{ 4 Serial.begin(9600); 5} 6 void loop() 7{ 8 int ADCvalue=analogRead(LDRPin); 9 Serial.print(\"Analog value from LDR is : \"); 10 Serial.println(ADCvalue); 11 delay(200); 12 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดชื่อ LDRPin ใหแ้ ทน A5 (เป็นขาที่วงจร LDR ตอ่ เขา้ ท่ีขา A5 ของ Arduino) - บรรทดั ท่ี 4 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 8 กาหนดตวั แปรพร้อมอ่านคา่ แอนาลอกจากวงจร LDR มาเกบ็ ลงในตวั แปร - บรรทดั ที่ 10 แสดงค่าแอนะลอกที่อ่านไดท้ ี่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพมิ่ /ลด คา่ แสงที่ไดร้ ับท่ีตวั LDR สงั เกตคา่ ท่ีอ่านได้
ใบงานที่ 4.7 การเขียนโปรแกรมควบคุมเอาตพ์ ตุ พอร์ตดว้ ยแสงสวา่ ง 119 การทดลองที่ 2 เขียนโปรแกรมควบคุมการติดดบั LED จานวน 1 ตวั ดว้ ยแสงสวา่ งที่อ่านค่าจาก LDR ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง อ่านคา่ จาก LDR แสดงค่าทอ่ี า่ นได้ จริง ค่าสงู กว่าท่กี าหนด? เทจ็ สั่งให้ LED ติด สั่งให้ LED ดบั แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LDRPin A5 2 #define LED 2 3 void setup() 4{ 5 pinMode(LED,OUTPUT); 6 Serial.begin(9600); 7} 8 void loop() 9{ 10 int ADCvalue=analogRead(LDRPin); 11 Serial.print(\"Analog value from LDR is : \"); 12 Serial.println(ADCvalue); 13 digitalWrite(LED, ADCvalue>512? HIGH:LOW); 14 delay(200); 15 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1,2 กาหนดช่ือขาพอร์ตท่ีใชเ้ ช่ือมต่อกบั LDR และ LED - บรรทดั ที่ 6 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 10 กาหนดตวั แปรพร้อมอา่ นค่าแอนาลอกจากวงจร LDR มาเกบ็ ลงในตวั แปร - บรรทดั ที่ 12 แสดงค่าแอนะลอกที่อา่ นไดท้ ี่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทดั ท่ี 13 สงั่ ให้ LED ติดดบั จากการตรวจสอบค่าในเงื่อนไขที่กาหนด (ใชฟ้ ังชน่ั if-else แบบ ยอ่ รายละเอียดการใชง้ านหนา้ ที่ 30) ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพิ่ม/ลด คา่ แสงที่ไดร้ ับท่ีตวั LDR สังเกตคา่ ท่ีอา่ นไดแ้ ละการทางานของ LED
120 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมควบคุมการติดดบั ของ LED 4 ตวั ตามอุณหภูมิ ใหส้ ามารถติดหรือดบั ท้งั หมด ในช่วงอุณหภูมิที่สามารถทดลองได้ วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO R1-R5 LED1-LED5 220 VCC D2 R5 D3 10k A5 D4 D5 LDR D6 GND รูปที่ 4.7- วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง ช่วงค่าความสวา่ งท่ี LDR ไดร้ ับ รูปแบบการติดสวา่ งของ LED สว่างมากสุด สวา่ งนอ้ ยสุด
ใบงานท่ี 4.8 การเขียนโปรแกรมวดั อณุ หภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC 121 ใบงานที่ 4.8 การเขยี นโปรแกรมวดั อุณหภูมดิ ้วยเทอร์มสิ เตอร์ชนิด NTC 1. จุดประสงค์ทวั่ ไป เพอ่ื ใหส้ ามารถเขียนโปรแกรมวดั อุณหภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมวดั อุณหภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพอ่ื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 1 ตวั 2.1 ตวั ตา้ นทาน 10k 1 ตวั 2.3 LED 3mm 1 ตวั 2.4 Thermistor NTC 10k 1 เส้น 2.2 ตวั ตา้ นทาน 220 ohm 4 ตวั 1 ชุด 1 เคร่ือง 3. บอร์ด Arduino Nano 3.0 4. สายเชื่อมต่อ USB (Mini USB) 5. สายเช่ือมต่อวงจร 6. คอมพิวเตอร์ 4. ลาดบั ข้นั การปฏบิ ัติงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เก่ียวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
122 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน เทอร์มิสเตอร์ (Thermistor) เป็นตวั วดั อุณหภูมิแบบสารก่ึงตวั นาท่ีใชห้ ลกั การการเปล่ียนแปลง ความตา้ นทานเมื่ออุณหภูมิเปล่ียนไปโดยมีดว้ ยกนั 2 แบบคือ 1. NTC (Negative Temperature Coefficient) มีคุณสมบตั ิแปรผนั ผกผนั กบั อุณหภูมิ กล่าวคือ เม่ืออุณหภูมิสูงข้ึนคา่ ความตา้ นทานจะลดต่าลง 2. PTC (Positive Temperature Coefficient) มีคุณสมบตั ิแปรผนั ตรงกบั อุณหภูมิ กล่าวคือเม่ือ อุณหภูมิสูงข้ึนคา่ ความตา้ นทานจะสูงข้ึนตาม ในทางปฏิบตั ิเทอร์มิสเตอร์ท่ีมีจาหน่ายในทอ้ งตลาดส่วนใหญท่ ่ีพบมากจะเป็นชนิด NTC ใบงาน น้ีเป็นใบงานท่ีนาเทอร์มิสเตอร์ชนิดน้ีมาใชง้ าน โดยการนามาใชง้ านจะใชเ้ ทอร์มิสเตอร์ NTC ท่ีมีคา่ ความ ตา้ นทานท่ี 10k ที่อุณหภูมิหอ้ ง (25 C) อนุกรมกบั ตวั ตา้ นทานขนาด 10k เป็นวงจรแบ่งแรงดนั ดงั รูป VCC 10k T Thermistor 10k รูปท่ี 4.8-1 วงจรแบง่ แรงดนั ในการนาเทอร์มิสเตอร์ไปใชง้ าน ค่าแรงดนั ที่ได้ส่งเขา้ ไปยงั ขาพอร์ตแอนาลอกเพ่ืออ่านค่าเข้าซีพียูเพ่ือนาไปคานวณเป็ นค่า อุณหภูมิต่อไป โดยสมการของวงจรเป็นดงั น้ี สมการวงจรแบ่งแรงดนั = RNTC 1023 ADC 10k RNTC 10k RNTC = 1023 RNTC 10k RNTC ADC 10k = 1023RNTC 10k ADC RNTC = 1023RNTC RNTC ADC = RNTC 1023 1 ADC = 10k 1023 1 ADC
ใบงานที่ 4.8 การเขียนโปรแกรมวดั อุณหภมู ิดว้ ยเทอร์มิสเตอร์ชนิด NTC 123 สมการอุณหภูมิ 1 =1 1 RNTC T B ln RNTC 0 T0 เมื่อ T อุณหภูมิหน่วยเป็ นเคลวนิ T0 อุณหภูมิหอ้ งปกติที่ 25 องศาเซลเซียสหน่วยเป็นเคลวนิ (25+273.15) B คา่ สมั ประสิทธ์ิของเทอร์มิสเตอร์ NTC มีคา่ เป็น 3950 RNTC0 คา่ ความตา้ นทานของเทอร์มิสเตอร์ NTC ที่อุณหภูมิหอ้ งปกติมีคา่ เท่ากบั 10k 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: หมายเลขขาท่ีตอ้ งการเขียนลอจิกออกพอร์ต 3. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาที่ ตอ้ งการหยุดคา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long)
124 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 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: ขาพอร์ตแอนาลอกท่ีตอ้ งการอ่านคา่ สญั ญาณแอนาลอก ตวั อย่างเช่น int ADC analogRead(0) หมายถึง อา่ นสัญญาณแอนาลอกท่ีขา A0 นามาเก็บในตวั แปร ADC 7. วงจรทใ่ี ช้ทดลอง วงจรเพอื่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus
ใบงานที่ 4.8 การเขียนโปรแกรมวดั อณุ หภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC 125 กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC C1 R4-R7 LED1-LED3 0.1uF 220 USB to UART (TTL Level) R2,R3 3 D2 4 1k 2 D3 5 DTR D4 6 RXD D1(TXD) D5 11 TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 A5 28 VCC 16MHz 10 XTAL2 R8 10k C2,C3 GND 22pF NTC 8,22 T Thermistor 10k รูปท่ี 4.8-2 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป R1-R4 LED1-LED4 220 ARDUINO D2 D3 D4 D5 VCC A5 R5 NTC GND 10k Thermistor 10k T รูปที่ 4.8-3 วงจรท่ีใชบ้ อร์ด 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 ABCDE D13 3V3 REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปที่ 4.8-4 การตอ่ ลงบอร์ดทดลอง
126 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.8-5 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน หมายเหตุ โปรแกรมจาลองบางเวอร์ชน่ั อาจจาลอง NTC ไม่ได้ (เช่น 7.10) ใหเ้ ปล่ียนไปใชเ้ วอร์ชนั่ อื่นท่ี สามารถจาลองได้ (เช่น 8.60) 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมอ่านคา่ จากเทอร์มิสเตอร์ NTC ขนาด 10k โดยใหแ้ สดงผลเป็นอุณหภูมิที่มี หน่วยเป็นเซสเซียส (เขียนโคด้ จากสมการในทฤษฎี) แสดงผลที่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง อ่านคา่ จาก NTC คานวณ แสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define NTCPin A5 2 #define SERIESRESISTOR 10000 3 #define NOMINAL_RESISTANCE 10000 4 #define NOMINAL_TEMPERATURE 25 5 #define BCOEFFICIENT 3950 6 void setup() 7{ 8 Serial.begin(9600); 9} 10 void loop() 11 { 12 float ADCvalue; 13 float Resistance; 14 float steinhart; 15 ADCvalue = analogRead(NTCPin);
ใบงานท่ี 4.8 การเขียนโปรแกรมวดั อุณหภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC 127 16 Resistance = (1023 / ADCvalue) - 1; 17 Resistance = SERIESRESISTOR / Resistance; 18 steinhart = Resistance / NOMINAL_RESISTANCE; // (R/Ro) 19 steinhart = log(steinhart); // ln(R/Ro) 20 steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) 21 steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15); // + (1/To) 22 steinhart = 1.0 / steinhart; // Invert 23 steinhart -= 273.15; // convert to C 24 Serial.print(\"Temperature is : \"); 25 Serial.print(steinhart); 26 Serial.println(\" 'C\"); 27 delay(1000); 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 กาหนดชื่อ NTCPin ใหแ้ ทน A5 (เป็นขาที่วงจร NTC ตอ่ เขา้ ที่ขา A5 ของ Arduino) - บรรทัดท่ี 2-5 กาหนดช่ือแทนค่าคงท่ีต่าง ๆ ท่ีใช้ในการคานวณค่าที่อ่านไดจ้ าก NTC มาเป็ น ตวั เลขอุณหภูมิ - บรรทดั ท่ี 8 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ที่ 12-14 กาหนดตวั แปรที่สามารถเก็บตวั เลขทศนิยมไดเ้ อาไวเ้ ก็บค่าเม่ือคานวณค่าท่ีอ่าน ไดจ้ าก NTC มาเป็นตวั เลขอุณหภูมิ - บรรทดั ที่ 15 อ่านคา่ แอนาลอกจากวงจร NTC มาเก็บลงในตวั แปร ADCvalue - บรรทัดท่ี 16-23 คานวณค่าที่อ่านไดจ้ าก NTC มาเป็ นตวั เลขอุณหภูมิ โดยเก็บค่าอุณหภูมิที่เป็ น องศาเซลเซียสไวใ้ นตวั แปร Steinhart - บรรทดั ท่ี 25 แสดงคา่ อุณภูมิจากตวั แปร Steinhart ที่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพ่ิม/ลด อุณหภูมิท่ีตวั เทอร์มิสเตอร์ สงั เกตคา่ อุณหภูมิที่อา่ นได้ การทดลองที่ 2 เขียนโปรแกรมอา่ นค่าจากเทอร์มิสเตอร์ NTC ขนาด 10k โดยใหแ้ สดงผลเป็นอุณหภูมิท่ีมี หน่วยเป็นเซสเซียส (เขียนแบบยอ่ ) แสดงผลท่ีจอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง อ่านค่าอุณหภูมิ แสดงผล
128 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define NTC A5 2 double Thermistor(int RawADC) ; 3 void setup() 4{ 5 Serial.begin(9600); 6} 7 void loop() 8{ 9 float Temp=Thermistor(analogRead(NTC)); 10 Serial.print(\"Temperature is : \"); 11 Serial.print(Temp); 12 Serial.println(\" 'C\"); 13 delay(1000); 14 } 15 double Thermistor(int RawADC) 16 { 17 double Cal; 18 Cal = log(10000.0/((1024.0/RawADC-1))); 19 Cal = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Cal * Cal))* Cal); 20 Cal = Cal - 273.15; // Convert Kelvin to Celcius 21 return Cal; 22 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดชื่อ NTCPin ใหแ้ ทน A5 (เป็นขาที่วงจร NTC ตอ่ เขา้ ท่ีขา A5 ของ Arduino) - บรรทดั ที่ 2 ประกาศรูปแบบของฟังกช์ น่ั รองที่ใชค้ านวณค่าอุณหภูมิ - บรรทดั ที่ 8 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทัดท่ี 9 ประกาศตวั แปรและเรียกใชฟ้ ังก์ชน่ั รองโดยการส่งค่าจากการอ่านค่าจากขาพอร์ต แอนาลอกท่ีต่อกบั เทอร์มิสเตอร์ NTC ดว้ ยฟังก์ชน่ั analogRead (ฟังก์ชนั่ ซ้อนฟังก์ชั่น)โดยให้ ฟังกช์ น่ั รองทาการคานวณค่าที่อา่ นไดไ้ ปเป็นค่าอุณหภูมิที่เป็ นองศาเซลเซียสแลว้ ใหส้ ่งเขา้ ไปยงั ตวั แปร Temp - บรรทดั ท่ี 11 แสดงคา่ อุณภูมิจากตวั แปร Temp ท่ีจอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทัดท่ี 15-22 เป็ นฟังกช์ น่ั รองที่ใชค้ านวณค่าที่ส่งเขา้ มาให้เป็ นค่าอุณหภูมิเป็ นองศาเซลเซียส แลว้ กลบั คืนคา่ ออกนอกฟังกช์ นั่ ดว้ ยคา่ ในตวั แปร Cal ซ่ึงเป็นคา่ อุณหภูมิเป็นองศาเซลเซียส ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. สงั เกตขอ้ แตกตา่ งของอุณภูมิเม่ือเทียบกบั การทดลองที่ 1 4. ทดลองเพิ่ม/ลด อุณหภูมิที่ตวั เทอร์มิสเตอร์ สงั เกตค่าอุณหภูมิที่อา่ นได้
ใบงานที่ 4.8 การเขียนโปรแกรมวดั อณุ หภมู ิดว้ ยเทอร์มิสเตอร์ชนิด NTC 129 9. สรุปผลการปฏบิ ัตงิ าน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมควบคุมการติดดบั ของ LED 4 ตวั ตามอุณหภูมิ ใหส้ ามารถติดหรือดบั ท้งั หมด ในช่วงอุณหภูมิที่สามารถทดลองได้ วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO R1-R4 LED1-LED4 220 D2 D3 D4 D5 VCC A5 R5 NTC GND 10k Thermistor 10k T รูปท่ี 4.8-6 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง หมายเหตุ สามารถให้เทอร์มิสเตอร์ NTC อ่านค่าให้ไดอ้ ุณหภูมิที่แตกต่างกนั โดยการส่งผา่ น ความร้อนความเยน็ ไปยงั ตวั NTC ซ่ึงอาจใชอ้ ุณหภูมิจากนิ้วมือหรือใชว้ ธิ ีอื่นที่ทาได้ รูปแบบการติดสวา่ งของ LED ในแต่ละช่วงอุณหภูมิท่ีทาได้ ช่วงอุณหภูมิ รูปแบบการติดสวา่ งของ LED คา่ อณุ หภมู ิต่าสดุ ที่ทาได้ คา่ อุณหภมู สิ ูงสุดทท่ี าได้
130 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. เขียนโปรแกรมวดั ค่าอุณหภูมิโดยใช้เทอร์มิสเตอร์ 2 ตวั แลว้ เปรียบเทียบความแตกต่างของ อุณหภูมิท่ีวดั ได้ วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO VCC R1 10k A4 NTC T Thermistor 10k VCC A5 R102k NTC GND Thermistor T 10k บนั ทึกผลลงตาราง อุณหภูมิท่ีวดั จาก NTC ตวั ท่ี 2 คา่ ที่ อุณหภูมิท่ีวดั จาก NTC ตวั ที่ 1 1 2 3 4 5
ใบงานที่ 4.9 การเขียนโปรแกรมวดั อณุ หภูมิดว้ ยไอซี LM35 131 ใบงานท่ี 4.9 การเขยี นโปรแกรมวดั อุณหภูมดิ ้วยไอซี LM35 1. จุดประสงค์ทวั่ ไป เพื่อใหส้ ามารถเขียนโปรแกรมวดั อุณหภูมิดว้ ยไอซี LM35ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมวดั อุณหภูมิดว้ ยไอซี LM35ได้ 2. บอกข้นั ตอนการต่อวงจรเพอื่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 4 ตวั 2.1 ไอซี LM35 1 ตวั 2.3 LED 3mm 1 ตวั 1 เส้น 2.2 ตวั ตา้ นทาน 220 ohm 4 ตวั 1 ชุด 1 เครื่อง 3. บอร์ด Arduino Nano 3.0 4. สายเช่ือมต่อ USB (Mini USB) 5. สายเชื่อมตอ่ วงจร 6. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ัตงิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
132 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน LM35 เป็ นไอซีเซนเซอร์อุณหภูมิท่ีไดร้ ับความนิยมนามาใชง้ านมากเบอร์หน่ึง มีช่วงอุณหภูมิ การใช้ต้งั แต่ -55° to +150°C ค่าอุณหภูมิจะแปรผนั ตรงกบั ค่าแรงดนั ที่ส่งออกมาทางเอาต์พุตซ่ึงมีค่า 10mV/°C คา่ ความถูกตอ้ งของอุณหภูมิท่ีวดั ไดเ้ ท่ากบั ±0.4°C ที่อุณหภูมิหอ้ ง (25°C) รูปท่ี 4.9-1 รูปร่างของไอซี LM35 การตอ่ วงจรเพอ่ื ใชง้ านสามารถตอ่ ใชง้ านได้ 2 แบบข้ึนอยกู่ บั ช่วงอุณหภูมิท่ีตอ้ งการตรวจวดั เช่น ช่วงอุณหภูมิอยู่ในช่วงบวกคือต้งั แต่ +2°C ถึง +150°C สามารถต่อโดยตรงดังรูป (a) แต่ถ้าต้องการ ตรวจวดั อุณหภูมิท่ีต่ากว่าศูนยอ์ งศาเซลเซียสจะตอ้ งต่อตวั ตา้ นทานเพ่ิมเพ่ือให้แรงดนั เอาต์พุตต่ากว่า 0 โวลตไ์ ดด้ งั รูป (b) ช่วงอุณหภูมิที่ใชต้ รวจวดั +2°C ถึง +150°C -55°C ถึง +150°C VCC VCC 1 LM35 1 LM35 2 VCC 2 VCC OUT OUT GND GND 3 3 -VEE (a) (b) รูปท่ี 4.9-2 การต่อใชง้ านในช่วงอุณหภูมิท่ีใชต้ รวจวดั ตา่ งกนั ในกรณีท่ีตอ้ งการตรวจวดั อุณหภูมิในช่วง -55°C ถึง +150°C จะตอ้ งเพมิ่ แหล่งจา่ ยไฟลบ (-VEE) โดยค่าความตา้ นทานของตวั ตา้ นทานใชค้ า่ ท่ีคานวณไดจ้ ากสมการ R= VEE 50 A 6. ฟังก์ชั่น Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กับขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกที่ตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ น่ั เป็นดงั น้ี
ใบงานที่ 4.9 การเขียนโปรแกรมวดั อณุ หภูมิดว้ ยไอซี LM35 133 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);
134 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 7. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ท่ีอ่านสัญญาณแอนาลอกที่ปรากฏอยทู่ ี่ขาพอร์ต แอนาลอกท่ีตอ้ งการอ่านน้นั ๆ คา่ ที่อา่ นไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรท่ีเป็น int สาหรับเกบ็ ค่าที่อ่านได้ analogRead(pin); pin: ขาพอร์ตแอนาลอกที่ตอ้ งการอา่ นค่าสัญญาณแอนาลอก 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 C1 R4-R7 LED1-LED3 0.1uF 220 USB to UART (TTL Level) R21,kR3 3 D2 4 2 D3 5 DTR D1(TXD) D4 6 RXD D0(RXD) D5 11 TXD +5V GND 3V3 VCC X1 1 16MHz 9 XTAL1 A5 28 2 VCC LM35 10 XTAL2 OUT GND GND C2,C3 3 22pF 8,22 รูปท่ี 4.9-3 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO R1-R4 LED1-LED4 220 D2 VCC 2 A5 D3 D4 LM35 1 D5 VCC OUT GND 3 GND รูปท่ี 4.9-4 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานที่ 4.9 การเขียนโปรแกรมวดั อณุ หภมู ิดว้ ยไอซี LM35 135F GH I J20 2025 2530 3035 3540 4045 4550 50 55 55 60 60 F GH I J D12 1 การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 D10 LM35D9 D8 5 รูปท่ี 4.9-5 การต่อลงบอร์ดทดลองD7 การต่อวงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD6 D5 รูปท่ี 4.9-6 การต่อวงจรทดลองในโปรแกรมจาลองการทางานD4 D3 10 8. การเขยี นโค้ดโปรแกรมควบคุม D2 การทดลองท่ี 1 เขียนโปรแกรมอ่านคา่ จากเทอร์มิสเตอร์ NTC ขนาด 10k โดยใหแ้ สดงผลเป็นอุณหภูมิท่ีมีGND หน่วยเป็นเซสเซียส (เขียนโคด้ จากสมการในทฤษฎี) แสดงผลที่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรมRST ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี D0 START D1 15 กาหนดคา่ เริม่ ต้นต่าง ABCDE ABCDE อ่านคา่ จาก LM35D13 คานวณ3V3 แสดงผลREF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15
136 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LM35_pin A5 2 void setup() 3{ 4 Serial.begin(9600); 5} 6 void loop() 7{ 8 int adc = analogRead(LM35_pin); 9 float temp = adc*(5.0/1023)*100.0; 10 Serial.print(\"Temperature(C) is : \"); 11 Serial.println(temp); 12 delay(1000); 13 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือขาพอร์ตท่ีใชเ้ ช่ือมต่อกบั ไอซี LM35 - บรรทดั ที่ 4 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 8 กาหนดตวั แปรพร้อมอา่ นคา่ แอนาลอกจากไอซี LM35 เก็บลงในตวั แปร - บรรทดั ที่ 9 คานวณค่าที่อ่านไดเ้ ป็นคา่ อุณหภูมิหน่วยเป็นองศาเซลเซียส - บรรทดั ท่ี 11 แสดงคา่ อุณภูมิ ท่ีจอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพิ่ม/ลด อุณหภูมิท่ีตวั ไอซี LM35 สังเกตค่าอุณหภูมิที่อา่ นได้ การทดลองที่ 2 เขียนโปรแกรมควบคุมการติดดบั LED จานวน 1 ตวั ดว้ ยอุณหภูมิท่ีอ่านคา่ จากไอซี LM35 โดยคา่ อุณหภูมิสูงเกิน 32°C ให้ LED ติดหากต่ากวา่ ให้ LED ดบั ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง อ่านคา่ จากไอซี LM35 คานวณเป็ นอุณหภูมแิ ละแสดงผล จริง ค่าสงู กว่าทีก่ าหนด? เทจ็ สั่งให้ LED ติด สั่งให้ LED ดับ
ใบงานที่ 4.9 การเขียนโปรแกรมวดั อณุ หภมู ิดว้ ยไอซี LM35 137 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LM35_pin A5 2 #define LED 2 3 void setup() 4{ 5 pinMode(LED,OUTPUT); 6 Serial.begin(9600); 7} 8 void loop() 9{ 10 int adc = analogRead(LM35_pin); 11 float temp = adc*(5.0/1023)*100.0; 12 Serial.print(\"Temperature(C) is : \"); 13 Serial.println(temp); 14 digitalWrite(LED, temp>32.0? HIGH:LOW); 15 delay(200); 16 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1,2 กาหนดช่ือขาพอร์ตท่ีใชเ้ ช่ือมตอ่ กบั ไอซี LM35 และ LED - บรรทดั ท่ี 6 กาหนดอตั ราเร็วในการส่ือสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 10 กาหนดตวั แปรพร้อมอ่านค่าแอนาลอกจากไอซี LM35 มาเก็บลงในตวั แปร - บรรทดั ที่ 11 คานวณคา่ ที่อ่านไดเ้ ป็นอุณหภูมิหน่วยเป็ นองศาเซลเซียส - บรรทดั ท่ี 13 แสดงค่าอุณหภูมิท่ีตรวจวดั ไดท้ ี่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทดั ที่ 14 ส่งั ให้ LED ติดดบั จากการตรวจสอบคา่ ในเง่ือนไขที่กาหนด (ใชฟ้ ังกช์ นั่ if-else แบบยอ่ ) โค้ดโปรแกรมฟังก์ช่ัน if-else แบบปกติ โค้ดโปรแกรมฟังก์ชั่น if-else แบบย่อ if (temp>32.0) digitalWrite(LED,( temp>32.0)? HIGH:LOW); { digitalWrite(LED,HIGH); } Else { digitalWrite(LED,LOW); } ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองเพิม่ /ลด ค่าอุณหภูมิที่ตวั ไอซี สงั เกตคา่ ท่ีอา่ นไดแ้ ละการทางานของ LED 9. สรุปผลการปฏบิ ัติงาน
138 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมควบคุมการติดดบั ของ LED 4 ตวั ตามอุณหภูมิ ใหส้ ามารถติดหรือดบั ท้งั หมด ในช่วงอุณหภูมิท่ีสามารถทดลองได้ วงจรท่ีใชท้ ดลองเป็นดงั รูป ARDUINO R1-R4 LED1-LED4 220 D2 VCC 2 A5 D3 D4 LM35 1 D5 VCC OUT GND 3 GND รูปท่ี 4.9-7 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง รูปแบบการติดสวา่ งของ LED ในแต่ละช่วงอุณหภูมิท่ีทาได้ ช่วงอุณหภูมิ รูปแบบการติดสวา่ งของ LED ค่าอุณหภูมติ ่าสดุ ที่ทาได้ คา่ อุณหภมู ิสูงสุดทีท่ าได้ หมายเหตุ สามารถให้ไอซี LM35 อ่านค่าให้ไดอ้ ุณหภูมิท่ีแตกต่างกนั โดยการส่งผา่ นความร้อน ความเยน็ ไปยงั ตวั ถงั ไอซีได้ ซ่ึงอาจใชอ้ ุณหภูมิจากนิ้วมือหรือใชว้ ธิ ีอ่ืนท่ีทาได้
ใบงานที่ 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อณุ หภูมิ DS18B20 139 ใบงานท่ี 4.10 การเขยี นโปรแกรมใช้งานไอซีวดั อุณหภูมิ DS18B20 1. จุดประสงค์ทว่ั ไป เพอ่ื ใหส้ ามารถเขียนโปรแกรมใชง้ านไอซีวดั อุณหภูมิ DS18B20ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมใชง้ านไอซีวดั อุณหภูมิ DS18B20ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพือ่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 2 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.3 LED 3mm 1 ตวั 2.4 ไอซี DS18B20 1 เส้น 2.2 ตวั ตา้ นทาน 4.7k 2 ตวั 1 ชุด 1 เครื่อง 3. บอร์ด Arduino Nano 3.0 4. สายเช่ือมตอ่ USB (Mini USB) 5. สายเชื่อมต่อวงจร 6. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
140 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน ไอซีท่ีถูกออกแบบมาสาหรับวดั อุณหภูมิมีอยูห่ ลายแบบ ถา้ แบ่งตามสัญญาณเอาตพ์ ุตจะแบ่งได้ เป็ นสองประเภทคือ ไอซีที่ให้เอาต์พุตแบบแอนาลอกและไอซีท่ีให้ค่าออกมาเป็ นดิจิทลั โดยไอซีแบบ ดิจิทลั จะส่งค่าออกมาเป็ นตวั เลขของอุณหภูมิซ่ึงผูใ้ ชง้ านสามารถนาค่าไปใชง้ านไดโ้ ดยตรงไม่ตอ้ งผ่าน กระบวนการคานวณคา่ เช่นไอซีท่ีใหค้ ่าที่เป็นแอนาลอกอีก ไอซี DS1820 เป็นไอซีถูกออกแบบมาสาหรับวดั อุณหภูมิโดยให้ค่าออกมาเป็นแบบดิจิทลั และใช้ การสื่อสารแบบ 1 เส้นสัญญาณหรือที่เรียกว่า “One wire” การสื่อสารลกั ษณะน้ีไม่ตอ้ งมีสายสัญญาณ นาฬิกามาควบคุมจงั หวะการถ่ายทอดขอ้ มูลเหมือนกบั ระบบส่ือสารขอ้ มูลอนุกรมในแบบอ่ืน ดงั น้นั หาก การใชง้ านที่ตอ้ งเดินสายในระยะไกลจึงมีความสะดวกในการใชง้ าน คุณลกั ษณะทว่ั ไป - DS1820 เป็นไอซีดิจิทลั เทอร์โมมิเตอร์ใชก้ ารอินเตอร์เฟสแบบ 1-Wire ไอซีตระกูลน้ีมีหลาย เบอร์ ข้ึนอยกู่ บั ค่าความละเอียดเช่น • DS1820 คา่ ที่อา่ นได้ 9–bit ความละเอียด 0.5 °C • DS18B20 ค่าท่ีอ่านได้ 12–bit ความละเอียด 0.0625 °C - ใชแ้ รงดนั ไฟเล้ียงไดใ้ นช่วง 3.0V ถึง 5.5V - ยา่ นการวดั ต้งั แต่ –55°C ถึง +125°C หรือ –67°F ถึง +257°F ความเท่ียงตรง 0.5°C - ใชเ้ วลาการแปลง 200 ms สาหรับขอ้ มูล 9 บิต และ750 ms สาหรับขอ้ มูล 12 บิต - มี 3 ขา คือ Gnd, DQ, Vdd - ใชง้ านไดส้ องแบบ: normal mode (ใชท้ ้งั 3 ขา) และ parasite power mode (ใชเ้ พียง 2 ขา คือ DQ และ GND ในขณะที่ขา Vdd จะต่อกบั ขา Gnd) - สามารถนาไอซีมาพว่ งตอ่ กนั ในบสั เดียว (เส้นสญั ญาณ DQ) ไดห้ ลายอุปกรณ์ รูปท่ี 4.10-1 ไอซี DS18B20
ใบงานท่ี 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อณุ หภมู ิ DS18B20 141 การเขียนโคด้ โปรแกรมเพื่ออ่านค่าอุณหภูมิจากไอซีวดั อุณหภูมิ DS18B20 ปัจจุบนั มีไลบราร่ี ช่วยงานทาให้ผเู้ ขียนโคด้ สามารถเขียนโคด้ ไดง้ ่ายข้ึน ซ่ึงไลบรารี่ท่ีตอ้ งเอามาใชง้ านเพ่ือท่ีจะอ่านค่าจาก โมดูลดงั กล่าวจะตอ้ งใชไ้ ลบรารี่ 2 ตวั โดยสามารถดาวน์โหลดไดท้ ่ี ไลบรารี่ แหล่งดาวน์โหลด OneWire.h https://github.com/PaulStoffregen/OneWire DallasTemperature.h https://github.com/milesburton/Arduino-Temperature-Control-Library มีข้นั ตอนการดาเนินการเพื่อนาไลบราร่ีมาใชง้ านดงั น้ี 1. ดาวน์โหลดไลบราร่ี OneWire.h เป็นไฟล์ Zip ดงั รูป รูปท่ี 4.10-2 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ านตวั ท่ี 1 2. ดาวน์โหลดไลบราร่ี DallasTemperature.h เป็ นไฟล์ Zip ดงั รูป รูปท่ี 4.10-3 การดาวน์โหลดไลบรารี่ที่นามาใชง้ านตวั ท่ี 2 3. ทาการเพิม่ ไลบราร่ีท้งั 2 ลงในโปรแกรม Arduino IDE โดยการเพ่มิ จากไฟล์ zip แลว้ ทาการหา ไฟล์ zip ที่ไดจ้ ากการดาวน์โหลดในขอ้ 1 และ 2 รูปท่ี 4.10-4 การเพิม่ ไลบราร่ีที่เป็นไฟล์ zip ลงในโปรแกรม Arduino IDE
142 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 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 3. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่ ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 4. ฟังก์ช่ันหน่วงเวลาเป็ นไมโครวนิ าที เน่ืองจากฟังกช์ น่ั หน่วงเวลาปกติเวลาต่าสุดที่ทาไดค้ ือ 1 มิลลิวนิ าที ดงั น้นั หากตอ้ งการหน่วงเวลาท่ีต่ากวา่ จ่ึงตอ้ งใชฟ้ ังชนั่ น้ีซ่ึงสามารถหน่วงเวลาได้ ในระดบั ไมโครวนิ าที รูปฟังชนั่ เป็นดงั น้ี delayMicroseconds(us); us: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยไมโครวนิ าที (unsigned int) 5. ฟังก์ชั่นกาหนดความเร็วในการส่ือสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม
ใบงานท่ี 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อุณหภูมิ DS18B20 143 6. ฟังก์ชั่นส่งข้อมูลออกพอร์ต เป็ นฟังก์ชั่นท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พมิ พข์ อ้ มูลออกทางพอร์ตเพอื่ แสดงผลท่ีจอคอมพิวเตอร์เม่ือพมิ พเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยส่ิงท่ีพมิ พน์ ้นั ๆ Serial.print(val); Serial.print(val, format); 7. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คลา้ ยกบั ฟังก์ช่ัน Serial.print ต่างกนั ตรงท่ีเม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เม่ือส่ังพิมพ์คร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยูท่ ี่ บรรทดั ใหม่ แทนท่ีจะตอ่ ทา้ ยเหมือนกบั ฟังกช์ นั่ Serial.print Serial.println(val); Serial.println(val, format); ฟังก์ช่ันใช้งานของไลบรารี่ OneWire.h การอ่านค่าจากไอซี DS18B20 จาเป็ นตอ้ งใชไ้ ลบราร่ีสื่อสารแบบ One wire ช่วย โดยมีฟังก์ชน่ั ใหใ้ ชง้ านดงั น้ี ฟังก์ช่ันกาหนดขาเชื่อมต่อ ใชใ้ นการระบุขาท่ีใชเ้ ชื่อมตอ่ ใหต้ วั โปรแกรมรับรู้ รูปแบบเป็นดงั น้ี OneWire name(pin); name: ชื่อของอุปกรณ์ท่ีเชื่อมตอ่ ทางพอร์ตที่สื่อสารแบบ One wire pin: ขาพอร์ตดิจิทลั ที่เชื่อมต่อกบั ขา DQ ของไอซี DS18B20 ตวั อย่างเช่น OneWire ds(2); หมายถึง ต่อไปในโปรแกรมจะใช้ช่ือ ds ในการเรียกใช้งานอุปกรณ์ที่มีการเช่ือมต่อ สายสญั ญาณเขา้ ที่ขาพอร์ต D2 ฟังก์ชั่นใช้งานของไลบรารี่ DallasTemperature.h การอ่านค่าจากไอซี DS18B20 จาเป็ นตอ้ งใชไ้ ลบรารี่ช่วยงาน ซ่ึงไลบรารี่ไม่ไดถ้ ูกเพ่ิมเขา้ มาใน ตวั โปรแกรม Arduino IDE ต้งั แต่แรกจาเป็นตอ้ งติดต้งั เพม่ิ เติม โดยมีฟังกช์ นั่ ใหใ้ ชง้ านดงั น้ี 1. ฟังก์ช่ันกาหนดการเชื่อมต่อ ใช้ในการระบุการเชื่อมต่อโดยจะเชื่อมโยงกับไลบรารี่ OneWire.h รูปแบบเป็นดงั น้ี DallasTemperature sensor_name(&onewire_name); sensor_name: ช่ือของเซนเซอร์ ท่ีต้งั ข้ึนเพอ่ื เรียกใช้ onewire_name: ช่ือของอุปกรณ์ที่เช่ือมตอ่ ทางพอร์ตท่ีสื่อสารแบบ One wire
144 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตัวอย่างเช่น DallasTemperature sensor(&ds); หมายถึง ต่อไปในโปรแกรมจะใช้ชื่อ sensor ในการเรียกใช้งานท่ีเชื่อมต่อแบบ One wire ท่ีอุปกรณ์ที่ช่ือวา่ ds ท่ีไดก้ าหนดจากไลบราร่ี OneWire.h 2. ฟังก์ช่ันเริ่มให้ทางาน ใชใ้ นการกระตุน้ ใหเ้ ซนเซอร์ทางาน รูปแบบเป็นดงั น้ี sensor_name.begin(); sensor_name: ช่ือของเซนเซอร์ท่ีต้งั ช่ือไว้ ตัวอย่างเช่น sensor.begin(); หมายถงึ ใหไ้ อซีตรวจวดั อุณภูมิท่ีช่ือวา่ sensor เริ่มทางาน 3. ฟังก์ชั่นอ่านค่าอุณหภูมทิ เ่ี ป็ นเซลเซียส ใชใ้ นการอา่ นคา่ อุณหภูมิ รูปแบบเป็นดงั น้ี sensor_name.getTempCByIndex(0) sensor_name: ช่ือของเซนเซอร์ที่ต้งั ชื่อไว้ ตัวอย่างเช่น Serial.println(sensor.getTempCByIndex(0)); หมายถงึ ใหพ้ มิ พอ์ ุณหภูมิท่ีอ่านไดจ้ ากไอซีตรวจวดั อุณภูมิที่ชื่อวา่ sensor 4. ฟังก์ชั่นอ่านค่าอุณหภูมทิ เ่ี ป็ นฟาเรนไฮต์ ใชใ้ นการอ่านคา่ อุณหภูมิ รูปแบบเป็นดงั น้ี sensor_name.getTempFByIndex(0) sensor_name: ช่ือของเซนเซอร์ท่ีต้งั ช่ือไว้ ตวั อย่างเช่น Serial.println(sensor.getTempFByIndex(0)); หมายถึง ใหพ้ ิมพอ์ ุณหภูมิที่อ่านไดจ้ ากไอซีตรวจวดั อุณภูมิท่ีช่ือวา่ sensor 7. วงจรทใี่ ช้ทดลอง วงจรเพ่อื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป
ใบงานท่ี 4.10 การเขียนโปรแกรมใชง้ านไอซีวดั อณุ หภูมิ DS18B20 145 D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 R4-R5 LED1-LED3 1 RST AVCC D2 4 220 D3 5 C1 0.1uF R6 VCC 4.7k USB to UART (TTL Level) R21,kR3 3 6 3 DS18B20 2 D4 DTR D1(TXD) 2 VCC RXD D0(RXD) DQ TXD GND +5V GND 1 3V3 R7 VCC 4.7k X1 D5 11 3 DS18B20 16MHz 2 DQ VCC 9 XTAL1 10 XTAL2 GND 1 GND C2,C3 22pF 8,22 รูปที่ 4.10-1 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป R12-2R02 LED1-LED3 ARDUINO R3 VCC D2 4.7k D3 3 DS18B20 D4 2 VCC D5 DQ GND GND 1 4R.74k VCC 3 DS18B20 2 VCC DQ GND 1 รูปท่ี 4.10-2 วงจรท่ีใชบ้ อร์ด 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 D S1 8 D S1 8 ABCDE D13 B 20 B 20 3V3 REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปที่ 4.10-3 การตอ่ ลงบอร์ดทดลอง
146 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.10-4 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน ปัญหาการจาลองการทางานของไลบรารี่ DallasTemperature.h ในใบงานท่ีผา่ นมาการจาลองการทางานสามารถจาลองไดป้ กติไม่มีขอ้ ผิดพลาดใด ๆ แตส่ าหรับ ใบงานน้ีมีการใช้ไลบราร่ี DallasTemperature.h เพ่ืออ่านค่าอุณหภูมิจากไอซี DS18B20 จะไม่สามารถ อ่านค่าไดแ้ มว้ า่ โคด้ น้นั สามารถทดลองในวงจรจริงไดก้ ็ตาม ท้งั น้ีเกิดจากเวอร์ชน่ั ของโปรแกรม Arduino IDE ซ่ึงถา้ หากตอ้ งการที่จะจาลองการทางานเพ่ือดูผลการทางานจะตอ้ งไปใชเ้ วอร์ชนั่ 1.6.5 (a) เมื่อใช้ Arduino IDE เวอร์ชนั่ ที่สูงกวา่ 1.6.5 (b) เม่ือใช้ Arduino IDE V. 1.6.5 รูปท่ี 4.10-5 ผลการทดลองในโปรแกรมจาลองการทางานจาก Arduino IDE ต่างเวอร์ชนั่ 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมแสดงค่าอุณหภูมิที่วดั จากไอซี DS18B20 จานวน 1 ตวั โดยแสดงผลท่ี จอคอมพวิ เตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง อ่านคา่ จากไอซี แสดงค่าทอ่ี ่านได้
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