腕のプログラムです.

Dependencies:   mbed TextLCD MultiSerial Pswitch

Committer:
lilac0112_1
Date:
Sun Oct 05 06:50:36 2014 +0000
Revision:
7:c418a0d929b1
Parent:
6:606507fc8852
Child:
8:4f9c4b791bfe

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lilac0112_1 0:4baeb4381394 1 #include "mbed.h"
Hatter 3:a1489a94c436 2 #include "MultiSerial.h"
lilac0112_1 7:c418a0d929b1 3 #include "Pswitch.h"
lilac0112_1 7:c418a0d929b1 4
lilac0112_1 4:1102ab499430 5 #define DATA_NUM 1 //DATA_NUM[byte]通信
lilac0112_1 7:c418a0d929b1 6 #define KEYCODE 0xAA
lilac0112_1 7:c418a0d929b1 7
lilac0112_1 7:c418a0d929b1 8 #define TIME_LIMIT 1.25//腕が閉まっても動けるのはTIME_LIMIT[s]まで
lilac0112_1 4:1102ab499430 9 #define ARM_REV 1.0//腕のPWM
lilac0112_1 7:c418a0d929b1 10
lilac0112_1 7:c418a0d929b1 11 #define TURN_REV 0.2//回転の初期PWM
lilac0112_1 4:1102ab499430 12 #define TURN_RATE 1//加速度の変更...1, 2, 4, 8, 16...
lilac0112_1 4:1102ab499430 13 #define TURN_REV_LIMIT 0.5//PWMの最大数値
lilac0112_1 7:c418a0d929b1 14 #define TURN_ACCELERATION (1e-4)/1.5//[s]
lilac0112_1 7:c418a0d929b1 15 #define TURN_RATIO 1e4//Holder/TURN_RATIO
lilac0112_1 1:006debaed874 16
lilac0112_1 7:c418a0d929b1 17
lilac0112_1 4:1102ab499430 18 uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0};
lilac0112_1 7:c418a0d929b1 19 uint8_t Interrupt=0;
lilac0112_1 5:c2a278842131 20 uint8_t TURN=0, IO=0,SIG=0;
lilac0112_1 4:1102ab499430 21 uint8_t data[DATA_NUM];
lilac0112_1 7:c418a0d929b1 22 uint16_t Holder=0;
lilac0112_1 7:c418a0d929b1 23 #define COUNT_LIMIT 10e3
lilac0112_1 1:006debaed874 24
lilac0112_1 1:006debaed874 25 enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う
lilac0112_1 1:006debaed874 26 enum Arm{R=0, L, C};//右腕と左腕
lilac0112_1 1:006debaed874 27 enum Clip{Open=0, Close};//開ける動作と閉める動作
lilac0112_1 2:eb1c123c9140 28 enum Revolution{CW=0, CCW};//正回転,逆回転(上体回転)
lilac0112_1 2:eb1c123c9140 29 enum Compass{N=0, E, W, S};//マシンの回転
lilac0112_1 7:c418a0d929b1 30
lilac0112_1 0:4baeb4381394 31 BusOut LED(LED1, LED2, LED3, LED4);//確認用
lilac0112_1 7:c418a0d929b1 32
Hatter 3:a1489a94c436 33 /*
Hatter 3:a1489a94c436 34 BusIn mt(p19, p20, p17, p18);//Switch
Hatter 3:a1489a94c436 35 */
lilac0112_1 7:c418a0d929b1 36
lilac0112_1 7:c418a0d929b1 37
lilac0112_1 7:c418a0d929b1 38 BusIn mt(p5, p6, p7, p8);//mt(p7, p8);
lilac0112_1 5:c2a278842131 39 DigitalIn OneEighty[2]={p18, p19};//R, L
lilac0112_1 7:c418a0d929b1 40 Pswitch HandSW[3]={p15, p16, p17};//p14, p15, p16//R, L, C
lilac0112_1 2:eb1c123c9140 41 DigitalIn TurnSW[2]={p11, p12};//
lilac0112_1 2:eb1c123c9140 42 PwmOut HandSpeed[2]={p23, p24};
lilac0112_1 2:eb1c123c9140 43 PwmOut TurnSpeed(p22);//p22
lilac0112_1 2:eb1c123c9140 44 DigitalOut Hand[2][2]={{p28, p27}, {p26, p25}};//{p17, p18}, {p19, p20}
lilac0112_1 0:4baeb4381394 45 //ex)Hand[R][Close]=ON;
lilac0112_1 2:eb1c123c9140 46 DigitalOut Turn[2]={p29, p30};//p29, p30
lilac0112_1 2:eb1c123c9140 47 //ex)Turn[CW]=ON;
lilac0112_1 1:006debaed874 48 Serial pc(USBTX, USBRX);
lilac0112_1 4:1102ab499430 49 Ticker Accelerator;
lilac0112_1 0:4baeb4381394 50 Timeout Touch;//腕で掴むときの安全対策
lilac0112_1 1:006debaed874 51
lilac0112_1 4:1102ab499430 52 void Acceleration(void);
lilac0112_1 1:006debaed874 53 void StopCatching(void);//literally
lilac0112_1 1:006debaed874 54 void StopLeaving(void);//literally
lilac0112_1 1:006debaed874 55 void StartCatching(void);//literally
lilac0112_1 1:006debaed874 56 void StartLeaving(void);//literally
lilac0112_1 1:006debaed874 57 void RightCatch(void);//右腕のリミットスイッチ
lilac0112_1 1:006debaed874 58 void LeftCatch(void);//左腕のリミットスイッチ
lilac0112_1 1:006debaed874 59 void CenterCatch(void);//中央のリミットスイッチ
lilac0112_1 4:1102ab499430 60 uint8_t LinkBit(bool eight, bool seven, bool six, bool five, bool fore, bool three, bool two, bool one);
lilac0112_1 4:1102ab499430 61 bool GetBit(uint8_t n, uint8_t bit);
lilac0112_1 1:006debaed874 62 void SetUp(void);//literally
lilac0112_1 7:c418a0d929b1 63
lilac0112_1 7:c418a0d929b1 64
lilac0112_1 1:006debaed874 65 int main(void) {
lilac0112_1 1:006debaed874 66
lilac0112_1 5:c2a278842131 67 wait(0.5);
lilac0112_1 5:c2a278842131 68
lilac0112_1 5:c2a278842131 69 MultiSerial leg_mbed(p13,p14,read);
lilac0112_1 7:c418a0d929b1 70 //Serial servo_mbed(p9, p10);
lilac0112_1 4:1102ab499430 71
lilac0112_1 1:006debaed874 72 SetUp();
lilac0112_1 1:006debaed874 73
lilac0112_1 1:006debaed874 74 while(1) {
lilac0112_1 1:006debaed874 75
Hatter 3:a1489a94c436 76 leg_mbed.read_data(data,KEYCODE);
Hatter 3:a1489a94c436 77
lilac0112_1 7:c418a0d929b1 78 INdata[0] = data[0];// | ~mt;
lilac0112_1 7:c418a0d929b1 79
lilac0112_1 7:c418a0d929b1 80 //INdata[0] = ~mt;
lilac0112_1 7:c418a0d929b1 81
lilac0112_1 7:c418a0d929b1 82 //EXdata[0] = LinkBit(0, 0, 0, 0, 0, 0, !OneEighty[R], !OneEighty[L]);
lilac0112_1 7:c418a0d929b1 83 //EXdata[0] = 3;//~mt;
lilac0112_1 7:c418a0d929b1 84 LED = INdata[0];//~mt;//~mt;//EXdata[0]| servo_mbed.getc()*4;
lilac0112_1 7:c418a0d929b1 85
lilac0112_1 7:c418a0d929b1 86 //servo_mbed.putc(~mt);
lilac0112_1 7:c418a0d929b1 87 //pc.printf("%5d, %f\n", Holder, TurnSpeed.read());
lilac0112_1 7:c418a0d929b1 88
lilac0112_1 7:c418a0d929b1 89 if((GetBit(INdata[0], 1)==OFF)&&(Interrupt==OFF)) StopCatching();
lilac0112_1 1:006debaed874 90
lilac0112_1 4:1102ab499430 91 if(GetBit(INdata[0], 2)==OFF) StopLeaving();//停止
lilac0112_1 1:006debaed874 92
lilac0112_1 4:1102ab499430 93 if((GetBit(INdata[0], 1)+GetBit(INdata[0], 2))==1){//同時押し防止
lilac0112_1 7:c418a0d929b1 94 if(GetBit(INdata[0], 1)==true) CenterCatch();//中央のリミットスイッチがうまく動作しなかった場合の保険
lilac0112_1 4:1102ab499430 95 if(GetBit(INdata[0], 2)==true){//腕を広げる動作はマニュアル操作
lilac0112_1 1:006debaed874 96 StopCatching();//停止
lilac0112_1 1:006debaed874 97 Touch.detach();//ワンショットタイマー停止
lilac0112_1 7:c418a0d929b1 98 Interrupt=OFF;
lilac0112_1 4:1102ab499430 99 Hand[R][Open] = GetBit(INdata[0], 2)&&OneEighty[R];
lilac0112_1 4:1102ab499430 100 Hand[L][Open] = GetBit(INdata[0], 2)&&OneEighty[L];
lilac0112_1 1:006debaed874 101 }
lilac0112_1 1:006debaed874 102 }
lilac0112_1 1:006debaed874 103
lilac0112_1 1:006debaed874 104 if(((!HandSW[R])&&(!HandSW[L]))&&((Hand[R][Close]&&Hand[L][Close])==ON)){//どちらも押されたら停止
lilac0112_1 1:006debaed874 105 StopCatching();//停止
lilac0112_1 1:006debaed874 106 Touch.detach();//ワンショットタイマー停止
lilac0112_1 7:c418a0d929b1 107 Interrupt=OFF;
lilac0112_1 1:006debaed874 108 }
lilac0112_1 1:006debaed874 109
lilac0112_1 2:eb1c123c9140 110 if(!OneEighty[R]) Hand[R][Open]=OFF;
lilac0112_1 2:eb1c123c9140 111 if(!OneEighty[L]) Hand[L][Open]=OFF;
lilac0112_1 7:c418a0d929b1 112
lilac0112_1 7:c418a0d929b1 113 if(!HandSW[R]) Hand[R][Close]=OFF;
lilac0112_1 7:c418a0d929b1 114 if(!HandSW[L]) Hand[L][Close]=OFF;
lilac0112_1 2:eb1c123c9140 115
lilac0112_1 7:c418a0d929b1 116 if(HandSW[R].count() > 0){
lilac0112_1 7:c418a0d929b1 117 RightCatch();
lilac0112_1 7:c418a0d929b1 118 }
lilac0112_1 7:c418a0d929b1 119 if(HandSW[L].count() > 0){
lilac0112_1 7:c418a0d929b1 120 LeftCatch();
lilac0112_1 7:c418a0d929b1 121 }
lilac0112_1 7:c418a0d929b1 122 if(HandSW[C].count() > 0){
lilac0112_1 7:c418a0d929b1 123 CenterCatch();
lilac0112_1 7:c418a0d929b1 124 }
lilac0112_1 2:eb1c123c9140 125
lilac0112_1 4:1102ab499430 126 //LED = ((0x01 * !HandSW[R]) | (0x02 * !HandSW[L]) | (0x04 * !HandSW[C]) | (0x08 * ((!OneEighty[R])&&(!OneEighty[L])) ));
lilac0112_1 4:1102ab499430 127 LED = INdata[0];
lilac0112_1 2:eb1c123c9140 128
lilac0112_1 2:eb1c123c9140 129 //上体回転
lilac0112_1 2:eb1c123c9140 130
lilac0112_1 7:c418a0d929b1 131 wait(TURN_ACCELERATION);
lilac0112_1 4:1102ab499430 132
lilac0112_1 7:c418a0d929b1 133 Acceleration();
lilac0112_1 7:c418a0d929b1 134
lilac0112_1 7:c418a0d929b1 135 TurnSpeed.write( (float) ( (int)(100 * (TURN_REV_LIMIT*((float)(Holder)/TURN_RATIO)) ) /100.0 ) );
lilac0112_1 2:eb1c123c9140 136
lilac0112_1 4:1102ab499430 137 if((GetBit(INdata[0], 3)+GetBit(INdata[0], 4)==1)&&(TurnSpeed==0)){//同時押し防止
lilac0112_1 4:1102ab499430 138
lilac0112_1 4:1102ab499430 139 Turn[CW] = GetBit(INdata[0], 3)&&TurnSW[N];//押されていて,かつリミットスイッチが押されていなかったら右回転
lilac0112_1 4:1102ab499430 140 Turn[CCW] = GetBit(INdata[0], 4)&&TurnSW[E];//押されていて,かつリミットスイッチが押されていなかったら左回転
lilac0112_1 4:1102ab499430 141 TURN = LinkBit(0, 0, 0, 0, 0, 0, Turn[CW], Turn[CCW]);
lilac0112_1 2:eb1c123c9140 142
lilac0112_1 2:eb1c123c9140 143 }
lilac0112_1 4:1102ab499430 144 if(TurnSpeed!=0){
lilac0112_1 4:1102ab499430 145
lilac0112_1 4:1102ab499430 146 Turn[CW] = GetBit(TURN, 2)&&TurnSW[N];
lilac0112_1 4:1102ab499430 147 Turn[CCW] = GetBit(TURN, 1)&&TurnSW[E];
lilac0112_1 4:1102ab499430 148
lilac0112_1 4:1102ab499430 149 }
lilac0112_1 4:1102ab499430 150 if((GetBit(INdata[0], 3)+GetBit(INdata[0], 4)!=1)&&(TurnSpeed==0)){
lilac0112_1 4:1102ab499430 151 Turn[CW] = OFF;
lilac0112_1 4:1102ab499430 152 Turn[CCW] = OFF;
lilac0112_1 4:1102ab499430 153 }
lilac0112_1 5:c2a278842131 154
lilac0112_1 4:1102ab499430 155 if(!TurnSW[N]) Turn[CW]=OFF;//リミットスイッチによる停止
lilac0112_1 4:1102ab499430 156 if(!TurnSW[E]) Turn[CCW]=OFF;
lilac0112_1 4:1102ab499430 157
lilac0112_1 4:1102ab499430 158
lilac0112_1 1:006debaed874 159 }
lilac0112_1 1:006debaed874 160 }
lilac0112_1 1:006debaed874 161
lilac0112_1 4:1102ab499430 162 void Acceleration(void){
lilac0112_1 4:1102ab499430 163
lilac0112_1 4:1102ab499430 164 SIG = LinkBit(0, 0, 0, 0, 0, 0, GetBit(INdata[0], 3), GetBit(INdata[0], 4));
lilac0112_1 4:1102ab499430 165 IO = GetBit(INdata[0], 3)+GetBit(INdata[0], 4);
lilac0112_1 4:1102ab499430 166
lilac0112_1 7:c418a0d929b1 167 if((IO==1)&&(Holder< 1e4)&&(TURN==SIG)) Holder++;
lilac0112_1 7:c418a0d929b1 168 if(((IO!=1)||(TURN!=SIG))&&(0 <Holder)) Holder--;
lilac0112_1 7:c418a0d929b1 169
lilac0112_1 4:1102ab499430 170 }
lilac0112_1 0:4baeb4381394 171 void StopCatching(void){//停止
lilac0112_1 0:4baeb4381394 172 Hand[R][Close]=Hand[L][Close]=OFF;
lilac0112_1 7:c418a0d929b1 173 if(Interrupt==ON) Interrupt=OFF;
lilac0112_1 0:4baeb4381394 174 }
lilac0112_1 0:4baeb4381394 175 void StopLeaving(void){//停止
lilac0112_1 0:4baeb4381394 176 Hand[R][Open]=Hand[L][Open]=OFF;
lilac0112_1 0:4baeb4381394 177 }
lilac0112_1 2:eb1c123c9140 178 void StartCatching(void){//掴む(リミットスイッチが押されてなければ)
lilac0112_1 7:c418a0d929b1 179
lilac0112_1 7:c418a0d929b1 180 if(GetBit(INdata[0], 1)==true){
lilac0112_1 7:c418a0d929b1 181 Hand[R][Close]=HandSW[R];
lilac0112_1 7:c418a0d929b1 182 Hand[L][Close]=HandSW[L];
lilac0112_1 7:c418a0d929b1 183 }
lilac0112_1 7:c418a0d929b1 184
lilac0112_1 7:c418a0d929b1 185 if((!HandSW[R])&&(!HandSW[L])){
lilac0112_1 2:eb1c123c9140 186 Hand[R][Close] = Hand[L][Close] = OFF;
lilac0112_1 2:eb1c123c9140 187 }
lilac0112_1 2:eb1c123c9140 188 else{
lilac0112_1 2:eb1c123c9140 189
lilac0112_1 2:eb1c123c9140 190 Hand[R][Close]=ON;
lilac0112_1 2:eb1c123c9140 191 Hand[L][Close]=ON;
lilac0112_1 2:eb1c123c9140 192
lilac0112_1 2:eb1c123c9140 193 }
lilac0112_1 2:eb1c123c9140 194
lilac0112_1 0:4baeb4381394 195 }
lilac0112_1 2:eb1c123c9140 196 void StartLeaving(void){//離す(リミットスイッチが押されてなければ)
lilac0112_1 2:eb1c123c9140 197 Hand[R][Open]=OneEighty[R];
lilac0112_1 2:eb1c123c9140 198 Hand[L][Open]=OneEighty[L];
lilac0112_1 0:4baeb4381394 199 }
lilac0112_1 0:4baeb4381394 200 void RightCatch(void){//右腕のリミットスイッチ
lilac0112_1 7:c418a0d929b1 201
lilac0112_1 7:c418a0d929b1 202 Hand[R][Close] = OFF;
lilac0112_1 7:c418a0d929b1 203
lilac0112_1 0:4baeb4381394 204 if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止
lilac0112_1 0:4baeb4381394 205 StopCatching();//停止
lilac0112_1 0:4baeb4381394 206 Touch.detach();//ワンショットタイマー停止
lilac0112_1 7:c418a0d929b1 207 Interrupt=OFF;
lilac0112_1 0:4baeb4381394 208 }
lilac0112_1 0:4baeb4381394 209 }
lilac0112_1 0:4baeb4381394 210 void LeftCatch(void){//左腕のリミットスイッチ
lilac0112_1 7:c418a0d929b1 211
lilac0112_1 7:c418a0d929b1 212 Hand[L][Close] = OFF;
lilac0112_1 7:c418a0d929b1 213
lilac0112_1 0:4baeb4381394 214 if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止
lilac0112_1 0:4baeb4381394 215 StopCatching();//停止
lilac0112_1 0:4baeb4381394 216 Touch.detach();//ワンショットタイマー停止
lilac0112_1 7:c418a0d929b1 217 Interrupt=OFF;
lilac0112_1 0:4baeb4381394 218 }
lilac0112_1 0:4baeb4381394 219 }
lilac0112_1 0:4baeb4381394 220 void CenterCatch(void){//中央のリミットスイッチ
lilac0112_1 7:c418a0d929b1 221
lilac0112_1 2:eb1c123c9140 222 if((!OneEighty[R])&&(!OneEighty[L])){
lilac0112_1 7:c418a0d929b1 223 Interrupt=ON;
lilac0112_1 2:eb1c123c9140 224 Touch.attach(StopCatching, TIME_LIMIT);//TIME_LIMIT[s]で停止
lilac0112_1 2:eb1c123c9140 225 StartCatching();
lilac0112_1 2:eb1c123c9140 226 }
lilac0112_1 7:c418a0d929b1 227 if(GetBit(INdata[0], 1)==true){
lilac0112_1 7:c418a0d929b1 228 StartCatching();
lilac0112_1 7:c418a0d929b1 229 }
lilac0112_1 0:4baeb4381394 230 }
lilac0112_1 4:1102ab499430 231 uint8_t LinkBit(bool eight, bool seven, bool six, bool five, bool fore, bool three, bool two, bool one){
lilac0112_1 4:1102ab499430 232 return 0x80*eight + 0x40*seven + 0x20*six + 0x10*five + 0x08*fore + 0x04*three + 0x02*two + 0x01*one;
lilac0112_1 4:1102ab499430 233 }
lilac0112_1 4:1102ab499430 234 bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る)-
lilac0112_1 4:1102ab499430 235 return (n>>(bit-1))%2;
lilac0112_1 4:1102ab499430 236 }
lilac0112_1 1:006debaed874 237 void SetUp(void){//literally
lilac0112_1 1:006debaed874 238
lilac0112_1 5:c2a278842131 239 mt.mode(PullUp);
lilac0112_1 1:006debaed874 240
lilac0112_1 1:006debaed874 241 HandSpeed[R] = HandSpeed[L] = ARM_REV;
lilac0112_1 7:c418a0d929b1 242 //TurnSpeed = TURN_REV;
lilac0112_1 1:006debaed874 243
lilac0112_1 5:c2a278842131 244 //Accelerator.attach(Acceleration, TURN_ACCELERATION);
lilac0112_1 1:006debaed874 245
lilac0112_1 7:c418a0d929b1 246 //HandSW[R].mode(PullUp);
lilac0112_1 7:c418a0d929b1 247 //HandSW[L].mode(PullUp);
lilac0112_1 7:c418a0d929b1 248 //HandSW[C].mode(PullUp);
lilac0112_1 7:c418a0d929b1 249 //HandSW[R].fall(RightCatch);
lilac0112_1 7:c418a0d929b1 250 //HandSW[L].fall(LeftCatch);
lilac0112_1 7:c418a0d929b1 251 //HandSW[C].fall(CenterCatch);
lilac0112_1 2:eb1c123c9140 252
lilac0112_1 2:eb1c123c9140 253 OneEighty[R].mode(PullUp);
lilac0112_1 2:eb1c123c9140 254 OneEighty[L].mode(PullUp);
lilac0112_1 2:eb1c123c9140 255
lilac0112_1 2:eb1c123c9140 256 TurnSW[N].mode(PullUp);
lilac0112_1 2:eb1c123c9140 257 TurnSW[E].mode(PullUp);
lilac0112_1 2:eb1c123c9140 258
lilac0112_1 7:c418a0d929b1 259 }
lilac0112_1 7:c418a0d929b1 260