ZERO TO HERO · ประกอบทีละชิ้น

สอนใช้งานบอร์ด
RoboESP32

เริ่มจากบอร์ดเปล่ากับโปรเจกต์ว่าง แล้วค่อย ๆ ต่อทีละส่วน — ไฟ เสียง มอเตอร์ แขนกล เซนเซอร์ จนครบแล้วค่อยเปิด WiFi คุมจากมือถือ และจบด้วยไฟล์ RoboCar.ubp ที่รวมทุกอย่างไว้

เริ่มด่านแรก คู่มือไลบรารีฉบับเต็ม

ด่าน 0เตรียมพร้อม

เป้าหมาย: มีของครบและลงโปรแกรมเสร็จ ยังไม่ต้องต่อบอร์ด

ของที่ต้องมี

สิ่งของรายละเอียด
บอร์ด Cytron ROBO ESP32พร้อมมอเตอร์สองตัวประกอบเป็นรถแล้ว
สาย USBต้องเป็นสายที่ส่งข้อมูลได้ สายชาร์จไฟอย่างเดียวใช้ไม่ได้ — เป็นปัญหาที่เจอบ่อยที่สุด
แบตเตอรี่ใส่ตอนจะให้รถวิ่งจริง ระหว่างเขียนโปรแกรมใช้ไฟจาก USB ได้
โทรศัพท์มือถือใช้ในด่าน 7 เครื่องไหนก็ได้ที่ต่อ WiFi และเปิดเบราว์เซอร์ได้
เซอร์โว · เซนเซอร์ HC-SR04ไม่บังคับ — ไม่มีก็ข้ามด่าน 5 กับ 6 ไปได้

ลงสามอย่างนี้ก่อน

  1. ไดรเวอร์ CP210x — ตัวแปลง USB บนบอร์ดต้องมีไดรเวอร์ ไม่งั้นคอมพิวเตอร์มองไม่เห็นบอร์ดเลย แตกไฟล์ CP210x_Windows_Drivers.zip ติดตั้ง แล้วรีสตาร์ตเครื่องหนึ่งครั้ง (ทำครั้งเดียวต่อเครื่อง)
  2. โปรแกรม MicroBlocks — โหลดจาก microblocks.fun มีทั้ง Windows, macOS, Linux, Chromebook และแบบเปิดผ่านเบราว์เซอร์
  3. ไฟล์ไลบรารี KSU_RoBoESP32.ubl — เก็บไว้ในเครื่อง จะได้ใช้ในด่านถัดไป
    ยังไม่ต้องโหลด RoboCar.ubp ตอนนี้ ไฟล์นั้นคือเฉลยที่รวมทุกอย่างไว้แล้ว เก็บไว้เปิดตอนจบคอร์สในด่าน 8

✅ ผ่านด่านนี้เมื่อ: เปิด MicroBlocks ขึ้นมาได้ และมีไฟล์ KSU_RoBoESP32.ubl อยู่ในเครื่อง

ด่าน 1ต่อบอร์ดและเพิ่มไลบรารี

เป้าหมาย: มีบล็อก KSU โผล่มาในแถบเครื่องมือ และคลิกแล้วบอร์ดตอบสนอง

  1. เสียบสาย USB จากบอร์ดเข้าคอมพิวเตอร์ แล้วเปิดสวิตช์บอร์ด
  2. เปิด MicroBlocks ขึ้นมาเป็นโปรเจกต์เปล่า ยังไม่ต้องเปิดไฟล์อะไร
  3. กดปุ่มรูปสาย USB ที่แถบเครื่องมือ แล้วเลือกพอร์ตของบอร์ด (บน Windows มักขึ้นเป็น COM ตามด้วยตัวเลข) เมื่อต่อติดจะมีสัญลักษณ์บอกสถานะเปลี่ยนไป
  4. เพิ่มไลบรารี — ที่แถบบล็อกด้านซ้าย กด + Add Library แล้วเลือกไฟล์ KSU_RoBoESP32.ubl จะได้หมวดบล็อกใหม่โผล่ขึ้นมาทั้งชุด

ชื่อบล็อกที่เห็นจะยาวกว่าที่เขียนในคู่มือนี้ — บนบอร์ดบล็อกจะชื่อ KSU_RoBoESP32 forward แต่คู่มือนี้เขียนย่อว่า KSU forward เพื่อให้อ่านง่าย เป็นบล็อกตัวเดียวกัน ชื่อเต็มขึ้นต้นด้วย KSU_RoBoESP32 เสมอ ทั้งตอนเพิ่มไลบรารีเองในด่านนี้ และตอนเปิดไฟล์ RoboCar.ubp ในด่าน 8

ทดสอบว่าบอร์ดตอบสนองจริง

ลากบล็อก KSU LED D22 on มาต่อใต้ when started ตามภาพ แล้วกดปุ่มเริ่ม ▶ — ไฟต้องติดทันที

สคริปต์ when started ต่อกับบล็อก KSU_RoBoESP32 LED D22 on
สองบล็อกเท่านี้พอ — when started อยู่ในหมวด Control ส่วนบล็อกสีม่วงมาจากไลบรารี KSU_RoBoESP32
ภาพนี้เรียกไฟด้วยชื่อขา (D22) จะใช้ KSU LED number 3 เรียกเป็นหมายเลขดวงแทนก็ได้ ผลเหมือนกัน

หรือจะไม่ใช้ when started เลยก็ได้ — ลากมาแค่บล็อกไฟบล็อกเดียว แล้วคลิกที่ตัวบล็อกโดยตรง ไฟก็ติดเหมือนกัน

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

ถ้าหาพอร์ตไม่เจอ: ยังไม่ได้ลงไดรเวอร์ CP210x · ยังไม่ได้รีสตาร์ตหลังลงไดรเวอร์ · หรือใช้สาย USB แบบชาร์จไฟอย่างเดียว ลองเปลี่ยนสายเป็นอันดับแรก

✅ ผ่านด่านนี้เมื่อ: คลิกบล็อกแล้วไฟบนบอร์ดติดได้

ด่าน 2ไฟ LED และ RGB

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

ไฟบนบอร์ดมีสองชุด

ชุดคำอธิบายบล็อกที่ใช้
LED เดี่ยว 8 ดวงไฟดวงเล็กเรียงกัน สั่งได้แค่ติด/ดับKSU LED number
ไฟ RGB 2 ดวงไฟหน้ารถ เปลี่ยนสีได้อิสระ ผสมสีเองได้KSU set RGB

ลองทีละบล็อก

คลิกทีละบล็อกดูว่าอะไรเกิดขึ้น — KSU LED number 1 on · KSU LED all off · KSU light on · KSU set RGB all red 255 green 0 blue 0 · KSU change RGB brightness by -25 %

KSU light on คือทางลัดของไฟหน้าสีขาวนวล ส่วน KSU set RGB ผสมสีเองได้ทั้งสามค่า ค่าละ 0 ถึง 255 ช่องแรกเลือกได้ว่าจะสั่งดวง 0, ดวง 1 หรือ all ทั้งสองดวง

ลูปแรก: ไฟกับสีสลับกันไปเรื่อย ๆ

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

สคริปต์เปิด LED แล้วสลับสี RGB เขียวกับน้ำเงินใน forever
forever คือ "ทำวนไปเรื่อย ๆ ไม่มีวันจบ" อยู่ในหมวด Control
สังเกตว่าสั่งสีได้สองแบบ — คลิกเลือกสีจากวงกลม กับใส่เลขเอง red/green/blue

ลองเปลี่ยนเลข 500 เป็น 2000 แล้วเป็น 100 ดู จะเห็นชัดว่าเลขนี้คุมจังหวะการสลับสี

ขั้นต่อไป: ไฟวิ่ง 8 ดวง

ทีนี้เพิ่ม for i in 8 เข้าไป จะได้ไฟไล่กันทีละดวงแทนที่จะติดพร้อมกัน

สคริปต์ไฟวิ่งด้วย for i in 8 เปิดแล้วปิดทีละดวง
รอบแรก for i in 8 ไล่เปิดทีละดวง เปลี่ยนสีไฟหน้าคั่น แล้วรอบสองไล่ปิดทีละดวง จบด้วยเปลี่ยนสีอีกที
ทั้งหมดอยู่ใน forever จึงวนซ้ำไม่มีหยุด

