การเขียนโปรแกรมเครื่องบินสี่ใบพัดพื้นฐาน

 


วัตถุประสงค์ของหลักสูตร :
สอนสร้าง QUADCOPTER ด้วยตนเอง เป็นการสอนเชิงปฏิบัติการเรียนรู้และฝึกทักษะด้านระบบสมองกลฝังตัวของอากาศยาน (Quadrotor Controller) เพื่อมีความรู้พัฒนาต่อยอดในการเขียนโปรแกรมพื้นฐานด้าน UAV เบื้อง
ต้น ของเครื่องบิน ใบพัด โดยใช้ Arduino เพื่อให้ทำงานอัตโนมัติด้านระบบสมองกลฝังตัวของอากาศยาน ใบพัดขนาดเล็ก และเปิดเผยข้อมูลการพัฒนาโค๊ตการเขียน  ว่าจะเริ่มเขียนตั้งแต่เริ่มบินเริ่มสร้าง และ Code ที่ใช้ โปรแกรมหลักคือ Arduino สามารถทำเงื่อนไข 1. Automatic Takeoff 2. Landing 3. GPS Position Hold 4. Altitude Hold 5. 1 Waypoint Navigation
เนื้อหาพื้นฐาน
อากาศยานไร้นักบิน (Unmanned Aerial Vehicle, UAV) เป็นคำจำกัดความของเครื่องบินที่ปราศจากคนบังคับอยู่ในเครื่อง ได้รับความนิยมมาก ในการนำไปใช้งานในด้านต่างๆ เช่น กิจการพลเรือน,กิจการทหาร โดยมีภารกิจได้แก่ การสำรวจไฟป่าสํารวจป่าไม้สำรวจสภาพน้ำในเขื่อนขนาดใหญ่ การรายงานสภาพแวดล้อมที่มนุษย์เข้าไม่ถึงการรายงานสภาพการจราจรการถ่ายภาพทางอากาศ,ภารกิจค้นหา และช่วยเหลือ ,โดรนช่วยส่งห่วงยางชูชีพ,     โดรนช่วยผู้ประสบภัยทางทะเลธุรกิจประเภทสื่อสารมวลชนธุรกิจการถ่ายทำภาพยนต์โดรนถ่ายภาพมุมสูง [6] โดรนพ่นละอองน้ำหน้าต่างสำหรับป้องกันหมอกควัน,  โดรนเพื่อการเกษตร โดรนสำหรับพ่นยา-ปุ๋ยทางใบ [7] งานวิจัย การควบคุมเพนดูลัมผกผัน โดรนประกอบเสียงดนตรีเครื่องบินปรับมุมใบ 4 ใบพัด ,เครื่องบิน 4 ใบพัดปรับตัวเองได้เครื่องบิน 4 ใบพัดสร้างบ้าน
มอเตอร์ สปีด ESC ไมโครคอนโทรลเลอร์ที่ใช้ ทำเองและสำเร็จรูป .Ultrasonic Sensor Module .GPS Optical flow sensor Sharp GP2Y0A02YK0F Distance Measuring Pixy CMUcam5 Sensor เฟรม Frame_3DPro450_V3 รีโมทSTORM i62.4GHz  FlySky TH9และโมดูล FrSky DHT 8ch DIY Telemetry Turnigy 9XR Transmitter  แบตเตอรี่ Lipo Pack และเครื่องชาร์ท อุปกรณ์เสริมservo tester ,Servo digital, USBasp - USB programmer Radio Telemetry Kit433Mhz , TTL-232R TTL to USB Serial Converter USB cable for Phoenix flight simulator เครื่องมือ ไขควง คีม ผ้าเทป กาวสองหน้า สรุปอุปกรณ์ประกอบสร้างหุ่นยนต์บิน วงจรไดอะแกรมการต่อสายไฟ  โปรแกรม arduino ไฟล์ Code ที่ใช้
คำสำคัญ
เขียนโปรแกรมเครื่องบินสี่ใบพัดการเขียนโปรแกรม Quadrotor พื้นฐาน,การบินอากาศยาน 4 ใบพัด ,โดรน drone  ,โดรนคอร์ดคอปเตอร์ Drone QuadCopter ,อากาศยานไร้คนขับเครื่องบินบังคับ 4 ใบพัด เฮลิคอปเตอร์ 4 ใบพัดชุดประกอบเครื่องบิน 4 ใบพัด ,สอนเขียนโปรแกรมวิธีบังคับเฮลิคอปเตอร์บังคับวิทยุ, quadcopter diy, diy multi rotor, arduino quadrotor,  quadrotor arduino, โปรแกรม arduino, arduino โปรแกรม,  วิธีเล่นเฮลิคอปเตอร์บังคับขายเครื่องบินบังคับ 4 ใบพัด,  วิธีทําเครื่องบินบังคับ 4 ใบพัดเฮลิคอปเตอร์ 4 ใบพัด,สร้างโดรนเครื่องบิน4ใบพัดโดรน 4 ใบพัด, 3d Fixed Pitch (มอเตอร์กลับทางหมุนได้และไม่กลับทางหมุน) ,3d Variable Pitch (มุมใบพัดเปลี่ยนแบบ ฮอ.3d) , TK Quad 3D Shop, 3d quad Copter, โดรนตีลังกา บิน quad 3D, โดรน 3d ,เฮลิคอปเตอร์ ใบพัด ตีลังกา, Tinnakon3D, ขายชุด Quad 3D, 3D Quad450 Tinnakon3D V4,Tinnakon3D_V3
รายการชิ้นส่วนที่ผู้เข้าแข่งขันต้องเตรียม
ที่                                  รายการ                                       จำนวน               หน่วย     หมายเหตุ
๑   Arduino MEGA ๒๕๖๐ R๓ แถมสาย USB                        ๑                      ชิ้น    
๒   เซนเซอร์ GY-๘๖ (MPU๖๐๕๐ HMC๕๘๘๓L MS๕๖๑๑)       ๑                      ชิ้น        
๓   Ultrasonic Sensor Module                                        ๑                      ชิ้น        
๔   GPS BS-๓๐๐                                                           ๑                      ชิ้น        
๕   สปีด Dargon ๓๐                                                      ๔                      ชิ้น       
๖   รีซีฟเวอร์                                                                    ๑                      ชิ้น      
๗   มอเตอร์ motor sunny ๒๒๑๒ ๑๔๐๐kv                           ๔                      ตัว       
๘   ใบพัด ๘ นิ้ว                                                                ๔                      ใบ      
๙   เฟรม quad Frame_Auto๔๕๐_V๒                                ๑                      ชุด      
๑๐ แบต ๒๒๐๐ mAh ๒๐                                          ๑                      ชิ้น        
๑๑ เครื่องชาร์ต TE๓๐๒๕AC                                               ๑                      อัน        
๑๒ UBEC V                                                                  ๑                      ชิ้น       
๑๓ สายไฟ ขั้วแบท แผ่นปริ้น                                                ๑                      ชิ้น       
๑๔ รีโมท STORM iS (๒.๔GHz)                                         ๑                      ชุด       

