Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ArduinoBook

ArduinoBook

Published by toxic.nps, 2020-05-27 07:25:53

Description: ArduinoBook

Search

Read the Text Version

ใบงานท่ี 4.10 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค  145 การเปลย่ี นค่า time out เพ่ือปรับระยะการวดั (สาหรับเม่ือใช้งานไลบราร่ี) ค่าปกติของไลบราร่ีถูกกาหนดมาให้วดั ได้ประมาณ 51 cm ซ่ึงมีค่า Default TimeOut เท่ากบั 3000 µs = 51cm เมื่อใชฟ้ ังกช์ นั่ ที่มีการป้อนค่า 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) วธิ ีการคานวณค่า TimeOut เพื่อให้ได้ระยะการวดั ทต่ี ้องการ ระยะการสูงสุดที่ตอ้ งการวดั สูตร ตวั อยา่ งการคานวณ หน่วยเป็ นเซนติเมตร TimeOut = Max.Distance(cm) * 58 50 cm * 58 = 2900 µ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 กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป

146  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] D1 VCC Peripheral circuit 1N5819 CPU circuit VCC R1 1 VCC 10k 7,20 ATMEGA328 2 Trig VCC 3 Echo SW1 4 GND 1 RST AVCC C1 0.1uF USB to UART (TTL Level) R21,kR3 3 D9 15 HC-SR04 2 D8 14 DTR D1(TXD) RXD D0(RXD) TXD +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.10-6 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO VCC HC-SR04 1 VCC D9 2 Trig D8 3 Echo 4 GND GND รูปท่ี 4.10-7 วงจรท่ีใชบ้ อร์ด 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.10-8 การตอ่ ลงบอร์ดทดลอง

ใบงานที่ 4.10 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค  147 การต่อวงจรเพอื่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.10-9 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน เน่ืองจากโปรแกรมจาลองการทางานไม่มีโมเดลอลั ตราโซนิครุ่น HR-SC04 ใหจ้ าลองจึงตอ้ งใช้ โมเดลจากไลบราร่ีที่เพิ่มเขา้ มา ซ่ึงไลบรารี่ดงั กล่าวภายในเป็ นซีพยี ูท่ีเขียนโคด้ ใหส้ ่งค่าเลียนแบบอลั ตร้า โซนิคซ่ึงสามารถปรับค่าไดโ้ ดยอาศยั แรงดนั ควบคุมผ่านการปรับโพเทนธิโอมิเตอร์ ดงั น้นั เมื่อใชง้ าน จะตอ้ งโหลดไฟล์โปรแกรมควบคุมเขา้ โมเดลเช่นเดียวกบั การจาลองไมโครคอนโทรลเลอร์ ไฟลท์ ่ีตอ้ ง โหลดเขา้ โมเดลเป็นไฟลภ์ าษาเคร่ืองที่มาพร้อมกบั ไลบรารี่ดงั รูป รูปที่ 4.10-10 ไฟลภ์ าษาเครื่องสาหรับโมเดลอลั ตร้าโซนิค 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมวดั ระยะโดยการใช้โมดูลอลั ตร้าโซนิคแบบไม่ใช้ไลบรารี่ แสดงผลท่ี จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง ส่งพลั ซ์ 10uS ท่ขี า Trig จบั เวลาท่ขี า Echo คานวณเป็ นระยะทาง แสดงผล

148  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม 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. ทดลองวดั ระยะวดั ถุในตาแหน่งที่ตา่ ง ๆ กนั สังเกตค่าที่อา่ นได้

ใบงานที่ 4.10 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค  149 การทดลองท่ี 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.Ranging(CM)); // CM or INC 9 Serial.println(\" cm\" ); 10 delay(100); 11 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ Ultrasonic.h เขา้ มาในโคด้ โปรแกรม - บรรทัดท่ี 2 ประกาศใช้งานไลบราร่ีพร้อมระบุขาพอร์ตที่ใช้เชื่อมต่อกบั โมดูลและกาหนดช่ือ เรียกโมดูลตวั อยา่ งน้ีกาหนดช่ือเรียกเป็น ultrasonic - บรรทดั ท่ี 4 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 8 เรียกใชง้ านไลบราร่ีพร้อมแสดงคา่ ท่ีวดั ไดท้ ี่จอคอมพวิ เตอร์ผา่ นพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองวดั ระยะวดั ถุในตาแหน่งที่ตา่ ง ๆ กนั สังเกตคา่ ที่อ่านได้ 4. เปรียบเทียบความแตกต่างของการการวดั ระหวา่ งโคด้ ท่ีใชก้ บั ไม่ใชไ้ ลบรารี่ 9. สรุปผลการปฏบิ ตั งิ าน

150  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมแจง้ เตือนการเขา้ ใกล้ (เช่นเดียวกบั เซนเซอร์ถอยหลงั ของรถยนต)์ แสดงผลท่ี LED จานวน 4 ตวั โดยมีเงื่อนไขการแสดงผลดงั น้ี ระยะตรวจจบั การติดดบั ของ LED s 1.5m 1.0m  s 1.5m 0.5m  s 1.0m 0s  0.5m วงจรท่ีใชท้ ดลองเป็นดงั รูป VCC HC-SR04 1 VCC ARDUINO 2 Trig 3 Echo D9 4 GND D8 R212-0R4 LED1-LED4 D5 D4 D3 D2 GND รูปท่ี 4.10-11 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

ใบงานท่ี 4.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  151 ใบงานท่ี 4.11 การเขยี นโปรแกรมควมคุมดซี ีมอเตอร์ 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. สรุปผลการปฏิบตั ิงาน

152  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน มอเตอร์ไฟฟ้ากระแสตรง (DC motor) เป็ นเครื่องกลไฟฟ้าชนิดหน่ึงที่มีหน้าที่เปล่ียนพลงั งาน งานไฟฟ้าไปเป็ นพลงั งานกล เม่ือไดร้ ับการป้อนพลงั งานไฟฟ้าท่ีเป็ นไฟฟ้ากระแสตรงจะทาให้แกนของ มอเตอร์หมุน แต่เน่ืองจากการทางานของมอเตอร์ไฟฟ้ากระแสตรงตอ้ งการกระแสไฟฟ้าในปริมาณสูง กว่าความสามารถที่ไมโครคอนโทรลเลอร์จะจ่ายโดยตรงได้ จึงจาเป็ นท่ีจะต้องมีวงจรขบั มอเตอร์ โดยเฉพาะเพ่ือทาหนา้ ที่ขบั มอเตอร์ใหท้ างานไดต้ ามตอ้ งการ รูปที่ 4.11-1 ตวั อยา่ งมอเตอร์ไฟฟ้ากระแสตรงขนาดเลก็ แบบปกติ รูปท่ี 4.11-2 ตวั อยา่ งมอเตอร์ไฟฟ้ากระแสตรงขนาดเลก็ แบบท่ีมีชุดเฟื องทดรอบ มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็กจะถูกนามาใช้ในโครงงานท่ีมีกลไกการเคลื่อนไหวมีค่า แรงดนั ไฟฟ้าในการทางานในช่วง 1.5 โวลตถ์ ึง 12 โวลต์ การควบคุมการทางานของมอเตอร์ไฟฟ้ากระแสตรงน้นั สามารถทาไดง้ ่ายเพียงป้อนไฟเขา้ ท่ีข้วั มอเตอร์เม่ือตอ้ งการใหม้ อเตอร์หมุนและเมื่อตอ้ งการใหม้ อเตอร์หยดุ หมุนกเ็ พียงหยดุ การป้อนไฟฟ้า หรือ ถา้ หากตอ้ งการให้มอเตอร์หมุนกลบั ทิศทางก็สามารถทาไดโ้ ดยการสลบั ข้วั ไฟฟ้าที่จ่ายให้กบั มอเตอร์ เพียงเท่าน้ีมอเตอร์ไฟฟ้ากระแสตรงก็จะสามารถหมุนกลบั ทิศทางไดใ้ นทนั ที สาหรับวงจรขบั มอเตอร์ที่ สามารถควบคุมทิศทางการหมุนได้ประกอบด้วยอุปกรณ์ท่ีถูกจัดวางท่ีมีลักษณะคล้ายตัว H ใน ภาษาองั กฤษจึงเรียกวงจรขบั มอเตอร์ไฟฟ้ากระแสตรงในลกั ษณะน้ีว่าวงจรขบั แบบ H-Bridge ลกั ษณะ ของวงจรเป็นดงั รูปท่ี 4.11-3

