Выход линейного потенциометра микроконтроллера - PullRequest
0 голосов
/ 13 апреля 2011

ОК, следующий вопрос: если я добавил кнопку к цифровому входу, могу ли я затем использовать ее для калибровки потенциометров до нуля?

При чем, когда я нажимаю кнопку, все значения начинаются с нуля, независимо от того, в каком положении находятся поты? Я собирался сделать это в Excel после, однако представляется возможным попробовать это сегодня днем. Вы бы использовали оператор switch или какой-то оператор if?

float ZPot = 0;
float YPot = 1;
float XPot = 2;
byte Reset = 10;

void setup()
{
    pinMode(XPot, INPUT);
    pinMode(YPot, INPUT);
    pinMode(ZPot, INPUT);
    pinMode(Reset, INPUT);

    Serial.begin(9600);
}

void loop()
{
    ZPot = analogRead(0)/ 1023.0 * 105.0;
    YPot = analogRead(1)/ 1023.0 * 105.0;
    XPot = analogRead(2)/ 1023.0 * 105.0;
    Reset = digitalRead(10);

    Serial.print("X Pot [mm] = ");
    Serial.print(XPot    );
    delay(500);

    Serial.print("   Y Pot [mm] = ");
    Serial.print(YPot    );
    delay(500);

    Serial.print("   Z Pot [mm] = ");
    Serial.println (ZPot  );
    delay(500);
}

Ответы [ 3 ]

0 голосов
/ 13 апреля 2011

Вы уже почти там.Вам нужно изменить только две вещи:

float ZPot = 0;           
float YPot = 1;          
float XPot = 2;
int Reset = 10;
float ZCalibration = 0;
float YCalibration = 0;
float XCalibration = 0;

и

Reset = digitalRead(10);
ZPot = (analogRead(0) / 1023.0 * 105.0) - ZCalibration;
YPot = (analogRead(1) / 1023.0 * 105.0) - YCalibration;
XPot = (analogRead(2) / 1023.0 * 105.0) - XCalibration;

if (Reset == HIGH) {
    ZCalibration = ZPot;
    YCalibration = YPot;
    XCalibration = XPot;
}
0 голосов
/ 13 апреля 2011

Просто, чтобы добавить к ответам, вы также можете использовать функцию map () :

ZPot = map(analogRead(0),0,1023.0,0,105);
YPot = map(analogRead(1),0,1023.0,0,105);
XPot = map(analogRead(2),0,1023.0,0,105);

Возможно, быстрее выполнить ручную операцию, чем вызывать карту), но если ваша программа не очень сложна, это должно быть хорошо.В противном случае вы можете написать выражение (analogRead(0) / 1023.0f * 105.0f), используя только умножения: (analogRead(0) * 0.000977517107f * 105.0f)

HTH

0 голосов
/ 13 апреля 2011

Попробуйте добавить функцию

float convertToMM(float reading)
{
  return reading/1023.0*105.0;
}

А потом, когда вы делаете чтение, вместо этого

ZPot = convertToMM(analogRead(0));
...