Выход линейного потенциометра микроконтроллера

#arduino #zero #calibration

#arduino #ноль #калибровка

Вопрос:

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

При этом, когда я нажимаю кнопку, все значения начинаются с нуля, независимо от того, в каком положении находятся банки? Я собирался сделать это в 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);
}
  

Комментарии:

1. Пожалуйста, создайте еще один вопрос, не редактируйте старые, в итоге большинство комментариев не будут иметь смысла…

2. Алекс, я обновил свое решение, включив в него калибровку. Пожалуйста, обратите внимание, что я изменил Reset на int, а не на byte.

Ответ №1:

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

 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;
}
  

Комментарии:

1. При этом первое изменение не будет иметь никакого значения при нормальной работе, но рекомендуется инициализировать 0 или -1, чтобы вы знали, когда что-то пошло не так с analogRead. Если от этой программы зависит чья-то жизнь, пожалуйста, доверьте ее профессионалу, поскольку необходимо выполнить множество проверок.

2. Спасибо, сначала я попробовал второй, так как он был самым быстрым в использовании. Добавление / 1023.0 * 105.0; к концу аналогового считывания работает. Однако изменение значений с плавающей точкой не работает. Поплавки должны быть установлены на аналоговые входы 1,2 и 3. Я попробую первое решение позже этим вечером.

3. Я имею в виду назначения в самом начале опубликованного вами кода — там вы просто устанавливаете переменным их начальные значения (перед первым чтением). Это не должно иметь никакого значения для analogRead, поскольку оно в любом случае заменит эти значения. Спасибо, что приняли ответ 🙂

4. Спасибо за вашу помощь, и не волнуйтесь, из-за этого кода ничьей жизни не угрожает опасность, я буду использовать потенциометры на гоночном автомобиле низкого уровня, чтобы попытаться записать, движется ли передняя подвеска по сравнению с рулевым колесом, затем я использовал Iphone с 2 приложениями для регистрации данных для записи ускорения по трем осям, а также: скорость, пройденное расстояние и возможности, чтобы попытаться лучше понять, как автомобиль ведет себя во время поворота.

5. Вау, это звучит потрясающе! Получайте удовольствие 🙂

Ответ №2:

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

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

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

 ZPot = convertToMM(analogRead(0));
  

Ответ №3:

Просто чтобы добавить ответы, вы также могли бы использовать функцию 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);
  

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

HTH

Комментарии:

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

2. @Alex Я немного сбит с толку, потому что вы постоянно присваиваете значения XPot, Ypot, Zpot через analogRead (). Если у вас есть кнопка, вы могли бы сбросить значения на 0, но на следующем цикле значения будут обновлены. Вы хотите установить пользовательские значения XPot, YPot, ZPot при нажатии кнопки и значения analogRead при отпускании кнопки? или использовать кнопку для переключения между предустановленными значениями и значениями аналогового чтения? Боюсь, я не совсем понимаю, чего вы пытаетесь достичь.