ใบงานท่ี 4.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  153 S1 S3 Vs M S2 S4 รูปที่ 4.11-3 วงจรขบั แบบ H-Bridge จากรูปที่ 4.11-3 เป็ นวงจรขบั แบบ H-Bridge ท่ีใช้สวิตช์ ในสภาวะแรกเร่ิมท่ีสวิตช์ทุกตวั ยงั ไม่ ทางานมอเตอร์จะไม่ไดร้ ับกระแสไฟฟ้าทาใหม้ อเตอร์ไม่หมุน เมื่อทาการควบคุมใหส้ วิตซ์ทางานโดยให้ S1 และ S4 ทางาน มอเตอร์จะหมุนตามเข็มนาฬิกา (CW: Clock wise) หากตอ้ งการให้มอเตอร์หมุนกลบั ทิศทางโดยให้มอเตอร์หมุนทวนเข็มนาฬิกา (CCW: Counter clock wise) ก็เพียงสลบั การทางานของ สวติ ชโ์ ดยให้ S1, S4 ไมท่ างานและใหส้ วติ ช์ S2, S3 ทางานแทน การควบคุมดงั กล่าวจะมีลกั ษณะดงั รูปท่ี 14.11-4 S1 S3 S1 S3 Vs M Vs M S2 S4 S2 S4 (a) (b) รูปท่ี 4.11-4 การควบคุมการหมุนของมอเตอร์ดว้ ยวงจรขบั แบบ H-Bridge ตารางท่ี 4.11-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.11-5 และการควบคุมทิศทางการหมุนเป็ น ดงั รูป 4.11-6

154  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] +Vs RY1 M RY2 S1 รูปท่ี 4.11-5 วงจรขบั มอเตอร์แบบ H-Bridge ท่ีใชร้ ีเลย์ S2 V2 V1 RY1 RY2 +Vs +Vs M RY2 RY1 M (a) (b) รูปที่ 4.11-6 การควบคุมการหมุนของมอเตอร์ดว้ ยวงจรขบั แบบ H-Bridge ที่ใชร้ ีเลย์ การใช้งานจริงมีไอซีที่ถูกออกแบบมาเพ่ือการน้ีโดยเฉพาะมีคุณสมบัติเป็ นวงจรขับแบบ H-Bridge ในกรณีที่ใช้กบั มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็กที่ใช้กระแสไม่เกิน 600 มิลลิแอมป์ จะใช้ ไอซีเบอร์ L293D แตห่ ากมอเตอร์ไฟฟ้ากระแสตรงใชก้ ระแสสูงเกินค่าดงั กล่าวแต่ไม่เกิน 4 แอมป์ จะตอ้ ง ใช้ไอซีเบอร์ L298 ในใบงานน้ีใชม้ อเตอร์ไฟฟ้ากระแสตรงขนาดเล็กซ่ึงจะใชไ้ อซีเบอร์ L293D ในการ ทดลองโดยโครงสร้างของไอซีเป็นดงั รูปที่ 4.11-7 VCC 4A 4Y GND GND 3Y 3A EN3,4 16 15 14 13 12 11 10 9 12345678EN1,2 1A รูปที่ 4.11-7 โครงสร้างไอซีขบั มอเตอร์กระแสตรงขนาดเลก็ เบอร์ L293D1Y 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน GND GND 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กับขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่2Y ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน2A โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี VS

ใบงานท่ี 4.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  155 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)

156  เรียนรู้และลองเลน่ 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.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  157 D1N15819 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.11-4 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO VCC D1N14001 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.11-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 ULN2803A D13 3V3 ABCDE REF A0 A1 A2 A3 A4 A5 A6 A7 5V RST GND VIN 1 5 10 15 รูปที่ 4.11-6 การตอ่ ลงบอร์ดทดลอง

158  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การตอ่ วงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.11-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.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  159 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. ทดลองแกโ้ ปรแกรมใหม้ อเตอร์ทางานในรูปแบบอื่น ๆ แลว้ สังเกตผล

160  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมควบคุมการหมุนของมอเตอร์ท่ีมีการหมุนท้งั ทิศทางตามเขม็ และทวนเขม็ นาฬิกาโดยสามารถปรับความเร็วของการหมุนดว้ ย PWM ได้ โดยใชโ้ พเทนธิโอมิเตอร์ต่อเขา้ พอร์ตรับ สญั ญาณแอนาลอกเป็นตวั ปรับความเร็วในการหมุนของมอเตอร์ดงั รูป ARDUINO VCC 1DN14001 C1 16 8 100uF VCC (PWM)D11 1 EN1,2 GND VCC 1Y 3 M1 10k D12 2 GND 2Y 6 D13 7 1A GND M 2A GND VS 3Y 11 A0 (PWM)D10 4Y 14 M2 D9 9 EN3,4 D8 10 3A M 15 4A GND 4 5 12 13 L293D รูปท่ี 4.11-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.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์  161 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 ฟังกช์ น่ั รองที่สงั่ งานใหห้ ยดุ การหมุนของมอเตอร์

162  เรียนรู้และลองเลน่ 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,2 GND VCC 1Y 3 M1 (PWM)D11 2 GND 2Y 6 D12 7 1A GND M D13 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.11-9 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

ใบงานที่ 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์  163 ใบงานที่ 4.12 การเขยี นโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์ 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. สรุปผลการปฏิบตั ิงาน

164  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน สเตป็ เปอร์มอเตอร์หรือที่บางคนเรียกวา่ สเตป็ ปิ้ งมอเตอร์ เป็นมอเตอร์ท่ีทางานโดยอาศยั พลงั งาน จากไฟฟ้ากระแสตรงเช่นเดียวกบั มอเตอร์กระแสตรง แต่มีความความแตกต่างจากมอเตอร์กระแสตรงท่ี เมื่อป้อนไฟให้กับสเต็ปเปอร์มอเตอร์จะขยบั เพียงเล็กน้อยเพ่ือเข้าสเต็ป ในขณะท่ีมอเตอร์ ไฟฟ้า กระแสตรงทว่ั ไปจะหมุนตราบท่ียงั มีพลงั งานจา่ ยใหแ้ ก่ตวั มนั ท้งั น้ีเป็นเพราะโครงสร้างของสเตป็ เปอร์ มอเตอร์นนั่ เอง โดย สเตป็ เปอร์มอเตอร์มีดว้ ยกนั 2 แบบคือ 1. Bipolar เป็ นสเตป็ เปอร์มอเตอร์ท่ีมีขดลวด 2 ขดมีสายไฟใหต้ อ่ ใชง้ าน 4 เส้นดงั รูปท่ี 4.12-1 (a) 2. Unipolar เป็ นสเตป็ เปอร์มอเตอร์ที่มีขดลวด 4 ขด (2 ขดแบบมีแทป็ กลาง) โดยมี 2 แบบ 2.1 แบบมีสายไฟใหต้ ่อใชง้ าน 5 เส้น ดงั รูปที่ 4.12-1 (b) 2.2 แบบมีสายไฟใหต้ ่อใชง้ าน 6 เส้น ดงั รูปที่ 4.12-1 (c) MMM (a) (b) (c) รูปที่ 4.12-1 โครงสร้างสเตป็ เปอร์ Bipolar และ Unipolar ใบงานน้ีเลือกใช้สเต็ปเปอร์มอเตอร์แบบ Unipolar ซ่ึงมีขดลวดอยู่ภายในจานวน 4 ขด (ท่ีจริง เป็น 2 ขดที่มีจุดแทป็ กลาง) โดยจานวนรอบของขดลวดท้งั 4 ขดจะมีค่าความตา้ นทานเท่ากนั ดงั น้นั ก่อน ใช้งานตอ้ งทาการหาตาแหน่งสายท่ีใช้งานว่าเป็ นสายตาแหน่งใดของขดลวด ค่าความตา้ นทานของ ขดลวดของสเต็ปเปอร์มอเตอร์ที่มีสายต่อแบบ 5 เส้นเมื่อวดั ค่าความตา้ นทานของสายทุกเส้นจะสามารถ อ่านค่าไดท้ ุกเส้นนนั่ หมายความวา่ ทุกเส้นเช่ือมต่อถึงกนั และมีสายไฟเพียงเส้นเดียวเท่าน้นั ที่วดั ค่าความ ตา้ นทานเทียบกบั เส้นอ่ืน ๆ แลว้ มีค่าความตา้ นทานที่วดั ไดใ้ นแต่ละเส้นเท่ากนั ท้งั หมด สายไฟเส้นน้นั เป็นสายร่วม นาสายร่วมต่อกบั ไฟบวก 5 โวลต์ นาสายไฟเส้นท่ีเหลือตอ่ ลงกราวดค์ ร้ังละเส้นเรียงกนั โดย สลบั กนั ไปมา จนกวา่ สเตป็ เปอร์มอเตอร์หมุนไปทางดา้ นเดียวกนั สาหรับสเตป็ เปอร์มอเตอร์ ที่มีสายต่อ แบบ 6 เส้น เมื่อทาการวดั ค่าความตา้ นทานจะมีเพียง 3 เส้น 2 ชุดที่วดั แลว้ อ่านค่าความตา้ นทานได้ และ ในแต่ละชุดจะมีเส้นเดียวที่มีสายร่วม โดยเมื่อวดั ค่าความตา้ นทานของสายร่วมกบั สายเส้นอื่น จะมีค่า ความตา้ นทานเท่ากนั เมื่อนามาใชง้ านจะตอ้ งนาสายร่วมท้งั 2 เส้นของท้งั 2 ชุดมาต่อร่วมกนั (แบบ 5 เส้นต่อไวแ้ ล้วภายในตวั มอเตอร์) สาหรับวงจรขบั ต้องใช้วงจรขบั ท่ีออกแบบมาสาหรับขบั ขดลวด เช่นเดียวกบั วงจรขบั รีเลย์โดยวงจรตอ้ งมีไดโอดต่อคร่อมขดลวดเพ่ือใช้ขจดั แรงดนั ยอ้ นกลบั (Back EMF) ท่ีเกิดข้ึนเม่ือทรานซิสเตอร์หยดุ นากระแส วงจรเป็นดงั รูปท่ี 4.12-2

