受け取りです.質問・アドバイスがあればどうぞ.
Dependencies: MultiSerial mbed
Revision 4:541fdc451ab3, committed 2014-09-23
- Comitter:
- lilac0112_1
- Date:
- Tue Sep 23 10:05:10 2014 +0000
- Parent:
- 3:d4eff9dace7d
- Commit message:
Changed in this revision
diff -r d4eff9dace7d -r 541fdc451ab3 MultiSerial.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MultiSerial.lib Tue Sep 23 10:05:10 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/B/code/MultiSerial/#ce09c92e33b4
diff -r d4eff9dace7d -r 541fdc451ab3 main.cpp --- a/main.cpp Mon Jul 14 10:03:17 2014 +0000 +++ b/main.cpp Tue Sep 23 10:05:10 2014 +0000 @@ -1,45 +1,66 @@ #include "mbed.h" -#include "main.h"//ピン位置,main関数までの初期動作の詳細,変数,関数等 - -BusIn mt(p6, p7, p8, p9, p10, p11); +#include "MultiSerial.h" -extern bool GetBit(void); -extern DigitalOut LED[4]; -//上体回転関連 -extern DigitalOut Turn[2]; -extern DigitalIn TurnSW; -extern PwmOut TurnSpeed; -//パワーウィンドウ(腕)関連 -extern DigitalOut Hand[2][2]; -extern InterruptIn HandSW[3]; -extern Timeout Touch; - -//通信関連 -extern Serial pc; -extern Serial Xbee;//p13, p14 -extern volatile uint8_t INdata[DATA_NUM], EXdata[DATA_NUM]; -extern void TX(void); -extern void RX(void); - -void SetUp(void); +#define KEYCODE 0xAA +#define DATA_NUM 1 //DATA_NUM[byte]通信 +#define TIME_LIMIT 1.0//腕が閉まっても動けるのはTIME_LIMIT[s]まで +#define ARM_REV 1.0 +#define TURN_REV 0.25 + +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};//開ける動作と閉める動作 +enum Revolution{CW=0, CCW};//正回転,逆回転(上体回転) +enum Compass{N=0, E, W, S};//マシンの回転 + +BusOut LED(LED1, LED2, LED3, LED4);//確認用 +BusIn mt(p19, p20, p17, p18); +//DigitalIn Ninety[2]={p5, p6};//R, L +DigitalIn OneEighty[2]={p5, p6};//R, L +InterruptIn HandSW[3]={p7, p8, p9};//p14, p15, p16//R, L, C +DigitalIn TurnSW[2]={p11, p12};// +PwmOut HandSpeed[2]={p23, p24}; +PwmOut TurnSpeed(p22);//p22 +DigitalOut Hand[2][2]={{p28, p27}, {p26, p25}};//{p17, p18}, {p19, p20} +//ex)Hand[R][Close]=ON; +DigitalOut Turn[2]={p29, p30};//p29, p30 +//ex)Turn[CW]=ON; +Serial pc(USBTX, USBRX); +MultiSerial Xbee(p13, p14, read); +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 +bool GetBit(uint8_t n, uint8_t bit);//literally int main(void) { SetUp(); while(1) { - //腕のプログラム - INdata[1]= ~mt;//調整用スイッチ + //INdata[0] = ~mt; - if(GetBit(INdata[1], 2)==OFF) StopLeaving();//停止 + if(GetBit(INdata[0], 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){//腕を広げる動作はマニュアル操作 + if((GetBit(INdata[0], 1)+GetBit(INdata[0], 2))==1){//同時押し防止 + if(GetBit(INdata[0], 1)==true) CenterCatch();//中央のリミットスイッチがうまく動作しなかった場合の保険 + if(GetBit(INdata[0], 2)==true){//腕を広げる動作はマニュアル操作 StopCatching();//停止 Touch.detach();//ワンショットタイマー停止 - Hand[R][Open] = Hand[L][Open] = GetBit(INdata[1], 2); + Hand[R][Open] = GetBit(INdata[0], 2)&&OneEighty[R]; + Hand[L][Open] = GetBit(INdata[0], 2)&&OneEighty[L]; } } @@ -47,43 +68,109 @@ StopCatching();//停止 Touch.detach();//ワンショットタイマー停止 } + + if(!OneEighty[R]) Hand[R][Open]=OFF; + if(!OneEighty[L]) Hand[L][Open]=OFF; + //if(!Ninety[R]) Hand[R][Close]=OFF; + //if(!Ninety[L]) Hand[L][Close]=OFF; + + //if((!Ninety[R])&&(!Ninety[L])){//どちらも押されたら停止 + // StopCatching();//停止 + // Touch.detach();//ワンショットタイマー停止 + //} + + LED = ((0x01 * !HandSW[R]) | (0x02 * !HandSW[L]) | (0x04 * !HandSW[C]) | (0x08 * ((!OneEighty[R])&&(!OneEighty[L])) )); + //上体回転 - INdata[3] = ~mt;//調整用スイッチ - - Turn[CW] = Turn[CCW] = OFF;//停止 + if(GetBit(INdata[0], 3)==OFF) Turn[CW] = OFF;//停止 + if(GetBit(INdata[0], 4)==OFF) 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[0], 3)+GetBit(INdata[0], 4))==1){//同時押し防止 - if(GetBit(INdata[3], 2)){ - Turn[CW] = ON;//押されたら右回転 - } + Turn[CW] = GetBit(INdata[0], 3)&&TurnSW[N];//押されていて,かつリミットスイッチが押されていなかったら右回転 + Turn[CCW] = GetBit(INdata[0], 4)&&TurnSW[E];//押されていて,かつリミットスイッチが押されていなかったら左回転 + } } } - -void SetUp(void){ + +void StopCatching(void){//停止 + Hand[R][Close]=Hand[L][Close]=OFF; +} +void StopLeaving(void){//停止 + Hand[R][Open]=Hand[L][Open]=OFF; +} +void StartCatching(void){//掴む(リミットスイッチが押されてなければ) + + if((!HandSW[R])&&(!HandSW[L])){ + Hand[R][Close] = Hand[L][Close] = OFF; + } + else{ + + //Hand[R][Close]=Ninety[R]; + //Hand[L][Close]=Ninety[L]; + + Hand[R][Close]=ON; + Hand[L][Close]=ON; + + } - uint8_t i=1; +} +void StartLeaving(void){//離す(リミットスイッチが押されてなければ) + Hand[R][Open]=OneEighty[R]; + Hand[L][Open]=OneEighty[L]; +} +void RightCatch(void){//右腕のリミットスイッチ + if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 + } +} +void LeftCatch(void){//左腕のリミットスイッチ + if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 + StopCatching();//停止 + Touch.detach();//ワンショットタイマー停止 + } +} +void CenterCatch(void){//中央のリミットスイッチ + + if((!OneEighty[R])&&(!OneEighty[L])){ + Touch.attach(StopCatching, TIME_LIMIT);//TIME_LIMIT[s]で停止 + StartCatching(); + } + +} +void illumination(void){//literally + count++; + LED = count; +} +void SetUp(void){//literally mt.mode(PullUp); - TurnSpeed = TURN_REV;//上体回転のPWM - TurnSW.mode(PullUp); + HandSpeed[R] = HandSpeed[L] = ARM_REV; + TurnSpeed = TURN_REV; + + //flick.attach(illumination, .5); HandSW[R].mode(PullUp); HandSW[L].mode(PullUp); HandSW[C].mode(PullUp); - HandSW[R].rise(RightCatch);//立ち上がり - HandSW[L].rise(LeftCatch);//立ち上がり - HandSW[C].rise(CenterCatch);//立ち上がり + HandSW[R].fall(RightCatch); + HandSW[L].fall(LeftCatch); + HandSW[C].fall(CenterCatch); + + OneEighty[R].mode(PullUp); + OneEighty[L].mode(PullUp); + //Ninety[R].mode(PullUp); + //Ninety[L].mode(PullUp); - Xbee.attach(&RX, Serial::RxIrq); - Xbee.attach(&TX, Serial::TxIrq); + TurnSW[N].mode(PullUp); + TurnSW[E].mode(PullUp); - Xbee.putc(i);//送信開始 - i = Xbee.getc();//受信開始 -} \ No newline at end of file + Xbee.read_data(INdata, KEYCODE); +} +bool GetBit(uint8_t n, uint8_t bit){//n=8[bit]data, bit = 1-8(8bitのデータから指定bitの数値を読み取る) + return (n>>(bit-1))%2; +} \ No newline at end of file
diff -r d4eff9dace7d -r 541fdc451ab3 main.h --- a/main.h Mon Jul 14 10:03:17 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -#ifndef MAIN_H -#define MAIN_H - -#include "mbed.h" - -#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};//正回転,逆回転(上体回転) -enum Scissors{R=0, L, C};//右腕と左腕 -enum Clippers{Open=0, Close};//開ける動作と閉める動作 - -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; -} -void StopLeaving(void){//停止 - Hand[R][Open]=Hand[L][Open]=OFF; -} -void StartCatching(void){//掴む - Hand[R][Close]=Hand[L][Close]=ON; -} -void StartLeaving(void){//離す - Hand[R][Open]=Hand[L][Open]=ON; -} -void RightCatch(void){//右腕のリミットスイッチ - if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 - StopCatching();//停止 - Touch.detach();//ワンショットタイマー停止 - } -} -void LeftCatch(void){//左腕のリミットスイッチ - if((!HandSW[R])&&(!HandSW[L])){//どちらも押されたら停止 - StopCatching();//停止 - Touch.detach();//ワンショットタイマー停止 - } -} -void CenterCatch(void){//中央のリミットスイッチ - Touch.attach(StopCatching, TIME_LIMIT);//TIME_LIMIT[s]で停止 - StartCatching(); -} - -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]; - TXdata[3] = EXdata[3]; - TXdata[4] = EXdata[4]; - TXdata[5] = EXdata[5]; - TXdata[6] = EXdata[6]; - 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]; - INdata[4] = RXdata[4]; - INdata[5] = RXdata[5]; - INdata[6] = RXdata[6]; - INdata[7] = RXdata[7]; - INdata[8] = RXdata[8]; - //使うデータ = 受け取ったデータ - } - RX=0; - } - -} - -#endif \ No newline at end of file