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

จาก หัวข้อ ฝึกการเขียนโปรแกรม ด้วย Robo MIND ภาค #4 คำสั่งตรวจจับสิ่งรอบตัวหุ่นยนต์ / Sensing the environment เราได้คำสั่งเพิ่มเติมในส่วนของการ ตรวจจับสิ่งรอบตัว ซึ่งสิ่งรอบตัวประกอบด้วย ตรวจสิ่งกีดขวาง ตรวจ Beacon ตรวจสีพื้น เท่าที่เราได้ทำ แบบฝึกใาเราได้ใช้คำสั่งในการตรวจสอบสิ่งกีดขวางมาแล้วคือ frontIsClear ซึ่งเป็นกำแพง ในฉาก ต่อไปเราจะเพิ่มเติมก็คือ ในกลุ่ม ตรวจสีพื้น เช่น frontIsWhite ซึ่งสีพื้นจะมีได้ก็ต้องการมีการระบาย ลงไปด้วยตัวหุ่นเองหรือมีในฉากนั้น ๆ

ในแบบฝึกนี้เราจะตั้งโจทย์เพิ่มเติมจากโจทย์ทีแล้วว่า นอกจากเราจะวิ่งไปอย่างเดียวเราก็ ระบายสีลงบนทางเที่เราวิ่งไปด้วย และเพิ่มตเติมก็คือเราจะไม่วิ่งไปทับทางเดิมที่ระบายไว้

จาก Code เดิมยกมาจากตัวอย่างเดิม ดังด้านลาง

repeat{
 
     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้ สุ่ม
           if(flipCoin){
               right
             }else{
               left
             }
      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง
 
            forward(1)
       }
}

เมื่อเราปรับปรุงตามโจทย์และเติมลงไป จะได้ดังนี้

repeat{
 
     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้ สุ่ม
           if(flipCoin){
               right
             }else{
               left
             }
      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง
            paintWhite()   # วางแปลง 
            forward(1)     # เดินหน้า 1 step
           
       }
     stopPainting()   # ยกแปลงทาสี คือหยุดทา
}

แล้วลอง Run ดู

ซึ่งเห็นแล้วว่าทำงานได้ อย่างที่อยากให้ทำ แต่ก็ดูแปลก ๆ จะเห็นว่าหุ่นเรา วางแปลง วิ่ง ยกแปลง แบบนี้เรายังไม่อยากได้ ถ้าเรา เอา paintWhite() ไปอยู่ด้านบน เลยจะเป็นอย่าไร ขั้นตอนมันจะกลายเป็นว่า

วางแปลง ตรวจสอบด้านหน้า หมุน เดิน วนไปบรรทัดตรวจสอบด้านหน้า สุดท้ายยกแปลง แบบนี้ จะได้ Code ดังนี้

 paintWhite()   # วางแปลง 
repeat{
 
     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้ สุ่ม
           if(flipCoin){
               right
             }else{
               left
             }
      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง

            forward(1)     # เดินหน้า 1 step
           
       }
}
 stopPainting()   # ยกแปลงทาสี คือหยุดทา

ทอดลอง ทำงานก็จะได้ ดัง Videoเหมือนด้านลาง

ก็เห็นว่าลักษณะการเคลื่อนที่ของ หุ่นทำได้ไวขึ้นและทาทีตามต้องการ มีใครทำได้ดีกว่านี้มั้ย

มีคำถามทิ้งท้ายว่าหากต้องการที่จะไม่ให้หุ้นต้อง ระบายทับในพื้นที่เขาระบายแล้วทำอย่าง แบบฝึกหน้าจะมาเฉลอยนะครับ ทดลองทำดูก่อนนะครัย

s.teerapong@gmail.com

ฝึกการเขียนโปรแกรม ด้วย Robo MIND ภาค #4 คำสั่งตรวจจับสิ่งรอบตัวหุ่นยนต์ / Sensing the environment

สำหรับหัวข้อนี้ก่อน ตัวอย่างต่อไปผมขอเพิ่มเติใ คำสั่งในหมวด ของการตรวจจับสิ่งแวดลอมรอบๆ ตัวหุ่นยนหรือ Sensing the environment ว่ามีกี่คำสั่งอะไรบ้างเพื่อให้เราสามารถทำ Algorithm หุ่นของเราฉลาดขึ้น

