腕のプログラムです.

Dependencies:   mbed TextLCD MultiSerial Pswitch

Revision:
0:4baeb4381394
Child:
1:006debaed874
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jul 12 03:43:45 2014 +0000
@@ -0,0 +1,92 @@
+#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;
+}
+BusOut LED(LED1, LED2, LED3, LED4);//確認用
+Ticker flick;
+enum Logic{OFF=0, ON};//殆どはモーターのON,OFFに使う
+//パワーウィンドウ(腕)関連
+#define TimeLimit 1.0//腕が閉まっても動けるのはTimeLimit[s]まで
+#define ArmRev .25
+enum Arm{R=0, L, C};//右腕と左腕
+enum Clip{Open=0, Close};//開ける動作と閉める動作3
+InterruptIn HandSW[3]={p15, p16, p17};//p14, p15, p16//R, L, C
+PwmOut HandSpeed[2]={p25, p26};
+DigitalOut Hand[2][2]={{p30, p29}, {p28, p27}};//{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){//右腕のリミットスイッチ
+    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, 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);
+volatile uint8_t INdata[DATA_NUM]={0}, EXdata[DATA_NUM]={0};
+volatile uint8_t count=0;
+void illumination(){
+    count++;
+    LED = count;
+}
+
+int main(void) {
+    //簡単そうなコードの説明は省く
+    BusIn mt(p5, p6, p7, p8, p9, p10);//調整用スイッチ
+    mt.mode(PullUp);
+    HandSpeed[R] = HandSpeed[L] = ArmRev;
+    flick.attach(illumination, .5);
+    //パワーウィンドウ(腕)関連
+    HandSW[R].mode(PullUp);
+    HandSW[L].mode(PullUp);
+    HandSW[C].mode(PullUp);
+    HandSW[R].fall(RightCatch);//立ち上がり
+    HandSW[L].fall(LeftCatch);//立ち上がり
+    HandSW[C].fall(CenterCatch);//立ち上がり
+    while(1) {
+        //腕のプログラム
+        INdata[1]= ~mt;//調整用スイッチ
+        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){//腕を広げる動作はマニュアル操作
+                StopCatching();//停止
+                Touch.detach();//ワンショットタイマー停止
+                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();//ワンショットタイマー停止
+        }
+    }
+}
\ No newline at end of file