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 ณัฐวุฒิ มณีวรรณ์ 615

ณัฐวุฒิ มณีวรรณ์ 615

Published by Nattawut Maneewan, 2021-03-11 02:02:08

Description: ณัฐวุฒิ มณีวรรณ์ 615

Search

Read the Text Version

ใบงานที่ 4.15 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์  197 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 R2,R3 A5 28 P10otkentiometer 1k USB to UART (TTL Level) 3 2 D1(TXD) DTR 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.15-4 วงจรท่ีใชไ้ อซี AVR ในการทดลอง

รูปท่ี 4.15-7 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน รูปที่ 4.15-6 การตอ่ ลงบอร์ดทดลอง AB C DE F GH I J รูปที่ 4.15-5 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง VCC กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป 198  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การต่อวงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง 5V D11 3V3 D10 REF D9 A0 D8 5 5 A1 D7 A2 D6 A3 D5 A4 D4 A5 D3 10 10 A6 D2 A7 5V GND RST RST GND 15 VIN D0 D1 15 20 20 D9 GND ARDUINO 25 25 A5 30 30 35 35 VCC Signal 40 40 VCC VCC GND 1P0otkentiometer 45 45 RC Servo Motor 50 50 55 55 60 60 AB C DE F GH I J

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

200  เรียนรู้และลองเล่น 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.15-8 ลกั ษณะของคนั โยก รูปท่ี 4.15-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.15-10 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง

ใบงานที่ 4.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  201 ใบงานท่ี 4.16 การเขยี นโปรแกรมใช้งานอนิ เตอร์รัพท์ 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. สรุปผลการปฏิบตั ิงาน

202  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การขดั จงั หวะการทางานหรือเรียกทบั ศพั ทว์ า่ การอินเตอร์รัพต์ (Interrupt) เป็นการขดั จงั หวะการ ทางานปกติ (ประมวลผลในโปรแกรมหลกั ) ของไมโครคอนโทรลเลอร์โดยจะกระโดดไปทางานใน โปรแกรมตอบสนองการอินเตอร์รัพท์ในตาแหน่งท่ีตอบสนองการอินเตอร์รัพท์ (Interrupt Vector) ชนิด น้นั ๆ เมื่อทางานในโปรแกรมตอบสนองการอินเตอร์รัพท์เสร็จสิ้นซีพียูจะกระโดดกลบั มาทางานใน ตาแหน่งเดิมของโปรแกรมหลกั ต่อไป ไมโครคอนโทรลเลอร์ในทุกตระกูลจะมีอินเตอร์รัพท์ที่ไม่ สามารถปฏิเสธได้ 1 ชนิดไดแ้ ก่ Reset กล่าวคือเมื่อซีพียไู ดร้ ับสญั ญาณอินเตอร์รัพทช์ นิดน้ีไม่วา่ จะทางาน ในคาสั่งใดอยูก่ ็ตามจะตอ้ งกลบั ไปทางานในตาแหน่ง 0x0000 ซ่ึงเป็ นตาแหน่งแรกของโปรแกรม บอร์ด Arduino ในรุ่นที่ใชไ้ มโครคอนโทรลเลอร์ตระกูล AVR เบอร์ Atmega328 สามารถอินเตอร์รัพท์ไดจ้ าก หลายแหล่งโดยแตล่ ะแหล่งมีตาแหน่งตอบสนองการอินเตอร์รัพทท์ ี่แตกตา่ งกนั ไปดงั ตารางที่ 4.16-1 ตารางท่ี 4.16-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.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  203 ใบงานน้ีเป็นการเรียนรู้การอินเตอร์รัพทท์ ่ีรับการกระตุน้ จากสัญญาณภายนอกซ่ึงสามารถรับการ อินเตอร์รัพทไ์ ด้ 2 แหล่งคือ INT0 (ขา D2) และ INT1 (ขา D3) เนื่องจากใบงานใช้ Arduino รุ่น Nano ใน การทดลอง แต่สาหรับบอร์ด Arduino ในรุ่นอื่น ๆ สามารถรับสัญญาณอินเตอร์รัพทจ์ ากขาที่แตกต่างกนั ดงั ตารางที่ 4.16-2 ตารางที่ 4.16-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.16-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.16-1 จะทาให้เกิดสัญญาณรบกวนได้ สัญญาณรบกวนน้ีเรียกวา่ สัญญาณกระเดง้ กระดอนหรือ เรียกทบั ศพั ทว์ า่ สัญญาณเบาส์ (Bouncing signal) ซ่ึงการกดเพยี งหน่ึงคร้ังจะเกิดสัญญาณรบกวนข้ึนทาให้ ไมโครคอนโทรลเลอร์ท่ีทางานดว้ ยความเร็วสูงเขา้ ใจว่ากดหลายคร้ังส่งผลทาให้เกิดการประมวลผลที่ คลาดเคลื่อนไป ดงั น้นั เม่ือใชง้ านจริงสามารถใชว้ ธิ ีการแกไ้ ด้ 2 แบบคือ 1. แก้ด้วยฮาร์ดแวร์ โดยการตอ่ ตวั เก็บประจุคร่อมสวติ ชด์ งั รูปท่ี 4.16-2 2. แก้ด้วยซอฟท์แวร์ โดยการหน่วงเวลาเม่ือไดร้ ับสัญญาณไปช่วงเวลาหน่ึงแลว้ ตรวจสอบอีกคร้ัง VCC Switch contacts bouncing R 10k 5V VOUT SW 0V closed open Switch position รูปที่ 4.16-1 วงจรสวติ ช์ทว่ั ไป

204  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] VCC Switch contacts debouncing R 10k 5V 0V VOUT SW C closed open Switch position รูปท่ี 4.16-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.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  205 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 เพื่อให้ค่าท่ีนาไปใช้งาน

206  เรียนรู้และลองเลน่ 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.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  207 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.16-3 วงจรท่ีใชไ้ อซี AVR ในการทดลอง

208  เรียนรู้และลองเลน่ 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.16-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.16-5 การต่อลงบอร์ดทดลอง การตอ่ วงจรเพื่อทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.16-6 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน

ใบงานที่ 4.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  209 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

