Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ExtendedServo.cpp@0:916047fa0d8b, 2014-09-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |