⚡ RazorRobot Docs เริ่มเรียน RazorS3
← กลับสู่หน้า Simulator
บทเริ่มเรียน RazorS3 อัปเดต 6 ตุลาคม 2026 · เปิดไฟล์ .srazor เพื่อแก้บล็อกและทดลองใน RazorSIM

RazorS3 · บท 0 · เริ่มจากหน้าเปล่า

เริ่มเขียนบล็อกครั้งแรก

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

จบบทนี้แล้ว: เปิดไฟล์ตัวอย่างใน Blocks Mode ได้ ชี้ setup กับ loop ถูก และใช้ Run/Stop/Reset/Save ได้

1. เตรียมหน้าจอให้เหมือนตัวอย่าง

  1. กด กลับสู่ Simulator ถ้ามีงานของตัวเองอยู่ ให้กด Save เก็บเป็น .srazor ก่อนเปิดตัวอย่าง
  2. กด Robot แล้วเลือก RAZOR-S3 ภาพการ์ดเป็นภาพเรนเดอร์ของหุ่น
  3. กด MAP แล้วเลือก สนามซ้อมอิสระ ใช้สนามนี้ตลอด 4 บทแรก
  4. ดาวน์โหลดไฟล์เริ่มต้นด้านล่าง แล้วกด Open ใน Simulator เลือกไฟล์ .srazor ที่ดาวน์โหลด โปรแกรมจะเปิดหุ่นและสนามของตัวอย่างให้
  5. ดูว่าปุ่มโหมดแสดง Blocks Mode ทางซ้ายมีเมนูและบล็อก ทางขวามีสนาม/หุ่น ส่วน CONSOLE อยู่ใต้สนาม
ดาวน์โหลดไฟล์เริ่มต้น .srazor
หน้าต่างเลือกหุ่นจริงใน RazorSIM มีการ์ด RAZOR-S3 ให้เลือก
หน้าต่าง Robot จริง · ภาพหุ่นบนการ์ดเป็นภาพเรนเดอร์ กดภาพเพื่อขยาย
หน้าจอ RazorSIM: เมนูและพื้นที่ต่อบล็อกอยู่ซ้าย สนามอยู่ขวา CONSOLE อยู่ใต้สนาม แถบบนมี Open Save Run Reset Robot MAP
หน้าจอจริงเมื่อเปิดไฟล์เริ่มต้น · หุ่นอยู่มุมล่างซ้ายของสนามและหันขึ้น

2. setup และ loop มีไว้ทำไม

บล็อกจริง void setup และ void loop ที่ยังว่างทั้งคู่
  • setup: คำสั่งข้างในทำครั้งเดียวเมื่อเริ่ม Run เหมาะกับการเตรียมงานหรือทดลองเดินแล้วหยุดหนึ่งครั้ง
  • loop: คำสั่งข้างในทำซ้ำจนสั่งหยุด เหมาะกับการอ่านเซนเซอร์ต่อเนื่อง
  • บล็อกคำสั่งต้องต่อเข้าช่องของ setup หรือ loop ให้ติดกัน บล็อกที่ลอยอยู่ข้างนอกอาจไม่ถูกนำไปทำงาน

ภาพบล็อกในคู่มือใช้ดูประกอบ การลาก/แก้ค่าต้องทำใน Simulator หลัง Open ไฟล์

setup กับ loop ยังว่าง กด Run แล้วจะเกิดอะไร

หุ่นไม่เดิน เพราะยังไม่มีคำสั่งมอเตอร์ ปุ่มเปลี่ยนเป็น STOP ได้แม้ loop ว่าง กด STOP เมื่อดูเสร็จ

ดูตัวอย่างบล็อกลอยที่ไม่ถูกทำงาน
บล็อก FORWARD อยู่ทางขวาแยกจาก setup และ loop ไม่มีการต่อเข้าช่องคำสั่ง
ภาพจาก Blockly จริง: FORWARD ลอยอยู่ข้างนอก จึงไม่เกิดคำสั่งเดินในโปรแกรมที่สร้าง ให้ลากเข้าช่อง setup จนต่อสนิทก่อน Run

3. ปุ่มควบคุมที่ต้องรู้

RUN → STOP
กด RUN เพื่อเริ่ม เมื่อทำงานปุ่มเดิมเปลี่ยนเป็น STOP กดอีกครั้งเพื่อหยุดโปรแกรม โดยหุ่นไม่ถูกย้ายกลับจุดเริ่มทันที
Reset
หยุดการทดลองและคืนจุดเริ่มมาตรฐานของสนาม โดยบล็อกยังอยู่ ในไฟล์บทนี้จุดเริ่มคือมุมล่างซ้ายหันขึ้น
Save / Open
Save เก็บโปรเจกต์ .srazor ไว้ในเครื่อง Open ใช้เปิดกลับมาแก้บล็อก อย่าเลือก .ino ถ้าต้องการเก็บบล็อกไว้เรียนต่อ
บล็อก “หยุด” ใน MOTOR
หยุดล้อ ไม่ได้หยุดโปรแกรมทั้งหมด จึงต่างจากปุ่ม STOP

เพื่อเทียบผลระหว่างบท ให้เปิดไฟล์ตัวอย่างเดิมใหม่ก่อน Run หากเปลี่ยนตำแหน่งหรือสนามเอง Reset อาจกลับจุดมาตรฐานที่ต่างจากจุดที่เพิ่งวางไว้

ลองเองก่อนขึ้นบทถัดไป

  1. เปิดไฟล์เริ่มต้น กด RUN แล้ว STOP ตรวจว่าหุ่นยังไม่เดิน
  2. กด Save เปิดไฟล์ที่เพิ่งบันทึก และตรวจว่า setup/loop ยังอยู่
  3. ชี้เมนู MOTOR, TIME, SENSORS และ CONSOLE ให้ครบโดยไม่ดูภาพ
ถ้าเปิดไฟล์แล้วไม่เห็นบล็อก

ตรวจว่าไฟล์ลงท้าย .srazor และปุ่มโหมดเป็น Blocks Mode หากเพิ่งเปิด .ino ให้กลับมา Open ไฟล์ .srazor ของบทนี้

RazorS3 · บท 1 · MOTOR

ให้หุ่นเดินแล้วหยุด

MOTOR มีไว้สั่งล้อซ้ายและขวา เราจะให้ทั้งสองล้อเดินเท่ากัน รอ 1 วินาที แล้วหยุด

ต้องรู้ก่อน:
จบบทนี้แล้ว: ต่อเดิน → รอ → หยุดใน setup ได้ และอธิบายว่าบล็อกหยุดต่างจาก STOP อย่างไร

1. หาบล็อกในเมนูจริง

เปิด MOTOR เลือก FORWARD L / R และ หยุด ส่วนบล็อก หน่วง … ms ใช้จากเมนู TIME ไม่ต้องเลือกบล็อก MOVE ใน RAZORS3 สำหรับบทนี้

เมนู MOTOR ที่เปิดจริง มี FORWARD L R BACKWARD และบล็อกหยุด
เมนู MOTOR จริง · กดภาพเพื่ออ่านชื่อบล็อกขนาดเต็ม

2. ดูโปรแกรมทั้งชุด

บล็อกจริงใน setup: FORWARD L 35 R 35 ต่อหน่วง 1000 ms แล้วหยุด ส่วน loop ว่าง
L = 35, R = 35
L คือล้อซ้าย R คือล้อขวา เป็นระดับคำสั่งความเร็ว ไม่ใช่ระยะทาง 35 ซม. บทนี้ให้เท่ากันเพื่อฝึกเดินตรง
1000 ms
รอ 1 วินาทีก่อนทำคำสั่งถัดไป ระหว่างรอล้อยังเดินจากคำสั่งก่อนหน้า
หยุด
หยุดล้อทั้งสองหลังครบเวลา แต่โปรแกรมยังทำ loop ว่างต่อได้
ดาวน์โหลด เดิน 1000 ms แล้วหยุด

Open ไฟล์นี้ แล้วดูว่าเป็น RAZOR-S3 / สนามซ้อมอิสระ / หุ่นเริ่มมุมล่างซ้ายหันขึ้น ภาพบล็อกและไฟล์ใช้ค่าเดียวกัน

3. ทำนายก่อนกด RUN

หุ่นจะเดินไปทางใด และหลังหนึ่งวินาทีล้อจะทำอะไร ลองตอบก่อนเปิดดูผล

ผลที่ตรวจ: หุ่นเดินขึ้นจากจุดเริ่ม แล้วล้อหยุด ปุ่มบนยังแสดง STOP ได้ นี่เป็นผลจำลอง ไม่ใช่การรับรองระยะวิ่งของหุ่นจริง
ผล Run จริงในตัวจำลอง หุ่นเดินขึ้นจากมุมล่างซ้าย ล้อหยุดหลัง 1000 ms และปุ่มยังเป็น STOP
ผลจำลองจากไฟล์เดิน 1000 ms · เมื่อดูเสร็จกด STOP

4. เปลี่ยนค่า แล้วต่อเอง

  1. เปลี่ยน L และ R จาก 35 เป็น 20 ทั้งคู่ เปิดกลับจากจุดเริ่มเดิมก่อนทดลอง คาดว่าจะเดินเร็วขึ้นหรือช้าลง
  2. Save เป็นชื่อใหม่ แล้ว Open กลับ ตรวจว่าค่าที่เปลี่ยนยังอยู่
  3. เปิดไฟล์เริ่มต้นจากบท 0 แล้วลากบล็อกมาต่อเองให้เดิน 1000 ms แล้วหยุด โดยไม่ดูภาพเฉลย
เฉลยและเกณฑ์ตรวจตนเอง

L/R 20 เป็นคำสั่งที่ช้าลงเมื่อเงื่อนไขเหมือนเดิม ชุดที่ต่อเองต้องอยู่ใน setup ตามลำดับ FORWARD → หน่วง 1000 ms → หยุด โดย loop ว่าง และล้อหยุดหลัง Run

หุ่นไม่เดิน / เดินไม่หยุด / วนใหม่ตลอด

ไม่เดิน: ตรวจโหมดและบล็อกที่ลอย เดินไม่หยุด: ตรวจว่ามีบล็อกหยุดต่อหลังหน่วง ถ้าเริ่มเดินซ้ำ: ตรวจว่าเผลอต่อทั้งชุดใน loop หรือไม่ ถ้าล้อหยุดแต่ปุ่มยัง STOP: กด STOP เพื่อจบโปรแกรม

RazorS3 · บท 2 · TIME

