2. อ่านโค้ดให้ออก (ไม่เคยเขียนโปรแกรมมาก่อนก็เริ่มได้)
ตัวแปร ฟังก์ชัน วัตถุ เมธอด และลูกศร -> คืออะไร มาจากไหน ใช้ทำอะไร อธิบายด้วยของในชีวิตประจำวัน แล้วอ่านบรรทัด pArduino->set_height(110); ให้ออก
หน้านี้เขียนให้คนที่ ไม่เคยเขียนโปรแกรมเลย อ่านจบแล้วจะอ่านโค้ดของชมรมออกว่าแต่ละบรรทัดสั่งอะไร ไม่ต้องจำศัพท์ให้ได้ทั้งหมด แค่อ่านตามลำดับ 1 ถึง 8 ทุกข้อมีรูปแบบเดียวกัน คือ คืออะไร → ทำไมถึงมี → ใช้ทำอะไร → ตัวอย่างในโค้ดโดรน
เป้าหมายปลายทางคือบรรทัดนี้ ซึ่งเจอเต็มไปหมดในโปรเจกต์
pArduino->set_height(110);1. โปรแกรมคือสูตรอาหาร
คืออะไร โปรแกรมคือรายการคำสั่งที่เรียงกัน คอมพิวเตอร์ (ในที่นี้คือบอร์ด Arduino) อ่านจากบนลงล่าง ทำทีละบรรทัด ทีละอย่าง เหมือนทำอาหารตามสูตร "ต้มน้ำ ใส่เส้น รอ 3 นาที ใส่เครื่องปรุง"
ข้อสำคัญ คอมพิวเตอร์ ไม่ฉลาดเอง มันทำเฉพาะที่เขียนไว้ ตรงตัวอักษร ไม่เดา ไม่ข้าม ถ้าสูตรไม่บอกว่า "รอ" มันก็ไม่รอ ซึ่งเป็นเหตุผลที่โค้ดโดรนมี delay(4000) เต็มไปหมด (ดูในบท คำสั่งแรก)
ใช้ทำอะไร เราเขียนสูตรเป็นภาษาที่เครื่องเข้าใจ ที่ชมรมใช้คือ C++ (อ่านว่า ซี-พลัส-พลัส) เขียนเสร็จกดอัปโหลด สูตรก็ไปอยู่ในบอร์ด แล้วบอร์ดสั่งโดรนตามนั้น
อ่านเครื่องหมายสองอย่างนี้ให้ออกก่อน
; (เซมิโคลอน) อยู่ท้ายคำสั่ง เหมือนจุดท้ายประโยค บอกว่าคำสั่งนี้จบแล้ว ลืมใส่คือ error อันดับหนึ่งของมือใหม่
// ข้อความหลังเครื่องหมายนี้คือ คอมเมนต์ คือโน้ตของคนเขียนถึงคนอ่าน เครื่องข้ามไปเลย ไม่ทำอะไร ใช้เขียนอธิบายโค้ด เช่น delay(3000); // รอ 3 วินาที
2. ตัวแปร: กล่องมีป้ายชื่อ
คืออะไร ตัวแปรคือ กล่องที่มีป้ายชื่อ ข้างในใส่ค่าได้ และเปลี่ยนค่าได้ภายหลัง
ทำไมถึงมี ลองคิดว่าโปรแกรมโดรนมีเลข 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 แล้วไปเขียนจริงก่อน แล้วย้อนกลับมาเปิดอ่านตอนติด