210  เรียนรู้และลองเลน่ 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.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  211 11 void loop() 12 { 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.16-7 (a) และ (b) สังเกตผลท่ีเกิดข้ึน R221,0 Rx22 SW1 2R21,0 Rx22 SW1 SW2 SW2 (INT0)D2 (INT0)D2 (INT1)D3 (INT1)D3 C1, C2 1uF 16V (a) (b) รูปท่ี 4.16-7 วงจรแกส้ ญั ญาณรบกวน

212  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองที่ 3 เขียนโปรแกรมรับสวิตช์ 2 ตวั สาหรับเพ่ิมลดตวั เลขพร้อมแสดงค่าท่ีจอคอมพิวเตอร์ ตลอดเวลาที่โปรแกรมทางานให้ LED สวา่ งติดดบั สลบั กนั ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง กลบั ส านะ LED หน่วงเวลา Interrupt SW1 Interrupt SW2 เท็จ ตัวแปรน้อยกว่า 99? จริง เท็จ ตัวแปรมากกว่า 0? จริง ให้ตัวแปร=0 เพ่ิมคา่ ตัวแปร ให้ตวั แปร=99 ลดค่าตัวแปร END END แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 12 2 #define interruptPin1 2 3 #define interruptPin2 3 4 volatile int num =0; 5 void setup(){ 6 pinMode(LED, OUTPUT); 7 pinMode(interruptPin1, INPUT_PULLUP); 8 pinMode(interruptPin2, INPUT_PULLUP); 9 attachInterrupt(digitalPinToInterrupt(interruptPin1), increment, FALLING); 10 attachInterrupt(digitalPinToInterrupt(interruptPin2), decrement, FALLING); 11 Serial.begin(9600); 12 } 13 void loop(){ 14 Serial.println(num); 15 digitalWrite(LED, !digitalRead(LED)); 16 delay(250); 17 } 18 void increment(){ 19 (num<99)? num++:num=0; 20 } 21 void decrement(){ 22 (num>0)? num--:num=99; 23 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-3 กาหนดช่ือแทนขาท่ีใชเ้ ชื่อมตอ่ - บรรทดั ท่ี 2 กาหนดช่ือ interruptPin ใหแ้ ทน 2 (เป็นขาที่สวติ ชต์ ่ออยกู่ บั ขา D2 ของ Arduino) - บรรทัดที่ 9-10 เปิ ดการอินเตอร์รัพทภ์ ายนอกใหต้ อบสนองเม่ือกดสวิตช์โดยฟังก์ชน่ั ตอบสนอง คือ increment และ decrement - บรรทดั ที่ 13-17 วนลูปแสดงคา่ ตวั แปรพร้อมส่ัง LED ติดดบั สลบั กนั

ใบงานท่ี 4.16 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์  213 - บรรทดั ที่ 18-20 ฟังกช์ น่ั ตอบสนองอินเตอร์รัพทโ์ ดยการเพ่ิมตวั แปรเม่ือมีการกดสวิตช์ - บรรทดั ท่ี 21-23 ฟังกช์ น่ั ตอบสนองอินเตอร์รัพทโ์ ดยการลดตวั แปรเมื่อมีการกดสวติ ช์ โค้ดโปรแกรมฟังก์ชั่น if-else แบบปกติ โค้ดโปรแกรมฟังก์ช่ัน if-else แบบย่อ if (num<99){ (num<99)? num++:num=0; num++; } Else{ num=0; } ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองกดสวติ ช์แลว้ สังเกตดูผลของค่าตวั แปรที่เกิดข้ึนบนจอคอมพิวเตอร์ 4. ทดลองเปลี่ยนรูปแบบของลกั ษณะสัญญาณอินเตอร์รัพทเ์ ป็น LOW, CHANGE, RISING, FALLING 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมไฟว่ิง LED 4 ตัวโดยกาหนดรูปแบบการติด/ดับตามต้องการพร้อมให้ สามารถรับการอินเตอร์รัพทไ์ ด้ โดยเม่ือกดสวิตช์ SW1 ให้ LED ทุกตวั ดบั หมดและเม่ือกด สวติ ช์ SW2 ให้ LED ทุกตวั ติดสวา่ งท้งั หมดวงจรที่ใชท้ ดลองดงั รูป ARDUINO R1-R3 LED1-LED3 D9 220 D10 D11 D12 VCC (INT0)D2 Internal pull up (INT1)D3 R4-R5 SW1 220 x2 SW2 GND 1C1uF-216V รูปที่ 4.16-8 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

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

ใบงานที่ 4.17 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  215 ใบงานท่ี 4.17 การเขยี นโปรแกรมใช้งานหน่วยความจา 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. สรุปผลการปฏิบตั ิงาน

216  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน EEPROM (Electrically Erasable Programmable Read-Only Memory) หรือ E2PROM สาหรับ การออกเสียงสามารถเรี ยกได้หลายแบบได้แก่ อีอีพรอม ดับเบิลอีพรอม หรื ออีสแควร์พรอม หน่วยความจาชนิดน้ีเป็ นหน่วยความจาประเภทก่ึงถาวรกล่าวคือเป็ นหน่วยความจาที่สามารถเขียนและ ลบได้โดยใช้แรงดันไฟฟ้าปกติได้และข้อมูลที่บรรจุอยู่ภายในสามารถคงค่าอยู่ได้ในสภาพที่ไม่มี ไฟเล้ียงวงจร (non-volatile memory) หน่วยความจาชนิดน้ีมีอายุการใช้งานจากดั ตามวงรอบของการ เขียนขอ้ มูล ดงั น้นั การใชง้ านจึงใช้เก็บขอ้ มูลท่ีจาเป็ นที่ตอ้ งคงค่าน้นั เพื่อนามาใช้งานใหม่ไดใ้ นกรณีที่ หยดุ จา่ ยไฟใหก้ บั วงจร เช่นการต้งั คา่ โหมดการทางาน การต้งั ค่าสูงสุดต่าสุด การต้งั เวลาทางานของวงจร เป็นตน้ บอร์ด Arduino ในแตล่ ะรุ่นมีการใชซ้ ีพยี แู ตกตา่ งกนั ซ่ึงซีพยี แู ตล่ ะเบอร์มีหน่วยความจาชนิดน้ีท่ีมี ขนาดแตกต่างกนั ดงั ตาราง 4.17-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 คร้ัง

ใบงานท่ี 4.17 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  217 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 delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 5. ฟังก์ชั่นกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการส่ือสารผา่ นพอร์ตอนุกรม

218  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต เป็ นฟังก์ชนั่ ที่ใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พมิ พข์ อ้ มูลออกทางพอร์ตเพ่ือแสดงผลที่จอคอมพิวเตอร์เมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ที่ทา้ ยสิ่งท่ีพิมพน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 7. ฟังก์ชั่นส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชน่ั Serial.print ต่างกนั ตรงที่เม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเม่ือสั่งพิมพค์ ร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยู่ท่ี บรรทดั ใหม่ แทนท่ีจะต่อทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val) Serial.println(val, format) ฟังก์ชั่นใช้งานหน่วยความจา EEPROM การใช้งานหน่วยความจา EEPROM จาเป็ นตอ้ งใช้ไลบราร่ีช่วยงาน ซ่ึงไลบรารี่มีมาพร้อมกบั โปรแกรม Arduino IDE แลว้ ไมต่ อ้ งติดต้งั ใหม่ ไลบรารี่ แหล่งดาวน์โหลด EEPROM.h ไม่ตอ้ งดาวนโ์ หลดเนื่องจากมาพร้อมกบั Arduino IDE Arduino เตรียมฟังกช์ นั่ เก่ียวกบั หน่วยความจา EEPROM ใหใ้ ชง้ านหลกั ๆ ดงั น้ี - read() อา่ นค่าจากหน่วยความจาขนาด 1 ไบตใ์ นแอดแดรสที่กาหนด - write() เขียนคา่ ลงหน่วยความจาขนาด 1 ไบตใ์ นแอดแดรสที่กาหนด - update() เขียนคา่ ลงหน่วยความจาเฉพาะขอ้ มูลที่เป็นค่าใหม่ - get() อา่ นคา่ จากหน่วยความจาตามขนาดตวั แปรในแอดแดรสท่ีกาหนด - put() เขียนค่าลงหน่วยความจาตามขนาดตวั แปรในแอดแดรสที่กาหนด 1. ฟังก์ชั่นอ่านข้อมูลขนาด 1 ไบต์ เป็ นฟังกช์ นั่ ที่อ่านขอ้ มูลคร้ังละ 1 ไบตต์ ามแอดเดรสท่ีระบุ โดยขอ้ มูลท่ีอา่ นไดจ้ ะมีคา่ อยรู่ ะหวา่ ง 0-255 ในเลขฐานสิบ รูปแบบเป็นดงั น้ี .read(address); address: หมายเลขตาแหน่งของหน่วยความจาที่ตอ้ งการอ่านคา่ 2. ฟังก์ช่ันเขยี นข้อมูลขนาด 1 ไบต์ เป็นฟังกช์ น่ั ที่บนั ทึกขอ้ มูลขนาด 1 ไบตล์ งในหน่วยความจา EEPROM ในตาแหน่งที่ระบุ รูปแบบดงั น้ี .write(address, value); address: หมายเลขตาแหน่งของหน่วยความจาท่ีตอ้ งการบนั ทึก value: ค่าท่ีตอ้ งการบนั ทึกลงหน่วยความจามีคา่ ระหวา่ ง 0-255

ใบงานที่ 4.17 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  219 3. ฟังก์ชั่นบันทกึ ข้อมูลขนาด 1 ไบต์เฉพาะค่าทีเ่ ปลย่ี นแปลง เป็ นฟังกช์ นั่ ที่บนั ทึกขอ้ มูลขนาด 1 ไบต์ลงในหน่วยความจา EEPROM ในตาแหน่งที่ระบุโดยฟังก์ชน่ั น้ีจะตรวจสอบว่าค่าท่ี ตอ้ งการบนั ทึกเป็ นค่าท่ีไม่ตรงกบั ค่าที่มีอยูเ่ ดิมทาใหล้ ดจานวนวงรอบการเขียนขอ้ มูลทาให้ อายกุ ารใชง้ านยาวนานข้ึน รูปแบบดงั น้ี .update(address, value); address: หมายเลขตาแหน่งของหน่วยความจาท่ีตอ้ งการบนั ทึก value: ค่าท่ีตอ้ งการบนั ทึกลงหน่วยความจามีคา่ ระหวา่ ง 0-255 4. ฟังก์ชั่นอ่านข้อมูลตามขนาดตัวแปรในตาแหน่งทร่ี ะบุ รูปแบบเป็นดงั น้ี .get(address, data); address: หมายเลขตาแหน่งของหน่วยความจาท่ีตอ้ งการอา่ นค่า data: ตวั แปรที่ตอ้ งการเก็บค่าท่ีไดจ้ ากการอา่ น 5. ฟังก์ชั่นบนั ทกึ ข้อมูลตามขนาดตัวแปรในตาแหน่งทร่ี ะบุ รูปแบบเป็นดงั น้ี .put(address, data); address: หมายเลขตาแหน่งของหน่วยความจาที่ตอ้ งการบนั ทึก data: ตวั แปรที่ตอ้ งการบนั ทึกค่าลงหน่วยความจา 7. วงจรทใ่ี ช้ทดลอง วงจรเพ่ือใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป R1 LED1 220 D9 VCC D5 Internal pull up D4 (INT1)D3 R2-R4 SW1 (INT0)D2 220 x2 GND SW2 SW3 SW4 C1-C2 1uF 16V รูปที่ 4.17-1 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