เปลี่ยนเวลารอ ผลต่างกันอย่างไร

TIME ใช้กำหนดช่วงเวลารอ ไม่ได้กำหนดระยะทาง บทนี้เปลี่ยนเพียงเวลา แล้วเทียบกับโปรแกรมเดิม

ต้องรู้ก่อน:
จบบทนี้แล้ว: แปลง ms เป็นวินาที และเลือกเวลาที่ต้องการได้

1. บล็อกหน่วงอยู่ที่ไหน

เมนู TIME จริง มีบล็อกหน่วงพร้อมช่องตัวเลขและ ms และบล็อกเวลาที่ผ่านไป
ใช้บล็อกหน่วงใน TIME ก่อน บล็อก millis เป็นเรื่องต่อยอด
ms = มิลลิวินาที
1000 ms = 1 วินาที · 500 ms = 0.5 วินาที · 2000 ms = 2 วินาที
หน่วงไม่ได้สั่งหยุดล้อ
ถ้าล้อกำลังเดิน ล้อจะยังเดินระหว่างรอ จึงต้องมีคำสั่งหยุดหลังหน่วงเมื่อโจทย์ต้องการให้หยุด

2. เปลี่ยน 1000 เป็น 500 เพียงช่องเดียว

บล็อกจริง FORWARD L 35 R 35 หน่วง 500 ms แล้วหยุดใน setup loop ว่าง

ความเร็วทั้งสองข้างยังเป็น 35 และลำดับบล็อกเหมือนบทก่อน เปลี่ยนเฉพาะเวลาจาก 1000 เป็น 500 ms

ดาวน์โหลด เดิน 500 ms แล้วหยุด

ก่อน Run ให้ทำนายว่าเดินนานขึ้นหรือสั้นลง จากนั้น Open ไฟล์ 1000 ms และไฟล์ 500 ms ทีละไฟล์เพื่อเทียบ โดยเริ่มที่เดิมทุกครั้ง

3. เทียบผลจากไฟล์เดียวกับที่เรียน

ผลจำลอง 500 ms หุ่นเดินจากมุมล่างซ้ายเป็นระยะสั้นกว่าตัวอย่าง 1000 ms
500 ms = ครึ่งวินาที
ผลจำลอง 1000 ms หุ่นเดินนานกว่าและไกลกว่ากรณี 500 ms ภายใต้ค่าและจุดเริ่มเดียวกัน
1000 ms = หนึ่งวินาที
ตรวจในตัวจำลองแล้วว่า 500 ms เดินสั้นกว่า 1000 ms เมื่อค่าที่เหลือเหมือนกัน ไม่ใช้เวลาแทนระยะทางที่แน่นอน เช่น 1000 ms ไม่ได้แปลว่าเดิน 100 ซม.

4. ลองเลือกเวลาของตัวเอง

  1. อยากรอ 0.75 วินาที ต้องใส่กี่ ms ตอบก่อนเปิดเฉลย
  2. เปลี่ยนเป็น 750 ms Save แล้ว Run จากจุดเริ่มเดิม ผลควรอยู่ระหว่างตัวอย่าง 500 และ 1000 ms
  3. จากไฟล์เริ่มต้น ต่อเดิน → รอ 500 ms → หยุดเอง แล้วอธิบายว่าทำไมต้องมีทั้งหน่วงและหยุด
เฉลย

0.75 วินาที = 750 ms หน่วงกำหนดเวลาที่รอก่อนคำสั่งถัดไป ส่วนหยุดสั่งล้อให้หยุด จึงทำหน้าที่คนละอย่าง

ใส่ 1 แล้วแทบไม่เห็นหุ่นเดิน

ช่องนี้ใช้ ms เลข 1 คือ 1 มิลลิวินาที ถ้าต้องการหนึ่งวินาทีให้ใส่ 1000 ตรวจชื่อหน่วยข้างช่องก่อนทุกครั้ง

RazorS3 · บท 3 · SENSORS

อ่านค่าเซนเซอร์เส้นครั้งแรก

เซนเซอร์มีไว้รับข้อมูลจากสิ่งรอบตัว บทนี้อ่าน A0 แล้วแสดงค่าซ้ำใน CONSOLE โดยหุ่นยังไม่เดิน

ต้องรู้ก่อน: และ
จบบทนี้แล้ว: ต่อบล็อกที่คืนค่าเข้า Serial.println ได้ และตรวจว่าค่าอ่านออกมาแล้ว

1. ใช้สองเมนูร่วมกัน

เปิด SENSORS เพื่อหา analogRead A0 แล้วเปิด ADVANCED เพื่อหา Serial.println ซึ่งแสดงค่าเป็นบรรทัดใน CONSOLE ใต้สนาม Serial ไม่มีเมนูแยกในรุ่นนี้

เมนู SENSORS จริง มีบล็อก analogRead A0 ที่คืนค่าตัวเลข
รับค่าจาก SENSORS
เมนู ADVANCED จริง มี Serial.println พร้อมช่องรับค่า
แสดงค่าด้วย ADVANCED

2. ต่อบล็อกที่คืนค่าเข้าช่องของคำสั่ง

setup ว่าง loop มี Serial.println ที่เสียบ analogRead A0 และต่อหน่วง 250 ms
analogRead A0
อ่านค่าความสว่างของพื้นตรงเซนเซอร์ A0 ในตัวจำลอง เป็นตัวเลข ไม่ใช่คำสั่งให้หุ่นเดิน ในโมเดลจำลองนี้ A0 อยู่ด้านหน้าซ้าย
ช่องของ Serial.println
เสียบบล็อก analogRead เข้าแทนค่าที่อยู่ในช่อง คำสั่งนี้จึงพิมพ์ตัวเลขที่อ่านได้ ไม่ใช่พิมพ์ข้อความ A0
วางใน loop + หน่วง 250 ms
อ่านและพิมพ์ซ้ำ รอหนึ่งในสี่วินาทีก่อนอ่านรอบถัดไป ไม่มีคำสั่งมอเตอร์จึงไม่สั่งให้หุ่นเดิน
ดาวน์โหลด อ่าน A0 ต่อเนื่อง

Open แล้ว Run ในสนามซ้อมอิสระที่จุดเริ่มของไฟล์ ดูตัวเลขใน CONSOLE เมื่ออ่านเสร็จกด STOP

3. อ่านผลโดยไม่จำตัวเลขตายตัว

ผล Run จริงของการอ่าน A0: CONSOLE แสดง 1023 ซ้ำ หุ่นอยู่นิ่งที่จุดเริ่ม
ผลจำลองที่ตรวจในเครื่อง: พื้นใต้ A0 ตรงจุดเริ่มอ่านได้ 1023

ในตัวจำลองนี้ค่าพื้นมืดต่ำกว่าพื้นสว่างและมีช่วง 0–1023 ค่าไม่ใช่ระยะทางหรือหน่วย cm ค่าอาจต่างจากภาพเมื่อย้ายหุ่น เปลี่ยนพื้น หรือเปลี่ยนการจำลองความสมจริง อย่าฟันธงว่า A0 ต้องเป็น 1023 เสมอ

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

4. ทดลองเองและอ่านสิ่งที่เปลี่ยน

  1. เปลี่ยนช่อง A0 เป็น A1 ใน dropdown แล้ว Run อ่านค่าจากเซนเซอร์อีกตำแหน่งหนึ่ง ค่าทั้งสองอาจเท่ากันถ้าอยู่บนพื้นสีเดียวกัน
  2. เปลี่ยนเวลาจาก 250 เป็น 1000 ms ทำนายว่าข้อความจะออกถี่ขึ้นหรือช้าลง แล้วทดลอง
  3. กลับไฟล์เริ่มต้น แล้วต่อ Serial.println + analogRead A0 ใน loop ด้วยตัวเอง เพิ่มหน่วง 250 ms และตรวจว่ามีตัวเลขออกซ้ำ
เฉลยและเกณฑ์ตรวจ

1000 ms ทำให้พิมพ์ห่างขึ้น บล็อกอ่านค่าต้องเสียบใน Serial.println และทั้งคำสั่งอยู่ใน loop การเปลี่ยน A0 เป็น A1 เปลี่ยนจุดรับข้อมูล ไม่ได้รับประกันว่าตัวเลขต้องต่างกัน

ไม่มีตัวเลข / ออกครั้งเดียว / พิมพ์คำว่า A0

ไม่มีตัวเลข: ตรวจ RUN และแท็บ CONSOLE รวมทั้งบล็อกที่ลอย ออกครั้งเดียว: ตรวจว่าอยู่ใน setup แทน loop หรือไม่ พิมพ์คำว่า A0: อาจใช้บล็อกข้อความแทน analogRead ให้เสียบบล็อกอ่านค่าจริง

ตรวจว่าพร้อมเรียนต่อหรือยัง

  • บอกได้ว่าต้องใช้ SENSORS รับค่า และ ADVANCED แสดงค่า
  • ต่อโปรแกรมจากไฟล์เริ่มต้นเอง และกด STOP หยุดการอ่านได้
  • อธิบายได้ว่าทำไมเปลี่ยนเวลารอแล้วความถี่ข้อความเปลี่ยน

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

RazorS3 · ค้นตามเมนู

อยากให้หุ่นทำอะไร

ครบ 11 หมวดที่เห็นเมื่อเลือก RazorS3 เริ่มจากงานที่ต้องการทำ แล้วค่อยเลือกบล็อก

ภาพใน 4 บทแรกมาจากหน้าจอและบล็อกจริงของ RazorSIM ผลที่แสดงเป็นผลจำลอง ภาพถ่ายหุ่นจริงยังไม่ได้เพิ่ม

เริ่มเรียน RazorS3 จากหน้าเปล่า

เปิดโปรแกรมครั้งแรก → เดินแล้วหยุด → เปลี่ยนเวลา → อ่านเซนเซอร์ มีภาพบล็อกจริงและไฟล์ทดลองทุกบท

ใหม่: ตัวอย่างบล็อกพร้อมไฟล์เปิดทดลอง

เริ่มจากเดินแล้วหยุด วนซ้ำ อ่านเซนเซอร์ MOVE การปล่อยลูกบาศก์ และกลไก ANT-S1

🚀 เริ่มต้นใช้งาน RazorRobot Simulator

แพลตฟอร์มจำลองหุ่นยนต์และการเขียนโปรแกรมเสมือนจริง รองรับทั้ง Block-based Programming และ C++ (Arduino Style)

🖥️ องค์ประกอบของหน้าจอ Simulator