1. frontIsClear

คำสั่ง: คืนค่า true ถ้าด้านหน้าว่าง, false ถ้ามีสิ่งกีดขวาง
English: Returns true if the path directly in front of the robot is clear, false otherwise.

ตัวอย่าง / Example

if frontIsClear {
    forward(1)
}

หุ่นยนต์จะเดินหน้า 1 ก้าวถ้าทางว่าง

2. frontIsObstacle

คำสั่ง: ตรวจว่าด้านหน้ามีสิ่งกีดขวางหรือไม่
English: Returns true if there is an obstacle directly in front of the robot.

ตัวอย่าง / Example

if frontIsObstacle {
    left
)
ถ้ามีสิ่งกีดขวางตรงหน้า → หันซ้าย

3. frontIsBeacon

คำสั่ง: ตรวจว่ามี Beacon (สัญญาณเป้าหมาย) อยู่ด้านหน้าหรือไม่
English: Returns true if a beacon is directly in front of the robot.

ตัวอย่าง / Example

if frontIsBeacon{
    paintWhite    # Mark as reached
}
ถ้าเจอสัญญาณ beacon → ระบายสีพื้นเพื่อแสดงว่า “ถึงเป้าหมายแล้ว”

4. Sensing on other sides

นอกจากด้านหน้าแล้ว ยังสามารถตรวจซ้ายและขวาได้เหมือนกัน
Similar commands exist for left and right directions:

leftIsClear
rightIsClear
leftIsObstacle
rightIsObstacle
leftIsBeacon
rightIsBeacon

ตัวอย่าง / Example

if rightIsClear {
    right
}else{
    left
}

ถ้าทางขวาโล่ง → เลี้ยวขวา, ถ้าไม่โล่ง → หันซ้ายแทน

5. Ground Color Sensing

ตรวจสีของพื้นด้านหน้า ซ้าย หรือขวา
Checks for the color of the ground directly ahead or beside the robot.

คำสั่ง / Commands:

frontIsWhite
frontIsBlack
leftIsWhite
leftIsBlack
rightIsWhite
rightIsBlack

ตัวอย่าง / Example

if frontIsBlack() then
    backward(1)
else
    forward(1)
end

ถ้าพื้นด้านหน้าเป็นสีดำ → ถอยหลัง 1 ก้าว
ถ้าไม่ใช่สีดำ → เดินหน้า

สรุปภาพรวม

กลุ่มตัวอย่างคำสั่งหน้าที่ค่าที่คืนกลับ (Return)
ตรวจสิ่งกีดขวางfrontIsClear, rightIsObstacleตรวจว่าทางว่างหรือมีสิ่งขวางtrue / false
ตรวจ BeaconfrontIsBeaconตรวจว่ามีสัญญาณเป้าหมายอยู่ตรงหน้าtrue / false
ตรวจสีพื้นfrontIsWhite, leftIsBlackตรวจสีของพื้นในทิศต่าง ๆtrue / false

ยาวนิสหนี่ง ครับอยากให้เห็น ภาพรวมของคำสั่งที่ใช้ในการตรวจสอบ สิ่งแวดล้อมของหุ่นซึ่งก็มีเท่านี้เลือกใช้ตามสถานการได้ เสริมความฉลาดของหุ่นเรา …

s.teerapong@gmail.com

ฝึกการเขียนโปรแกรม ด้วย Robo MIND ภาค #3 ว่าด้วยเรื่องการ สุ่ม (Random)

ในการโปรแกรม เราจะมี Function หรือ ตัวแปรหนึ่งเพื่อเป็น กลไกในการทำให้เกิดทางเลือกที่ สุ่มค่าขึ้นมา ในที่นี้ เรามี คำสั่งหนึ่งชื่อว่า flipCoin ที่จะให้ค่าสุม เป็น True หรือ Fale โดยมีความน่าจะเป็นในการให้ค่าเท่าๆ กัน 50/50

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

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

repeat{

     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้หมุนขวา

           right

      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง

            forward(1)

       }

}

