腕のプログラムです.
Dependencies: mbed TextLCD MultiSerial Pswitch
Diff: main.cpp
- Revision:
- 1:006debaed874
- Parent:
- 0:4baeb4381394
- Child:
- 2:eb1c123c9140
--- a/main.cpp Sat Jul 12 03:43:45 2014 +0000 +++ b/main.cpp Mon Jul 14 09:18:29 2014 +0000 @@ -1,21 +1,71 @@ #include "mbed.h" -//NC = 調整中なので無機能にしておく + +#define DATA_NUM 10 //DATA_NUM[byte]通信 +#define MY_KEYCODE 0xAA//keycode +#define EN_KEYCODE 0xAA//keycode +#define KEY 0//number of first data +#define CHECK DATA_NUM-1//number of last data +#define TIME_LIMIT 1.0//腕が閉まっても動けるのはTIME_LIMIT[s]まで +#define ARM_REV .25 + +volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0}; +volatile uint8_t count=0; + +enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う +enum Arm{R=0, L, C};//右腕と左腕 +enum Clip{Open=0, Close};//開ける動作と閉める動作 + bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る) return (n>>(bit-1))%2; } + BusOut LED(LED1, LED2, LED3, LED4);//確認用 -Ticker flick; -enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う -//パワーウィンドウ(腕)関連 -#define TimeLimit 1.0//腕が閉まっても動けるのはTimeLimit[s]まで -#define ArmRev .25 -enum Arm{R=0, L, C};//右腕と左腕 -enum Clip{Open=0, Close};//開ける動作と閉める動作3 +BusIn mt(p5, p6, p7, p8, p9, p10);//Switch InterruptIn HandSW[3]={p15, p16, p17};//p14, p15, p16//R, L, C PwmOut HandSpeed[2]={p25, p26}; DigitalOut Hand[2][2]={{p30, p29}, {p28, p27}};//{p17, p18}, {p19, p20} //ex)Hand[R][Close]=ON; +Serial pc(USBTX, USBRX); +Ticker flick; Timeout Touch;//腕で掴むときの安全対策 + +void StopCatching(void);//literally +void StopLeaving(void);//literally +void StartCatching(void);//literally +void StartLeaving(void);//literally +void RightCatch(void);//右腕のリミットスイッチ +void LeftCatch(void);//左腕のリミットスイッチ +void CenterCatch(void);//中央のリミットスイッチ +void illumination(void);//literally +void SetUp(void);//literally + +int main(void) { + + SetUp(); + + while(1) { + + INdata[1]= ~mt; + + if(GetBit(INdata[1], 2)==OFF) StopLeaving();//停止 + + if((GetBit(INdata[1], 1)+GetBit(INdata[1], 2))==1){//同時押し防止 + if(GetBit(INdata[1], 1)==true) CenterCatch();//中央のリミットスイッチがうまく動作しなかった場合の保険 + if(GetBit(INdata[1], 2)==true){//腕を広げる動作はマニュアル操作 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 + Hand[R][Open] = Hand[L][Open] = GetBit(INdata[1], 2); + } + } + + if(((!HandSW[R])&&(!HandSW[L]))&&((Hand[R][Close]&&Hand[L][Close])==ON)){//どちらも押されたら停止 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 + } + + } +} + void StopCatching(void){//停止 Hand[R][Close]=Hand[L][Close]=OFF; } @@ -41,52 +91,25 @@ } } void CenterCatch(void){//中央のリミットスイッチ - Touch.attach(StopCatching, TimeLimit);//TimeLimit[s]で停止 + Touch.attach(StopCatching, TIME_LIMIT);//TIME_LIMIT[s]で停止 StartCatching(); } -//通信関連 -#define DATA_NUM 10 //DATA_NUM[byte]通信 -#define MY_KEYCODE 0xAA//keycode -#define EN_KEYCODE 0xAA//keycode -#define KEY 0//number of first data -#define CHECK DATA_NUM-1//number of last data - -Serial pc(USBTX, USBRX); -volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0}; -volatile uint8_t count=0; -void illumination(){ +void illumination(void){//literally count++; LED = count; } - -int main(void) { - //簡単そうなコードの説明は省く - BusIn mt(p5, p6, p7, p8, p9, p10);//調整用スイッチ +void SetUp(void){//literally + mt.mode(PullUp); - HandSpeed[R] = HandSpeed[L] = ArmRev; + + HandSpeed[R] = HandSpeed[L] = ARM_REV; + flick.attach(illumination, .5); - //パワーウィンドウ(腕)関連 + HandSW[R].mode(PullUp); HandSW[L].mode(PullUp); HandSW[C].mode(PullUp); - HandSW[R].fall(RightCatch);//立ち上がり - HandSW[L].fall(LeftCatch);//立ち上がり - HandSW[C].fall(CenterCatch);//立ち上がり - while(1) { - //腕のプログラム - INdata[1]= ~mt;//調整用スイッチ - if(GetBit(INdata[1], 2)==OFF) StopLeaving();//停止 - if((GetBit(INdata[1], 1)+GetBit(INdata[1], 2))==1){//同時押し防止 - if(GetBit(INdata[1], 1)==true) CenterCatch();//中央のリミットスイッチがうまく動作しなかった場合の保険 - if(GetBit(INdata[1], 2)==true){//腕を広げる動作はマニュアル操作 - StopCatching();//停止 - Touch.detach();//ワンショットタイマー停止 - Hand[R][Open] = Hand[L][Open] = GetBit(INdata[1], 2); - } - } - if(((!HandSW[R])&&(!HandSW[L]))&&((Hand[R][Close]&&Hand[L][Close])==ON)){//どちらも押されたら停止 - StopCatching();//停止 - Touch.detach();//ワンショットタイマー停止 - } - } + HandSW[R].fall(RightCatch); + HandSW[L].fall(LeftCatch); + HandSW[C].fall(CenterCatch); } \ No newline at end of file