1

次のコードを使用して、サム ジョイスティックの位置を特定しています。

const int Left = 1;
const int Right = 2;
const int Up = 3;
const int Down = 4;
const int Center = 0;
int lastButton = -1;

int xpin = 4;
int ypin = 5;

int xAxis;
int yAxis;
char* myStrings[]={"Left","Right","Up","Down"};
int button;

void setup() {
    Serial.begin(9600);
}

void loop() {
    xAxis=map(analogRead(xpin), 0, 1023, 0, 10);
    yAxis=map(analogRead(ypin), 0, 1023, 0, 10);

    if (button == lastButton) {
        //Serial.println(0);
        //button = 0;
        delay(50);
    } else {
        if (xAxis < 4 ) {
            button = Left;
        }
        else if (xAxis > 6 ) {
            button = Right;
        }

        if (yAxis < 4 ) {
            button = Down;
        }
        else if (yAxis > 6 ) {
            button = Up;
        }

        Serial.println(myStrings[button-1]);
        button = 0;
        delay(50);
    }

    lastButton = button;
}

上記のコードは、私の arduino で問題なく動作しますが、位置が保持されている間は毎秒ではなく、1 回だけ位置を取得しようとしています。

再び中央 (0) になるまで値を 1 つだけ取るようにコードを変更するにはどうすればよいですか?

例:

ジョイスティックを左に動かすと、次のように表示されます。

Left
Left
Left
Left
etc etc until i release it.

私がやろうとしていることはこれです:

Left
then it stops until i release it.

どんな助けでも素晴らしいでしょう!

アップデート

 if (xAxis ==5 ) { 
   button = Center; 
 }

 if (yAxis ==5 ) { 
   button = Center; 
 }

Up と Down ではうまくいくようですが、Left と Right ではうまくいきません。うまくいくこともありますが、うまくいかないことの方が多いです。

4

3 に答える 3

2

最後の反復での場所を覚えて、それと比較して、変更されたかどうかを確認します。

int lastButton = 0;
...
void loop() {
    button = ...// Read button state
    ...
    if (button != lastButton) {
        ... // New keypress
        lastButton = button;
    }
}

完全にクリーンアップされたコード:

enum ButtonState { Neutral=0, Left=1, Right=2, Up=3, Down=4 };

ButtonState lastButton = Neutral;

const int XPin = 4;
const int YPin = 5;

char* myStrings[]={"Neutral", "Left","Right","Up","Down"};

void setup() {
    Serial.begin(9600);
}

ButtonState readButtonState() {
    int xAxis=map(analogRead(XPin), 0, 1023, 0, 10);
    int yAxis=map(analogRead(YPin), 0, 1023, 0, 10);
    if (xAxis < 4 ) return Left;
    if (xAxis > 6 ) return Right;
    if (yAxis < 4 ) return Down;
    if (yAxis > 6 ) return Up;
    return Neutral;
}

void loop() {
    ButtonState button = readButtonState();
    if (button != lastButton) {
        Serial.println(myStrings[button]);
        lastButton = button;
    }
    delay(50);
}
于 2012-07-11T21:23:30.040 に答える
0

次のようになります。

const int Left = 1;
const int Right = 2;
const int Up = 3;
const int Down = 4;

int xpin = 4;
int ypin = 5;

int xAxis;
int yAxis;
char* myStrings[]={"Left","Right","Up","Down"};
int button;


void setup() {
  Serial.begin(9600);
}
int lastButton = -1; // init lastButton to a never occurring value

void loop() {

   xAxis=map(analogRead(xpin), 0, 1023, 0, 10);
   yAxis=map(analogRead(ypin), 0, 1023, 0, 10);

   if (xAxis < 4 ) { 
     button = Left; 
   }
   else if (xAxis > 6 ) { 
     button = Right; 
   }

   if (yAxis < 4 ) { 
     button = Down; 
   }
   else if (yAxis > 6 ) { 
     button = Up;
   }

   if (button == lastButton){
       //Serial.println(0);
       //button = 0;
       delay(50); // wait more
   }else{
       lastButton = button;
       Serial.println(myStrings[button-1]);
       button = 0;
       delay(50);
   }
 }
于 2012-07-11T21:57:17.073 に答える
0

この google code project をチェックしてください。著者はここで素晴らしい仕事をしました。私はこれを私のプロジェクトで使用していますが、カスタマイズはほとんど必要ありません (もしあれば)。

これは、すでに非常に安定しており、簡単にカスタマイズできるジョイスティック ウィジェットです。私はいつも他人のコードを使うのをためらっていますが、これほど素晴らしいものを作るにはかなりの時間がかかりました。

デモ: http://code.google.com/p/mobile-anarchy-widgets/wiki/JoystickView

ソース: http://code.google.com/p/mobile-anarchy-widgets/source/browse/trunk/Widgets/src/com/MobileAnarchy/Android/Widgets/Joystick/JoystickView.java

于 2012-07-13T14:10:01.073 に答える