Posted on Leave a comment

การติดตั้ง Library (Arduino IDE)

ในการเขียนโปรแกรม เรามักต้องเรียกใช้ library ต่าง ๆ ดังนั้นในตอนนี้เรามาดูกันว่า การ ติดตั้ง library ให้กับ Arduino IDE ทำอย่างไร ก่อนอื่น เราต้องรู้ก่อนว่าเราจะใช้ library อะไร เช่น library ที่ช่วยในการสื่อสารกับ sensor ในตัวอย่างนี้เป็นการติดตั้ง library สำหรับติดต่อ หรือควบคุม sensor วันอุณหภูมิ ความชื่น และแรงดันอากาศ นั่นคือ BME280 เมื่อเรารู้ว่าเราจะติดตั้ง library สำหรับ sensor ตัวไหนแล้ว เราก็เริ่มทำการค้นหาและติดตั้งกันเลย

ขั้นแรก จากเมนูของ IDE ให้ไปที่ Tools -> Manage Libraries… หรือ กดที่รูปหนังสือที่ด้านซ้ายของ IDE จะมีช่องให้ค้นหาขึ้นมา

จากนั้นก็พิมพ์ key word ที่คิดว่าเกี่ยวกับ library ของเราแน่ ๆ ในที่นี้ก็คือ BME280 จะเห็นว่ามี library ที่เกี่ยวกับ BME280 ขึ้นมาหลายรายการ โดยมีชื่อ library ชื่อผู้ที่สร้าง library ขึ้นมา รายละเดียดเกี่ยวกับ library และ รุ่นของ library สิ่งที่เราต้องทำคือ ให้เราอ่านที่ รายละเอียดเกี่ยวกับ library ว่าใช่ที่เราต้องการหรือไม่ และผู้ที่สร้างขึ้นมาคือใคร แล้วเลือกที่เราไว้ใจได้ ในที่นี้จะเลือกของ Adafruit แล้วก็กด INSTALL ได้เลย 

หลังจากกด INSTALL แล้ว IDE อาจถามเราว่า จะลงแค่ library ตัวนี้ หรือตัวอื่นที่ต้องใช้ร่วมด้วย ให้เรากด INSTALL ALL ไม่อย่างนั้น อาจใช้งานไม่ได้ 

เมื่อติดตั้งเสร็จแล้ว ก็จะขึ้นว่า INSTALLED เราสามารถที่จะเปลี่ยนรุ่นของ library ได้ โดยการเลือก รุ่นแล้ว กด INSTALL อีกครั้ง หรือถ้าต้องการ uninstall หรือถอดการติดตั้ง ก็เลื่อน mouse ไปที่ INSTALLED มันก็จะเปลี่ยนเป็น UNINSTALL แล้วก็กดได้เลย มันก็จะถอดการติดตั้งออกให้ ก็เป็นอันว่าจบเรื่องการติดตั้ง library ลงใน Arduino IDE เพียงเท่านี้

สุดท้ายนี้ก็ต้องขอบคุณ Adafruit และ คนอื่น ๆ ที่สร้าง library ให้เราใช้ฟรี ๆ และถ้ามีโอกาสก็อยากให้สนับสนุนผู้ที่สร้างสิ่งนี้ให้เราใช้ฟรี ๆ ด้วย  ไม่ว่าจะเป็นการ donate หรือสนับสนุนสินค้าของเค้าก็ได้ จะได้เป็นกำลังให้คนเหล่านี้ทำสิ่งดี ๆ ให้พวกเราและสังคมต่อไป

อย่าลืมกด like ที่ page facebook เพื่อติดตามเรื่องราวใหม่ ๆ จากเรานะครับ

Posted on Leave a comment

Baud Rate กับ Bit Rate ต่างกันอย่างไร

หลายท่านอาจพอเข้าใจได้ว่า bit rate คืออะไร แต่แล้ว baud rate คืออะไร มันเหมือนกับ bit rate ไหม หรือต่างกันอย่างไร วันนี้เราจะมาดูความหมาย และลองเปรียบเทียบกันดูว่าเหมือนหรือต่างกันอย่างไร

Baud Rate

Baud หรือ baud rate คือจำนวนสัญญาณที่ส่งได้ใน 1 วินาที (เน้นว่า “สัญญาณ” นะครับ) โดยสัญญาณที่ว่านี้อาจเป็น ระดับแรงดันทางไฟฟ้า อาจเป็นความถี่ หรืออาจเป็น pattern หรืออะไรก็ได้ที่มีความหมายตรงกันสำหรับผู้ส่งและผู้รับ ถ้า ใน 1 วินาทีเราส่งได้ 5 สัญญาณ แสดงว่าเราส่งสัญญาณด้วยความเร็ว 5 สัญญาณต่อวินาที หรือ 5 baud

Bit Rate 

bit rate คือ จำนวนบิตที่ส่งได้ต่อวินาที (bit/s) สมมติว่า ใน 1 วินาที เราส่งข้อมูลได้ 5 bits เช่น “0” “1” “1” “0” “1” แสดงว่าเราส่งข้อมูลด้วยความเร็วที่ 5 bit/s หรือ 5 bps (bit per second)

ความสัมพันธ์

baud กับ bit rate อาจเท่ากันหรือไม่ก็ได้ เพื่อให้เข้าใจมากขึ้นลองพิจารณา 2 ตัวอย่างนี้ดูนะครับ

ตัวอย่างที่ 1