220  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1N15819 VCC Peripheral circuit R1 CPU circuit 10k 7,20 ATMEGA328 SW1 VCC R4 LED1 220 1 RST AVCC D9 15 C1 0.1uF USB to UART (TTL Level) R2,R3 3 D1(TXD) D5 11 VCC 1k 2 D0(RXD) D4 6 Internal pull up DTR 2R290-Rx122 SW2 RXD X1 SW3 TXD 16MHz SW4 +5V C2,C3 SW5 GND 22pF 3V3 C4-C5 1uF 16V (INT1)D3 5 (INT0)D2 4 9 XTAL1 10 XTAL2 GND 8,22 รูปที่ 4.17-2 วงจรท่ีใชไ้ อซี AVR ในการทดลอง การต่อวงจรไมโครคอนโทรลเลอร์ 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.17-3 การตอ่ ลงบอร์ดทดลอง การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.17-4 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน

ใบงานที่ 4.17 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  221 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองท่ี 1 เขียนโปรแกรมอ่านค่าขอ้ มูลจากหน่วยความจา EEPROM แอดเดรส 0-20 พร้อมท้งั เขียน ขอ้ มูลเขา้ ไปใหม่โดยใชส้ วติ ช์ 2 ตวั ในการต้งั คา่ ขอ้ มูลแลว้ ใชส้ วติ ช์ตวั ท่ี 3 บนั ทึกขอ้ มูล ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START START กาหนดค่าเริ่มต้นต่าง บันทึกค่าข้อมูลลง EEPROM อ่านคา่ ข้อมูลจาก EEPROM เพ่ิมคา่ แอดเดรส 1 ค่า SW1 กู กด? จริง เพิม่ คา่ ข้อมลู STOP จริง ลดค่าขอ้ มลู เทจ็ ฟังกช์ ัน่ ตอบสนองการอนิ เตอร์รพั ท์ SW2 กู กด? เท็จ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <EEPROM.h> 2 #define interruptPin 2 3 #define IncValue 3 4 #define DecValue 4 5 volatile byte value; 6 volatile byte addr=0; 7 void setup() 8{ 9 Serial.begin(9600); 10 pinMode(IncValue, INPUT_PULLUP); 11 pinMode(DecValue, INPUT_PULLUP); 12 pinMode(interruptPin, INPUT_PULLUP); 13 attachInterrupt(digitalPinToInterrupt(interruptPin), mem2eeprom, FALLING); 14 for(int i=0;i<=10;i++) 15 { 16 value = EEPROM.read(i); 17 Serial.print(i); 18 Serial.print(\"--->\"); 19 Serial.print(value); 20 Serial.println(); 21 delay(100); 22 } 23 } 24 void loop() 25 { 26 if(digitalRead(IncValue)==LOW) 27 { 28 value++; 29 Serial.print(\"Data change to :\");Serial.println(value); 30 } 31 else if(digitalRead(DecValue)==LOW) 32 { 33 value--; 34 Serial.print(\"Data change to :\");Serial.println(value); 35 } 36 delay(150); 37 }