ใบงานที่ 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์  165 +VS ABCD รูปที่ 4.12-2 แสดงวงจรขบั สเตป็ เปอร์มอเตอร์ที่ใชท้ รานซิสเตอร์ ในทางปฏิบตั ิสามารถใช้ไอซีท่ีเป็ นทรานซิสเตอร์อาร์เรย์อยภู่ ายในแทนการใชท้ รานซิสเตอร์ได้ โดยไอซีน้ีมีวงจรภายในเป็ นวงจรทรานซิสเตอร์จานวนหลายชุด ไดแ้ ก่เบอร์ ULN2003, ULN2803 ซ่ึง เบอร์ ULN2003 มีวงจรทรานซิสเตอร์ภายใน 7 ชุด และเบอร์ ULN2803 มี 8 ชุดโดยในแต่ละชุดเป็นวงจร ทรานซิสเตอร์ที่มีการจดั วงจรภายในเป็ นแบบวงจรทรานซิสเตอร์ที่ต่อแบบดาร์ลิงตนั ซ่ึงสามารถขบั โหลดกระแสสูงโดยใชก้ ระแสเบสต่า (ลอจิกที่ป้อนเขา้ มาทางอินพุท) จากลกั ษณะการทางานของวงจรใน แต่ละชุดจะมีลกั ษณะการทางานเช่นเดียวกบั วงจรน็อตเกตในวงจรดิจิทลั สาหรับการขบั สเต็ปเปอร์ มอเตอร์จะใชง้ านเพียง 4 ชุดเท่าน้นั ดงั รูปท่ี 4.12-3 (a) ในกรณีท่ีตอ้ งการขบั สเต็ปเปอร์มอเตอร์ท่ีมีกาลงั มากเป็ นมอเตอร์ท่ีต้องการกระแสสูง ซ่ึงการขับกระแสสูงสามารถใช้ไอซีเบอร์ ULN2803 มีวงจร ทรานซิสเตอร์ 8 ชุด โดยทาการขนานกนั 2 ชุดต่อการขบั มอเตอร์ 1 ขด ดงั รูปท่ี 4.12-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.12-3 วงจรขบั สเตป็ เปอร์มอเตอร์แบบใชไ้ อซี ULN2803 การขบั สเต็ปเปอร์มอเตอร์ การขบั สเตป็ เปอร์มอเตอร์เป็นการขบั ใหม้ อเตอร์ขยบั ไปตามจานวนสเตป็ ที่ตอ้ งการซ่ึงคุณสมบตั ิ ในการขยบั ในแต่ละสเต็ปของมอเตอร์มีหลายขนาดใหเ้ ลือกใชง้ านเช่น 1.8 องศาต่อสเต็ป และ 7.5 องศา ต่อสเตป็ การควบคุมการหมุนของมอเตอร์สามารถควบคุมการทางานได้ 3 แบบ คือ

166  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 1. แบบเต็มสเต็ป 1 เฟส (Full step 1 phase) เป็ นการขบั คร้ังละ 1 เฟสเรียงกนั ไป ทาให้มอเตอร์ หมุนไปคร้ังละ 1 สเต็ป ถา้ มอเตอร์มีคุณสมบตั ิ 1.8 องศาต่อสเต็ปก็จะหมุนไปคร้ังละ 1.8 องศา โดยมี ข้นั ตอนขบั เฟสดงั รูปที่ 4.12-4 AAAA D BD BD BD B CCCC (a) (b) (c) (d) รูปที่ 4.12-4 แสดงการเคล่ือนท่ีเม่ือขบั มอเตอร์แบบเตม็ สเตป็ 1 เฟส ตารางท่ี 4.12-1 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบเตม็ สเตป็ 1 เฟส สเตป็ ท่ี ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปท่ี 4.12-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.12-5 AAAA D BD BD BD B CCCC (a) (b) (c) (d) รูปท่ี 4.12-5 แสดงการเคล่ือนที่เมื่อขบั มอเตอร์แบบเตม็ สเตป็ 2 เฟส ตารางที่ 4.12-2 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบเตม็ สเตป็ 2 เฟส สเตป็ ที่ ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปที่ 4.12-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.12-6

ใบงานที่ 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์  167 AAAA D BD BD BD B CCCC (a) (b) (c) (d) AAAA D BD BD BD B CCCC (e) (f) (g) (h) รูปท่ี 4.12-6 แสดงการเคล่ือนที่เม่ือขบั มอเตอร์แบบคร่ึงสเตป็ ตารางที่ 4.12-3 รูปแบบการกระตุน้ ขดลวดของมอเตอร์แบบคร่ึงสเตป็ สเตป็ ท่ี ขดลวด A ขดลวด B ขดลวด C ขดลวด D รูปท่ี 4.12-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: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต

168  เรียนรู้และลองเล่น 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.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์  169 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.12-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.12-8 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

F GH I J170  เรียนรู้และลองเล่น 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.12-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.12-10 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมควบคุมการทางานของสเตป็ เปอร์มอเตอร์โดยให้หมุนในทิศทางเดียวเป็ น จานวน 360 องศา (ตวั อยา่ งโปรแกรมใชส้ เตป็ เปอร์มอเตอร์ที่มีขนาด 1.8 องศาต่อสเตป็ ) ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง กาหนดรปู แบบการขบั สเตป็ ครบ 360 อง า? จริง เท็จ สั่งขับสเตป็ ดั ไป STOP

ใบงานที่ 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์  171 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม 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 if (data & 1 ){digitalWrite(PinCon[0],HIGH);} else {digitalWrite(PinCon[0],LOW);} 35 if (data & 2 ){digitalWrite(PinCon[1],HIGH);} else {digitalWrite(PinCon[1],LOW);} 36 if (data & 4 ){digitalWrite(PinCon[2],HIGH);} else {digitalWrite(PinCon[2],LOW);} 37 if (data & 8 ){digitalWrite(PinCon[3],HIGH);} else {digitalWrite(PinCon[3],LOW);} 38 } รายละเอยี ดโค้ดโปรแกรม - บรรทัดท่ี 1 กาหนดชื่อ phaseA ให้แทน 4 (เป็ นขาเฟส A ของสเต็ปเปอร์มอเตอร์ท่ีเชื่อมต่ออยู่ กบั ขา D4 ของ Arduino) - บรรทดั ที่ 2 กาหนดช่ือ phaseB ใหแ้ ทน 5 (เป็นขาเฟส B ของสเตป็ เปอร์มอเตอร์ที่เชื่อมต่ออยกู่ บั ขา D4 ของ Arduino) - บรรทดั ที่ 3 กาหนดช่ือ phaseC ใหแ้ ทน 6 (เป็นขาเฟส C ของสเตป็ เปอร์มอเตอร์ท่ีเชื่อมต่ออยูก่ บั ขา D4 ของ Arduino) - บรรทัดที่ 4 กาหนดชื่อ phaseD ให้แทน 7 (เป็ นขาเฟส D ของสเต็ปเปอร์มอเตอร์ท่ีเชื่อมต่ออยู่ กบั ขา D4 ของ Arduino) - บรรทดั ที่ 5 ประกาศตวั แปรแบบอาร์เรยเ์ กบ็ ค่าตาแหน่งของขา Arduino ที่เช่ือมต่อกบั มอเตอร์ - บรรทัดที่ 6-10 ประกาศตวั แปรแบบอาร์เรยเ์ ก็บค่ารูปแบบการขบั สเต็ปเปอร์มอเตอร์เป็ นแบบ ฟูลสเตป็ 1 เฟส - บรรทดั ท่ี 14-17 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็นเอาตพ์ ุทพอร์ต

172  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ที่ 21 วนซ้าจานวน 50 รอบ - บรรทดั ท่ี 23 วนซ้าจานวน 4 รอบ - บรรทัดที่ 25 เรียกใช้งานฟังก์ช่ันรองสาหรับขบั สเต็ปพร้อมส่งค่ารูปแบบในการขบั เข้าใน ฟังกช์ นั่ - บรรทดั ที่ 33-38 ฟังกช์ นั่ รองขบั สเตป็ เปอร์มอเตอร์ตามรูปแบบท่ีรับเขา้ มา ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus (จากการทดลองหากใช้ delay ต่ากวา่ 53 จะทาให้ มอเตอร์เกิดอาการสะดุดทาใหม้ ุมท่ีควรจะไดค้ ลาดเคลื่อนไป) 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมใหม้ อเตอร์ทางานในรูปแบบอื่น ๆ แลว้ สังเกตผล 9. สรุปผลการปฏบิ ัติงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมควบคุมการหมุนของสเต็ปเปอร์มอเตอร์ โดยให้มีการหมุนทวนเข็มและตาม เขม็ นาฬิกาในองศาท่ีกาหนดข้ึนเอง วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO ULN2803 VCC M1 D7 13 1 IN1 OUT1 18 12 2 OUT2 17 A D6 11 3 IN2 OUT3 16 D5 IN3 OUT4 15 M D4 6 4 IN4 COM 10 B CD VCC GND GND 9 รูปท่ี 4.12-11 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง หมายเหตุ สเต็ปเปอร์ท่ีนามาใชท้ ดลองอาจมีคุณสมบตั ิในการขยบั ตาแหน่งมีมุมที่ต่างไปจาก ตวั อย่างดงั น้ันการทดลองจะตอ้ งทราบค่าคุณสมบตั ิของมอเตอร์ที่นามาใช้งานก่อนการเขียน โปรแกรม

ใบงานที่ 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์  173 ใบงานท่ี 4.13 การเขยี นโปรแกรมควบคุมเซอร์โวมอเตอร์ 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. สรุปผลการปฏิบตั ิงาน

174  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน เซอร์โวมอเตอร์เป็ นมอเตอร์ที่สามารถควบคุมการเคล่ือนท่ีไปยงั มุมที่ตอ้ งการได้ด้วยวงจร ควบคุมแบบป้อนกลบั ภายใน เซอร์โวมอเตอร์ขนาดเล็กนิยมใชก้ นั มากในเคร่ืองเล่นบงั คบั วิทยุ เช่น รถ เรือ เคร่ืองบิน เซอร์โวมอเตอร์ประกอบข้ึนจากส่วนประกอบหลกั ๆ 3 ส่วนคือ 1. มอเตอร์ไฟฟ้ากระแสตรงขนาดเล็ก 2. ชุดเกียร์ทดรอบ 3. วงจรควบคุม รูปที่ 4.13-1 ภายในเซอร์โวมอเตอร์1 เซอร์โวมอเตอร์มีคอนเน็คเตอร์สาหรับต่อใช้งาน 3 ขา โดยใชต้ ่อกบั แหล่งจ่ายไฟ 2 ขาและอีก หน่ึงขาจะใชต้ อ่ กบั สัญญาณควบคุม เซอร์โวมอเตอร์ใชไ้ ฟฟ้ากระแสตรงในการทางานมีแรงดนั ใชง้ านอยู่ ในช่วง 4-6 โวลต์ (สาหรับรุ่นกาลงั แรงบิดสูงจะใชแ้ รงดนั สูงถึง 12 โวลต)์ การเรียงขาคอนเน็คเตอร์เป็น มาตรฐานแบบเดียวกนั มีความต่างกนั บา้ งตรงสีของสายไฟข้ึนอยกู่ บั บริษทั ผผู้ ลิตดงั รูปท่ี 4.13-2 รูปท่ี 4.13-2 คอนเน็คเตอร์เซอร์โวมอเตอร์ของแต่ละบริษทั 2 1รูปจาก http://www.pyroelectro.com 2รูปจาก http://www.imagesco.com/servo/connection-types.html

ใบงานท่ี 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์  175 การควบคุมเซอร์โวมอเตอร์ให้เคลื่อนไปยงั มุมที่ต้องการ สามารถทาได้โดยการส่งพลั ส์ที่มี ค่าประมาณ 1 ms - 2 ms ดงั รูปที่ 4.13-3 โดยสัญญาณของพลั ส์ใน 1 ลูกคล่ืนมีคาบเวลาประมาณ 20 ms เซอร์โวมอเตอร์สามารถเคลื่อนท่ีต้งั แต่มุม 0 องศาจนถึง 180 องศา (ซ่ึงบางตาราอาจกล่าววา่ เคลื่อนต้งั แต่ มุม -90 องศาถึง +90 องศา) ซ่ึงโครงสร้างของเซอร์โวมอเตอร์ไม่สามารถที่จะหมุนที่มุมเกินกวา่ ท่ีกาหนด ไวไ้ ด้ ในการใช้งานเซอร์โวมอเตอร์ที่มีการรับภาระโหลดอาจจะทาให้ตาแหน่งเคลื่อนไดห้ ากไม่ส่ง สัญญาณควบคุมแบบต่อเน่ือง โดยปกติโครงสร้างภายในท่ีเป็ นเฟื องทดรอบจะทาการล็อกตาแหน่งไว้ แลว้ ในระดบั หน่ึงแต่ไม่สามารถคงตาแหน่งเดิมไวไ้ ดห้ ากการต่อใช้งานมีการรับภาระโหลด ในกรณีที่ ตอ้ งการลอ็ กตาแหน่งจะตอ้ งส่งพลั ส์ควบคุมตาแหน่งอยา่ งตอ่ เน่ือง รูปท่ี 4.13-3 สญั ญาณพลั ส์ท่ีใชค้ วบคุมเซอร์โวมอเตอร์ การเขียนโคด้ โปรแกรมเพ่ือใชค้ วบคุมการเคลื่อนที่ของเซอร์โวมอเตอร์สามารถเขียนโคด้ โดยไม่ พ่ึงไลบราร่ีก็สามารถทาได้ แต่ถา้ ใช้ไลบรารี่การเขียนโคด้ โปรแกรมก็ง่ายข้ึนซ่ึงไลบราร่ีท่ีใช้มีช่ือว่า Servo.h เป็ นไลบราร่ีท่ีมาพร้อมกบั โปรแกรม Arduino IDE ต้งั แต่ตอนติดต้งั ดงั น้นั จึงไม่ตอ้ งติดต้งั ใหม่ สามารถใชง้ านไดท้ นั ที 6. ฟังก์ชั่น Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กับขาพอร์ต โดยสามารถกาหนดไดท้ ้งั ขาดิจิตอลโดยใส่ เพียงตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการให้ทางานในโหมดดิจิตอลแต่ การใส่ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใช้ งานในโหมดดิจิตอลได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode);

