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

Dependencies:   MultiSerial mbed

Files at this revision

API Documentation at this revision

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