อ่านออกเสียงได้ว่า "ให้ i ไล่จาก 1 ถึง 8 แล้วแต่ละครั้งเปิดไฟดวงที่ i รอครึ่งวินาที" — ตัวแปร i คือกล่องที่เปลี่ยนค่าไปเรื่อย ๆ ทุกรอบ ทำให้บล็อกเดียวสั่งได้ทั้งแปดดวงโดยไม่ต้องเขียนแปดครั้ง

✅ ผ่านด่านนี้เมื่อ: ทำไฟวิ่งได้ และเปลี่ยนสีไฟหน้าเป็นสีที่ตัวเองชอบได้

ด่าน 3เสียงและดนตรี

เป้าหมาย: ทำให้บอร์ดส่งเสียงได้ตั้งแต่ติ๊ดเดียวจนถึงเล่นเพลง

บนบอร์ดมีลำโพงเล็ก ๆ ติดมาแล้ว ไม่ต้องต่ออะไรเพิ่ม สั่งได้เลย

คลิกทีละบล็อกฟังความต่างก่อน — KSU beep · KSU horn · KSU play tone 440 Hz for 300 ms · KSU play note c octave 0 for 400 ms · KSU play Happy Birthday

บล็อกใช้ตอนไหน
KSU beepเสียงติ๊ดสั้น ๆ เหมาะกับเตือนหรือยืนยันว่าโปรแกรมมาถึงจุดนี้แล้ว
KSU hornเสียงแตรรถ สองโน้ตต่อกัน
KSU play toneกำหนดความถี่เอง ตัวเลขมากเสียงแหลม ตัวเลขน้อยเสียงทุ้ม
KSU play noteสั่งเป็นตัวโน้ตดนตรี แต่งเพลงเองได้

ต่อกันเป็นทำนอง

เอา KSU play note มาต่อกันหลาย ๆ อัน เปลี่ยนตัวโน้ตในช่องแรกไปเรื่อย ๆ ก็ได้เพลงแล้ว

สคริปต์ attach buzzer, horn, beep แล้ว forever เล่นโน้ต c ถึง b
ตัวอย่างจริง — บีบแตรหนึ่งครั้ง ติ๊ดหนึ่งครั้ง แล้ววน forever เล่นสเกลครบเจ็ดตัว c d e f g a b ตัวละ 400 ms
บล็อกสีน้ำเงิน attach buzzer to pin 23 มาจากไลบรารี Tone — ปกติ KSU setup จัดการให้แล้ว ใส่เองซ้ำก็ไม่เสียหาย

ผสมกับด่านที่แล้ว: ลองให้ไฟเปลี่ยนสีพร้อมกับเสียงแต่ละโน้ต จะได้ของเล่นชิ้นแรกที่มีทั้งภาพและเสียง

✅ ผ่านด่านนี้เมื่อ: เล่นโน้ตต่อกันได้เป็นทำนองสั้น ๆ ที่ตัวเองแต่ง

ด่าน 4มอเตอร์และการขับเคลื่อน

เป้าหมาย: ให้รถวิ่งได้ถูกทิศ และวิ่งตามเส้นทางที่วางไว้เอง

ยกรถขึ้นจากพื้นก่อน เอาอะไรหนุนใต้ท้องให้ล้อลอย จะได้ทดสอบโดยที่รถไม่วิ่งตกโต๊ะ และใส่แบตเตอรี่ด้วย เพราะมอเตอร์กินไฟมากกว่าที่สาย USB จ่ายไหว

ลองสั่งทีละทิศ

ประกอบตามภาพข้างล่าง — เริ่มด้วย KSU setup แล้วไล่ KSU forward · KSU backward · KSU turn left · KSU turn right คั่นแต่ละทิศด้วย wait 500 millisecs แล้วปิดท้ายด้วย KSU stop

บล็อกเดินหน้า/ถอยหลังไม่มีการหยุดในตัว มันจะหมุนไปเรื่อย ๆ จนกว่าจะสั่ง KSU stop — นี่คือเหตุผลที่ต้องมี stop ปิดท้ายเสมอ