176  เรียนรู้และลองเล่น 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

ใบงานที่ 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์  177 2. ฟังก์ช่ันกาหนดขาเชื่อมต่อ ใชก้ าหนดขาที่ใชเ้ ชื่อมต่อกบั เซอร์โวมอเตอร์รูปแบบเป็นดงั น้ี .attach(pin); pin: ตวั เลขพอร์ตท่ีทาการเช่ือมต่อกบั เซอร์โวมอเตอร์ ตวั อย่าง myservo.attach(9); หมายถึง เซอร์โวมอเตอร์ท่ีช่ือวา่ myservo มีการเช่ือมตอ่ ที่ขา D9 3. ฟังก์ช่ันส่ังให้เซอร์โวหมุนไปยังมุมที่กาหนด ใช้ส่ังให้เซอร์โวมอเตอร์หมุนไปยงั มุมที่ กาหนดซ่ึงค่ามุมท่ีสามารถป้อนอยใู่ นระหวา่ ง 0-180 รูปแบบเป็นดงั น้ี .write(val); ตวั อย่าง val: ตวั เลขมุมที่ตอ้ งการใหเ้ ซอร์โวมอเตอร์เคลื่อนที่ไป หมายถงึ myservo.write(45); เซอร์โวมอเตอร์ท่ีชื่อวา่ myservo เคล่ือนที่ไปยงั มุม 45 องศา 7. วงจรทใี่ ช้ทดลอง วงจรเพื่อใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit VCC R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC C1 0.1uF R21,kR3 A5 28 Potentiometer 10k USB to UART (TTL Level) 3 D1(TXD) DTR 2 D0(RXD) RXD TXD VCC RC Servo Motor +5V Signal GND VCC 3V3 GND D9 15 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.13-4 วงจรท่ีใชไ้ อซี AVR ในการทดลอง

รูปที่ 4.13-6 การตอ่ ลงบอร์ดทดลอง AB C DE F GH I J รูปที่ 4.13-5 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง 178  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การต่อวงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง รูปท่ี 4.13-7 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน D11 5 VCC กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป 3V3 D10 5V REF D9 10 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 D9 GND ARDUINO 25 25 A5 30 30 35 35 VCC Signal 40 40 VCC VCC GND Potentiometer 10k 45 45 RC Servo Motor 50 50 55 55 60 60 AB C DE F GH I J

ใบงานที่ 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์  179 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมควบคุมการเคลื่อนท่ีของเซอร์โวมอเตอร์ไปที่มุมต่าง ๆ โดยรับค่าจากการ หมุนโพเทนธิโอมิเตอร์ ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง อ่านคา่ จาก POT แปลงย่านตวั เลข ขบั เซอร์โวมอเตอร์ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Servo.h> 2 #define pot 5 3 Servo myservo; // create servo object to control a servo 4 void setup() 5{ 6 myservo.attach(9); // attaches the servo on pin 9 to the servo object 7} 8 void loop() 9{ 10 int val = analogRead(pot); // reads the value of the potentiometer 11 val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo 12 myservo.write(val); // sets the servo position 13 delay(15); // waits for the servo to get there 14 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบราร่ี Servo.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 กาหนดช่ือ pot ใหแ้ ทน 5 (โพเทนธิโอมิเตอร์เชื่อมต่ออยกู่ บั ขา A5 ของ Arduino) - บรรทดั ท่ี 3 ประกาศใชง้ านไลบรารี่โดยกาหนดช่ือ myservo ใหแ้ ทนเซอร์โวมอเตอร์ท่ีใชง้ าน - บรรทดั ท่ี 6 กาหนดขาพอร์ตท่ีใชเ้ ชื่อมตอ่ กบั เซอร์โวมอเตอร์ - บรรทดั ท่ี 10 อ่านคา่ แอนาลอกจากโพเทนธิโอมิเตอร์เอามาเก็บไวใ้ นตวั แปร val - บรรทดั ท่ี 11 เปลี่ยนยา่ นตวั เลขจากคา่ แอนาลอก 0-1023 ไปเป็น 0-180 - บรรทดั ที่ 12 ส่ังใหเ้ ซอร์โวขยบั ไปยงั มุมที่ไดจ้ ากคา่ ในตวั แปร val

180  เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองปรับแกค้ า่ ยา่ นตวั เลขใหเ้ ป็นค่าอื่นแลว้ สงั เกตผล 9. สรุปผลการปฏบิ ัติงาน 10. งานทมี่ อบหมาย เขียนโปรแกรมควบคุมเซอร์โวมอเตอร์จานวน 2 ตวั โดยใชค้ นั โยก (จอยสติก) แบบตวั ตา้ นทาน พร้อมท้งั เขียนโคด้ สง่ั ให้ LED ติดเมื่อกดสวติ ช์ท่ีอยบู่ นหวั ของคนั โยก GN D GN D +5V +5V To Analog in VRx To Analog in VRy To Digital in SW รูปที่ 4.13-8 ลกั ษณะของคนั โยก รูปท่ี 4.13-9 การเช่ือมตอ่ ใชง้ าน วงจรที่ใชท้ ดลอง VCC ARDUINO VCC 5V GN D A3 +5V A5 VRx VRy D7 SW D8 VCC RC Servo Motor Signal D9 VCC R1 220 GND D10 VCC RC Servo Motor Signal GND LED1 VCC GND รูปที่ 4.13-10 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

ใบงานที่ 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  181 ใบงานท่ี 4.14 การเขยี นโปรแกรมใช้งานอนิ เตอร์รัพท์ 1. จุดประสงค์ทว่ั ไป เพอ่ื ใหส้ ามารถเขียนโปรแกรมใชง้ านอินเตอร์รัพทไ์ ด้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมใชง้ านอินเตอร์รัพทไ์ ด้ 2. บอกข้นั ตอนการตอ่ วงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 2 ตวั 2 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 6 ตวั 2.3 ตวั เกบ็ ประจุ 1uF 2.4 Tack Switch 1 ตวั 2.2 LED 3mm 4 ตวั 1 เส้น 1 ชุด 3. บอร์ด Arduino Nano 3.0 1 เครื่อง 4. สายเชื่อมต่อ USB (mini USB) 5. สายเชื่อมต่อวงจร 6. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ัตงิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

182  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การขดั จงั หวะการทางานหรือเรียกทบั ศพั ทว์ า่ การอินเตอร์รัพต์ (Interrupt) เป็นการขดั จงั หวะการ ทางานปกติ (ประมวลผลในโปรแกรมหลกั ) ของไมโครคอนโทรลเลอร์โดยจะกระโดดไปทางานใน โปรแกรมตอบสนองการอินเตอร์รัพท์ในตาแหน่งที่ตอบสนองการอินเตอร์รัพท์ (Interrupt Vector) ชนิด น้นั ๆ เมื่อทางานในโปรแกรมตอบสนองการอินเตอร์รัพทเ์ สร็จสิ้นซีพียูจะกระโดดกลบั มาทางานใน ตาแหน่งเดิมของโปรแกรมหลกั ต่อไป ไมโครคอนโทรลเลอร์ในทุกตระกูลจะมีอินเตอร์รัพท์ท่ีไม่ สามารถปฏิเสธได้ 1 ชนิดไดแ้ ก่ Reset กล่าวคือเมื่อซีพยี ไู ดร้ ับสัญญาณอินเตอร์รัพทช์ นิดน้ีไม่วา่ จะทางาน ในคาสั่งใดอยูก่ ็ตามจะตอ้ งกลบั ไปทางานในตาแหน่ง 0x0000 ซ่ึงเป็ นตาแหน่งแรกของโปรแกรม บอร์ด Arduino ในรุ่นที่ใชไ้ มโครคอนโทรลเลอร์ตระกูล AVR เบอร์ Atmega328 สามารถอินเตอร์รัพท์ไดจ้ าก หลายแหล่งโดยแตล่ ะแหล่งมีตาแหน่งตอบสนองการอินเตอร์รัพทท์ ี่แตกต่างกนั ไปดงั ตารางที่ 4.14-1 ตารางท่ี 4.14-1 Reset and Interrupt Vectors in ATmega328P Vector Program Source Interrupt Definition No. Address External pin, power-on reset, brown-out reset and watchdog 1 0x0000 RESET system reset 2 0x0002 INT0 External interrupt request0 3 0x0004 INT1 External interrupt request1 4 0x0006 PCINT0 Pin change Interrupt request 0 5 0x0008 PCINT1 Pin change interrupt request 1 6 0x000A PCINT2 Pin change interrupt request 2 7 0x000C WDT Watchdog time-out interrupt 8 0x000E TIMER2 COMPA Timer/Counter2 compare match A 9 0x0010 TIMER2 COMPB Timer/Counter2 compare match B 10 0x0012 TIMER2 OVF Timer/Counter2 overflow 11 0x0014 TIMER1 CAPT Timer/Counter1 capture event 12 0x0016 TIMER1 COMPA Timer/Counter1 compare match A 13 0x0018 TIMER1 COMPB Timer/Counter1 compare match B 14 0x001A TIMER1 OVF Timer/Counter1 overflow 15 0x001C TIMER0 COMPA Timer/Counter0 compare match A 16 0x001E TIMER0 COMPB Timer/Counter0 compare match B 17 0x0020 TIMER0 OVF Timer/Counter0 overflow 18 0x0022 SPI, STC SPI serial transfer complete 19 0x0024 USART, RX USART Rx complete 20 0x0026 USART, UDRE USART, data register empty 21 0x0028 USART, TX USART, Tx complete 22 0x002A ADC ADC conversion complete 23 0x002C EE READY EEPROM ready 24 0x002E ANALOG COMP Analog comparator 25 0x0030 TWI 2-wire serial interface 26 0x0032 SPM READY Store program memory ready

ใบงานที่ 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  183 ใบงานน้ีเป็นการเรียนรู้การอินเตอร์รัพทท์ ่ีรับการกระตุน้ จากสัญญาณภายนอกซ่ึงสามารถรับการ อินเตอร์รัพทไ์ ด้ 2 แหล่งคือ INT0 (ขา D2) และ INT1 (ขา D3) เนื่องจากใบงานใช้ Arduino รุ่น Nano ใน การทดลอง แต่สาหรับบอร์ด Arduino ในรุ่นอ่ืน ๆ สามารถรับสัญญาณอินเตอร์รัพทจ์ ากขาท่ีแตกต่างกนั ดงั ตารางที่ 4.14-2 ตารางที่ 4.14-2 ขาดิจิทลั ที่พร้อมใชง้ านอินเตอร์รัพทข์ องบอร์ด Arduino ในรุ่นต่าง ๆ Board Digital Pins Usable for Interrupts Uno, Nano, Mini, other 328-based Mega, Mega2560, MegaADK 2, 3 Micro, Leonardo, other 32u4-based Zero 2, 3, 18, 19, 20, 21 MKR1000 Rev.1 Due 0, 1, 2, 3, 7 101 all digital pins, except 4 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 all digital pins all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 works with CHANGE) ตารางท่ี 4.14-3 ชนิดของอินเตอร์รัพทข์ องบอร์ด Arduino ในรุ่นตา่ ง ๆ Board int.0 int.1 int.2 int.3 int.4 int.5 Uno, Nano, Mini, Ethernet 23 18 Mega2560 2 3 21 20 19 32u4 based (e.g Leonardo, Micro) 32017 Due, Zero, MKR1000, 101 interrupt number = pin number Arduino เป็ นไมโครคอนโทรลเลอร์ท่ีทางานดว้ ยความเร็วสูงดงั น้นั เมื่อใชง้ านวงจรสวิตช์ทว่ั ไป ดงั รูป 4.14-1 จะทาให้เกิดสัญญาณรบกวนได้ สัญญาณรบกวนน้ีเรียกว่าสัญญาณกระเดง้ กระดอนหรือ เรียกทบั ศพั ทว์ า่ สญั ญาณเบาส์ (Bouncing signal) ซ่ึงการกดเพยี งหน่ึงคร้ังจะเกิดสัญญาณรบกวนข้ึนทาให้ ไมโครคอนโทรลเลอร์ที่ทางานดว้ ยความเร็วสูงเขา้ ใจว่ากดหลายคร้ังส่งผลทาให้เกิดการประมวลผลที่ คลาดเคล่ือนไป ดงั น้นั เม่ือใชง้ านจริงสามารถใชว้ ธิ ีการแกไ้ ด้ 2 แบบคือ 1. แก้ด้วยฮาร์ดแวร์ โดยการตอ่ ตวั เก็บประจุคร่อมสวติ ช์ดงั รูปที่ 4.14-2 2. แก้ด้วยซอฟท์แวร์ โดยการหน่วงเวลาเมื่อไดร้ ับสัญญาณไปช่วงเวลาหน่ึงแลว้ ตรวจสอบอีกคร้ัง VCC Switch contacts bouncing R 10k 5V VOUT SW 0V closed open Switch position รูปที่ 4.14-1 วงจรสวติ ช์ทว่ั ไป

184  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] VCC Switch contacts debouncing R 10k 5V 0V VOUT SW C closed open Switch position รูปท่ี 4.14-2 วงจรสวติ ช์ที่ไดร้ ับการแกไ้ ข 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. ฟังก์ช่ันอ่านค่าลอจิกดจิ ิทลั ที่ขาพอร์ต เป็นการอ่านค่าเขา้ มาซ่ึงอาจนามาเก็บไวใ้ นตวั แปรไว้ ตรวจสอบลอจิกทีหลงั หรือจะตรวจสอบลอจิกแบบทนั ทีก็ได้ ซ่ึงฟังกช์ นั่ น้ีจะทางานไดต้ อ้ ง มีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalRead(pin); pin: หมายเลขขาพอร์ตที่ตอ้ งการอา่ นลอจิก 4. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่ ตอ้ งการหยุดคา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่ ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long

ใบงานที่ 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  185 delay(ms); ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 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) ฟังก์ช่ันใช้งานอนิ เตอร์รัพท์ Arduino เตรียมฟังกช์ น่ั เก่ียวกบั อินเตอร์รัพทใ์ หใ้ ชง้ านท้งั หมด 4 ฟังกช์ น่ั ดว้ ยกนั คือ - attachInterrupt() เปิ ดการใชง้ านอินเตอร์รัพทจ์ ากขาอินเตอร์รัพทภ์ ายนอก - detachInterrupt() ปิ ดการใชง้ านอินเตอร์รัพทจ์ ากขาอินเตอร์รัพทภ์ ายนอก - interrupts() เปิ ดการใชง้ านอินเตอร์รัพทอ์ ีกคร้ัง - noInterrupts() ปิ ดการใชง้ านอินเตอร์รัพทท์ ้งั หมด 1. ฟังก์ช่ันเปิ ดการใช้งานอินเตอร์รัพท์จากขาอินเตอร์รัพท์ภายนอก ค่าเริ่มตน้ ของ Arduino ไม่ไดเ้ ปิ ดการใชง้ านส่วนน้ีไวโ้ ดยขาใชง้ านไดน้ าไปใชง้ านเป็ นขาดิจิทลั ปกติ ในทางปฏิบตั ิ โปรแกรมตอบสนองการอินเตอร์รัพท์จะตอ้ งส้ันเพ่ือให้ซีพียูไดท้ างานเสร็จสิ้นดว้ ยความ รวดเร็ว เน่ืองจากเมื่อกาลงั ทาโปรแกรมตอบสนองการอินเตอร์รัพทอ์ ยูน่ ้นั ฟังชน่ั อ่ืนท่ีมีการ ใช้งานอินเตอร์รัพท์จะไม่สามารถใชง้ านไดเ้ ช่น delay(), millis() และหากมีการใช้งานตวั แปรท่ีเป็ นตวั แปรโกลบอลจะต้องประกาศด้านหน้าว่า volatile เพื่อให้ค่าท่ีนาไปใช้งาน

