[ บทความ : Robot ] ตอนที่ 5 เรื่อง ... ศึกษา ET-ROBOT (โปรแกรมแบบเงื่อนไข)

 

เอาล่ะ ตอนนี้บทความก็เข้าสู่ตอนที่ 5 กันแล้วครับ ในบทความนี้เราจะได้เรียนรู้ถึงการเขียนโปรแกรมแบบเงื่อนไข รวมทั้งรายละเอียดปลีกย่อยที่เกี่ยวข้องกัน … ก่อนอื่นมาทำความรู้จักกับคำว่า Sequence programming กันดีกว่าครับ

Sequence programming

Sequence programming หรือ อีกชื่อหนึ่งแบบไทยๆ ก็คือ การเขียนโปรแกรมแบบลำดับ … คุ้นไหมครับ … จากโปรแกรมก่อนหน้านี้ จะพบว่า โปรแกรมของเรานั้น จะทำงานจากคำสั่งแรก เมื่อทำสั่งแรกที่เราเขียน (สั่งการ) ไปนั้น ทำงานเสร็จ ตัว BASIC Stamp ก็จะทำคำสั่งถัดไป และจะทำต่อไปเรื่อยๆ จนกว่าเราจะสั่งให้หยุดการทำงาน หรือ ทำงานเรื่อยๆ เนื่องจากมีการวนรอบไม่รู้จบ (เรื่องของการวนรอบนั้น ผมขอกล่าวในบทความตอนหน้านะครับ)

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

Condition

เงื่อนไข หรือ condition เป็นส่วนที่ใช้สำหรับเปรียบเทียบการทำงาน และจะสนใจผลของการเปรียบเทียบเพียง ใช่ และ ไม่ใช่ เท่านั้น และตรงนี้เอง เรานิยมแทนใช่ด้วย 1 และ ไม่ใช่ด้วย 0 คำสั่งของ BASIC Stamp ที่ใช้ในการตรวจสอบเงื่อนไข คือ คำสั่ง IF     

               รูปแบบของคำสั่ง  IF 

 IF             เงื่อนไข    THEN     ตำแหน่งที่จะไปทำถ้าเงื่อนไขเป็นจริง

โดย เงื่อนไข จะเป็นคำสั่งที่เกิดจากการเปรียบเทียบ เช่น A < B มีความหมายว่า ถ้า A < B จะมองว่าเงื่อนไขนี้เป็นจริง แต่ถ้า A ไม่น้อยกว่า B แสดงว่าเงื่อนไขเป็นเท็จ และถ้าเงื่อนไขเป็นจริง BASIC Stamp ก็จะไปทำงาน ณ ตำแหน่งที่กำหนดเอาไว้หลัง THEN ส่วนกรณีที่เป็นเท็จนั้น จะไม่ทำ ณ ตำแหน่งหลัง THEN แต่จะดูคำสั่งที่อยู่ในบรรทัดถัดไป

 

ตำแหน่งและชื่อเรียก

งงไหมครับว่าหัวข้อนี้เกี่ยวกับอะไร … ฮาๆ มันก็คือ สิ่งที่เรียกกันว่า LABEL ไงล่ะ … อืม ๆๆ แล้ว LABEL คืออะไรล่ะ ??? … (ฮาๆๆ ) … คืออย่างนี้ครับ LABEL ก็เป็นเพียงชื่อเรียก ตัวอย่างเช่น

      '{$STAMP BS2p}

      J     VAR   WORD

      I     VAR   WORD

START:

      I = 3

      J = 1

STOP:

      END

จากโปรแกรมด้านบน เราเรียก START: กับ STOP: ว่าเป็น LABEL ซึ่งเวลาที่ BASIC Stamp ทำงาน มันจะมองว่า ตำแหน่งที่เรียกว่า START นั้น ก็คือตำแหน่งของคำสั่ง I = 3 และตำแหน่งที่ STOP ก็จะตรงกับคำสั่ง STOP ถ้าผมบอกว่าให้ไปทำงานที่ตำแหน่ง STOP ตัว BASIC Stamp ก็จะทำคำสั่ง END

เอาล่ะ มาลองดูโปรแกรมต่อไปนี้นะครับ

       '{$STAMP BS2p}

      J     VAR   WORD

      I     VAR   WORD

START:

      I = 3

      J = 1

      IF I < J  THEN START

STOP:

      END

โปรแกรมนี้จะมีส่วนที่สำคัญ คือ IF I < J THEN START ซึ่งหมายว่า ถ้าค่าของ I นั้นน้อยกว่า J มันจะไปทำงาน ณ ตำแหน่งที่เรียกว่า START … ด้วยเหตุนี้ โปรแกรมนี้จริงเกิดเหตุการณ์ที่เรียกว่า ไม่รู้จบ … มองออกไหมครับว่าทำไมมันไม่รู้จบ … ก็ดูตรงที่กำหนดค่าสิครับ ผมให้ I เป็น 3 และ J เป็น 1 ดังนั้น ถ้าตรวจสอบเงื่อนไข I < J จึงได้ค่าเป็น จริง ใช่ไหมครับ ! … เมื่อเป็นจริงมันก็ ไปทำงานที่ตำแหน่งที่เรียกว่า START ซึ่งก็เป็นการเริ่มกำหนดให้ I เป็น 3 และ J เป็น 1 หลังจากนั้นก็ตรวจสอบอีกว่า I < J อยู่หรือไม่ ซึ่งมันก็จะเป็นจริงไปเรื่อยๆ … นี่ล่ะที่เรียกว่าไม่รู้จบ

