ชมรมโดรน

2. อ่านโค้ดให้ออก (ไม่เคยเขียนโปรแกรมมาก่อนก็เริ่มได้)

ตัวแปร ฟังก์ชัน วัตถุ เมธอด และลูกศร -> คืออะไร มาจากไหน ใช้ทำอะไร อธิบายด้วยของในชีวิตประจำวัน แล้วอ่านบรรทัด pArduino->set_height(110); ให้ออก

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

เป้าหมายปลายทางคือบรรทัดนี้ ซึ่งเจอเต็มไปหมดในโปรเจกต์

pArduino->set_height(110);
แกะโค้ดหนึ่งบรรทัดpArduino คือวัตถุ ลูกศรคือกดปุ่ม set_height คือเมธอด 110 คือค่า เครื่องหมาย ; คือจบประโยคpArduinoวัตถุ->ลูกศรset_heightเมธอด(110)ค่า;จบตัวที่เราสั่ง(เหมือนรีโมท)ชื่อปุ่ม = สิ่งที่ให้โดรนทำรายละเอียด(ความสูง 110 ซม.)อ่านเป็นภาษาคนว่า "รีโมท กดปุ่มตั้งความสูง ที่ 110"
บรรทัดเดียวแต่มีห้าชิ้น ท้ายหน้านี้คุณจะรู้ว่าแต่ละชิ้นคืออะไร

1. โปรแกรมคือสูตรอาหาร

คืออะไร โปรแกรมคือรายการคำสั่งที่เรียงกัน คอมพิวเตอร์ (ในที่นี้คือบอร์ด Arduino) อ่านจากบนลงล่าง ทำทีละบรรทัด ทีละอย่าง เหมือนทำอาหารตามสูตร "ต้มน้ำ ใส่เส้น รอ 3 นาที ใส่เครื่องปรุง"

ข้อสำคัญ คอมพิวเตอร์ ไม่ฉลาดเอง มันทำเฉพาะที่เขียนไว้ ตรงตัวอักษร ไม่เดา ไม่ข้าม ถ้าสูตรไม่บอกว่า "รอ" มันก็ไม่รอ ซึ่งเป็นเหตุผลที่โค้ดโดรนมี delay(4000) เต็มไปหมด (ดูในบท คำสั่งแรก)

ใช้ทำอะไร เราเขียนสูตรเป็นภาษาที่เครื่องเข้าใจ ที่ชมรมใช้คือ C++ (อ่านว่า ซี-พลัส-พลัส) เขียนเสร็จกดอัปโหลด สูตรก็ไปอยู่ในบอร์ด แล้วบอร์ดสั่งโดรนตามนั้น

อ่านเครื่องหมายสองอย่างนี้ให้ออกก่อน

; (เซมิโคลอน) อยู่ท้ายคำสั่ง เหมือนจุดท้ายประโยค บอกว่าคำสั่งนี้จบแล้ว ลืมใส่คือ error อันดับหนึ่งของมือใหม่

// ข้อความหลังเครื่องหมายนี้คือ คอมเมนต์ คือโน้ตของคนเขียนถึงคนอ่าน เครื่องข้ามไปเลย ไม่ทำอะไร ใช้เขียนอธิบายโค้ด เช่น delay(3000); // รอ 3 วินาที

2. ตัวแปร: กล่องมีป้ายชื่อ

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

ตัวแปรคือกล่องที่มีป้ายชื่อกล่องชื่อ height ใส่เลข 110 แล้วเปลี่ยนเป็น 60 ได้ภายหลังheight110ป้ายชื่อ + ของข้างในheight = 60;height60ป้ายเดิม ของข้างในเปลี่ยนใช้ชื่อแทนเลขแก้ที่เดียวเปลี่ยนทั้งโปรแกรม
กล่องชื่อ height ตอนแรกใส่ 110 แล้วเปลี่ยนเป็น 60 ป้ายชื่อเดิม แต่ของข้างในเปลี่ยน

ทำไมถึงมี ลองคิดว่าโปรแกรมโดรนมีเลข 110 (ความสูง) อยู่ 20 จุด วันหนึ่งอยากเปลี่ยนเป็น 100 ต้องไล่แก้ 20 จุด และอาจพลาดไปจุดหนึ่ง ถ้าตั้งชื่อกล่องว่า HEIGHT_TAKEOFF แล้วเรียกใช้ชื่อนี้ทั้ง 20 จุด ต้องแก้ที่เดียว ชื่อยังช่วยให้อ่านง่ายขึ้นด้วย 110 ไม่บอกอะไร แต่ HEIGHT_TAKEOFF บอกว่าคือความสูงตอนขึ้นบิน ชื่อแบบนี้มาจากวิชาพีชคณิตที่เราใช้ x แทนตัวเลข

