กลับไปหน้ารวมไฟล์
botgammon-battle-f59e0d.md

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

ดูคลิปเต็ม:

ฟีเจอร์หลักและความท้าทาย:

1. ระบบตรวจสอบแบบปิดวงจร (Closed-Loop Monitoring System)

กล้องที่ติดตั้งเหนือกระดานและลูกเต๋าจะจับภาพสถานะและส่งไปยังพีซีควบคุม เราใช้มือถือเก่าเป็นกล้อง ส่งภาพไปยังพีซี ฟีดแบ็คภาพแบบเรียลไทม์นี้คือรากฐานของ "การรับรู้สถานการณ์" ของหุ่นยนต์นั่นเอง

2. การปรับเทียบกระดาน (Board Calibration)

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

  1. การแมปเริ่มต้นระหว่างกระดานและกล้อง: ระบุจุดที่มุมกระดานเพื่อกำหนดการแปลงพิกัดเริ่มต้น
  2. การหมุนกระดาน: เพื่อให้ภาพตรงกับกระดาน เราต้องหมุนภาพ เพราะขอบกระดานไม่ได้ตรงกับแกน X และ Y ของกล้องเป๊ะๆ
  3. การชดเชยความบิดเบี้ยวของกล้อง: ความบิดเบี้ยวของเลนส์กล้องทำให้เกิดข้อผิดพลาดหลายมิลลิเมตร ต้องมีการชดเชยเพื่อป้องกันข้อผิดพลาดร้ายแรง เช่น การมองไม่เห็นหมาก
หมากที่มุม (สีเหลือง) ถูกใช้เพื่อคำนวณการแปลงพิกัดจากหน้าจอไปยังเครื่องจักร ส่วนหมากอื่นๆ (สีดำ) ใช้เพื่อระบุแท่งกั้น (bars)

3. การระบุหมาก (Checkers Identification)

อัลกอริทึมจะระบุหมากและสีของมัน กรองสัญญาณรบกวน เช่น เครื่องหมายและลวดลายบนกระดานออก จากนั้นจึงตีความภาพและแปลงเป็นสถานะกระดานดิจิทัล

กระดานจริง (ซ้าย) และกระดานที่ถูกตีความ (ขวา)

ต้องมีการจัดการพิเศษสำหรับกรณีแปลกๆ เช่น เมื่อแถวหมากสูงจน "บุก" เข้าไปในแถวฝั่งตรงข้าม ดังตัวอย่างด้านล่าง

กรณีพิเศษของหมากที่ซ้อนสูง สร้างมุมมองที่ซับซ้อน

สถาปัตยกรรมการควบคุมหุ่นยนต์

หุ่นยนต์ถูกควบคุมโดยใช้ GRBL ซึ่งเป็นแพลตฟอร์มควบคุมการเคลื่อนที่สำหรับ CNC นำมาปรับใช้เพื่อควบคุมหัวหุ่นยนต์สำหรับเล่นแบ็คแกมมอน Arduino ทำหน้าที่เป็นตัวควบคุมหลัก สื่อสารกับ Arduino อีกตัวที่รัน GRBL เพื่อสั่งการเคลื่อนไหว

กลยุทธ์การเคลื่อนไหวและการจำลองแบบออฟไลน์

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

การจำลองเส้นทางการเคลื่อนไหวแบบออฟไลน์ เส้นสีดำแสดงหัวหุ่นยนต์เมื่อยกขึ้น และเส้นสีแดงแสดงเมื่อลดลงเพื่อวางหมาก

ในตัวอย่างนี้ หัวหุ่นยนต์เคลื่อนที่ไปที่ตำแหน่ง 1 (เส้นสีดำ - หัวยกขึ้น) หยิบหมาก จากนั้นจึงลดระดับลงขณะวิ่งไปที่ตำแหน่ง 2 (เส้นสีแดง) เข้าใกล้แท่งกั้นมากขึ้น และเลื่อนหมากเข้าสู่ตำแหน่งเป้าหมาย

  1. การเข้าไปหยิบหมาก: เพื่อหลีกเลี่ยงการชนกับขอบกระดาน เราจะกำหนด 'โซนห้ามลง' ขึ้นมา (ดูเส้นขอบสีเทาด้านล่าง) หัวหุ่นยนต์จะไม่ลงไปในบริเวณนี้ และใช้วิธีเข้าแบบพิเศษเมื่อต้องหยิบหมากที่อยู่ใกล้ขอบ
  2. โซนห้ามลง (สีเทา)
  3. การหยิบหมาก: เมื่อหัวหุ่นยนต์เคลื่อนที่ไปอยู่เหนือ (หรือเกือบเหนือ) หมากเป้าหมายแล้ว มันจะลงไป เปิดแม่เหล็ก และดูดหมากขึ้นมา หมากของเราติดแผ่นโลหะไว้ด้านใน ซึ่งจะถูกแม่เหล็กดูดได้เมื่อเข้าใกล้พอ งานนี้พี่เลือกใช้แบตเตอรี่กลมเล็กที่มีคุณสมบัติแม่เหล็กแบบนี้แหละ ใช้ง่ายดี
  4. นวัตกรรม 'ยกแล้วจัด' (Lift & Shift): เพื่อป้องกันปัญหาตอนลงไปจับหมาก พี่ออกแบบให้กลไกการลงมีความยืดหยุ่นในระดับความสูงนิดหน่อย พอหมากถูกดูดขึ้นมาและกำลังลอยอยู่ – มันจะถูกจัดให้ตั้งตรง! จุดนี้สำคัญมากตอนวางหมากลง เพราะมันช่วยป้องกันไม่ให้วางหมากซ้อนทับกับหมากอื่นๆ ที่อาจเบี้ยวไปจากตำแหน่งที่ควรอยู่ เรียกได้ว่าเป็นตัวเปลี่ยนเกมของโปรเจกต์นี้เลย
  5. 'Lift & Shift' - จัดหมากให้ตรงเมื่อถูกหยิบขึ้นมาแล้ว