หน้าจอจำลองถูกแบ่งออกเป็น 2 ฝั่งหลักเพื่อความสะดวกในการเรียนรู้และทดสอบโปรแกรม:

ฝั่งซ้าย (Code / Blocks)
พื้นที่เขียนโปรแกรม สลับได้ระหว่างโหมดบล็อกและ C++
ฝั่งขวา (3D/2D Simulator)
สนามจำลองที่คำนวณการเคลื่อนที่ มอเตอร์ และเซนเซอร์
แถบควบคุมด้านบน
ปุ่ม RUN (เริ่ม), Reset (วางตำแหน่งใหม่), Robot และ MAP
🧩 โครงสร้างโปรแกรมพื้นฐาน: setup() vs loop()
ฟังก์ชัน หน้าที่และการทำงาน ตัวอย่างบล็อกที่เหมาะสม
void setup() ทำงาน เพียง 1 ครั้ง เมื่อกดปุ่ม RUN เหมาะสำหรับการตั้งค่าเริ่มต้น, รอสัญญาณ หรือการวิ่งภารกิจแบบสเต็ปขั้นตอน MOVE (กำหนดเวลา), หน่วงเวลา, หมุนในที่, ยิงปล่อยกล่อง
void loop() ทำงาน วนซ้ำตลอดเวลา ไม่รู้จบ เหมาะสำหรับการอ่านเซนเซอร์เส้น, ตรวจจับสิ่งกีดขวาง หรือการเขียนเงื่อนไขตัดสินใจ MOVE_LOOP (ไม่บล็อกเวลา), ถ้า...ให้ทำ (if), อ่านเซนเซอร์เส้น

⏱️ หมวดบล็อค TIME (เวลาและการหน่วงเวลา)

คู่มือการใช้งานบล็อคในแถบสีฟ้า (TIME) สำหรับคนเริ่มต้น — เข้าใจง่าย ใช้งานได้ทันที

💡
สรุปสั้นๆ ให้เข้าใจง่าย: ในหมวดนี้มีบล็อคเพียง 2 ตัว ที่ทำหน้าที่คนละอย่างกันอย่างสิ้นเชิง:
  • บล็อค "หน่วงเวลา (delay)": ใช้เมื่อต้องการสั่งให้หุ่นยนต์ "รอ" ก่อนทำคำสั่งถัดไป
  • บล็อค "millis()": ใช้เหมือน "นาฬิกาจับเวลา" ดูว่าหุ่นยนต์วิ่งไปกี่วินาทีแล้ว
1️⃣ บล็อค หน่วงเวลา (Delay)
บล็อค หน่วงเวลา
บล็อคหน่วงเวลา (หน่วยเป็นมิลลิวินาที ms)
TIME หน้าที่ของบล็อคนี้

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

🔢 ตัวย่อหน่วยเวลา ms
1000 ms = 1 วินาทีเต็ม
⏱️ ครึ่งวินาที
500 ms = 0.5 วินาที
⏳ 2 วินาที
2000 ms = 2 วินาที
⚠️
สิ่งที่มือใหม่มักเข้าใจผิดบ่อยที่สุด:
การสั่ง "หน่วงเวลา" ไม่ได้แปลว่าหุ่นยนต์จะหยุดวิ่ง!
ในขณะที่โปรแกรมกำลังรอ มอเตอร์จะยังคงหมุนทำงานตามคำสั่งล่าสุดที่สั่งไว้ก่อนหน้า
  • ถ้าอยากให้วิ่งไปข้างหน้า 1 วินาทีแล้วหยุด: ต้องต่อบล็อค [เดินหน้า fd(80)] ➔ [หน่วง 1000 ms] ➔ [หยุดมอเตอร์ ao()]
  • ถ้าอยากให้หุ่นยนต์ยืนอยู่นิ่งๆ เพื่อรอ: ต้องสั่งบล็อค [หยุดมอเตอร์ ao()] ก่อน แล้วจึงตามด้วยบล็อค [หน่วง ... ms]

📝 ตัวอย่างโค้ด C++ ที่โปรแกรมแปลงออกมา:

fd(80);         // สั่งมอเตอร์เดินหน้าความเร็ว 80%
delay(1000);     // หน่วงเวลา 1000 ms (หุ่นยนต์จะวิ่งไปข้างหน้านาน 1 วินาที)
ao();            // สั่งดับมอเตอร์ทุกตัวเพื่อหยุดสนิท
2️⃣ บล็อค millis() (นาฬิกาจับเวลาสะสม)
บล็อค millis()
บล็อคอ่านเวลาสะสม (คืนค่าเป็นตัวเลข ms)
TIME หน้าที่ของบล็อคนี้

เปรียบเสมือน "นาฬิกาจับเวลา" ในตัวหุ่นยนต์ ทันทีที่เรากดปุ่ม RUN ปุ๊บ นาฬิกานี้จะเริ่มนับเวลาตั้งแต่ 0, 1, 2, 3... มิลลิวินาที สะสมขึ้นเรื่อยๆ ตลอดเวลาที่หุ่นยนต์กำลังทำงาน

🔌
วิธีต่อบล็อคนี้: บล็อคนี้มีเดือยยื่นด้านซ้าย (เป็นค่าตัวเลข) ไม่สามารถต่อเดี่ยวๆ บนหน้าจอได้ ต้องนำไป เสียบเข้ากับช่องเงื่อนไขในหมวด LOGIC (เช่น millis() > 3000) หรือนำไปเก็บใส่ตัวแปร

🎯 ประโยชน์ที่นิยมใช้ในการแข่งขันจริง:

🛑 ตัวตัดเวลาฉุกเฉิน (Timeout)
ถ้าสั่งหุ่นยนต์วิ่งหาเส้นดำแล้วติดเกิน 5 วินาที (5000 ms) ให้ข้ามไปทำภารกิจต่อไปทันที
⚡ จับเวลาโดยไม่ทำให้โปรแกรมค้าง
หุ่นยนต์สามารถอ่านเซนเซอร์และตัดสินใจตลอดเวลาได้ โดยไม่ต้องใช้บล็อคหน่วงเวลา (Non-blocking)

🔁 หมวดบล็อค LOOP (การวนซ้ำและการควบคุมลูป)

คู่มือการใช้งานบล็อคในแถบสีเขียว (LOOP) สำหรับคนเริ่มต้น — สั่งให้หุ่นยนต์ทำงานซ้ำๆ ได้อย่างง่ายดาย

💡
LOOP คืออะไร? คือการสั่งให้หุ่นยนต์ "ทำคำสั่งเดิมซ้ำๆ หลายรอบ" โดยที่เราไม่ต้องลากบล็อคเดิมมาต่อยาวๆ ให้เมื่อยมือ โดยในโปรแกรมแบ่งออกเป็น 2 กลุ่มย่อย:
  1. กลุ่มวนซ้ำ: สั่งให้ทำซ้ำแบบไม่รู้จบ, ทำซ้ำตามเงื่อนไข, หรือทำซ้ำตามจำนวนรอบ
  2. กลุ่มหยุด/ข้าม: สั่งเบรกออกจากลูปทันที หรือสั่งข้ามไปรอบถัดไป

📦 กลุ่มที่ 1: บล็อควนซ้ำ (Looping)

1. บล็อค forever — วนไม่หยุด (ทำซ้ำตลอดกาล)
บล็อค forever วนไม่หยุด

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

🎯 เหมาะสำหรับ: นำไปวางใน void setup() เพื่อสร้างระบบเดินตามเส้น หรือระบบเดินหลบกำแพงอัตโนมัติ

while (true) {
  // คำสั่งข้างในนี้จะทำงานวนรอบไม่รู้จบ
}
2. บล็อค repeat while (วนซ้ำ "ขณะที่" เงื่อนไขยังเป็นจริง)
บล็อค repeat while

หุ่นยนต์จะตรวจดูก่อนว่าเงื่อนไขในช่องด้านบน "ยังเป็นจริงอยู่ไหม?" ถ้าจริง จะลงไปทำคำสั่งในช่อง 1 รอบ แล้วกลับขึ้นมาตรวจเงื่อนไขใหม่เรื่อยๆ จนกว่าเงื่อนไขจะกลายเป็นเท็จ จึงจะยอมหลุดออกจากลูป

🚗
ตัวอย่างสถานการณ์จริง:
• เงื่อนไข: ระยะทางเซนเซอร์หน้า > 15 cm
• คำสั่งข้างใน: เดินหน้า fd(80)
• ผลลัพธ์: หุ่นยนต์จะวิ่งเดินหน้าไปเรื่อยๆ "ขณะที่" ด้านหน้ายังโล่งอยู่ แต่พอวิ่งไปใกล้กำแพงจนเหลือน้อยกว่า 15 cm ปุ๊บ หุ่นยนต์จะหยุดทำคำสั่งในลูปทันที!
3. บล็อค repeat until (วนซ้ำ "จนกระทั่ง" เจอสิ่งที่ต้องการ)
บล็อค repeat until

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

🏁
ตัวอย่างสถานการณ์จริง:
• เงื่อนไข: เซนเซอร์เส้น A0 < 500 (เจอเส้นดำ)
• คำสั่งข้างใน: เดินหน้า fd(60)
• ผลลัพธ์: หุ่นยนต์จะวิ่งตรงไปเรื่อยๆ จนกระทั่งเซนเซอร์แตะโดนเส้นดำปุ๊บ จะหลุดออกจากลูปทันที เพื่อไปทำคำสั่งเลี้ยวหรือหยุดในขั้นตอนต่อไป
4. บล็อค repeat [5] times (วนซ้ำตามจำนวนรอบที่ระบุ)
บล็อค repeat N times

สั่งให้คำสั่งภายในทำงานซ้ำตามจำนวนตัวเลขที่ระบุ เช่น ใส่เลข 4 ก็จะทำงานวนข้างใน 4 รอบเป๊ะๆ แล้วจบการทำงาน

🎯 ตัวอย่างการใช้จริง: สั่งยิงปล่อยลูกบาศก์ภารกิจ 4 ลูกลงโซนภารกิจ โดยใส่คำสั่ง [ยิงกล่อง kickF()] ไว้ข้างในลูป 4 รอบ

for (int count = 0; count < 4; count++) {
  kickF();         // ยิงปล่อยกล่องภารกิจด้านหน้า
  delay(200);
}
5. บล็อค count with [i] (ลูปนับตัวแปร / For Loop)
บล็อค count with for loop

