Кнопки. Внешнее питание.
- Войдите на сайт для отправки комментариев
Всем привет!
Имеется "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 - отпущена.