หัวข้อที่ต้องรู้ในการเขียนโปรแกรม
บอร์ด Arduino MEGA 2560 กับ เซนเซอร์ GY-86 10DOF
อธิบาย Code QuadX_2560GY86_PIDAuto_V5

1. การกำหนดความเร็วลูป 100 Hz, 50 Hz, 20 Hz, 10 Hz, 5 Hz, 1 Hz 
100 Hz ทำ อ่านเซนเซอร์ gyro,acc, ควบคุม PID , Filter
50 Hz ทำ อ่านค่ารีโมท
20 Hz อ่านค่า Ultrasonic ,ทำ Filter
10 Hz ทำ Automatic  Takeoff และ Landing อ่านค่า   
Magnetometer และ Chack_Command, By Remote  idle-up settings 0,1,2
5 Hz คำนวณ GPS ควบคุมต่ำแหน่ง
1 Hz แสดงสถานะหลอดไฟ LED ทำ Accelerometers trim โดยใช้ รีโมท
2. การสร้างตัวแปรเพื่อเก็บค่า  int 16 bit, long 32 bit ,uint8_t, unsigned long ,
   float 32bit,
3. การอ่านค่าเซนเซอร์ gyroscope , accelerometer, magnetometer
4. การอ่านค่าบาโรเพื่อมาคำนวณค่าความสูงจากเซนเซอร์ MS5611
5. การทำตัวสังเกตเพื่อประมาณค่าความสูง  ,State estimation with Kalman Filter
6. การอ่านค่าเซนเซอร์ Ultrasonic , Trigger, Echo
7. การอ่านค่าเซนเซอร์ GPS ใช้ NMEA_BINARY settings ของ MultiWii
8. การอ่านค่ารีโมท PWM 1-1.9 ms แบบ PPM (Pulse Position Modulation)
   สายเส้นเดียว ได้ 6 CH
