ความเข้าใจพื้นฐานสำหรับการตั้งค่าวิทยุบังคับ RC ( Radio Control )
วิทยุบังคับทุกวันนี้มีคุณสมบัติสูง มีการพัฒนาสัญญาณให้มีการรบกวนกันน้อยมาก ให้ความรู้สึกตอบสนองต่อการใช้งานดีมากและมีค่าให้ปรับแต่งมากมาย ครับ brands หรือ ยี่ห้อมี่นิยมใช้กันก็อย่างเช่น Futaba , Hitec, Sanwa และ Spektrum
ที่จะกล่าวต่อไปเป็นหัวข้อหลักๆ ที่ต้องทำความเข้าใจ ก่อนที่จะปรับค่าเหล่านั้น รวมถึงลำดับขั้นตอนของ หัวข้อเหล่านั้นว่าควรจะเกิดขึ้นตอนไหนอย่างไร ซึ่งในเรื่องนี้นั้น เป็นเรื่องที่ผู้ที่เริ่มเล่นใหม่ ๆ มักกระหายอยากรู้แต่ก็ยากที่จะหาผู้รู้อธิบายได้ อย่างแจ่มแจ้งถึงจุดประสงค์ของหัวข้อ Function การทำงานเหล่านั้น
ในบทความนี้ไม่ได้เฉพาะเจาะจงไปที่ อุปกรณ์ยี่ห้อได้โดยเฉพาะ หรือประเภทของการเล่น ชนิดใดโดยเฉพาะ นะครับ เราพูดเป็น concept โดยรวม แล้วหาก มีโอกาส หรือมีคำถามเฉพาะเรื่อง ก็จะหาข้อมูลเจาะเฉพาะเรื่องเอามาแบ่งปันกันให้ทราบนะครับก่อนอื่น
มาพูดถึง กฎเหล็กกันก่อนนะครับ
กฎเหล็กของการเล่น RC ก็คือ
- ต้องตรวจสอบก่อนนะครับว่า มีใครที่ใช้ความถี่เดียวกะเราหรือไม่ ไม่ว่าเราจะเล่นที่สนาม หรือเล่นที่ใดๆ ก็ตาม การกวนสัญญาณที่เกิดจากการใช้ความถี่เดียวกันทำให้เราไม่สามารถควบคุม เครื่องบิน หรือ รถเราได้ อาจทำให้ ตก หรือพุ่งเข้าหาคนทำให้เกิดบาดเจ็บได้ โดยเฉาะ เฮริคอปเตอร์ ซึ่งอันตรายมาก
- เปิดวิทยุก่อนเสมอแล้วค่อยเปิดไฟให้กับเครื่องบินหรือ รถ ต้องดูว่า throttle อยู่ในตำแหน่งต่ำสุดเสมอด้วย
- การปิด ก็ต้องเปิดที่รถ หรือเครื่องบินก่อน แล้วค่อยปิดที่วิทยุ นะครับ
ติดตั้ง Servo ให้ถูกต้อง
สิ่งแรกที่เราควรตรวจสอบในการ เซตเครื่องใหม่ หรือครั้งแรกก็คือต้องมั่นใจว่าเราติดตั้ง servo ได้เหมาะสมแล้ว หรืออยู่ในตำแหน่งที่เราได้ตรวจสอบแล้วว่าถูกต้อง คืออยู่ center ของมัน แขน ตั้งฉากกับ case ของ servo
ตรวจสอบได้ด้วยการ เปิดวิทยุ และ receiver โดยเสียบสาย Servo ไว้ (ยังไม่ต้องติดตั้ง Servo บน model ที่เราเล่นนะครับ ) และให้ตรวจสอบให้แน่ใจว่า trim ถูกเลื่อนไปที่ตำแหน่ง neutral หรือ ตำแหน่ง กลาง แล้ว แขน Servo ต้องตั้งฉากกับตัวของ Servo หาก เอียงไปมากก็ให้ถอดแขน Servo ขยับ แต่ถ้าเอียงนิด หน่อย ขยับไม่ได้แล้วก็ปล่อย ไว้ ค่อยไปปรับต่อที่ขั้นตอนต่อไป ที่เราต้อง set ให้ตั้งฉากเพื่อให้ servo สามรถเคลื่อนที่ไป ทั้งสองด้านได้อย่างเต็มที่ (Maximum throw)
Subtrim
Subtrim
หลังจากใส่แขน Servo ทั้งหมดและติดตั้งกับตัว model แล้วสิ่งแรกที่เราจะตั้งค่าใน วิทยุคือ Subtrim
Sumtrim นั้นเป็น การกำหนดค่าหลัก ( master ) ในการปรับตำแหน่ง กลาง ( neutral ) ของ servo โดยไม่มีผลต่อการเคลื่อนที่ ทั้ง 2 ด้าน พูดง่ายๆ คือ เลื่อนจุดกลางโดยที่ Maximum throw ยังเหมือนเดิมทั้ง 2 ด้าน ใช้สำหรับการปรับละเอียด( fine tune ) แขน Servo ให้อยู่ในตำแหน่งเริ่มต้นที่ถูกต้อง (โดยทั่วไปคือ 90 องศาตั้งฉากกับ ตัว case)
ภาพจาก http://rc.runryder.com/helicopter/t708525p1/
ATV (Adjustable Travel Volume)
หรือที่เราเรียกอีกอย่างหนึ่งว่า EPA (End Point Adjustment) เป็นฟังก์ชันควบคุมหลัก อีกอันหนึ่ง ใช้สำหรับการ จำกัดหรือเพิ่ม การ throw ( ผมขอเรียกทับศัพท์ละกันนะครับ มันหมายถึงว่า การเคลื่อนที่ของแขน servo ไปจนหยุด ด้านใดด้านหนึ่งนะครับในครั้งแรกที่เราตั้งค่ามันอาจ เคลื่อนที่ได้มากสุด หรือ Maximum throw ซึ่งเราอาจไม่ต้องการมันก็ได้ ครับ ขึ้นอยู่กับการติดตั้งและการใช้งาน ) การใช้ EPA นี้ก็เพื่อให้การเคลื่อนที่ของ แขน servo นั้น ได้เต็ม การทำงานของมันโดยไม่ค้ำ ยัน หรือ lock (ATV ควรใช้เมื่อเราตั้ง Dual rate ไว้ที่ค่าสูงสุดนะครับ ดู ด้านล่าง)
ภาพจาก http://rcdictionary.blogspot.com/2013/08/endpoint-adjustment.html
Trim
วิทยุ นอกจาก มี subtrim แล้วยังมี trim ใช้สำหรับการปรับค่าชดเชยอีกครั้ง หลังจาก Subtrim ถูกตั้งค่า เช่น Aileron ของเครื่องบิน ในครั้งแรกเราอาจต้องมีการ trim ตอน first flight เพื่อแก้อาการเอียงไปทางด้านใดด้านหนึ่ง ให้สามารถปล่อยมือได้ แล้วไม่เอียง เป็นต้น ในการ ตั้ง trim นี้หากดูแล้วมันเยอะเกินไป แปลว่า เรา ติดตั้ง servo ไม่ดี หรือ ปีกเอียงไปด้านใดด้านหนึ่ง จะต้องย้อนกลับไปแก้ อาการนั้นก่อน แล้วมา subtrim แล้ว trim ตอนบินอีกครั้งหนึ่ง นี่เป็นหลักการนะครับ
Dual Rate
การตั้งค่านี้ บ่อยครั้งครับ ใช้ผิดจุดประสงค์การใช้งาน หลายคนใช้ ค่านี้แทน ATV (ดูด้านบน) ซึ่งผิด Dual rate เป็น การกำหนดค่า ที่ต้องทำที่หลัง การตั้งค่า ATV เพื่อจำกัดการเคลื่อนที่ ภายในค่า ของ ATV ถ้าตั้งค่าถูกต้อง Maximum dual rate จะให้การเคลื่อนที่สูงสุดที่จุด ATV ตั้งไว้ และ หากตั้งไว้ 50% ก็จะเป็น ครึ่งหนึ่งของ ATV ที่ตั้งไว้ ค่านี้มี 2 ด้านนะครับ ไม่จำเป็นต้องเท่ากัน
Exp (Exponential)
หรือเรียกว่า Curve เป็นการที่เราจะสามารถกำหนด mid-range ของ throttle หรือ การเลี่ยว การหมุนต่าง ๆ หรือผมจะเรียกว่าการตอบสนอง ละกันครับ ค่ามันก็จะมีทั้งบวก และ ลบ สำหรับการตั้งให้เป็น ลบ (mild หรือ negative) จะทำให้ servo ตอบสนองต่อการขยับของ stick น้อยลง หมายถึงหาก stick ขยับนิดหน่อย( partial control movement) ก็อาจไม่ตอบสนอง และมีผลทำให้ ระยะการเคลื่อนที่ลดลงด้วย เช่นเรา ดัน stick ไปซ้าย 50% servo อาจเคลื่อนที่ไปแค่ 40% เท่านั้น
ส่วนหากเรากำหนดให้เป็น บวก หรือ เป็น fast จะทำให้ servo ตอบสนองเร็ว และเคลื่อนที่มากกว่าเดิม สำหรับค่านี้ควรเป็นค่าน้อย ๆ นะครับหาก เมื่อใดเราต้อง ตั้งค่านี้ มาก จึงจำสามารถควบคุม model ได้ ก็ควรที่จะกลับไปหา function การตั้งค่าหลักก่อน หรือ อาจต้องไปดูที่ตัว model กันเลยที่เดียว
ภาพจาก http://www.angelfire.com/indie/aerostuff/IMAGES/Servo-SurfaceGeometry-02.jpg
ตัวอย่างเช่น หาก เครื่องบิน ตอบสนองต่อการ กัม/เงย เร็ว เกินไป อาจต้องไป กำหนดค่า EXP ของ Elevator ให้เป็น ค่าลบเพื่อให้การตอบสนองช้าลง ซึ่งจะทำให้การควบคุมได้ง่ายขึ้น
สำหรับ dual rate กับ EXP ลองอ่านที่นี่เพิ่มเติมนะครับ
สรุปว่า ขั้นตอน ควรเป็นเช่นนี้นะครับ
ครับคิดว่า ความเข้าใจเหล่านี้จะเป็นประโยชน์ต่อหลายๆ ท่านนะครับ ขอให้สนุกสนานกับการ ควบคุมนะครับ
s_teerapong2000@yahoo.com
s.teerapong@gmail.com
งาน UAV Community “Unmanned Unlimited” 2014
การตรวจสอบการใช้ Memory ( Measuring Memory Usage )
วิธีในการวินิจฉัยปัญหาของการใช้ memory คือการตรวจสอบจำนวน memory ที่ถูกใช้ไปโดยโปรแกรมที่เราเขียน เรามักต้องให้ความสำคัญกับเรื่อง การใช้ Memory ค่อนข้างมากเนื่องจาก ทรัพยากร Memory มีน้อย ดูได้จาก post ที่แล้ว เราลองมาดูวิธีการตรวจสอบ กันครับ
Flash
การตรวจสอบจำนวน พื้นที่ที่ถูกใช้ของ flash นั้นดูได้จาก ข้อมูลที่ compiler แสดงทุก ครั้ง ที่มีการ compile
EEPROM
สำหรับ EEPROM นั้นเราสามารถรู้ได้แน่นอนว่าพื้นที่ใช้ไปเท่าไร เหลือเท่าไร เนื่องจากการอ่านและเขียนนั้นเราจะต้อง อ้างไปที่ตำแหน่งของ address นั่นๆ เราไม่รู้ไม่ได้
จากรูปการใช้งานจะเห็นว่าการอ่านหรือเขียนข้อมูลกับ EEPROM นั้นจำนวนการใช้ Memory นั้นค่อยข้างชัดเจนและแน่นอนสามารถควบคุมได้ด้วยโปรแกรมเมอร์อย่างชัดเจน
SRAM
สำหรับ SRAM นั้น การใช้งานค่อนข้าง dynamic ทำให้ยากต่อการตรวจวัด การใช้ free_ram() เป็นวิธีเดียวสำหรับการตรวจสอบนี้ ใช้ส่วนของ code นี้ในโปรแกรม แล้วเรียกใช้เพื่อตรวจสอบ ได้เมื่อต้องการ จากจุดต่างๆ ของ code การใช้พื้นที่ของ SRAM นั้นค่อนข้าง คาดเดาได้ยาก จะต้องมีการตรวจสอบด้วย free_ram() เป็นระยะ ทุก จากทุกจุดของ code
การทำงานของ function freeRam() นั้นเป็นตรวจสอบพื้นที่ ว่างระหว่าง heap กับ stack ไม่ได้รวมถึง memory ใน heap ที่ เลิกใช้หรือ de-allocated (หรือเรียกว่า Buried heap space )
Buried heap space นั้นจะถูกทิ้งไว้โดยไม่มีใครสามารถนำไปใช้ได้ ไม่ว่าจะเป็นส่วนของ heap เองหรือ ของ Stack เองก็ตาม
Buried heap space นั้นเป็นพื้นที่ stack เอาไปใช้งานไม่ได้ หรือแม้แต่ heap เอง พื้นที่ ที่คืนมาอาจไม่ต่อเนื่องพอที่จะ allocate ใช้กับข้อมูลที่ต้องการใช้ได้ ก็ต้องทิ้งล้างไป ดังนั้นพื้นที่ ระหว่าง stack และ heap จึงเป็นพื้นที่ ที่เรา monitor เพื่อป้องกันปัญหาเช่น การล่มของ stack
รูปจาก https://learn.adafruit.com/memories-of-an-arduino/measuring-free-memory
ครับเป็นเรื่องราวที่จำเป็นจะต้อง ทำความเข้าใจให้ถ่องแท้แน่นอน เพื่อการเขียนโปรแกรมที่มีประสิทธิภาพและใช้ทรัพยากกรที่มีอย่างจำกัดได้ประโยชน์สูงสุดครับ
ติดตามกันต่อไปนะครับ อุปกรณ์ที่เราจะนำมาใช้งานร่วมนั้นก็มีส่วนที่จะต้องใช้ Memory เหมือนกัน ติดตามกันต่อไปครับ
ธีระพงษ์ สนธยามาลย์
อ้่างอิง Arduino – Memory , Measuring Memory Usage
การจัดการ Memory ของ Arduino [Arduino Memories]
Arduino มี Memory อยู่ 3 ชนิดคือ
- Flash หรือ Program Memory
- SRAM
- EEPROM
Flash Memory
ใช้สำหรับการบันทึก Program Image และข้อมูลตั้งต้นต่างๆ เราสามารถ run โปรแกรมจาก flash memory ได้แต่เราไม่สามารถแก้ไขข้อมูลใน flash memory จาก code ที่ทำงานอยู่ได้ หากต้องการแก้ไขข้อมูลเราจะต้องทำการสำเนาไปที่ SRAM
Flash memory นั้นใช้เทคโนโลยีเดียวกันกับ thumb-drive และ SD cards ซึ่งเป็นแบบ non-volatile หมายถึง program หรือข้อมูลจะคงอยู่แม้ว่าจะไม่มีไฟหล่อเลี้ยงอยู่ก็ตามหรือมีลักษณะเหมือน hard disk แต่มันก็มีข้อจำกัดในเรื่องจำนวนครั้งในการเขียนกล่าวคือเราจะเขียนหรือบันทึกข้อมูลลง flash memory ได้ประมาณ 100000 ครั้ง (100000 write cycle) มากพอที่จะใช้งานสัก 10 – 20 ปีแหละครับ ( สมมติว่าเราเขียนลงบน flash memory 10 ครั้งต่อวันเราก็จะใช้เวลาประมาณ 27 ปีครับ )
SRAM
หรือ Static Random Access Memory นั้นสามารถอ่านหรือเขียนได้จากโปรแกรม code ที่ทำงานอยู่ SRAM นั้นถูกใช้ในหลายๆจุดประสงค์คือ
- Static Data เป็นส่วนของ memory ที่กันไว้สำหรับ global variable และ static variable ของโปรแกรมสำหรับตัวแปรที่ถูกกำหนดค่าเริ่มต้นเมื่อเริ่ม start ระบบจะทำการสำเนาค่าเริ่มต้นนั้นจาก flash memory มาใส่ให้
- Heap เป็นส่วนที่เก็บข้อมูลแบบ dynamic หรือข้อมูลที่มีการ allocate ระหว่างที่โปรแกรมทำงาน ส่วนของ Heap นั้นจะขยายจากส่วนบนของ static data ขึ้นไปโดยใช้ส่วนของ memory ที่ว่างไปเรื่อยๆในระหว่างที่มีการจองและใช้งานของโปรแกรมที่ทำงานอยู่
- Stack เป็นส่วนของ memory ที่ใช้เก็บข้อมูลตัวแปรแบบ local และเก็บรายการ interrupts และ function call ต่างๆ memory ในส่วนของ stack จะขยายจากด้านบนสุดของ memory ลงมาหา Heap ดังนั้นทุกๆ ตัวแปร รายการ interrupts และ function call นั้นจะทำให้ memory ส่วน stack ขยายลงมากเรื่อยๆ การ return จาก interrupt หรือจาก function call นั้นจะคืนพื้นที่ว่างให้กับ SRAM
ปัญหาส่วนใหญ่ของ Memory เกิดจากการขยายขนนาดของ stack และ heap จนมาชนกันเมื่อเกิดการชนกันของ stack และ heap พื้นที่ข้อมูลของส่วนที่ถูกบันทึกทับก็จะเสียหายส่งผลให้เกิดการทำงานผิดพลาดแบบไม่สามารถคาดเดาผลการทำงานได้หรือในบางครั้งก็อาจทำให้เกิดการล่มของโปรแกรมไปเลย หรือในบางครั้งผลของการชนกันอาจไม่สังเกตเห็นได้จนกระทั่งเกิด error ขึ้นภายหลังจากนำเอาโปรแกรมไปใช้งานแล้วก็ได้
EEPROM
เป็น non-volatile memory อีกอันหนึ่งซึ่งสามารถอ่านและเขียนโดยโปรแกรม code ที่ทำงานอยู่แต่ข้อจำกัดของมันคือต้องอ่านทีละ byte ทำให้เวลาใช้งานยุงยากหน่อยและการอ่านก็ช้ากว่า SRAM นอกจากนี้ก็ยังมีข้อจำกัดในการเขียนที่ 100000 write cycle ( แต่การอ่านไม่จำกัด )
Arduino Memory Comparison
ตารางด้านล่างแสดงถึงข้อเปรียบเทียบของจำนวน memory แต่ละชนิดของแต่ละ model ของ Arduino และ Arduino compatible board
ครับ เรารู้รูปแบบของ Memory ต่าง ๆ กันคร่าวแล้ว ทำไงเราจะตรวจสอบว่า โปรแกรมที่เราเขียนนั้นใช้ Memory ไปเท่าไร หมายถึงอะไรเท่าไรนะครับ มีคำอธิบายต่อไปเรื่องการตรวจสอบ ใน ตอนต่อไปครับ เรื่อง การตรวจสอบการใช้ Memory ( Measuring Memory Usage )
ขอให้สนุกกับการ เรียนรู้นะครับ
ธีระพงษ์ สนธยามาลย์
วิธีการอ่าน PWM Signals จาก Receiver ด้วย Arduino ขั้นพื้นฐาน
เรามาเรียนรู้วิธีการอ่าน สัญญาณ PWM จาก Receiver กันครับ
จากที่เราทราบกัน นั้น ขาสัญญาณที่ใช้คบคุม servo นั้นส่งสัญญาณออกเป็น PWM และสามารถใช้ควบคุม servo ได้โดยตรง หากเราต้องการใช้สัญญาณนี้เราสามารถอ่าน จากขาสัญญาณเหล่านี้ได้ด้วย Arduino โดยตรง

