受け取りです.質問・アドバイスがあればどうぞ.
Dependencies: MultiSerial mbed
Revision 3:d4eff9dace7d, committed 2014-07-14
- Comitter:
- lilac0112_1
- Date:
- Mon Jul 14 10:03:17 2014 +0000
- Parent:
- 1:b43b0cbff722
- Child:
- 4:541fdc451ab3
- Commit message:
- hokida????????????????????; ????????????
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Sat Jun 28 09:57:50 2014 +0000 +++ b/main.cpp Mon Jul 14 10:03:17 2014 +0000 @@ -1,6 +1,8 @@ #include "mbed.h" #include "main.h"//ピン位置,main関数までの初期動作の詳細,変数,関数等 +BusIn mt(p6, p7, p8, p9, p10, p11); + extern bool GetBit(void); extern DigitalOut LED[4]; //上体回転関連 @@ -8,7 +10,6 @@ extern DigitalIn TurnSW; extern PwmOut TurnSpeed; //パワーウィンドウ(腕)関連 -extern bool Pushed[2]; extern DigitalOut Hand[2][2]; extern InterruptIn HandSW[3]; extern Timeout Touch; @@ -19,29 +20,20 @@ extern volatile uint8_t INdata[DATA_NUM], EXdata[DATA_NUM]; extern void TX(void); extern void RX(void); + +void SetUp(void); + int main(void) { - //簡単そうなコードの説明は省く - BusIn mt(p6, p7, p8, p9, p10, p11);//調整用スイッチ - mt.mode(PullUp); - //上体回転関連 - TurnSpeed = TurnRev;//上体回転のPWM - TurnSW.mode(PullUp); - //パワーウィンドウ(腕)関連 - HandSW[R].mode(PullUp); - HandSW[L].mode(PullUp); - HandSW[C].mode(PullUp); - HandSW[R].rise(RightCatch);//立ち上がり - HandSW[L].rise(LeftCatch);//立ち上がり - HandSW[C].rise(CenterCatch);//立ち上がり - //通信関連 - Xbee.attach(&RX, Serial::RxIrq); - Xbee.attach(&TX, Serial::TxIrq); - Xbee.putc(1);//送信開始 - i = Xbee.getc();//受信開始 + + SetUp(); + while(1) { //腕のプログラム + INdata[1]= ~mt;//調整用スイッチ - StopLeaving();//停止 + + 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){//腕を広げる動作はマニュアル操作 @@ -50,16 +42,48 @@ 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();//ワンショットタイマー停止 + } //上体回転 + INdata[3] = ~mt;//調整用スイッチ + Turn[CW] = Turn[CCW] = OFF;//停止 + if((GetBit(INdata[3], 1)+GetBit(INdata[3], 2))==1){//同時押し防止 if(GetBit(INdata[3], 1)&&(TurnSW)){ Turn[CCW] = ON;//押されていて,かつリミットスイッチが押されていなかったら左回転 } + if(GetBit(INdata[3], 2)){ Turn[CW] = ON;//押されたら右回転 } } } } + +void SetUp(void){ + + uint8_t i=1; + + mt.mode(PullUp); + + TurnSpeed = TURN_REV;//上体回転のPWM + TurnSW.mode(PullUp); + + HandSW[R].mode(PullUp); + HandSW[L].mode(PullUp); + HandSW[C].mode(PullUp); + HandSW[R].rise(RightCatch);//立ち上がり + HandSW[L].rise(LeftCatch);//立ち上がり + HandSW[C].rise(CenterCatch);//立ち上がり + + Xbee.attach(&RX, Serial::RxIrq); + Xbee.attach(&TX, Serial::TxIrq); + + Xbee.putc(i);//送信開始 + i = Xbee.getc();//受信開始 +} \ No newline at end of file
--- a/main.h Sat Jun 28 09:57:50 2014 +0000 +++ b/main.h Mon Jul 14 10:03:17 2014 +0000 @@ -1,26 +1,39 @@ +#ifndef MAIN_H +#define MAIN_H + #include "mbed.h" -//NC = 調整中なので無機能にしておく -bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る) - return (n>>(bit-1))%2; -} -DigitalOut LED[4]={LED1, LED2, LED3, LED4};//確認用 + +#define TURN_REV 0.5//PWM +#define TIME_LIMIT 1.0//腕が閉まっても動けるのはTIME_LIMIT[s]まで +#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 + enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う -//上体回転関連 enum Revolution{CW=0, CCW};//正回転,逆回転(上体回転) -DigitalOut Turn[2]={p20, p19};//p29, p30 -DigitalIn TurnSW(p5);//p26 -PwmOut TurnSpeed(p21);//p25 -#define TurnRev 0.5//PWM -//ex)Turn[CW]=ON; -//パワーウィンドウ(腕)関連 -#define TimeLimit 1.0//腕が閉まっても動けるのはTimeLimit[s]まで enum Scissors{R=0, L, C};//右腕と左腕 enum Clippers{Open=0, Close};//開ける動作と閉める動作 -bool Pushed[2]={false, false}; + +volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0}; + +DigitalOut LED[4]={LED1, LED2, LED3, LED4};//確認用 +DigitalOut Turn[2]={NC, NC};//p29, p30 +DigitalIn TurnSW(NC);//p26 +PwmOut TurnSpeed(NC);//p25 +//ex)Turn[CW]=ON; InterruptIn HandSW[3]={NC, NC, NC};//p14, p15, p16 DigitalOut Hand[2][2]={{NC, NC}, {NC, NC}};//{p17, p18}, {p19, p20} //ex)Hand[R][Close]=ON; Timeout Touch;//腕で掴むときの安全対策 +Serial pc(USBTX, USBRX); +Serial Xbee(NC, NC);//p28, p27 + +bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る) + return (n>>(bit-1))%2; +} + void StopCatching(void){//停止 Hand[R][Close]=Hand[L][Close]=OFF; } @@ -34,40 +47,30 @@ Hand[R][Open]=Hand[L][Open]=ON; } void RightCatch(void){//右腕のリミットスイッチ - Pushed[R] = true;//接触の記録 - if(Pushed[R]&&Pushed[L]){//どちらも接触した時点で停止 - Pushed[R] = Pushed[L] = false; - Touch.detach();//TimeLimit[s]経たなくても停止 - StopCatching(); + if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 } } void LeftCatch(void){//左腕のリミットスイッチ - Pushed[L] = true;//接触の記録 - if(Pushed[R]&&Pushed[L]){//どちらも接触した時点で停止 - Pushed[R] = Pushed[L] = false; - Touch.detach(); - StopCatching(); + if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 } } 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); -Serial Xbee(NC, NC);//p28, p27 -volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0}; void TX(void){//送信バッファ空き割り込み用関数 + static uint8_t TX=DATA_NUM, i; static uint8_t TXdata[DATA_NUM]={MY_KEYCODE}; static uint8_t TX_CHECKCODE=0; + if(TX >= DATA_NUM){ + TXdata[KEY] = MY_KEYCODE; TXdata[1] = EXdata[1]; TXdata[2] = EXdata[2]; @@ -78,30 +81,40 @@ TXdata[7] = EXdata[7]; TXdata[8] = EXdata[8]; //送るデータ = センサ等のデータ + for(i=KEY+1, TX_CHECKCODE=0; i<CHECK; i++){ TX_CHECKCODE ^= TXdata[i]; }//CHECKCODE作成 + TXdata[CHECK] = TX_CHECKCODE; TX=0; } + Xbee.putc(TXdata[TX]); TX++; + }//受信割り込み用関数 void RX(void){ + static uint8_t RX=0, i; static uint8_t RXdata[DATA_NUM]={EN_KEYCODE}; static uint8_t RX_CHECKCODE=0; + RXdata[RX] = Xbee.getc(); + if(RXdata[KEY]==EN_KEYCODE){ RX++; } + if(RX==CHECK){ for(i=KEY+1, RX_CHECKCODE=0; i<CHECK; i++){ RX_CHECKCODE ^= RXdata[i]; }//CHECKCODE作成 } + if(RX >= DATA_NUM){ if(RXdata[CHECK]==RX_CHECKCODE){ + INdata[1] = RXdata[1]; INdata[2] = RXdata[2]; INdata[3] = RXdata[3]; @@ -114,4 +127,7 @@ } RX=0; } -} \ No newline at end of file + +} + +#endif \ No newline at end of file