Yosuke Kirihata / Mbed 2 deprecated Nucleo_extended_servo

Dependencies:   mbed

Committer:
YosukeK
Date:
Wed Sep 17 15:17:24 2014 +0000
Revision:
0:916047fa0d8b
Child:
1:74a29b62a144
First commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YosukeK 0:916047fa0d8b 1 /*
YosukeK 0:916047fa0d8b 2 拡張サーボクラス
YosukeK 0:916047fa0d8b 3 */
YosukeK 0:916047fa0d8b 4
YosukeK 0:916047fa0d8b 5 #include <mbed.h>
YosukeK 0:916047fa0d8b 6 #include <ExtendedServo.h>
YosukeK 0:916047fa0d8b 7
YosukeK 0:916047fa0d8b 8
YosukeK 0:916047fa0d8b 9 ExtendedServo::ExtendedServo(PinName pin)
YosukeK 0:916047fa0d8b 10 {
YosukeK 0:916047fa0d8b 11 mPwmServo = new PwmServo(pin);
YosukeK 0:916047fa0d8b 12 mOffsetAngle = 0;
YosukeK 0:916047fa0d8b 13 mIsReverse = false;
YosukeK 0:916047fa0d8b 14 mUpperLimit = 180;
YosukeK 0:916047fa0d8b 15 mLowerLimit = 0;
YosukeK 0:916047fa0d8b 16 setAngle(mOffsetAngle);
YosukeK 0:916047fa0d8b 17 }
YosukeK 0:916047fa0d8b 18
YosukeK 0:916047fa0d8b 19 /*:mOffsetAngle(0)
YosukeK 0:916047fa0d8b 20 ,mIsReverse(false)
YosukeK 0:916047fa0d8b 21 ,mUpperLimit(180)
YosukeK 0:916047fa0d8b 22 ,mLowerLimit(0)
YosukeK 0:916047fa0d8b 23 {
YosukeK 0:916047fa0d8b 24 setAngle(mOffsetAngle);
YosukeK 0:916047fa0d8b 25 };*/
YosukeK 0:916047fa0d8b 26
YosukeK 0:916047fa0d8b 27
YosukeK 0:916047fa0d8b 28 ExtendedServo::ExtendedServo(PinName pin, int upperLimit , int lowerLimit) {
YosukeK 0:916047fa0d8b 29 mPwmServo = new PwmServo(pin);
YosukeK 0:916047fa0d8b 30 mOffsetAngle = 0;
YosukeK 0:916047fa0d8b 31 mIsReverse = false;
YosukeK 0:916047fa0d8b 32 mUpperLimit = upperLimit;
YosukeK 0:916047fa0d8b 33 mLowerLimit = lowerLimit;
YosukeK 0:916047fa0d8b 34 setAngle(mOffsetAngle);
YosukeK 0:916047fa0d8b 35 }
YosukeK 0:916047fa0d8b 36
YosukeK 0:916047fa0d8b 37
YosukeK 0:916047fa0d8b 38 ExtendedServo::ExtendedServo(PinName pin, int upperLimit ,int lowerLimit, int offsetAngle, bool isReverse) {
YosukeK 0:916047fa0d8b 39 mPwmServo = new PwmServo(pin);
YosukeK 0:916047fa0d8b 40 mOffsetAngle = offsetAngle;
YosukeK 0:916047fa0d8b 41 mIsReverse = isReverse;
YosukeK 0:916047fa0d8b 42 mUpperLimit = upperLimit;
YosukeK 0:916047fa0d8b 43 mLowerLimit = lowerLimit;
YosukeK 0:916047fa0d8b 44 setAngle(mOffsetAngle);
YosukeK 0:916047fa0d8b 45 }
YosukeK 0:916047fa0d8b 46
YosukeK 0:916047fa0d8b 47
YosukeK 0:916047fa0d8b 48 //TODO:デストラクタ
YosukeK 0:916047fa0d8b 49 ExtendedServo::~ExtendedServo() {
YosukeK 0:916047fa0d8b 50 //delete hoge;
YosukeK 0:916047fa0d8b 51 }
YosukeK 0:916047fa0d8b 52
YosukeK 0:916047fa0d8b 53 //setter,getter
YosukeK 0:916047fa0d8b 54 void ExtendedServo::setOffsetAngle(int angle)
YosukeK 0:916047fa0d8b 55 {
YosukeK 0:916047fa0d8b 56 mOffsetAngle = angle;
YosukeK 0:916047fa0d8b 57 }
YosukeK 0:916047fa0d8b 58
YosukeK 0:916047fa0d8b 59 int ExtendedServo::getOffsetAngle()
YosukeK 0:916047fa0d8b 60 {
YosukeK 0:916047fa0d8b 61 return mOffsetAngle;
YosukeK 0:916047fa0d8b 62 }
YosukeK 0:916047fa0d8b 63
YosukeK 0:916047fa0d8b 64 void ExtendedServo::setDirection(bool isReverse)
YosukeK 0:916047fa0d8b 65 {
YosukeK 0:916047fa0d8b 66 mIsReverse = isReverse;
YosukeK 0:916047fa0d8b 67 }
YosukeK 0:916047fa0d8b 68
YosukeK 0:916047fa0d8b 69 int ExtendedServo::getDirection()
YosukeK 0:916047fa0d8b 70 {
YosukeK 0:916047fa0d8b 71 return mIsReverse;
YosukeK 0:916047fa0d8b 72 }
YosukeK 0:916047fa0d8b 73
YosukeK 0:916047fa0d8b 74 void ExtendedServo::setUpperLimit(int angle)
YosukeK 0:916047fa0d8b 75 {
YosukeK 0:916047fa0d8b 76 mUpperLimit = angle;
YosukeK 0:916047fa0d8b 77 }
YosukeK 0:916047fa0d8b 78
YosukeK 0:916047fa0d8b 79 int ExtendedServo::getUpperLimit()
YosukeK 0:916047fa0d8b 80 {
YosukeK 0:916047fa0d8b 81 return mUpperLimit;
YosukeK 0:916047fa0d8b 82 }
YosukeK 0:916047fa0d8b 83
YosukeK 0:916047fa0d8b 84 void ExtendedServo::setLowerLimit(int angle)
YosukeK 0:916047fa0d8b 85 {
YosukeK 0:916047fa0d8b 86 mLowerLimit = angle;
YosukeK 0:916047fa0d8b 87 }
YosukeK 0:916047fa0d8b 88
YosukeK 0:916047fa0d8b 89 int ExtendedServo::getLowerLimit()
YosukeK 0:916047fa0d8b 90 {
YosukeK 0:916047fa0d8b 91 return mLowerLimit;
YosukeK 0:916047fa0d8b 92 }
YosukeK 0:916047fa0d8b 93
YosukeK 0:916047fa0d8b 94 //指示角度を変換
YosukeK 0:916047fa0d8b 95 int ExtendedServo::convertAngle(int angle) {
YosukeK 0:916047fa0d8b 96 return 180 - (angle + 90);
YosukeK 0:916047fa0d8b 97 }
YosukeK 0:916047fa0d8b 98
YosukeK 0:916047fa0d8b 99 //方向逆転
YosukeK 0:916047fa0d8b 100 int ExtendedServo::reverseAngle(int angle, bool isReverse) {
YosukeK 0:916047fa0d8b 101
YosukeK 0:916047fa0d8b 102 if (isReverse) {
YosukeK 0:916047fa0d8b 103 angle = angle * -1;
YosukeK 0:916047fa0d8b 104 }
YosukeK 0:916047fa0d8b 105 return angle;
YosukeK 0:916047fa0d8b 106 }
YosukeK 0:916047fa0d8b 107
YosukeK 0:916047fa0d8b 108 //上限下限の丸め込み
YosukeK 0:916047fa0d8b 109 int ExtendedServo::roundAngle(int angle, int upperLimit, int lowerLimit) {
YosukeK 0:916047fa0d8b 110
YosukeK 0:916047fa0d8b 111 if(angle < upperLimit) {
YosukeK 0:916047fa0d8b 112 angle = upperLimit;
YosukeK 0:916047fa0d8b 113 } else if (angle < lowerLimit) {
YosukeK 0:916047fa0d8b 114 angle = lowerLimit;
YosukeK 0:916047fa0d8b 115 } else {
YosukeK 0:916047fa0d8b 116 //Nothing to do.
YosukeK 0:916047fa0d8b 117 }
YosukeK 0:916047fa0d8b 118 return angle;
YosukeK 0:916047fa0d8b 119 }
YosukeK 0:916047fa0d8b 120
YosukeK 0:916047fa0d8b 121
YosukeK 0:916047fa0d8b 122 //サーボ角度設定(-90~+90)
YosukeK 0:916047fa0d8b 123 void ExtendedServo::setAngle(int virtualAngle) {
YosukeK 0:916047fa0d8b 124 int actualAngle = 0;
YosukeK 0:916047fa0d8b 125
YosukeK 0:916047fa0d8b 126 //指示角度を変換
YosukeK 0:916047fa0d8b 127 actualAngle = convertAngle(virtualAngle);
YosukeK 0:916047fa0d8b 128
YosukeK 0:916047fa0d8b 129 //オフセットを加算
YosukeK 0:916047fa0d8b 130 actualAngle = actualAngle + mOffsetAngle;
YosukeK 0:916047fa0d8b 131
YosukeK 0:916047fa0d8b 132 //方向逆転が必要なら逆転
YosukeK 0:916047fa0d8b 133 actualAngle = reverseAngle(actualAngle, mIsReverse);
YosukeK 0:916047fa0d8b 134
YosukeK 0:916047fa0d8b 135 //上限下限の丸め込み
YosukeK 0:916047fa0d8b 136 actualAngle = roundAngle(actualAngle, mUpperLimit, mLowerLimit);
YosukeK 0:916047fa0d8b 137
YosukeK 0:916047fa0d8b 138 //PWMクラスインスタンスに設定
YosukeK 0:916047fa0d8b 139 //if(mServo != NULL) if(mServo.isTrue()) {
YosukeK 0:916047fa0d8b 140 mServo.setAngle(actualAngle);
YosukeK 0:916047fa0d8b 141 //} else {
YosukeK 0:916047fa0d8b 142 //ERROR
YosukeK 0:916047fa0d8b 143 //}
YosukeK 0:916047fa0d8b 144 }
YosukeK 0:916047fa0d8b 145
YosukeK 0:916047fa0d8b 146
YosukeK 0:916047fa0d8b 147 //原点復帰(0度設定時動作と同じ)
YosukeK 0:916047fa0d8b 148 void ExtendedServo::backToStartPoint() {
YosukeK 0:916047fa0d8b 149 setAngle(0);
YosukeK 0:916047fa0d8b 150 }