Использование аналоговых входов в качестве цифровых

R3EZ
Offline
Зарегистрирован: 15.11.2018

Подскажите, пожалуйста, будет ли применима функция digitalRead к аналоговым портам при использовании их в качестве цифровых?

b707
Offline
Зарегистрирован: 26.05.2017

Подразумеваем Атмегу328, верно?

Тогда ответ - к портам A0-A5 да, применимо. Порты A6 A7 - только аналоговый вход.

R3EZ
Offline
Зарегистрирован: 15.11.2018

Да, Атмега 328. Ардуино UNO. Кнопки управления подключены к  А2 и А3. Спасибо, попробую.

R3EZ
Offline
Зарегистрирован: 15.11.2018

Работает, спасибо.

Но задача для меня намного сложнее. Необходимо написать часть программы, которая работала бы следующим образом. Имеются две кнопки управления, допустим A и B, при нажатии и удерживании любой из которых сначала появляется сигнал на выходе С, а потом с определенной задержкой на выходе, связанном с соответствующей кнопкой. При отпускании картина обратная. Сначала снимается управляющий сигнал, а потом с задержкой сигнал на выходе С.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И какое отношение имеет эта задача к использованию аналоговых входов?

R3EZ
Offline
Зарегистрирован: 15.11.2018

andriano пишет:

И какое отношение имеет эта задача к использованию аналоговых входов?

Согласен, напрямую не имеет. Просто так устроено железо, что кнопки управления подключены к аналоговым портам А2 и А3. Может перенести ее в новую тему?

bwn
Offline
Зарегистрирован: 25.08.2014

Ну и используйте их как цифровые. digitalRead(16);
Ну а как споймали кнопку, начинается совсем другая история.

R3EZ
Offline
Зарегистрирован: 15.11.2018

bwn пишет:

Ну и используйте их как цифровые. digitalRead(16);
Ну а как споймали кнопку, начинается совсем другая история.

Стоит ли начинать? Боюсь вместо помощи начнется такой же флуд. Ответ я получил во втором посте. Ветку можно закрывать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

R3EZ пишет:

Стоит ли начинать? Боюсь вместо помощи начнется такой же флуд.

Если не будете читать правила форума и строго им следовать - точно начнется.

bwn
Offline
Зарегистрирован: 25.08.2014

R3EZ пишет:

Стоит ли начинать? Боюсь вместо помощи начнется такой же флуд. 

Флуд начинается на риторические вопросы. Когда пишут код и спрашивают, почему неверно работает, бывают и нормальные ответы. Но начало головной темы, все-же прочтите.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

R3EZ пишет:

Необходимо написать часть программы.  Имеются две кнопки управления, допустим A и B, при нажатии и удерживании любой из которых сначала появляется сигнал на выходе С, а потом с определенной задержкой на выходе, связанном с соответствующей кнопкой. При отпускании картина обратная. Сначала снимается управляющий сигнал, а потом с задержкой сигнал на выходе С.

зайдите в мою тему, http://arduino.ru/forum/apparatnye-voprosy/odnovremennoe-nazhatie-10-knopok-iz-lyubykh-120#comment-416596 там по теме кнопок собаку не одну съели, вам на резисторах проще всего делать кнопку, резистор 10 ком нужен, кнопка и код 

//right hand accordeon
const int PIN_BUTTON = 2;
const int PIN_LED = 13;
 
void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
}
 
void loop() {
  // Получаем состояние кнопки
  int buttonState = digitalRead(PIN_BUTTON);
  Serial.println(buttonState);
  // Если кнопка не нажата, то ничего не делаем
  if (!buttonState) {
    delay(50);
    return;
  }
 
  // Этот блок кода будет выполняться, если кнопка нажата
  // Мигаем светодиодом
  digitalWrite(PIN_LED, HIGH);
  delay(11);
  digitalWrite(PIN_LED, LOW);
  delay(11);
}