วนซ้ำโดยมี "ตัวแปร" (เช่น ตัวแปร i) คอยนับตัวเลขจากค่าเริ่มต้นไปถึงค่าสิ้นสุด และเพิ่มค่าขึ้นทีละสเต็ปในแต่ละรอบ

🎯 ตัวอย่างการใช้จริง: การเร่งความเร็วมอเตอร์อย่างนุ่มนวล (Soft Start) เช่น เริ่มจากความเร็ว 20 ไปถึง 100 เพิ่มทีละ 10

// เร่งความเร็วจาก 20% ถึง 100% ทีละ 10%
for (int i = 20; i <= 100; i += 10) {
  fd(i);
  delay(100);
}

🛑 กลุ่มที่ 2: บล็อคหยุด / ข้ามลูป (Loop Control)

6. บล็อค break out (หยุดลูปทันที) & continue (ข้ามไปรอบถัดไป)
บล็อค break out of loop
break out of loop (สั่งเบรกฉุกเฉิน ออกจากลูปทันที)
บล็อค continue with next iteration
continue with next iteration (ข้ามรอบนี้ ไปเริ่มรอบใหม่)
บล็อคคำสั่ง โค้ด C++ หน้าที่และการทำงาน
break out of loop break; เบรกฉุกเฉิน: กระโดดออกจากลูปทันที ไม่ทำคำสั่งที่เหลือ และไม่วนรอบต่อไปอีก (มักใช้คู่กับเงื่อนไข if ถ้า... ภายในลูป)
continue with next iteration continue; ข้ามรอบปัจจุบัน: ข้ามคำสั่งที่เหลือด้านล่างในรอบนี้ แล้วกระโดดขึ้นไปเริ่มต้นวนรอบใหม่ทันที

🧭 1. ระบบทิศทางและบล็อคคำสั่งเคลื่อนที่ (Heading & Motion Guide)

คู่มือระบบพิกัดองศาไจโรสโคป (Gyro Heading) การกำหนดทิศทางเดินหน้า/ถอยหลัง และการใช้งานบล็อคควบคุมการเคลื่อนที่ขั้นสูง (MOVE / DIFF / SPIN) ใน RazorIDE

📍 แผนผังระบบองศา: ใช้หน้าหุ่นยนต์เดิน vs ใช้หลังหุ่นยนต์เดิน

ใน RazorRobot Simulator และการแข่งขันหุ่นยนต์จริง ระบบจะอ้างอิงทิศทางสนามด้วยมุมองศาเข็มทิศสัมบูรณ์ (0°–360°) โดยการเลือกใช้ "หน้าหุ่นยนต์" หรือ "หลังหุ่นยนต์" เป็นแกนนำทาง จะมีองศาที่สอดคล้องกันดังนี้:

แผนผังทิศทางหุ่นยนต์
รูปที่ 1: แผนผังเปรียบเทียบองศาการเคลื่อนที่ระหว่างการใช้หน้าหุ่นยนต์เดิน (ซ้าย) และการใช้หลังหุ่นยนต์เดิน (ขวา)
ทิศทางในสนาม 🤖 ใช้หน้าหุ่นยนต์เดิน (Front) 🔙 ใช้หลังหุ่นยนต์เดิน (Rear) คำอธิบายพฤติกรรม
⬆️ ขึ้นบน (ทิศเหนือ) 0 องศา (ตรงขึ้น) 180 องศา หุ่นยนต์วิ่งมุ่งหน้าขึ้นสู่ด้านบนของสนาม
➡️ ไปทางขวา (ทิศตะวันออก) 90 องศา (เลี้ยวขวา) 270 องศา หุ่นยนต์เคลื่อนที่เบนออกไปทางขวามือของสนาม
⬇️ ลงล่าง (ทิศใต้) 180 องศา (ตรงลง) 0 องศา หุ่นยนต์เคลื่อนที่มุ่งลงสู่ด้านล่างของสนาม
⬅️ ไปทางซ้าย (ทิศตะวันตก) 270 องศา (เลี้ยวซ้าย) 90 องศา หุ่นยนต์เคลื่อนที่เบนออกไปทางซ้ายมือของสนาม
💡
หลักการจำง่ายๆ: เมื่อเลือกใช้ "หน้าหุ่นยนต์เดิน" ทิศ 0° จะมุ่งตรงไปข้างหน้าเสมอ และองศาจะวนตามเข็มนาฬิกา (90° = ขวา, 180° = ถอยหลัง, 270° = ซ้าย)

⚡ เจาะลึก 3 บล็อคคำสั่งการเคลื่อนที่หลักของ RAZOR-S3

1️⃣ บล็อค MOVE (วิ่งตรงล็อคทิศทางด้วย Gyro + PID)
บล็อคคำสั่ง MOVE

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

พารามิเตอร์ ค่าเริ่มต้น หน้าที่และการปรับแต่ง
แกนนำ / องศา หน้า · 0° เลือกแกนอ้างอิง (หน้า/หลัง) และมุมองศาเป้าหมายในสนาม (0–360°)
ความเร็วต้น 20% ความเร็วขณะเริ่มออกตัว ช่วยป้องกันไม่ให้ล้อหมุนฟรีและลดแรงกระชาก
speed 30% ความเร็วหลักในการเคลื่อนที่ (ปรับเพิ่มได้ถึง 100% ตามความชำนาญ)
time 500 ms ระยะเวลาที่ต้องการให้วิ่ง (มิลลิวินาที: 1000 ms = 1 วินาที)
KP / KI / KD 1 / 0 / 0.05 พารามิเตอร์ควบคุม PID ดึงหุ่นให้ตรง ค่าเริ่มต้นถูกปรับจูนมาอย่างเหมาะสมแล้ว
เร่ง / ชะลอ 0 / 0 ms ช่วงเวลา Soft-start เร่งความเร็วขึ้น และ Soft-stop ชะลอความเร็วก่อนหยุด
2️⃣ บล็อค ดิฟ (DIFF · Differential Turn)
บล็อคคำสั่ง ดิฟ เลี้ยวโค้ง

สั่งให้หุ่นยนต์เลี้ยวโค้งเข้าหามุมองศาเป้าหมายด้วยการหักความเร็วสองล้อให้ต่างกัน (ล้อด้านในโค้งหมุนช้า ล้อด้านนอกโค้งหมุนเร็ว) ทำให้เข้าโค้งได้อย่างนุ่มนวลและรักษาความเร็วไว้ได้ต่อเนื่อง

พารามิเตอร์ ค่าเริ่มต้น หน้าที่และการปรับแต่ง
ทิศ / องศา 90° มุมองศาเป้าหมายที่ต้องการเลี้ยวไปหา
เร็วสุด / ช้าสุด 80 / 20 ความเร็วสูงสุดของล้อนอกโค้ง และความเร็วต่ำสุดของล้อในโค้ง
หยุดที่ 3 ° ระยะความคลาดเคลื่อนที่ยอมรับได้ (เช่น 3° หมายถึงเลี้ยวถึง 87°–93° ถือว่าสำเร็จ)
timeout 2000 ms เวลาตัดการทำงานอัตโนมัติหากหุ่นยนต์ติดขัดหรือชนขอบสนาม
3️⃣ บล็อค หมุน (SPIN · Spin in Place)
บล็อคคำสั่ง หมุนตัวอยู่กับที่

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

พารามิเตอร์ ค่าเริ่มต้น หน้าที่และการปรับแต่ง
ทิศ / องศา 90° องศาเป้าหมายที่ต้องการหมุนไปหา
เร็วสุด / ช้าสุด 80 / 30 ความเร็วในการหมุนตัว (ระบบจะค่อยๆ ชะลอเมื่อใกล้ถึงมุมเพื่อกันการหมุนเลย)
หยุดที่ / timeout 3° / 2000 ms ค่าความคลาดเคลื่อนที่ยอมรับได้ และเวลาตัดการหมุนอัตโนมัติ

🔁 2. บล็อค MOVE_LOOP (เดินเกาะทิศใน loop แบบไม่บล็อกเวลา)

เรียนรู้วิธีสั่งให้หุ่นยนต์วิ่งตรงด้วยไจโร พร้อมกับอ่านเซนเซอร์และตัดสินใจตลอดเวลาใน void loop()

💡
ทำไมต้องมี MOVE_LOOP?
บล็อค MOVE ปกติจะสั่งให้หุ่นยนต์ "วิ่งตามเวลา" (เช่น วิ่ง 2 วินาที) ซึ่งในระหว่าง 2 วินาทีนั้น สมองกลจะไม่ยอมอ่านเซนเซอร์เส้นหรือตรวจจับกำแพงเลย
บล็อค MOVE_LOOP จึงถูกสร้างขึ้นมาเพื่อให้หุ่นยนต์ "วิ่งตรงด้วยไจโรทีละสเต็ปสั้นๆ" ทำให้เราสามารถอ่านค่าเซนเซอร์เส้นไปพร้อมๆ กันได้ในลูป!
⚙️ บล็อคคำสั่งในกลุ่ม MOVE_LOOP
RAZORS3 🔁 MOVE_LOOP [ทิศทาง] [องศา] ความเร็วต้น [STARTSPD] speed [SPD] KP [KP] KD [KD] วางใน loop() เท่านั้น

สั่งคำนวณไจโร PID และขับมอเตอร์เพื่อรักษาทิศทาง 1 สเต็ป โดยไม่หยุดรอเวลา เหมาะสำหรับการวางไว้ใน void loop() หรือในลูป forever / repeat while

พารามิเตอร์ ค่าเริ่มต้น หน้าที่และการปรับแต่ง
ทิศ / องศา หน้า · 0° มุมองศาที่ต้องการให้หุ่นยนต์วิ่งเกาะทิศไปเรื่อยๆ
ความเร็วต้น / speed 30 / 60 ความเร็วเริ่มต้น และความเร็วปกติในการเคลื่อนที่
KP / KD 1 / 0 ค่าน้ำหนัก PID ดึงหุ่นให้ตรงตามองศา
RAZORS3 🔄 MOVE_LOOP RESET (รีเซตการทำงาน)

ใช้สั่งรีเซ็ตตัวเร่งความเร็วเริ่มต้น (Start Speed) เมื่อเปลี่ยนทิศทางใหม่หรือเริ่มรอบการวิ่งครั้งใหม่

📝 ตัวอย่างการใช้งาน: วิ่งตรงเกาะทิศ 0° จนกว่าจะเจอเส้นดำ

