受け取りです.質問・アドバイスがあればどうぞ.

Dependencies:   MultiSerial mbed

Committer:
lilac0112_1
Date:
Tue Sep 23 10:05:10 2014 +0000
Revision:
4:541fdc451ab3
Parent:
3:d4eff9dace7d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lilac0112_1 0:f38700ce12ea 1 #include "mbed.h"
lilac0112_1 4:541fdc451ab3 2 #include "MultiSerial.h"
lilac0112_1 3:d4eff9dace7d 3
lilac0112_1 4:541fdc451ab3 4 #define KEYCODE 0xAA
lilac0112_1 4:541fdc451ab3 5 #define DATA_NUM 1 //DATA_NUM[byte]通信
lilac0112_1 4:541fdc451ab3 6 #define TIME_LIMIT 1.0//腕が閉まっても動けるのはTIME_LIMIT[s]まで
lilac0112_1 4:541fdc451ab3 7 #define ARM_REV 1.0
lilac0112_1 4:541fdc451ab3 8 #define TURN_REV 0.25
lilac0112_1 4:541fdc451ab3 9
lilac0112_1 4:541fdc451ab3 10 uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0};
lilac0112_1 4:541fdc451ab3 11 volatile uint8_t count=0;
lilac0112_1 4:541fdc451ab3 12
lilac0112_1 4:541fdc451ab3 13 enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う
lilac0112_1 4:541fdc451ab3 14 enum Arm{R=0, L, C};//右腕と左腕
lilac0112_1 4:541fdc451ab3 15 enum Clip{Open=0, Close};//開ける動作と閉める動作
lilac0112_1 4:541fdc451ab3 16 enum Revolution{CW=0, CCW};//正回転,逆回転(上体回転)
lilac0112_1 4:541fdc451ab3 17 enum Compass{N=0, E, W, S};//マシンの回転
lilac0112_1 4:541fdc451ab3 18
lilac0112_1 4:541fdc451ab3 19 BusOut LED(LED1, LED2, LED3, LED4);//確認用
lilac0112_1 4:541fdc451ab3 20 BusIn mt(p19, p20, p17, p18);
lilac0112_1 4:541fdc451ab3 21 //DigitalIn Ninety[2]={p5, p6};//R, L
lilac0112_1 4:541fdc451ab3 22 DigitalIn OneEighty[2]={p5, p6};//R, L
lilac0112_1 4:541fdc451ab3 23 InterruptIn HandSW[3]={p7, p8, p9};//p14, p15, p16//R, L, C
lilac0112_1 4:541fdc451ab3 24 DigitalIn TurnSW[2]={p11, p12};//
lilac0112_1 4:541fdc451ab3 25 PwmOut HandSpeed[2]={p23, p24};
lilac0112_1 4:541fdc451ab3 26 PwmOut TurnSpeed(p22);//p22
lilac0112_1 4:541fdc451ab3 27 DigitalOut Hand[2][2]={{p28, p27}, {p26, p25}};//{p17, p18}, {p19, p20}
lilac0112_1 4:541fdc451ab3 28 //ex)Hand[R][Close]=ON;
lilac0112_1 4:541fdc451ab3 29 DigitalOut Turn[2]={p29, p30};//p29, p30
lilac0112_1 4:541fdc451ab3 30 //ex)Turn[CW]=ON;
lilac0112_1 4:541fdc451ab3 31 Serial pc(USBTX, USBRX);
lilac0112_1 4:541fdc451ab3 32 MultiSerial Xbee(p13, p14, read);
lilac0112_1 4:541fdc451ab3 33 Ticker flick;
lilac0112_1 4:541fdc451ab3 34 Timeout Touch;//腕で掴むときの安全対策
lilac0112_1 4:541fdc451ab3 35
lilac0112_1 4:541fdc451ab3 36 void StopCatching(void);//literally
lilac0112_1 4:541fdc451ab3 37 void StopLeaving(void);//literally
lilac0112_1 4:541fdc451ab3 38 void StartCatching(void);//literally
lilac0112_1 4:541fdc451ab3 39 void StartLeaving(void);//literally
lilac0112_1 4:541fdc451ab3 40 void RightCatch(void);//右腕のリミットスイッチ
lilac0112_1 4:541fdc451ab3 41 void LeftCatch(void);//左腕のリミットスイッチ
lilac0112_1 4:541fdc451ab3 42 void CenterCatch(void);//中央のリミットスイッチ
lilac0112_1 4:541fdc451ab3 43 void illumination(void);//literally
lilac0112_1 4:541fdc451ab3 44 void SetUp(void);//literally
lilac0112_1 4:541fdc451ab3 45 bool GetBit(uint8_t n, uint8_t bit);//literally
lilac0112_1 3:d4eff9dace7d 46
lilac0112_1 0:f38700ce12ea 47 int main(void) {
lilac0112_1 3:d4eff9dace7d 48
lilac0112_1 3:d4eff9dace7d 49 SetUp();
lilac0112_1 3:d4eff9dace7d 50
lilac0112_1 0:f38700ce12ea 51 while(1) {
lilac0112_1 3:d4eff9dace7d 52
lilac0112_1 4:541fdc451ab3 53 //INdata[0] = ~mt;
lilac0112_1 3:d4eff9dace7d 54
lilac0112_1 4:541fdc451ab3 55 if(GetBit(INdata[0], 2)==OFF) StopLeaving();//停止
lilac0112_1 3:d4eff9dace7d 56
lilac0112_1 4:541fdc451ab3 57 if((GetBit(INdata[0], 1)+GetBit(INdata[0], 2))==1){//同時押し防止
lilac0112_1 4:541fdc451ab3 58 if(GetBit(INdata[0], 1)==true) CenterCatch();//中央のリミットスイッチがうまく動作しなかった場合の保険
lilac0112_1 4:541fdc451ab3 59 if(GetBit(INdata[0], 2)==true){//腕を広げる動作はマニュアル操作
lilac0112_1 0:f38700ce12ea 60 StopCatching();//停止
lilac0112_1 0:f38700ce12ea 61 Touch.detach();//ワンショットタイマー停止
lilac0112_1 4:541fdc451ab3 62 Hand[R][Open] = GetBit(INdata[0], 2)&&OneEighty[R];
lilac0112_1 4:541fdc451ab3 63 Hand[L][Open] = GetBit(INdata[0], 2)&&OneEighty[L];
lilac0112_1 0:f38700ce12ea 64 }
lilac0112_1 0:f38700ce12ea 65 }
lilac0112_1 3:d4eff9dace7d 66
lilac0112_1 3:d4eff9dace7d 67 if(((!HandSW[R])&&(!HandSW[L]))&&((Hand[R][Close]&&Hand[L][Close])==ON)){//どちらも押されたら停止
lilac0112_1 3:d4eff9dace7d 68 StopCatching();//停止
lilac0112_1 3:d4eff9dace7d 69 Touch.detach();//ワンショットタイマー停止
lilac0112_1 3:d4eff9dace7d 70 }
lilac0112_1 4:541fdc451ab3 71
lilac0112_1 4:541fdc451ab3 72 if(!OneEighty[R]) Hand[R][Open]=OFF;
lilac0112_1 4:541fdc451ab3 73 if(!OneEighty[L]) Hand[L][Open]=OFF;
lilac0112_1 4:541fdc451ab3 74 //if(!Ninety[R]) Hand[R][Close]=OFF;
lilac0112_1 4:541fdc451ab3 75 //if(!Ninety[L]) Hand[L][Close]=OFF;
lilac0112_1 4:541fdc451ab3 76
lilac0112_1 4:541fdc451ab3 77 //if((!Ninety[R])&&(!Ninety[L])){//どちらも押されたら停止
lilac0112_1 4:541fdc451ab3 78 // StopCatching();//停止
lilac0112_1 4:541fdc451ab3 79 // Touch.detach();//ワンショットタイマー停止
lilac0112_1 4:541fdc451ab3 80 //}
lilac0112_1 4:541fdc451ab3 81
lilac0112_1 4:541fdc451ab3 82 LED = ((0x01 * !HandSW[R]) | (0x02 * !HandSW[L]) | (0x04 * !HandSW[C]) | (0x08 * ((!OneEighty[R])&&(!OneEighty[L])) ));
lilac0112_1 4:541fdc451ab3 83
lilac0112_1 0:f38700ce12ea 84 //上体回転
lilac0112_1 3:d4eff9dace7d 85
lilac0112_1 4:541fdc451ab3 86 if(GetBit(INdata[0], 3)==OFF) Turn[CW] = OFF;//停止
lilac0112_1 4:541fdc451ab3 87 if(GetBit(INdata[0], 4)==OFF) Turn[CCW] = OFF;//停止
lilac0112_1 3:d4eff9dace7d 88
lilac0112_1 4:541fdc451ab3 89 if((GetBit(INdata[0], 3)+GetBit(INdata[0], 4))==1){//同時押し防止
lilac0112_1 3:d4eff9dace7d 90
lilac0112_1 4:541fdc451ab3 91 Turn[CW] = GetBit(INdata[0], 3)&&TurnSW[N];//押されていて,かつリミットスイッチが押されていなかったら右回転
lilac0112_1 4:541fdc451ab3 92 Turn[CCW] = GetBit(INdata[0], 4)&&TurnSW[E];//押されていて,かつリミットスイッチが押されていなかったら左回転
lilac0112_1 4:541fdc451ab3 93
lilac0112_1 0:f38700ce12ea 94 }
lilac0112_1 0:f38700ce12ea 95 }
lilac0112_1 0:f38700ce12ea 96 }
lilac0112_1 4:541fdc451ab3 97
lilac0112_1 4:541fdc451ab3 98 void StopCatching(void){//停止
lilac0112_1 4:541fdc451ab3 99 Hand[R][Close]=Hand[L][Close]=OFF;
lilac0112_1 4:541fdc451ab3 100 }
lilac0112_1 4:541fdc451ab3 101 void StopLeaving(void){//停止
lilac0112_1 4:541fdc451ab3 102 Hand[R][Open]=Hand[L][Open]=OFF;
lilac0112_1 4:541fdc451ab3 103 }
lilac0112_1 4:541fdc451ab3 104 void StartCatching(void){//掴む(リミットスイッチが押されてなければ)
lilac0112_1 4:541fdc451ab3 105
lilac0112_1 4:541fdc451ab3 106 if((!HandSW[R])&&(!HandSW[L])){
lilac0112_1 4:541fdc451ab3 107 Hand[R][Close] = Hand[L][Close] = OFF;
lilac0112_1 4:541fdc451ab3 108 }
lilac0112_1 4:541fdc451ab3 109 else{
lilac0112_1 4:541fdc451ab3 110
lilac0112_1 4:541fdc451ab3 111 //Hand[R][Close]=Ninety[R];
lilac0112_1 4:541fdc451ab3 112 //Hand[L][Close]=Ninety[L];
lilac0112_1 4:541fdc451ab3 113
lilac0112_1 4:541fdc451ab3 114 Hand[R][Close]=ON;
lilac0112_1 4:541fdc451ab3 115 Hand[L][Close]=ON;
lilac0112_1 4:541fdc451ab3 116
lilac0112_1 4:541fdc451ab3 117 }
lilac0112_1 3:d4eff9dace7d 118
lilac0112_1 4:541fdc451ab3 119 }
lilac0112_1 4:541fdc451ab3 120 void StartLeaving(void){//離す(リミットスイッチが押されてなければ)
lilac0112_1 4:541fdc451ab3 121 Hand[R][Open]=OneEighty[R];
lilac0112_1 4:541fdc451ab3 122 Hand[L][Open]=OneEighty[L];
lilac0112_1 4:541fdc451ab3 123 }
lilac0112_1 4:541fdc451ab3 124 void RightCatch(void){//右腕のリミットスイッチ
lilac0112_1 4:541fdc451ab3 125 if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止
lilac0112_1 4:541fdc451ab3 126 StopCatching();//停止
lilac0112_1 4:541fdc451ab3 127 Touch.detach();//ワンショットタイマー停止
lilac0112_1 4:541fdc451ab3 128 }
lilac0112_1 4:541fdc451ab3 129 }
lilac0112_1 4:541fdc451ab3 130 void LeftCatch(void){//左腕のリミットスイッチ
lilac0112_1 4:541fdc451ab3 131 if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止
lilac0112_1 4:541fdc451ab3 132 StopCatching();//停止
lilac0112_1 4:541fdc451ab3 133 Touch.detach();//ワンショットタイマー停止
lilac0112_1 4:541fdc451ab3 134 }
lilac0112_1 4:541fdc451ab3 135 }
lilac0112_1 4:541fdc451ab3 136 void CenterCatch(void){//中央のリミットスイッチ
lilac0112_1 4:541fdc451ab3 137
lilac0112_1 4:541fdc451ab3 138 if((!OneEighty[R])&&(!OneEighty[L])){
lilac0112_1 4:541fdc451ab3 139 Touch.attach(StopCatching, TIME_LIMIT);//TIME_LIMIT[s]で停止
lilac0112_1 4:541fdc451ab3 140 StartCatching();
lilac0112_1 4:541fdc451ab3 141 }
lilac0112_1 4:541fdc451ab3 142
lilac0112_1 4:541fdc451ab3 143 }
lilac0112_1 4:541fdc451ab3 144 void illumination(void){//literally
lilac0112_1 4:541fdc451ab3 145 count++;
lilac0112_1 4:541fdc451ab3 146 LED = count;
lilac0112_1 4:541fdc451ab3 147 }
lilac0112_1 4:541fdc451ab3 148 void SetUp(void){//literally
lilac0112_1 3:d4eff9dace7d 149
lilac0112_1 3:d4eff9dace7d 150 mt.mode(PullUp);
lilac0112_1 3:d4eff9dace7d 151
lilac0112_1 4:541fdc451ab3 152 HandSpeed[R] = HandSpeed[L] = ARM_REV;
lilac0112_1 4:541fdc451ab3 153 TurnSpeed = TURN_REV;
lilac0112_1 4:541fdc451ab3 154
lilac0112_1 4:541fdc451ab3 155 //flick.attach(illumination, .5);
lilac0112_1 3:d4eff9dace7d 156
lilac0112_1 3:d4eff9dace7d 157 HandSW[R].mode(PullUp);
lilac0112_1 3:d4eff9dace7d 158 HandSW[L].mode(PullUp);
lilac0112_1 3:d4eff9dace7d 159 HandSW[C].mode(PullUp);
lilac0112_1 4:541fdc451ab3 160 HandSW[R].fall(RightCatch);
lilac0112_1 4:541fdc451ab3 161 HandSW[L].fall(LeftCatch);
lilac0112_1 4:541fdc451ab3 162 HandSW[C].fall(CenterCatch);
lilac0112_1 4:541fdc451ab3 163
lilac0112_1 4:541fdc451ab3 164 OneEighty[R].mode(PullUp);
lilac0112_1 4:541fdc451ab3 165 OneEighty[L].mode(PullUp);
lilac0112_1 4:541fdc451ab3 166 //Ninety[R].mode(PullUp);
lilac0112_1 4:541fdc451ab3 167 //Ninety[L].mode(PullUp);
lilac0112_1 3:d4eff9dace7d 168
lilac0112_1 4:541fdc451ab3 169 TurnSW[N].mode(PullUp);
lilac0112_1 4:541fdc451ab3 170 TurnSW[E].mode(PullUp);
lilac0112_1 3:d4eff9dace7d 171
lilac0112_1 4:541fdc451ab3 172 Xbee.read_data(INdata, KEYCODE);
lilac0112_1 4:541fdc451ab3 173 }
lilac0112_1 4:541fdc451ab3 174 bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る)
lilac0112_1 4:541fdc451ab3 175 return (n>>(bit-1))%2;
lilac0112_1 4:541fdc451ab3 176 }