เมื่อเพิ่มเข้า ไปผมจะเขียนดังนี้

repeat{

     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้ สุ่ม
           if(flipCoin){
               right
             }else{
               left
             }

      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง

            forward(1)

       }

}

มาดูผลการเพิ่ม code เขาไปในโปรแกรม จะได้ดังนี้ครับ

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

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

 ต่อไป: ฝึกการเขียนโปรแกรม ด้วย Robo MIND ภาค #4 คำสั่งตรวจจับสิ่งรอบตัวหุ่นยนต์ / Sensing the environment

s.teerapong@gmail.com

ภาคสนามกับ Multimeter: ตรวจสุขภาพ Servo ด้วยเครื่องมือ

หลายคนมองว่า “การตรวจสุขภาพ Servo” ต้องใช้เครื่องมือแพง แต่จริง ๆ แล้ว Multimeter ธรรมดาราคาไม่เกิน 300 บาท ก็เพียงพอที่จะช่วยคุณรู้ว่า Servo ยังแข็งแรงหรือกำลังล้า

ก่อนขึ้นบิน ให้ตั้ง Multimeter วัดโหมด DC Voltage แล้วต่อปลายวัดขนานกับสายไฟ Servo (5V และ GND) จากนั้นขยับ servo เต็มช่วงซ้าย–ขวา ถ้าแรงดันตกเกิน 0.3–0.5V ระหว่างหมุน แสดงว่า Power Rail หรือ BEC ของคุณเริ่มอ่อนแรง หรือ servo ตัวนั้นกินไฟเกินปกติ

ต่อมา ตั้งโหมด Current (กระแส) แล้วต่ออนุกรมเข้ากับสายไฟ servo เพื่อดูค่ากระแสที่ใช้ขณะ servo ทำงานปกติ

–หากกระแสสูงกว่า 1.5–2A ต่อเนื่อง แสดงว่ามีแรงเสียดทานหรือ gear ฝืด

–ถ้ามีกระแส spike สูงช่วงต้นแล้วลดลง แสดงว่า servo ยังปกติ

–แต่ถ้า spike นานเกิน 2 วินาที แสดงว่าเริ่มล้า

เทคนิคเล็ก ๆ นี้อาจใช้เวลาไม่ถึง 2 นาที แต่ช่วยป้องกันการสูญเสียทั้งเครื่องและภารกิจได้จริง

..

..

“เครื่องมือไม่ได้ทำให้ดูเป็นมืออาชีพ แต่การใช้มันอย่างเข้าใจต่างหาก” — Leading Edge Unmanned Systems

..

ต่อเนื่องจาก >> ความล้า ของ Servo ก่อเกิดอันตรายต่ออากาศยาน

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

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

โจทย์ : ต้องการให้หุ่นยนต์ เดินไปข้างหน้าจากจุดเริ่มต้นเมื่อถึงผนังและเดินต่อไม่ได้ ให้ เลี้ยวซ้าย หรือขวาแล้วเดินต่อถ้าไปไม่ได้ให้ เลี้ยวซ้ายหรือขวา แล้วเดินวนซ้ำไปเรื่อย ๆ ไม่มีหยูด

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

repeat {
    forward (1)
}

เมื่อสั่งทำงาน หรือ Run จะพบว่า เจ้าหุ่นเดินทางไปในทิศทางที่มัน หันไปอยู่ไปเรื่อยๆ จยจะพบผนังแล้วก็หยุดเพราะไปไม่ได้ เราจะต้อง ดังนั้นเรามีคำสัง frontIsObstacle เอาไว้ตรวจสอบว่าข้างหน้าเรามีอะไรขวางไหม แล้วเราจะหมุนหุ่นไป หนึ่งครั้งด้วยคำสั่ง right แล้ว วนซ้ำไปเรื่อย ๆ แบบนี้

repeat{

     if(frontIsObstacle)  { # ตรวจดูว่าด้านหน้าไปได้ไหมถ้ามี ให้หมุนขวา
            
           right

      }else { #ถ้าไม่มีก็ สั่งเดิน 1 ครั้ง

            forward(1)

       }

}

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

s.teerapong@gmail.com