222  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 38 void mem2eeprom() 39 { 40 EEPROM.write(addr,value); 41 Serial.print(\"Write data \");Serial.print(value); 42 Serial.print(\" to EEPROM address \");Serial.println(addr); 43 addr++; 44 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ EEPROM.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 กาหนดชื่อ interruptPin ใหแ้ ทน 2 (เป็นขาที่สวติ ช์ต่ออยกู่ บั ขา D2 ของ Arduino) - บรรทดั ที่ 3 กาหนดชื่อ IncValue ใหแ้ ทน 3 (เป็นขาที่สวติ ช์ต่ออยกู่ บั ขา D3 ของ Arduino) - บรรทดั ที่ 4 กาหนดช่ือ DecValue ใหแ้ ทน 4 (เป็นขาที่สวติ ช์ต่ออยกู่ บั ขา D4 ของ Arduino) - บรรทดั ท่ี 5 ประกาศตวั แปรสาหรับเก็บขอ้ มูลของหน่วยความจา EEPROM - บรรทดั ท่ี 6 ประกาศตวั แปรสาหรับเกบ็ แอดเดรสของหน่วยความจา EEPROM - บรรทดั ที่ 9 กาหนดความเร็วในการส่ือสารผา่ นพอร์ตอนุกรมที่ 9600 bps - บรรทดั ที่ 10-12 กาหนดโหมดใหก้ บั ขาพอร์ตที่ต่อกบั สวติ ชท์ างานเป็ นอินพุทพอร์ต - บรรทดั ที่ 13 ประกาศใชง้ านอินเตอร์รัพทจ์ ากขา D2(INT0) - บรรทดั ที่ 14-22 อ่านขอ้ มูลจากหน่วยความจา EEPROM แอดเดรส 0 ถึงแอดเดรสท่ี 10 แลว้ นา ค่าท่ีอา่ นไดม้ าแสดงผลหนา้ จอคอมพิวเตอร์ - บรรทัดที่ 26-30 ตรวจสอบถ้าสวิตช์ IncValue ถูกกดให้ทาการเพิ่มค่าตวั แปร value ข้ึน 1 ค่า พร้อมแสดงผลหนา้ จอคอมพิวเตอร์ - บรรทดั ท่ี 31-35 ตรวจสอบถา้ สวติ ช์ DecValue ถูกกดใหท้ าการลดคา่ ตวั แปร value ลง 1 คา่ พร้อม แสดงผลหนา้ จอคอมพิวเตอร์ - บรรทัดท่ี 38-44 ฟังก์ชน่ั ตอบสนองการอินเตอร์รัพท์ทาหน้าที่บนั ทึกค่าจากตวั แปร value ลง หน่วยความจา EEPROM ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus เมื่อทาการจาลองการทางานท่ีมีการบนั ทึกขอ้ มูลลง หน่วยความจา EEPROM แลว้ กดหยดุ การจาลองขอ้ มูลที่เคยบนั ทึกลงหน่วยความจาจะยงั คง อยู่ ดงั น้นั เมื่อทาการจาลองใหม่ท่ีมีการอ่านขอ้ มูลจากหน่วยความจา EEPROM จะเป็นขอ้ มูล ท่ีไดถ้ ูกบนั ทึกไวจ้ ากการจาลองคร้ังที่ผา่ นมา และถา้ หากตอ้ งการลา้ งขอ้ มูลใน EEPROM ให้ ดูเหมือนวา่ เป็ นการทดลองคร้ังแรกในซีพยี ใู หมส่ ามารถลา้ งขอ้ มูลใน EEPROM ไดโ้ ดยการ คลิกท่ี Reset Persistent Model data ดงั รูปท่ี 4.17-5 2. ทดลองดว้ ยวงจรจริง 3. สงั เกตผลท่ีเกิดข้ึนจากการบนั ทึกขอ้ มูลลงในหน่วยความจา EEPROM

ใบงานที่ 4.17 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM  223 รูปท่ี 4.17-5 การลา้ งขอ้ มูลที่ถูกบนั ทึกไวใ้ น EEPROM ของซีพยี ู 9. สรุปผลการปฏบิ ัติงาน 10. งานทมี่ อบหมาย 1. เขียนโปรแกรมอ่านขอ้ มูลจากหน่วยความจา EEPROM ทุกแอดเดรสที่มีขอ้ มูลบนั ทึกอยู่ (ข้อมูลในแอดเดรสที่ไม่ได้ถูกบันทึกจะมีค่าเป็ น 255) และมีการบันทึกค่าใหม่ลง หน่วยความจา EEPROM โดยใช้สวิตช์ SW1, SW2 ในการต้งั ค่า และการบนั ทึกค่าให้ใช้ สวิตช์ SW3 โดยให้ทางานดว้ ยวิธีอินเตอร์รัพท์พร้อมท้งั ให้ LED ติดสวา่ งเมื่อมีการบนั ทึก ขอ้ มูลและดบั เม่ือบนั ทึกขอ้ มูลเสร็จสิ้น (ภายในฟังก์ช่ันตอบสนองอินเตอร์รัพท์ฟังก์ชั่น delay จะไมส่ ามารถใชง้ านไดใ้ หใ้ ชว้ ธิ ีอื่นแทน) R1 LED1 220 D9 VCC D5 Internal pull up D4 (INT1)D3 R2-R4 SW1 (INT0)D2 220 x2 GND SW2 SW3 SW4 C1-C2 1uF 16V รูปท่ี 4.17-6 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

224  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. เขียนโปรแกรมอ่านขอ้ มูลจากหน่วยความจา EEPROM ทุกแอดเดรสท่ีมีขอ้ มูลบนั ทึกอยู่ (ขอ้ มูลในแอดเดรสท่ีไม่ไดถ้ ูกบนั ทึกจะมีค่าเป็ น 255) และมีการบนั ทึกค่าใหมท่ ี่เป็ นตวั แปร ทศนิยม (float) ลงหน่วยความจา EEPROM โดยใชส้ วติ ช์ SW1 ต้งั คา่ เลขที่มากวา่ 0 ใชส้ วติ ช์ SW2 ต้งั ค่าทศนิยมหลกั ท่ี 1 SW3 ต้งั ค่าทศนิยมหลกั ที่ 2 (ใชท้ ศนิยม 2 หลกั ) การบนั ทึกค่า ให้ใช้สวิตช์ SW4 โดยให้ทางานดว้ ยวิธีอินเตอร์รัพทพ์ ร้อมท้งั ให้ LED ติดสวา่ งเมื่อมีการ บนั ทึกขอ้ มูลและดับเม่ือบนั ทึกขอ้ มูลเสร็จสิ้น (ภายในฟังก์ช่ันตอบสนองอินเตอร์รัพท์ ฟังกช์ น่ั delay จะไมส่ ามารถใชง้ านไดใ้ หใ้ ชว้ ธิ ีอ่ืนแทน) R1 LED1 220 D9 VCC D5 Internal pull up D4 (INT1)D3 R2-R4 SW1 (INT0)D2 220 x2 SW2 SW3 SW4 GND C1-C2 1uF 16V รูปที่ 4.17-7 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

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

226  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การใชง้ านสวิตช์ของไมโครคอนโทรลเลอร์ไม่วา่ จะเป็ นในตระกูลใดสามารถใชง้ านไดโ้ ดยการ ต่อเขา้ กบั พอร์ต 1 บิตต่อสวติ ช์ 1 ตวั ซ่ึงการต่อลกั ษณะน้ีเหมาะสาหรับวงจรที่ใชส้ วิตช์จานวนนอ้ ยแต่ถา้ หากตอ้ งการใชง้ านสวิตชจ์ านวนมากจะทาใหเ้ หลือพอร์ตท่ีไปใชง้ านอยา่ งอ่ืนลดลง ตวั อยา่ งเช่นตอ้ งการ ต่อสวติ ช์จานวน 12 ตวั กบั พอร์ตดิจิทลั ของ Arduino UNO หรือ Nano ท่ีมีพอร์ตดิจิทลั ใชง้ านเพียง 14 บิต (หากมีการสื่อสารผา่ นพอร์อนุกรมจะเหลือเพียง 12 ตวั ) จะไมเ่ หลือพอร์ตเอาไปใชง้ านอื่นไดเ้ ลยดงั รูป D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 1 2 3 4 5 6 7 8 9 0 *# รูปท่ี 4.18-1 การต่อสวติ ช์แบบทวั่ ไปกบั พอร์ตดิจิทลั วิธีการลดขนาดของพอร์ตใช้งานโดยสามารถต่อสวิตช์ได้จานวนมากคือการต่อสวิตช์แบบ เมตริกเช่นตอ้ งการต่อสวิตช์จานวน 16 ตวั สามารถจดั วางแบบ 4×4 ซ่ึงใชพ้ อร์ตเพียง 8 บิตหรือตอ้ งการ ต่อสวิตช์จานวน 12 ตวั สามารถจดั วางแบบ 3×4 ซ่ึงใชพ้ อร์ตเพียง 7 บิตทาให้ลดขนาดของพอร์ตใชง้ าน ไดก้ ารต่อสวติ ชเ์ ป็นดงั รูป 4.18-2 D12 1 123 row pinouts D11 2 456 D10 3 789 D9 4 * 0# 567 D8 D7 D6 column pinouts รูปท่ี 4.18-2 การตอ่ สวติ ช์ 12 ตวั ต่อแบบเมตริก 3×4 การใช้งานจะตอ้ งเขียนโปรแกรมให้พอร์ตด้านใดด้านหน่ึงเป็ นอินพุตพอร์ตส่วนอีกดา้ นเป็ น เอาตพ์ ุต โดยวธิ ีเขียนโปรแกรมตรวจสอบการกดคียใ์ ชว้ ธิ ีการสัง่ ให้พอร์ตที่เชื่อมต่อเป็ นสวิตช์ดา้ นท่ีเป็น เอาตพ์ ุตให้มีค่าลอจิก 0 (เสมือนต่อลงกราวด์) ช่วงเวลาละ 1 บิตแลว้ ตรวจสอบการกดสวิตช์จากพอร์ตท่ี เชื่อมตอ่ ดา้ นที่เป็นอินพุตวา่ มีการเปล่ียนแปลงในบิตใดตรงกบั หมายเลยสวติ ชใ์ ดดงั รูป 4.18-3

ใบงานท่ี 4.18 การเขียนโปรแกรมใชง้ านคียแ์ พด  227 01 123 11 123 11 123 12Logic to Input Port 02 12 456 Logic to Input Port Logic to Input Port 456 456 13 789 13 789 03 789 14 * 0# 14 * 0# 14 * 0# 567 567 567 Logic0 from Ou1tput Port1 Logic0 from Ou1tput Port1 Logic0 from Ou1tput Port1 รูปที่ 4.18-3 ตวั อยา่ งค่าท่ีอา่ นไดจ้ ากการกดสวติ ช์เมื่อใหข้ า 5 เป็นลอจิก 0 ตารางที่ 4.18-1 คา่ ท่ีอ่านไดจ้ ากการกดสวติ ชใ์ นแตล่ ะตวั คา่ ท่ีส่งออกพอร์ตเอาตพ์ ุตไป เม่ือกดสวติ ช์หมายเลข คา่ ที่รับไดจ้ ากพอร์ตอินพุต ยงั สวติ ช์ดา้ น Colum ขา 5,6,7 ที่ตอ่ ดา้ น Row ขา 1,2,3,4 1 0111 011 4 1011 7 1101 * 1110 2 0111 101 5 1011 8 1101 0 1110 3 0111 110 6 1011 9 1101 # 1110 ปัจจุบนั มีคียแ์ พดสาเร็จรูปมาให้ใชง้ านโดยผใู้ ชง้ านไม่ตอ้ งออกแบบวงจรเองทาให้สะดวกมาก ยิ่งข้ึน คียแ์ พดท่ีนิยมนามาใชง้ านมีการจดั เรียงขาโดย 4 ขาแรกเป็ นดา้ น Row อีก 3 ขาที่เหลือเป็ นด้าน Colum ดงั รูป 4.18-4 123 123 456 456 789 789 * 0# * 0# 1234 567 17 รูปที่ 4.18-4 คียแ์ พดขนาด 3×4 และการจดั เรียงขา

228  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การเขียนโคด้ โปรแกรมเพือ่ อ่านค่าจากสวิตช์คียแ์ พดปัจจุบนั มีไลบราร่ีช่วยงานทาใหผ้ เู้ ขียนโคด้ สามารถเขียนโคด้ ไดง้ ่ายข้ึนสามารถดาวนโ์ หลดไดท้ ี่ ไลบราร่ี แหล่งดาวน์โหลด Keypad.h https://github.com/Chris--A/Keypad มีข้นั ตอนการดาเนินการเพื่อนาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวน์โหลดไลบราร่ีซ่ึงเป็นไฟล์ Zip ดงั รูป รูปท่ี 4.18-5 การดาวน์โหลดไลบราร่ี 2. ทาการเพิม่ ไลบรารี่ท้งั 2 ลงในโปรแกรม Arduino IDE โดยการเพ่มิ จากไฟล์ zip แลว้ ทาการหา ไฟล์ zip ที่ไดจ้ ากการดาวน์โหลดในขอ้ 1 และ 2 รูปที่ 4.18-6 การเพิม่ ไลบราร่ีที่เป็นไฟล์ zip ลงในโปรแกรม Arduino IDE 6. ฟังก์ช่ัน Arduino ทใี่ ช้ในใบงาน 1. ฟังก์ช่ันกาหนดโหมดการทางานให้กับขาพอร์ตโดยสามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่ เพียงตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกที่ตอ้ งการให้ทางานในโหมดดิจิทลั แต่ การใส่ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไมส่ ามารถใช้ งานในโหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP

ใบงานที่ 4.18 การเขียนโปรแกรมใชง้ านคียแ์ พด  229 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. ฟังก์ชั่นกาหนดความเร็วในการสื่อสารทางพอร์ตอนุกรม เพื่อให้สามารถสื่อสารระหวา่ ง อุปกรณ์ท้งั สองฝ่ังไดจ้ ะตอ้ งกาหนดอตั ราเร็วในการสื่อสารหรือเรียกว่าอตั ราบอด (Baud rate) ค่าความเร็วน้ีมีหน่วยเป็ นบิตต่อวินาที (bps: bit per second) ค่าความเร็วน้ีไดแ้ ก่ 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, หรือ 115200 Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม 5. ฟังก์ชั่นส่งข้อมูลออกพอร์ต เป็นฟังกช์ น่ั ท่ีใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรืออาจ เรียกวา่ ฟังก์ชน่ั พิมพข์ อ้ มูลออกทางพอร์ตเพื่อแสดงผลท่ีจอคอมพิวเตอร์ท่ีเช่ือมต่อกบั วงจร Arduino โดยฟังกช์ นั่ น้ีเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยทู่ ี่ทา้ ยส่ิงที่พมิ พน์ ้นั ๆ Serial.print(val) Serial.print(val, format) 6. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ชน่ั Serial.print ต่างกนั ตรงที่เม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้ันเมื่อส่ังพิมพค์ ร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยู่ที่ บรรทดั ใหม่ แทนที่จะตอ่ ทา้ ยเหมือนกบั ฟังกช์ นั่ Serial.print Serial.println(val) Serial.println(val, format)

230  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ฟังก์ช่ันใช้งานของไลบราร่ี Keypad การอ่านคา่ จากสวติ ช์ Keypad หากใชไ้ ลบราร่ีช่วยงานจะทาใหก้ ารเขียนโคด้ ง่ายข้ึนเป็ นอยา่ งมาก ซ่ึงไลบราร่ีไม่ไดถ้ ูกเพิ่มเขา้ มาในตวั โปรแกรม Arduino IDE ต้งั แต่แรกจาเป็ นตอ้ งติดต้งั เพ่ิมเติม โดยมี การต้งั ค่าและฟังกช์ นั่ ใหใ้ ชง้ านดงั น้ี 1. การกาหนดขนาดของสวิตช์คีย์แพด ไลบรารี่เลือกใชว้ ิธีการกาหนดขนาดคียแ์ พดที่ใชง้ าน ดว้ ยวธิ ีประกาศตวั แปร ยกตวั อยา่ งเช่นตอ้ งการใชค้ ียแ์ พดขนาด 3×4 การกาหนดขนาดเป็ น ดงั น้ี const byte ROWS = 4; //four rows const byte COLS = 3; //three columns 2. การกาหนดค่าทไ่ี ด้เม่ือกดคีย์ตาแหน่งต่าง ๆ รูปแบบเป็นดงั น้ี char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; 3. การกาหนดขาพอร์ตทเ่ี ช่ือมต่อกบั คีย์แพด รูปแบบเป็นดงั น้ี byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad 4. การกาหนดค่าเร่ิมใช้งาน รูปแบบเป็นดงั น้ี Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 5. ฟังก์ชั่นอ่านค่าการกดสวติ ช์คยี ์แพด เป็นฟังกช์ น่ั ท่ีใชอ้ า่ นคา่ การกดสวติ ช์คียแ์ พดโดยค่าที่ได้ จากฟังกช์ น่ั จะมีค่าเป็ น 0 เม่ือไม่มีการกดคียใ์ ด ๆ แต่ถา้ หากมีการกดคียใ์ นตาแหน่งใดจะให้ คา่ ไดจ้ ากการกาหนดคา่ ในตวั แปร char keys[ROWS][COLS] ขา้ งตน้ ท่ีไดก้ ล่าวมาแลว้ .getKey();

ใบงานท่ี 4.18 การเขียนโปรแกรมใชง้ านคียแ์ พด  231 7. วงจรทใี่ ช้ทดลอง วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 SW1 VCC 123 456 1 RST AVCC 789 * 0# C1 0.1uF USB to UART (TTL Level) R2,R3 3 D12 18 1k 2 D11 17 DTR D10 16 RXD D1(TXD) TXD D0(RXD) D9 15 +5V D8 14 GND D7 13 3V3 D6 12 X1 9 XTAL1 R4 LED1 16MHz 10 XTAL2 220 GND D5 11 C2,C3 8,22 22pF รูปที่ 4.18-7 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO D12 123 D11 456 D10 789 * 0# D9 D8 R1 LED1 D7 220 D6 D5 GND รูปที่ 4.18-8 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง

232  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]F GH I J20 2025 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 D10 รูปท่ี 4.18-9 การตอ่ ลงบอร์ดทดลองD9 การตอ่ วงจรเพื่อทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD8 5 D7 รูปที่ 4.18-10 การต่อวงจรทดลองในโปรแกรมจาลองการทางานD6 D5 8. การเขยี นโค้ดโปรแกรมควบคุม D4 D3 10 การทดลองท่ี 1 เขียนโปรแกรมอ่านค่าขอ้ มูลจากหน่วยความจา EEPROM แอดเดรส 0-20 พร้อมท้งั เขียนD2 ขอ้ มูลเขา้ ไปใหม่โดยใชส้ วติ ช์ 2 ตวั ในการต้งั คา่ ขอ้ มูลแลว้ ใชส้ วติ ชต์ วั ท่ี 3 บนั ทึกขอ้ มูล 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.18 การเขียนโปรแกรมใชง้ านคียแ์ พด  233 ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง ๆ อ่านค่าจากคีย์แพด เท็จ มกี ารกดคยี ์? จริง แสดง ลคีย์ท่ี ูกกด สั่ง LED กระพรบิ 1 คร้งั แปลง งั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <Keypad.h> 2 #define LED 5 3 const byte ROWS = 4; //four rows 4 const byte COLS = 3; //three columns 5 char keys[ROWS][COLS] = { 6 {'1','2','3'}, 7 {'4','5','6'}, 8 {'7','8','9'}, 9 {'*','0','#'} 10 }; 11 byte rowPins[ROWS] = {12,11,10,9}; //connect to the row pinouts of keypad 12 byte colPins[COLS] = {8,7,6}; //connect to the column pinouts of keypad 13 Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 14 void setup() 15 { 16 Serial.begin(9600); 17 pinMode(LED,OUTPUT); 18 } 19 void loop() 20 { 21 char key = keypad.getKey(); 22 if (key) 23 { 24 Serial.println(key); 25 digitalWrite(LED,HIGH);delay(200); 26 digitalWrite(LED,LOW); 27 } 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบราร่ี Keypad.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 กาหนดช่ือ LED ใหแ้ ทน 5 (เป็นขา LED ต่ออยกู่ บั ขา D5 ของ Arduino) - บรรทดั ท่ี 3 กาหนดจานวนขาต่อคียแ์ พดดา้ น Row - บรรทดั ที่ 4 กาหนดจานวนขาตอ่ คียแ์ พดดา้ น Colum - บรรทดั ที่ 5 กาหนดคา่ ที่ไดจ้ ากการกดคียแ์ พดในแตล่ ะตาแหน่ง

234  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ท่ี 11 กาหนดขาพอร์ตที่ใชเ้ ชื่อมต่อกบั คียแ์ พดดา้ น Row - บรรทดั ท่ี 12 กาหนดขาพอร์ตท่ีใชเ้ ชื่อมต่อกบั คียแ์ พดดา้ น Colum - บรรทดั ท่ี 13 ประกาศเริ่มใชง้ านไลบรารี่คียแ์ พด - บรรทดั ที่ 16 กาหนดความเร็วในการส่ือสารผา่ นพอร์ตอนุกรมท่ี 9600 bps - บรรทดั ท่ี 17 กาหนดโหมดใหก้ บั ขาพอร์ตท่ีต่อกบั LED ทางานเป็นเอาตพ์ ตุ พอร์ต - บรรทดั ที่ 21 อ่านคา่ การกดคียแ์ พด - บรรทดั ที่ 22 ตรวจสอบถา้ มีการกดคียใ์ ด ๆ ท่ีคียแ์ พด - บรรทดั ที่ 24 แสดงค่าคียท์ ่ีถูดกดบนจอคอมพวิ เตอร์ผา่ นการส่ือสารทางพอร์ตอนุกรม - บรรทดั ที่ 25 สั่งให้ LED ติดสวา่ งเป็นเวลา 200 มิลลิวนิ าที (1/5 วนิ าที) - บรรทดั ท่ี 26 สงั่ ให้ LED ดบั 9. สรุป ลการปฏบิ ตั ิงาน 10. งานทมี่ อบหมาย เขียนโปรแกรมรับค่าจากคียแ์ พดใหเ้ กบ็ ลงในตวั แปรเป็นตวั เลข 2 หลกั (0-99) พร้อมท้งั แสดงผล ค่าตวั แปรผา่ นทางจอคอมพวิ เตอร์ โดยการกดสวติ ช์คร้ังแรกใหต้ วั เลขเป็ นค่าหลกั หน่วยและเมื่อกดคร้ังท่ี สองตวั เลขแรกจะกลายเป็ นเลขหลกั สิบส่วนตวั เลขท่ีกดใหม่จะเป็ นตวั เลขหลกั หน่วยแทนเม่ือกดคร้ังท่ี สามเลขหลกั สิบจะหายไปเลขหลกั หน่วยให้ขยบั เป็ นเลขหลกั สิบและให้ตวั เลขที่กดใหม่เป็ นหลกั หน่วย แทนเวยี นเช่นน้ีไปเร่ือย ๆ วงจรที่ใชท้ ดลองเป็นดงั รูป ARDUINO 123 456 D12 7 8 9 D11 * 0 # D10 D9 D8 D7 D6 R1 LED1 220 D5 GND รูปที่ 4.18-11 วงจรทดลองสาหรับงานที่มอบหมาย

ใบงานที่ 4.19 การเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit  235 ใบงานที่ 4.19 การเขยี นโปรแกรมแสดงผลด้วย 7 Segment 4 Digit 1. จุดประสงค์ทวั่ ไป เพื่อใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพือ่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 2.3 ทรานซิสเตอร์ BC547 4 ตวั 2.4 เซเวน่ เซกเมนต์ LTC4727 1 ตวั 2.1 โพเทนธิโอมิเตอร์ 10k 1 ตวั 1 ตวั 2.2 ตวั ตา้ นทาน 1k 4 ตวั 1 เส้น 1 ชุด 2.3 ตวั ตา้ นทาน 220 ohm 8 ตวั 1 เครื่อง 3. บอร์ด Arduino Nano 3.0 4. สายเช่ือมตอ่ USB (Mini USB) 5. สายเช่ือมต่อวงจร 6. คอมพวิ เตอร์ 4. ลาดับข้นั การปฏบิ ัตงิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

236  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน LED ตวั เลข 7 ส่วน หรือท่ีนิยมเรียกทบั ศพั ทว์ า่ “เซเวน่ เซกเมนต”์ (7-Segment) ประกอบข้ึนดว้ ย LED จานวน 8 ตวั โดยท่ี LED จานวน 7 ตวั ถูกจดั วางใหส้ ามารถแสดงเป็นตวั เลขตา่ ง ๆ ไดแ้ ละอีกหน่ึงตวั ถูกจดั วางใหแ้ สดงเป็ นจุดทศนิยม LED ท่ีตอ่ อยภู่ ายในตวั ถงั ทุกตวั จะมีขาต่อร่วมกนั เรียกวา่ ขาคอมมอน (Common) โดยมี 2 แบบคือ 1. ตอ่ ขาแคโทดร่วมกนั เรียกวา่ คอมมอนแคโทด (Common cathode) 2. ต่อขาแอโนดร่วมกนั เรียกวา่ คอมมอนแอโนด (Common anode) ตวั แสดงผลตวั เลข 7 ส่วนมีลกั ษณะการต่อภายในดงั รูป common common a b c d e f g dp a b c d e f g dp (a) (b) รูปที่ 4.19-1 โครงสร้างภายในของ LED 7 Segment (a) แบบแอโนดร่วม (b) แบบแคโทดร่วม เมื่อจดั วางให้สามารถแสดงผลเป็ นตวั เลขไดโ้ ดยการกาหนดการติดดบั ของ LED ในแต่ละส่วน ซ่ึงแต่ละส่วนของตวั เลขถูกกาหนดช่ือเรียกเร่ิมจาก a ท่ีอยูด่ า้ นบนสุดไล่เรียงตามเข็มนาฬิกาไปจนถึง g เป็นเซกเมนต์ และ LED ตวั สุดทา้ ยไมไ่ ดแ้ สดงเป็นตวั เลขแต่จะแสดงผลเป็นจุดทศนิยมแทน ดงั รูป 10 9 8 7 6 10 9 8 7 6 a f gb ec d dp 12345 12345 รูปท่ี 4.19-2 ชื่อเรียกของส่วนต่าง ๆ และตาแหน่งการจดั ขาของ LED 7 Segment แบบเดี่ยวและคู่ 10 5 digit 1 digit 2 digit 1 digit 2 a b c d e f g dp a b c d e f g dp 3 9 8 6 7 4 1 2 (a) (b) รูปที่ 4.19-3 (a) โครงสร้างภายในของเซเวน่ เซกเมนตเ์ บอร์ TOD-3261AG-B (b) ตาแหน่งหลกั (digit)

ใบงานที่ 4.19 การเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit  237 Digit 1 Digit 2 Digit 3 Digit 4 1 2 6 8 A B C D E F G DP A B C D E F G DP A B C D E F G DP A B C D E F G DP 14 16 13 3 5 11 15 7 รูปที่ 4.19-4 โครงสร้างภายในของเซเวน่ เซกเมนตเ์ บอร์ LTC4727 การเขียนโคด้ โปรแกรมเพื่อแสดงตวั เลขเมื่อใชเ้ ซเวน่ เซกเมนตจ์ านวนหลายหลกั มีความซบั ซ้อน มากพอสมควรเนื่องจากเซเวน่ เซกเมนตป์ ระกอบข้ึนจาก LED เม่ือไม่ไดร้ ับการไบอสั LED ก็จะดบั การท่ี จะใหต้ ิดเป็ นตวั เลขไดจ้ ะตอ้ งใชก้ ารติดดบั ของตวั เลขในแตล่ ะหลกั ไล่เวยี นกนั ตลอดเวลาท่ีเรียกวา่ “มลั ติ แพล็ก” การเขียนโคด้ โปรแกรมเพ่ือแสดงค่าตวั เลขที่เซเวน่ เซกเมนต์ ปัจจุบนั มีไลบรารี่ช่วยงานทาให้ สามารถเขียนโคด้ ได้ง่ายข้ึน ไลบราร่ีน้ีสามารถใช้ได้เฉพาะเซเว่นเซกเมนต์ชนิดแคโถดร่วมเท่าน้นั สามารถดาวน์โหลดไลบราร่ีไดท้ ี่ ไลบรารี่ แหล่งดาวน์โหลด send2seg.h https://github.com/KruPraphas/send2seg มีข้นั ตอนการดาเนินการเพื่อนาไลบรารี่มาใชง้ านดงั น้ี 1. ดาวนโ์ หลดไลบรารี่ send2seg.h เป็นไฟล์ Zip ดงั รูป รูปที่ 4.19-5 การดาวน์โหลดไลบรารี่ที่นามาใชง้ านตวั ท่ี 1 2. ทาการเพมิ่ ไลบราร่ีท้งั 2 ลงในโปรแกรม Arduino IDE โดยการเพิม่ จากไฟล์ zip แลว้ ทาการหา ไฟล์ zip ที่ไดจ้ ากการดาวนโ์ หลดในขอ้ 1 และ 2 รูปที่ 4.19-6 การเพิม่ ไลบราร่ีที่เป็นไฟล์ zip ลงในโปรแกรม Arduino IDE

238  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ัน Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 2. ฟังก์ช่ันกาหนดความเร็วในการส่ือสารทางพอร์ตอนุกรม Serial.begin(speed); speed: ตวั เลขของอตั ราเร็วในการสื่อสารผา่ นพอร์ตอนุกรม 3. ฟังก์ชั่นส่งข้อมูลออกพอร์ต เป็ นฟังก์ชัน่ ที่ใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรือ พมิ พข์ อ้ มูลออกทางพอร์ตเพื่อแสดงผลที่จอคอมพิวเตอร์เม่ือพมิ พเ์ สร็จตวั เคอร์เซอร์จะรออยู่ ท่ีทา้ ยสิ่งที่พมิ พน์ ้นั ๆ Serial.print(val); Serial.print(val, format); 4. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คล้ายกบั ฟังก์ช่นั Serial.print ต่างกนั ตรงที่เม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เมื่อสั่งพิมพ์คร้ังถดั ไปขอ้ มูลที่ปรากฏจะอยูท่ ่ี บรรทดั ใหม่ แทนที่จะตอ่ ทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val); Serial.println(val, format); 5. ฟังก์ช่ันแปลงช่วงตัวเลข เป็ นฟังก์ชน่ั ทาหน้าที่เปลี่ยนแปลงค่าที่ไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งคา่ หน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหม่ที่ตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh) value: ตวั แปรท่ีตอ้ งการอา่ นคา่ นามาเปล่ียนช่วงตวั เลข fromLow: ตวั เลขสเกลล่างสุดของคา่ จากตวั แปร fromHigh: ตวั เลขสเกลสูงสุดของค่าจากตวั แปร toLow: ตวั เลขสเกลล่างสุดของคา่ ท่ีตอ้ งการเปลี่ยนไป toHigh: ตวั เลขสเกลสูงสุดของคา่ ท่ีตอ้ งการเปลี่ยนไป

