2015-05-27 110 views
0

嗨我正在使用Arduino Flex传感器来控制视频游戏角色。 传感器数据被平均并重新映射到0-6之间的值。 当玩家弯曲他们的二头肌时,它读取最大值(这是完美的),但是如果玩家弯曲他们的手臂并且由于某种原因,传感器读取的最大值为6,因为玩家放松他们的手臂,进入游戏引擎(而不是从6到零,从6到5下降到4到3到2到1,然后达到零)。有人可以请告诉我应该如何改变我的代码,使传感器读数回到0而不是逐渐下降?Arduino传感器数据

#define NUM_LED 6 //sets the maximum numbers of LEDs 
#define MAX_Low 75 //for people with low EMG activity 
#define MAX_High 150//for people with high EMG activity 
#define Threshold 3 // this sets the light to activate TENS 
int reading[10]; 
int finalReading; 
int MAX = 0; 
int TENS =3; 
int ledState = LOW; 
byte litLeds = 0; 
byte multiplier = 1; 
byte leds[] = {8, 9, 10, 11, 12, 13}; 
char ch; 
char contact; 

void setup(){ 
    Serial.begin(9600); //begin serial communications 
    digitalWrite(TENS, LOW); 

    for(int i = 0; i < NUM_LED; i++){ //initialize LEDs as outputs 
    pinMode(leds[i], OUTPUT); 
    pinMode(TENS, OUTPUT); // Set TENS output to StimPin 
    } 
    MAX = MAX_High; //This sets the default to people with high EMG activity. 
} 


void loop(){ 

    for(int i = 0; i < 10; i++){ //take ten readings in ~0.02 seconds 
    reading[i] = analogRead(A0) * multiplier; 
    delay(2); 
    } 
    for(int i = 0; i < 10; i++){ //average the ten readings 
    finalReading += reading[i]; 
    } 
    finalReading /= 10; 
    for(int j = 0; j < NUM_LED; j++) 
    { 
    digitalWrite(leds[j], LOW);//write all LEDs low and stim pin low 
    } 

    finalReading = constrain(finalReading, 0, MAX); 
    litLeds = map(finalReading, 0, MAX, 0, NUM_LED); 
    Serial.println(litLeds); 

    for(int k = 0; k < litLeds; k++){ 
    digitalWrite(leds[k], HIGH); // This turns on the LEDS 
          } 
    { 
     // send data only when you receive data: 
     if (Serial.available() > 0) 
     { 
       ch = Serial.read(); 
       contact=digitalRead(TENS); 
       if (ch == 'A' && contact==LOW) 
        { 
         digitalWrite(TENS, HIGH); 
        } 

     else if (ch == 'B' && contact==HIGH) 
       { 
       digitalWrite(TENS, LOW); 
       }  
     } 
} 

    delay(80); 
     } 

回答

0

您的传感器不读取6,并立即0,你正在阅读它太快,你可以读取中间值。例如:如果玩家非常快速地打开手臂(250-300毫秒,速度很快),则可以读取最多3个读数,然后您可以读取3个中间值。 您可以为最后的delay()添加更多时间,或者只使用与最后3次读数相同的值以确保没有快速更改。

+0

如果我使用更长的延迟,它会导致Unity游戏引擎冻结一秒....我不认为这样的延迟是一种选择。你可以给我更详细的建议,因为我不完全了解: “....或者只使用一个与最后3次读数相同的值以确保没有快速变化.... “ – joeyc

+0

如果您阅读”1-2-3-4-5-6-6-6“,在阅读第三个”6“或其他类似内容之前不要发送任何内容。这个想法,存储最后N个读数并进行比较; N等于它们之间或它们之间的最小变化...... – jabujavi

+0

任何人都可以建议我如何编写一段代码,该代码将一旦flex传感器被激活并且当它再次返回到零时选择最高值?即。如果flex的结果是:0-1-2-3-4-5-6-4-2-0'我将如何使用for循环来始终选择最高读数? – joeyc