ตัวอย่างการเขียนโค้ดสั่งให้หุ่นยนต์วิ่งตรงไปข้างหน้าด้วย MOVE_LOOP แล้วตรวจจับเซนเซอร์เส้น A0 ตลอดเวลา เมื่อเจอเส้นดำจะหยุดและเลี้ยวทันที:

void setup() {
  // ตั้งค่าเริ่มต้น
}

void loop() {
  // ตรวจสอบว่าเซนเซอร์ A0 เจอเส้นดำหรือยัง (ค่าน้อยกว่า 500 คือสีดำ)
  if (analogRead(A0) < 500) {
    ao();                   // หยุดมอเตอร์ทันทีเมื่อเจอเส้นดำ
    delay(200);
    razorSpin(1, 90, 80, 30, 3, 2000); // หมุนตัวไปทางขวา 90 องศา
  } else {
    // หากยังไม่เจอเส้นดำ ให้วิ่งเกาะทิศ 0 องศาต่อไป
    razorMoveLoop(1, 0, 30, 60, 1.0, 0.0);
  }
}

📦 3. ระบบกลไกยิงปล่อยลูกบาศก์ (Cube Launcher)

คู่มือการใช้งานระบบยิงปล่อยกล่องภารกิจสำหรับ Quick Box Drop Challenge และ Wall Tracking Rescue

🎯
จุดเด่นของ RAZOR-S3: หุ่นยนต์มาพร้อมกับกระบอกบรรจุลูกบาศก์ภารกิจ 4 ลูก และกลไกสปริง/เซอร์โวยิงปล่อยลูกบาศก์ได้ทั้ง ด้านหน้า และ ด้านหลัง ทำให้สามารถทำภารกิจส่งกล่องลงโซนเขียวได้อย่างรวดเร็วโดยไม่ต้องเสียเวลากลับตัว!
🎮 บล็อคคำสั่งควบคุมการยิง (Launcher Blocks)

บล็อคคำสั่งยิงกล่องอยู่ในแถบเครื่องมือสีส้ม MOTOR หรือพิมพ์คำสั่งภาษา C++ ได้โดยตรง:

🚀 ยิงด้านหน้า (Front)
บล็อค: ยิงปล่อยลูกบาศก์หน้า
C++: kickF(); หรือเลือกสี kickF("red");
🔙 ยิงด้านหลัง (Rear)
บล็อค: ยิงปล่อยลูกบาศก์หลัง
C++: kickB(); หรือเลือกสี kickB("blue");
💡 เคล็ดลับการทำภารกิจยิงกล่องให้ได้คะแนนเต็ม (Pro Tips)
📏 1. ระยะห่างที่เหมาะสม
ควรจอดหุ่นยนต์ให้ห่างจากขอบโซนสีเขียวประมาณ 5–10 cm กล่องจะพุ่งลงกึ่งกลางโซนพอดี
⏱️ 2. หน่วงเวลาหลังยิง
ทุกครั้งหลังสั่ง kickF() ให้ต่อบล็อค หน่วงเวลา 200–300 ms เพื่อให้ลูกบาศก์ตกถึงพื้นสนิท
🔁 3. ยิงปล่อยทีละหลายลูก
ใช้บล็อค repeat [N] times ครอบคำสั่งยิง เพื่อปล่อยกล่อง 2–4 ลูกติดต่อกันได้ทันที

📝 ตัวอย่างโค้ด: ขับไปหน้าโซน 1 ➔ ยิงกล่อง ➔ วิ่งเข้าเส้นชัย

void setup() {
  // 1. วิ่งตรง 1 วินาทีไปจอดหน้าโซนเขียว
  razorMove(1, 0, 60, 1000, 1.0, 0.0, 0.05, 0, 0, 20);
  ao();
  delay(200);

  // 2. ยิงปล่อยลูกบาศก์ด้านหน้า 1 ลูก
  kickF();
  delay(300);   // หน่วงเวลาให้กล่องตกถึงพื้น

  // 3. เลี้ยวขวา 90 องศา แล้ววิ่งเข้าเส้นชัย Finish
  razorSpin(1, 90, 80, 30, 3, 2000);
  razorMove(1, 90, 70, 1500, 1.0, 0.0, 0.05, 0, 0, 20);
  ao();
}

void loop() {}

📡 4. ระบบเซนเซอร์ตรวจจับเส้น & พิน A0–A3 (Line Sensors)

คู่มือการอ่านค่าเซนเซอร์แสงและตำแหน่งพิน A0–A3 บนหุ่นยนต์ RAZOR-S3 สำหรับตรวจจับเส้นดำและเส้นตัด

📍 ตำแหน่งพินเซนเซอร์เส้นบนตัวหุ่นยนต์ RAZOR-S3

RAZOR-S3 ติดตั้งเซนเซอร์ตรวจจับเส้นแบบอินฟราเรด (IR Line Sensors) จำนวน 4 พินหลักที่ใช้งานบ่อยที่สุด:

พิน (Pin) ตำแหน่งบนตัวหุ่น หน้าที่และการประยุกต์ใช้
A0 ด้านหน้า - ฝั่งซ้าย ตรวจจับเส้นดำฝั่งซ้ายหน้า / เช็คเส้นตัดร่วมกับ A1
A1 ด้านหน้า - ฝั่งขวา ตรวจจับเส้นดำฝั่งขวาหน้า / เช็คเส้นตัดร่วมกับ A0
A2 ด้านหลัง - ฝั่งซ้าย ตรวจจับเส้นดำขณะถอยหลัง (ใช้ร่วมกับโหมดหลังหุ่นยนต์เดิน)
A3 ด้านหลัง - ฝั่งขวา ตรวจจับเส้นดำขณะถอยหลัง (ใช้ร่วมกับโหมดหลังหุ่นยนต์เดิน)
⚪ ค่าที่อ่านได้ (Analog Values) & จุดตัด Threshold

เมื่อใช้คำสั่ง analogRead(A0) ค่าที่ส่งกลับมาจะมีค่าตั้งแต่ 0 ถึง 1023:

⚪ พื้นสีขาว (White Surface)
ค่าสูงประมาณ 800 – 1000
⚫ เส้นสีดำ / หลุม (Black Line / Pit)
ค่าต่ำประมาณ 100 – 300
⚖️ ค่าเกณฑ์ตัดสิน (Threshold)
แนะนำให้ใช้ค่ากึ่งกลาง 500
💡
สูตรจำง่ายๆ ในการเขียนเงื่อนไข:
  • analogRead(A0) < 500 ➔ แปลว่า "เจอเส้นดำ หรือ หลุมตก"
  • analogRead(A0) >= 500 ➔ แปลว่า "ยังอยู่บนพื้นสีขาว"
📝 รูปแบบเงื่อนไขยอดนิยมที่ใช้ในการแข่งขันจริง
🛑 1. เจอด้านใดด้านหนึ่งแล้วหยุด
(A0 < 500) || (A1 < 500)
ถ้าหน้าซ้าย หรือ หน้าขวา แตะโดนเส้นดำ
➕ 2. เช็คเส้นตัดสี่แยก (Cross Line)
(A0 < 500) && (A1 < 500)
เมื่อทั้งหน้าซ้าย และ หน้าขวา โดนเส้นดำพร้อมกัน

ตัวอย่างโค้ด: เดินหน้าค้นหาเส้นตัดสี่แยกแล้วหยุดสนิท

void setup() {
  // วิ่งเดินหน้าด้วยความเร็ว 60%
  fd(60);

  // วนรอจนกระทั่งทั้ง A0 และ A1 เจอเส้นดำพร้อมกัน
  while (!(analogRead(A0) < 500 && analogRead(A1) < 500)) {
    delay(5); // หน่วงเวลาอ่านซ้ำสั้นๆ
  }

  // เมื่อถึงเส้นตัด ให้หยุดและดับมอเตอร์
  ao();
}

void loop() {}

📚 5. ตารางคำสั่ง C++ ทั้งหมดของ RAZOR-S3

สรุปรายการฟังก์ชัน C++ (Arduino Style) ทั้งหมดที่รองรับบนหุ่นยนต์ RAZOR-S3 พร้อมพารามิเตอร์และตัวอย่างการใช้งาน