ใบงานท่ี 4.19 การเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit  239 6. ฟังก์ชั่นอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ที่อ่านสัญญาณแอนาลอกที่ปรากฏอยทู่ ี่ขาพอร์ต แอนาลอกที่ตอ้ งการอ่านน้นั ๆ ค่าที่อ่านไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรท่ีเป็น int สาหรับเกบ็ คา่ ท่ีอา่ นได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกที่ตอ้ งการอา่ นค่าสัญญาณแอนาลอก ฟังก์ช่ันใช้งานของไลบรารี่ send2seg.h การใชง้ านไลบราร่ี send2seg.h เพ่ือส่งค่าตวั เลขไปแสดงผลที่เซเวน่ เซกเมนต์ (คอมมอนคาโถด) จะตอ้ งประกาศตวั แปรและรูปแบบของการใชง้ านของฟังกช์ นั่ ดงั น้ี 1. ฟังก์ชั่นกาหนดขาเช่ือมต่อด้านขาร่วม ใช้ในการระบุขาพอร์ตที่ใช้เชื่อมต่อกบั ขาเบสของ ทรานซิสเตอร์ในการควบคุมขาร่วมของเซเวน่ เซกเมนตใ์ หต้ วั โปรแกรมรับรู้ รูปแบบเป็นดงั น้ี byte digitPins[]={digit4,digit3,digit2,digit1}; digit1-digit4: ขาพอร์ตท่ีใชไ้ บอสั ทรานซิสเตอร์ ตวั อย่างเช่น byte digitPins[] = {2,3,4,5}; หมายถึง ขาพอร์ตที่เช่ือมต่อกับทรานซิสเตอร์คือขา D2, D3, D4, D5 เรียงจากหลัก หน่วยไปยงั หลกั พนั ดงั รูป รูปที่ 4.19-7 การประกาศคา่ ตวั แปรกาหนดขาคอมมอน 2. ฟังก์ช่ันกาหนดขาเช่ือมต่อด้านขาข้อมูล ใชใ้ นการระบุขาพอร์ตท่ีใชเ้ ชื่อมต่อกบั ขาขอ้ มูล (a, b, c,… dp)ใหต้ วั โปรแกรมรับรู้ รูปแบบเป็นดงั น้ี byte segmentPins[] ={a,b,c,d,e,f,g,dp}; a,b,c,d,e,f,g,dp: ขาพอร์ตที่เช่ือมต่อกบั ขา a,b,c,d,e,f,g,dp ของเซเวน่ เซกเมนต์