ชนิดของกล่อง บอร์ด Arduino Nano มีความจำน้อยมาก (2,048 ไบต์) จึงต้องบอกก่อนว่ากล่องใบนี้จะใส่อะไร จะได้จัดที่ให้พอดี

ชนิดใส่อะไรได้ตัวอย่าง
intจำนวนเต็ม (บวกหรือลบ)int count = 5;
floatเลขทศนิยมfloat ms = 15.46;
boolจริงหรือเท็จ (สองค่า)bool ready = true;

อ่าน int count = 5; เป็นภาษาคนว่า "ทำกล่องชนิดจำนวนเต็ม ชื่อ count ใส่ 5 ลงไป" เครื่องหมาย = ในโปรแกรมแปลว่า "ใส่ค่าลงกล่อง" ไม่ใช่ "เท่ากับ" แบบคณิตศาสตร์

ในโค้ดโดรน ใน config.hpp

constexpr uint16_t HEIGHT_TAKEOFF = 110;
constexpr float MS_PER_CM_FWD = 15.46f;

constexpr แปลว่า ค่าคงที่ กล่องที่ล็อกฝา เปลี่ยนค่าไม่ได้ระหว่างโปรแกรมรัน เหมาะกับค่าที่ไม่ควรเปลี่ยน อย่างความสูงตอนขึ้นบิน (uint16_t คือจำนวนเต็มไม่ติดลบ ขนาดใหญ่ถึง 65,535 ส่วน 15.46f คือเลขทศนิยม ตัว f ท้ายเลขบอกว่าเป็นชนิด float)

เรื่องขนาดและการล้นของแต่ละชนิด อ่านต่อใน ตัวแปรและชนิดข้อมูล

3. ฟังก์ชัน: ชุดคำสั่งที่ตั้งชื่อไว้

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

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

หน้าตา

void FirstProgram() {          // ตั้งชื่อชุดคำสั่งว่า FirstProgram
  pArduino->calibration();     // ข้างในวงเล็บปีกกา { } คือคำสั่งของชุดนี้
  delay(3000);
  pArduino->take_off();
  delay(4000);
}

// ที่อื่นในโปรแกรม เรียกใช้ด้วยการเขียนชื่อ + ()
FirstProgram();                // ทำสองคำสั่งข้างบนทั้งชุด
  • void แปลว่า "ทำเสร็จแล้วไม่ส่งอะไรคืนมา" (ยังไม่ต้องสนใจตอนนี้)
  • { } คือกรอบที่ครอบคำสั่งในชุด
  • เรียกใช้ด้วยการเขียน ชื่อ แล้วตามด้วยวงเล็บ ()

ค่าที่ส่งเข้าไป (อาร์กิวเมนต์) ฟังก์ชันรับรายละเอียดผ่านวงเล็บได้ เหมือนบอกเครื่องซักผ้าว่า "ซักน้ำอุ่น" delay(3000) คือฟังก์ชันที่ Arduino เตรียมไว้ให้ มันรับเลข 3000 แล้ว "หยุดรอ 3000 มิลลิวินาที" drone.fw(250) ก็คือฟังก์ชันที่รับเลข 250 บินไปข้างหน้า 250 ซม.

อ่านต่อ: ฟังก์ชันและอาร์เรย์

4. ปัญหาที่ทำให้เกิด "วัตถุ"

พอโปรแกรมใหญ่ขึ้น ฟังก์ชันมีเป็นร้อย เช่น take_off, auto_land, set_height, move_forward_cm, servo_open ... ปนกันหมด หาไม่เจอ และเริ่มสับสนว่าอันไหนเกี่ยวกับอะไร

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

นี่คือที่มาของแนวคิดที่เรียกว่า OOP (Object-Oriented Programming) การเขียนโปรแกรมเชิงวัตถุ คือวิธีเขียนที่ จัดโค้ดเป็นกลุ่มตามสิ่งของที่มันเกี่ยวข้อง ภาษา C++ ถูกสร้างขึ้นช่วงทศวรรษ 1980 โดยเพิ่มแนวคิดนี้เข้าไปในภาษา C เดิม ซึ่งเป็นเหตุผลที่ชื่อมี "++" (แปลว่า "C เวอร์ชันบวกเพิ่ม")

ศัพท์ที่ต้องรู้มี 3 คำ ใช้การเปรียบเทียบเดียวกันตลอด คือ รีโมททีวี

คำความหมายเปรียบเทียบในโค้ดโดรน
คลาส (class)แบบพิมพ์เขียว บอกว่าสิ่งนี้มีปุ่มอะไรบ้างแบบแปลนรีโมททีวียี่ห้อหนึ่งArduino, DroneEasy
วัตถุ (object)ของจริงที่สร้างจากพิมพ์เขียวรีโมทตัวที่วางอยู่บนโต๊ะpArduino, drone
เมธอด (method)ฟังก์ชันที่อยู่ในวัตถุ = ปุ่มหนึ่งปุ่มปุ่มเปิด ปุ่มเพิ่มเสียงtake_off(), set_height(), fw()

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