⚡ 1. คำสั่งเคลื่อนที่ขั้นสูง (Gyro PID & Turning)
ฟังก์ชัน C++ พารามิเตอร์ (Parameters) หน้าที่และการทำงาน
razorMove(...) (dir, angle, spd, timeMs, kp, ki, kd, rampUp, rampDown, startSpeed) วิ่งตรงล็อคทิศทาง Gyro PID (บล็อกเวลา): หุ่นวิ่งตรงตามองศา angle (0–360°) ด้วยความเร็ว spd เป็นเวลา timeMs มิลลิวินาที
razorMoveLoop(...) (dir, angle, startSpeed, spd, kp, kd) วิ่งตรงล็อคทิศทางใน loop (ไม่บล็อกเวลา): ขับเคลื่อนและแก้ทิศทางทีละสเต็ป ต้องเรียกซ้ำใน loop() เพื่อให้อ่านเซนเซอร์ระหว่างทางได้
razorMoveLoopReset() - รีเซ็ตตัวเร่งความเร็วของ MOVE_LOOP: เรียกเมื่อต้องการเริ่มรอบการวิ่งใหม่
razorDiff(...) (dir, angle, maxSpd, minSpd, stopAt, timeoutMs) ดิฟเลี้ยวโค้ง (Differential Turn): ล้อนอกหมุนเร็ว ล้อในหมุนช้า เพื่อเลี้ยวโค้งเข้าหามุม angle อย่างนุ่มนวล
razorSpin(...) (dir, angle, maxSpd, minSpd, stopAt, timeoutMs) หมุนตัวในที่ (Spin / Pivot Turn): ล้อสองฝั่งหมุนสวนทางกันเพื่อหมุนตัว ณ จุดเดิมไปยังมุม angle
📦 2. กลไกยิงปล่อยลูกบาศก์ (Cube Launcher)
ฟังก์ชัน C++ พารามิเตอร์ หน้าที่และการทำงาน
kickF(สี) สี (ไม่ใส่ก็ได้): "red" "yellow" "green" "blue" ยิงปล่อยลูกบาศก์ด้านหน้า: ปล่อยกล่องภารกิจด้านหน้า 1 ลูก ตามสีที่เลือก ไม่ใส่สี = สีส้มเดิม (ควรหน่วงเวลา delay(300); ตามหลัง)
kickB(สี) สี (ไม่ใส่ก็ได้): "red" "yellow" "green" "blue" ยิงปล่อยลูกบาศก์ด้านหลัง: ปล่อยกล่องภารกิจด้านหลัง 1 ลูก ตามสีที่เลือก ไม่ใส่สี = สีส้มเดิม
⚙️ 3. ควบคุมมอเตอร์พื้นฐาน (4WD Motor Drive)
ฟังก์ชัน C++ พารามิเตอร์ หน้าที่และการทำงาน
fd(spd) spd (0 ถึง 100) สั่งขับเคลื่อน เดินหน้า ทั้ง 2 ฝั่งด้วยความเร็ว spd%
bk(spd) spd (0 ถึง 100) สั่งขับเคลื่อน ถอยหลัง ทั้ง 2 ฝั่งด้วยความเร็ว spd%
sl(spd) / sr(spd) spd (0 ถึง 100) เลี้ยวซ้าย / เลี้ยวขวา แบบล้อเดียว (ล้อฝั่งเลี้ยวจะหยุด)
tl(spd) / tr(spd) spd (0 ถึง 100) หมุนตัวกลับซ้าย / ขวา (ล้อสองฝั่งหมุนสวนทางกัน)
motor(ch, spd) ch (1=ซ้าย, 2=ขวา), spd (-100 ถึง 100) สั่งมอเตอร์แยกข้างอิสระ (ค่าบวก = เดินหน้า, ค่าลบ = ถอยหลัง)
motorL(spd) / motorR(spd) spd (-100 ถึง 100) สั่งมอเตอร์ฝั่งซ้าย / มอเตอร์ฝั่งขวา
ao() / stop_motor() - หยุดมอเตอร์ทุกตัว: เบรกและตัดกระแสมอเตอร์ทันที
📡 4. เซนเซอร์เส้น, Sonar วัดระยะ และ Gyroscope
ฟังก์ชัน C++ ค่าที่ส่งกลับ (Return) หน้าที่และการทำงาน
analogRead(pin) 0 – 1023 (ตัวเลข) อ่านค่าเซนเซอร์เส้น A0 (หน้าซ้าย), A1 (หน้าขวา), A2 (หลังซ้าย), A3 (หลังขวา) — ต่ำกว่า 500 = เจอเส้นดำ
sonarF() / sonarB() เซนติเมตร (cm) อ่านระยะวัดวัตถุ/กำแพงด้านหน้า (Front) / ด้านหลัง (Back)
sonarL() / sonarR() เซนติเมตร (cm) อ่านระยะวัดวัตถุ/กำแพงด้านซ้าย (Left) / ด้านขวา (Right)
getGyro() 0.0 – 359.9° อ่านมุมองศาปัจจุบันของหุ่นยนต์จากเซนเซอร์ไจโร (Auto-Zero 0° ตอนเริ่มรัน)
gyroZero() - รีเซ็ตมุมอ้างอิงไจโร ณ จุดปัจจุบันให้เป็น 0°
⏱️ 5. คำสั่งเวลาและฟังก์ชันระบบ
ฟังก์ชัน C++ พารามิเตอร์ หน้าที่และการทำงาน
delay(ms) ms (มิลลิวินาที) หยุดรอเวลาที่ระบุ (1000 ms = 1 วินาที) มอเตอร์จะยังคงทำงานตามคำสั่งล่าสุด
millis() - (คืนค่า unsigned long) คืนค่าเวลาสะสมนับตั้งแต่เริ่มกดปุ่ม RUN (มิลลิวินาที) ใช้สำหรับจับเวลา
Beep(freq, dur) freq (Hz), dur (ms) สั่งให้ลำโพง Buzzer ส่งเสียงตามความถี่และระยะเวลาที่กำหนด
Serial.println(msg) ข้อความ / ตัวแปร พิมพ์ค่าหรือข้อความออกทางหน้าต่าง Terminal / Serial Monitor
RAZOR-S3
🟢 FREE ทุกคนใช้ได้ 🎯 Quick Box Drop Challenge ⚡ 4WD High Speed
RAZOR-S3
หุ่นยนต์กู้ภัยระดับกลางและภารกิจ Quick Box Drop Challenge ระบบขับเคลื่อน 4WD Differential Drive (มอเตอร์ 1500 RPM) พร้อมเซนเซอร์เส้น 8 จุด, Sonar วัดระยะรอบทิศทาง, ไจโรสโคปอัตโนมัติ และระบบยิงปล่อยลูกบาศก์
⚙️ สเปกฮาร์ดแวร์ & พินเซนเซอร์ (Hardware Specifications)
🏎️ ระบบขับเคลื่อน
4WD Differential Drive (1500 RPM)
📐 มิติขนาด
18 × 18 cm · ล้อขนาด 3.3 cm
📡 เซนเซอร์ตรวจจับเส้น
หน้า (A0, A1) · หลัง (A2, A3)
📶 วัดระยะ Sonar / TOF
หน้า, หลัง, ซ้าย, ขวา
🧭 ไจโรสโคป (IMU)
Auto-Zero ตั้งทิศ 0° เมื่อกด RUN
📦 กลไกภารกิจ
ระบบยิงปล่อยลูกบาศก์ (หน้า/หลัง)

⚡ เจาะลึกบล็อกพิเศษ: RAZORS3 MOVE (ล็อคทิศทางด้วย Gyro + PID)

บล็อกคำสั่งที่ทรงพลังที่สุดของ RAZOR-S3 ช่วยให้หุ่นวิ่งตรงเป๊ะตามองศาที่กำหนด ไม่เอียง ไม่เป๋ แม้พื้นจะลื่นหรือมีแรงเหวี่ยง

RAZORS3 🚀 MOVE [ทิศทาง] [องศา] ความเร็วต้น [STARTSPD] speed [SPD] time [TIME] ms KP [KP] KI [KI] KD [KD] เร่ง [RAMPUP] ms ชะลอ [RAMPDOWN] ms
// เทียบเท่าคำสั่ง C++:
razorMove(1, 0, 60, 1000, 1.0, 0.0, 0.05, 200, 200, 30);
📖 ตารางอธิบายพารามิเตอร์ของบล็อก MOVE อย่างละเอียด (ทำไมต้องมี & ใช้ทำอะไร)
พารามิเตอร์ ชนิด/ค่า ค่าแนะนำ คำอธิบายหน้าที่ & เหตุผลที่ต้องใช้ (Why & How)
DIR Dropdown เดินหน้า (1) ทิศทางขับเคลื่อน: เลือกระหว่าง เดินหน้า (1) หรือ ถอยหลัง (-1)
ANGLE / ทิศ องศา 0–360 ↑ 0° องศาอ้างอิงของสนามที่ต้องการล็อค: โดยระบบจะยึดทิศทางตอนกด RUN เป็น 0° (↑=0°, →=90°, ↓=180°, ←=270°) หุ่นจะคอยปรับล้อให้วิ่งตรงตามแนวทิศนี้ตลอดเวลา
STARTSPD Number (0–100) 20 ความเร็วตอนเริ่มออกตัว (Soft Start Initial Speed):
💡 ใช้ทำไม: ถ้าสั่งให้หุ่นออกตัวที่ความเร็วสูงทันที (เช่น 80) ล้อจะฟรีและหุ่นจะสะบัดเสียทิศ การตั้งค่านี้ไว้ที่ 20–30 ช่วยให้ออกตัวนุ่มนวลและตรงเป๊ะ
SPD Number (0–100) 30 ความเร็วสูงสุดในการวิ่ง: ความเร็วที่หุ่นยนต์จะวิ่งไปถึงหลังจากช่วงเร่งเครื่อง
TIME ms (มิลลิวินาที) 1000 ms ระยะเวลาที่ต้องการให้วิ่ง: 1,000 ms = 1 วินาที เมื่อครบเวลาหุ่นจะหยุดมอเตอร์ให้อัตโนมัติ
KP Decimal 1.0 Proportional Gain (ความไวในการแก้ทิศทาง):
💡 ใช้ทำไม: ยิ่งตั้งค่ามาก หุ่นจะยิ่งดึงตัวกลับมาตรงทิศเร็ว แต่ถ้าตั้งมากเกินไป หุ่นจะวิ่งส่ายเป็นงู (แนะนำ 0.8 – 1.5)
KI Decimal 0.0 Integral Gain (การชดเชยค่าสะสม): ปกติสำหรับระบบขับเคลื่อนพื้นเรียบให้ตั้งค่าเป็น 0.0
KD Decimal 0.05 Derivative Gain (ตัวหน่วงการสะบัด / แดมเปอร์):
💡 ใช้ทำไม: ช่วยเบรกและหยุดอาการส่ายเมื่อหุ่นวิ่งด้วยความเร็วสูง ทำให้การวิ่งนิ่งและเสถียรที่สุด (แนะนำ 0.02 – 0.1)
RAMPUP ms (มิลลิวินาที) 100–300 ms เวลาในการเร่งความเร็ว (Soft-Start Ramp):
💡 ใช้ทำไม: ระยะเวลาที่หุ่นจะค่อยๆ ไต่ความเร็วจาก STARTSPD ขึ้นไปหา SPD ช่วยไม่ให้หุ่นกระชากตอนออกตัว
RAMPDOWN ms (มิลลิวินาที) 100–300 ms เวลาในการชะลอความเร็ว (Soft-Stop Ramp):
💡 ใช้ทำไม: ระยะเวลาที่หุ่นจะค่อยๆ ผ่อนความเร็วลงก่อนหยุดเมื่อใกล้ครบเวลา ช่วยให้หยุดได้นิ่งสนิท ไม่ลื่นไถลเลยเป้าหมาย

🔁 บล็อก MOVE_LOOP & MOVE_LOOP reset (เดินแบบไม่บล็อกเวลา)

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

RAZORS3 🤖 MOVE_LOOP [ทิศทาง] [องศา] ความเร็วต้น [STARTSPD] speed [SPD] KP_yaw [KP] KD_yaw [KD] NON-BLOCKING
// ตัวอย่างการใช้ใน loop() เพื่อวิ่งไปหยุดที่เส้นดำ:
void setup() {
  razorMoveLoopReset(); // รีเซ็ตค่า PID ก่อนเริ่มรอบใหม่
}

void loop() {
  // ถ้าเจอเส้นดำที่เซนเซอร์หน้า (A0 หรือ A1 < 300) ให้หยุด
  if (analogRead(A0) < 300 || analogRead(A1) < 300) {
    ao(); // หยุดมอเตอร์
    while(1); // หยุดการทำงาน
  } else {
    razorMoveLoop(1, 0, 30, 60, 1.0, 0.05); // เดินคุมทิศ 1 จังหวะ
  }
}