240  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ตวั อย่างเช่น byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6}; หมายถงึ ขาพอร์ตท่ีกบั a,b,c,d,e,f,g,dp คือขา D13, D12,… D6 รูปที่ 4.19-8 การประกาศค่าตวั แปรกาหนดขาขอ้ มูล 3. ฟังก์ช่ันเร่ิมการใช้งานไลบรารี่ ใชใ้ นเร่ิมตน้ การใชง้ านโดยวางฟังก์ชัน่ น้ีลงในฟังก์ชนั่ setup() รูปแบบเป็นดงั น้ี send2seg::set(1, 4, digitPins, segmentPins); 4. ฟังก์ช่ันแสดงค่าตัวเลข ใชแ้ สดงผลตวั เลขที่ตอ้ งการ โดยสามารถระบุการติดของจุดทศนิยมได้ รูปแบบเป็นดงั น้ี send2seg::loadValue(value,point); value: คา่ ตวั เลขที่ตอ้ งการแสดงผลจะตอ้ งมีคา่ ไม่เกิน 9999 point: ตาแหน่งของจุดทศนิยมที่ตอ้ งการแสดง ตวั อย่างเช่น ใส่ค่าเป็ น 1 จุด ทศนิยมจะติดท่ีตาแหน่งหลกั หน่วย หากใส่ค่าเป็ น 2 จุดทศนิยมจะติดสวา่ งที่ตาแหน่ง หลกั สิบ 7. วงจรทใี่ ช้ทดลอง วงจรเพอื่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus หมายเหตุ เน่ืองจากเซเวน่ เซกเมนตท์ ี่ใชท้ ดลองเป็ นขนาด 4 ตวั เลข (หลกั ) และตอ้ งใชว้ งจรทรานซิสเตอร์ ช่วยขบั ดา้ นขาร่วมทาให้การต่อบนบอร์ดทดลอง Breadboard ทาไดย้ ากซ่ึงสามารถสร้างวงจรแสดงผล ต่างหากโดยใชแ้ ผน่ ลายวงจรพิมพเ์ อนกประสงคห์ รือออกแบบลายวงจรพิมพจ์ าทาใหก้ ารทดลองสะดวก มากยง่ิ ข้ึน

