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

Я хочу использовать аналоговый вывод A7 в качестве цифрового входного вывода. Как указано в документах Arduino, аналоговые контакты могут быть сконфигурированы так же, как и любой другой цифровой вывод.

Однако при попытке настроить аналоговый вывод в качестве цифрового входного вывода я получаю неожиданное поведение:

  • Использование цифрового контакта (например, D2) работает должным образом.
  • При использовании аналогового вывода (например, A7) светодиод загорается после запуска без нажатия кнопки и не изменяется/не реагирует на нажатие кнопки.
  • Поскольку в документах указано, что аналоговые контакты могут быть сконфигурированы как цифровые контакты и использоваться таким же образом, такое поведение кажется несколько запутанным.

Смотрите мой прикрепленный фрагмент, чтобы воспроизвести/изучить проблему:

// using pin 2 (D2) works as expected (LED is lit on button press only)
// const int buttonPin = 2; 

// using analog pin 7 (A7 / pin 21) as a digital input is not working,
// LED is lit directly after start-up & does not react to button press,
// analog pins are generally usabable as digital inputs
// see https://www.arduino.cc/en/Tutorial/Foundations/AnalogInputPins
const int buttonPin = A7;

const int ledPin = 13;

int buttonState = 0;


void setup() {
  // button is connected to GND, so enable internal pull-up resistors
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
};


void loop() {
  // as we use internal pull-up resistors, logic HIGH & LOW are inverted
  buttonState = !digitalRead(buttonPin);
  if (buttonState) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
};

, 👍2


2 ответа


Лучший ответ:

5

A6 и A7 являются особыми для nano. Это единственные контакты, которые нельзя использовать для цифровых. Это всего лишь аналоговые входы.

,

Связано ли это с аппаратной абстракцией Arduino / отображением контактов или связано с возможностями Atmega328?, @albert

Это аппаратные возможности ATmega328P-AU. Эти контакты подключаются только внутренне к АЦП MUX и не имеют никаких цифровых драйверов., @Majenko

@альберт, справедливости ради по отношению к авторам веб-сайта, вероятно, в то время, когда они писали это заявление, было верно, что аналоговые контакты всегда можно было использовать в качестве цифровых. Пакеты DIP ATmega328P, Atmega168P и ATmega8 использовались на более ранних платах Arduino. -AU в той части, которую упоминает Майенко, относится к версии чипа для поверхностного монтажа, в которой отсутствуют контакты в DIP-версии 328P. Вы можете видеть отсутствие и наличие A6 и A7 между версиями DIP и SMT платы Arduino UNO., @timemage


0

const int buttonPin = A7; //является недопустимым оператором, поскольку A7 не является целым числом.
Вместо этого используйте число:
const int buttonPin = 21; // 21-десятичный контакт для A7.
Не используйте A6 или A7 для PIN-режима(21, ВХОД); на Nano они не работают. Вы можете использовать analogRead() (возвращает 0..1023), а затем преобразовать его в желаемое логическое значение (например. >511 или ><511 для пересечения половины уровня Vref).

,

A7-это константа со значением 21. https://github.com/arduino/ArduinoCore-avr/blob/24e6edd475c287cdafee0a4db2eb98927ce3cf58/variants/standard/pins_arduino.h#L63, @Juraj