สมมติว่าการส่งข้อมูลในระบบ A เป็นการส่งข้อมูลผ่านสายไฟ โดยใช้ระดับแรงดันไฟฟ้าเป็นสัญญาณ และสัญญาณที่เป็นไปได้มีทั้งหมด 2 แบบคือ 0 V และ 5 V โดยทั้งฝ่ายผู้ส่งและผู้รับ เข้าใจความหมายตรงกันว่า 0V หมายถึงข้อมูล 0 และ 5V หมายถึงข้อมูล 1 ดังนั้น ถ้าต้องการส่งข้อมูล 4 bits “0101” ผู้ส่งก็ต้องส่งแรงดันไฟฟ้า 0V 5V 0V 5V ตามลำดับ ฝ่ายรับก็จะเข้าใจได้ว่า มีข้อมูล 4 bit ส่งมา คือ “0101”  ถ้าการส่ง 4 สัญญาณนี้ใช้เวลา 1 วินาที แสดงว่าระบบนี้ส่งสัญญาณด้วยความเร็ว 4 สัญญาณต่อวินาที หรือ 4 baud และถ้านับเป็น bit ก็จะได้ bit rate เท่ากับ 4 bit/s หรือ 4 bps นั่นเอง สังเกตว่า ตัวอย่างนี้ baud กับ bit rate มีค่าเท่ากัน

ตัวอย่างที่ 2

สมมติว่าการส่งข้อมูลในระบบ B เป็นการส่งข้อมูลผ่านสายไฟ โดยใช้ระดับแรงดันไฟฟ้าเป็นสัญญาณเหมือนระบบ A แต่ต่างกันตรงที่ ระบบ B มีสัญญาณหรือระดับแรงดันไฟฟ้าที่เป็นไปได้ทั้งหมด 4 แบบ คือ 0V 1V 2V และ 3V โดยทั้งฝ่ายผู้ส่งและผู้รับเข้าใจความหมายตรงกันว่าแรงดัน 0V หมายถึงข้อมูล “00” แรงดัน 1V หมายถึงข้อมูล “01” แรงดัน 2V หมายถึงข้อมูล “10” และแรงดัน 3V หมายถึงข้อมูล “11” ดังนั้น ถ้าระบบ B ต้องการส่งข้อมูล “0110”  ผู้ส่งต้องส่งแรงดันไฟฟ้า 1V 2V ตามลำดับ ผู้รับก็จะเข้าใจว่า มีข้อมูล “0110” ส่งมานั่นเอง แล้วถ้าสัญญาณทั้งสองนี้ใช้เวลาส่ง 1 วินาที แสดงว่าส่งสัญญาณด้วยความเร็ว 2 สัญญาณต่อวินาที หรือ 2 baud แล้วถ้านับเป็น bit rate ก็จะได้ 4 bps นั่นเอง สังเกตว่า ตัวอย่างนี้ baud กับ bit rate มีค่าไม่เท่า กัน

สรุป

เมื่อเราพูดถึง bit rate เรามักกำลังมองในมุมมองของข้อมูล ว่าเราส่งข้อมูลได้เร็วแค่ไหน โดยไม่สนใจว่าส่งอย่างไร หรือส่งทีละกี่บิต แต่เมื่อเราพูดถึง baud เรามักกำลังมองในมุมมองของสัญญาณที่ส่งในตัวกลาง ซึ่งอาจเป็นสายไฟ หรืออากาศ (ในกรณีที่เป็นแบบไร้สาย) ว่าเราส่งสัญญาณได้เร็วแค่ไหน โดยที่ไม่สนใจว่า 1 สัญญาณแทนข้อมูลกี่ bit อย่างไรก็ตามเราสามารถแปลงระหว่าง baud กับ bit rate ได้ หากเรารู้ว่า 1 สัญญาณแทนด้วยกี่ bit จะได้ bit rate = baud x (จำนวน bit ต่อ 1 สัญญาณ) นั่นเอง

ชวนคิด

จากตัวอย่างที่ 1 สงสัยหรือไม่ว่า ถ้าระบบต้องการส่ง “0011” แน่นอนว่า ผู้ส่งจะต้องส่ง 0V 0V 5V 5V ตามลำดับ แต่เนื่องจากไม่มีการเปลี่ยนแปลงของสัญญาณระหว่าง 0V ตัวแรก กับ 0V ตัวที่สอง และไม่มีการเปลี่ยนแปลงระหว่า 5V แรก กับ 5V ที่สองด้วยเช่นกัน แล้วผู้รับจะรู้ได้อย่างไรว่า ผู้ส่งกำลังส่ง “0011” หรือ ส่งแค่ “01” กันแน่

คำตอบคือ ไม่รู้ ดังนั้นเพื่อแก้ปัญหานี้ จึงต้องมีตัวช่วย เช่น มีสายสัญญาณเพิ่มมาอีกเส้น เพื่อบอกว่านี่เป็นข้อมูลตัวใหม่แล้วนะ ไม่ใช่ตัวเก่าแล้ว อย่างในระบบ synchronous serial communication หรือ ต้องมีการนัดแนะกันก่อนว่า เราจะส่งสัญญาณกันโดยที่แต่ละสัญญาณจะคงสภาพนั้นนานเท่าไร ถ้านานเกินกว่านั้นแปลว่า นี่เป็นสัญญาณตัวใหม่ที่เหมือนกับตัวก่อนหน้าอย่างในระบบ Asynchronous serial communication นั่นเอง

ศึกษาเพิ่มเติม

Posted on Leave a comment

Arduino Nano with Serial (ก้าวที่สอง)

หลังจากที่ผ่าน ก้าวแรก กันมาแล้ว คราวนี้มาทำความรู้จักกับอีกหนึ่ง function ที่สำคัญมากและใช้กันน่าจะทุกครั้งที่มีการเขียนโปรแกรมเลยทีเดียว นั่นคือ Serial ซึ่งเป็น function การสื่อสารผ่าน UART โดยในที่นี้จะเป็นการสื่อสารระหว่าง Arduino Nano กับ computer ผ่านทางสาย USB ที่ใช้ upload โปรแกรมนั่นเอง โดยส่งข้อมูลหรือสัญญาณเพื่อควบคุม Arduino Nano หรือให้ Arduino Nano ส่งข้อมูลกลับมาให้ computer โดยที่คราวนี้เราใช้ตัวอย่างที่มีอยู่ใน IDE ที่ชื่อว่า PhysicalPixel