схема тут https://arduinomaster.ru/datchiki-arduino/knopka-arduino/#i 

делал так события как вам нужны

(нажата отжата) и сделать это когда отжата и сделать это когда нажата с задержкой или не задерживая и т.д.

//код считает сколько нажали кнопку выдает on off в serial и каждые 4 нажатия включает светодиод


const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(115200);
}

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
  Serial.println("R3EZ ON");
      Serial.print("pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("R3EZ OFF");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

тут все что вам нужно скорее всего 

R3EZ
Offline
Зарегистрирован: 15.11.2018

MYFRIEND пишет:

делал так события как вам нужны

 Спасибо, MYFRIEND!

Чтобы не писать не по теме в данной ветке, перейду в Вашу тему.

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

R3EZ пишет:

Чтобы не писать не по теме в данной ветке, перейду в Вашу тему.

ой в нашу не надо! пожалуйста здесь давайте пишите лучше! где же ещё как не здесь! 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

R3EZ пишет:

Здравствуйте, MYFRIEND!

Пришел по Вашей ссылке из ветки об "использовании аналоговых входов в качестве цифровых". Спасибо за скетч.

Давайте начнём с кнопок, хорошо? что у вас есть и что уже сделали напишите и сфотографируйте. Я бы на вашем месте обработал первую кнопку, вы уже это сделали? выйдет меньше вопросов, они решатся сами. А оставшиеся задавайте. Делай больше болтай меньше. Справшивайте что не получается. Ардуино взяли? кнопку подключили? скетч отправили? сделайте и пишите что сделали. Выйдет "дешевле" по времени. Здесь забежать на 1секунду ответить быстро, вот что важно. С кнопкой разберетесь точно. Остальное спрашивайте. Старайтесь как можно больше делать сами, например приделали кнопки к ардуино, и сфотографировали, пишите, интересно помочь. 1й шаг как сделали напишите. Только не исчезайте. Тексты состоят из букв, так и шаги состоят из отдельных шагов, хоть и кажется там все раз и готово. Для начала я бы нажал кнопку вашу A. Давайте её запустим. зайдите в вк https://vk.com/id526746393 азы расскажу если нужно. Какая у вас ардуино, может в нано например не влезть, а пока придет из китая придется ждать. И еще лучше пишите - есть ардуино например mega2560 есть кнопки, провода, что делать? подскажу. А то что у вас есть из всего не известно даже. Учитывая что вам ответить за 1 минуту нужно что то. Можете в вк написать. 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

ближе к ардуино по возможности пишите все. раз кнопки есть давайте их добавлять. мне так проще, у вас просто все должно быть.  и старайтесь делать сразу, как быстро сможете сделать советы? кнопку сделали уже хотя бы одну? бросьте код что там у вас. Ближе к коду пишите все и к ардуино, можно подробно не описывать, если не понятно будет спросить лучше где не понятно. 

пережуйте код сначала который вам дали как пример, если для вас это "съедобно" то будет ещё порция. Жду как приделали кнопки код от вас. Видя ваш код вам подскажут куда вам идти дальше в каком направлении кратчайшим путём. Кодом интереснее общаться. Описание понятно ваше, но дальше код лучше начать показывать. А описание само приложится. И писать лучше дополнения сразу в ваш код, а то неизвестно что там у вас и где пока ещё ни строчки кода не показали. 

сколько милисекунд должно пройти после нажатия кнопки (пока первой) вторую пока не нужно, как соберем всё продолжим дальше вопрос-ответ, нарисую вам примерно происходящее, только код покажите какой собрались делать. 

 

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

Всё же раз задали вопрос делайте уже, а то столько людей отвлекли, а потом передумали. 

R3EZ
Offline
Зарегистрирован: 15.11.2018

Приветствую всех!

Ситуация поменялась. Совместить разные программы в одном железе не получилось, так как управление осуществляется тремя сигналами ручным нажатием не используя Ардуино и требуемая последовательность/задержка достигается автоматически конструктивно. В другом ПО, который использует кнопки на аналоговых входах, используются два сигнала - включение/отключения вращения по часовой и против часовой стрелки. Управляющей программе (с компьютера) эти сигналы не нужны. Она использует для этого свои команды. Поэтому я аппаратно запараллелил имеющиеся кнопки ключами с открытым коллектором, подключенными на соответствующие выходы Ардуино.

Но, для отладки требуемой последовательности на макете все же решил попробовать свои силы в написании скетча, обеспечивающего нужную мне последовательность включения сигналов. И тут же столкнулся проблемой подавления дребезга. Несколько дней дней изучал функцию debounce, но так до конца и не разобрался. По Джереми Блуму работает, но там используется delay(), а мне нужно millis(), так как тратить время на простой программы во время задержки слишком расточительно. Еще необходимо считывать и отображать текущий азимут, поддерживать связь с управляющей программой и время от времени вращать двигатель.

Пока получилось не очень. Debounce так и не добил. Включил монитор порта и обнаружил, что значение  lastButton всегда равно 97 и не меняется. Чувствую, что что-то не так. Покритикуйте, пожалуйста. 

//Переменные
  const int BUTTON = 16;//клавиша поворота влево подключена к А2 и замыкается на землю
  const int ccw = 6;//включение реле вращения против часовой стрелки
  const int brake = 9;//включение/отключение тормоза
  bool currentButton = HIGH; //Текущее состояние кнопки
  bool lastButton = HIGH; //Предыдущее состояние кнопки
//bool cwState = false; // Состояние выхода сигнала ccw
  long lastDebounceTime = 0;  // время, когда выходной контакт был переключен в последний раз
  long debounceDelay = 50;    // время антидребезга (взято из примера)
 
  void setup() {
    digitalWrite(BUTTON, HIGH); // включить подтягивающий резистор на входе ccw
    pinMode(cw, OUTPUT);// Устанавливаем вывод D6 как выход
    pinMode (brake, OUTPUT); //Устанавливаем вывод D9 как выход
    Serial.begin(9600);
}
 
// Функция сглаживания дребезга  принимает в качестве аргумента предыдущее состояние кнопки и выдает фактическое.
  boolean debounce(boolean last)
  {
   boolean current = digitalRead(BUTTON); // Считать состояние кнопки
    Serial.print("Current= ");
    Serial.print(digitalRead(BUTTON));// =1 при отжатой и =0 при нажатой
    Serial.print("lastButton= ");
    Serial.print(lastButton); // Здесь значение 97 и не меняется
  if (last != current) // Если изменилось...
  {
    Serial.println(" Есть нажатие ");
    lastDebounceTime = millis(); //запускаем отсчет времени задержки
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
 
    if (current != currentButton) {
      current = lastButton;
    }
    // delay(5); // Ждем 5 мс
    // current = digitalRead(BUTTON); // Считываем состояние кнопки
    return current;
    }
  }
 
 
  void loop() {
 
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == LOW) // Если нажатие
  {
    digitalWrite(brake, HIGH); // Включить тормоз
  }
 
  lastButton = currentButton;
  digitalWrite(brake, LOW); // Выключить тормоз
 

}     