ใบงานท่ี 4.19 การเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit  241 กรณีใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 R42-2R011 R112k-R15 SW1 VCC LTC-4727JS RST AVCC C1 1 D13 19 14 a 0.1uF D1(TXD) D12 18 16 cb 3 D0(RXD) D11 17 13 d 2 D10 16 3 e 15 5 gf D9 14 11 dp D8 13 15 D7 12 7 D6 USB to UART (TTL Level) R21,kR3 1268 Q1 DTR D5 11 BC547 RXD Q2BC547 TXD Q3 +5V BC547 GND Q4 3V3 BC547 D4 6 D3 5 D2 4 VCC X1 9 XTAL1 A0 23 16MHz 10 XTAL2 C2,C3 10k 22pF GND 8,22 รูปที่ 4.19-9 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO R1-R8 LTC-4727JS 220 VCC D13 14 a 10k D12 R9-R12 16 b D11 1k 13 c D10 3 d 5 e D9 11 f D8 15 g D7 7 dp D6 A0 1268 Q1 D5 BC547 Q2 D4 BC547 Q3 D3 BC547 QB4C547 GND D2 รูปท่ี 4.19-10 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง วงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปที่ 4.19-11 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน

242  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] ปัญหาการจาลองการทางานจากการต่อทรานซิสเตอร์ เฉพาะในการจาลองดว้ ยโปรแกรม Proteus ขณะท่ีทรานซิสเตอร์หยุดนากระแสจะทาให้เกิด สภาวะขาคอลเลคเตอร์ (C) ลอยส่งผลให้จาลองวงจรไม่ได้ ทางแกใ้ ห้ทาการต่อตวั ตา้ นทานพูลอพั ท่ีขา คอลเลคเตอร์ขนาด 10k ดงั รูป 4.19-4 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมแสดงตวั เลขต้งั แต่ 0-9999 โดยใหเ้ ปลี่ยนคา่ ทุก ๆ ¼ วนิ าที ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริ่มต้นต่าง ส่งค่าตวั เลขแสดงผล หน่วงเวลา เพม่ิ ค่าตัวเลข แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <send2seg.h> 2 byte digitPins[] = {2,3,4,5}; // LSB to MSB 3 byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6}; // seg a to g and dp 4 void setup(){ 5 send2seg::set(1, 4, digitPins, segmentPins); // initialize 6} 7 void loop(){ 8 for(int value=0;value<=9999;value++) 9{ 10 send2seg::loadValue(value,0); // load value and point location 11 delay(250); 12 } 13 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1 รวมไฟลไ์ ลบรารี่ send2seg.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ท่ี 2 กาหนดขาพอร์ตท่ีเช่ือมตอ่ กบั ขาร่วม - บรรทดั ท่ี 3 กาหนดขาพอร์ตที่เชื่อมต่อกบั ขาเซกเมนต์ a, b, …dp - บรรทดั ที่ 5 ประกาศใชง้ านไลบราร่ี - บรรทดั ท่ี 10 แสดงผลตวั แปรโดยใชฟ้ ังกช์ น่ั แสดงผลของไลบราร่ี