การจัดการพื้นที่บนกระดานอย่างชาญฉลาด

การวางหมากกลับลงบนกระดาน

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

นอกจากนี้ ยังต้องมั่นใจว่าหมากที่อยู่บน 'บาร์' จะไม่ถูกชนเวลาหุ่นยนต์บินผ่านไป มันจัดการได้โดยการปรับความสูงของหัวหุ่นยนต์นี่แหละ:

ระบบจดจำลูกเต๋าด้วย AI (CNN Dice Recognition)

ใช้ CNN (Convolutional Neural Network) แบบง่ายๆ ที่เทรนด้วยรูปภาพประมาณ 1,000 รูป ตัว Neural Network นี้ทำงานได้แม่นยำมาก ยกเว้นตอนที่ลูกเต๋าตกลงไปติดขอบกล่องทอยเต๋าเท่านั้น วิธี Deep Learning แบบนี้ให้ความแม่นยำสูงแม้ในสภาวะต่างๆ งานนี้จัดไปวัยรุ่น!

การสื่อสารและฟีดแบ็คภาพ

การสื่อสาร: พี่ใช้โพรโทคอลสื่อสารสามแบบ:

  1. TCP: สำหรับการสื่อสารระหว่าง PC กับ Arduino หลัก
  2. I2C: สำหรับการสื่อสารระหว่าง Arduino หลักกับตัวควบคุมส่งข้อมูล ตัวควบคุมนี้จะอ่านข้อมูลจาก I2C แล้วส่งต่อผ่าน Serial เพื่อชดเชยที่ Arduino หลักไม่มีพอร์ต Serial เพิ่มเติม ห้ามช็อตนะตัวนี้
  • Serial: เปิดช่องทางการสื่อสารระหว่าง Arduino หลักกับ GRBL controller รวมถึงระหว่าง Arduino หลักกับ controller สำหรับส่งข้อมูลต่อ
  • Visual Feedback: ใช้ LED Matrix ขนาด 64x32 ในการแสดงข้อความและเพิ่มอรรถรสในการเล่นเกม พี่ออกแบบ PCB ง่ายๆ ไว้เชื่อม LED Matrix เข้ากับ Arduino ตัวควบคุม มีทั้งข้อความและอนิเมชั่นหลายแบบที่เกมจะแสดงให้ดู

    PCB สำหรับส่งข้อมูลจาก Arduino ไปยัง RGB Led Matrix
    ตัวอย่างอนิเมชั่นและข้อความที่แสดงบนหน้าจอ LED ตอนแข่ง

    เพราะฉะนั้น BotGammon ไม่ใช่แค่โปรเจคหุ่นยนต์ธรรมดาๆ แต่เป็นการผสานกันอย่างเนียนๆ ระหว่าง Mechanical Design, Computer Vision, และ Embedded Logic เพื่อสร้างประสบการณ์เล่นบอร์ดเกมแบบใหม่ ที่ลบเส้นแบ่งระหว่างคนกับเครื่องจักรเลยทีเดียว งานนี้จัดไปวัยรุ่น!

    ข้อมูล Frontmatter ดั้งเดิม

    apps:
      - "1x Arduino IDE 2.0"
      - "1x GRBL"
    author: "alonborn"
    category: "Gadgets, Games & Toys"
    components:
      - "1x Arduino Micro Pro"
      - "1x Arduino Mega 2560"
      - "1x Arduino R3"
      - "1x Arduino R4 UNO"
    description: "หุ่นยนต์เทพๆ ที่เล่นหมากฮอสกับมนุษย์ได้แบบตัวเป็นๆ ใช้เซนเซอร์จับตา มอเตอร์ขยับตัว กับโค้ดอินเตอร์รัพต์ตึงๆ รับรองว่าจัดไปแบบวัยรุ่นแน่นอน!"
    difficulty: "Intermediate"
    documentationLinks: []
    downloadableFiles:
      - "https://github.com/alonborn/BotGammon"
    encryptedPayload: "U2FsdGVkX18HXqYNHf1EzVBq9x7zJHY4ubkYBGkWvXVSfbWlsottJlqxI82MKWpxZwl5FUOum5su8ULhlYsUEdxKnRdBtD7zitZf2CB3xjKJdbJ+6nMFLAebpdWJwa01"
    heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/botgammon-battle-f59e0d_cover.jpg"
    lang: "en"
    likes: 3
    passwordHash: "415f2dbbc06a454fe39a774bf798fdc093fec9710d7ad4e34e9f81ad1d1c0f9b"
    price: 2450
    seoDescription: "Botgammon Battle: A fully operational Robot that plays checkers against a human player."
    tags:
      - "Arduino User Group"
      - "Games"
      - "Robots"
    title: "บอทแกมมอน แบทเทิล - งานง่ายแต่หล่อ ชนะได้ทั้งคนทั้งหุ่น!"
    tools: []
    videoLinks:
      - "https://www.youtube.com/watch?v=F0rRMJZtO1g"
      - "https://www.youtube.com/watch?v=7xacsFTQi2Q"
      - "https://www.youtube.com/watch?v=sQ3fbP2t4E0"
      - "https://www.youtube.com/watch?v=m7HKXtxNxHM"
      - "https://www.youtube.com/watch?v=z-zRh-HJbSI"
    views: 1939