9. การกำหนดค่าเริ่มต้นใน setup()
ค่าเริ่มต้นการอ่านรีโมท
ค่าเริ่มต้นสั่งมอเตอร์
ค่าเริ่มต้น GPS
ค่าเริ่มต้น I2C เปลี่ยน I2C clock rate to 400kHz
ค่าเริ่มต้นเซนเซอร์ GY-86 , mpu6050  HMC5883 MS561101BA
ค่าเริ่มต้นอัลตร้าโซนิค
การอ่านเซนเซอร์เริ่มต้น
การทำคาริเบตเซนเซอร์
ตั้งค่าเริ่มต้นการหามุม AHRS (An attitude and heading reference
  system , AHRS)
- กำหนดเวลาเริ่มต้น
10. การทำ sensor Calibration และการแปลงหน่วย rad/s , deg/s , m/s^2
11. การลดสัญญานรบกวน sensor , Moving average  filter , Low pass  filter
12. วิธีการหาค่ามุม AHRS, Quaternion , direction cosine matrix , Euler angles,
     Rotation matrix  Body Fixed Frame, Earth-Fixed frame
13. การอ่านค่า GPS latitude and longitude , ความเร็วการเคลื่อนที่
     Earth-Fixed frame
14. การควบคุมพีไอดี , P-PID  , Roll, Pitch, Yaw
คำนวณหาค่ามุมรีโมท
การดิฟหาความเร็วจากมุมรีโมท
การคำนวณค่า error
การคำนวณกฏการควบคุมมุมและ Rate Gyro
15. การควบคุมความสูงใช้ State feedback control หรือ PID
16. เทคนิคการจูนค่า Gain ที่ใช้ควบคุม
17. เงื่อนไขการทำ Automatic  Takeoff และ Landing
18. การควบคุมต่ำแหน่ง GPS ใช้ PID control
19. การทำ Motor mixing theory,  Quad +,x
20. การสั่ง PWM 1-1.9 ms ให้มอเตอร์หมุน
21. การทำ Electronic Speed Controllers Calibration 1 - 1.9 ms
22. การทำ Accelerometers trim โดยใช้ รีโมท
23. การทำ Calibration sensor Magnetometer หาค่า Max , Min
24. การทำ ARM and DISARM มอเตอร์ไม่หมุนและหมุน
25. อื่น ๆ .....

-----------------------------------------------------
สรุป Flowchart Diagram และ algorithm ที่ใช้
อ่านเซนเซอร์ อ่านรีโมท แปลงหน่วย rad/s เข้า Moving average filter อ่านหาค่าเฉลี่ย จากนั้นตัด nois หาร 2 อีกที ส่วนความเร่ง แปลงหน่วย m/s^2 เข้าLow pass filter หรือ Filter Fourth Order อ่านค่าเข็มทิศ ใช้ Low pass filterคำนวณ offsets x y z scaling to +/-range จากนั้นใส่คำนวณมุมใช้วิธีการ การหามุม An attitude and heading reference system (AHRS) และคำนวณdirection cosine matrix (DCM) ทำ Euler angles ให้ได้มุม roll pitch yaw จากนั้นไปคำนวณกฏการควบคุมใช้ P-PID ควบคุมมุมและความเร็วเชิงมุม และความเร่งเชิงมุม จะได้ uroll upitch uyaw จากนั้นไปเข้าการสั่งมอเตอร์ Motor mixing theory ส่งค่า PWM ออกไป

เรื่องลูปเวลา
ก่อนจะเริ่มทำการเขียนโปรแกรมควบคุม multirotor เรามาทำความเข้าใจเรื่องลูปเวลากันก่อนนะครับเพราะเราจะสามารถกำหนดได้ว่าจะให้ส่วนไหนทำงานอยู่กี่ Hzบ้าง และสำคัญมากในการเอาไปคำนวนร่วมกับ PID
เช่นคำว่า 100 Hz หมายความว่า ใน 1 วินาที ทำงานอยู่ 100 ครั้ง
มาดูค่าของเวลาที่จำเป็นต้องรู้กัน
1 วินาที = 1000 มิลลิวินาที
1 มิลลิวินาที = 1000 ไมโครวินาที
1 ไมโครวินาที = 1000 นาโนวินาที
ปรกติเวลาในไมโครคอลโทลเลอ เวลาเราเสียบไฟมันก็จะวิ่งไปเรื่อยๆของมัน วิ่งเป็นมิลลิวินาที เราก็ต้องเขียนโปรแกรมดักจับ ว่าจะให้ทำงานกี่ครั้งใน 1 วินาที
ตัวอย่างวิธีเขียนโค้ดดักจับเวลาก็เป็นแบบนี้นะครับ เห็นแล้วจะคุ้นๆ
//ประกาศตัวแปรที่จะใช้เก็บค่าของเวลาที่จำเป็น
float G_Dt=0.0;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
unsigned long deltaTime = 0;
void setup() {
Serial.begin(115200); //กำหนดความเร็วbudrateที่จะปริ้นค่าออกมาทางคอม
}
void loop() {
currentTime = millis(); //กำหนดตัวแปร currentTime ให้เป็นเวลาแบบมิลลิวินาที
deltaTime = currentTime - previousTime; //กำหนดให้ตัวแปร deltaTime เก็บค่าเวลาปัจจุบัน ลบด้วยเวลาก่อนหน้า
if((deltaTime)>=10)//ถ้าเวลาปัจจุบันลบด้วยเวลาก่อนหน้ามากกว่าหรือเท่ากับ10เงื้อนไงก็เป็นจริง.......ตรงนี้เป็นการดักจับแค่ 100Hz (100ครั้งต่อวินาที) ตัวเลข 10มาจากไหนนะเหรอ ก็คือ 1 วินาทีมี 1000 มิลลิวินาทีใช่ไหม แล้วเอามาหารจำนวนครั้งที่ต้องการในที่นี่คือเอาแค่ 100Hz ก็จะเป็น 1000/100=10 เข้าใจแล้วนะ
{
G_Dt = deltaTime/1000.0;//อยากรู้ไหมว่าใน 1วินาที มันทำงานอยู่ที่ความถี่ ทุกๆกี่มิลลิวินาที สูตร ก็คือ f=1/t f=ความถี่ t=จำนวนครั้งที่ต้องการ(ในที่นี่คือ 100Hz) ก็จะเท่ากับ 1/100=0.01 (แต่โค้ดเขียนแบบนั้นนะ คือเอาเวลาปัจจุบันลบเวลาก่อนหน้าแล้วหารด้วย1000.0มิลลิวินาที หรือ 1วินาที)
Serial.print(G_Dt);Serial.print("\t");//ลองปริ้นมาดูซิว่าได้ 0.01 ไหม (มันก็จะปริ้นค่าออกมาให้ดูที่ 100ครั้งต่อวินาทีครับ ไม่เร็วมากไป)
Serial.print("\n");
previousTime=currentTime;
}
}

สรุป
วิธีหาว่าจะเอาค่าอะไรไปดักจับในส่วนเงือนไข if ก็คือ มิลลิวินาที/จำนวนครั้ง(Hz)เช่น 1000/100=10Hz เอา 10 ไปใส่ในฟังชั่น if เพื่อกำหนดเงื้อนไข
วิธีหาความถี่ว่าทำงานกี่ทุกๆมิลลิวินาทีคือ 1/จำนวนครั้ง(Hz) เช่น 1/100=0.01
จบ ไม่รู้อธิบายถูกหรือเปล่า ขอให้ผู้รู้มาช่วยแก้ไขหน่อยนะครับ ผมก็ไม่เก่งเท่าไหร่ อิอิ
By Robotcanfly Maker
เมื่อครั้งที่แล้วเราพูดถึงการเขียนโปรแกรมลูปเวลาแบบมิลลิวินาทีกันไปแล้ว มาครั้งนี้เรามาดูการเขียนลูปเวลาแบบไมโครวินาทีกันบ้าง
ไม่มีไรมาก การใช้ micros ก็แค่เป็นการใช้ลูปเวลาที่ละเอียดขึ้น
มาดูโค้ดกันเลย ตัวอย่างนี้เป็นการทำงานที่ 100Hz
currentTime = micros();//กำหนดตรงนี้เป็นตัวแปรแบบ ไมโครวินาที
deltaTime = currentTime - previousTime;
if (deltaTime >= 10000) //ทำไมถึงเป็น 10000 รู้ไหม มันก็คือ 10000 ไมโครวินาทีนั่นเอง ก็เพราะ 1วินาที =1000 มิลลิวินาที และ 1มิลลิวินาที = 1000 ไมโครวินาที ดังนั้น 1 วินาทีจะเท่ากับ 1000 มิลลิวินาที x 1000 ไมโครวินาที = 1000000 นาโนวินาที ฉะนั้น 1วินาทีมี 1000000 นาโนวินาที เพราะเราเขียนเป็นแบบไมโครเราก็เอา1000000/100ครั้ง=10000 เข้าใจนะ
{
G_Dt = deltaTime/1000000.0;//ตรงนี้ก็ไม่มีไรมากตามสูตรเลย 1000000.0 ก็คือ1วินาทีมี 1000000นาโนวินาที
Serial.print(G_Dt);Serial.print("\t"); //ลองปริ้นดูอีกทีว่าได้ 0.01 ไหม
Serial.print("\n");
previousTime = currentTime;
}
วิธีทดสอบ GPS ว่าทำงานถูกต้องหรือไม่ ดูตรงไหนครับ
ทดสอบโดยการเสียบ usb เข้ากับคอมพิวเตอร์ครับ ผ่านโปรแกรม u-center GNSS evaluation software for Windows http://www.u-blox.com/.../evaluati.../u-center/u-center.html

setpoint_rate_pitch = (0.065*setpoint_rate_pitch/(0.065+G_Dt)) + ((setpoint_pitch-setpoint_pitchold)/(0.065+G_Dt));//Diff remote  พี่ครับ 0.065 คืออะไรหรอครับ
 สมการนี้คือ การอนุพันธ์ค่ามุมจากรีโมทเพื่อหาความเร็ว และใช้ low pass filterเพื่อตัด nois อีกที ค่า 0.065 คือค่าเวลาคงที่ในการ filter

applyDeadband(value, deadband)
คืออะไร หรอครับ
อธิบายอยาก คือเป็นการตัดค่าทิ้งหากค่าเป็นค่าน้อยกว่าค่า +-ที่ตั้งใว้ ให้เป็น ตัดnois กรณีที่ว่างนิ่งหรือบินนิ่งจะมี nois กระโดดแต่ใช้คำสั่งนี้จะตัดค่านั้นทิ่งที่ 0  คือ ตัดน้อยส์ ประมาณว่า ถ้ามันเล็กน้อย ก็ไม่ต้องเอาไปคิด ตัดเป็น 0
ค่า deadband คือค่า จะนำไป ลบ ถ้ามากกว่า 0 จะนำไป บวก ถ้าน้อยกว่า 0เพื่อที่พยายาม ให้มันไกล้ 0 (นิ่ง) ใช่ไหมครับ แต่ถ้ามากไป จะทำให้ค่าผิดจากความเป็นจริงมาก

สอบถามการหันทิศทางของเซนเซอร์ครับ ว่าต้องหันอย่างไรครับ
แกน คือ ด้านหน้าเครื่องบิน แกน คือด้านขวาเครื่องบิน แกน คือด้านล่างเครื่องบิน
อีกเทคนิคสร้างกราฟ  https://code.google.com/p/serialchart/
Open source application for charting data sent via RS-232 port in real time.
For configuration file syntax see: ConfigurationFileSyntax
For sample usage with a microcontroller (Arduino) project see: http://starlino.com/imu_kalman_arduino.html
http://starlino.com/data/imu_kalman_arduino/imu_arduino_serial_chart.png
https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-xft1/v/t1.0-9/11076290_1610576079173848_6272224114807428377_n.jpg?oh=6fe8b3d436662914fbb7133145763c93&oe=559AEEA5&__gda__=1433447108_585436fd514ed1592e7b773165e842e6

 ขอสอบถามข้อมูลหน่อยนะครับ คือว่า code ที่เขียนTK_QuadDue32bit_FullSensor ในไฟลโค๊ด จะมี. Sensor อยู่หลายตัวเช่น #include "Ultrasonic04.h"ตัวนี้จะเป็น Ultrasonic Module ของ HCSR04 แล้วถ้าผมจะใส่ตัวอื่นของยี่ฮ่ออื่นๆ จะต้องเข้าไปแก้ไข code ที่ไฟลไหนบ้างครับ 
ขอบคุณครับ
ถ้า Ultrasonic ที่มี Echo Pin และ Trigger Pin ใช้ได้หมดทุกรุ่นครับทดสอบแล้ว แต้ถ้าเป็นแบบเอนาล๊อกไม่ได้
แล้วส่วนของ code #defineHCSR04_TriggerPin. 
HCSR04 นีผมก็เปลี่ยนชื่อเป็นยีฮ่อที่ผมจะใส่ได้ใช่ใหมครับ

//Serial.print(failsafeCnt);Serial.print("\t");
ถ้าผมจะทำ Failsafe, AUTO|RTL (return to launch site) จำเป็นต้องมีรีโมทของFlysky TH9x ด้วยใช่ใหมครับ แล้วทำไมรีโมทของ STORM i6s ถึงทำไม่ได้ครับ เพราะอะไรครับ
แล้วพวกกล่อง Failsafe Module นี่มีไว้ทำอะไรหรอครับ แล้วเราสามารถนำมาใช้ร่วมกับ Project ของเราได้ใหมครับ
ขอบคุณครับ
 สะตอม ทำได้ครับ มันทำมาให้แล้ว หลักการ failsafe คือ ใช้สัญญาณรีซีปช่อง thrปกติถ้ารีโมทปกติค่าสติกต่ำสุดจะมีค่า 1000 แต่พอรีโมทดับหรือขาดการเชื่อมต่อ ค่ารีซีปจะตกลงมาประมาณ 960 โดยอัตโนมัติ แล้วเราก็เขียนเงื่อนไขดักจับค่าตรงนี้เพื่อเข้า failsafeหรือจะใช้หลักการของ dji จะไม่ใช้ช่อง thr จะทำโหมดนี้หากปิดรีโมทค่า thr ต้องกลับมาอยู่ค่ากลาง แต่จะใช้สัญญานช่อง แทนเพื่อเข้าโหมดfailsafe ถ้าวีธีนี้รีโมทสะตอมจะไม่ได้

อยากทราบว่ามีเทคนิคการจูนค่าPID มั่ยครับวิธีสังเกตพฤติกรรมเครื่องบินแล้วปรับจูนครับ ขอบคุณครับ
เทคนิคการจูนบอกอยากครับ ต้องใช้ประสบการณ์และการมั่วลองผิดจูนค่าแล้วสังเกต ว่าใส่ 1.2 เกิดอะไร 1.4 ,1.56.1.654.1.89 เกิดอะไรขึ้นแล้วเพิ่มหรือลด แล้วลองบิน แนะนำอ่านหนังสือวิศวกรรมการควบคุมอัตโนมัติ รศ.ดร. สุวัฒน์ กุลธนปรีดาชื่อสำนักพิมพ์:  สำนักพิมพ์ ส.ส.ท. (สมาคมส่งเสริมเทคโนโลยี (ไทย-ญี่ปุ่น))
กับ kp คือถ้าเกนมากไปจะเร็วและสั่นถ้าน้อยไปช้า ,ส่วน kd คือตัวหน่วงการสั่นแต่ถ้ามากไปก็สั่นมากจนบินไม่ได้, ki คือ ทำให้ error เป็น ถ้ามากไปจะทำให้เกิดโอเวอชู๊ตได้(การพุ่งเกินไป) สามารถเพิ่มค่า constrain ตอนอินทิเกรตได้
บอร์ด Arduino Due 32bitสามารถบินด้วยโน็ตบุ๊ค แบบในคลิปได้ใหมครับ
 ทำได้ครับ ถ้าอยากทำ กับต้องเขียนโปรแกรม GUI บนคอมเป็น ถ้าง่ายอีกแบบก็ใช้ Mission Planner ของ apm แล้วมาศึกษาโปรโตรคอลรับส่งข้อมูล (protocol)เอาครับ มันเป็นการบินใน mode guide โดยสั่งผ่าน tetemetry radioในโปรแกรมmission planner ใช่ใหมครับอาจารย์
APM 2.0 Commands
APM 2.0 has adopted a subset of the MAVLink protocol command set. A “Dummy’s Guide” to working with MAVLink is here.
APM’s commands are stored in 14 bytes, arranged as follows:
BYTE #
ADDRESS
DATA TYPE
FUNCTION
0
0x00
byte
Command ID
1
0x01
byte
Options
2
0x02
byte
Parameter 1
3
0x03
long
Parameter 2
4
0x04
..
5
0x05
..
6
0x06
..
7
0x07
long
Parameter 3
8
0x08
..
9
0x09
..
10
0x0A
..
11
0x0B
long
Parameter 4
12
0x0C
..
13
0x0D
..
14
0x0E
..


Packet Anatomy

This is the anatomy of one packet. It is inspired by the CAN and SAE AS-4 standards.
MAVLink packet
Byte Index
Content
Value
Explanation
0
Packet start sign
v1.0: 0xFE (v0.9: 0x55)
Indicates the start of a new packet.
1
Payload length
0 - 255
Indicates length of the following payload.
2
Packet sequence
0 - 255
Each component counts up his send sequence. Allows to detect packet loss
3
System ID
1 - 255
ID of the SENDING system. Allows to differentiate different MAVs on the same network.
4
Component ID
0 - 255
ID of the SENDING component. Allows to differentiate different components of the same system, e.g. the IMU and the autopilot.
5
Message ID
0 - 255
ID of the message - the id defines what the payload “means” and how it should be correctly decoded.
6 to (n+6)
Data
(0 - 255) bytes
Data of the message, depends on the message id.
(n+7) to (n+8)
Checksum (low byte, high byte)
ITU X.25/SAE AS-4 hash, excluding packet start sign, so bytes 1..(n+6) Note: The checksum also includes MAVLINK_CRC_EXTRA (Number computed from message fields. Protects the packet from decoding a different version of the same packet but with different variables).
§  The checksum is the same as used in ITU X.25 and SAE AS-4 standards (CRC-16-CCITT), documented inSAE AS5669A. Please see the MAVLink source code for a documented C-implementation of it. LINK TO CHECKSUM
§  The minimum packet length is 8 bytes for acknowledgement packets without payload
§  The maximum packet length is 263 bytes for full payload

Supported data types

MAVLink supports fixed-size integer data types, IEEE 754 single precision floating point numbers, arrays of these data types (e.g. char[10]) and the special mavlink_version field, which is added automatically by the protocol. These types are available:
§  char - Characters / strings
§  uint8_t - Unsigned 8 bit
§  int8_t - Signed 8 bit
§  uint16_t - Unsigned 16 bit
§  int16_t - Signed 16 bit
§  uint32_t - Unsigned 32 bit
§  int32_t - Signed 32 bit
§  uint64_t - Unsigned 64 bit
§  int64_t - Signed 64 bit
§  float - IEEE 754 single precision floating point number
§  double - IEEE 754 double precision floating point number
§  uint8_t_mavlink_version - Unsigned 8 bit field automatically filled on sending with the current MAVLink version - it cannot be written, just read from the packet like a normal uint8_t field

Performance

This protocol was totally geared towards two properties: Transmission speed and safety. It allows to check the message content, it also allows to detect lost messages but still only needs six bytes overhead for each packet.

Transmission examples

Link speed
Hardware
Update rate
Payload
Float values
115200 baud
XBee Pro 2.4 GHz
50 Hz
224 bytes
56
115200 baud
XBee Pro 2.4 GHz
100 Hz
109 bytes
27
57600 baud
XBee Pro 2.4 GHz
100 Hz
51 bytes
12
9600 baud
XBee Pro XSC 900
50 Hz
13 bytes
3
9600 baud
XBee Pro XSC 900
20 Hz
42 bytes
10

พี่ครับ ค่าเอาพุตที่ออกจากเซนเซอร์ gy 86 แต่ละตัวมีค่าอยู่ในช่วงไหนครับ
แล้วเขียนโค้ดปรับให้อยู่ในช่วงไหนครับ
อ่านแมนนอล http://www.invensense.com/mems/gyro/mpu6050.html
MEMS Gyroscope with 16-bit ADCs and Signal Conditioning 
มี Analog-to-digital converter 16-bit = 2^16 = +-32768 ค่า
สามารถตั้งโปรแกรมให้เลือกค่าออกได้คือ
±250, ±500, ±1000, or ±2000 degrees per second (dps)

MEMS Accelerometer with 16-bit ADCs and Signal Conditioning
มี Analog-to-digital converter 16-bit = 2^16 = +-32768 ค่า
สามารถตั้งโปรแกรมให้เลือกค่าออกได้คือ
the digital output can be adjusted to ±2g, ±4g, ±8g, or ±16g.

โดยทินกร  เขียวรี
Share on Google Plus
    Blogger Comment
    Facebook Comment

0 ความคิดเห็น:

แสดงความคิดเห็น