sadman41
Offline
Зарегистрирован: 19.10.2016

На кубике выпадает 1 и вы возвращаетесь на клетку "правильная вставка кода".

R3EZ
Offline
Зарегистрирован: 15.11.2018

sadman41 пишет:

На кубике выпадает 1 и вы возвращаетесь на клетку "правильная вставка кода".

А в переводе на русский это как? 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Код надо вставлять как в сообщении #10

R3EZ
Offline
Зарегистрирован: 15.11.2018

Jeka_M пишет:

Код надо вставлять как в сообщении #10

Еще раз повторюсь. Мне нужно определить состояние нажатия и отжатия кнопки, от которого зависят дальнейшие действия. Функция Delay()  не может быть использована, т.к. будет задержка выполнения других ветвей программы. Кнопки подключены напрямую к аналоговым входам и замыкаются на землю. Другой вариант не обсуждается. Для макетирования я мог бы обойтись и примером из Джерими Блума и даже вообще обойтись без подавления дребезга, но хочется разобраться. Поймите, когда тебе под 70, изучать С++ не так уж и легко.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Пока Вы не вставите код как положено, с номерами строк, обсуждать его вряд ли кто-то будет. Как Вы предлагаете ссылаться на определённые строки кода? Пальцем по экрану считать?

R3EZ
Offline
Зарегистрирован: 15.11.2018