ต้องคลิก KSU setup ก่อนเสมอ ไม่งั้นรถจะนิ่งสนิท — กำลังมอเตอร์คิดจาก ความเร็ว × ค่า trim และทั้งสองค่ายังว่างอยู่จนกว่าจะมีบล็อกไปตั้งให้ คูณกันแล้วได้ 0 รถจึงไม่ขยับทั้งที่โปรแกรมดูถูกทุกอย่าง
ใส่ KSU set speed อย่างเดียวยังไม่พอ เพราะ trim ยังว่าง — KSU setup ตั้งให้ครบทั้งคู่ในทีเดียว

สคริปต์ setup แล้วสั่งเดินหน้า ถอยหลัง เลี้ยวซ้ายขวา ตามด้วย forever ที่ใช้ drive
ตัวอย่างจริง — เริ่มด้วย KSU setup แล้วไล่ทีละทิศคั่นด้วย wait 500 ปิดท้ายด้วย stop
ท่อนล่างใน forever ใช้ KSU drive ที่หยุดเอง วิ่งหน้า-ถอยหลังสลับกันไปเรื่อย ๆ
ในภาพบล็อกหยุดยังเขียนว่า KSU_RoBoESP32_stop ตอนนี้เปลี่ยนเป็น KSU_RoBoESP32 stop แล้ว เป็นบล็อกเดียวกัน

รถวิ่งผิดทาง? แก้ตรงนี้

มอเตอร์แต่ละคันประกอบมาไม่เหมือนกัน ถ้าทิศไม่ตรงให้คลิก KSU set motor trim M1 -1 M2 -1 ด้วยค่าตามตาราง (ค่าที่ KSU setup ตั้งให้คือ -1 -1)

อาการใส่ค่า
สั่งเดินหน้าแล้วถอยหลัง และเลี้ยวสลับข้าง1 และ 1
สั่งเดินหน้าแล้วหมุนอยู่กับที่สลับตัวเดียว เช่น 1 กับ -1
เลี้ยวซ้ายกลายเป็นเลี้ยวขวาสลับทั้งสองตัว

ค่านี้จำไว้จนกว่าจะปิดเครื่อง เจอค่าที่ถูกแล้วให้จดไว้ เดี๋ยวด่าน 7 จะเอาไปใส่ในโปรแกรมจริง

วิ่งตามเส้นทางที่วางไว้

ท่อน forever ในภาพข้างบนใช้บล็อก KSU drive ซึ่งต่างจากบล็อกทิศธรรมดา ตรงที่มันวิ่งตามเวลาที่กำหนดแล้วหยุดเอง จึงเอามาต่อกันเป็นเส้นทางได้โดยไม่ต้องคอยสั่ง stop

ลองต่อยอด: เปลี่ยนท่อนนั้นเป็น repeat 4 ที่มี KSU drive forward for 1000 ms และ KSU drive right for 500 ms อยู่ข้างใน รถจะวิ่งเป็นรูปสี่เหลี่ยม
เลข 500 คือเวลาที่ใช้เลี้ยวให้ครบ 90 องศา พื้นแต่ละแบบไม่เท่ากัน ต้องลองปรับเอง

✅ ผ่านด่านนี้เมื่อ: รถวิ่งถูกทิศทุกทิศ และวิ่งกลับมาใกล้จุดเดิมได้หลังวิ่งครบสี่เหลี่ยม

ด่าน 5เซอร์โวและแขนกล

เป้าหมาย: สั่งให้แขนหมุนไปหยุดที่มุมที่ต้องการได้ · ต้องมีเซอร์โวอย่างน้อยหนึ่งตัว

เซอร์โวต่างจากมอเตอร์ยังไง

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

มุมที่สั่งผลลัพธ์
0หมุนสุดไปทางหนึ่ง
90อยู่ตรงกลาง
180หมุนสุดไปอีกทางหนึ่ง

เสียบตรงไหน

บอร์ดมีช่องเสียบเซอร์โว 4 ช่อง คือ D4 D5 D18 D19 ใช้พร้อมกันได้ทั้งสี่ ถ้ามีตัวเดียวให้เสียบ D4 เพราะเป็นช่องที่บล็อกทางลัดและแถบเลื่อนหลักในด่าน 7 สั่งงาน

ระวังเสียบกลับด้าน — สายเซอร์โวมีสามเส้น ให้เทียบกับที่พิมพ์ไว้บนบอร์ด โดยทั่วไปสีน้ำตาลหรือดำคือ GND · สีแดงคือไฟ · สีส้มหรือเหลืองคือสายสัญญาณ เสียบสลับขั้วอาจทำให้เซอร์โวเสีย

