今までのジョイスティックの入力を段階分けしていた方式から、アナログ値をできる限りそのまま使用する方式に変更しました。

Dependencies:   mbed-rtos mbed

Fork of ControlMain2017 by albatross

main.cpp

Committer:
YusukeWakuta
Date:
2017-02-18
Revision:
13:79eb74eb86c4
Parent:
10:b7159feb11fd
Child:
14:ffe9460922cb

File content as of revision 13:79eb74eb86c4:

//中央

#include "mbed.h"
#define WAIT_LOOP_TIME 0.001
#define YOKUTAN_DATAS_NUM 7
#define INPUT_DATAS_NUM 5
#define SEND_DATAS_CAN_ID 100
#define SEND_DATAS_TIME 0.5
#define THRESHOLD_OH_VALUE 0.14

//-----------------------------------(resetInterrupt def)
extern "C" void mbed_reset();
InterruptIn resetPin(p22);
Timer resetTimeCount;
void resetInterrupt(){
    while(resetPin){
        resetTimeCount.start();
        if(resetTimeCount.read()>3) mbed_reset();
    }
    resetTimeCount.reset();
}
//-------------------------------------------------------

CAN can_R(p30,p29);
CAN can_L(p9,p10);
Serial toKeikiSerial(p27,p28);
Serial pc(USBTX,USBRX);
AnalogIn rollPin(p15);
AnalogIn pichPin(p20);
DigitalIn drug_R(p14);
DigitalIn drug_L(p19);
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
//Ticker sendDatasTicker;

char yokutanDatas_R[YOKUTAN_DATAS_NUM];
char yokutanDatas_L[YOKUTAN_DATAS_NUM];
char inputDatas_R[INPUT_DATAS_NUM];
char inputDatas_L[INPUT_DATAS_NUM];
bool stateP = true;
bool stateQ = true;
bool stateP_old = true;
bool stateQ_old = true;

CANMessage recmsg_R;
CANMessage recmsg_L;

float get_analogin_ave(AnalogIn pin, int n){
    float val = 0;
    for(int i = 0; i<n; i++){
        val += pin.read();
    }return val/n;
}

void InputControlValues(){
    *(float *)inputDatas_R = get_analogin_ave(pichPin,8) + get_analogin_ave(rollPin,8);
    *(float *)inputDatas_L = get_analogin_ave(pichPin,8) - get_analogin_ave(rollPin,8);
    pc.printf("input_R:%f   input_L:%f\n\r",*(float *)inputDatas_R,*(float *)inputDatas_L);
    inputDatas_R[4] = (char)drug_R;
    inputDatas_L[4] = (char)drug_L;
}

void toString_R(){
    pc.printf("R:");
    for(int i = 0; i < INPUT_DATAS_NUM; i++){
        pc.printf("%d:%i    ",i,inputDatas_R[i]);
    }
}

void toString_L(){
    pc.printf("L:");
    for(int i = 0; i < INPUT_DATAS_NUM; i++){
        pc.printf("%d:%i    ",i,inputDatas_L[i]);
    }
    pc.printf("\n\r");
}

void SendDatas(){
    can_R.write(CANMessage(SEND_DATAS_CAN_ID, inputDatas_R, INPUT_DATAS_NUM));
    can_L.write(CANMessage(SEND_DATAS_CAN_ID, inputDatas_L, INPUT_DATAS_NUM));
    toKeikiSerial.putc(';');
    for(int i = 0; i < YOKUTAN_DATAS_NUM; i++){
        toKeikiSerial.putc(yokutanDatas_R[i]);
        toKeikiSerial.putc(yokutanDatas_L[i]);
    }
    for(int i = 0; i < INPUT_DATAS_NUM; i++){
        toKeikiSerial.putc(inputDatas_R[i]);
        toKeikiSerial.putc(inputDatas_L[i]);
    }
//    toKeikiSerial.putc(cadence);
    pc.printf("test\n\r");
}

void init(){
//--------------------------------------(resetInterrupt init)
    resetPin.rise(resetInterrupt);
    resetPin.mode(PullDown);
//-----------------------------------------------------------
//    sendDatasTicker.attach(SendDatas,SEND_DATAS_TIME);
    for(int i = 0; i < INPUT_DATAS_NUM; i++){
        inputDatas_R[i] = 0;
        inputDatas_L[i] = 0;
    }
}

void receiveDatas(){
    if(can_R.read(recmsg_R)){
        for(int i = 0; i < recmsg_R.len; i++){
            yokutanDatas_R[i] = recmsg_R.data[i];
        }
        myled1 = !myled1;
    }
     if(can_L.read(recmsg_L)){
        for(int i = 0; i < recmsg_L.len; i++){
            yokutanDatas_L[i] = recmsg_L.data[i];
        }
        myled2 = !myled2;
    }
}

int main(){
    init();
    while(1){
        InputControlValues();
        wait_us(5);
        receiveDatas();
        SendDatas();
//        toString_R();
//        toString_L();
        wait(WAIT_LOOP_TIME);
    }
}