บทท่ี 3 เครื่องมือช่วยงานไมโครคอนโทรลเลอร์ Arduino 45 บทท่ี 3 เครื่องมือช่วยงานไมโครคอนโทรลเลอร์ Arduino หวั ขอ้ เรื่อง 3.1 เคร่ืองมือแปลงภาษาซีเป็ นภาษาเคร่ืองและอพั โหลดไฟลล์ งชิพ 3.2 ไดร์ฟเวอร์ USB 3.3 เครื่องมือจาลองการทางาน สาระสาคญั เครื่องมือช่วยพฒั นางานไมโครคอนโทรลเลอร์ เป็ นเครื่องมืออานวยความสะดวกทาใหส้ ามารถ พฒั นางานได้ง่ายและเร็ว เคร่ืองมือท่ีนามาใช้งานมี 3 อย่างด้วยกนั คือ เคร่ืองมือแปลงภาษาซีเป็ น ภาษาเครื่องพร้อมอพั โหลดลงชิพ เครื่องมือจาลองการทางาน และไดร์ฟเวอร์ USB สมรรถนะประจาหน่วยการเรียนรู้ รู้และเขา้ ใจการใชง้ านและสามารถใชเ้ คร่ืองมือช่วยพฒั นางานไมโครคอนโทรลเลอร์ จุดประสงคก์ ารเรียนรู้ จุดประสงค์ทว่ั ไป 1. เพอ่ื ใหม้ ีความรู้เก่ียวกบั เคร่ืองมือแปลงภาษาซีเป็นภาษาเคร่ืองและอพั โหลดไฟลล์ งชิพ 2. เพอ่ื ใหม้ ีความรู้เกี่ยวกบั เคร่ืองมือจาลองการทางาน 3. เพื่อใหม้ ีความรู้เกี่ยวกบั การติดต้งั ไดร์ฟเวอร์ USB จุดประสงค์เชิงพฤติกรรม 1. บอกเก่ียวกบั เครื่องมือแปลงภาษาซีเป็นภาษาเคร่ืองและอพั โหลดไฟลล์ งชิพได้ 2. บอกเก่ียวกบั เครื่องมือจาลองการทางานได้ 3. บอกข้นั ตอนการติดต้งั ไดร์ฟเวอร์ USBได้ 4. ทาแบบฝึกหดั เสร็จทนั เวลาและทาแบบทดสอบผา่ นเกณฑท์ ี่กาหนด
46 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] เคร่ืองมือช่วยงานไมโครคอนโทรลเลอร์ Arduino การพฒั นาไม่ว่าจะเป็ นการพฒั นาในเร่ืองใดก็ตามหากมีเคร่ืองมือช่วยพฒั นางานท่ีมีคุณภาพจะ ทาให้งานน้นั ๆ สามารถพฒั นาไปไดเ้ ร็วและจะส่งผลให้ผพู้ ฒั นางานสามารถใชค้ วามสามารถได้เต็มท่ี สาหรับไมโครคอนโทรลเลอร์ในแพลทฟอร์ม Arduino มีเคร่ืองมือช่วยพฒั นางาน 3 ชนิด คือ 1. เครื่องมือแปลงภาษาซีเป็นภาษาเคร่ืองและอพั โหลดไฟลล์ งชิพ 2. ไดร์ฟเวอร์ USB 3. เครื่องมือจาลองการทางาน 3.1 เครื่องมือแปลงภาษาซีเป็ นภาษาเคร่ืองและอพั โหลดไฟล์ลงชิพ เคร่ืองมือที่ใชแ้ ปลงภาษาซีเป็ นภาษาเครื่องหรือที่เรียกกนั วา่ ซีคอมไพเลอร์ (C Compiler) เป็ น โปรแกรมคอมพิวเตอร์ชนิดหน่ึงท่ีถูกสร้างข้ึนเพ่ือใชส้ าหรับแปลงภาษาซีเป็นภาษาเคร่ือง โปรแกรมที่ถูก ออกแบบมาใหใ้ ชง้ านกบั Arduino คือโปรแกรม Arduino IDE การติดต้งั และการใชง้ านมีดงั น้ี การติดต้งั โปรแกรม Arduino IDE Arduino IDE เป็นโปรแกรมสาหรับเขียนโคด้ เพื่อควบคุมการทางานของไมโครคอนโทรลเลอร์ Arduino ซ่ึงตัวโปรแกรมมีให้ดาวน์โหลดให้ใช้งานได้โดยไม่มีค่าใช้จ่ายและมีเวอร์ชั่นท่ีรองรับ ระบบปฏิบตั ิการหลายแบบ เอกสารเล่มน้ีขอแนะนาเฉพาะโปรแกรมที่รองรับระบบปฏิบตั ิการวินโดวส์ เทา่ น้นั โดยข้นั ตอนมีดงั น้ี 1. ดาวน์โหลดโปรแกรมโดยเขา้ ไปท่ีเวปไซด์ https://www.arduino.cc/en/Main/Software คลิก ที่คาวา่ SOFTWARE ดงั รูป รูปที่ 3-1 หนา้ ต่างเวปไซตส์ าหรับดาวนโ์ หลดโปรแกรม Arduino IDE 2. เลือกดาวน์โหลดไฟล์ที่เป็ นไฟล์ zip (เพ่ือให้ง่ายต่อการอพั เดจหรือถอนโปรแกรมออกใน อนาคต) โดยคลิกตรงคาวา่ Windows ZIP file for non admin install ดงั รูป
บทท่ี 3 เคร่ืองมือช่วยงานไมโครคอนโทรลเลอร์ Arduino 47 รูปที่ 3-2 บริเวณท่ีสาหรับคลิกเพ่ือดาวน์โหลดไฟล์ zip 3. คลิกตรงคาวา่ JUST DOWNLOAD เพอ่ื ดาวน์โหลดไฟล์ รูปท่ี 3-3 หนา้ ต่างเวปไซตส์ าหรับคลิกเพอ่ื ดาวน์โหลด 4. แตกไฟลแ์ ลว้ คดั ลอกท้งั โฟลเดอร์มาไวท้ ่ีไดร์ฟ C ดงั รูป รูปที่ 3-4 คดั ลอกท้งั โฟลเดอร์มาไวท้ ่ีไดร์ฟ C การใช้งานโปรแกรม Arduino IDE การใช้งานโปรแกรม Arduino IDE เพ่ือเขียนโค้ดโปรแกรมควบคุมการทางานของ Arduino สามารถใชป้ ระโยชน์ได้ 2 แนวทางคือ 1. เพ่อื นาไฟลภ์ าษาเครื่องท่ีไดจ้ ากการแปลงไปจาลองการทางานดว้ ยโปรแกรม Proteus 2. เพอ่ื ทดลองวงจรจริง (ซ่ึงตอ้ งติดต้งั ไดร์ฟเวอร์ USB ก่อน)
48 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การใชง้ านโปรแกรม Arduino IDE มีข้นั ตอนดาเนินการดงั น้ี 1. เรียกใช้โปรแกรมดว้ ยการดบั เบิลคลิกไฟล์ Arduino.exe ในโฟลเดอร์โปรแกรมท่ีได้แตก ไฟลไ์ ว้ 2. ต้งั คา่ บอร์ดใหต้ รงกบั ท่ีใชง้ านซ่ึงมีการต้งั ค่าอยูด่ ว้ ยกนั 4 รายการดงั น้ี - ชนิดของบอร์ด Arduino ท่ีใชง้ าน (กาลงั เช่ือมต่ออย)ู่ - ชนิดของโพรเซสเซอร์ เลือกใหต้ รงกบั โพรเซสเซอร์ของบอร์ด (บอร์ดบางชนิดไม่ตอ้ ง เลือกเนื่องจากมีใชง้ านเพียงเบอร์เดียว) - คอมพอร์ตที่กาลงั เชื่อมตอ่ เลือกใหต้ รงกบั ท่ีบอร์ด Arduino กาลงั เช่ือมตอ่ (ดูจาก Device manager) - ชนิดของเครื่องโปรแกรม เลือก AVRISP mkII รูปที่ 3.5 การต้งั ค่าบอร์ดที่ใชง้ าน 3. ต้งั คา่ ในโปรแกรม Arduino IDE ใหแ้ สดงตาแหน่งของไฟลภ์ าษาเครื่อง (HEX file) หลงั จาก การคอมไพลผ์ า่ น การต้งั ค่าดงั รูป รูปท่ี 3-6 คลิก Preferences
บทที่ 3 เครื่องมือช่วยงานไมโครคอนโทรลเลอร์ Arduino 49 4. คลิกเลือกแสดงผลท้งั 3 รายการดงั รูป รูปที่ 3-7 คลิกเลือกท้งั 3 รายการ 5. เขียนโคด้ โปรแกรมที่ตอ้ งการในหนา้ ตา่ งโปรแกรม 6. ในกรณีท่ีตอ้ งการคอมไพล์เพื่อดูผลของการเขียนโปรแกรมว่าถูกไวยกรณ์หรือไม่ หรือ ตอ้ งการไฟลภ์ าษาเคร่ือง (HEX file) ไปจาลองการทางานในโปรแกรมจาลองการทางาน เมื่อ เขียนโคด้ โปรแกรมเสร็จสิ้นแลว้ ใหค้ ลิกที่ป่ ุมคอมไพล์ รูปที่ 3-8 คลิกป่ ุมคอมไพลห์ ลงั เขียนโคด้ โปรแกรมเสร็จสิ้น 7. ในกรณีที่ตอ้ งการไฟลภ์ าษาเคร่ืองไปจาลองการทางาน ใหค้ ดั ลอกตาแหน่งไฟลภ์ าษาเครื่อง ในบริเวณหน้าต่างผลการคอมไพล์ (พ้ืนสีดา) โดยใช้เมาส์คลุมดาบริเวณที่อยู่ไฟล์แลว้ กด คียบ์ อร์ด Ctrl+C ตาแหน่งของไฟล์จะถูกจาไวใ้ นคอมพิวเตอร์หากตอ้ งการใช้ก็เพียงวาง Ctrl+V รูปท่ี 3-9 คดั ลอกตาแหน่งไฟลภ์ าษาเครื่อง (HEX file) 8. ในกรณีท่ีตอ้ งการอพั โหลดโคด้ ลงชิพของวงจรจริงท่ีเชื่อมต่อไวใ้ หค้ ลิกท่ีป่ ุม Upload ดงั รูป รูปท่ี 3-10 ป่ ุมอพั โหลดโคด้ ลงชิพไมโครคอนโทรลเลอร์
50 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 3.2 การตดิ ต้งั ไดร์ฟเวอร์ USB บอร์ด Arduino ปัจจุบนั มีหลายรุ่นซ่ึงแต่ละรุ่นอาจใช้ชิพสาหรับติดต่อสื่อสารผ่านพอร์ต USB แตกต่างกนั ไป ซ่ึงบางรุ่นมีไดร์ฟเวอร์มาให้พร้อมในตวั โปรแกรม Arduino IDE แลว้ เช่นบอร์ดที่ใชช้ ิพ CP210x, FTDI, หรือบอร์ดท่ีใชไ้ มโครคอนโทรลเลอร์เป็ นตวั ส่ือสารผา่ น USB ดงั น้นั การติดต้งั ผูใ้ ช้งาน สามารถเรียกใช้ได้เลยโดยไม่ตอ้ งไปหาดาวน์โหลดไดร์ฟเวอร์อีก โดยไดร์ฟเวอร์จะอยู่ในโฟลเดอร์ C:\\arduino-1.8.4\\drivers ดงั รูป รูปที่ 3-11 โฟลเดอร์ท่ีเกบ็ ไดร์เวอร์สาหรับชิพ USB บางรุ่น ยกเวน้ บอร์ดที่ใชช้ ิพ CH340,CH341 (บอร์ด Arduino Nano 3.0 เลือกใชช้ ิพเบอร์น้ีในบางผผู้ ลิต) ซ่ึงผใู้ ชง้ านจะตอ้ งไปหาดาวนโ์ หลดไดร์ฟเวอร์เพอ่ื มาติดต้งั เอง การดาวน์โหลดสามารถดาวน์โหลด ไดร์ฟเวอร์ไดท้ ่ี http://www.winchiphead.com/download/CH341/CH341SER.ZIP การติดต้งั มีข้นั ตอนดงั น้ี 1. แตกไฟล์ zip ไดร์ฟเวอร์ท่ีดาวน์โหลดจากลิงคท์ ี่กล่าวมาแลว้ ขา้ งตน้ 2. เขา้ ไปในโฟลเดอร์ CH341SER แลว้ ดบั เบิลคลิกที่ไฟล์ setup.exe ดงั รูป รูปที่ 3-12 โฟลเดอร์ที่เก็บไดร์เวอร์สาหรับชิพ CH341หลงั จากการแตกไฟล์
บทท่ี 3 เคร่ืองมือช่วยงานไมโครคอนโทรลเลอร์ Arduino 51 3. คลิกที่ป่ ุม install เพอื่ ติดต้งั ไดร์ฟเวอร์ USB ท่ีใชช้ ิพ CH340, CH341 ดงั รูป รูปที่ 3-13 หนา้ ตาของโปรแกรมสาหรับติดต้งั ไดร์ฟเวอร์ USB ท่ีใชช้ ิพ CH340, CH341 4. ตรวจสอบการทางานของไดร์ฟเวอร์ดว้ ยการเช่ือมต่อบอร์ด Arduino เขา้ กบั คอมพิวเตอร์ดว้ ย สาย USB ทาการเปิ ด Device Manager สงั เกตพอร์ตส่ือสารที่ปรากฏข้ึนดงั รูป รูปท่ี 3-14 ผลการติดต้งั ไดร์ฟเวอร์หลงั การเชื่อมต่อบอร์ด Arduino Nano 3.0 3.3 เคร่ืองมือจาลองการทางาน สาหรับผูท้ ี่ตอ้ งการทดลองวงจรโดยที่ยงั ไม่มีวงจรจริง การจาลองด้วยโปรแกรมจาลองการ ทางานของวงจรเป็ นทางเลือกที่เหมาะสม โปรแกรมท่ีสามารถทดลองวงจรไมโครคอนโทรลเลอร์ไดด้ ี โปรแกรมหน่ึงท่ีไดร้ ับความนิยมคือ Proteus และเน่ืองจากโปรแกรมจาลองการทางานดงั กล่าวจาเป็ นตอ้ ง ติดต้งั ให้เป็ นโปรแกรมตวั เต็มจึงไม่สามารถเสนอข้นั ตอนการติดต้งั น้ีได้ ซ่ึงผูใ้ ชง้ านสามารถหาวิธีการ ติดต้งั ไดจ้ ากอินเตอร์เน็ตได้ สาหรับข้นั ตอนน้ีเป็ นข้นั ตอนเตรียมโปรแกรมให้สามารถจาลอง Arduino ไดเ้ น่ืองจากโปรแกรม Proteus หลงั ติดต้งั เรียบร้อยแลว้ จะยงั ไม่มีโมเดลของบอร์ด Arduino ใหใ้ ชง้ านจึง จาเป็ นตอ้ งดาเนินการใหม้ ีก่อน ซ่ึงโมเดลจาลอง Arduino ผเู้ ขียน (ครูประภาส สุวรรณเพชร) ไดจ้ ัดสร้าง โมเดลจาลองไวใ้ หผ้ ใู้ ชง้ านทวั่ ไปสามารถนาไปใชง้ านได้ ข้นั ตอนการดาเนินการมีดงั น้ี 1. ดาวนโ์ หลดโมเดลจาลอง Arduino ท่ี http://www.praphas.com/download/arduino/ArduinoONO-RX[Lib].rar
52 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. ทาการแตกไฟล์ แลว้ คดั ลอกไฟลโ์ มเดลจาลองท้งั สองไฟลด์ งั รูป รูปท่ี 3-15 คดั ลอกไฟลโ์ มเดลจาลองท้งั สองไฟล์ 3. โดยนาไปวางไวใ้ นโฟลเดอร์ library ของโปรแกรม Proteus รูปท่ี 3-16 วางไฟลโ์ มเดลจาลองท้งั สองไฟลท์ ี่คดั ลองมาในโฟลเดอร์ LIBRARY หมายเหตุ *windows 32bit C:\\Program Files\\Labcenter Electronics\\Proteus 8 Professional\\LIBRARY *windows 64bit C:\\Program Files (x86)\\Labcenter Electronics\\Proteus 8 Professional\\LIBRARY ในกรณีที่ลงเวอร์ชนั่ 8 ตาแหน่งจะอยใู่ นพกิ ดั ท่ีคลา้ ยกนั เพียงแตเ่ ป็นช่ือ Proteus 8 การจาลองการทางานด้วยโปรแกรม Proteus การทดลองการทางานของวงจรไมโครคอนโทรลเลอร์ Arduino แบบจาลองการทางานด้วย โปรแกรม Proteus สามารถเรียกใชบ้ อร์ด Arduino ไดซ้ ่ึงโมเดล Arduino จะอยใู่ นเมนู Emulator ดงั รูป รูปที่ 3-17 ไมโครคอนโทรลเลอร์ Arduino
บทที่ 3 เคร่ืองมือช่วยงานไมโครคอนโทรลเลอร์ Arduino 53 ข้นั ตอนการจาลองการทางานมีดงั น้ี 1. เลือกอุปกรณ์ท่ีตอ้ งการใชง้ านใหอ้ ยใู่ นช่องรายการ รูปที่ 3-18 การเลือกอุปกรณ์เพือ่ ใชง้ าน 2. ทาการต่อวงจรตามใบงานท่ีตอ้ งการทดลอง รูปที่ 3-19 ต่อวงจรเพ่ือทดลอง 3. คดั ลอกตาแหน่งไฟลภ์ าษาเคร่ืองจากโปรแกรม Arduino IDE แลว้ คลิกวางตาแหน่งไฟล์ ภาษาเคร่ือง ( Ctrl+V ) ลงในช่อง Program File: โดยการดบั เบิลคลิกที่ตวั Arduino รูปที่ 3-20 วางตาแหน่งไฟลภ์ าษาเครื่อง (HEX file) ลงในช่อง
54 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 4. คลิกป่ ุม Run เพื่อเร่ิมจาลองการทางาน รูปที่ 3-21 เริ่มจาลองการทางาน
บทท่ี 4 ใบงานการทดลอง 55 บทที่ 4 ใบงานการทดลอง หวั ขอ้ เรื่อง ใบงานท่ี 4.1 การทดสอบบอร์ดเบ้ืองตน้ ใบงานท่ี 4.2 การเขียนโปรแกรมส่ือสารทางพอร์ตอนุกรม ใบงานที่ 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ที่เอาทพ์ ทุ พอร์ตเบ้ืองตน้ ใบงานที่ 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั ใบงานท่ี 4.5 การเขียนโปรแกรมอา่ นคา่ จากพอร์ตแอนาลอกและการใช้ PWM ใบงานท่ี 4.6 การเขียนโปรแกรมรับสวติ ช์ทางพอร์ตแอนาลอก ใบงานท่ี 4.7 การเขียนโปรแกรมวดั อุณหภูมิดว้ ยเทอร์มิสเตอร์ชนิด NTC ใบงานที่ 4.8 การเขียนโปรแกรมวดั อุณหภูมิและความช้ืนดว้ ยโมดูล DHT22 ใบงานท่ี 4.9 การเขียนโปรแกรมใชง้ านไอซีวดั อุณหภูมิ DS18B20 ใบงานที่ 4.10 การเขียนโปรแกรมวดั ระยะดว้ ยโมดูลอลั ตร้าโซนิค ใบงานท่ี 4.11 การเขียนโปรแกรมควมคุมดีซีมอเตอร์ ใบงานท่ี 4.12 การเขียนโปรแกรมควมคุมสเตป็ เปอร์มอเตอร์ ใบงานท่ี 4.13 การเขียนโปรแกรมควมคุมเซอร์โวมอเตอร์ ใบงานท่ี 4.14 การเขียนโปรแกรมใชง้ านอินเตอร์รัพท์ ใบงานที่ 4.15 การเขียนโปรแกรมใชง้ านหน่วยความจา EEPROM ใบงานที่ 4.16 การเขียนโปรแกรมใชง้ านคียแ์ พด ใบงานท่ี 4.17 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ท่ีเช่ือมต่อแบบ 4 บิต ใบงานที่ 4.18 การเขียนโปรแกรมแสดงผลดว้ ยจอ LCD ที่เช่ือมต่อแบบ I2C ใบงานท่ี 4.19 การเขียนโปรแกรมแสดงผลดว้ ยโมดูลตวั เลข MAX7219 ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 ใบงานที่ 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ต่าง ๆ ใบงานท่ี 4.23 การประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ต่าง ๆ ใบงานท่ี 4.24 การประยกุ ตก์ ารแสดงผลดว้ ยโมดูล MAX7219 กบั เซนเซอร์ตา่ ง ๆ ใบงานที่ 4.25 การประยกุ ตก์ ารแสดงผลที่ OLED กบั เซนเซอร์ตา่ ง ๆ
56 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] สาระสาคญั ใบงานในหน่วยการเรียนน้ีเป็ นใบงานที่รวบรวมข้ึนเพื่อให้ผูเ้ รียนสามารถเรียนรู้การใช้งาน ไมโครคอนโทรลเลอร์ข้นั พ้ืนฐาน ตลอดจนมีทกั ษะในการสร้างวงจรเพื่อประยกุ ตใ์ ช้งานไดด้ ว้ ยตนเอง โดยใบงานมีท้ังหมด 25 ใบงานซ่ึงเป็ นใบงานข้ันพ้ืนฐานเพื่อให้ผู้ที่ยังไม่มีพ้ืนฐานการเขียน โปรแกรมควบคุมงานดว้ ยไมโครคอนโทรลเลอร์มาก่อนสามารถเรียนรู้ได้ ในแต่ละใบงานมีตวั อยา่ งการ เขียนโปรแกรมข้นั พ้ืนฐานเพื่อให้สามารถเขา้ ใจไดง้ ่ายและเป็ นแนวทางที่จะฝึ กเขียนโปรแกรมควบคุม งานในโจทยแ์ บบฝึกหดั ได้ สมรรถนะประจาหน่วยการเรียนรู้ ปฏิบตั ิการทดลองวงจรไมโครคอนโทรลเลอร์และวงจรเชื่อมต่อไดด้ ว้ ยตนเอง เขียนโปรแกรม สั่งงานวงจรไมโครคอนโทรลเลอร์ Arduino จาลองการทางานดว้ ยโปรแกรม Proteus จุดประสงคก์ ารเรียนรู้ จุดประสงค์ทว่ั ไป 1. เพอ่ื ใหม้ ีทกั ษะในการตอ่ วงจรไมโครคอนโทรลเลอร์และวงจรต่อพว่ ง 2. เพอ่ื ใหม้ ีทกั ษะในการตรวจสอบวงจรในกรณีที่วงจรไมท่ างาน 3. เพ่ือใหม้ ีทกั ษะในการแกไ้ ขปัญหาในกรณีที่วงจรไมท่ างาน 4. เพอ่ื ใหม้ ีความรู้เกี่ยวกบั การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ 5. เพื่อใหเ้ ขา้ ใจการทางานของวงจรดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 6. เพ่อื ใหส้ ามารถทดลองดว้ ยวงจรจริงท่ีสร้างข้ึนเอง 7. เพ่ือใหม้ ีความรับผดิ ชอบในการจดั ทาใบงานใหเ้ สร็จทนั เวลา จุดประสงค์เชิงพฤติกรรม 1. ต่อวงจรไมโครคอนโทรลเลอร์และวงจรต่อพว่ งได้ 2. ตรวจสอบวงจรในกรณีที่วงจรไม่ทางานได้ 3. แกไ้ ขปัญหาในกรณีที่วงจรไมท่ างานได้ 4. เขียนโปรแกรมภาษาซีควบคุมไมโครคอนโทรลเลอร์ตามตวั อยา่ งได้ 5. เขียนโปรแกรมภาษาซีควบคุมไมโครคอนโทรลเลอร์ในงานที่มอบหมายได้ 6. ทดลองวงจรดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus ได้ 7. ทดลองดว้ ยวงจรจริงท่ีสร้างข้ึนเองได้ 8. ทาใบงานเสร็จทนั เวลา
ใบงานที่ 4.1 การทดสอบบอร์ดเบ้ืองตน้ 57 ใบงานท่ี 4.1 การทดสอบบอร์ดเบื้องต้น 1. จุดประสงค์ทวั่ ไป เพ่อื ใหส้ ามารถทดสอบบอร์ดเบ้ืองตน้ ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีการทดสอบบอร์ดเบ้ืองตน้ ได้ 2. บอกข้นั ตอนการต่อวงจรเพ่อื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 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 4. สายเชื่อมตอ่ USB (Mini USB) 5. คอมพวิ เตอร์ 4. ลาดบั ข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ ว่ั ไปจุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เก่ียวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
58 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน ใบงานน้ีเป็ นใบงานสาหรับเตรียมเครื่องมือและทดสอบการทางานเบ้ืองตน้ ของบอร์ด Arduino วา่ ใชง้ านไดป้ กติหรือไม่ โดยการเขียนโคด้ โปรแกรมให้ LED ท่ีอยูบ่ นบอร์ด Arduino ซ่ึงต่ออยูท่ ี่ขา D13 ติดและดบั สลบั กนั ในกรณีที่ตอ้ งการต่อวงจร LED เพิ่มภายนอกจะตอ้ งต่อวงจร LED ให้สามารถติดได้ เม่ือรับลอจิก 1 ดงั น้นั จะตอ้ งต่อ LED อนุกรมกบั ตวั ตา้ นทานลงกราวดด์ งั รูป ARDUINO R1 LED1 220 D13 GND รูปที่ 4.1-1 วงจร Arduino ที่เช่ือมต่อกบั LED จานวน 1 ตวั ค่าความตา้ นทานท่ีใชง้ านสามารถคานวณหาไดด้ ว้ ยกฎของโอห์ม โดยมีขอ้ กาหนดท่ีค่าแรงดนั ตกคร่อมและกระแสของ LED เป็น 2V และ 15mA ตามลาดบั ดงั น้นั คา่ ความตา้ นทานจึงมีค่าเทา่ กบั R = VR VCC VLED = 52 = 200 II 15 103 6. ฟังก์ชั่นทใี่ ช้งานในใบงาน รูปแบบของฟังกช์ นั่ ที่ใชง้ านในใบงานน้ีมีดงั น้ี 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิตอลโดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการใหท้ างานในโหมดดิจิตอลไดจ้ ะตอ้ ง ใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 (ที่มีในบอร์ด Arduino รุ่น Mini และ Nano) ไม่สามารถใชง้ านในโหมดดิจิตอลได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาท่ีตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP ตัวอย่างเช่น pinMode(13,OUTPUT); หมายถึง กาหนดใหข้ า D13 ทางานเป็นเอาตพ์ ตุ พอร์ต
ใบงานท่ี 4.1 การทดสอบบอร์ดเบ้ืองตน้ 59 pinMode(12, INPUT_PULLUP); หมายถึง กาหนดให้ขา D12 ทางานเป็ นอินพุตพอร์ต ท่ีใชต้ วั ตา้ นทานพูลอพั ภายในชิพ 2. ฟังก์ช่ันส่งค่าลอจิกดิจิตอลไปยังขาพอร์ต โดยค่า HIGH เป็ นการส่งลอจิก 1 และค่า LOW เป็ นการส่งลอจิก 0 ออกไปยงั ขาพอร์ต ฟังก์ชน่ั น้ีจะทางานไดต้ อ้ งมีการใชฟ้ ังกช์ นั่ pinMode ก่อน digitalWrite(pin, value); pin: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต value: HIGH or LOW ตวั อย่างเช่น digitalWrite(13,HIGH); หมายถึง กาหนดใหส้ ่งลอจิก 1 ไปท่ีขา D13 digitalWrite(13,LOW); หมายถึง กาหนดใหส้ ่งลอจิก 0 ไปท่ีขา D13 3. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยุดคา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms); ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) ตัวอย่างเช่น delay(1000); หมายถึง หยดุ คา้ ง (หน่วงเวลา) ไวเ้ ป็นเวลา 1000 มิลลิวนิ าที (1 วนิ าที) 7. วงจรทใี่ ช้ทดลอง วงจรเพอื่ ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป
60 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC C1 0.1uF USB to UART (TTL Level) R2,R3 3 D13 19 R4 1k 2 220 DTR RXD D1(TXD) LED1 TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.1-2 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO R1 LED1 220 D13 GND รูปที่ 4.1-3 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J D12 1 D11 D10 D9 D8 5 D7 D6 D5 D4 D3 10 D2 GND RST D0 D1 15 ABCDE ABCDE 1 D13 3V3 REF A0 5 A1 A2 A3 A4 A5 10 A6 A7 5V RST GND 15 VIN รูปท่ี 4.1-4 การต่อลงบอร์ดทดลอง
ใบงานที่ 4.1 การทดสอบบอร์ดเบ้ืองตน้ 61 การต่อวงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus รูปท่ี 4.1-5 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม ใบงานน้ีเป็ นใบงานทดสอบการทางานของบอร์ด Arduino วา่ ทางานไดส้ มบูรณ์หรือไม่สามารถ รับการอพั โหลดจากโปรแกรม Arduino IDE ไดห้ รือไม่ การทดสอบเป็นการเขียนโคด้ โปรแกรมให้ LED ท่ีอยู่บนบอร์ดติดดบั สลบั กนั ในเวลาท่ีกาหนดซ่ึง LED ดงั กล่าวต่ออยู่กบั ขาดิจิตอลขา D13 การเขียน โปรแกรมมีข้นั ตอนดงั น้ี ลาดบั งาน การเขียนโปรแกรมจากโจทยท์ ี่กาหนดขา้ งตน้ เขียนลาดบั งานไดด้ งั น้ี 1. กาหนดช่ือตวั LED กบั ขาพอร์ตท่ีตอ้ งใชง้ าน 5. ส่งค่า LOW ไปยงั ขาพอร์ตเพื่อให้ LED ดบั 2. กาหนดโหมดขาที่เช่ือมต่อ LED 6. หน่วงเวลา 3. ส่งคา่ HIGH ไปยงั ขาพอร์ตเพื่อให้ LED ติด 7. วนกลบั ไปทาลาดบั ที่ 3 ซ้า 4. หน่วงเวลา แปลงลาดับงานเป็ นผงั งาน จากลาดบั งานสามารถเขียนเป็ นผงั งานไดด้ งั น้ี START Set pin mode Out to pin delay Out to pin delay
62 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED 13 2 void setup() 3{ 4 pinMode(LED, OUTPUT); 5} 6 void loop() 7{ 8 digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) 9 delay(1000); // wait for a second 10 digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW 11 delay(1000); // wait for a second 12 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 ประกาศชื่อ LED แทนตวั เลข 13 - บรรทดั ท่ี 4 กาหนดโหมดของขาพอร์ตที่เชื่อมต่อ LED ใหท้ างานเป็นเอาทพ์ ทุ พอร์ต - บรรทดั ที่ 8 ส่งคา่ ลอจิก 1 ออกทางขาพอร์ตที่ตอ่ LED - บรรทดั ท่ี 9 หน่วงเวลา 1 วนิ าที (1000 mS) - บรรทดั ที่ 10 ส่งคา่ ลอจิก 0 ออกทางขาพอร์ตท่ีต่อ LED - บรรทดั ท่ี 11 หน่วงเวลา 1 วนิ าที (1000 mS) ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมจาก delay(1000); เป็นตวั เลขอื่น แลว้ สงั เกตผล 9. สรุปผลการปฏบิ ัตงิ าน
ใบงานท่ี 4.2 การเขียนโปรแกรมส่ือสารทางพอร์ตอนุกรม 63 ใบงานท่ี 4.2 การเขยี นโปรแกรมสื่อสารทางพอร์ตอนุกรม 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 4. สายเช่ือมต่อ USB (Mini USB) 5. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ัติงาน 1. ศึกษาจุดประสงคท์ ว่ั ไปจุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานที่เกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
64 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน การสื่อสารแบบอนุกรมเป็ นการส่งข้อมูลไปทีล่ะบิตโดยใช้เทคนิคการเลื่อนข้อมูลบน สายสญั ญาณเส้นเดียว การส่งขอ้ มูลแบบอนุกรมน้ีจะไมม่ ีการส่งสัญญาณนาฬิกาจากตวั ส่งไปยงั ตวั รับ แต่ จะอาศยั วิธีต้งั ค่าความเร็วในการรับส่งสัญญาณให้เท่ากนั ซ่ึงเรียกว่า “อตั ราบอด” โดยเรียกทบั ศพั ท์ว่า “บอดเรต” (baud rate) ในการส่งขอ้ มูลจะส่งบิตเริ่มตน้ (Start bit) เพ่ือส่งสัญญาณบอกให้ภาครับรับรู้วา่ จะมีการส่งขอ้ มูลไปแลว้ ในเวลาอนั ใกลน้ ้ีและเมื่อส่งขอ้ มูลเสร็จจะส่งบิตหยุด (Stop bit) เป็ นบิตปิ ดทา้ ย ขบวนขอ้ มูลในไบตน์ ้นั ๆ ดงั รูป รูปที่ 4.2-1 รูปแบบของขอ้ มูลท่ีส่ือสารแบบอนุกรม รูปแบบของ ขอ้ มูลจากที่ส่งผา่ น Serial จะมีการเพ่ิม Start bit และ Stop bit เขา้ ไปเพมิ่ จากขอ้ มูลเดิม 1. บิตเร่ิมตน้ (Start bit) จะมีขนาด 1 บิต จะเป็ นลอจิก LOW 2. บิตขอ้ มูล (Data bit) 8 บิต ขอ้ มูลท่ีจะส่ง 3. บิตภาวะคู่หรือคี่ (Parity bit) มีขนาด 1 บิต ใชต้ รวจสอบขอ้ มูลความถูกตอ้ งของขอ้ มูล 4. บิตหยดุ (Stop bit) เป็นการระบุถึงขอบเขตของการสิ้นสุดขอ้ มูล จะเป็นลอจิก HIGH 6. ฟังก์ช่ัน Arduino ทใี่ ช้ในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ น่ั เป็นดงั น้ี pinMode(pin, mode); pin: หมายเลขขาท่ีตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP
ใบงานที่ 4.2 การเขียนโปรแกรมส่ือสารทางพอร์ตอนุกรม 65 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: ตวั เลขของอตั ราเร็วในการส่ือสารผา่ นพอร์ตอนุกรม ตัวอย่าง Serial.begin(9600); หมายถึง กาหนดอตั ราเร็วของการสื่อสารทางพอร์ตอนุกรม เป็น 9600 บิตตอ่ 1 วนิ าที 5. ฟังก์ช่ันตรวจสอบว่ามีข้อมูลเข้ามายังพอร์ตอนุกรมหรือไม่ โดยค่าที่ได้จากฟังก์ชัน่ เป็ น จานวนของขอ้ มูลที่เขา้ มา แต่ถา้ หากไมม่ ีขอ้ มูลเขา้ คา่ ท่ีไดจ้ ากฟังกช์ น่ั จะมีค่าเป็นศูนย์ Serial.available(); ตัวอย่าง if (Serial. available()>0) หมายถึง ตรวจสอบวา่ มีขอ้ มูลเขา้ มายงั พอร์ตอนุกรมหรือไม่ หากมี (ค่าจะมากกวา่ 0) ให้ทางานในกรอบงานของ if แต่ถา้ ไม่มีขอ้ มูลเขา้ มาให้ขา้ ม เง่ือนไข if น้ีไป
66 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 6. ฟังก์ช่ันอ่านข้อมูลทเี่ ข้ามายงั พอร์ตอนุกรม Serial. read(); ตวั อย่าง x = Serial.read(); หมายถึงอ่านคา่ จากพอร์ตอนุกรมมาเกบ็ ลงในตวั แปร x 7. ฟังก์ช่ันล้างข้อมูลในบฟั เฟอร์ของพอร์ตอนุกรมฝ่ังดา้ นรับใหว้ า่ ง Serial.flush() ตวั อย่าง หมายถึง ลา้ งขอ้ มูลบฟั เฟอร์ของพอร์ตอนุกรมฝั่งดา้ นรับ Serial.flush(); 8. ฟังก์ชั่นส่งข้อมูลออกพอร์ต เป็นฟังกช์ น่ั ที่ใชใ้ นการส่งขอ้ มูลออกทางพอร์ตอนุกรมหรืออาจ เรียกวา่ ฟังก์ชน่ั พิมพข์ อ้ มูลออกทางพอร์ตเพ่ือแสดงผลที่จอคอมพิวเตอร์ท่ีเช่ือมต่อกบั วงจร Arduino ฟังกช์ น่ั น้ีเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะรออยทู่ ่ีทา้ ยสิ่งท่ีพมิ พน์ ้นั ๆ Serial.print(val) Serial.print(val, format) ตัวอย่าง ผลท่ีไดค้ ือ \"78\" Serial.print(78, OCT) ผลที่ไดค้ ือ \"116\" Serial.print(78) ผลที่ไดค้ ือ \"1.23\" Serial.print(78, DEC) ผลที่ไดค้ ือ \"78\" Serial.print(1.23456) ผลที่ไดค้ ือ \"N\" Serial.print(78, HEX) ผลที่ไดค้ ือ \"4E\" Serial.print('N') ผลท่ีไดค้ ือ \"Hello\" Serial.print(1.23456, 0) ผลที่ไดค้ ือ \"1\" Serial.print(\"Hello\") ผลที่ไดค้ ือ \"1001110\" Serial.print(1.23456, 2) ผลท่ีไดค้ ือ \"1.23\" Serial.print(78, BIN) Serial.print(1.23456, 4) ผลที่ไดค้ ือ \"1.2346\" 9. ฟังก์ช่ันส่งข้อมูลออกพอร์ต คลา้ ยกบั ฟังก์ช่นั Serial.print ต่างกนั ตรงท่ีเม่ือพิมพ์เสร็จตวั เคอร์เซอร์จะข้ึนมารอยงั บรรทดั ใหม่ ดงั น้นั เมื่อสั่งพิมพ์คร้ังถดั ไปขอ้ มูลท่ีปรากฏจะอยู่ที่ บรรทดั ใหม่ แทนท่ีจะตอ่ ทา้ ยเหมือนกบั ฟังกช์ น่ั Serial.print Serial.println(val) Serial.println(val, format)
ใบงานท่ี 4.2 การเขียนโปรแกรมส่ือสารทางพอร์ตอนุกรม 67 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 1 RST AVCC C1 0.1uF USB to UART (TTL Level) R2,R3 3 D13 19 R4 1k 2 220 DTR RXD D1(TXD) LED1 TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.2-2 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO R1 LED1 220 D13 GND รูปท่ี 4.2-3 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
68 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]F GH I J20 20 25 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.2-4 การต่อลงบอร์ดทดลองD9 การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus อุปกรณ์เช่ือมต่อเพ่ือสื่อสารทางD8 5 พอร์ตอนุกรมใช้ VIRTUAL TERMINAL ซ่ึงอยใู่ นกลุ่ม INSTRUMENTSD7 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.1-5 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 รับขอ้ มูลจากพอร์ตอนุกรมซ่ึงส่งจากคอมพิวเตอร์มายงั บอร์ด Arduino แล้วส่งค่าน้นั กลบั ไปยงั คอมพิวเตอร์อีกคร้ังเพอื่ แสดงผลส่ิงท่ีส่งมา ผงั งาน โค้ดโปรแกรม START 1 int incomingByte = 0; 2 กาหนดค่าเริม่ ต้นต่าง 3 void setup() 4 { 5 Serial.begin(9600); 6} 7 void loop() ไมใ่ ช่ 8{ มขี ้อมลู เข้า ? 9 if (Serial.available() > 0) ใช่ เกบ็ ค่าเข้าตัวแปร 10 { 11 incomingByte = Serial.read(); 12 13 Serial.print(\"I received: \"); 14 Serial.println(incomingByte, DEC); } ส่งค่าตวั แปรไปแสดงผล }
ใบงานที่ 4.2 การเขียนโปรแกรมสื่อสารทางพอร์ตอนุกรม 69 รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 ประกาศตวั แปรสาหรับเก็บคา่ ขอ้ มูลท่ีรับเขา้ มาทางพอร์ตอนุกรม - บรรทดั ท่ี 4 กาหนดอตั ราเร็วของการสื่อสารของพอร์ตอนุกรม (กาหนด Baud rate) - บรรทดั ท่ี 8 ตรวจสอบวา่ มีขอ้ มูลเขา้ มาหรือไม่ หากมีขอ้ มูลเขา้ มาทางพอร์ตอนุกรมค่าที่ส่งออก มาจากฟังกช์ น่ั Serial.available จะมากกวา่ ศูนย์ - บรรทดั ที่ 10 อา่ นคา่ จากพอร์ตอนุกรมนาเขา้ มาเกบ็ ลงในตวั แปรที่เตรียมไว้ - บรรทดั ที่ 11 แสดงขอ้ ความ “I received:” ท่ีจอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม - บรรทดั ที่ 12 แสดงคา่ ในตวั แปร incomingByte ที่จอคอมพิวเตอร์ผา่ นทางพอร์ตอนุกรม ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมใหแ้ สดงผลตวั แปรรูปแบบอ่ืน ๆ แลว้ สังเกตผล การทดลองที่ 2 รับขอ้ มูลจากพอร์ตอนุกรมซ่ึงส่งมาจากคอมพิวเตอร์มายงั บอร์ด Arduino แล้วทาการ ตรวจสอบว่าขอ้ มูลดงั กล่าวใช่ตวั อกั ษร a หรือไม่ หากขอ้ มูลเป็ นตวั อกั ษร a ให้ LED ที่ต่ออยู่ที่ขา D13 สวา่ งแต่ถา้ ขอ้ มูลที่เขา้ มาไม่ใช่ตวั อกั ษร a ให้ LED น้นั ดบั ผงั งาน โค้ดโปรแกรม START 1 #define LED 13 2 int incomingByte = 0; 3 void setup() 4 กาหนดคา่ เริม่ ต้นต่าง 5 { 6 Serial.begin(9600); มขี ้อมลู เข้า ? ไม่ใช่ 7 pinMode(LED,OUTPUT); ใช่ 8} ใช่ ใช่ a ? ไม่ใช่ 9 void loop(){ 10 if (Serial.available() > 0) { 11 12 incomingByte = Serial.read(); 13 if(incomingByte =='a') 14 { 15 digitalWrite(LED,HIGH); LED ตดิ LED ดับ 16 } 17 else 18 { 19 digitalWrite(LED,LOW); 20 } } } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1 กาหนดช่ือ LED ใหแ้ ทน 13 (ในวงจรจริง LED ต่ออยกู่ บั ขา D13) - บรรทดั ท่ี 2 ประกาศตวั แปรสาหรับเกบ็ คา่ ขอ้ มูลที่รับเขา้ มาทางพอร์ตอนุกรม - บรรทดั ท่ี 5 กาหนดอตั ราเร็วของการสื่อสารของพอร์ตอนุกรม (กาหนด Baud rate)
70 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] - บรรทดั ท่ี 6 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็นเอาตพ์ ุทพอร์ต - บรรทดั ท่ี 9 ตรวจสอบวา่ มีขอ้ มูลเขา้ มาหรือไม่ หากมีขอ้ มูลเขา้ มาทางพอร์ตอนุกรมค่าที่ส่งออก จากฟังกช์ น่ั Serial.available จะมากกวา่ ศูนย์ - บรรทดั ท่ี 10 อา่ นค่าจากพอร์ตอนุกรมนาเขา้ มาเกบ็ ลงในตวั แปรท่ีเตรียมไว้ - บรรทดั ที่ 11 ตรวจสอบคา่ ในตวั แปร (ขอ้ มูลที่รับเขา้ มา) มีค่าเทา่ กบั ตวั อกั ษร a หรือไม่ - บรรทดั ที่ 13 ถา้ ค่าในตวั แปรมีคา่ เทา่ กบั ตวั อกั ษร a ใหส้ ่งลอจิก 1 ออกพอร์ต - บรรทดั ท่ี 17 ถา้ คา่ ในตวั แปรมีค่าไมเ่ ท่ากบั ตวั อกั ษร a ใหส้ ่งลอจิก 0 ออกพอร์ต ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกไ้ ขโปรแกรมใหส้ ามารถรับค่าจากตวั อกั ษรอื่น ๆ ได้ 9. สรุปผลการปฏบิ ัติงาน 10. งานทม่ี อบหมาย เขียนโปรแกรมรับขอ้ มูลจากคอมพิวเตอร์โดยให้ขอ้ มูลท่ีรับเขา้ มาน้นั สามารถควบคุมการติดดบั ของ LED ท่ีต่ออยกู่ บั Arduino ท้งั หมดซ่ึงวงจรเช่ือมต่อเป็นดงั รูป ARDUINO LED1-LED4 R1-R2420 D2 D3 D4 D5 GND รูปที่ 4.1-6 วงจรทดลองสาหรับงานที่มอบหมาย
ใบงานท่ี 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ที่เอาทพ์ ทุ พอร์ตเบ้ืองตน้ 71 ใบงานที่ 4.3 การเขยี นโปรแกรมใช้งานพอร์ตทาหน้าทเ่ี อาท์พุทพอร์ตเบือ้ งต้น 1. จุดประสงค์ทว่ั ไป เพ่ือใหส้ ามารถเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ท่ีเอาทพ์ ุทพอร์ตเบ้ืองตน้ ได้ 2. จุดประสงค์เชิงพฤตกิ รรม 1. บอกวธิ ีเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ที่เอาทพ์ ุทพอร์ตเบ้ืองตน้ ได้ 2. บอกข้นั ตอนการต่อวงจรเพอื่ ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เคร่ืองมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 4 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.2 LED 3mm 3. บอร์ด Arduino Nano 3.0 1 ตวั 4. สายเชื่อมตอ่ USB (Mini USB) 1 เส้น 5. สายเช่ือมต่อวงจร 1 ชุด 6. คอมพวิ เตอร์ 1 เครื่อง 4. ลาดับข้นั การปฏบิ ัติงาน 1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
72 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน บอร์ดArduino รุ่นที่ใชไ้ อซีไมโครคอนโทรลเลอร์ ATMEGA328, ATMEGA168, ATMEGA8 จะมีพอร์ตดิจิทลั ให้สามารถเชื่อมต่อใชง้ านได้ 14 ขาดว้ ยกนั โดยเร่ิมจากขา D0, D1,…D13 แต่ในขณะใช้ งานท่ีมีการติดต่อส่ือสารกับคอมพิวเตอร์ผ่านทางพอร์ตอนุกรม (สาย USB ท่ีกาลังเชื่อมต่อกับ คอมพิวเตอร์) ขา D0 และ D1 จะถูกใชง้ านรับส่งขอ้ มูลอยู่ ดงั น้นั จึงหา้ มใชใ้ นขณะท่ีใชง้ านพอร์ตอนุกรม รูปที่ 4.3-1 ขาพอร์ตใชง้ านของไอซี Arduino เบอร์ ATMEGA328 6. ฟังก์ช่ัน Arduino ทใ่ี ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกที่ตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไมส่ ามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี pinMode(pin, mode) pin: หมายเลขขาที่ตอ้ งการเซตโหมด mode: INPUT, OUTPUT, INPUT_PULLUP 2. ฟังก์ช่ันส่งค่าลอจิกดิจิทลั ไปยงั ขาพอร์ต คา่ HIGH เป็นการส่งลอจิก 1 และค่า LOW เป็นการ ส่งลอจิก 0 ออกไปยงั ขาพอร์ต ซ่ึงฟังก์ชน่ั น้ีจะทางานไดจ้ ะตอ้ งมีการใชฟ้ ังก์ชน่ั pinMode ก่อน digitalWrite(pin, value) pin: หมายเลขขาท่ีตอ้ งการเขียนลอจิกออกพอร์ต value: HIGH or LOW
ใบงานที่ 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ท่ีเอาทพ์ ทุ พอร์ตเบ้ืองตน้ 73 3. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยดุ คา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาท่ี ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long delay(ms) ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long) 7. วงจรทใ่ี ช้ทดลอง วงจรเพ่ือใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 10k 7,20 ATMEGA328 VCC SW1 1 RST AVCC C1 R4-R7 0.1uF 220 LED1-LED4 USB to UART (TTL Level) R2,R3 3 D2 4 1k 2 D3 5 DTR D4 6 RXD D1(TXD) D5 11 TXD D0(RXD) +5V GND 3V3 X1 9 XTAL1 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.3-2 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป ARDUINO LED1-LED4 R1-R4 220 D2 D3 D4 D5 GND รูปที่ 4.3-3 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
START การทดลองท่ี 1 เขียนโปรแกรมไฟวง่ิ LED 4 ตวั ติดดบั เรียงกนั ไปโดยใหต้ ิดคร้ังละ 1 ตวั และที่เหลือดบั 8. การเขยี นโค้ดโปรแกรมควบคุม รูปที่ 4.3-5 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน ABCDE 74 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]F GH I J B ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี 1 D13 D12 1 การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลองD11 กาหนดค่าเริ่มต้นต่าง 3V3 D10 REFรูปที่ 4.3-4 การต่อลงบอร์ดทดลองD9 A0การต่อวงจรเพอื่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม ProteusD8 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 LED 2 LED 1 20 20 A 25 25 30 30 35 35 40 40 B LED 4 A 45 45 LED 3 50 50 55 55 60 60 ABCDE F GH I J
ใบงานท่ี 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ท่ีเอาทพ์ ทุ พอร์ตเบ้ืองตน้ 75 แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED1 2 2 #define LED2 3 3 #define LED3 4 4 #define LED4 5 5 void setup() 6{ 7 Serial.begin(9600); 8 pinMode(LED1,OUTPUT); 9 pinMode(LED2,OUTPUT); 10 pinMode(LED3,OUTPUT); 11 pinMode(LED4,OUTPUT); 12 } 13 void loop() 14 { 15 digitalWrite(LED1,HIGH); 16 digitalWrite(LED2,LOW); 17 digitalWrite(LED3,LOW); 18 digitalWrite(LED4,LOW); 19 delay(200); 20 digitalWrite(LED1,LOW); 21 digitalWrite(LED2,HIGH); 22 digitalWrite(LED3,LOW); 23 digitalWrite(LED4,LOW); 24 delay(200); 25 digitalWrite(LED1,LOW); 26 digitalWrite(LED2,LOW); 27 digitalWrite(LED3,HIGH); 28 digitalWrite(LED4,LOW); 29 delay(200); 30 digitalWrite(LED1,LOW); 31 digitalWrite(LED2,LOW); 32 digitalWrite(LED3,LOW); 33 digitalWrite(LED4,HIGH); 34 delay(200); 35 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ท่ี 1-4 กาหนดชื่อ LED1, 2, 3, 4 ใหแ้ ทน 2, 3, 4, 5 (เป็นขาท่ี LED ตอ่ อยกู่ บั Arduino) - บรรทดั ที่ 7 กาหนดอตั ราเร็วของการส่ือสารของพอร์ตอนุกรม (กาหนด Baud rate) - บรรทดั ที่ 8-11 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็นเอาตพ์ ุทพอร์ต - บรรทดั ท่ี 15 ส่งลอจิก 1 ออกพอร์ตท่ีใชช้ ่ือวา่ LED1 - บรรทดั ท่ี 16 ส่งลอจิก 0 ออกพอร์ตท่ีใชช้ ่ือวา่ LED2 - บรรทดั ท่ี 17 ส่งลอจิก 0 ออกพอร์ตท่ีใชช้ ่ือวา่ LED3 - บรรทดั ที่ 18 ส่งลอจิก 0 ออกพอร์ตท่ีใชช้ ่ือวา่ LED4 - บรรทดั ท่ี 19 หน่วงเวลา 200 mS (1/5 วนิ าที) ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอ่ืน ๆ แลว้ สังเกตผล
76 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] การทดลองท่ี 2 เขียนโปรแกรมไฟวิ่ง LED 4 ตวั ติดดบั เรียงกนั ไปโดยให้ติดคร้ังละ 1 ตวั และท่ีเหลือดบั เช่นเดียวกบั การทดลองท่ีหน่ึง แตใ่ ชว้ ธิ ีการเขียนฟังกช์ นั่ รองชนิดรับค่าแต่ไมส่ ่งคืนค่าข้ึนใชง้ านเอง ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START A B LED 3 กาหนดคา่ เริม่ ต้นต่าง LED 1 LED 4 LED 2 B A แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 char LED_pin[] = {2,3,4,5}; 2 void send2port(byte data); 3 void setup() 4{ 5 Serial.begin(9600); 6 for(char i=0;i<4;i++) 7{ 8 pinMode(LED_pin[i],OUTPUT); 9} 10 } 11 void loop() 12 { 13 send2port(0B1000); 14 delay(200); 15 send2port(0B0100); 16 delay(200); 17 send2port(0B0010); 18 delay(200); 19 send2port(0B0001); 20 delay(200); 21 } 22 void send2port(byte data) 23 { 24 if (data & 1 ){digitalWrite(LED_pin[0],HIGH);} else {digitalWrite(LED_pin[0],LOW);} 25 if (data & 2 ){digitalWrite(LED_pin[1],HIGH);} else {digitalWrite(LED_pin[1],LOW);} 26 if (data & 4 ){digitalWrite(LED_pin[2],HIGH);} else {digitalWrite(LED_pin[2],LOW);} 27 if (data & 8 ){digitalWrite(LED_pin[3],HIGH);} else {digitalWrite(LED_pin[3],LOW);} 28 } รายละเอยี ดโค้ดโปรแกรม - บรรทัดท่ี 1 ประกาศตวั แปรแบบอาร์เรยช์ ่ือ LED_pin และกาหนดค่าเป็ น 2, 3, 4, 5 (เป็ นขาท่ี LED ต่ออยกู่ บั Arduino)
ใบงานท่ี 4.3 การเขียนโปรแกรมใชง้ านพอร์ตทาหนา้ ท่ีเอาทพ์ ทุ พอร์ตเบ้ืองตน้ 77 - บรรทัดท่ี 2 ประกาศรูปแบบ (Prototype) ของฟังกช์ นั่ รอง ซ่ึงเป็ นฟังกช์ น่ั ใหท้ าหนา้ ที่รับค่าที่ส่ง มาจากฟังกช์ นั่ หลกั แลว้ คานวณเพ่ือส่งลอจิกออกพอร์ต - บรรทดั ท่ี 5 กาหนดอตั ราเร็วของการสื่อสารของพอร์ตอนุกรม (กาหนด Baud rate) - บรรทดั ท่ี 6-9 กาหนดโหมดใหก้ บั ขาพอร์ตทางานเป็ นเอาตพ์ ทุ พอร์ต โดยใชค้ าส่งั for ในการวน ทาซ้า - บรรทดั ที่ 14 หน่วงเวลา 200 mS (1/5 วนิ าที) - บรรทัดท่ี 22-28 ฟังก์ชนั่ รองท่ีรับค่าเขา้ มาจากฟังก์ชน่ั หลกั ผ่านตวั แปร data แลว้ นาค่าเขา้ มา ตรวจสอบวา่ ควรจะตอ้ งส่งลอจิก 1 หรือลอจิก 0 ออกทางพอร์ตใด ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอื่น ๆ แลว้ สงั เกตผล 9. สรุปผลการปฏบิ ตั ิงาน 10. งานทม่ี อบหมาย 1. เขียนโปรแกรมไฟวง่ิ โดยใหม้ ีรูปแบบของไฟวง่ิ ไม่นอ้ ยกวา่ 4 รูปแบบแสดงผลเรียงกนั ไป โดยใชว้ งจรดงั รูป ARDUINO LED1-LED4 R1-R2420 D2 D3 D4 D5 GND รูปท่ี 4.3-6 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
78 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 2. เขียนโปรแกรมไฟวง่ิ ใชว้ งจร Arduino ท่ีตอ่ LED ท้งั หมดจานวน 8 ตวั โดยใหม้ ีรูปแบบของ ไฟวง่ิ ไมน่ อ้ ยกวา่ 4 รูปแบบแสดงผลเรียงกนั ไปในแต่ละรูปแบบโดยใชว้ งจรดงั รูป ARDUINO LED1-LED8 R1-R2820 D2 D3 D4 D5 D6 D7 D8 D9 GND รูปท่ี 4.3-7 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั 79 ใบงานท่ี 4.4 การเขยี นโปรแกรมรับค่าจากพอร์ตแบบดจิ ิทลั 1. จุดประสงค์ทวั่ ไป เพอื่ ใหส้ ามารถเขียนโปรแกรมรับคา่ จากพอร์ตแบบดิจิทลั ได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมรับคา่ จากพอร์ตแบบดิจิทลั ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพ่ือทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย 8 ตวั 2.1 ตวั ตา้ นทาน 220 ohm 4 ตวั 2.2 LED 3mm 4 ตวั 2.2 Tack Switch 3. บอร์ด Arduino Nano 3.0 1 ตวั 4. สายเช่ือมตอ่ USB (mini USB) 1 เส้น 5. สายเช่ือมตอ่ วงจร 1 ชุด 6. คอมพวิ เตอร์ 1 เครื่อง 4. ลาดับข้นั การปฏบิ ตั งิ าน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรที่กาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
80 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน บอร์ด Arduino รุ่นท่ีใช้ไอซีไมโครคอนโทรลเลอร์ ATMEGA328, ATMEGA168, ATMEGA8 มีพอร์ตดิจิทลั ให้สามารถเช่ือมต่อใช้งานได้ 14 ขาดว้ ยกนั โดยเริ่มจากขา D0, D1, …D13 (ขา D0, D1 สงวนไวด้ งั ท่ีไดก้ ล่าวมาแลว้ ในใบงานที่ 4.3) และมีพอร์ตแอนาลอกอีก 6 ขาคือ A0, A1, …A5 ที่สามารถ นามาใชง้ านในโหมดดิจิทลั ได้ ส่วน A6, A7 ที่มีอยใู่ นบอร์ด Arduino รุ่น Mini และ Nano จะใชง้ านได้ เฉพาะการรับสญั ญาณเขา้ ท่ีเป็นแอนาลอกเทา่ น้นั โหมดการทางานของพอร์ตที่ให้ทางานแบบดิจิทลั สามารถส่ังให้ทางานได้ 2 โหมดคือโหมด เอาทพ์ ุทและโหมดอินพุท ไมโครคอนโทรลเลอร์ท่ีใชใ้ น Arduino ส่วนใหญ่เป็ นตระกูล AVR มีขอ้ โดด เด่นอีกหน่ึงประการคือ มีตวั ตา้ นทานพูลอพั ท่ีมีค่า 20k อยภู่ ายในซ่ึงผูใ้ ชง้ านสามารถที่จะเลือกใชห้ รือไม่ ใชก้ ็ได้ เนื่องจากไมโครคอนโทรลเลอร์ AVR ท่ีนามาทาเป็ น Arduino สามารถขบั กระแสออกจากขา พอร์ตในโหมดดิจิทลั ไดม้ ากพอสมควรที่จะขบั LED ใหต้ ิดสวา่ งได้ ดงั น้นั การใชง้ านเพ่ือท่ีจะขบั โหลดท่ี เป็ น LED จึงสามารถต่อโดยตรงไดโ้ ดยไม่ตอ้ งใชไ้ อซีช่วยขบั กระแส ดว้ ยสาเหตุน้ีหากนามาขาพอร์ตมา ใชง้ านเป็ นอินพุทพอร์ตจึงตอ้ งเปล่ียนโหมดไม่ให้ไอซีจ่ายกระแสออกมา ในทางปฏิบตั ิเพื่อป้องกนั การ ผดิ พลาดจากการต่อใชง้ านหรือจากการเลือกโหมดเม่ือนาขาพอร์ตไปต่อกบั สวิตช์ ผูอ้ อกแบบวงจรควร ใชต้ วั ตา้ นทานค่าประมาณ 200 ohm อนุกรมกบั สวติ ชเ์ พื่อป้องกนั พอร์ตเสียหาย 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: หมายเลขขาที่ตอ้ งการเขียนลอจิกออกพอร์ต
ใบงานท่ี 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั 81 3. ฟังก์ชั่นอ่านค่าลอจิกดิจิทลั ท่ีขาพอร์ต เป็นการอ่านค่าเขา้ มาซ่ึงอาจนามาเก็บไวใ้ นตวั แปรไว้ ตรวจสอบลอจิกทีหลงั หรือจะตรวจสอบลอจิกแบบทนั ทีก็ได้ ฟังก์ชน่ั น้ีจะทางานไดต้ อ้ งมี การใชฟ้ ังกช์ น่ั pinMode ก่อน digitalRead(pin); pin: หมายเลขขาพอร์ตที่ตอ้ งการอ่านลอจิก ตวั อย่างเช่น value=digitalRead(10); หมายถึง อ่านคา่ ลอจิกท่ีขา D10 มาเก็บไวใ้ นตวั แปร value if(digitalRead(10)= =LOW) หมายถึง ตรวจสอบขา D10 วา่ เป็นลอจิก 0 หรือไม่ 4. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ชั่นหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาท่ี ตอ้ งการหยุดคา้ ง ตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่ใส่ ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long 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)
82 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 7. วงจรทใ่ี ช้ทดลอง วงจรเพ่อื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีที่ใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit 1R01k 7,20 ATMEGA328 VCC SW1 R1-R3 LED1-LED3 1 RST AVCC D2 4 220 C1 D3 5 0.1uF D4 6 USB to UART (TTL Level) R2,R3 3 D5 11 1k 2 DTR VCC RXD D1(TXD) TXD D0(RXD) Internal pull up +5V GND R4-R7 SW1 3V3 220 x4 D9 15 D10 16 SW2 D11 17 SW3 X1 9 XTAL1 D12 18 SW4 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปท่ี 4.4-1 วงจรท่ีใชไ้ อซี AVR ในการทดลอง กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป R12-2R04 LED1-LED4 ARDUINO VCC D2 D3 Internal pull up D4 D5 R5-R8 SW1 220 x4 D9 D10 SW2 D11 D12 SW3 GND SW4 รูปท่ี 4.4-2 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
F GH I J ใบงานท่ี 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั 8320 2025 2530 3035 3540 4045 45 50 50 55 55 60 60 F GH I J D12 1 D11การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง D10 D9 รูปที่ 4.4-3 การต่อลงบอร์ดทดลอง D8 5การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 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.4-4 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน 8. การเขยี นโค้ดโปรแกรมควบคุม การทดลองที่ 1 เขียนโปรแกรมการติดดบั ของ LED จานวน 2 ตวั ใชส้ วิตช์ 4 ตวั ควบคุม โดยให้ SW1 ส่ัง LED1 ติด SW2 สั่ง LED1 ดบั และให้ SW3 สงั่ LED2 ติด SW4 สงั่ LED2 ดบั ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดคา่ เริ่มต้นต่าง SW1 กู กด จริง LED1 ติด เทจ็ จริง LED1 ดบั จริง LED2 ติด SW2 กู กด จริง LED2 ดบั เทจ็ SW3 ูกกด เท็จ SW4 กู กด เท็จ
84 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED1 2 2 #define LED2 3 3 #define SW1 9 4 #define SW2 10 5 #define SW3 11 6 #define SW4 12 7 void setup() 8{ 9 pinMode(LED1,OUTPUT);pinMode(LED2,OUTPUT); 10 pinMode(SW1,INPUT_PULLUP);pinMode(SW2,INPUT_PULLUP); 11 pinMode(SW3,INPUT_PULLUP);pinMode(SW4,INPUT_PULLUP); 12 } 13 void loop() 14 { 15 if(digitalRead(SW1)==LOW) 16 digitalWrite(LED1,HIGH); 17 else if(digitalRead(SW2)==LOW) 18 digitalWrite(LED1,LOW); 19 else if(digitalRead(SW3)==LOW) 20 digitalWrite(LED2,HIGH); 21 else if(digitalRead(SW4)==LOW) 22 digitalWrite(LED2,LOW); 23 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-2 กาหนดช่ือ LED1, 2 ใหแ้ ทน 2, 3 (เป็นขาที่ LED ตอ่ อยกู่ บั Arduino) - บรรทดั ท่ี 3-6 กาหนดชื่อ SW1, 2, 3, 4 ใหแ้ ทน 9, 10, 11, 12 (เป็นขาท่ีสวติ ชต์ ่ออยกู่ บั Arduino) - บรรทดั ที่ 9 กาหนดโหมดใหก้ บั ขาพอร์ตที่ตอ่ กบั LED ทางานเป็นเอาตพ์ ทุ พอร์ต - บรรทดั ท่ี 10,11 กาหนดโหมดใหข้ าพอร์ตท่ีตอ่ กบั สวติ ช์ทางานเป็นอินพทุ พอร์ตที่ใชต้ วั ตา้ นทาน พลู อพั ภายในตวั ไอซีซ่ึงมีค่าประมาณ 20 กิโลโอห์ม - บรรทดั ที่ 15 ตราจสอบวา่ สวติ ชท์ ี่ต่อกบั ขาพอร์ตท่ีช่ือวา่ SW1 ถูกกดหรือไม่ (เมื่อถูกกดขาพอร์ต จะเป็นลอจิก 0) - บรรทัดท่ี 16 หากสวิตช์ SW1 ถูกกดให้ส่งลอจิก 1 ออกทางขาพอร์ตท่ีใช้ช่ือว่า LED1 เพื่อให้ LED ติดสวา่ ง - บรรทดั ท่ี 17 หากการตรวจสอบเง่ือนไขในบรรทดั ท่ี 15 ผดิ เง่ือนไขใหท้ าการตราจสอบวา่ สวิตช์ ท่ีต่อกบั ขาพอร์ตที่ชื่อวา่ SW2 ถูกกดหรือไม่ - บรรทัดท่ี 18 หากสวิตช์ SW2 ถูกกดให้ส่งลอจิก 1 ออกทางขาพอร์ตท่ีใช้ช่ือว่า LED1 เพื่อให้ LED ดบั ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอ่ืน ๆ แลว้ สังเกตผล
ใบงานท่ี 4.4 การเขียนโปรแกรมรับค่าจากพอร์ตดิจิทลั 85 การทดลองที่ 2 เขียนโปรแกรมควบคุมการติดดบั ของ LED โดยเม่ือ SW1 ถูกกดให้ LED1 ติด SW2 ถูก กดให้ LED2 ติด SW3 ถูกกดให้ LED3 ติด SW4 ถูกกดให้ LED ดบั ทุกตวั และในขณะที่กดสวิตช์ตอ้ งมี การแสดงขอ้ ความแสดงว่าสวิตช์น้ัน ๆ ถูกกดและสถานะของการติดดบั ของ LED และให้เขียนโค้ด ตรวจจบั การปล่อยคียก์ ่อนที่จะออกนอกลูป ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี START กาหนดค่าเริม่ ต้นต่าง SW1 กู กด จริง LED1 ตดิ แสดงข้อความ SW1 ปล่อยการกด เท็จ จริง LED2 ติด แสดงข้อความ SW1 ปล่อยการกด จริง LED3 ตดิ แสดงข้อความ SW1 ปล่อยการกด SW2 กู กด จริง LED ดับทัง้ หมด แสดงข้อความ SW1 ปล่อยการกด เทจ็ SW3 กู กด เทจ็ SW4 กู กด เทจ็ แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino 1 #define LED1 2 2 #define LED2 3 3 #define LED3 4 4 #define SW1 9 5 #define SW2 10 6 #define SW3 11 7 #define SW4 12 8 void setup(){ 9 pinMode(LED1,OUTPUT);pinMode(LED2,OUTPUT); 10 pinMode(LED3,OUTPUT); 11 pinMode(SW1,INPUT_PULLUP);pinMode(SW2,INPUT_PULLUP); 12 pinMode(SW3,INPUT_PULLUP);pinMode(SW4,INPUT_PULLUP); 13 Serial.begin(9600); 14 } 15 void loop(){ 16 if(digitalRead(SW1)==LOW){ 17 digitalWrite(LED1,HIGH); 18 Serial.println(\"SW1 is pressed & LED1 ON\"); 19 while(digitalRead(SW1)==LOW); 20 } 21 else if(digitalRead(SW2)==LOW){ 22 digitalWrite(LED2,HIGH); 23 Serial.println(\"SW2 is pressed & LED2 ON\"); 24 while(digitalRead(SW2)==LOW); 25 } 26 else if(digitalRead(SW3)==LOW){ 27 digitalWrite(LED3,HIGH); 28 Serial.println(\"SW3 is pressed & LED3 ON\"); 29 while(digitalRead(SW3)==LOW); 30 } 31 else if(digitalRead(SW4)==LOW){ 32 digitalWrite(LED1,LOW); 33 digitalWrite(LED2,LOW);
86 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 34 digitalWrite(LED3,LOW); 35 Serial.println(\"SW4 is pressed & All LED is OFF\"); 36 while(digitalRead(SW4)==LOW); 37 } 38 } รายละเอยี ดโค้ดโปรแกรม - บรรทดั ที่ 1-3 กาหนดชื่อ LED1, 2, 3 ใหแ้ ทน 2, 3, 4 (เป็นขาท่ี LED ตอ่ อยกู่ บั Arduino) - บรรทดั ท่ี 4-7 กาหนดช่ือ SW1, 2, 3, 4 ใหแ้ ทน 9, 10, 11, 12 (เป็นขาท่ีสวติ ชต์ อ่ อยกู่ บั Arduino) - บรรทดั ที่ 9,10 กาหนดโหมดใหก้ บั ขาพอร์ตที่ต่อกบั LED ทางานเป็นเอาตพ์ ุทพอร์ต - บรรทัดท่ี 11,12 กาหนดโหมดให้กบั ขาพอร์ตท่ีต่อกบั สวิตช์ทางานเป็ นอินพุทพอร์ตท่ีใช้ตวั ตา้ นทานพลู อพั ภายในตวั ไอซีซ่ึงมีค่าประมาณ 20k - บรรทดั ท่ี 13 กาหนดอตั ราเร็วในการสื่อสารขอ้ มูลของพอร์ตอนุกรม - บรรทดั ท่ี 16 ตราจสอบวา่ สวติ ชท์ ี่ต่อกบั ขาพอร์ตท่ีชื่อวา่ SW1 ถูกกดหรือไม่ (เม่ือถูกกดขาพอร์ต จะเป็นลอจิก 0) - บรรทัดท่ี 17 หากสวิตช์ SW1 ถูกกดให้ส่งลอจิก 1 ออกทางขาพอร์ตที่ใช้ชื่อว่า LED1 เพ่ือให้ LED ติดสวา่ ง - บรรทดั ท่ี 18 ส่งขอ้ ความไปแสดงผลที่จอคอมพวิ เตอร์ผา่ นพอร์ตอนุกรมโดยแสดงคาวา่ “SW1 is pressed & LED1 ON” - บรรทดั ที่ 19 วนตรวจสอบวา่ ยงั ถูกกดอยหู่ รือไม่หากยงั ถูกกดอยใู่ หว้ นตรวจสอบจนกวา่ จะมีการ ปล่อยสวติ ช์ - บรรทดั ท่ี 21 หากการตรวจสอบเงื่อนไขในบรรทดั ที่ 16 ผดิ เงื่อนไขใหท้ าการตราจสอบวา่ สวิตช์ ที่ต่อกับขาพอร์ตที่ชื่อว่า SW2 ถูกกดหรือไม่ ต่อจากน้ันกระบวนการเป็ นเช่นเดียวกับการ ตรวจสอบสวติ ช์ SW1 ทดลองการทางาน 1. จาลองการทางานดว้ ยโปรแกรม Proteus 2. ทดลองดว้ ยวงจรจริง 3. ทดลองแกโ้ ปรแกรมให้ LED ติดในรูปแบบอื่น ๆ แลว้ สงั เกตผล 9. สรุปผลการปฏบิ ัตงิ าน
ใบงานที่ 4.4 การเขียนโปรแกรมรับคา่ จากพอร์ตดิจิทลั 87 10. งานทม่ี อบหมาย 1. ดดั แปลงการทดลองท่ี 2 ใหใ้ ชว้ ธิ ีการตรวจการปล่อยสวติ ชค์ ร้ังเดียวดงั โฟลวช์ าร์ต START กาหนดค่าเริ่มต้นต่าง SW1 ูกกด จริง LED1 ตดิ แสดงข้อความ เท็จ จริง LED2 ตดิ แสดงข้อความ SW2 กู กด เทจ็ LED3 ตดิ แสดงข้อความ SW3 ูกกด จริง เทจ็ จริง LED ดบั ทั้งหมด แสดงข้อความ SW4 กู กด เท็จ เทจ็ ปล่อย SW แล้ว จริง 2. เขียนโปรแกรมควบคุมการติดดับของ LED พร้อมแสดงขอ้ ความสถานะของสวิตช์และ LED โดยเง่ือนไขใหส้ วติ ช์หน่ึงตวั ควบคุมการติดดบั ของ LED 1 ตวั ตวั อยา่ งเช่นสวติ ช์ SW1 กดคร้ังที่ 1 ให้ LED1 ติดเม่ือกดคร้ังท่ี 2 ให้ LED1 ดบั สลบั กนั ไปต่อเนื่องสวติ ช์ตวั อื่น ๆ ก็ ทางานเช่นกนั โดยใชส้ วติ ช์ 4 ตวั ควบคุมการติดดบั ของ LED จานวน 4 ตวั ใชว้ งจรดงั รูป ARDUINO R12-2R04 LED1-LED4 D2 D3 D4 D5 VCC Internal pull up R5-R8 SW1 220 x4 D9 SW2 D10 SW3 D11 SW4 D12 GND รูปที่ 4.4-5 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
88 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 3. เขียนโปรแกรมไฟวง่ิ จาก LED จานวน 4 ตวั โดยกาหนดรูปแบบของไฟวงิ่ จากสวติ ช์จานวน 4 ใชว้ งจรในการทดลองเช่นเดียวกบั ขอ้ 2 สาหรับรูปแบบของไฟว่ิงสามารถกาหนดข้ึนมา เองได้ ตวั อยา่ งของรูปแบบไฟวง่ิ LED 4 ตวั ดงั น้ี รูปแบบ ลกั ษณะการวงิ่ 1 2 3 4
ใบงานที่ 4.5 การเขียนโปรแกรมอา่ นคา่ จากพอร์ตแอนาลอกและการใช้ PWM 89 ใบงานที่ 4.5 การเขยี นโปรแกรมอ่านค่าจากพอร์ตแอนาลอกและการใช้ PWM 1. จุดประสงค์ทวั่ ไป เพ่อื ใหส้ ามารถเขียนโปรแกรมอา่ นค่าจากพอร์ตแอนาลอกและการใช้ PWMได้ 2. จุดประสงค์เชิงพฤติกรรม 1. บอกวธิ ีเขียนโปรแกรมอา่ นค่าจากพอร์ตแอนาลอกและการใช้ PWM ได้ 2. บอกข้นั ตอนการตอ่ วงจรเพอ่ื ทดลองบนบอร์ดทดลองได้ 3. ทดสอบการทางานของบอร์ด Arduino ได้ 4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด 3. เครื่องมือและอปุ กรณ์ 1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่ 2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 4 ตวั 2.1 Potentiometer 10k 1 ตวั 2.3 LED 3mm 1 ตวั 1 เส้น 2.2 ตวั ตา้ นทาน 220 ohm 4 ตวั 1 ชุด 1 เคร่ือง 3. บอร์ด Arduino Nano 3.0 4. สายเชื่อมต่อ USB (Mini USB) 5. สายเชื่อมต่อวงจร 6. คอมพิวเตอร์ 4. ลาดับข้นั การปฏบิ ตั ิงาน 1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเกี่ยวขอ้ ง 2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด 3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร 4. สรุปผลการปฏิบตั ิงาน
90 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 5. ทฤษฎพี ืน้ ฐาน บอร์ด Arduino รุ่นที่ใช้ไอซีไมโครคอนโทรลเลอร์ ATMEGA328, ATMEGA168, ATMEGA8 มีพอร์ตท่ีสามารถรับสัญญาณเขา้ ที่เป็ นสัญญาณแอนาลอกได้ 6 ช่อง ( 6 ขา) A0, A1, …A5 สาหรับบอร์ด ที่ใชไ้ อซีท่ีมีตวั ถงั DIP (ตวั ถงั ตีนตะขาบ) เช่นบอร์ดรุ่น UNO และสามารถรับสัญญาณได้ 8 ช่องสาหรับ บอร์ดที่ใช้ชิพไอซีท่ีมีตวั ถงั แบบ SMD (อุปกรณ์ผิวหนา้ ) เช่น บอร์ดรุ่น Mini และ Nano ส่วนบอร์ดรุ่น Mega มีช่องสญั ญาณที่สามารถสัญญาณแอนาลอกได้ 16 ช่อง ภายในตวั ซีพียมู ีโมดูลแปลงสัญญาณแอนา ลอกเป็ นดิจิทลั ขนาด 10 บิต ดงั น้นั เม่ืออ่านค่าเขา้ มาซีพียูจะแปลงค่าได้เป็ นค่าต้งั แต่ 0 จนถึง 1023 ท่ี ค่าแรงดนั ของสัญญาณแอนาลอกท่ีรับเขา้ มาอยใู่ นช่วง 0 ถึง 5 โวลต์ รูปที่ 4.5-1 ตาแหน่งขาและหนา้ ท่ีของซีพยี ู Arduino ชนิดตวั ถงั แบบ DIP รูปท่ี 4.5-2 ตาแหน่งขาและหนา้ ที่ของซีพียู Arduino ชนิดตวั ถงั แบบ SMD
ใบงานท่ี 4.5 การเขียนโปรแกรมอ่านคา่ จากพอร์ตแอนาลอกและการใช้ PWM 91 ขาพอร์ตแอนาลอกจะมีบางส่วนที่สามารถนาไปใช้งานแบบดิจิทลั ได้ นั่นก็หมายความว่า สามารถใชค้ าสั่ง digitalWrite( ), digitalRead( ) ไดเ้ หมือนกบั ขาดิจิทลั ปกติ ขาพอร์ตแอนาลอกที่นามาใช้ งานในโหมดดิจิทลั ไดม้ ีเพียง 6 ขาคือ A0, A1, …A5 ส่วน A6 และ A7 ของบอร์ดรุ่น Mini และ Nano ใช้ รับสญั ญาณเขา้ ที่เป็ นสัญญาณแอนาลอกเพยี งอยา่ งเดียว ดงั น้นั เม่ือใชง้ านในโหมดดิจิทลั การใชง้ านจะใช้ คาส่งั เดียวกนั กบั คาสงั่ ท่ีควบคุมขาดิจิทลั เพียงแตก่ ารระบุขาใชง้ านจะตอ้ งใส่ช่องขาสัญญาณวา่ A นาหนา้ เช่น pinMode(A0,OUTPUT); หมายถึงใหข้ า A0 ทางานในโหมดดิจิทลั ที่เป็นเอาทพ์ ตุ พอร์ต digitalWrite(A0,HIGH); หมายถึงใหเ้ ขียนลอจิก 1 ไปที่ขาพอร์ต A0 Arduino มีขาพอร์ตท่ีสามารถส่งสัญญาณออกแบบผสมสัญญาณทางความกวา้ งของพลั ซ์ได้ หรือ ท่ีเรียกวา่ PWM โดยบอร์ดที่ใชซ้ ีพียูเบอร์ Atmega168, Atmega328 (บอร์ดรุ่น UNO, Mini, Nano) มีขาท่ี สามารถส่งสัญญาณออกได้ 6 ขาคือ D3, D5, D6, D9, D10, และ D11 ความถี่ของสัญญาณ PWM จะมีค่า โดยประมาณที่ 490 Hz ส่วนค่าดิวติ้ไซเคิลสามารถใส่ค่าไดต้ ้งั แต่ 0-255 ใชส้ าหรับกาหนดค่าดิวต้ีไซเคิล ระหวา่ ง 0-100% ดงั รูป Pulse Width Modulation 0% duty cycle -> analogWrite(0); 50% duty cycle -> analogWrite(127); 5V 5V 0V 0V 20% duty cycle -> analogWrite(51); 75% duty cycle -> analogWrite(191); 5V 5V 0V 0V 30% duty cycle -> analogWrite(77); 100% duty cycle -> analogWrite(255); 5V 5V 0V 0V รูปที่ 4.5-3 รูปคล่ืน PWM จากฟังกช์ น่ั analogWrite ฟังกช์ น่ั ที่ส่งสญั ญาณออกยงั ขาเหล่าน้ีใชค้ าสง่ั analogWrite(3, 100); หมายถึงส่งสัญญาณ PWM ออกทางขา D3 โดยให้สัญญาณที่ ส่งออกน้นั ขนาดดิวต้ีไซเคิลท่ี 100 6. ฟังก์ช่ัน Arduino ทใี่ ช้งานในใบงาน 1. ฟังก์ชั่นกาหนดโหมดการทางานให้กบั ขาพอร์ต สามารถกาหนดไดท้ ้งั ขาดิจิทลั โดยใส่เพียง ตวั เลขของขา (0, 1, 2,…13) และขาแอนาลอกท่ีตอ้ งการใหท้ างานในโหมดดิจิทลั แต่การใส่ ขาตอ้ งใส่ A นาหนา้ ซ่ึงใชไ้ ดเ้ ฉพาะ A0, A1,…A5 ส่วนขา A6 และ A7 ไม่สามารถใชง้ านใน โหมดดิจิทลั ได้ รูปแบบของฟังกช์ นั่ เป็นดงั น้ี
92 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 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)
ใบงานที่ 4.5 การเขียนโปรแกรมอ่านคา่ จากพอร์ตแอนาลอกและการใช้ PWM 93 7. ฟังก์ช่ันอ่านสัญญาณแอนาลอก เป็นฟังกช์ น่ั ที่อา่ นสัญญาณแอนาลอกท่ีปรากฏอยูท่ ่ีขาพอร์ต แอนาลอกท่ีตอ้ งการอ่านน้นั ๆ คา่ ท่ีอ่านไดจ้ ะอยใู่ นช่วง 0-1023 สาหรับแรงดนั ของสัญญาณ แอนาลอกท่ี 0-5V ดงั น้นั ตอ้ งใชต้ วั แปรที่เป็น int สาหรับเก็บค่าที่อ่านได้ analogRead(pin) pin: ขาพอร์ตแอนาลอกที่ตอ้ งการอา่ นคา่ สัญญาณแอนาลอก ตวั อย่างเช่น int adc analogRead(0) หมายถึง อ่านสญั ญาณแอนาลอกที่ขา A0 นามาเกบ็ ในตวั แปร adc 8. ฟังก์ช่ันให้ขาพอร์ตส่งสัญญาณ PWM เป็นฟังกช์ นั่ ท่ีใหข้ าพอร์ตดิจิทลั ขา 3, 5, 6, 9, 10 และ 11 (ซ่ึงเป็ นขาที่ส่งสัญญาณ PWM ได)้ ส่งสัญญาณ PWM ออกตามค่าดิวติ้ไซเคิลท่ีกาหนด ดว้ ยความถี่ 490 Hz analogWrite(pin, value) pin: ขาพอร์ตดิจิทลั ที่ตอ้ งการส่งสัญญาณ PWM value: ค่าดิวติไ้ ซเคิลท่ีอยรู่ ะหวา่ ง 0 ถึง 255 ตวั อย่างเช่น analogWrite(3, 100); หมายถึงส่งสัญญาณ PWM ออกทางขา D3 โดยใหส้ ัญญาณ ท่ีส่งออกน้นั ขนาดดิวต้ีไซเคิลท่ี 100 ( ประมาณ 39.216 %) 9. ฟังก์ชั่นแปลงช่วงตัวเลข เป็ นฟังก์ชน่ั ทาหนา้ ท่ีเปลี่ยนแปลงค่าท่ีไดร้ ับจากตวั แปรจากช่วง ตวั เลขระหวา่ งค่าหน่ึงถึงอีกคา่ หน่ึงไปสู่ช่วงตวั เลขใหมท่ ี่ตอ้ งการ map(value, fromLow, fromHigh, toLow, toHigh) value: ตวั แปรที่ตอ้ งการอา่ นคา่ นามาเปล่ียนช่วงตวั เลข fromLow: ตวั เลขสเกลล่างสุดของค่าจากตวั แปร fromHigh: ตวั เลขสเกลสูงสุดของค่าจากตวั แปร toLow: ตวั เลขสเกลล่างสุดของคา่ ที่ตอ้ งการเปล่ียนไป toHigh: ตวั เลขสเกลสูงสุดของคา่ ที่ตอ้ งการเปลี่ยนไป ตัวอย่างเช่น int x map(y,0,1023,0,255) หมายถึง แปลงค่าที่อ่านจากตวั แปร y เก็บลงในตวั แปร x โดยที่ค่าตวั แปร y มีค่าอยู่ ในช่วง 0-1023 โดยใหแ้ ปลงคา่ ไปสู่ค่าใหม่ใหอ้ ยใู่ นช่วง 0-255
94 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร] 7. วงจรทใี่ ช้ทดลอง วงจรเพอ่ื ใชท้ ดลองในใบงานสามารถทาได้ 3 แนวทางคือ 1. วงจรไมโครคอนโทรลเลอร์ Arduino ที่สร้างเองจากไมโครคอนโทรลเลอร์ AVR 2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป 3. ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus กรณีท่ีใชว้ งจรที่สร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ท่ีลงบูตโหลดเดอร์เป็น Arduino เรียบร้อยแลว้ ต่อวงจรดงั รูป D1 VCC Peripheral circuit 1N5819 CPU circuit R1 7,20 ATMEGA328 10k VCC SW1 1 RST AVCC R4-R7 220 LED1-LED3 C1 D2 4 0.1uF (PWM)D3 5 D4 6 USB to UART (TTL Level) R2,R3 3 (PWM)D5 11 1k 2 D1(TXD) DTR D0(RXD) RXD TXD +5V GND 3V3 VCC X1 9 XTAL1 A5 28 10k 16MHz 10 XTAL2 C2,C3 GND 22pF 8,22 รูปที่ 4.5-4 วงจรที่ใชไ้ อซี AVR ในการทดลอง กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป ARDUINO R1-R4 LED1-LED4 D2 220 (PWM)D3 D4 (PWM)D5 VCC A5 10k GND รูปท่ี 4.5-5 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338