อันดับแรกให้เปิด code ตัวอย่าง โดยไปที่ File -> Examples -> 04. Communication -> PhysicalPixel

แล้วลองอ่านในส่วนของ comment ดูจะพบว่า เป็น code ที่ควบคุมการเปิดปิด LED ที่ขา 13 ของ Arduino Nano ด้วยการส่ง H หรือ L จาก computer

Code ส่วนต่างๆ

การประกาศต่าง ๆ (พื้นที่ก่อนถึง setup())

มีการประกาศค่าตัวแปรสองตัว ตัวแรกคือ ledPin เป็นตัวแปร const (เปลี่ยนแปลงภายหลังจากที่ประกาศไม่ได้) ให้มีค่า 13 ก็คือหมายเลขของขาที่ต่อกับ LED

const int lidPin = 13;

ตัวที่สองคือ incomingByte คือตัวแปรที่ใช้เก็บข้อมูลที่ส่งมาจาก computer 

int incomingByte;

setup()

คำสั่งแรกใน setup() เป็นการสั่งให้เริ่มเชื่อมต่อกับ computer โดยกำหนด baud (ความเร็วในการส่งข้อมูล) ที่ 9600 baud

Serial.begin(9600);

การเริ่มการเชื่อมต่อนั้น เมื่อสั่งไปแล้วอาจต้องใช้เวลาสัก 2~3 วินาทีก่อนที่จะเชื่อมต่อเรียบร้อย จึงมักจะเขียนเป็นคำสั่งแรก ๆ

คำสั่งต่อมาน่าจะคุ้นเคยอยู่แล้ว นั่นคือกำหนดให้ขา 13 เป็น Output

pinMode(ledPin, OUTPUT);

loop()

คำสั่งแรกใน loop() เป็นการตรวจสอบว่า มีข้อมูลส่งเข้ามาหรือไม่ 

if (Serial.available() > 0)

ถ้ามีข้อมูลส่งเข้ามา ให้อ่านข้อมูลแล้วมาเก็บไว้ที่ ตัวแปร incommingByte ถ้าไม่มีก็วน loop มาตรวจสอบใหม่

incommingByte = Serial.read()

จากนั้นตรวจสอบว่า ข้อมูลที่อ่านเข้ามาคือ H หรือไม่

if (incommingByte == ‘H’)

ถ้าใช่ ก็ให้ส่ง High ออกไปที่ขา ledPin ถ้าไม่ใช่ก็ข้ามไป

digitalWrite(ledPin, HIGH);

จากนั้นตรวจสอบว่า ข้อมูลที่อ่านเข้ามาคือ L หรือไม่

if (incommingByte == ‘L’)

ถ้าใช่ก็ให้ส่ง Low ออกไปที่ขา ledPin แต่ถ้าไม่ใช่ก็ข้ามไป

digitalWrite(ledPin, LOW);

เมื่อทำเสร็จหมดแล้ว ก็กลับไปเริ่มที่คำสั่งแรกของ loop() อีกครั้ง

เมื่อเข้าใจ code แล้ว เราก็ลอง upload กันเลย จากนั้นก็กดที่ Serial monitor ที่มุมขวา (คล้ายแว่นขยาย) ก็จะได้หน้าต่าง Serial monitor ขึ้นมาด้านล่าง จากนั้นให้กำหนด baud ให้เป็น 9600 baud เหมือนที่เราตั้งไว้ใน code 

แล้วลอง พิมพ์ H ในช่อง Message แล้ว enter จะเห็นว่า LED ที่ Arduino Nano สว่างขึ้นมา ถ้ากด L แล้ว enter ก็จะดับไป คราวนี้ถ้าเป็น ตัวพิมพ์เล็กบ้างล่ะ จะเป็นอย่างไร ไม่มีการเปลี่ยนแปลงใช่ไหมล่ะครับ แล้วถ้ากดแป้นอื่น ๆ ดู จะเป็นอย่างไร ก็ไม่มีอะไรเปลี่ยนแปลงเหมือนเดิมใช่ไหม แสดงว่า การทำงานเป็นไปตามที่เราสั่งทุกอย่าง

ส่วนคำสั่งที่อยู่ใน comment ด้านล่างของ code เอาไว้ใช้กับโปรแกรม Processing หรือ Max/MSP อาจลองศึกษาเพิ่มเติมด้วยตัวเองดูนะครับ

สรุป

คราวนี้เราได้เรียนรู้การสื่อสารผ่านสาย USB โดยให้คำสั่งในกลุ่มของ Serial ซึ่งมีคำสั่งในกลุ่มนี้ที่น่าสนใจอีกหลายตัว ผู้อ่านสามารถศึกษาเพิ่มเติมได้จาก function reference ได้เลยนะครับ

แบบฝึกหัด

คราวนี้ลองคิดกันดูนะครับว่า 

  1. ถ้าอยากให้ใช้ h, l แทน H, L ล่ะ จะต้องปรับ code อย่างไร 
  2. ถ้าอยากให้ใช้ได้ทั้งตัวพิมพ์ใหญ่และพิมพ์เล็กต้องปรับ code อย่างไร ( guide: ลองศึกษาเรื่อง Boolean Operators ดูนะครับ)
  3. จากข้อ 2 ถ้าเราส่งตัวอักษรอื่นที่ไม่ใช่ทั้ง H, h, L หรือ l แล้วให้ Arduino Nano ส่งข้อความกลับมาที่ Serial monitor เพื่อบอกเราว่า ระบบรองรับแค่ H, h, L หรือ l เท่านั้นนะ จะต้องปรับ codeอย่างไร ( guide: ลองศึกษา function ในกลุ่มของ Serial เพิ่มเติมดูนะครับ)