ใส่แบตเตอรี่ เซอร์โวกินไฟมากโดยเฉพาะตอนยกของหรือถูกฝืน ถ้าใช้ไฟจาก USB อย่างเดียวแล้วบอร์ดรีเซ็ตเอง ให้ใส่แบตแล้วลองใหม่

ทดสอบ

คลิก KSU set servo D4 to 90 degrees แล้วเปลี่ยนเลขเป็น 0 / 90 / 180 สลับกันดู
KSU set arm angle 90 degrees ทำงานเหมือนกันเป๊ะเมื่อใช้ช่อง D4 เป็นทางลัดที่พิมพ์สั้นกว่า

ทำไมเป็น 0 ถึง 180? บล็อกดั้งเดิมของ Cytron ใช้ −90 ถึง 90 ซึ่งมีเลขติดลบให้สับสน ไลบรารีนี้แปลงให้เหลือ 0–180 ที่จุดเดียว ทุกบล็อกและทุกแถบเลื่อนจึงใช้ 0–180 เหมือนกันหมด

ให้แขนกวาดไปมา

ประกอบตามภาพ — KSU setup แล้ววน forever ไล่มุมทีละขั้น คั่นด้วย wait ทุกครั้ง

สคริปต์ setup แล้ว forever สั่งเซอร์โว D4 ไปที่ 0 45 90 180 องศา
ไล่มุม 0 → 45 → 90 → 180 วนไปเรื่อย ๆ คั่นด้วย wait 1000 millisecs ทุกช่วง
เวลารอ 1 วินาทีเผื่อไว้เยอะ จะได้เห็นชัดว่าแขนหยุดนิ่งที่แต่ละมุมจริง ๆ ก่อนไปมุมถัดไป — พอคล่องแล้วลองลดเหลือ 400 ดู

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

อย่าฝืนเซอร์โว ถ้าได้ยินเสียงครืดคราดค้างอยู่ แปลว่าแขนไปชนอะไรหรือถูกสั่งเกินมุมที่กลไกไปได้ ให้รีบสั่งกลับมาที่ 90 องศา ปล่อยค้างไว้นาน ๆ เฟืองข้างในหักได้

✅ ผ่านด่านนี้เมื่อ: แขนกวาดไปมาได้โดยไม่สั่น และกลับมาหยุดที่ 90 องศาได้

ด่าน 6เซนเซอร์และเงื่อนไข

เป้าหมาย: ให้รถตัดสินใจเองได้ · ต้องมีเซนเซอร์ HC-SR04

ต่อสายแบบนี้

ขาเซนเซอร์ต่อเข้ากับ
VCC5V
GNDGND
Trigขา 33
Echoขา 32

คลิก KSU set ultrasonic trig 33 echo 32 หนึ่งครั้งเพื่อบอกไลบรารีว่าเสียบขาไหน จากนั้นคลิก KSU distance cm จะมีป้ายบอกระยะเป็นเซนติเมตรโผล่ขึ้นมา ลองเอามือบังหน้าเซนเซอร์แล้วคลิกใหม่

ขา 33 กับ 32 คือ LED ดวงที่ 8 และ 7 ไฟสองดวงนี้จะกะพริบตามจังหวะยิงคลื่นซึ่งไม่เป็นไร แต่อย่าสั่งเปิด LED 7 หรือ 8 ขณะเสียบเซนเซอร์ เพราะจะแย่งกันคุมสายเส้นเดียวกัน

ตัวแปรกับเงื่อนไข — สองอย่างที่ทำให้รถมีสมอง

ตัวแปรคือกล่องใส่ของที่มีชื่อ เราเก็บค่าที่วัดได้ใส่กล่องไว้ก่อน แล้วเงื่อนไข (if) คือการเปิดกล่องมาดูแล้วตัดสินใจว่าจะทำอะไรต่อ

รูปแบบที่ต้องการคือ เก็บระยะใส่ตัวแปรชื่อ cm ก่อนหนึ่งครั้ง แล้วค่อยเอา cm ไปเทียบใน ifถ้า cm มากกว่า 0 และน้อยกว่า 20 ให้หยุดแล้วส่งเสียง