5. ใช้วัตถุ: ชื่อวัตถุ จุด/ลูกศร ชื่อเมธอด

สั่งให้วัตถุทำงานด้วยการเขียน ชื่อวัตถุ + เครื่องหมายเชื่อม + ชื่อเมธอด + วงเล็บ

drone.takeOff();          // วัตถุ drone, เมธอด takeOff
pArduino->take_off();     // วัตถุ pArduino, เมธอด take_off

อ่านเป็นภาษาคนว่า "รีโมท drone กดปุ่ม takeOff" ตรงกับที่คุณเห็นในรูปแกะบรรทัดตอนต้นหน้า

ทำไมบางทีเป็นจุด . บางทีเป็นลูกศร -> สองแบบนี้ใช้ทำสิ่งเดียวกัน ต่างกันที่ชนิดของชื่อ

  • drone คือ ตัววัตถุเอง → ใช้จุด drone.takeOff()
  • pArduino คือ ตัวชี้ (pointer) ที่บอกว่าวัตถุตัวจริงอยู่ที่ไหน (เหมือนเลขที่บ้านแทนตัวบ้าน) → ใช้ลูกศร pArduino->take_off() ลูกศรแปลว่า "ตามที่อยู่นี้ไป แล้วกดปุ่ม"

ผลเหมือนกันทั้งสองแบบ ตอนนี้ จำแค่ว่าลูกศร = จุด ก็พอ เรื่องตัวชี้ละเอียดอยู่ใน ตัวชี้ คลาส และ pArduino-> ค่อยอ่านทีหลังได้

6. สองวัตถุที่คุณจะใช้ตลอด

ชมรมมีวัตถุหลักสองตัว ตัวหนึ่งเป็นชั้นล่าง อีกตัวเป็นทางลัด

  • pArduino วัตถุที่คุยกับโดรนโดยตรง ปุ่มทุกปุ่มส่งคำสั่งไปที่ Flight Controller (ชั้นล่างสุด ละเอียด)
  • drone วัตถุที่ห่อ pArduino อีกชั้น ปุ่มสั้นกว่าและเบรกให้ในตัว เช่น drone.fw(250) ข้างในเรียก pArduino->move_forward_cm(250) แล้วหยุดรอให้นิ่ง

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

7. อ่านโปรแกรมจริงให้ออกทีละบรรทัด

ลองอ่านฟังก์ชันที่จะเขียนในบทถัดไป ตอนนี้คุณมีความรู้ครบพอ

void FirstProgram() {            // (ก) ตั้งชื่อชุดคำสั่ง
  pArduino->calibration();       // (ข)
  delay(3000);                   // (ค)
  pArduino->take_off();          // (ง)
  delay(4000);                   // (จ)
  pArduino->set_height(110);     // (ฉ)
}
บรรทัดอ่านเป็นภาษาคน
(ก)นี่คือฟังก์ชันชื่อ FirstProgram คำสั่งข้างในอยู่ใน { }
(ข)รีโมท pArduino กดปุ่ม calibration (ตั้งศูนย์ไจโร)
(ค)หยุดรอ 3000 มิลลิวินาที = 3 วินาที
(ง)รีโมท pArduino กดปุ่ม take_off (ขึ้นบิน)
(จ)หยุดรอ 4 วินาที
(ฉ)รีโมท pArduino กดปุ่ม set_height โดยบอกค่า 110 (ความสูง 110 ซม.)

ถ้าอ่านตารางนี้เข้าใจ แปลว่าคุณอ่านโค้ดโดรนออกแล้ว

8. ลองอ่านเอง

ลองตอบในใจก่อนกดเปิดคำตอบ

สรุปศัพท์ทั้งหมด

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

ต่อไปไป เขียนโปรแกรมแรก (ให้ LED กระพริบ) เพื่อลองเขียนจริงเป็นครั้งแรก

พังตรงไหนบ่อย

  • สับสนจุดกับลูกศร ใช้ตามชนิดของชื่อ drone. จุด pArduino-> ลูกศร ถ้าใช้ผิด IDE จะขึ้น error บอก
  • พิมพ์ตัวพิมพ์เล็ก-ใหญ่ผิด takeOff กับ takeoff เป็นคนละชื่อ เครื่องแยกตัวพิมพ์ใหญ่เล็ก
  • อ่านแล้วอยากรู้ทุกอย่างทันที ไม่ต้อง ผ่านข้อ 1–7 แล้วไปเขียนจริงก่อน แล้วย้อนกลับมาเปิดอ่านตอนติด

On this page