ขอแนะนำว่า เวลาเขียน code ในระดับเริ่มต้นนี้ ยังไม่ต้องกังวลว่า code จะสวยหรือไม่ เร็วที่สุดหรือไม่ ใช้ memory น้อยที่สุดแล้วหรือไม่ ขอแค่ทำได้ตามที่เราต้องการ และอ่านเข้าใจง่าย ก็ถือว่าดีมากแล้ว เพียงเท่านี้ เราก็สามารถควบคุมการเปิดปิด LED ที่ต่อกับ Arduino Nano จาก computer ผ่านสาย USB ได้แล้ว ไม่ยากเลยใช่ไหมล่ะครับ

ศึกษาเพิ่มเติม

Posted on Leave a comment

Library (programming) คืออะไร

ในการเขียนโปรแกรม Library หมายถึง code ที่ถูกเขียนเตรียมไว้ โดยที่ programmer สามารถเรียกใช้งาน code ส่วนนี้ได้โดยไม่ต้องเขียนซ้ำ หรือไม่ต้องเขียนเอง เพียงแค่บอกกับ compiler ว่า ให้รวม code ที่อยู่ใน library เข้ามาใน code ของเราด้วย ซึ่งถ้าเป็นภาษา C/C++ ก็จะใช้คำสั่ง #include “filename” โดยที่ filename คือชื่อ file ที่มี code ที่เตรียมไว้

ดังนั้น library จึงมักเป็น code ที่มักถูกเขียนซ้ำๆ หรือ code ที่มีความซับซ้อน หรือ ต้องใช้ความรู้เฉพาะทาง เพื่อลดงานให้กับ programmer จึงได้มีการทำ code และนำมาจัดกลุ่มให้เข้าใจง่าย และสามารถเรียกใช้ได้ถ้าต้องการ เรียกว่า library นั่นเอง

Posted on Leave a comment

IDE: Integrated Development Environment คืออะไร

IDE หรือ Integrated Development Environment คือ software ที่รวมเอา software ที่จำเป็นในการเขียนโปรแกรมมาอยู่ในที่เดียวกัน นั่นคือ โดยปกติแล้วเวลาที่เราจะเขียนโปแกรมอะไรสักอย่างนั้น เราต้องใช้ software หลายตัวร่วมด้วยช่วยกัน เช่น 

  1. text editor คือ software ที่เราใช้เขียน code โดยใช้ software อะไรก็ได้ ที่เขียนตัวหนังสือลงไปได้
  2. compiler คือ software ที่ทำหน้าที่ แปลภาษาที่เราเขียน ซึ่งอาจเป็นภาษา c/c++ หรือภาษาอื่น ๆ ให้เป็นภาษาเครื่อง ที่ computer หรือ microcontroller เข้าใจ ซึ่ง compiler ก็มีหลายตัว ขึ้นอยู่กับว่าเราจะเขียนภาษาอะไร และ โปรแกรมที่เราเขียนนั้นจะไปใช้บนอะไร หรือ microcontroller ตัวไหน
  3. linker คือ software ที่ทำหน้าที่เชื่อม code ที่ compile แล้วเข้าด้วยกันในกรณีที่เราใช้ library 
  4. uploader หรือ programmer คือ software ที่ทำหน้าที่ upload code ที่ compile และ link เสร็จเรียบร้อยแล้ว ใส่เข้าไปใน microcontroller
  5. debugger คือ software ที่ทำหน้าที่ช่วยให้เราเห็น register หรือ memory หรือ สถานการณ์ทำงานของโปรแกรมที่เราเขียนว่าทำงานอย่างไร ช่วยให้เราหาจุดบกพร่องและแก้ปัญหาได้ง่ายขึ้น

ในบางระบบ อาจมีมากกว่าหรือน้อยกว่านี้บ้าง จะเห็นว่ากว่าจะเขียนโปรแกรมจนใช้งานได้นั้นมีขั้นตอน และ software ที่เกี่ยวข้องหลายตัว ดังนั้นเพื่อความสะดวกจึงได้มีการสร้าง software เพื่อรวมการเรียกใช้ software เหล่านี้เข้าด้วยกัน ซึ่งก็คือ IDE หรือ Integrated Development Environment นั่นเอง

Posted on Leave a comment

Microcontroller ก้าวแรก

หลังจากที่เราแนะนำ Arduino Nano คืออะไร มาก่อนหน้านี้แล้ว คราวนี้เราจะมาลองใช้กันจริง ๆ ว่าการใช้งานเป็นอย่างไร

สิ่งที่ต้องมี

  1. บอร์ดควบคุม Arduino Nano หรือ Arduino Nano compatible
  2. โปรแกรม Arduino IDE โดยใช้ version 1.8.19 หรือ version 2.x ก็ได้ แต่ในตัวอย่างจะใช้ 2.0.2 (IDE คืออะไร)
  3. สายเชื่อมต่อระหว่าง computer และ บอร์ดควบคุม

หลังจากรวบรวมสิ่งที่ต้องมีและ ติดตั้ง Arduino IDE ลงในคอมพิวเตอร์เรียบร้อยแล้ว อยากให้ลองสำรวจตัวโปรแกรมที่เพิ่งติดตั้งดูด้วยตัวเองคร่าว ๆ ก่อนว่ามีเมนูอะไรบ้าง ส่วนจะใช้งานอย่างไรนั้น เราจะค่อย  ๆ เรียนรู้ไปพร้อม ๆ กับการลงมือทำไปด้วยกันนะครับ

หลังจากลองสำรวจคร่าว ๆ แล้ว เราก็มาเริ่มกันเลย

  1. เริ่มแรกให้เปิดโปรแกรม Arduino IDE ขึ้นมา จะเจอกับหน้าว่าง ๆ ที่มี 2 ฟังก์ชั้นคือ setup() กับ loop()
  2. ต่อบอร์ด microcontroller เข้ากับ computer แล้วเลือก Arduino Nano ถ้าไม่มีให้เลือกให้ไปข้อ 3 ถ้ามีให้เลือกให้ไปที่ข้อ 4 ได้เลย
  3. กดที่เครื่องหมายสามเหลี่ยม เพื่อดูว่ามีอะไรบ้าง แล้วถอดสาย Arduino Nano สัก 5 วินาทีแล้วต่อกับ computer อีกครั้ง แล้วดูว่า มีอะไรหายไปตอนถอดและกลับเข้ามาตอนเสียบ ให้เลือกอันนั้น แล้วเลือก Arduino Nano แล้วกด OK (ตัว clone ให้เลือกเหมือนตัวจริง)
  4. ถ้าทุกอย่างเรียบร้อยดี เราจะได้ ชื่อ Arduino Nano และมีสัญลักษณ์ USB อยู่ข้างหน้า
  5. กดที่ลูกศร ซึ่งจะเป็นการ compile โปรแกรม และ upload โปรแกรมที่ compile แล้วไปใส่ใน Arduino Nano ระหว่างนั้น ตัว IDE ก็จะแสดง output ของการ compile และการ upload ที่หน้าต่าง output ส่วนที่ตัว Arduino Nano ก็จะเห็นว่ามี LED สว่างดวงเดียวนิ่งๆ ซึ่งก็ถูกแล้ว เพราะทั้งใน setup() และ loop() ไม่มีคำสั่งอะไร board ก็ไม่ทำอะไรนั่นเอง ส่วน LED ที่สว่างอยู่ดวงเดียวนั้น แสดงว่ามีไฟเลี้ยงบอร์ดอยู่เท่านั้นเอง ถ้าของใครมีปัญหา ขึ้นตัวแดงๆ ในหน้าต่าง Output ให้ไปข้อ 6 ถ้าไม่มีปัญหาให้ไปข้อ 7
  6. สำหรับคนที่ขึ้นตัวแดงว่า “avrdude: stk500_recv(): programmer is not responding” อาจเป็นเพราะว่าใช้ Bootloader คนละ version ให้ลองไปเปลี่ยนที่เมนู Tools -> Processor -> แล้วเลือก ATmega328P ตัวที่ยังไม่ได้เลือก แล้วกด compile และ upload อีกครั้ง
  7. ต่อไปจะเป็นการใส่โปรแกรมจริงๆลงไป โดยไปที่เมนู file -> examples -> 01_Basic -> Blink นี่เป็นการเปิด code ตัวอย่างขึ้นมา ตอนนี้ถึงจะขอให้ดูอะไรก็คงไม่สนใจแล้ว อยากกด compile และ upload กันแล้วใช่ไหมครับ (บางคนอาจกดแล้วด้วยซ้ำ) ถ้าอย่างนั้น กดเลยครับ!! เมื่อ upload เสร็จ เราจะเห็น LED ที่ บอร์ด Arduino Nano อีกดวงกะพริบเหมือนอย่างที่ชื่อบอก (Blink) เย้!!!! ถึงตอนนี้ เราสามารถถอดบอร์ด Arduino Nano ออกจาก computer แล้วนำไปต่อกับ charger หรือ power bank เพื่อจ่ายไฟเข้าบอร์ด แล้วเราก็จะเห็น LED กะพริบ นั่นคือโปรแกรมที่เรา upload เข้าไปเมื่อสักครู่ และมันจะอยู่จนกว่าจะ upload โปรแกรมอื่นลงไปใหม่นั่นเอง
  8. คราวนี้ให้เราลองสำรวจดูว่ามีอะไรใน Blink บ้าง จะเห็นว่า มีเนื้อหาแบ่งได้เป็นสองส่วนหลัก ๆ คือ ส่วนที่เป็นตัวหนังสือสีเทาที่อยู่ระหว่าง /* กับ */ หรือ อยู่หลัง //  ส่วนสีเทานี้เรียกว่า comment กับส่วนที่ไม่เป็นสีเทา เรียกว่า code โดยที่ส่วนที่เป็น comment เป็นส่วนที่เขียนไว้เพื่อให้คนอ่าน microcontroller จะไม่รับรู้ในส่วนนี้ microcontroller จะรับรู้เฉพาะส่วนที่เป็น code เท่านั้น คนที่เขียน code จะเขียน comment เพื่อสื่อสารกับคนอื่นว่า โปรแกรมนี้มีไว้เพื่ออะไร หรือแต่ละส่วนทำงานอย่างไร หรืออาจเขียนไว้เพื่อเตือนความจำตัวเองเฉย ๆ ก็ได้ ตัวอย่างของ Blink นี้ ในส่วนแรก ก็เป็น comment ที่บอกว่า code นี้ใช้ทำอะไร ใช้กับอุปกรณ์ตัวไหนได้บ้าง ใช้ port ไหนบ้าง ถูกเขียนขึ้นโดยใคร และเมื่อไร หรืออื่นๆที่อยากจะสื่อสารเลยครับ
  9. คราวนี้ลองมาดูในส่วนของ code กันบ้าง จะเห็นว่า แบ่งเป็นสองส่วน หรือ สองฟังก์ชั่น คือ setup() และ loop() ถ้าใครเคยอ่านเรื่อง Microcontroller ทำงานอย่างไร ก็คงจะพอเข้าใจว่ามันหมายถึงอะไร ทบทวนง่าย ๆ ก็คือ ส่วนที่เป็น setup() นั้นจะทำงานครั้งเดียว ในขณะที่ loop() นั้น จะทำงานซ้ำๆ ไปเรื่อยๆ ไม่มีวันจบ จนกว่าจะกด reset ระบบก็จะทำงานที่ setup() อีกครั้ง แล้วก็มาวนที่ loop() เหมือนเดิม โดยมีรายละเอียดดังนี้
    • setup() นั้นจะมีคำสั่งเดียว คือ pinMode(LED_BUILTIN, OUTPUT); นี่คือคำสั่งที่กำหนดให้ ขาที่ชื่อ LED_BUILTIN ทำหน้าที่เป็น OUTPUT เนื่องจากขานี้เป็นได้ทั้งขา INPUT (รับข้อมูลเข้ามา) หรือ OUTPUT (ส่งข้อมูลออกไป) ดังนั้นก่อนจะใช้งาน เราต้องกำหนดเสียก่อนว่าจะใช้เป็น INPUT หรือ OUTPUT จะเห็นว่า การกำหนดหน้าที่ให้ LED_BUILTIN เป็น OUTPUT นั้น เราสั่งครั้งเดียวก็พอ แล้วไม่ต้องสั่งอีก หลังจากนี้ก็แค่สั่งให้ output เป็น 1 (HIGH) หรือ เป็น 0 (LOW) แค่นั้น ดังนั้น การกำหนดให้ขานี้เป็น OUTPUT นั้นจึงเขียนไว้ใน setup() ก็เหมาะสมดีแล้ว แต่หาก เราอยากให้ขานี้เปลี่ยนเป็น OUTPUT บ้าง INPUT บ้าง เราก็ต้องนำไปเขียนใน loop() นั่นเอง แต่มักจะไม่ทำอย่างนั้นถ้าไม่จำเป็น มักจะหาขาอื่นเป็น input จะดีกว่า เพราะยิ่งคำสั่งมากขึ้น ก็ยิ่งซับซ้อนมากขึ้น มีโอกาสผิดพลาดมากขึ้น และเสียเวลามากขึ้น และอาจมีข้อจำกัดอื่น ๆ ที่ต้องระวังอีก code ที่ดีต้องอ่านแล้วเข้าใจง่าย
    • Loop() คำสั่งในนี้จะถูกเรียกซ้ำวนไปเรื่อยๆ
      • คำสั่งแรกคือ digitalWrite(LED_BUILTIN, HIGH); ถ้าอ่านจาก comment ด้านหลังคำสั่งนี้ก็คงเข้าใจได้ว่า เป็นการส่ง HIGH หรือ 1 ออกไปให้ LED ซึ่งก็จะทำให้ LED สว่างนั่นเอง
      • คำสั่งที่สองคือ delay(1000); คือให้ controller หยุดนิ่ง ไม่ทำอะไรเลยเป็นเวลา 1000 ms หรือ 1 วินาที
      • คำสั่งที่สามคือ dititalWrite(LED_BUILTIN, LO); ใช่ครับ คือสั่งให้ส่ง LOW หรือ 0 ออกไปให้ LED ก็จะทำให้ LED ดับนั่นเอง
      • คำสั่งที่สี่ คือ delay(1000); ก็ให้หยุดนิ่ง 1 วินาทีอีกครั้ง
  10. หลังจากที่คิดว่าเข้าใจคำสั่งต่างๆแล้ว ลองเปลี่ยนคำว่า LED_BUILTIN ทั้ง 3 ที่ ให้เป็น 13 แล้ว กด compile และ upload ดู จะเห็นว่า ผลเหมือนกัน นั่นคือ LED_BUILTIN คือ ขา 13 (D13) นั่นเอง ซึ่งถ้าเคยอ่านเรื่อง Arduino Nano คืออะไร ก็จะรู้ว่า จะมี LED ต่ออยู่กับขา D13 ของ board (D คือ Digital)