ทำไมต้องเช็ก cm > 0 ด้วย? เพราะเลข 0 แปลว่า "ไม่มีเสียงสะท้อนกลับมา" ซึ่งเกิดตอนที่ข้างหน้าโล่งไม่มีอะไรเลย ถ้าไม่ใส่เงื่อนไขนี้ รถจะหยุดตอนทางโล่ง แต่กลับวิ่งชนตอนมีสิ่งกีดขวาง — ตรงข้ามกับที่ต้องการทุกประการ

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

รวมกับด่าน 4: รถวิ่งเองแล้วหยุดเองได้

เอา if ข้างบนใส่ใน forever แล้วเติม else ให้วิ่งต่อเมื่อทางโล่ง — สองภาพนี้คือขั้นตอนที่ห้องเรียนทำจริง

สคริปต์ say ระยะ แล้ว if ระยะน้อยกว่า 5 ไฟแดง ไม่งั้นไฟเขียว
ขั้นแรก: ดูค่าก่อนsay โชว์ระยะบนจอ พร้อมเปลี่ยนไฟหน้าเป็นแดงเมื่อใกล้กว่า 5 ซม. ยังไม่สั่งมอเตอร์
ภาพนี้เรียกบล็อกวัดระยะ 2 ครั้งในรอบเดียว — ทำงานได้แต่ช้ากว่าที่ควร ลองแก้เป็นเก็บใส่ตัวแปรครั้งเดียวดู
สคริปต์ setup แล้ว if ระยะน้อยกว่า 5 ไฟแดงและหยุด ไม่งั้นไฟเขียวและวิ่งต่อ
ขั้นสอง: ให้รถตัดสินใจเอง — เพิ่ม KSU setup เข้าไป แล้วเปลี่ยนจากแค่เปลี่ยนสี เป็นหยุดเมื่อเจอสิ่งกีดขวาง และ KSU drive forward ต่อเมื่อทางโล่ง

✅ ผ่านด่านนี้เมื่อ: รถวิ่งเองแล้วหยุดพร้อมส่งเสียงเมื่อเอามือไปบังหน้า

ด่าน 7เปิด WiFi แล้วคุมจากเบราว์เซอร์

เป้าหมาย: บอร์ดปล่อย WiFi ของตัวเอง แล้วบังคับรถจากมือถือได้

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

สคริปต์ทั้งหมดที่ต้องใช้

สคริปต์หลักในลูป forever
ภาพจาก MicroBlocks จริง — ภาพนี้ถ่ายไว้ตอนที่ไฟล์ RoboCar.ubp ยังใช้ชื่อบล็อกแบบสั้น ตอนนี้ชื่อจริงบนบอร์ดขึ้นต้นด้วย KSU_RoBoESP32 ทุกตัว แต่การต่อบล็อกเหมือนในภาพทุกอย่าง
บล็อกหน้าที่
when startedเริ่มทำงานเมื่อกดปุ่มเริ่ม หรือเมื่อบอร์ดเปิดเครื่องใหม่
KSU start web controlเปิด WiFi ชื่อ RoboCar พร้อมเว็บเซิร์ฟเวอร์ ตั้งความเร็วเริ่มต้น 70% หมุนเซอร์โวทุกตัวไป 90° และตั้งขาเซนเซอร์ให้เสร็จ
foreverวนถามซ้ำ ๆ ว่ามีคำสั่งเข้ามาหรือยัง
command = KSU web commandรับคำสั่งที่กดมาจากหน้าเว็บ ได้มาเป็นคำเดียว เช่น Forward
KSU do commandเอาคำนั้นไปทำให้จริง ครบทุกปุ่มที่หน้าเว็บมี
wait 10 millisecsพักสั้น ๆ ให้บอร์ดได้ทำงานอื่น

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

เจอค่า trim ที่ถูกในด่าน 4 แล้วใช่ไหม เอาบล็อก KSU set motor trim มาวางต่อใต้ KSU start web control รถจะได้ถูกทิศทุกครั้งที่เปิดเครื่อง

