По-разному срабатывают кнопки, при подключении Arduino Uno к разным компьютерам
- Войдите на сайт для отправки комментариев
Ср, 15/06/2016 - 16:16
Здравствуйте возник такой вопрос. Для начала та часть кода, которая отвечает за кнопки.
void ButtonPress()
{
//513
if ((KeyButton1Value>500) and (KeyButton1Value<520))
{
UpPress();
}
//341
if ((KeyButton1Value>330) and (KeyButton1Value<355))
{
DownPress();
}
//255
if ((KeyButton1Value>240) and (KeyButton1Value<265))
{
LeftPress();
}
//204
if ((KeyButton1Value>190) and (KeyButton1Value<230))
{
RightPress();
}
}
void KeyBoardCalculate()
{
//Часть отработки нажатия клавиши
KeyButton1Value=analogRead(KeyButton1Pin);
//если сигнал с кнопки нулевой то обнуляем метку обработки нажатия
if (KeyButton1Value<190)
{
WasChecked=false;
repet=0;
}
//KeyButton1TimeFromPress=micros()-KeyButton1TimePress;
//исключаем шумы
if ((KeyButton1Value>=190) and (WasChecked==true))
{
repet=repet+1;
}
if ((KeyButton1Value>=190) and (WasChecked==true) and (repet>=3))
{
ButtonPress();
}
if ((KeyButton1Value>=190) and (WasChecked==false))
{
/*delay(100);*/
WasChecked=true;
ButtonPress();
}
}
Кнопки подключены к аналоговому входу А0. При питании Arduino от ноутбука Lenovo, алгоритм срабатывает отлично, кнопки работают безотказно (подключаю к USB2.0). Как только приношу в лабораторию подключаю к стационарному компьютеру или другому(старому) ноутбуку, кнопки начинают плохо срабатывать (подключаю к USB2.0). То дважды сработают, то не сработают при нажатии. Проверяя значения аналогового входа при нажатии кнопок и на ноутбуке и настационарном компьютере серьезных расхождений не получил. Что посоветуете, товарищи. Как решить проблему?
Дело явно в плавающем напряжении разных USB-портов. При считывании аналогового входа достаточно большое расхождение показаний всё таки иногда присуствует, поэтому условия if не всегда срабатывают. Для отладки сделайте вывод значения при нажатии кнопки в serial-монитор.
Спасибо за совет, я делал нечто похожее, но давно. Попробую сделать снова. Но я думаю проблема не совсем в этом, так как, если напряжения расходятся и значение аналогового выхода не попадает ни под какой интервал, указанный в методе button, то кнопка не должна обрабатываться, а у меня бывает, что она обрабатывается дважды, а бывает, что и при 3 нажатиях не обрабатывается на стационарном компьютере.
Я сначала не заметил, а что это у вас за "and" в условиях if ? В языке Си логическое И (AND) записывается как &&
http://arduino.ru/Reference/Boolean
Пардон, оказывается в стандарте С++ определены диграфы для некоторых операторов. И действительно можно использовать "and" вместо "&&", препроцессор сам правильно подставит. Для меня это открытие, если честно... 0_о
P.S. Если кто в теме, ответьте пожалуйста - применяются ли в практике диграфы и как часто? Любопытство одолевает.
Мой косяк. По привычке пишу, компиллятор не ругается на использование "and", поэтому ошибки здесь быть не может, плюс я проверял работоспособность этого алгоритма, вставляя в тело if serial.println('x'), соответственно, если программа заходила в тело этого условного оператора, то последовательный порт выдавал соответствующую запись.