ใบงานที่ 4.19 การเขียนโปรแกรมแสดงผลดว้ ย 7 Segment 4 Digit  243 ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองปรับเปล่ียนค่าตวั แปลงและคา่ แสดงผลจุดทศนิยมแลว้ สังเกตผล การทดลองที่ 2 เขียนโปรแกรมแสดงคา่ ที่อ่านไดจ้ ากพอร์ตแอนะลอก (คา่ ท่ีไดจ้ ะมีคา่ 0-1023) โดยพอร์ต แอนะลอกรับแรงดนั จากโพเทนธิโอมิเตอร์ดงั รูปที่ 4.19-10 ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง อ่านค่าจาก POT แสดงค่าท่ีอา่ นได้ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #include <send2seg.h> 2 byte digitPins[] = {2,3,4,5}; // LSB to MSB 3 byte segmentPins[] = {13, 12, 11, 10, 9, 8, 7, 6}; // seg a to g and dp 4 void setup(){ 5 send2seg::set(1, 4, digitPins, segmentPins); // initialize 6} 7 void loop(){ 8 int value=analogRead(A0); 9 send2seg::loadValue(value,2); // load value and point location 10 delay(100); 11 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 รวมไฟลไ์ ลบราร่ี send2seg.h เขา้ มาในโคด้ โปรแกรม - บรรทดั ที่ 2 กาหนดขาพอร์ตท่ีเช่ือมต่อกบั ขาร่วม - บรรทดั ท่ี 3 กาหนดขาพอร์ตที่เช่ือมต่อกบั ขาเซกเมนต์ a, b, …dp - บรรทดั ที่ 5 ประกาศใชง้ านไลบราร่ี - บรรทดั ท่ี 8 อา่ นจากพอร์ตแอนะลอก A0 - บรรทดั ท่ี 9 แสดงผลคา่ ท่ีอ่านไดโ้ ดยใชฟ้ ังกช์ นั่ แสดงผลของไลบราร่ี ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองปรับค่าโพเทนธิโอมิเตอร์แลว้ สังเกตผล

244  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมอ่านค่าจากพอร์ตแอนะลอกโดยใหแ้ สดงค่าเป็ น 0 เม่ือหมุนต่าสุดและแสดง ค่าเป็ น 4000 เมื่อหมุนไปยงั ค่าสูงสุด พร้อมให้แสดงจุดทศนิยมเล่ือนไปแต่ละหลกั ในแต่ละ ช่วงตวั เลข เช่นหลกั ท่ี 1 ใหต้ ิดเมื่อตวั เลขระหวา่ ง 0-1000 ARDUINO R1-R8 LTC-4727JS 220 VCC D13 14 ab 10k A0 D12 R91-kR12 16 cd D11 13 e D10 3 f 5 g D9 11 dp D8 15 D7 7 D6 1268 D5 Q1 BC547 D4 QB2C547 Q3 D3 BC547 Q4 BC547 GND D2 รูปที่ 4.19-12 วงจรที่ใชท้ ดลอง

ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ท่ีเช่ือมตอ่ แบบ 4 บิต  245 ใบงานท่ี 4.20 การเขยี นโปรแกรมแสดงผลด้วยจอ LCD ทเี่ ช่ือมต่อแบบ 4 บติ 1. จุดประสงค์ทว่ั ไป เพื่อใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมตอ่ แบบ 4 บิตได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ท่ีเช่ือมตอ่ แบบ 4 บิตได้ 2. บอกข้นั ตอนการต่อวงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 1 ตวั 2.1 ตวั ทา้ นทานปรับค่าไดข้ นาด 10k 1 ตวั 3. บอร์ด Arduino Nano 3.0 1 ตวั 4. LCD ชนิดตวั อกั ษรขนาด 16x2 1 เส้น 5. สายเช่ือมตอ่ USB (Mini USB) 1 ชุด 6. สายเช่ือมต่อวงจร 1 เคร่ือง 7. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน

246  เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน อุปกรณ์แสดงผลของเคร่ืองใชไ้ ฟฟ้าหรือเครื่องใช้ที่เป็ นอิเล็กทรอนิกส์ในปัจจุบนั จะเลือกใช้ LCD ในการแสดงผลเป็ นส่วนใหญ่ เช่น เครื่องคิดเลข นาฬิกา เครื่องมือวดั แบบตวั เลขและอื่นๆ อีก มากมาย LCD ยอ่ มาจากคาวา่ Liquid Crystal Display เป็ นอุปกรณ์แสดงผลท่ีกินไฟนอ้ ยมากเป็ นอุปกรณ์ ที่แสดงผลโดยไม่ไดอ้ าศยั การเปล่งแสงที่ตวั เองแต่ใชว้ ธิ ีการปิ ดบงั แสงไม่ใหส้ ะทอ้ นให้หรือไม่ให้ส่อง ผา่ นแทน ซ่ึง LCD สามารถแบ่งได้ 3 แบบคือ 1. Segment display ชนิด LCD module 2. Character LCD module 3. Graphic LCD module ส่วนประกอบหลกั ของจอผลึกเหลว (LCD) ภายในประกอบดว้ ยส่วนหลกั 3 ส่วนดว้ ยกนั คือ 1. ตวั แสดงผล (Display) เป็นตวั แสดงผลใหเ้ ราไดม้ องเห็น ในลกั ษณะการปิ ดและเปิ ดกบั แสง ก็คือส่วนท่ีเป็นตวั กระจกบรรจุผลึกเหลว 2. ตวั ขบั (Driver) เป็ นตวั รับสัญญาณจากตวั ควบคุมมาขบั ให้ตวั แสดงผลแสดงขอ้ มูลตามที่ กาหนด 3. ตวั ควบคุม (Controller) เป็ นตวั รับขอ้ มูลจากอุปกรณ์ภายนอก มาควบคุมการทางานของตวั LCD Module เบอร์ที่นิยมใชค้ ือ - HD4478 ใชค้ วบคุม Character LCD module - HD61830ใชค้ วบคุม Graphic LCD module การต่อใช้งาน ใบงานน้ีเป็ นการทดลองการใช้งาน LCD ชนิดตวั อกั ษร ซ่ึงการต่อใช้งานตาม คุณสมบตั ิของโมดูลสามารถเช่ือมต่อให้มีการส่ือสารข้อมูลได้ 2 แบบคือ แบบ 8 บิตและแบบ 4 บิต สาหรับการทดลองเพื่อใชง้ าน LCD ดว้ ย Arduino ใชก้ ารเชื่อมต่อแบบ 4 บิตเน่ืองจากพอร์ตของ Arduino มีจากดั สาหรับขนาดของ LCD ชนิดตวั อกั ษรมีให้เลือกใช้หลายขนาดผูใ้ ช้งานสามารถเลือกใชไ้ ดต้ าม ตอ้ งการโดยมีขนาดใหเ้ ลือกตามตาราง ตารางที่ 4.20-1 8 ตวั อกั ษร 16 ตวั อกั ษร 20 ตวั อกั ษร 40 ตวั อกั ษร จานวนตวั อกั ษรต่อแถว 8×2 16×1 20×1 40×1 16×2 20×2 40×2 ขนาดของ LCD ท่ีมีใหใ้ ชง้ าน 16×4 20×4 40×4


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