เปิดเบราว์เซอร์ควบคุม

  1. กดปุ่มเริ่มทำงาน ▶ ที่แถบเครื่องมือ — โปรแกรมถูกเก็บลงบอร์ดแล้ว ถอดสาย USB ใส่แบตเตอรี่ได้เลย
  2. ต่อ WiFi — ที่โทรศัพท์เลือกเครือข่ายชื่อ RoboCar ใส่รหัสผ่าน robocar123
  3. เปิดเบราว์เซอร์ พิมพ์ http://192.168.4.1 ให้ครบทั้งบรรทัด อย่าให้เบราว์เซอร์เอาไปค้นใน Google
  4. หมุนโทรศัพท์เป็นแนวนอน — หน้าเว็บออกแบบมาสำหรับแนวนอนเท่านั้น ถ้าถือแนวตั้งจะขึ้นข้อความให้หมุนเครื่อง

รหัสผ่านต้องยาวอย่างน้อย 8 ตัวอักษร ถ้าตั้งสั้นกว่านั้นบอร์ดจะเปิดฮอตสปอตไม่สำเร็จ และจะหาชื่อ WiFi ไม่เจอเลย

หน้าจอควบคุมแท็บ DRIVE
DRIVE — แป้นทิศทาง ปุ่มหยุดตรงกลาง แถบความเร็วและมุมเซอร์โว ปุ่มไฟหน้าและแตร
บนคอมพิวเตอร์ใช้ปุ่มลูกศรหรือ W A S D บังคับได้ด้วย
แท็บ LIGHT
LIGHT — จานสี 8 สี เลือกเป้าหมาย 0/1/ALL ปรับความสว่าง และสลับ LED ทั้ง 8 ดวง
คือของจากด่าน 2 ทั้งหมด
แท็บ MORE
MORE — เซอร์โวครบสี่ตัวจากด่าน 5 มอเตอร์แยกซ้ายขวาจากด่าน 4 และปุ่มเสียงจากด่าน 3

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

อยากเห็นว่าหน้าเว็บส่งอะไรมาจริง ๆ

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

สคริปต์ start web control แล้ว forever set command แล้ว say command
โหมดดูอย่างเดียว — เอา KSU do command ออก ใส่ say command แทน
กดปุ่มบนมือถือแล้วดูป้ายข้อความในหน้าต่าง MicroBlocks จะเห็นคำว่า Forward, Speed โผล่มาทีละคำ
ต้องเสียบสาย USB ค้างไว้ถึงจะเห็นป้าย say — ถอดสายไปวิ่งจริงจะไม่มีอะไรแสดง
สคริปต์เดียวกันแต่เพิ่ม if command = Forward, Stop, Backward
แล้วค่อยเอาไปสั่งงาน — ต่อ if เข้าไปทีละคำ Forward Stop Backward
นี่คือวิธีที่ทำให้เข้าใจว่า KSU do command ทำอะไรอยู่ข้างใน — เดี๋ยวด่าน 8 จะเห็นครบทั้งสิบคำ

✅ ผ่านด่านนี้เมื่อ: ขับรถจากมือถือได้ครบสี่ทิศ เปิดปิดไฟได้ และบีบแตรได้

ด่าน 8ประกอบร่าง — RoboCar.ubp

เป้าหมาย: เปิดไฟล์ฉบับเต็ม อ่านให้เข้าใจทั้งหมด แล้วต่อยอดเป็นของตัวเอง

ตอนนี้คุณต่อทุกชิ้นมาด้วยมือตัวเองแล้ว ถึงเวลาเปิด RoboCar.ubp ซึ่งคือทุกอย่างที่ผ่านมาประกอบไว้ให้เรียบร้อยในไฟล์เดียว พร้อมสคริปต์ตัวอย่างและโน้ตอธิบายวางไว้รอบ ๆ

⬇ ดาวน์โหลด RoboCar.ubp

ข้างในมีอะไรบ้าง

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

ชื่อบล็อกเหมือนกับตอนเพิ่มไลบรารีเองทุกตัว — ในไฟล์นี้บล็อกก็ชื่อ KSU_RoBoESP32 forward เหมือนที่เห็นมาตั้งแต่ด่าน 1 ไม่ต้องจำชื่อใหม่ (คู่มือยังเขียนย่อว่า KSU forward เพื่อให้อ่านง่ายเหมือนเดิม)

บล็อกอัตโนมัติไม่ใช่เวทมนตร์