Jeka_M пишет:

Пока Вы не вставите код как положено, с номерами строк, обсуждать его вряд ли кто-то будет. Как Вы предлагаете ссылаться на определённые строки кода? Пальцем по экрану считать?

Спасибо, что подсказали. Я это заметил еще когда вставлял код и хотел попросить, чтобы ткнули носом в нужное место. Вроде получилось.

//Переменные
  const int BUTTON = 16;//клавиша поворота влево подключена к А2 и замыкается на землю
  const int ccw = 6;//включение реле вращения против часовой стрелки
  const int brake = 9;//включение/отключение тормоза
  bool currentButton = HIGH; //Текущее состояние кнопки
  bool lastButton = HIGH; //Предыдущее состояние кнопки
//bool cwState = false; // Состояние выхода сигнала ccw
  long lastDebounceTime = 0;  // время, когда выходной контакт был переключен в последний раз
  long debounceDelay = 50;    // время антидребезга; если выходной контакт продолжает дребезжать – увеличиваем это время

  void setup() {
    digitalWrite(BUTTON, HIGH); // включить подтягивающий резистор на входе CW
    pinMode(cw, OUTPUT);// Устанавливаем вывод D6 как выход
    pinMode (brake, OUTPUT); //Устанавливаем вывод D9 как выход
    Serial.begin(9600);
}

// Функция сглаживания дребезга  принимает в качестве аргумента предыдущее состояние кнопки и выдает фактическое.
  boolean debounce(boolean last)
  {
   boolean current = digitalRead(BUTTON); // Считать состояние кнопки
    Serial.print("Current= ");
    Serial.print(digitalRead(BUTTON));// =1 при отжатой и =0 при нажатой
    Serial.print("lastButton= ");
    Serial.print(lastButton); // Здесь значение 97 и не меняется
  if (last != current) // Если изменилось...
  {
    Serial.println(" Есть нажатие ");
    lastDebounceTime = millis(); //запускаем отсчет времени задержки
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (current != currentButton) {
      current = lastButton;
    }
    // delay(5); // Ждем 5 мс
    // current = digitalRead(BUTTON); // Считываем состояние кнопки
    return current;
    }
  }


  void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == LOW) // Если нажатие
  {
    digitalWrite(brake, HIGH); // Включить тормоз
  }

  lastButton = currentButton;
  digitalWrite(brake, LOW); // Выключить тормоз

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Потерян pinMode(BUTTON, INPUT_PULLUP);

R3EZ
Offline
Зарегистрирован: 15.11.2018

sadman41 пишет:

Потерян pinMode(BUTTON, INPUT_PULLUP);

А разве строка 12  его не заменяет? Вместо BUTTON можно было написать 16.

 digitalWrite(BUTTON, HIGH); // включить подтягивающий резистор на входе CW

Да и если мониторить состояние  А2 , то оно при чтении оно меняется

 Serial.print(digitalRead(BUTTON));// =1 при отжатой и =0 при нажатой

А вот последнее состояние кнопки  bool lastButton = HIGH; имеет недопустимое значение 97. 

Перевод его в разряд int вообще становится где-то за 14000.