受け取りです.質問・アドバイスがあればどうぞ.
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; } }