ลองถอด KSU do command ออกจากลูป แล้วเอาชุด if ที่วางไว้ข้าง ๆ ใส่แทน ผลลัพธ์จะเหมือนเดิมทุกอย่าง — นี่คือสิ่งที่บล็อกเดียวนั้นทำอยู่ข้างใน

set command to (KSU web command)

if (command) = 'Forward'  → KSU forward
if (command) = 'Backward' → KSU backward
if (command) = 'Left'     → KSU turn left
if (command) = 'Right'    → KSU turn right
if (command) = 'Stop'     → KSU stop
if (command) = 'Light1'   → KSU light (on)
if (command) = 'Horn'     → KSU horn
if (command) = 'Speed'    → KSU set speed (KSU command value) %

ตัวพิมพ์ใหญ่-เล็กสำคัญมาก Forward ใช้ได้ แต่ forward และ FORWARD ใช้ไม่ได้ คอมพิวเตอร์ถือว่าเป็นคนละคำกัน

ตัวเลขที่ส่งมากับคำสั่ง

ปุ่มธรรมดาส่งมาแค่คำเดียว แต่แถบเลื่อนต้องส่งตัวเลขมาด้วย โดยต่อท้ายด้วย _

หน้าเว็บส่งคำที่ได้ตัวเลขที่ได้
/ForwardForwardไม่มี
/Speed_70Speed70
/Servo_120Servo120
/Rgb_2_255_120_0Rgb2, 255, 120, 0

อ่านออกมาด้วย KSU command value — ถ้าคำสั่งล่าสุดไม่มีตัวเลขมาด้วย บล็อกนี้จะรายงานเลข 90 ไม่ใช่ 0 และต้องอ่านในรอบเดียวกันกับที่คำสั่งเข้ามา

🏆 ด่านสุดท้าย: สร้างคำสั่งของตัวเอง

วิธีที่ง่ายที่สุดคือยึดปุ่มที่มีอยู่แล้วมาใช้ใหม่ เช่นจับปุ่มแตรให้ทำท่าเต้นแทน (ต้องถอด KSU do command ออกก่อน ไม่งั้นมันจะบีบแตรแข่งกับเรา)

ท่าเต้นเมื่อกดปุ่มแตร — ใส่ if command = Horn แล้วข้างในวาง repeat 3 ที่สลับ KSU turn left กับ KSU turn right คั่นด้วย KSU set RGB เปลี่ยนสีแดง-น้ำเงิน และ wait 200 millisecs ทุกจังหวะ ปิดท้ายนอกลูปด้วย KSU stop

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

1 · หน้าเว็บต้องส่งคำนั้น

เพิ่มปุ่มใน RoboCar-Control.html โดยเรียกผ่านฟังก์ชัน s() เท่านั้น

2 · ไลบรารีต้องรู้จักคำนั้น

เพิ่มเงื่อนไขในบล็อกลับ _do2 ไม่ใช่ใน KSU do command

3 · ถ้าต้องมีบล็อกใหม่

เพิ่มบรรทัด spec ในไลบรารี บล็อกจึงจะโผล่ในแถบเครื่องมือ

🏆 จบคอร์สเมื่อ: กดปุ่มบนมือถือแล้วรถทำท่าที่คุณออกแบบเองได้

ไปต่อที่ไหน

📘 คู่มือไลบรารี 13 บท

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

เปิดคู่มือไลบรารี

🔧 โจทย์ท้าทาย

  • ใช้ปุ่ม D34/D35 บนบอร์ดสั่งงานโดยไม่ต้องใช้มือถือ
  • ทำโหมดหลบสิ่งกีดขวางอัตโนมัติเต็มรูปแบบ
  • ต่อเซอร์โวสองตัวเป็นก้ามคีบแล้วแข่งเก็บของ
  • ทำไฟเลี้ยวที่กะพริบตามทิศที่กำลังวิ่ง
  • วัดระยะแล้วให้เสียงถี่ขึ้นเมื่อเข้าใกล้ เหมือนเซนเซอร์ถอยหลังในรถยนต์

ดาวน์โหลดไฟล์

KSU_RoBoESP32.ubl RoboCar.ubp CP210x Drivers

ไลบรารีใช้ตั้งแต่ด่าน 1 · ไฟล์โปรเจกต์เต็มใช้ตอนด่าน 8