186  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] อินเตอร์รัพทไ์ ดร้ ับค่าหรือกาหนดค่าเพ่ือส่งกลบั เขา้ โปรแกรมหลกั ไดอ้ ยา่ งถูกตอ้ ง รูปแบบ ของฟังกช์ นั่ เปิ ดการใชง้ านน้ีมี 2 แบบดว้ ยกนั คือ - แบบทกี่ าหนดชื่อขาดิจิทลั attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); pin: หมายเลขขาดิจิทลั ท่ีสามารถใชง้ านไดเ้ ช่น D2 ใส่เฉพาะเลข 2 ISR: ชื่อฟังกช์ น่ั รองท่ีใชต้ อบสนองการอินเตอร์รัพท์ mode: เป็นการกาหนดลกั ษณะของสญั ญาณท่ีใชก้ ระตุน้ การอินเตอร์รัพท์ LOW เม่ือขาเป็นลอจิกศูนย์ CHANGE เมื่อขามีการเปล่ียนระดบั ลอจิก 1->0, 0->1 RISING เมื่อขามีการเปลี่ยนระดบั ลอจิกจาก 0 ไปเป็น 1 FALLING เมื่อขามีการเปล่ียนระดบั ลอจิกจาก 1 ไปเป็น 0 - แบบทก่ี าหนดชนิดของอนิ เตอร์รัพท์ attachInterrupt(interrupt, ISR, mode); interrupt: หมายเลขขาอินเตอร์รัพทเ์ ช่น INT0(D2) ใส่เฉพาะเลข 0 ISR: ช่ือฟังกช์ นั่ รองที่ใชต้ อบสนองการอินเตอร์รัพท์ mode: เป็นการกาหนดลกั ษณะของสัญญาณท่ีใชก้ ระตุน้ การอินเตอร์รัพท์ LOW เม่ือขาเป็นลอจิกศูนย์ CHANGE เมื่อขามีการเปล่ียนระดบั ลอจิก 1->0, 0->1 RISING เมื่อขามีการเปลี่ยนระดบั ลอจิกจาก 0 ไปเป็น 1 FALLING เมื่อขามีการเปลี่ยนระดบั ลอจิกจาก 1 ไปเป็น 0 2. ฟังก์ช่ันปิ ดการใช้งานอนิ เตอร์รัพท์จากขาอนิ เตอร์รัพท์ภายนอก เป็นฟังกช์ นั่ ท่ีปิ ดการใชง้ าน การอินเตอร์รัพทใ์ นขาน้นั ๆ โดยขาท่ีถูกปิ ดจะกลบั ไปเป็นขาดิจิทลั ดงั เดิมรูปแบบดงั น้ี detachInterrupt(digitalPinToInterrupt(pin)); detachInterrupt(interrupt); pin: หมายเลขขาดิจิทลั ท่ีสามารถใชง้ านไดเ้ ช่น D2 ใส่เฉพาะเลข 2 interrupt: หมายเลขขาอินเตอร์รัพทเ์ ช่น INT0(D2) ใส่เฉพาะเลข 0

ใบงานท่ี 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  187 3. ฟังก์ช่ันเปิ ดการใช้ งานอินเตอร์รัพท์อีกคร้ัง เป็ นฟังก์ช่ันท่ีใช้เม่ือต้องการเปิ ดให้มีการ อินเตอร์รัพทไ์ ดอ้ ีกคร้ังหลงั จากการถูกส่ังปิ ดการอินเตอร์รัพทจ์ ากฟังกช์ น่ั noInterrupts(); interrupts(); 4. ฟังก์ชั่นปิ ดการใช้งานอินเตอร์รัพท์ เป็ นฟังกช์ น่ั ที่ใชป้ ิ ดการอินเตอร์รัพทท์ ุกชนิด ดงั น้นั เมื่อ ใชง้ านฟังกช์ นั่ น้ีแลว้ ฟังกช์ น่ั อ่ืน ๆ ที่มีการใชง้ านอินเตอร์รัพทจ์ ะใชง้ านไม่ไดเ้ ช่น delay(); noInterrupts(); 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 D9 15 R4-R8 LED1-LED3 220 C1 D10 16 0.1uF D11 17 USB to UART (TTL Level) R2,R3 3 D12 18 1k 2 DTR VCC RXD D1(TXD) Internal pull up TXD D0(RXD) R229,0Rx120 SW2 +5V SW3 GND 3V3 C4,C5 1uF 16V X1 (INT0)D2 4 16MHz (INT1)D3 5 C2,C3 9 XTAL1 22pF 10 XTAL2 GND 8,22 รูปท่ี 4.14-3 วงจรท่ีใชไ้ อซี AVR ในการทดลอง

188  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป R12-2R03 LED1-LED3 ARDUINO VCC D9 Internal pull up D10 D11 2R240-Rx52 SW1 D12 SW2 (INT0)D2 (INT1)D3 GND C1-2 1uF 16V รูปที่ 4.14-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.14-5 การต่อลงบอร์ดทดลอง การตอ่ วงจรเพื่อทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.14-6 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน

ใบงานที่ 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  189 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมทดสอบฟังก์ชน่ั noInterrupts(); และ interrupts(); โดยการสั่งให้ LED ติด และดบั โดยใชฟ้ ังกช์ น่ั หน่วงเวลาพร้อมแสดงการนบั เลขสงั เกตผลที่เกิดข้ึน ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง A ปิ ดการอนิ เตอร์รัพท์ B เปิ ดการอนิ เตอร์รัพท์ ครบ 20 รอบ? จริง A ครบ 20 รอบ? จริง B เทจ็ เทจ็ สัง่ LED ตดิ ดับ สัง่ LED ติด ดบั ส่งค่าตวั เลขไปแสดงผล ส่งค่าตัวเลขไปแสดงผล แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 12 2 byte state = LOW; 3 void setup() { 4 pinMode(LED, OUTPUT); 5 Serial.begin(9600); 6} 7 void loop() { 8 noInterrupts(); 9 Serial.print(\"Disable Interrupt :\"); 10 for(int i=1;i<=20;i++) 11 { 12 Serial.print(\"-\");Serial.print(i);delay(250); 13 state = !state; 14 digitalWrite(LED, state); 15 } 16 Serial.println(\"\"); 17 interrupts(); 18 Serial.print(\"Enable Interrupt :\"); 19 for(int i=1;i<=20;i++) 20 { 21 Serial.print(\".\");Serial.print(i);delay(250); 22 state = !state; 23 digitalWrite(LED, state); 24 } 25 Serial.println(\"\"); 26 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือ LED ใหแ้ ทน 12 (เป็นขาท่ี LED ตอ่ อยกู่ บั ขา D12 ของ Arduino) - บรรทดั ท่ี 2 ประกาศตวั แปรสาหรับเกบ็ สถานะของ LED โดยใหค้ ่าเริ่มตน้ เป็น LOW

190  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ที่ 4 กาหนดโหมดใหก้ บั ขาพอร์ตท่ีตอ่ กบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ที่ 5 กาหนดความเร็วในการส่ือสารผา่ นพอร์ตอนุกรมที่ 9600 bps - บรรทดั ที่ 8 ปิ ดการอินเตอร์รัพท์ - บรรทดั ท่ี 9 แสดงขอ้ ความวา่ \"Disable Interrupt :\" - บรรทดั ท่ี 11-15 วนแสดงเลขนบั รอบพร้อมส่งั ให้ LED ติด/ดบั - บรรทดั ท่ี 17 เปิ ดการอินเตอร์รัพท์ - บรรทดั ที่ 18 แสดงขอ้ ความวา่ \"Enable Interrupt :\" - บรรทดั ท่ี 19-24 วนแสดงเลขนบั รอบพร้อมสั่งให้ LED ติด/ดบั ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. สังเกตผลท่ีเกิดข้ึนในจงั หวะท่ีมีการสง่ั ปิ ดและเปิ ดการอินเตอร์รัพท์ (ฟังกช์ น่ั delay จะไม่ ทางานเม่ือมีการสง่ั ปิ ดอินเตอร์รัพท)์ การทดลองท่ี 2 เขียนโปรแกรมควบคุมการติดดบั ของ LED ดว้ ยสวิตช์โดยวิธีอินเตอร์รัพท์ ในขณะที่ยงั ไมม่ ีการกดสวติ ชใ์ หแ้ สดงผลการนบั รอบเพอื่ ใหร้ ู้วา่ กาลงั วนทางานอยใู่ นส่วนใด ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริม่ ต้นต่าง START เปิ ดการอนิ เตอร์รัพท์ภายนอก กลบั ค่าตัวแปรส านะ จริง แสดงข้อความวา่ กู ครบ 20 รอบ? อินเตอร์รพั ท์แล้ว เทจ็ STOP ส่งตัวเลขไปแสดงผล ฟังกช์ นั่ ตอบสนองการอินเตอร์รพั ท์ สัง่ LED ตดิ ดับ ตามตัวแปรส านะ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 12 2 #define interruptPin 2 3 volatile byte state = LOW; 4 void setup() 5{ 6 pinMode(LED, OUTPUT); 7 pinMode(interruptPin, INPUT_PULLUP); 8 attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); 9 Serial.begin(9600); 10 }

ใบงานท่ี 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  191 11 void loop() { 12 // noInterrupts(); 13 Serial.print(\"Test :\"); 14 for(int i=1;i<=20;i++) 15 { 16 Serial.print(\"-\"); 17 Serial.print(i); 18 delay(250); 19 digitalWrite(LED, state); 20 } 21 Serial.println(\"\"); 22 } 23 void blink() 24 { 25 state = !state; 26 Serial.println(\"\"); 27 Serial.println(\"Interrupted\"); 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือ LED ใหแ้ ทน 12 (เป็นขาที่ LED ตอ่ อยกู่ บั ขา D12 ของ Arduino) - บรรทดั ท่ี 2 กาหนดช่ือ interruptPin ใหแ้ ทน 2 (เป็นขาท่ีสวติ ช์ตอ่ อยกู่ บั ขา D2 ของ Arduino) - บรรทดั ที่ 3 ประกาศตวั แปรสาหรับเกบ็ สถานะของ LED โดยใหค้ า่ เริ่มตน้ เป็น LOW - บรรทดั ที่ 6 กาหนดโหมดใหก้ บั ขาพอร์ตท่ีตอ่ กบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ที่ 7 กาหนดโหมดใหก้ บั ขาพอร์ตที่ต่อกบั สวติ ช์ทางานเป็นอินพุทแบบพูลอพั - บรรทดั ท่ี 8 เปิ ดการอินเตอร์รัพทภ์ ายนอกโดยรับสัญญาณแบบ CHANGE - บรรทดั ที่ 9 กาหนดความเร็วในการสื่อสารผา่ นพอร์ตอนุกรมท่ี 9600 bps - บรรทดั ที่ 14-20 แสดงตวั เลขนบั รอบพร้อมส้ังให้ LED ติด/ดบั ตามตวั แปรเก็บสถานะ - บรรทดั ท่ี 23-28 ฟังกช์ นั่ ตอบสนองการอินเตอร์รัพท์ โดยส่ังกลบั คา่ ตวั แปรเกบ็ สถานะและแสดง ขอ้ ความวา่ เกิดการอินเตอร์รัพทข์ ้ึนแลว้ ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองกดสวติ ช์แลว้ สงั เกตผลท่ีเกิดข้ึน 4. ทดลองเปลี่ยนรูปแบบของลกั ษณะสญั ญาณอินเตอร์รัพทเ์ ป็น LOW, CHANGE, RISING, FALLING 5. ทดลองใชแ้ ละไมใ่ ชว้ งจรแกส้ ัญญาณรบกวนดงั รูปท่ี 4.14-7 (a) และ (b) สังเกตผลที่เกิดข้ึน 2R21,0 Rx22 SW1 R221,0 Rx22 SW1 SW2 SW2 (INT0)D2 (INT0)D2 (INT1)D3 (INT1)D3 C1, C2 1uF 16V (a) (b) รูปที่ 4.14-7 วงจรแกส้ ญั ญาณรบกวน

192  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมไฟว่ิง LED 4 ตัวโดยกาหนดรูปแบบการติด/ดับตามต้องการพร้อมให้ สามารถรับการอินเตอร์รัพทไ์ ด้ โดยเมื่อกดสวิตช์ SW1 ให้ LED ทุกตวั ดบั หมดและเม่ือกด สวติ ช์ SW2 ให้ LED ทุกตวั ติดสวา่ งท้งั หมดวงจรท่ีใชท้ ดลองดงั รูป ARDUINO R1-R3 LED1-LED3 D9 220 D10 D11 D12 VCC Internal pull up R4-R5 SW1 220 x2 (INT0)D2 SW2 (INT1)D3 GND C11uF-216V รูปที่ 4.14-8 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

ใบงานที่ 4.15 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  193 ใบงานท่ี 4.15 การเขยี นโปรแกรมใช้งานหน่วยความจา EEPROM 1. จุดประสงค์ทว่ั ไป เพอื่ ใหส้ ามารถเขียนโปรแกรมใชง้ านหน่วยความจา EEPROMได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมใชง้ านหน่วยความจา EEPROMได้ 2. บอกข้นั ตอนการต่อวงจรเพื่อทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 2 ตวั 4 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 5 ตวั 2.3 ตวั เกบ็ ประจุ 1uF 2.4 Tack Switch 1 ตวั 2.2 LED 3mm 1 ตวั 1 เส้น 1 ชุด 3. บอร์ด Arduino Nano 3.0 1 เคร่ือง 4. สายเช่ือมต่อ USB (mini USB) 5. สายเชื่อมตอ่ วงจร 6. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

194  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน EEPROM (Electrically Erasable Programmable Read-Only Memory) หรือ E2PROM สาหรับ การออกเสียงสามารถเรี ยกได้หลายแบบได้แก่ อีอีพรอม ดับเบิลอีพรอม หรื ออีสแควร์พรอม หน่วยความจาชนิดน้ีเป็ นหน่วยความจาประเภทก่ึงถาวรกล่าวคือเป็ นหน่วยความจาที่สามารถเขียนและ ลบได้โดยใช้แรงดันไฟฟ้าปกติได้และข้อมูลที่บรรจุอยู่ภายในสามารถคงค่าอยู่ได้ในสภาพที่ไม่มี ไฟเล้ียงวงจร (non-volatile memory) หน่วยความจาชนิดน้ีมีอายุการใช้งานจากดั ตามวงรอบของการ เขียนขอ้ มูล ดงั น้นั การใชง้ านจึงใช้เก็บขอ้ มูลท่ีจาเป็ นที่ตอ้ งคงค่าน้นั เพื่อนามาใช้งานใหม่ไดใ้ นกรณีที่ หยดุ จา่ ยไฟใหก้ บั วงจร เช่นการต้งั คา่ โหมดการทางาน การต้งั ค่าสูงสุดต่าสุด การต้งั เวลาทางานของวงจร เป็นตน้ บอร์ด Arduino ในแตล่ ะรุ่นมีการใชซ้ ีพยี แู ตกตา่ งกนั ซ่ึงซีพยี แู ตล่ ะเบอร์มีหน่วยความจาชนิดน้ีท่ีมี ขนาดแตกต่างกนั ดงั ตาราง 4.15-1 ตารางเปรียบเทียบคุณสมบตั ิของ Arduino ในแตล่ ะรุ่น (เฉพาะบางรุ่น) Name Processor EEPROM[KB] SRAM [KB] Flash [KB] 101 Intel® Curie - 24 196 Gemma ATtiny85 0.5 0.5 8 LilyPad ATmega168V 0.512 1 16 ATmega328P LilyPad SimpleSnap ATmega328P 1 2 32 LilyPad USB ATmega32U4 1 2.5 32 Mega 2560 ATmega2560 4 256 Micro 8 ATmega32U4 1 2.5 32 Pro ATmega168 0.512 16 ATmega328P 1 32 Pro Mini ATmega328P 1 2 32 Uno ATmega328P 1 32 Zero ATSAMD21G18 1 2 256 Due ATSAM3X8E - 512 Esplora ATmega32U4 - 2 32 Ethernet ATmega328P 1 32 32 Leonardo ATmega32U4 1 96 32 Mega ADK ATmega2560 1 2.5 256 Mini ATmega328P 4 2 32 ATmega168 1 2.5 16 Nano ATmega328P 0.512 8 32 ATmega32U4 1 2 32 Yùn AR9331 Linux 1 64MB 1 2 2.5 16MB บอร์ด Arduino รุ่นท่ีใช้ในการทดลองน้ีเป็ นรุ่น Nano ใช้ซีพียูตระกูล AVR เบอร์ ATmega328 ซ่ึงมีหน่วยความจา EEPROM ขนาด 1 Kbyte (1024 byte) จากขอ้ มูลในดาตา้ ชีตระบุวงรอบการเขียน ขอ้ มูลลงหน่วยความจาสามารถใชง้ านไดป้ ระมาณ 100,000 คร้ัง


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook