Interface for DX6i RC Quadcopter controller

Committer:
randrews33
Date:
Mon Mar 30 19:26:24 2015 +0000
Revision:
0:6374902c761b
Initial commit - basic, but untested functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
randrews33 0:6374902c761b 1 /**
randrews33 0:6374902c761b 2 * Institution: Georgia Institute of Technology - ECE Department - Senior Design II
randrews33 0:6374902c761b 3 * Team: AH3
randrews33 0:6374902c761b 4 * Created: 3/24/2015
randrews33 0:6374902c761b 5 * Last Edit: 3/26/2015
randrews33 0:6374902c761b 6 * By: Taylor Andrews, Luke Panayioto
randrews33 0:6374902c761b 7 **/
randrews33 0:6374902c761b 8
randrews33 0:6374902c761b 9 #include "DX6iController.h"
randrews33 0:6374902c761b 10
randrews33 0:6374902c761b 11 DX6iController::DX6iController(pwmPin) : _pwmPin(pwmPin) {
randrews33 0:6374902c761b 12 pulseInterval = 0;
randrews33 0:6374902c761b 13 nChannels = 9;
randrews33 0:6374902c761b 14
randrews33 0:6374902c761b 15 Throttle_Uptime = 700; //1 700 / 1100 / 1500 // Throttle
randrews33 0:6374902c761b 16 Roll_Uptime = 1100; //2 700 / 1100 / 1500 (R/L) // Roll
randrews33 0:6374902c761b 17 Pitch_Uptime = 1100; //3 770 / 1170 / 1550 (B/F) // Pitch
randrews33 0:6374902c761b 18 Yaw_Uptime = 1100; //4 700 / 1090 / 1500 (R/L) // Yaw
randrews33 0:6374902c761b 19 Stabilize_Uptime = 1100; //5 LLLL / MMMM / 1500 (3,2,1)
randrews33 0:6374902c761b 20 Enable_Uptime = 1500; //6 700 / ---- / 1500 (Off/On) Note: Bind I Button
randrews33 0:6374902c761b 21 Extra_Uptime = 1100; //7 LLLL / 1100 / HHHH // IDK
randrews33 0:6374902c761b 22 Extra2_Uptime = 1100; //8 LLLL / 1100 / HHHH // IDK
randrews33 0:6374902c761b 23 Remainder_Uptime = 22000 - ((pulseInterval * nChannels) + Throttle_Uptime + Roll_Uptime + Pitch_Uptime + Yaw_Uptime + Enable_Uptime + Stabilize_Uptime + Extra_Uptime + Extra2_Uptime);
randrews33 0:6374902c761b 24
randrews33 0:6374902c761b 25 mThrottleTrim = 0;
randrews33 0:6374902c761b 26 mRollTrim = 0;
randrews33 0:6374902c761b 27 mPitchTrim = 0;
randrews33 0:6374902c761b 28 mYawTrim = 0;
randrews33 0:6374902c761b 29 }
randrews33 0:6374902c761b 30
randrews33 0:6374902c761b 31 void DX6iController::generateSignal(int externalDelay) {
randrews33 0:6374902c761b 32 //Big pulse
randrews33 0:6374902c761b 33 // long remainder uptime (0)
randrews33 0:6374902c761b 34 _pwmPin = 1; //Soft pwm
randrews33 0:6374902c761b 35 wait_us(Remainder_Uptime - externalDelay);
randrews33 0:6374902c761b 36 _pwmPin = 0;
randrews33 0:6374902c761b 37 wait_us(pulseInterval);
randrews33 0:6374902c761b 38
randrews33 0:6374902c761b 39 // Throttle pulse (1)
randrews33 0:6374902c761b 40 _pwmPin = 1;
randrews33 0:6374902c761b 41 wait_us(Throttle_Uptime + mThrottleTrim);
randrews33 0:6374902c761b 42 _pwmPin = 0;
randrews33 0:6374902c761b 43 wait_us(pulseInterval);
randrews33 0:6374902c761b 44
randrews33 0:6374902c761b 45 // Roll pulse (2)
randrews33 0:6374902c761b 46 _pwmPin = 1;
randrews33 0:6374902c761b 47 wait_us(Roll_Uptime + mRollTrim);
randrews33 0:6374902c761b 48 _pwmPin = 0;
randrews33 0:6374902c761b 49 wait_us(pulseIntervalDelay);
randrews33 0:6374902c761b 50
randrews33 0:6374902c761b 51 // Pitch pulse (3)
randrews33 0:6374902c761b 52 _pwmPin = 1;
randrews33 0:6374902c761b 53 wait_us(Pitch_Uptime + mPitchTrim);
randrews33 0:6374902c761b 54 _pwmPin = 0;
randrews33 0:6374902c761b 55 wait_us(pulseIntervalDelay);
randrews33 0:6374902c761b 56
randrews33 0:6374902c761b 57 // Yaw pulse (4)
randrews33 0:6374902c761b 58 _pwmPin = 1;
randrews33 0:6374902c761b 59 wait_us(Yaw_Uptime + mYawTrim);
randrews33 0:6374902c761b 60 _pwmPin = 0;
randrews33 0:6374902c761b 61 wait_us(pulseInterval);
randrews33 0:6374902c761b 62
randrews33 0:6374902c761b 63 // Stability pulse (5)
randrews33 0:6374902c761b 64 _pwmPin = 1;
randrews33 0:6374902c761b 65 wait_us(Stabilize_Uptime);
randrews33 0:6374902c761b 66 _pwmPin = 0;
randrews33 0:6374902c761b 67 wait_us(pulseInterval);
randrews33 0:6374902c761b 68
randrews33 0:6374902c761b 69 // Enable pulse (6)
randrews33 0:6374902c761b 70 _pwmPin = 1;
randrews33 0:6374902c761b 71 wait_us(Enable_Uptime);
randrews33 0:6374902c761b 72 _pwmPin = 0;
randrews33 0:6374902c761b 73 wait_us(pulseInterval);
randrews33 0:6374902c761b 74
randrews33 0:6374902c761b 75 _pwmPin = 1;
randrews33 0:6374902c761b 76 wait_us(Extra_Uptime);
randrews33 0:6374902c761b 77 _pwmPin = 0;
randrews33 0:6374902c761b 78 wait_us(pulseInterval);
randrews33 0:6374902c761b 79
randrews33 0:6374902c761b 80 _pwmPin = 1;
randrews33 0:6374902c761b 81 wait_us(Extra2_Uptime);
randrews33 0:6374902c761b 82 _pwmPin = 0;
randrews33 0:6374902c761b 83 wait_us(pulseInterval);
randrews33 0:6374902c761b 84 }
randrews33 0:6374902c761b 85
randrews33 0:6374902c761b 86 // TODO: ensure that new values are in an acceptable range
randrews33 0:6374902c761b 87 void DX6iController::updateThrottle(int newThrottle) {
randrews33 0:6374902c761b 88 Throttle_Uptime = newThrottle;
randrews33 0:6374902c761b 89 updateRemainder();
randrews33 0:6374902c761b 90 }
randrews33 0:6374902c761b 91
randrews33 0:6374902c761b 92 void DX6iController::updateRoll(int newRoll) {
randrews33 0:6374902c761b 93 Roll_Uptime = newRoll;
randrews33 0:6374902c761b 94 updateRemainder();
randrews33 0:6374902c761b 95 }
randrews33 0:6374902c761b 96
randrews33 0:6374902c761b 97 void DX6iController::updatePitch(int newPitch) {
randrews33 0:6374902c761b 98 Pitch_Uptime = newPitch;
randrews33 0:6374902c761b 99 updateRemainder();
randrews33 0:6374902c761b 100 }
randrews33 0:6374902c761b 101
randrews33 0:6374902c761b 102 void DX6iController::updateYaw(int newYaw) {
randrews33 0:6374902c761b 103 Yaw_Uptime = newYaw;
randrews33 0:6374902c761b 104 updateRemainder();
randrews33 0:6374902c761b 105 }
randrews33 0:6374902c761b 106
randrews33 0:6374902c761b 107 void DX6iController::updateRemainder() {
randrews33 0:6374902c761b 108 Remainder_Uptime = 22000 - (pulseInterval*nChannels + Throttle_Uptime + Roll_Uptime + Pitch_Uptime + Yaw_Uptime
randrews33 0:6374902c761b 109 + Enable_Uptime + Stabilize_Uptime + Extra_Uptime + Extra2_Uptime
randrews33 0:6374902c761b 110 + mThrottleTrim + mRollTrim + mPitchTrim + mYawTrim);
randrews33 0:6374902c761b 111 }
randrews33 0:6374902c761b 112
randrews33 0:6374902c761b 113 void DX6iController::updateThrottleTrim(int newThrottleTrim) {
randrews33 0:6374902c761b 114 mThrottleTrim = newThrottleTrim;
randrews33 0:6374902c761b 115 }
randrews33 0:6374902c761b 116
randrews33 0:6374902c761b 117 void DX6iController::updateRollTrim(int newRollTrim) {
randrews33 0:6374902c761b 118 mRollTrim = newRollTrim;
randrews33 0:6374902c761b 119 }
randrews33 0:6374902c761b 120
randrews33 0:6374902c761b 121 void DX6iController::updatePitchTrim(int newPitchTrim) {
randrews33 0:6374902c761b 122 mPitchTrim = newPitchTrim;
randrews33 0:6374902c761b 123 }
randrews33 0:6374902c761b 124
randrews33 0:6374902c761b 125 void DX6iController::updateYawTrim(int newYawTrim) {
randrews33 0:6374902c761b 126 mYawTrim = newYawTrim;
randrews33 0:6374902c761b 127 }