Кнопки. Внешнее питание.
- Войдите на сайт для отправки комментариев
Всем привет!
Имеется "Arduino nano", 6 тактовых кнопок и еще 5 модулей (они просто припаяны, но в коде они не используются пока что).
Проблемы возникли именно с кнопками. Подключены они так: одна ножка кнопки к пину, другая - к +5v (без резисторов).
Сначала предоставлю код:
/*Все, что относится к кнопкам*/ #define PINBUTTONLEFT A0 //Кнопка влево. #define PINBUTTONUP A1 //Кнопка вверх. #define PINBUTTONRIGHT A2 //Кнопка вправо. #define PINBUTTONDOWN A3 //Кнопка вниз. #define PINBUTTONPRESS A6 //Кнопка нажать. #define PINBUTTONMENU A7 //Кнопка меню. #define BUTTONDELAY 50 //Задержка от дребезжания. //Кнопка влево. boolean buttLeftFlag = 0; //Нажата или нет. unsigned long buttonLeftLastPress = 0; //Время, чтобы избежать дребезжания. //Кнопка вверх. boolean buttUpFlag = 0; //Нажата или нет. unsigned long buttonUpLastPress = 0; //Время, чтобы избежать дребезжания. //Кнопка вправо. boolean buttRightFlag = 0; //Нажата или нет. unsigned long buttonRightLastPress = 0; //Время, чтобы избежать дребезжания. //Кнопка вниз. boolean buttDownFlag = 0; //Нажата или нет. unsigned long buttonDownLastPress = 0; //Время, чтобы избежать дребезжания. //Кнопка нажать. boolean buttPressFlag = 0; //Нажата или нет. unsigned long buttonPressLastPress = 0; //Время, чтобы избежать дребезжания. //Кнопка меню. boolean buttMenuFlag = 0; //Нажата или нет. unsigned long buttonMenuLastPress = 0; //Время, чтобы избежать дребезжания. /*Конец того, что относится к кнопкам*/ /******************************************ФУНКЦИИ КНОПОК*************************************************************/ void BUTTONCHECK() //Проверка нажатия любой кнопки. { boolean buttLeft = !digitalRead(PINBUTTONLEFT); //Кнопка влево. boolean buttUp = !digitalRead(PINBUTTONUP); //Кнопка вверх. boolean buttRight = !digitalRead(PINBUTTONRIGHT); //Кнопка вправо. boolean buttDown = !digitalRead(PINBUTTONDOWN); //Кнопка вниз. boolean buttPress = !digitalRead(PINBUTTONPRESS); //Кнопка нажать. boolean buttMenu = !digitalRead(PINBUTTONMENU); //Кнопка меню. //Кнопка влево. if ((buttLeft == 1) && (buttLeftFlag == 0) && (millis() - buttonLeftLastPress > BUTTONDELAY)) //Нажали. { buttLeftFlag = 1; ButtonLeftFunc(); buttonLeftLastPress = millis(); } if (buttLeft == 0 && buttLeftFlag == 1) //Отпустили. { buttLeftFlag = 0; } //Кнопка вверх. if ((buttUp == 1) && (buttUpFlag == 0) && (millis() - buttonUpLastPress > BUTTONDELAY)) //Нажали. { buttUpFlag = 1; ButtonUpFunc(); buttonUpLastPress = millis(); } if (buttUp == 0 && buttUpFlag == 1) //Отпустили. { buttUpFlag = 0; } //Кнопка вправо. if ((buttRight == 1) && (buttRightFlag == 0) && (millis() - buttonRightLastPress > BUTTONDELAY)) //Нажали. { buttRightFlag = 1; ButtonRightFunc(); buttonRightLastPress = millis(); } if (buttRight == 0 && buttRightFlag == 1) //Отпустили. { buttRightFlag = 0; } //Кнопка вниз. if ((buttDown == 1) && (buttDownFlag == 0) && (millis() - buttonDownLastPress > BUTTONDELAY)) //Нажали. { buttDownFlag = 1; ButtonDownFunc(); buttonDownLastPress = millis(); } if (buttDown == 0 && buttDownFlag == 1) //Отпустили. { buttDownFlag = 0; } //Кнопка нажать. if ((buttPress == 1) && (buttPressFlag == 0) && (millis() - buttonPressLastPress > BUTTONDELAY)) //Нажали. { buttPressFlag = 1; ButtonPressFunc(); buttonPressLastPress = millis(); } if (buttPress == 0 && buttPressFlag == 1) //Отпустили. { buttPressFlag = 0; } //Кнопка меню. if ((buttMenu == 1) && (buttMenuFlag == 0) && (millis() - buttonMenuLastPress > BUTTONDELAY)) //Нажали. { buttMenuFlag = 1; ButtonMenuFunc(); buttonMenuLastPress = millis(); } if (buttMenu == 0 && buttMenuFlag == 1) //Отпустили. { buttMenuFlag = 0; } } void ButtonLeftFunc() //Кнопка влево. { Serial.println("LEFT"); } void ButtonUpFunc() //Кнопка вверх. { Serial.println("UP"); } void ButtonRightFunc() //Кнопка вправо. { Serial.println("RIGHT"); } void ButtonDownFunc() //Кнопка вниз. { Serial.println("DOWN"); } void ButtonPressFunc() //Кнопка нажать. { Serial.println("PRESS"); } void ButtonMenuFunc() //Кнопка меню. { Serial.println("MENU"); } /*********************************************************************************************************************/ /******************************************SETUP***************************************************************/ void setup() { Serial.begin(9600); /*Все, что относится к кнопкам*/ pinMode(PINBUTTONLEFT, OUTPUT); //Кнопка влево. pinMode(PINBUTTONUP, OUTPUT); //Кнопка вверх. pinMode(PINBUTTONRIGHT, OUTPUT); //Кнопка вправо. pinMode(PINBUTTONDOWN, OUTPUT); //Кнопка вниз. pinMode(PINBUTTONPRESS, OUTPUT); //Кнопка нажать. pinMode(PINBUTTONMENU, OUTPUT); //Кнопка меню. /*Конец того, что относится к кнопкам*/ } /**************************************************************************************************************/ /******************************************LOOP*****************************************************************/ void loop() { //ОБРАБОТКА НАЖАТИЯ НА КНОПКИ. BUTTONCHECK(); } /**************************************************************************************************************/
Теперь проблемы, которые возникли и я не смог понять в чем дело:
1) По какой-то причине, как только включается arduino, в Serial выводятся все нажатия кнопок, то есть как бы нажимаются все кнопки. После этого момента такое больше не происходит и кнопки работаю правильно. Почему это может быть происходить?
2) 4 кнопки подключены к пинам A0-A3 и 2 кнопки подключены к пинам A6-A7. Кнопки, подключенные к A0-A3 работают, а две кнопки, подключенные к A6-A7 не работают, то есть при нажатии на них ничего не происходит. Я сначала подумал, что купил сломанную кнопку, но прозвонил ее и оказалсоь все нормально. Что может быть не так с этими пинами?
Теперь вопросы, связанные с тем, что хочу добавить в будущем:
3) Почитал о питание arduino от внешнего источника. Решил питать от 3 батареек. И прочитал, что если подключить бокс из 3 батареек к пину "VIN", то не будет работать 3v3, а он мне нужен, чтобы питать дисплей. Вроде бы нашел информацию о том, что если питать напрямую к +5v, то 3v3 будет работать. Хочу уточнить этот вопрос у знающих людей.
4) Хочу сделать включение и выключение arduino по кнопки. Как это сделать с помощью двухфазовой кнопки кнопки я понимаю; вставить ее между блоком из 3 батареек и пином VIN/+5v. А можно ли сделать то же самое, только используя тактовую кнопку?
Заранее спасибо!
Посмотрите на строки 164-169. Вас там ничего не смущает?
Вы уверены, что Вы собираетесь выводить что-то на эти кнопки, а не, наоборот, читать их состояния?
И, да, OUTPUT завести на питание, да ещё и напрямую - без резистора. Вы экстремал!
Да, кстати, даже если Вы всё напишете правильно, кнопки, подключенные без всяких резисторов, надежно работать не будут никогда - глюки будут валиться постоянно.
Посмотрите на строки 164-169. Вас там ничего не смущает?
Вы уверены, что Вы собираетесь выводить что-то на эти кнопки, а не, наоборот, читать их состояния?
И, да, OUTPUT завести на питание, да ещё и напрямую - без резистора. Вы экстремал!
Да, кстати, даже если Вы всё напишете правильно, кнопки, подключенные без всяких резисторов, надежно работать не будут никогда - глюки будут валиться постоянно.
Написал "OUTPUT", так как только с ним работают кнопки. Если использовать подтягивающий резистор, то есть "INPUT_PULLUP", то кнопки вообще не реагируют.
Почему тогда при "OUTPUT" 4-е кнопки работают, а 2-е нет?
Кнопка должна быть между землёй и ножкой. Только тогда pullup будет работать. Если кнопки на + то обязательно нужен резистор на землю. Почитайте http://arduino.ru/Reference/Constants вразделе Задание режима порта вход/выхода, INPUT и OUTPUT. Вы бедный порт насилуете. Он выдает 0 , а вы ему +5 или единицу подаете. Сгорит микросхема - сам себе буратино.
Кнопка должна быть между землёй и ножкой. Только тогда pullup будет работать. Если кнопки на + то обязательно нужен резистор на землю. Почитайте http://arduino.ru/Reference/Constants вразделе Задание режима порта вход/выхода, INPUT и OUTPUT. Вы бедный порт насилуете. Он выдает 0 , а вы ему +5 или единицу подаете. Сгорит микросхема - сам себе буратино.
Ну перепаять с + на - у меня уже не получится, так как очень много проводов, спаяных воедино, идут к плюсу.
А резисторы имеются в наличии. Одну ножку резистора к GND, а вторую куда припаять?
На каждый вход. И режим INPUT_PULLUP. И логика поменяется. Отпустили LOW, нажали HIGH. Резистор должен быть больше 50к.
Спасибо большое, припаяю по возможности!
Скорее всего это решит сразу две первые проблемы с кнопками.
А что скажите по 3 и 4 вопросам?
А6 и А7 аналоговые входы которые не могут быть переключены в цифровые.
Спасибо! И правда как цифровые могут использоватсья только пины 14-19 (A0-A5).
Опять все перепаивать(
Если перепаивать, то всёж лучше кнопки лучше на землю подсоединить. И логика не поменяется и резисторы не паять.
Если перепаивать, то всёж лучше кнопки лучше на землю подсоединить. И логика не поменяется и резисторы не паять.
Я все-таки так и решил сделать. Просто отпаяю провод от ножки, идущий к "+" и прицеплю новый, который к земле будет идти. А то я так представил, столько возни с этими резисторами будет...
Спасибо за совет!
Возник вопрос, чтобы не отпаивать 2-е кнопки от A6 и A7: можно ли тоже одну ножку кнопки к "-" припаять, вместо "+", и поставить режим "INPUT_PULLUP"?
Вам же объясняли, что они не умеют быть цифровыми. Хотя, Если будете читать analogRead, то можно, только тогда никаких INPUT_PULLUP не нужно.
Вам же объясняли, что они не умеют быть цифровыми. Хотя, Если будете читать analogRead, то можно, только тогда никаких INPUT_PULLUP не нужно.
Я так и хотел. Мне было интересно нужно "INPUT_PULLUP" использовать или нет. Спасибо за ответ!
Аааа, и вот еще что интересовало: к минусу все-таки надо перепаивать, если как аналоговый порт использовать?
Да. И резистор на +5 надо. 10к хватит. Читать analogRead и делить на 512. Получите 0 - нажата, 1 - отпущена.