หวังว่า ผู้อ่านจะเห็นภาพรวมการเขียนโปรแกรมและ upload โปรแกรมลงบอร์ด Arduino Nano กันแล้วนะครับใครสนใจอยากรู้ว่า นอกจากคำสั่งในตัวอย่างนี้แล้ว มีคำสั่งอะไรให้ใช้บ้าง ลองเข้าไปดูรายละเอียดได้ที่ Language Reference ได้นะครับ

แบบฝึกหัด

สุดท้ายนี้อยากให้ลอง แก้ code ให้ LED กะพริบ โดยสว่างครึ่งวินาที และดับครึ่งวินาทีดูนะครับ หวังว่าจะสนุกนะครับ แล้วพบกันใหม่

แนวทางการเรียนรู้เพิ่มเติม

สิ่งสำคัญอย่างหนึ่งคือ ภาษาที่ใช้ในการเขียนโปรแกม ภาษา C/C++ เป็นภาษาที่ใช้กันมายาวนาน และน่าจะอยู่ไปอีกนานเช่นกัน โดยมีแหล่งความรู้มากมายให้เลือก เช่น w3schools หรือ ลองศึกษาจากตัวอย่างใน IDE เหมือนในตัวอย่างนี้ ซึ่งก็มีตัวอย่างที่น่าสนใจหลายอย่าง หรืออาจค้นหาตัวอย่างที่น่าสนใจใน internet ซึ่งมีให้เลือกมากมายเลยทีเดียว

Posted on Leave a comment

Firmware คืออะไร

Firmware คือโปรแกรมที่ฝังอยู่ที่ Hardware (หรือ เครื่องใช้ไฟฟ้า) ที่ทำให้ Hardware ทำงานได้ตามจุดประสงค์ที่ Hardware นั้นถูกสร้างขึ้น โดยไม่ต้องการ Software อะไรเพิ่ม เช่น เครื่องซักผ้า ไมโครเวฟ นาฬิกา เป็นต้น สิ่งเหล่านี้ก็จะมี โปรแกรมที่เรียกว่า Firmware คอยควบคุมให้ทำงานตามหน้าที่ของมัน

การที่เราเขียนโปรแกรมสั่งให้ Arduino Nano กะพริบ LED หรือ อ่านค่าของ sensor แล้วแสดงออกที่ display โปรแกรมนั้นก็คือ Firmware นั่นเอง

Posted on Leave a comment

Bootloader คืออะไร

BootLoader คือส่วนหนึ่งของ Firmware ที่ช่วยในการติดตั้ง Firmware ใหม่ให้กับ microcontroller ซึ่งถ้าไม่มี Bootloader เราก็ต้องติดตั้ง Firmware ลงใน microcontroller ด้วยอุปกรณ์ที่เรียกว่า programmer 

โดยขั้นตอนการทำงานของ Bootloader ก็คือ เมื่อจ่ายไฟให้กับ microcontroller มันก็จะเริ่มกำหนดค่า (config) ต่าง ๆ ให้ตัว microcontroller พร้อมทำงาน เช่น กำหนดความเร็วสัญญาณนาฬิกา กำหนด watchdog กำหนดความเร็วในการสื่อสารทาง serial port (baud rate) เป็นต้น หลังจากนั้นก็จะตรวจสอบว่าจะมีการส่ง Firmware ใหม่มาจาก computer หรือไม่ ถ้ามีก็รับ Firmware ใหม่มาติดตั้ง แล้วทำงานตาม Firmare ใหม่ หรือถ้าไม่มีก็จะทำงานตาม Firmware ที่ติดตั้งอยู่เดิม

Ref: //docs.arduino.cc/hacking/software/Bootloader

Posted on Leave a comment

Arduino Nano คืออะไร

หลังจากทำความรู้จัก Microcontroller น่าสนใจ ATmega328 กันไปแล้ว คราวนี้เราจะมาดูตัวอย่างการนำมาใช้งานกันบ้าง อย่างที่อาจรู้กันมาก่อนหน้านี้แล้วว่า microcontroller เป็น chip ตัวหนึ่ง มีขามากมาย แต่มันยังใช้ไม่ได้ ต้องนำมาต่อร่วมกับอุปกรณ์อย่างอื่น เพื่อช่วยกันทำงาน ในที่นี้จะยกตัวอย่างการนำมาใช้งานในการทำบอร์ดที่ใช้ในการพัฒนา (Development Board) หรือ บอร์ดควบคุม (Controller Board) โดย Development Board ที่ได้รับความนิยมมากตัวหนึ่งคือ Arduino Nano ซึ่งพัฒนาโดย บริษัท Arduino ประเทศอิตาลี แล้วที่ได้รับความนิยมอย่างมากก็น่าจะเป็นเพราะ เค้าทำเป็น Open Hardware คือเปิดเผยรายละเอียดในการทำ Board นี้ และยอมให้คนอื่นทำตามได้ จึงมีหลายบริษัททำตามโดยพยายามทำให้ต้นทุนต่ำออกมามากมาย (Arduino Nano Clone) ทำให้คนทั่วไปสามารถเข้าถึงอุปกรณ์ชนิดนี้ได้ง่ายขึ้น และมีการทำอุปกรณ์มารองรับกับ Arduino Nano ออกมามากมาย ทำให้มีตัวอย่างให้เรียนรู้มากมายใน internet โดยการที่เค้าทำแบบนี้ก็เป็นความตั้งใจที่จะให้คนทั่วไปสามารถเข้าถึงเทคโนโลยีเหล่านี้ได้ง่าย ซึ่งก็ต้องชื่นชมแนวคิดนี้อย่างมาก ทำให้ประชากรโลกที่มีรายได้ไม่มาก มีโอกาสที่จะเข้าถึงความรู้และเทคโนโลยีเหล่านี้ได้ง่ายขึ้น ใครที่อยากใช้ Arduino Nano Clone จากแหล่งผลิตที่เราเข้าถึงได้ ก็ไม่ต้องตะขิดตะขวงใจว่าเราจะไปสนับสนุนใครให้ละเมิดใครหรือเปล่า อย่างไรก็ตาม หากใครมีกำลังพอก็อยากให้ช่วยสนับสนุนสินค้าของ Arduino กันด้วยนะครับ จะได้เป็นกำลังให้กับบริษัทดี ๆ ช่วยกันทำงานเพื่อสังคมต่อไป

เรามาดูกันว่า บอร์ด Arduino Nano นั้นประกอบด้วยอะไรบ้าง

รูปด้านบน(ซ้าย) และรูปด้านล่าง(ขวา) ของ Arduino Nano

จากรูปจะเห็นว่าบนบอร์ดนั้นมีอุปกรณ์อยู่หลายตัวโดยขอแนะนำตัวสำคัญ ๆ ดังนี้

อุปกรณ์ที่อยู่ด้านบนของบอร์ด Arduino Nano เรียงจากบนลงล่าง

  • USB (micro) Port เชื่อมต่อกับ computer หรือแหล่งจ่ายไฟให้กับ board
  • ATmega328 นี่คือ microcontroller ที่เราพูดถึงก่อนหน้านี้นี่เอง
  • Crystal ทำหน้าที่กำเนิดสัญญาณให้ microcontroller ทำงานได้ตามจังหวะของสัญญาณ
  • Switch ทำหน้าที่ reset ตัว microcontroller
  • LED แสดงสถานการณ์ทำงาน เรียงจากซ้ายไปขวา
    • L: เมื่อมีการใช้งานขา D13 ของ Board
    • ON: เมื่อมีไฟจ่ายให้กับ microcontroller 
    • Rx: เมื่อมีการใช้งานขา Rx (D0) ของ Board ซึ่งเป็นขารับข้อมูลของ UART 
    • Tx: เมื่อมีการใช้งานขา Tx (D1) ของ Board ซึ่งเป็นขาส่งข้อมูลของ UART
  • ICSP (In Circuit Serial Programmer) ทำหน้าที่เป็นจุดเชื่อมต่อกับเครื่อง Programmer สำหรับการโปรแกรม microcontroller (ในกรณีที่ไม่ใช้ หรือไม่มี Bootloader)

