รายวิชา 9560206 ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม รายวิชา 9560206 ไมโครโปรเซสเซอร์ในงานอุตสาหกรรม อ.โสภณ มหาเจริญ บทที่ 7 การออกแบบวงจรภาคเอาต์พุตและการเขียนโปรแกรม
วัตถุประสงค์ 7.1 เพื่อให้ผู้เรียนเข้าใจขั้นตอนการเชื่อมต่ออุปกรณ์เอาต์พุตกับบอร์ด Arduino 7.2 เพื่อให้ผู้เรียนสามารถพัฒนาโปรแกรมการใช้งานอุปกรณ์เอาต์พุตได้อย่างถูกต้อง 7.3 เพื่อให้ผู้เรียนมีความรู้ความเข้าใจในการใช้งานอุปกรณ์เอาต์พุตรูปแบบต่างๆ
เนื้อหาประจำบท การใช้งานเอาต์พุต LED การใช้งานเอาต์พุต ลำโพง การใช้งานเอาต์พุต รีเลย์ การใช้งานเอาต์พุต ดีซีมอเตอร์ การใช้งานเอาต์พุต เซอร์โวมอเตอร์ การใช้งานเอาต์พุต จอแสดงผล LCD
วัตถุประสงค์เชิงพฤติกรรม ผู้เรียนสามารถพัฒนาโปรแกรมผ่านบอร์ด Arduino เพื่อการควบคุมอุปกรณ์ภาคเอาต์พุตได้
เอาต์พุต
การขับหลอด LED การควบคุมให้ LED กระพริบ รายการอุปกรณ์ หลอด LED: (F9)-(F10) Note: longer wire on F9 ตัวต้านทาน Resistor: (J10) to (any -ve column hole) สายเชื่อมต่อ Wire 1: (J9) to (Arduino Pin 13) สายเชื่อมต่อ Wire 2: (any breadboard -ve column hole) to (Arduino GND) Note: either GND power pin is ok! สายาเชื่อมต่อ Wire 3: (any breadboard +ve column hole) to (Arduino 5V
การขับหลอด LED
การขับหลอด LED int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
การขับหลอด LED
การขับหลอด LED
การขับหลอด LED
การขับหลอด LED
Active Buzzer Module
Active Buzzer Module โมดูล Active Buzzer ใช้ไฟเลี้ยง 3.3 - 5V สามารถสร้างเสียงเตือนได้อย่างง่าย ๆ เพียงแค่จ่ายไฟเข้าไปที่ ขา I/O โมดูลนี้มีทรานซิสเตอร์เบอร์ 9012 ช่วยขยายสัญญาณจึงมีความดังเป็นพิเศษ คุณสมบัติของอุปกรณ์ module USES 9012 transistor driver working voltage 3.3 V-5 V has fixed bolt hole and easy installation Seven little board PCB size: 3.3 cm * 1.3 cm
ตำแหน่งขาของ Active Buzzer Module ขา Pinout ของตัวโมดูล (3 wire): 1. GND ต่อกับ GND 2. I/O ต่อกับ Pin digital ของบอร์ด Arduino 3. VCC ต่อกับไฟเลี้ยง 3.3 V-5 V
ต่อวงจรโมดูล Active buzzer กับ Arduino
โค้ดตัวอย่างการใช้โมดูล Active buzzer
โมดูลรีเลย์
โมดูลรีเลย์
โมดูลรีเลย์
โมดูลรีเลย์ รีเลย์ (Relay) เป็นอุปกรณ์ที่เปลี่ยนพลังงานไฟฟ้าให้เป็นพลังงานแม่เหล็ก เพื่อใช้ในการดึงดูดหน้าสัมผัสของคอนแทคให้เปลี่ยนสภาวะ โดยการป้อนกระแสไฟฟ้าให้กับขดลวด เพื่อทำการปิดหรือเปิดหน้าสัมผัสคล้ายกับสวิตช์อิเล็กทรอนิกส์ ซึ่งเราสามารถนำรีเลย์ไปประยุกต์ใช้ ในการควบคุมวงจรต่าง ๆ ในงานช่างอิเล็กทรอนิกส์มากมาย
โมดูลรีเลย์ ผู้เรียนสามารถพัฒนาโปรแกรมผ่านบอร์ด Aduino ได้อย่างสมบูรณ์
ส่วนประกอบโมดูลรีเลย์
ส่วนประกอบโมดูลรีเลย์
ตัวอย่างการใช้งานโมดูลรีเลย์ การนำโมดูลรีเลย์เพื่อควบคุมการเปิด/ปิดหลอดไฟ 220V
วงจรควบคุมหลอดไฟด้วยโมดูลรีเลย
ตัวอย่างโปรแกรม int relayPin = 10; // Relay connected to digital pin 10 void setup() { pinMode(relayPin, OUTPUT); } void loop() { digitalWrite(relayPin, HIGH); delay(1000); digitalWrite(relayPin, LOW); delay(1000); }
มอเตอร์ดีซี
โมดูลขับมอเตอร์ดีซี โมดูลนี้สามารถขับมอเตอร์ดีซีขนาดเล็ก ได้ 2 ตัว แต่ละตัวสามารถหมุนได้ทั้งสองทิศทางอิสระด้วยสัญญาณควบคุม 4 เส้น
หลักการหมุนของมอเตอร์ดีซี วงจรต่อการใช้งานมอเตอร์ 1 ตัว
หลักการหมุนของมอเตอร์ดีซี วงจรต่อการใช้งานมอเตอร์ 2 ตัว
Arduino ควบคุม DC Motor ด้วย L298
ตัวอย่างการสั่งให้ Motor หมุนกลับไปกลับมา
เซอร์โวมอเตอร์
เซอร์โวมอเตอร์ หมายของ Servo Motor ก็คือ Motor ที่เราสามารถสั่งงานหรือตั้งค่า แล้วตัว Motor จะหมุนไปยังตำแหน่งองศาที่เราสั่งได้เองอย่างถูกต้อง โดยใช้การควบคุมแบบป้อนกลับ (Feedback Control) ในบทความนี้จะกล่าวถึง RC Servo Motor ซึ่งนิยมนำมาใช้ในเครื่องเล่นที่บังคับด้วยคลื่นวิทยุ (RC = Radio - Controlled) เช่น เรือบังคับวิทยุ รถบังคับวิทยุ เฮลิคอปเตอร์บังคับวิทยุ เป็นต้น
ส่วนประกอบภายใน RC SERVO MOTOR 1. MOTOR เป็นส่วนของตัวมอเตอร์ 2. GEAR TRAIN หรือ GEARBOX เป็นชุดเกียร์ทดแรง 3. POSITION SENSOR เป็นเซ็นเซอร์ตรวจจับตำแหน่งเพื่อหาค่าองศาในการหมุน 4. ELECTRONIC CONTROL SYSTEM เป็นส่วนที่ควบคุมและประมวลผล
หลักการทำงานของ RC Servo Motor เมื่อจ่ายสัญญาณพัลซ์เข้ามายัง RC Servo Motor ส่วนวงจรควบคุม (Electronic Control System) ภายใน Servo จะทำการอ่านและประมวลผลค่าความกว้างของสัญญาณพัลซ์ที่ส่งเข้ามาเพื่อแปลค่าเป็นตำแหน่งองศาที่ต้องการให้ Motor หมุนเคลื่อนที่ไปยังตำแหน่งนั้น แล้วส่งคำสั่งไปทำการควบคุมให้ Motor หมุนไปยังตำแหน่งที่ต้องการ โดยมี Position Sensor เป็นตัวเซ็นเซอร์คอยวัดค่ามุมที่ Motor กำลังหมุน เป็น Feedback กลับมาให้วงจรควบคุมเปรียบเทียบกับค่าอินพุตเพื่อควบคุมให้ได้ตำแหน่งที่ต้องการอย่างถูกต้องแม่นยำ
สัญญาณ RC ในรูปแบบ PWM ตัว RC SERVO MOTOR ออกแบบมาใช้สำหรับรับคำสั่งจาก REMOTE CONTROL ที่ใช้ควบคุมของเล่นด้วยสัญญาณวิทยุต่างๆ เช่น เครื่องบินบังคับ รถบังบังคับ เรือบังคับ เป็นต้น ซึ่ง REMOTE จำพวกนี้ที่ภาครับจะแปลงความถี่วิทยุออกมาในรูปแบบสัญญาณ PWM (PULSE WIDTH MODULATION) มุมหรือองศาจะขึ้นอยู่กับความกว้างของสัญญาณพัลซ์ ซึ่งโดยส่วนมากความกว้างของพัลซ์ที่ใช้ใน RC SERVO MOTOR จะอยู่ในช่วง 1-2 ms หรือ 0.5-2.5 ms
วิธีควบคุม RC Servo Motor ด้วย Arduino Arduino มีไลบรารี่สำหรับสั่งงาน RC Servo Motor มาให้ใช้งานอยู่แล้วเป็นฟังก์ชั่นสำเร็จรูปและใช้งานได้ง่าย ในหน้าเว็บไซต์ http://arduino.cc/en/reference/servo ได้ให้ข้อมูลไว้ว่า Servo Library ของ Arduino สามารถสั่งงาน RC Servo Motor ได้ทั้งแบบหมุนไป-กลับได้ 0-180 องศา ฟังก์ชั่นภายใน Servo Library - attach() ,- write(), - writeMicroseconds(), - read(), - attached(), - detach()
attach() Description คือฟังก์ชั่นที่ใช้ในการกำหนดขาสัญญาณที่ Servo Motor ต่อกับ Arduino และกำหนดความกว้างของพัลซ์ที่ 0 องศาและ 180 องศา Syntax Servo.attach(pin) Servo.attach(pin,min,max) Parameters Pin: คือ ขาสัญญาณของ Arduino ที่ใช้เชื่อมต่อกับ Servo Motor Min: คือ ความกว้างของพัลซ์ที่ 0 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที (us) โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 544 us Max: คือ ความกว้างของพัลซ์ที่ 180 องศาของ Servo ตัวที่ใช้ในหน่วยไมโครวินาที (us) โดยปกติแล้วหากไม่มีการตั้งค่าโปรแกรมจะกำหนดค่าไว้ที่ 2400 us
Write() Description คือฟังก์ชั่นที่ใช้ควบคุมตำแหน่งที่ต้องการให้ Servo Motor หมุนไปยังองศาที่กำหนดสามารถกำหนดเป็นค่าองศาได้เลย คือ 0-180 องศา แต่ใน Servo Motor ที่เป็น Full Rotation คำสั่ง write จะเป็นการกำหนดความเร็วในการหมุน โดย ค่าเท่ากับ 90 คือคำสั่งให้ Servo Motor หยุดหมุน ค่าเท่ากับ 0 คือการหมุนด้วยความเร็วสูงสุดในทิศทางหนึ่ง ค่าเท่ากับ 180 คือการหมุนด้วยความเร็วสูงสุดในทิศทางตรงกันข้าม Syntax servo.write(angle) Parameters Angle: คือมุมที่ต้องการให้ RC Servo Motor แบบ 0-180 องศาหมุนไป แต่หากเป็น RC Servo Motor แบบ Full Rotation ค่า Angle คือ การกำหนดความเร็วและทิศทางในการหมุน
writeMicroseconds() Description คือฟังก์ชั่นที่ใช้ควบคุมตำแหน่งที่ให้ Servo Motor หมุนไปยังตำแหน่งองศาที่กำหนดโดยกำหนดเป็นค่าความกว้างของพัลซ์ในหน่วย us ซึ่งปกติแล้ว RC Servo Motor จะใช้ความกว้างของพัลซ์อยู่ที่ 1000-2000 us ตามที่ได้กล่าวไปข้างต้นแล้ว แต่ RC Servo Motor บางรุ่นหรือบางยี่ห้อไม่ได้ใช้ ช่วงความกว้างของพัลซ์ตามที่ได้กล่าวเอาไว้นี้ อาจจะใช้ช่วง 700-2300 แทนก็สามารถใช้ฟังก์ชั่น writeMicroseconds นี้เพื่อกำหนดความกว้างพัลซ์ได้เอง Syntax servo.writeMicroseconds(uS) Parameters uS: คือค่าความกว้างของพัลซ์ที่ต้องการกำหนดในหน่วยไมโครวินาที (โดยตัวแปร int) หมายเหตุ การใช้ฟังก์ชั่น writeMicroseconds สามารถกำหนดค่าได้อิสระ ตรงนี้ ”ต้องระวังในการใช้งาน” หากสั่งงาน RC Servo Motor (แบบ 0 - 180 องศา) จนหมุนไปเกินจุดสิ้นสุดคือเกินทั้งฝั่ง 0 หรือ 180 องศา จะทำให้เกิดเสียงครางดังจากการหมุนไปต่อไม่ได้และมอเตอร์จะกินกระแสสูงขึ้นด้วยในเวลาเดียวกันนั้น ซึ่งอาจทำให้ RC Servo Motor เกิดความเสียหายได้
read() Description คือฟังก์ชั่นอ่านค่าองศาที่สั่งเข้าไปด้วยฟังก์ชั่น write() เพื่อให้รู้ว่าตำแหน่งองศาสุดท้ายที่เราสั่งเข้าไปนั้นมีค่าเท่าไหร่ซึ่งค่าที่อ่านออกมานั้นจะมีค่าอยู่ในช่วง 0 - 180 Syntax servo.read() Parameters ไม่มี: จะ Return ค่า 0-180
attached() , detac() attached() Description คือฟังก์ชั่นตรวจสอบว่า Servo ที่เราต้องการใช้กำลังต่ออยู่กับขสัญญาณของ Arduino หรือไม่ Syntax servo.attached() Parameters ไม่มี: จะ Return ค่า True ออกมา หาก Servo Motor เชื่อมต่ออยู่กับ Arduino แต่ถ้าหาก Return ออกมาเป็นค่าอื่นถือว่าไม่เชื่อมต่อ detach() Description คือฟังก์ชั่นคืนสถานะของขาที่เรากำหนดให้เป็นขาควบคุม Servo Motor ด้วยคำสั่ง attached() ให้กลับคือสู่การใช่งานปกติ Syntax servo.detach() Parameters ไม่มี
วงจรการต่อเซอร์โวเข้ากับบอร์ด Arduino
โค้ดตัวอย่างการควบคุมตำแหน่ง Rc Servo Motor
กำหนดให้เซอร์โวหมุนตำแหน่ง 0 องศา ผลลัพธ์
กำหนดให้เซอร์โวหมุนตำแหน่ง 90 องศา ผลลัพธ์
กำหนดให้เซอร์โวหมุนตำแหน่ง 180 องศา ผลลัพธ์ myservo.write(180); delay(1000);
โค้ดตัวอย่างการควบคุมตำแหน่ง เซอร์โยแบบ Sweep
การใช้งาน Character LCD Display
การใช้งาน Character LCD Display จอ LCD 16x2 Character ที่นิยมวางจำหน่ายจะมีอยู่ 2 แบบด้วยกันคือ LCD แบบปกติที่เชื่อมต่อแบบขนาน (Parallel) และ LCD แบบที่เชื่อมต่ออนุกรม (Serial) แบบ I2C โดยทั้ง 2 แบบตัวจอมีลักษณะเดียวกันเพียงแต่แบบ I2C จะมีบอร์ดเสริมทำให้สื่อสารแบบ I2C ได้เชื่อมต่อได้สะดวกขึ้น
การใช้งาน Character LCD Display LCD ที่มีการเชื่อมแบบ I2C นั้นเรียกอีกอย่างว่าการเชื่อมต่อแบบ Serial จะเป็นจอ LCD ธรรมดาทั่วไปที่มาพร้อมกับบอร์ด I2C Bus ที่ทำให้การใช้งานได้สะดวกยิ่งขึ้นและยังมาพร้อมกับ VR สำหรับปรับความเข้มของจอ ในรูปแบบ I2C จะใช้ขาในการเชื่อมต่อกับ Microcontroller เพียง 4 ขา (แบบ Parallel ใช้ 16 ขา) ซึ่งทำให้ใช้งานได้ง่ายและสะดวกมากยิ่งขึ้น สามารถดูได้จากตารางต่อไปนี้
ตำแหน่งขาของแอลซีดี (LCD) I2C รูปที่ 4 ด้านหลังจอ LCD 16X2 (I2C) ตารางที่ 2 ตารางขาของจอ LCD 16X2 แบบ I2C ตำแหน่งขาของแอลซีดี (LCD) I2C
การควบคุมการแสดงผลของจอ LCD (I2C) ในการควบคุมหรือสั่งงาน โดยทั่วไปจอ LCD จะมีส่วนควบคุม (Controller) อยู่ในตัวแล้ว ผู้ใช้สามารถส่งรหัสคำสั่งสำหรับควบคุมการทำงานของจอ LCD (I2C) เช่นเดียวกันกับจอ LCD แบบธรรมดา พูดง่ายๆ คือรหัสคำสั่งที่ใช้ในการควบคุมนั้นเหมือนกัน แต่ต่างกันตรงที่รูปแบบในการรับส่งข้อมูล ในบทความนี้เราจะมาพูดถึงจอ LCD 16x2 ที่มีการส่งข้อมูลรูปแบบ I2C ที่ใช้ขาเพียง 4 ขาที่ใช้ในการเชื่อมต่อเท่านั้น 1. GND เป็น Ground ใช้ต่อระหว่าง Ground ของระบบ Microcontroller กับ LCD 2. VCC เป็นไฟเลี้ยงวงจรที่ป้อนให้กับ LCD มีขนาด +5VDC 3. SDA (Serial Data) เป็นขาที่ใช้ในการรับส่งข้อมูล 4. SCL (Serial Clock) เป็นขาสัญญาณนาฬิกาในการรับส่งข้อมูล
การเชื่อมต่อระหว่าง Arduino กับจอ LCD (I2C)
ชุดคำสั่งที่ใช้ในการสั่งงานระหว่าง Arduino กับจอ LCD คำสั่งที่ใช้ในการควบคุมจอ LCD ของ Arduino แบบ I2C นั้นไม่ต่างจากจอ LCD แบบธรรมดา (Parallel) มากนัก ทั้งนี้ยังได้มีการพัฒนา Library I2C มาให้ใช้งานได้อย่างสะดวกมากยิ่งขึ้น เรามาเริ่มต้นขั้นตอนแรกในการเขียนโปรแกรมกันเลยครับ ขั้นตอนแรกคือการนำไฟล์ Library LCD (I2C) ไปไว้ใน Library ของ Arduino ก่อนเพื่อให้ง่ายต่อการเรียกใช้ Library ผู้ใช้สามารถทำตามขั้นตอนด้านล่างได้เลยครับ 1. Download Library LCD (I2C) ก่อนครับ >> (ไฟล์ LiquidCrystal_I2C.7z) 2. ทำการแยกไฟล์ที่โหลดมาข้างต้น แล้วนำไปไว้ยัง C:\Program Files (x86)\Arduino\libraries (Drive ที่ได้ทำการติดตั้งโปรแกรม Arduino IDE ไว้)
ชุดคำสั่งที่ใช้ในการสั่งงานระหว่าง Arduino กับจอ LCD
ชุดคำสั่งที่ใช้ในการสั่งงานระหว่าง Arduino กับจอ LCD หลังจากที่เรานำไฟล์ Library ไปไว้เรียบร้อยแล้ว เราก็มาเริ่มการเขียนโปรแกรมกันเลยครับ ก่อนอื่นให้เราเรียก Library ของการสื่อสารแบบ I2C และ Library ของจอ LCD (I2C) ก่อนเลยครับ คือ Wire.h และ LiquidCrystal_I2C.h หลังจากทำการเรียก Library เรียบร้อยแล้ว เราจะมาดูกันว่ามีฟังก์ชั่นเบื้องต้นอะไรบ้างที่จะทำให้จอ LCD ของเราแสดงผล ฟังก์ชั่นแรก LiquidCrystal_I2C(); ใช้ในการประกาศ Address และ ขนาดของจอ รูปแบบของคำสั่งคือ LiquidCrystal_I2C lcd(Address, columns, rows); ในบทความนี้เราจะกำหนดดังนี้ LiquidCrystal_I2C lcd(0x27, 16, 2); หมายถึง Address ของจอคือ 27 ขนาดของจอคือ 16 ตัวอักษร 2 บรรทัด ฟังก์ชั่นต่อมา begin(); ใช้ในการกำหนดการเริ่มต้นในการใช้งานจอ ฟังก์ชั่นต่อมา setCursor(); ใช้ในการกำหนดตำแหน่งของ Cursor เช่น lcd.setCursor(0, 1); คือให้เคอร์เซอร์ไปที่ ตำแหน่งที่ 0 บรรทัดที่ 1 (การนับตำแหน่งเริ่มจาก 0) ฟังก์ชั่น print(); ใช้ในการกำหนดข้อความที่ต้องการแสดง เช่น lcd.print(“Hello world"); คือกำหนดให้แสดงข้อความ “Hello word” ออกทางหน้าจอ LCD
ตัวอย่างโค้ดโปรแกรม
สรุปประจำบท การเชื่อมต่อและการพัฒนาอุปกรณ์เอาต์พุตด้านไมโครคอนโทรลเลอร์ จุดประสงค์เพื่อการแสดงผล ที่มีรูปแบบที่หลากหลายตั้งแต่การแสดงผลแบบง่ายๆ โดยใช้หลอด LED ลำโพง ไปจนถึง จอแสดงผล หรือการควบคุมการหมุนของมอเตอร์ต่างๆ ผู้พัฒนาโปรแกรมมีความจำเป็นที่จะต้องเข้าใจหลักการทำงานของอุปกรณ์เอาต์พุตต่างๆ เหล่านั้นให้ชัดเจนเสียก่อน
แบบฝึกหัด วงจรส่งเสียงดนตรีโน้ต โด เร มี ฟา ซอน รา ซี ออกสู่ลำโพง จงต่อวงจรมอเตอร์ ดีซี ขนาดแรงดัน 24 V จำนวน 2 ตัว พร้อมเขียนโปรแกรมให้หมุนทั้งสองทิศทาง จงต่อวงจร LED 4 ดวงกระพริบ ทุก 1 วินาที สลับเรียงกัน 4 ดวง วงจรส่งเสียงดนตรีโน้ต โด เร มี ฟา ซอน รา ซี ออกสู่ลำโพง วงจรรับค่าทางสวิตช์ 1 ตัว เมื่อกดแล้ว หลอด LED ติด พร้อมเสียงบีบดัง 1 ครั้ง