Archive

Archive for the ‘educational programming’ Category

การจัดการ Memory ของ Arduino [Arduino Memories]

Image

Arduino มี Memory อยู่ 3 ชนิดคือ

  • Flash หรือ Program Memory
  • SRAM
  • EEPROM

Flash Memory

   ใช้สำหรับการบันทึก Program Image และข้อมูลตั้งต้นต่าง  เราสามารถ run โปรแกรมจาก flash memory ได้แต่เราไม่สามารถแก้ไขข้อมูลใน flash memory จาก code ที่ทำงานอยู่ได้  หากต้องการแก้ไขข้อมูลเราจะต้องทำการสำเนาไปที่ SRAM 

Flash memory นั้นใช้เทคโนโลยีเดียวกันกับ thumb-drive และ SD cards ซึ่งเป็นแบบ non-volatile หมายถึง program หรือข้อมูลจะคงอยู่แม้ว่าจะไม่มีไฟหล่อเลี้ยงอยู่ก็ตามหรือมีลักษณะเหมือน hard disk  แต่มันก็มีข้อจำกัดในเรื่องจำนวนครั้งในการเขียนกล่าวคือเราจะเขียนหรือบันทึกข้อมูลลง flash memory ได้ประมาณ 100000 ครั้ง (100000 write cycle)   มากพอที่จะใช้งานสัก 10 – 20 ปีแหละครับ ( สมมติว่าเราเขียนลงบน flash memory 10 ครั้งต่อวันเราก็จะใช้เวลาประมาณ 27 ปีครับ

SRAM

     หรือ Static Random Access Memory นั้นสามารถอ่านหรือเขียนได้จากโปรแกรม code ที่ทำงานอยู่ SRAM นั้นถูกใช้ในหลายจุดประสงค์คือ

  • Static Data เป็นส่วนของ memory ที่กันไว้สำหรับ  global variable และ static variable ของโปรแกรมสำหรับตัวแปรที่ถูกกำหนดค่าเริ่มต้นเมื่อเริ่ม start ระบบจะทำการสำเนาค่าเริ่มต้นนั้นจาก flash memory มาใส่ให้
  • Heap เป็นส่วนที่เก็บข้อมูลแบบ dynamic หรือข้อมูลที่มีการ allocate ระหว่างที่โปรแกรมทำงาน  ส่วนของ Heap นั้นจะขยายจากส่วนบนของ static data ขึ้นไปโดยใช้ส่วนของ memory ที่ว่างไปเรื่อยในระหว่างที่มีการจองและใช้งานของโปรแกรมที่ทำงานอยู่
  • Stack เป็นส่วนของ memory ที่ใช้เก็บข้อมูลตัวแปรแบบ local และเก็บรายการ interrupts และ function call ต่างๆ memory ในส่วนของ stack จะขยายจากด้านบนสุดของ memory ลงมาหา Heap ดังนั้นทุก  ตัวแปร  รายการ interrupts และ function call นั้นจะทำให้ memory ส่วน stack ขยายลงมากเรื่อย  การ return จาก interrupt หรือจาก function call นั้นจะคืนพื้นที่ว่างให้กับ SRAM 

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

EEPROM

เป็น non-volatile memory อีกอันหนึ่งซึ่งสามารถอ่านและเขียนโดยโปรแกรม code ที่ทำงานอยู่แต่ข้อจำกัดของมันคือต้องอ่านทีละ byte ทำให้เวลาใช้งานยุงยากหน่อยและการอ่านก็ช้ากว่า SRAM นอกจากนี้ก็ยังมีข้อจำกัดในการเขียนที่ 100000 write cycle ( แต่การอ่านไม่จำกัด )

Image

Arduino Memory Comparison

ตารางด้านล่างแสดงถึงข้อเปรียบเทียบของจำนวน memory แต่ละชนิดของแต่ละ model ของ Arduino และ Arduino compatible board 

Image

     ครับ เรารู้รูปแบบของ Memory ต่าง ๆ กันคร่าวแล้ว ทำไงเราจะตรวจสอบว่า โปรแกรมที่เราเขียนนั้นใช้ Memory ไปเท่าไร หมายถึงอะไรเท่าไรนะครับ มีคำอธิบายต่อไปเรื่องการตรวจสอบ ใน ตอนต่อไปครับ  เรื่อง  การตรวจสอบการใช้ Memory ( Measuring Memory Usage )

ขอให้สนุกกับการ เรียนรู้นะครับ

ธีระพงษ์ สนธยามาลย์

วิธีการอ่าน PWM Signals จาก Receiver ด้วย Arduino ขั้นพื้นฐาน

เรามาเรียนรู้วิธีการอ่าน สัญญาณ PWM จาก Receiver กันครับ

จากที่เราทราบกัน นั้น ขาสัญญาณที่ใช้คบคุม servo นั้นส่งสัญญาณออกเป็น PWM และสามารถใช้ควบคุม servo ได้โดยตรง หากเราต้องการใช้สัญญาณนี้เราสามารถอ่าน จากขาสัญญาณเหล่านี้ได้ด้วย Arduino โดยตรง
IMG_20140425_222930

ภาพบนเป็นภาพลักษณะการใชงานทั่วไป ครับ เนื่องจาก board ที่เราจะใช้นั้นเป็น Arduino UNO จะมีขาสัญญาณ PWM อยู่สามารถอ่านค่าได้โดยตรง ด้วยคำสั่ง pulseIn(…) ดังนั้นเพื่อทำความเข้าใจ ก็จะลองทดสอบอ่านค่าจากขาสัญญาณ จาก receiver ด้วย Arduino ดูนะครับ

อุปกรณ์ที่จะใช้

เราจะใช้ขา pin 9 ต่อกับ ช่องสัญญาณที่หนึ่งของ Receiver ดังรูป แล้วให้ Power เข้าที่ ช่องสัญญาณที่ 6 แล้วเราลองทดสอบกันด้วยโปรแกรมสั้น ๆ ตามนี้ครับ

int ch1 ; // to keep channel values

void setup()
{
	pinMode(9,INPUT); // set out input pin as such 
	Serial.begin(9600); 
}

void loop()
{
	ch1 = pulseIn(9,HIGH,25000); // Read the pulse width of the channel
	Serial.print(“channel data : “); // print value of
	Serial.println(ch1) ; // the channel
	
	delay(100);
}

puleIn() function ต้องการ 3 arguments ตัวแรกก็คือ หมายเลข pin ที่เราต้องการให้สัญญาณ pulse เข้ามา ตัวที่่ 2 คือ pulse ‘HIGH’ หรือ ‘LOW’ ที่เรากำลังสนใจอยู่ และสุดท้ายก็เป็น เวลาที่เรากำหนดให้ function รออ่านค่า เรียกว่า time-out
ค่าที่ return ให้ของ puleIn() ก็คือ ความยาวของ pulse มีหน่วยเป็น microseconds และนี่ก็คือวิธีการอ่านสัญญาณ PWM ซึ่งเป็นวิธีเดียวกับที่ servo อ่านสัญญาณนี้
ค่าที่ได้เราให้แสดงออกทาง terminal เมื่อเราทำการประมวลผลโปรแกรมนี้เราควรจะได้ ตัวแสดงผลขึ้นมาที่หน้า terminal ตัวเลขนี้ค่าควรจะอยู่ระหว่าง 1000 – 2000 และเมื่อเราขยับ joy stick ที่เชื่อมโยงกับช่องสัญญาณนี้ ตัวเลขก็ควรจะเปลี่ยนแปลงให้เห็น

IMG_20140425_222939
ครับ เท่านี้ก็ถือว่า เป็นการทดสอบที่ สมบูรณ์ และสามารถใช้งาน ได้แล้ว  ในเรื่องนี้ยังไม่จบนะครับนี่เป็นจุดเริ่มต้นของการเรียนรู้ในขั้น Advance ต่อไปครับ

ธีระพงษ์ สนธยามาลย์

s.teerapong@gmail.com

ฝึกการเขียนโปรแกรม ด้วย Robo MIND ภาค #2

ครับต่อไปก็ไม่ต้องพล่ามกันแล้วครับ เราจะลองมา เขียนโปแกรมกับเจ้า RoboMind กันดูนะครับ หากใครยังไม่ทราบว่า บทความนี้เป็นอย่างไรมาอย่างไร ก็ขอให้ กลับไปดู ฝึกการเขียนโปรแกรม ด้วย Robo MIND ซึ่งเป็นตอนแรกของบทความนี้นะครับ สำหรับในส่วนนี้เราจะทำอะไรบ้าง ตามนี้นะครับ

  • Load and install RoboMind
  • Example progam

Load and install RoboMind

ครับเราก็จะload เจ้า RoboMind มาติดตั้งบนเครื่องของเราเสียก่อนนะครับก่อนที่เราจะสามารถเขียน code กัน ให้ไปตาม link นี้นะครับ http://www.robomind.net/en/download.html ให้เลือก

นะครับเพราะเราใช้ windows กันเป็นส่วนใหญ่ หากท่าน ใด ใช้ operating system ตัวอื่นก็เลือกเอาเลยครับ ตามที่เราใช้

หลักจาก load ลงเครื่องเราแล้ว ก็ double click บน file ที่เรา load มาได้แล้วนะครับ [ น่าจะชื่อ ว่า RobomindSetup2.x.exe อะไรประมาณนี้ ครับ แล้ว ] แล้วก็รอจนกว่ามันจะดำเนินการเสร็จ ก็จะได้โปรแกรม ลงบนเครื่องเราแล้ว ครั้งแรกมันอาจจะ run ขึ้นมาเลย หลังจาก ลงเสร็จแล้ว พร้อมกับโปรแกรม ตัวอย่างสั้น ๆ

เราลองมาพจารณาการใช้งานพร้อมกับ ดูตัวอย่างไปด้วยกันเลยนะครับ

Example progam

Example โปรแกรม ที่แสดงขึ้นมาพร้อมกับการ แสดงหน้าจอ RoboMind นั้นจะอยู่ช่องด้านซ้ายมือ ส่วนขวามือจะเป็นที่แสดง การทำงานของ เจ้า ROBO และโลกของ มันนะครับน่าจะได้ตามรูป นี้

และมี code ดังนี้ครับ

<pre># Draw a square
 paintWhite()
 repeat(4)
 {
     forward(2)
     right()
 }
 stopPainting()

ส่วนข้อความที่อยู่หลัง เครื่องหมาย ‘#’ เราไม่ต้องสนใจก็ได้นะครับ เพราะมันไม่ถูก นำไปหประมวลผลแต่อย่างได้ นอกจากเป็นการเขียน comment ไว้เป้นคำอธิบาย ครับ

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

เป็นเครื่องมือที่ช่วยให้เรา สั่งให้ code ที่เราเขียนทำงาน ครับ เพียงแค่คลิกที่ปุ่มที่ มี icon สีเขียว หากโปรแกรมไม่มีข้อผิดพลาดอะไร เจ้า ROBO มันจะทำงานตามคำสั่ง ทีละคำสั่งจากบนลงล่างครับ ถ้าเรา พิจารณาจาก code ด้านซ้ายมือนะครับ จะเป็นการสั่งให้เจ้า ROBO มันระบายสีเป็น สี่เหลี่ยม แล้วหยุด โดยที่ เคลื่อนที่ เป็น loop  4 รอบ แต่ละรอบ จะเเคลื่อนไปข้างหน้า 2 step แล้วหัน ขวา ทำให้เกิดเป็น สี่เหลี่ยมเกิดขึ้น ลอง run ดูแล้ว พิจาณาว่าได้ตมที่ผมพูดไหว้หรือป่าว ฮิ ฮิ เดี๊ยวจะหาว่าโม้ เพราะผม run ดูแล้ว

สุดท้านมันก็จะมาหยุดตามรูป ครับ

สังเกตุจากเครื่องมือ นอกจากมันจะสั่ง run ได้แล้ว มันก็ยังสามารถที่ สั่งหยุดระหว่างการทำงานได้ หรือหยุดชั่วคราวแล้ว runต่อก็ได้ สุดหท้ายก็สามารถที่จะ เร่งหรือลด speed ของการทำงานได้ด้วย แหม เจ๋งเป๋งเลยว่ามะ

เราสามารถดูตัวอย่างอื่น ๆที่เขามีมาให้ด้วย ก็ไป  คลิกที่ icon ตามรูปอยู่ด้านบนซ้ายนะครับ

แล้วจะได้หน้าต่างสำหรับการเลือก เปิดไฟล์ขึ้นมาครับ ลองเปิดและ run ดูนะครับ แล้วก็ลองดู code มันว่าพอเข้าใจใหม่นะครับ ในตอนสองนี้ผมยังคงไม่พูดถึงเรื่องการเขียน นะครับ แค่ดูว่า โปรแกรมมันทำอะไรได้บ้างอย่างไร ระหว่าง ที่เรา run โปรแกรมตัวอย่างเราก็ ลองดู function อื่น ดูนะครับว่ามีอะไรบ้างคราว ๆ

บนเมนู ด้านบนจะมีกลุ่มของ เมนูหลัก สำคัญอยู่ 2 กลุ่มคือ Edit และ View

    – Edit ใช้สำหรับการจัดการกับ code ตามรูปนะครับ ความสารถก็เหมือน Text Editor ทั่วไป  copy past select  ค้นหาและ วางแทน อะไรพวกเนี๊ยะก็พอมีให้สามารถแก้ไข code ได้ง่ายครับ

   – View ให้สำหรับจัดการกับ หาจอแสดงผลครับ ก็ zoom in , zoom out  กำหนดการแสดง grid การแสดง radar หรือให้ capture screen ก็ OK นะ

มาดูเพิ่มเติมอีกนิดนะครับ ในหน้า Editor มันจะมี line number ใหัเอาให้อ่าน code ง่าย และยังสามารถแสดง error ที่เกิดขึ้นที่ บรรทัดนั้น ๆ ครับ และแสดงได้ด้วยว่ามันมี error อะไร

ก็น่าจะเป็น ภาพทั้งหมดของเจ้า โปรแกรม RoboMind นะครับ เรื่องการเขียนไว้ต่อกันคราวหน้านะครับ เพราะมันยาวเกินไปแล้ว หากต้องการอ่านล่วงหน้าหรือดูการเขียน ก็เชิญท่านไปสัมผัสกับ ตัวอย่างที่เข้าเตรียมไว้ให้เลยนะครับ ตาม linke นี้เลย

Example scripts

– ส่วน เรื่อง คำสั่งต่าง ๆ หากต้องการอ่านเพิ่มเตอมก็เชิญตาม link นี้เลยครับ http://www.robomind.net/en/docProgrammingStructures.htm

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

s_teerapong2000@yahoo.com

teerapong Sontayaman

ฝึกการเขียนโปรแกรม ด้วย Robo MIND

สำหรับผู้ที่อยู่ในแวดวงการศึกษา บรรดาครูอาจารย์ทั้งหลาย ผู้ที่ต้องสอนการเขียนโปรแกรมให้กับ เด็ก ๆ ในระดับชั้นปฐม ถึง มัธยม หากต้องการหาเครื่องมือดี ๆ สำหรับช่วยสอนและสร้าง วิธีคิดในการเขียนโปรแกรม ลองมาดูโปรแกรมช่วยฝึกหัดวิธีการคิด และพัฒนาทักษะในการเขียนโปรแกรมที่ชื่อ Robo MIND กันสักนิด

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

มีสิ่งหนึ่งที่ผมพอสังเกตได้ก็คือ หากเรื่องหรือเนื้อหาที่เรา จัดมาสอนนั้นสนุกสนาน น่าสนใจแล้วละก็จัดการกับ เจ้าพวกลิงได้ชงัดนัก ฉะนั้นแล้ว ครูอาจารย์ทั้งหลาย ทางเลือกหนึ่งที่ท่านสามารถทำได้ และนำไปใช้ได้ ที่ผมมองเห็นก็เจ้า Robo MIND นี่แหละครับ

pictures from http://www.robomind.net

สำหรับเจ้า RoboMind นี้ เป็นโปรแกรมช่วยฝึกการเขียนโปรแกรมแบบ ง่าย ครับเหมาะสำหรับเด็กที่เริ่มฝึกเขียนโปรแกรม ในระดับชั้นปฐมถึงมัธยม นะครับ ก่อนที่เด็กเหล่านี้จะก้าว ไปเขียน programming language อย่างเช่น c หรือ pascal ต่อไป ในระดับที่สูงขึ้น

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

ผมกล่าวมาแค่นี้ ท่านที่กำลังอ่านอยู่ก็คงจะ Bingo แล้วใช่ไหมครับ มันยอดมากจริง ๆเอาละครับ ลองมาดูรายละเอียดกันหน่อย ครับว่าในบทความนี้จะมีอะไรกันบ้าง

  • เรื่องของ หน้าตา และเครื่องมือสำหรับการใช้งาน (development environments )
  • คำสั่งพื้นฐาน  (Basic instructions)
  • โครงสร้างของโปรแกรม (Programming structures)
  • ตัวอย่างโปรแกรม ครับ

หน้าตา และเครื่องมือสำหรับการใช้งาน (development environments )

โปรแกรม RoboMind นั้นสิ่งสำคัญก็คือ การเขียนคำสั่งและ ประมวลผลคำสั่ง ที่จะสั่งการ เจ้าหุ่ยน้อย หรือ เจ้า ROBO   หน้าตาโปรแกรมก็ง่ายๆ ครับ

หน้าจอด้านซ้าย จะเป็นหน้าต่างสำหรับการ เขียน code และหน้าจออีกด้านหนึ่งจะแสดงการทำงานของเจ้า ROBO ครับ เมื่อสั่งให้ run โดยการคลิกปุ่ม play โปรแกรมจะตรวจสอบ code ว่าถูกต้องหรือไม่ก่อน แล้วจึงทำงานให้

หน้าจอด้านซ้ายสำหรับการเขียน code นั้นเราเรียกว่า  Text Editor สว่นหน้าจอด้านขวาที่ใช้แสดงการทำงานนั้นเราเรียกมันว่า  Monitor

Text Editor นั้นมีฟังก็ชั้นการทำงานเพิ่มเติมเช่น

  • แสดง line number
  • แสดง ข้อความ error ที่เกิดขึ้นได้
  • สามารถทำ undo change ได้ไม่จำกัด
  • มี function ในการค้นหาและ แทนที่ได้ (สามารถใช้ regular expressions ได้ด้วย)
  • ในขณะทำงาน จะแสดงหัวลูกสอนที่บรรทัดที่กำลังทำงานอยู่ได้อีกด้วย

Monitor

  • เป็นหน้าจอสำหรับ แสดง การทำงานของเจ้า ROBO และ โลกของมัน
  • สามารถ pan และ zoom ได้ และยังสามารถทำ screen shot เก็บไว้ได้ด้วย

การ Execute โปรแกรม

ไม่ต้องทำอะไร มากครับ สามารถสั่งให้ code ที่ถูกต้องแล้ว ทำงานได้ด้วย คลิกเดียวครับ

เราแค่จัดการให้ code คำสั่ง ถูกต้อง ถูกลำดับการทำงานที่ ออกแบบไว้ หากมี error ใด โปรแกรมจะแจ้งให้ทราบและสามารถแก้ไขให้ถูกต้องก่อน ที่จำทำงานจริงทั้งหมด

คำสั่งพื้นฐาน Basic instructions

ประกอบด้วยคำสั่งดังนี้ แยกตามกลุ่มคำสั่ง

  • คำสั่งเคลื่อนที่ Move
    • forward(n) เคลื่อนที่ไปข้างหน้า n steps
    • backward(n) ถอยหลังไป n steps
    • left() หมุนซ้าย 90 องศา
    • right() หมุนขวา 90 องศา
    • north(n) หันหัวไปด้านบน ของหน้าจอ และ เคลื่อนที่ไปข้างหน้า n steps
    • south(n) หันหัวลงล่าง ของหน้าจอ และ เคลื่อนที่ไปข้างหน้า n steps
    • east(n) หันหัวไปข้างขวา ของหน้าจอและ เคลื่อนที่ไปข้างหน้า n steps
    • west(n) หันหัวไปข้างซ้าย ของหน้าจอ และเคลื่อนที่ไปข้างหน้า n steps
  • คำสั่งระบายสี Paint
    • paintWhite() ลากแปรงสีขาว ไปบนพื้น
    • paintBlack() ลากแปรงสีดำ ไปบนพื้น
    • stopPainting() หยุดลากแปลง และเก็บแปรงสี
  • คำสั่งหยิบ Grab
    • pickUp()  หยิบ สิงของที่อยู่ด้านหน้า
    • putDown() วางสิ่งของที่ถือไว้ลง
  • คำสั่งโยนเหรียญ เพื่อเสี่ยงทาย Flop coin
    • coinflip() โดยเหรียญเพื่อ เลือกตัวเลือก
  • คำสั่งตรวจสอบ หรือ ตรวจการ See
    • leftIsObstacle() , frontIsobtacle(), rightIsObstracle()
    • leftIsClear(), frontIsClear(), rightIsClear()
    • leftIsBeacon(), frontIsBeacon(), rightIsBecan()
    • leftIswhite(), frontIsWhite() , rightIsWhite()
    • leftIsBlack(), frontIsBlack(), rightIsBlack()

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

http://www.robomind.net/en/demo.html

ตอนต่อไป เราจะไป load โปรแกรมแล้วลองมาเขียนเล่นกันนะครับ

s_teerapong2000@yahoo.com