ก่อนที่จะศึกษาถึงตัวอย่างถัดไป เรามาสรุปเรื่องรูปแบบของ LABEL กันก่อนครับ …

                รูปแบบของ LABEL

                                    1. ต้องเป็นชื่อภาษาอังกฤษ

                                    2. ลงท้ายด้วย :

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

'{$STAMP BS2p}

'{$PORT COM1}

I var     WORD

J var     WORD

 

BEGIN:

          RANDOM I

          J = 2

          DEBUG dec ? I

          IF J <> I THEN TRUE

          GOTO FALSE

TRUE:

          AUXIO

          LOW 0

          GOTO EXIT

FALSE:

          AUXIO

          HIGH 0

          SLEEP 1

          LOW 0

          SLEEP 1

          HIGH 0

          SLEEP 1

          LOW 0

          SLEEP 1

EXIT:

          END

ยาวนิดนึง แต่ถ้าเข้าใจล่ะก็ นับว่าประสบความสำเร็จเรื่องโปรแกรมแบบเงื่อนไขแล้วล่ะครับ … มาเริ่มกันเลยเนอะ … โปรแกรมนี้เริ่มต้นด้วยคำสั่งว่า

RANDOM I

คำสั่ง RANDOM นั้นเป็นคำสั่งที่ใช้สำหรับสุ่มค่า เนื่องจากมันตามด้วย I มันจึงนำค่าที่สุ่มได้นั้นไปเก็บในตัวแปร I ด้วยเหตุนี้ ตอนนี้ตัวแปร I ของเราจึงมีค่าเป็นตัวเลขที่เราบอกไม่ว่ามันคืออะไร (ก็มันสุ่มขึ้นมานี่นา)

 หลังจากสุ่มค่า I ผมก็หนดให้ J เป็น 2 แล้วแสดงค่าของ I ออกมาที่จอ DEBUG หลังจากนั้นตรวจสอบเงื่อนไข ซึ่งผมได้เขียนเอาไว้ว่า

 IF J <> I THEN TRUE  

ความหมายของบรรทัดเงื่อนไขก็คือ ถ้า J นั้นไม่เท่ากับ I มันก็จะไปทำงานที่ตำแหน่งที่เรียกชื่อว่า TRUE ซึ่งส่วนของ TRUE นั้นผมเขียนเอาไว้ว่า

 TRUE:

          AUXIO

          LOW 0

          GOTO EXIT

 เอาล่ะ … แล้วมันเกิดอะไรขึ้นเนี่ย ? มาดูทีละคำสั่งนะครับ

     AUXIO   มีความหมายว่า จะทำการติดต่อกับ IO ที่เพิ่มเติมจาก BASIC Stamp ทั่วไป (หมายว่า ถ้าผู้อ่านไม่มี P40 ก็ต้องตัดบรรทัดนี้ออก)
     LOW  0  มีความหมายว่า กำหนดให้ขา ที่ 0 ของพอร์ตเพิ่มเติมมีค่าเป็น LOW หรือ 0
     GOTO  EXIT   เป็นการบอกว่า ให้ข้ามไปทำ ณ ตำแหน่งที่เรียกว่า EXIT

 หมายเห  ผมต่อวงจร LED เข้ากับขา 0

 ส่วนกรณีที่เป็นเท็จ มันก็จะไม่ทำงาน ที่ตำแหน่งที่เรียกว่า TRUE แต่จะทำบรรทัดถัดไป นั่นคือ ที่เขียนเอาไว้ว่า

   GOTO FALSE 

ดังนั้น มันจึงไปทำงานที่ตำแหน่งที่เรียกว่า FALSE ซึ่งผมเขียนโปรแกรมเอาไว้ดังนี้ครับ

   FALSE:

          AUXIO

          HIGH 0

          SLEEP 1

          LOW 0

          SLEEP 1

          HIGH 0

          SLEEP 1

          LOW 0

          SLEEP 1

 

มาดูตำสั่งที่ยังไม่รู้จักกันดีกว่าครับ

                HIGH  0                 มีความหมายว่า ส่งค่าสูง (HIGH) ไปที่ขา 0

                SLEEP 1                เป็นการหน่วงเวลา โดยหน่วงเวลา 1 วินาที

สรุปได้ว่า ถ้าเงื่อนไขเป็นเท็จมันจะเกิดไปกระพริบที่พอร์ต 0 เพราะผมกำหนดให้ส่งไฟที่วงจร LED หลอดมันเลยติด หลังจากนั้นรอนิดหนึ่งแล้วเปลี่ยนสัญญาณเป็นต่ำ คราวนี้หลอด LED ก็ดับ แล้วรออีกนิดนึง ก็ให้มันติดแล้วก็ค่อยดับอีกรอบหนึ่ง

 

สรุป

เอาล่ะจบตัวอย่างโปรแกรมแล้วล่ะครับ … พอมองออไหมครับ ว่าการเขียนโปรแกรมแบบเงื่อนไขนั้นเป็นอย่างไร  ตอนแรกผมว่าจะต่ออีก 1 ตัวอย่าง แต่พอดี บทความค่อนข้างยาว ผมขอตัดจบเอาไว้เท่านี้ก่อนนะครับแล้วคราวหน้าผมจะมาต่อเรื่องเงื่อนไขกับตัวอย่างโปรแกรมที่ 2 ให้จบ … คราวหน้าก็จะมีวงจร 2 วงจรที่เกี่ยวข้องกับตัวอย่างครับ คือ วงจร LED และ วงจร Switch … ตอนนี้ขอจบเอาไว้เท่านี้ก่อนนะครับ สวัสดีครับ

 


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง :  ๑๘ พ.ย. ๒๕๔๖