อุปกรณ์ที่อยู่ด้านล่างของบอร์ด Arduino Nano เรียงจากบนลงล่าง

  • USB to UART ทำหน้าที่เปลี่ยนสัญญาณกลับไปมาระหว่าง USB (ซึ่งเป็นสัญญาณมาจาก computer) และ UART(ซึ่งเป็นสัญญาณจาก microcontroller) ทำให้ computer และ microcontroller สามารถสื่อสารกันได้
  • Voltage Regulator ทำหน้าที่แปลงไฟที่ส่งเข้ามาที่ขา Vin ของ board ให้เป็น 5V ก่อนที่จะส่งให้ microcontroller และอุปกรณ์อื่น ๆ

ส่วนตัวเล็ก ๆ อื่น ๆ จะเป็นตัวความต้านทานหรือตัวเก็บประจุซึ่งช่วยให้อุปกรณ์ที่กล่าวมาข้างต้นทำงานร่วมกันได้นั่นเอง

นอกจาก hardware ที่มองเห็นและจับต้องได้แล้ว Arduino Nano ยังมาพร้อมกับ Bootloader ที่ช่วยให้เราโปรแกรม ATmega328 โดยใช้แค่สาย USB เพื่อความสะดวกอีกด้วย

และทั้งหมดนี้ก็คือส่วนประกอบของ controller board ซึ่ง controller หรือ development board ทั่ว ๆ ไปก็จะมีองค์ประกอบพื้นฐานดังที่กล่าวมา หรืออาจน้อยกว่านี้ได้บ้างในกรณีที่ microcontroller บางตัวได้ใส่ความสามารถเหล่านี้รวมเข้าไปอยู่ในตัวของมัน เช่น microcontroller บางตัวก็รวมตัวกำเนิดสัญญาณนาฬิกาเข้าไว้ในตัว ทำให้ไม่จำเป็นต้องใช้ crystal หรือตัวกำเนิดสัญญาณภายนอก หรือ microcontroller บางตัวได้รวมตัวแปลงสัญญาณ USB ไว้ในตัวแล้ว ก็ไม่จำเป็นต้องต่อภายนอกอีก 

หวังว่าท่านผู้อ่านจะได้ไอเดียว่ามีอะไรอยู่บน Development board บ้าง ลองสังเกต Development board อื่นๆ ดูนะครับว่ามีอะไรบ้าง เหมือนหรือแตกต่างจากตัวนี้อย่างไรบ้าง

Posted on Leave a comment

Microcontroller น่าสนใจ ATmega328P

เราได้รู้จักไมโครคอนโทรลเลอร์ (microcontroller) ในแบบ concept มันมาพอสมควรแล้วจากเรื่อง Microcontroller คืออะไร?โครงสร้างของ microcontroller เป็นอย่างไร? และ Microcontroller ทำงานอย่างไร? คราวนี้เราลองมาทำความรู้จักกับ microcontroller ตัวเป็น ๆ กันดู โดยเรามาเริ่มที่ ATmega328P 

ทำไมเราควรเริ่มที่ตัวนี้ นั่นก็เพราะ microcontroller ตัวนี้ไม่ซับซ้อนมากนัก และเป็นที่นิยมมาช้านาน และถูกนำไปใช้บนบอร์ดที่ได้รับความนิยมมาก ก็คือ Arduino UNO และ Arduino Nano จึงมีตัวอย่างใน internet ให้เรียนรู้มากมาย และมีหลายบริษัทที่นำ microcontroller ตัวนี้มาทำบอร์ดควบคุมที่เข้ากันได้กับ Arduino Nano อยู่มากมายเช่นกัน ทำให้ราคาไม่สูงมากนัก เหมาะสำหรับผู้เริ่มต้นเรียนรู้และทำความเข้าใจเป็นอย่างยิ่ง

Block Diagram แสดงส่วนประกอบต่าง ๆ ของ microcontroller ATmega328P
ที่มา ATmega328P datasheet

จาก Block Diagram ในเอกสาร datasheet ของ ATmega328P จะเห็นว่ามีส่วนประกอบคล้าย ๆ กับที่เคยนำเสนอไปแล้วใน โครงสร้างของ microcontroller เป็นอย่างไร? แต่จะมีหลายส่วนเพิ่มเข้ามา เพื่อทำให้ ATmega328P มีความสามารถมากขึ้น เช่น 

  1. มีการสื่อสารแบบ SPI, TWI(I2C) เพิ่มขึ้นจาก UART ซึ่งเป็นพื้นฐานอยู่แล้ว ทำให้สื่อสารกับอุปกรณ์สมัยใหม่ไม่ว่าจะเป็น sensor หรือ display หรืออื่น ๆ ได้ง่ายขึ้น
  2. มี A/D converter ทำให้ติดต่อกับ อุปกรณ์ที่เป็น analog ได้ง่ายขึ้น
  3. มี Timer/Counter ซึ่งสามารถสร้าง สัญญาณ PWM ที่มักจะใช้ในการควบคุมความเร็วของ dc motor หรือ ความสว่างของ LED ได้ง่ายขึ้น
  4. มี Watchdog ที่ช่วยให้การทำงานของ microcontroller มีความน่าเชื่อถือได้มากขึ้น 

เพียงเท่านี้ก็พอจะนึกภาพออกแล้วใช่ไหมล่ะครับว่า ATmega328P นั้นสามารถนำไปใช้ในงานควบคุมได้หลากหลายมาก และสามารถรองรับความอยากรู้อยากเห็นของมือใหม่ได้อย่างแน่นอน นอกจากนี้มือเก๋าที่ต้องทำระบบที่ซับซ้อนก็ยังอาจจะแบ่งระบบออกเป็นระบบย่อยแล้วใช้เจ้าตัวเล็ก ๆ อย่างนี้ช่วยดูแลระบบย่อยแล้วรายงานผลไปยังศูนย์กลางเพื่อลดภาระงานของศูนย์กลางของระบบได้ดีอีกด้วย ส่วนการทำงานในแต่ละส่วนจะเป็นอย่างไรนั้น เราจะค่อย ๆ เรียนรู้กันในโอกาสต่อ ๆ ไปนะครับ