#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 при отпускании кнопки? или использовать кнопку для переключения между предустановленными значениями и значениями аналогового чтения? Боюсь, я не совсем понимаю, чего вы пытаетесь достичь.