ภาพบนเป็นภาพลักษณะการใชงานทั่วไป ครับ เนื่องจาก board ที่เราจะใช้นั้นเป็น Arduino UNO จะมีขาสัญญาณ PWM อยู่สามารถอ่านค่าได้โดยตรง ด้วยคำสั่ง pulseIn(…) ดังนั้นเพื่อทำความเข้าใจ ก็จะลองทดสอบอ่านค่าจากขาสัญญาณ จาก receiver ด้วย Arduino ดูนะครับ
อุปกรณ์ที่จะใช้
- board Arduino UNO R3
- Receiver (Futaba) R146iP
- Transmitter T9CHP
เราจะใช้ขา pin 9 ต่อกับ ช่องสัญญาณที่หนึ่งของ Receiver ดังรูป แล้วให้ Power เข้าที่ ช่องสัญญาณที่ 6 แล้วเราลองทดสอบกันด้วยโปรแกรมสั้น ๆ ตามนี้ครับ
int ch1 ; // to keep channel values
void setup()
{
pinMode(9,INPUT); // set out input pin as such
Serial.begin(9600);
}
void loop()
{
ch1 = pulseIn(9,HIGH,25000); // Read the pulse width of the channel
Serial.print(“channel data : “); // print value of
Serial.println(ch1) ; // the channel
delay(100);
}
puleIn() function ต้องการ 3 arguments ตัวแรกก็คือ หมายเลข pin ที่เราต้องการให้สัญญาณ pulse เข้ามา ตัวที่่ 2 คือ pulse ‘HIGH’ หรือ ‘LOW’ ที่เรากำลังสนใจอยู่ และสุดท้ายก็เป็น เวลาที่เรากำหนดให้ function รออ่านค่า เรียกว่า time-out
ค่าที่ return ให้ของ puleIn() ก็คือ ความยาวของ pulse มีหน่วยเป็น microseconds และนี่ก็คือวิธีการอ่านสัญญาณ PWM ซึ่งเป็นวิธีเดียวกับที่ servo อ่านสัญญาณนี้
ค่าที่ได้เราให้แสดงออกทาง terminal เมื่อเราทำการประมวลผลโปรแกรมนี้เราควรจะได้ ตัวแสดงผลขึ้นมาที่หน้า terminal ตัวเลขนี้ค่าควรจะอยู่ระหว่าง 1000 – 2000 และเมื่อเราขยับ joy stick ที่เชื่อมโยงกับช่องสัญญาณนี้ ตัวเลขก็ควรจะเปลี่ยนแปลงให้เห็น

ครับ เท่านี้ก็ถือว่า เป็นการทดสอบที่ สมบูรณ์ และสามารถใช้งาน ได้แล้ว ในเรื่องนี้ยังไม่จบนะครับนี่เป็นจุดเริ่มต้นของการเรียนรู้ในขั้น Advance ต่อไปครับ
ธีระพงษ์ สนธยามาลย์
s.teerapong@gmail.com
วิทยุบังคับทุกวันนี้มีคุณสมบัติสูง มีการพัฒนาสัญญาณให้มีการรบกวนกันน้อยมาก ให้ความรู้สึกตอบสนองต่อการใช้งานดีมากและมีค่าให้ปรับแต่งมากมาย ครับ brands หรือ ยี่ห้อมี่นิยมใช้กันก็อย่างเช่น Futaba , Hitec, Sanwa และ Spektrum












