บทความ

กำลังแสดงโพสต์ที่มีป้ายกำกับ แกะเกา Arduino by Appsofttech

ARDUINO "Hack pinMode"

รูปภาพ
ARDUINO “ แกะฟังก์ชัน pinMode” ประจิน พลังสันติกุล                 เกิดอะไรขึ้นเมื่อเราเรียกใช้งานคำสั่ง pinMode() ก่อนอื่นเรามาดูฟังก์ชัน pinMode() กันก่อนครับ คำสั่ง pinMode จะอยู่ในโฟลเดอร์ “C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino” ไฟล์ wiring_digital.c void pinMode(uint8_t pin, uint8_t mode) {                 uint8_t bit = digitalPinToBitMask(pin);                 uint8_t port = digitalPinToPort(pin);                 volatile uint8_t *reg, *out;                 if (port == NOT_A_PIN) return;        ...

ผมนี่… ต้องพอยน์เตอร์เลย

รูปภาพ
คอลัมน์ "แกะเกา ARDUINO by APPSOFTTECH" ผู้เขียน: Prajin Palangsantikul (www.appsofttech.com)         ถ้าเราเขียนโปรแกรมด้วย Arduino เราอาจไม่เคยรู้เลยว่าเกิดอะไรขึ้นกับรีจิสเตอร์บ้าง แล้วรีจิสเตอร์คืออะไร? นั้นไงครับเล่น Arduino แล้วรีจิสเตอร์ก็หายไปจากชีวิตเรา ง่ายขึ้นก็ต้องพึ่งพิงคนอื่นมากขึ้น(ฝรั่ง) เมื่อเกิดปัญหาเราก็มีหนทางเดียวคือ รอ.. แล้วก็รอ ไลบรารีบางตัวก็จำกัดการใช้งานของเรา เช่น กำหนดช่องทางอินพุตหรือเอาต์พุตตายตัว บางก็ต้องใช้กับฮาร์ดแวร์นี้ใช้กับฮาร์ดแวร์อื่นไม่ได้ เป็นต้น         OK ครับเรื่องนี้เราผ่านเรื่องนี้กันไปก่อน สิ่งที่ผมกำลังจะพูดถึงครั้งนี้คือเรื่องของ Pointer หรือตัวแปรพอยน์เตอร์ การเขียนโปรแกรมด้วย Arduino หรือ AVR บางครั้งเราก็แทบจะไม่ได้ใช้งานตัวแปรพอยน์เตอร์กันเลย (ถูกใช้เมื่องานนักยากจริง ๆ และต้องการจัดการหน่วยความจำ) สำหรับท่านที่อยากรู้จักตัวแปรพอยน์เตอร์อดใจรอกันนิดครับ หนังสือเล่มใหม่ของแอพซอฟต์แทคมีเรื่องนี้ที่ทำให้คุณเข้าใจได้ไม่อยากนัก ตารางที่ 7.1 แสดงรีจิสเตอร์ของ POR...

แสดงกราฟอย่างรวดเร็ว ไม่ต้องเขียนโค้ดแม้แต่บรรทัดเดียว

รูปภาพ
คอลัมน์ "แกะเกา ARDUINO by APPSOFTTECH" ผู้เขียน: Prajin Palangsantikul (www.appsofttech.com)         โดยปกติเวลาเราเขียนโปรแกรมไมโครคอนโทรลเลอร์ แล้วมีความจำเป็นที่ต้องการแสดงผลของข้อมูลในรูปแบบของกราฟเพื่อดูความสัมพันธ์ของมูลต่าง ๆ นั้น การแก้ไขปัญหาเพื่อนำข้อมูลมาแสดงเป็นกราฟ เราจะมีวิธีแก้ไขปัญหาอยู่ประมาณ 2-3 วิธี เช่น เก็บข้อมูลลงคอมพิวเตอร์ก่อนแล้วนำมาพล็อตกราฟด้วยโปรแกรมต่าง ๆ ที่มีความสามารถในการพล็อตกราฟ หาโปรแกรมที่สามารถพล็อตกราฟได้เลย และเขียนโปรแกรมขึ้นมาเพื่อพล็อตกราฟ การเลือกวิธีไหนก็ขึ้นอยู่กับความจำเป็นของงานแต่ละงาน         สำหรับคอลัมน์ “แกะเกา ARDUINO” ประจำวันนี้ เราขอนำเสนอโปรแกรมที่รับข้อมูลผ่านทางพอร์ตอนุกรมแล้วนำข้อมูลมาพล็อตกราฟได้ทันที ที่ชื่อว่า “SerialChart” เป็นโปรแกรมที่ใช้งานง่าย โดยกำหนดคอนฟิกให้กับโปรแกรม SerialChart จากนั้นก็เปิดใช้งานได้ทันที เมื่อมีข้อมูลมาการพล็อตกราฟก็จะปรากฎขึ้นทันที ถ้าเห็นว่ามีประโยชน์ก็ลองหามาติดเครื่องไว้ครับ ติดตาม SerialChar ได้ตาม link ข้างล่าง...

เพิ่มประสิทธิภาพให้ Arduino ง่าย ๆ ด้วยการจัดการหน่วยความจำ

รูปภาพ
คอลัมน์ "แกะเกา ARDUINO by APPSOFTTECH" ผู้เขียน: Prajin Palangsantikul (www.appsofttech.com)         การพัฒนางานบนไมโครคอนโทรลเลอร์สิ่งสำคัญอย่างหนึ่งที่เราต้องให้ความสำคัญไม่น้อยกว่าการลดความผิดพลาดของโค้ดโปรแกรม (Bug) นั่นคือ “การจัดการกับหน่วยความจำข้อมูล” หรือที่เราเรียกว่า หน่วยความจำแรม (SRAM ใน AVR)   จากรูป ** ทางด้านซ้าย (ผู้หญิงทานเค้ก) ใช้หน่วยความจำแรมไปในระหว่างการทำงานและเหลือหน่วยความจำให้เราใช้งานได้อีก 1755 ไบต์ ** ทางด้านขวา (ผู้หญิงทานผัก) ใช้หน่วยความจำแรมไปในระหว่างการทำงานและหรือหน่วยความจำให้เราใช้งานได้อีก 1789 ไบต์ ***ทั้งสองด้าน *** มีความแตกต่างกันของหน่วยความจำเท่ากับ 34 ไบต์ ทำไมถึงแตกต่างกันได้มากถึง 34 ไบต์ ทั้งที่กระบวนการทำงานของโค้ดเหมือนกันด้วยวิธีการประกาศใช้งานตัวแปรแตกต่างกันนิดเดียวดังนี้ // in SRAM (data) Memory (การประกาศของรูปทางซ้าย) const char AtoZ[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // in Flash (program) Memory (การประกาศของรูปทางขวา) PROGMEM prog_char AtoZ[] = "ABCDEFGHI...

ทดสอบประสิทธิภาพ AVR/Code & Arduino/Code

รูปภาพ
คอลัมน์ "แกะเกา ARDUINO by APPSOFTTECH" ผู้เขียน: Prajin Palangsantikul (www.appsofttech.com)        ในความเป็นจริงเรารู้กันอยู่แล้วครับว่า การเขียนโค้ดด้วย AVR/Code จะทำงานได้เร็วกว่าการเขียนโค้ดด้วย Arduino/Code การเปรียบเทียบนี้เรามองกันในเชิงประสิทธิภาพเท่านั้นนะครับ เพราะการเขียนโค้ดแบบ AVR/Code สิ่งเหล่านี้จะต้องแลกด้วยเวลาในการศึกษาเชิงลึกทางด้านไมโครคอนโทรลเลอร์ AVR และต้องเสียเวลาไปกับสิ่งเหล่านี้ แต่ถ้าต้องการความรวดเร็วทางเลือกด้วย Arduino/Code อาจเป็นหนทางที่ดี        จากรูปจะเห็นได้ว่าเมื่อเขียนด้วยโค้ด AVR/Code จะใช้เวลาในการทำงานเพียง 10062 มิลลิวินาที ซึ่งน้อยกว่าการเขียนโค้ดด้วย Arduino/Code ซึ่งใช้เวลา เท่ากับ 10080 มิลลิวินาที ในการวนลูปแสดงการติดดับของ LED 1 ดวงด้วยจำนวนการวนลูปเท่ากับ 5000 รอบ        สิ่งเหล่านี้ผู้พัฒนางานคงต้องเป็นคนตัดสินใจเองครับ ว่าจะเลือกทางไหน แต่สิ่งที่อยากจะบอกคือ "ความยืดหยุ่นของตัวเราเป็นสิ่งสำคัญและจำเป็นอย่างยิ่ง"    ...

เกิดอะไรขึ้นเมื่อเราเริ่มต้นจ่ายไฟให้กับบอร์ดไมโครคอนโทรลเลอร์ Arduino?

รูปภาพ
คอลัมน์ "แกะเกา ARDUINO by APPSOFTTECH" ผู้เขียน: Prajin Palangsantikul (www.appsofttech.com)         แน่นอนสิ่งที่เกิดขึ้นคือ ชุดคำสั่งที่อยู่ภายในฟังก์ชัน setup() จะถูกเรียกใช้งานก่อนเป็นลำดับแรก จากนั้นก็จะส่งการทำงานไปยังฟังก์ชัน loop() เพื่อที่จะวนลูปชุดคำสั่งนี้ตลอดการทำงานจนกว่าจะหยุดจ่ายไฟหรือรีเซตไมโครคอนโทรลเลอร์ใหม่อีกครั้ง ฟังก์ชัน setup() ถึงจะกลับมาทำงานใหม่อีกครั้งพร้อมกับเรียกฟังก์ชัน loop()         แต่สิ่งหนึ่งที่นักพัฒนาไมโครคอนโทรลเลอร์บน Arduino อาจลืมไป! ด้วยเหตุผลที่ไมโครคอนโทรลเลอร์ยังคงทำงานได้อย่างปกติ คือ ระหว่างที่คำสั่งต่าง ๆ ที่อยู่ภายในฟังก์ชัน loop() ยังคงทำงานนั้น ทุก ๆ 1024 ไมโครวินาที เราจะต้องสูญเสียเวลาเพื่อกระโดดไปนับเวลา (Timer0 Overflow) เพื่อให้นักพัฒนาโปรแกรมบน Arduino สามารถเรียกใช้งานฟังก์ชันที่เกี่ยวข้องกับเวลา เช่น millis() ได้อย่างราบรื่น         เมื่อรู้ถึงจุดนี้แล้วเราเหล่านักพัฒนาโปรแกรมบน Arduino จะทำอย่างไร? ก็อยู่ที่ท่า...