腕のプログラムです.
Dependencies: mbed TextLCD MultiSerial Pswitch
main.cpp
- Committer:
- lilac0112_1
- Date:
- 2014-07-14
- Revision:
- 1:006debaed874
- Parent:
- 0:4baeb4381394
- Child:
- 2:eb1c123c9140
File content as of revision 1:006debaed874:
#include "mbed.h" #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 #define TIME_LIMIT 1.0//腕が閉まっても動けるのはTIME_LIMIT[s]まで #define ARM_REV .25 volatile 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};//開ける動作と閉める動作 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);//確認用 BusIn mt(p5, p6, p7, p8, p9, p10);//Switch 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; Serial pc(USBTX, USBRX); 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 int main(void) { SetUp(); 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();//ワンショットタイマー停止 } } } 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 illumination(void){//literally count++; LED = count; } void SetUp(void){//literally mt.mode(PullUp); HandSpeed[R] = HandSpeed[L] = ARM_REV; 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); }