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

Dependencies:   MultiSerial mbed

main.h

Committer:
lilac0112_1
Date:
2014-06-28
Revision:
1:b43b0cbff722
Parent:
0:f38700ce12ea
Child:
2:971e190fd0b5
Child:
3:d4eff9dace7d

File content as of revision 1:b43b0cbff722:

#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};//確認用
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};
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;//腕で掴むときの安全対策
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){//右腕のリミットスイッチ
    Pushed[R] = true;//接触の記録
    if(Pushed[R]&&Pushed[L]){//どちらも接触した時点で停止
        Pushed[R] = Pushed[L] = false;
        Touch.detach();//TimeLimit[s]経たなくても停止
        StopCatching();
    }
}
void LeftCatch(void){//左腕のリミットスイッチ
    Pushed[L] = true;//接触の記録
    if(Pushed[R]&&Pushed[L]){//どちらも接触した時点で停止
        Pushed[R] = Pushed[L] = false;
        Touch.detach();
        StopCatching();
    }
}
void CenterCatch(void){//中央のリミットスイッチ
    Touch.attach(StopCatching, TimeLimit);//TimeLimit[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];
        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;
    }
}