🔄 การหมุนในที่ (Spin) vs การเลี้ยวแบบดิฟ (Differential Turn)

🔄 หมุนในที่ (Spin to Angle)

การทำงาน: ล้อซ้ายและล้อขวาหมุนสวนทิศทางกัน ทำให้ตัวหุ่นหมุนอยู่กับจุดเดิม

  • SMAX (ความเร็วสูงสุด): แนะนำ 70–80
  • SMIN (ความเร็วต่ำสุด): แนะนำ 25–30 (ชะลอเมื่อใกล้ถึงมุม)
  • THR (มุมยอมรับ): เช่น 3° เมื่อเหลือมุมน้อยกว่า 3° จะตัดจบ
  • TIMEOUT: เวลาป้องกันการหมุนค้าง (เช่น 2000 ms)
↩↪ ดิฟ (Differential Pivot Turn)

การทำงาน: ล้อข้างหนึ่งดัน ล้ออีกข้างแตะเบาๆ ทำให้เกิดการเลี้ยวแบบตีวงโค้ง

  • DIR: หน้า (TurnF_S) หรือ หลัง (TurnB_S)
  • จุดเด่น: เข้าโค้งได้นุ่มนวล ไม่สะบัด เหมาะกับการเลี้ยวเข้าโซน
  • SMAX / SMIN: ควบคุมความเร็วในการตีวง
  • THR: มุมยอมรับสำหรับหยุดการเลี้ยว

📦 ภารกิจ Quick Box Drop (การยิงปล่อยลูกบาศก์)

🎯 คำสั่งปล่อยลูกบาศก์ในโซน Drop Zone 1 – 4

ในการแข่งขัน Quick Box Drop เมื่อหุ่นยนต์วิ่งเข้าไปอยู่ในพื้นที่ Drop Zone 1, 2, 3 หรือ 4 สามารถสั่งปล่อยลูกบาศก์เพื่อทำคะแนนได้ด้วยคำสั่ง:

คำสั่ง C++ บล็อกในระบบ การทำงาน
kick_front() เครื่องยิง ยิงลูกบาศก์หน้า ปล่อยลูกบาศก์ด้านหน้าตัวหุ่นลงในโซนทำคะแนน
kick_back() เครื่องยิง ยิงลูกบาศก์หลัง ปล่อยลูกบาศก์ด้านหลังตัวหุ่นลงในโซนทำคะแนน

💡 ตัวอย่างโปรแกรมภารกิจจริง (Mission Code Recipes)

ตัวอย่างที่ 1: วิ่งตรง 1 เมตร (ทิศ 0°) ➔ ปล่อยกล่องหน้า ➔ หมุนกลับตัว 180° ➔ วิ่งกลับจุดเริ่มต้น
void setup() {
  // 1. วิ่งตรงไปข้างหน้า (ทิศ 0°) ด้วยความเร็ว 70 เป็นเวลา 1500 ms
  razorMove(1, 0, 70, 1500, 1.0, 0.0, 0.05, 200, 200, 30);

  // 2. ยิงปล่อยลูกบาศก์ด้านหน้าลงใน Drop Zone
  kick_front();
  delay(500);

  // 3. หมุนตัวกลับหลัง 180° อยู่กับที่
  razorTurn(1, 180, 80, 30, 3, 2000);

  // 4. วิ่งตรงกลับมา (ล็อคทิศทาง 180°) เป็นเวลา 1500 ms
  razorMove(1, 180, 70, 1500, 1.0, 0.0, 0.05, 200, 200, 30);

  // 5. หยุดมอเตอร์สนิท
  ao();
}

void loop() {
  // จบภารกิจ ไม่ต้องทำอะไรใน loop
}
ANT-S1
🟢 FREE (สมาชิกทั่วไป) 🎯 Robot Gathering & Athletics 🏆 หุ่นยนต์ อปท. ประถม
ANT-S1
หุ่นยนต์รองรับกติกา Robot Gathering, Robot Athletics และ หุ่นยนต์ อปท. ประถม รองรับ 16 เซนเซอร์ (หน้า 8 + หลัง 8) และระบบ PID เดินตามเส้น รองรับเซนเซอร์วัดระยะ เซนเซอร์อ่านสี RGB และมือคีบวัตถุ (ยกชี้ฟ้า 90°)
⚙️ สเปกและจุดเด่นของ ANT-S1
🏎️ ระบบขับเคลื่อน
Motor DC Gear (2WD Differential)
📡 เซนเซอร์เส้น 16 จุด
หน้า 8 (A0–A7) + หลัง 8 (A8–A15)
🎨 เซนเซอร์ตรวจจับสี
Color & RGB Sensor อ่านค่าสีวัตถุ
📶 วัดระยะ Sonar / TOF
หน้า + หลัง
🦾 แขนคีบ Mandible
คีบกระป๋อง/วัตถุ (ยกชี้ฟ้า 90°)
📐 มิติขนาด
14 × 15 cm · Wheelbase 11.8 cm
🦾 คำสั่งควบคุมแขนคีบวัตถุ (Gripper Commands)
คำสั่ง C++ บล็อกในระบบ การทำงาน
gripClose() แขนคีบ หนีบกระป๋อง สั่งให้แขนคีบหนีบจับวัตถุ/กระป๋องที่อยู่ด้านหน้า
gripOpen() แขนคีบ อ้าแขนคีบ สั่งให้อ้าแขนคีบเพื่อปล่อยหรือเตรียมจับวัตถุ
📡 เซนเซอร์ตรวจจับเส้น 16 จุด (A0 – A15) & Line PID

ด้านหน้า 8 ตัว (A0–A7) สำหรับเดินหน้าตามเส้น และด้านหลัง 8 ตัว (A8–A15) สำหรับถอยหลังตามเส้นด้วยระบบ PID ความแม่นยำสูง

RazorL1
🔒 PRO VIP 🏎️ Line Tracking Speed ⚡ 10–16 IR Front Sensors
RazorL1
หุ่นยนต์วิ่งตามเส้นความเร็วสูงสำหรับการแข่งขัน Speed Line Tracking โดยเฉพาะ โครงสร้างหน้ากว้าง เสถียรสูงในทางโค้ง
🏎️ การใช้งานบล็อก Line PID ความเร็วสูง

ใช้คำสั่ง linePID(speed, kp, kd) ในการเกาะเส้นอย่างเรียบเนียนโดยไม่หลุดโค้ง

RazorG1
🔒 PRO VIP 🦾 Dual-Arm Gripper (2 มือ) 🎨 Color & RGB Sorting
RazorG1
หุ่นยนต์คีบ 2 มือ ระบบ 4WD ขับเคลื่อน 4 มอเตอร์ สามารถคีบกระป๋อง 2 ใบพร้อมกัน ส่งกระป๋องข้ามมือ และคัดแยกสีกระป๋องอัตโนมัติ
🦾 คำสั่งมือคีบคู่ (Dual Gripper API)
คำสั่ง C++ การทำงาน
gripLeftClose() / gripLeftOpen() หนีบ / ปล่อย มือคีบข้างซ้าย
gripRightClose() / gripRightOpen() หนีบ / ปล่อย มือคีบข้างขวา
handOffLeftToRight() ส่งกระป๋องจากมือซ้ายข้ามไปมือขวาอัตโนมัติ
readColor() อ่านค่าสีของวัตถุที่มือคีบจับอยู่ (คืนค่า 'red', 'green', 'blue', 'yellow', 'black')

📚 ตารางคำสั่ง C++ ทั้งหมด (API Cheat Sheet)

สรุปรายการฟังก์ชัน C++ มาตรฐานที่สามารถเรียกใช้งานได้ใน RazorSIM

🕹️ คำสั่งควบคุมมอเตอร์พื้นฐาน
คำสั่ง พารามิเตอร์ การทำงาน
fd(speed) 0 ถึง 100 เดินหน้าความเร็วเท่ากันทั้งสองล้อ
bk(speed) 0 ถึง 100 ถอยหลังความเร็วเท่ากันทั้งสองล้อ
tl(speed) / tr(speed) 0 ถึง 100 เลี้ยวซ้าย / เลี้ยวขวา (ล้อเดียวหมุน)
sl(speed) / sr(speed) 0 ถึง 100 หมุนซ้าย / หมุนขวาอยู่กับที่ (ล้อสองข้างหมุนสวนกัน)
fd2(speedL, speedR) -100 ถึง 100 ควบคุมความเร็วแยกอิสระล้อซ้ายและล้อขวา (ค่าลบ = ถอยหลัง)
ao() — หยุดมอเตอร์ทุกตัวทันที (All Off)
delay(ms) มิลลิวินาที หน่วงเวลาการทำงาน (1000 ms = 1 วินาที)
📡 เซนเซอร์ & การอ่านค่า
คำสั่ง ค่าที่คืนกลับ การทำงาน
analogRead(pin) 0 ถึง 1023 อ่านค่าเซนเซอร์เส้น (ค่าน้อย < 300 = เจอดำ / ค่ามาก > 700 = พื้นขาว)
readSonar(dir) ระยะทาง cm อ่านระยะทางจาก Sonar/TOF (เช่น 'front', 'back', 'left', 'right')
getGyro() องศา 0–360 อ่านมุมองศาปัจจุบันของหุ่นยนต์จากเซนเซอร์ไจโร

🧩 เรียนจากบล็อกจริง แล้วเปิดทดลองได้

7 ตัวอย่างจากตัวแก้ไขบล็อกของ RazorSIM พร้อมไฟล์โปรเจกต์ที่แก้ค่า ต่อบล็อก และกด Run ได้

เริ่มทดลองใน 5 ขั้นตอน
  1. บันทึกงานที่กำลังทำอยู่ก่อน เพราะการเปิดตัวอย่างจะเปลี่ยนโปรเจกต์ปัจจุบัน
  2. กดดาวน์โหลดไฟล์ .srazor ของตัวอย่างที่ต้องการ
  3. กลับไป RazorSIM กด Open แล้วเลือกไฟล์ที่ดาวน์โหลด
  4. ตรวจโหมด Blocks Mode หุ่นและสนามจะโหลดตามไฟล์ ตัวอย่างใช้สนามซ้อมอิสระและเริ่มหุ่นกลางสนาม
  5. กด Reset → RUN สังเกตหุ่นและ Console ตัวอย่างใน loop ต้องกด STOP เมื่อดูเสร็จ

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

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

setup กับ loop วางบล็อกต่างกันอย่างไร

setup ทำหนึ่งครั้งเมื่อเริ่ม Run เหมาะกับชุดเดินแล้วหยุดหรือการเตรียมหุ่น ส่วน loop ทำซ้ำระหว่างที่โปรแกรมยังรัน เหมาะกับการอ่านเซนเซอร์และตรวจเงื่อนไขต่อเนื่อง

ต่อบล็อกคำสั่งเข้าในช่องของ setup/loop บล็อกคำสั่งที่วางลอยจะไม่ถูกรัน ส่วนบล็อกตัวเลขหรือเซนเซอร์ต้องเสียบเข้าช่องค่าของคำสั่ง

ตัวอย่าง 1 · RAZOR-S3 · สนามซ้อมอิสระ

เดินหน้าแล้วหยุดหนึ่งครั้ง

ฝึกสั่งมอเตอร์สองข้างและกำหนดเวลาวิ่ง

บล็อก setup และ loop ของตัวอย่าง เดินหน้าแล้วหยุดหนึ่งครั้ง

ต่อใน setup เพื่อทำครั้งเดียว ส่วน loop เว้นว่าง รอ 800 ms เท่ากับ 0.8 วินาที ความเร็ว 35 เป็นระดับคำสั่งมอเตอร์ ไม่ใช่ระยะทาง 35 ซม.

ผลที่ควรเห็น

เดินหน้า 800 ms แล้วมอเตอร์หยุด Console แสดง DONE หนึ่งครั้ง

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

เปลี่ยนเวลาเป็น 400 ms แล้ว Reset และ Run ใหม่ เปรียบเทียบระยะทาง

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ เดินหน้าแล้วหยุดหนึ่งครั้ง

ข้อความที่โปรแกรมพิมพ์: DONE

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
  fd2(35, 35);
  delay(800);
  ao();
  Serial.println("DONE");
}

void loop() {
}

ตัวอย่าง 2 · RAZOR-S3 · สนามซ้อมอิสระ

เดินเป็นจังหวะสามครั้ง

ใช้บล็อกวนซ้ำกับชุดคำสั่งหลายบล็อก

บล็อก setup และ loop ของตัวอย่าง เดินเป็นจังหวะสามครั้ง

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

ผลที่ควรเห็น

เดิน 250 ms หยุด 250 ms รวมสามรอบ แล้ว Console แสดง REPEAT_DONE

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

เปลี่ยนจำนวนรอบเป็น 2 แล้วดูจำนวนจังหวะเดิน

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ เดินเป็นจังหวะสามครั้ง

ข้อความที่โปรแกรมพิมพ์: REPEAT_DONE

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
  for (int _i = 0; _i < 3; _i++) {
    fd2(25, 25);
    delay(250);
    ao();
    delay(250);
  }
  Serial.println("REPEAT_DONE");
}

void loop() {
}

ตัวอย่าง 3 · RAZOR-S3 · สนามซ้อมอิสระ

อ่านทิศหลักที่ใกล้ที่สุด

เสียบบล็อกที่คืนค่าเป็นตัวเลขเข้า Serial.println

บล็อก setup และ loop ของตัวอย่าง อ่านทิศหลักที่ใกล้ที่สุด

บล็อกสีม่วงอยู่บนสุดของหมวด RAZORS3 ค่านี้อ้างอิงศูนย์ไจโรเมื่อเริ่ม Run หุ่นนิ่งจึงอ่านได้ 0 ไม่ใช่เข็มทิศเหนือจริง 40°→0, 45°→90, 135°→180, 225°→270, 315°→0

ผลที่ควรเห็น

Console แสดงทิศหลักเป็น 0, 90, 180 หรือ 270 ซ้ำทุกประมาณ 250 ms ต้องกด STOP เมื่อดูเสร็จ

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

ดูบล็อก MOVE ในตัวอย่างถัดไป แล้วลองเพิ่ม Serial.println ทิศหลักหลัง MOVE จบ

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ อ่านทิศหลักที่ใกล้ที่สุด

ข้อความที่โปรแกรมพิมพ์: 0 · 0 · 0

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
}

void loop() {
  Serial.println(RazorS3HeadingV1::readNearest());
  delay(250);
}

ตัวอย่าง 4 · RAZOR-S3 · สนามซ้อมอิสระ

MOVE ไปทางทิศ 90°

ใช้ MOVE พร้อมเวลาและการควบคุมทิศ

บล็อก setup และ loop ของตัวอย่าง MOVE ไปทางทิศ 90°

กำหนดเดินหน้า ทิศ → ความเร็วต้น 20 speed 30 time 600 KP 1 KI 0 KD 0.05 เร่ง/ชะลอ 0 บล็อกกว้าง เลื่อนภาพแนวนอนเพื่อดูทุกช่อง ลูกศรอ้างอิงทิศหุ่นตอนเริ่ม ไม่ใช่ขอบจอเมื่อหมุนมุมมองสนาม

ผลที่ควรเห็น

หุ่นหมุนหาเป้าหมาย 90° จากศูนย์เริ่ม Run แล้วเดินตามทิศนั้น 600 ms ก่อนหยุด Console แสดง MOVE_DONE

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

เปลี่ยนลูกศรเป็น ↑ และ Reset ก่อน Run เพื่อเปรียบเทียบทิศทาง

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ MOVE ไปทางทิศ 90°

ข้อความที่โปรแกรมพิมพ์: MOVE_DONE

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
  razorMoveDir(1,90,30,600,1,0,0.05,0,0,20);
  ao();
  Serial.println("MOVE_DONE");
}

void loop() {
}

ตัวอย่าง 5 · RAZOR-S3 · สนามซ้อมอิสระ

ปล่อยลูกบาศก์สีด้านหน้าและด้านหลัง

เลือกสีของ kickF และ kickB จากช่องในบล็อก

บล็อก setup และ loop ของตัวอย่าง ปล่อยลูกบาศก์สีด้านหน้าและด้านหลัง

ฝึกบนสนามซ้อมอิสระเพื่อดูตำแหน่งและสี ตัวอย่างนี้ฝึกกลไกปล่อยลูกบาศก์ ยังไม่ใช่โปรแกรมทำคะแนนครบภารกิจ WLTB หรือ Quick Box Drop

ผลที่ควรเห็น

เกิดลูกบาศก์สีแดงด้านหน้าและสีน้ำเงินด้านหลัง Console แสดง CUBES_DONE

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

เปลี่ยนช่องสีจาก red เป็น green แล้ว Reset และ Run ใหม่

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ ปล่อยลูกบาศก์สีด้านหน้าและด้านหลัง

ข้อความที่โปรแกรมพิมพ์:

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
  kickF("red");
  delay(400);
  kickB("blue");
  Serial.println("CUBES_DONE");
}

void loop() {
}

ตัวอย่าง 6 · ANT-S1 · สนามซ้อมอิสระ

ANT-S1 เปิด–หุบก้ามและยกแขน

ควบคุมก้ามและแขนเป็นลำดับพร้อมเวลาสังเกต

บล็อก setup และ loop ของตัวอย่าง ANT-S1 เปิด–หุบก้ามและยกแขน

เลือก ANT-S1 และเปิดมุมมอง 3D เพื่อเห็นกลไกชัด รอแต่ละช่วง 400 ms ตัวอย่างนี้ทดสอบการขยับแขนและก้าม ไม่ได้มีวัตถุที่จับอยู่ในก้าม

ผลที่ควรเห็น

ก้ามเปิด แขนลง ก้ามหุบ แขนยก แล้วแขนกลับลงและก้ามเปิด Console แสดง ARM_DONE

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

เปลี่ยน gripUp เป็น gripLift 45° แล้วเปรียบเทียบมุมแขน

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ ANT-S1 เปิด–หุบก้ามและยกแขน

ข้อความที่โปรแกรมพิมพ์: ARM_DONE

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
  gripOpen();
  gripDown();
  delay(400);
  gripClose();
  delay(400);
  gripUp();
  delay(400);
  gripDown();
  delay(400);
  gripOpen();
  Serial.println("ARM_DONE");
}

void loop() {
}

ตัวอย่าง 7 · RAZOR-S3 · สนามซ้อมอิสระ

อ่านค่าเซนเซอร์เส้น A0

อ่านค่าจริงจากภาพสนามที่ตัวจำลองใช้

บล็อก setup และ loop ของตัวอย่าง อ่านค่าเซนเซอร์เส้น A0

บล็อก analogRead อยู่ในหมวด SENSORS ต่อค่าลง Serial.println ค่าเกิดจากพื้นสนามใต้เซนเซอร์ ไม่ใช่ค่าสุ่ม อย่าใช้ค่า threshold ตายตัวกับทุกสนาม

ผลที่ควรเห็น

Console แสดงค่า A0 ซ้ำทุกประมาณ 250 ms ค่าเปลี่ยนตามพื้นใต้ตำแหน่งเซนเซอร์ ต้องกด STOP เมื่อดูเสร็จ

↓ ดาวน์โหลดไฟล์ตัวอย่าง .srazor
ลองปรับเอง

กด STOP ย้ายหุ่นให้เซนเซอร์อยู่บนพื้นคนละสี แล้ว Run ใหม่เพื่อเปรียบเทียบค่า

ดูภาพผลการทดลองจากตัวจำลอง

ผลตรวจในเครื่อง ไม่ใช่ผลจากหุ่นจริง

ภาพตัวแก้ไขบล็อกและตัวจำลองขณะทดสอบ อ่านค่าเซนเซอร์เส้น A0

ข้อความที่โปรแกรมพิมพ์: 1023 · 1023 · 1023

ดู C++ ที่แปลงจากบล็อกชุดนี้
void setup() {
}

void loop() {
  Serial.println(analogRead(A0));
  delay(250);
}
ถ้าผลไม่เหมือนตัวอย่าง

ตรวจว่าเปิดไฟล์ถูกตัว เลือก Blocks Mode และไม่มีบล็อกคำสั่งหลุดจาก setup/loop จากนั้น Reset ก่อน Run ตรวจช่องเวลาว่าใช้ ms และอ่านข้อความ compile ใน Console หากกด STOP แล้วเริ่มใหม่ให้ Reset เพื่อกลับตำแหน่งตั้งต้น

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

ตรวจใหม่เฉพาะตัวอย่างทั้ง 7 ชุด: เปิด .srazor กลับเป็นบล็อก โค้ดตรงกับบล็อก รันในตัวจำลอง และไม่มี page error · ไม่เชื่อม Firebase/ข้อมูลออนไลน์ · บทเดิมยังไม่ได้ตรวจใหม่ครบทุกคำสั่ง