Невозможно использовать аналоговые контакты в качестве цифровых входов
Я хочу использовать аналоговый вывод 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);
}
};
@albert, 👍2
2 ответа
Лучший ответ:
A6 и A7 являются особыми для nano. Это единственные контакты, которые нельзя использовать для цифровых. Это всего лишь аналоговые входы.
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
- Использование вывода светодиода для ввода
- Почему номера выводов диаграмм и кода отличаются друг от друга?
- Как узнать сопротивление внутреннего подтягивающего резистора?
- Arduino Nano использует контакты SPI в качестве контактов ввода-вывода? а еще можно сделать ISP?
- digitalRead не читает входной контакт ESP8266-01
- Почему некоторые контакты Arduino Nano (D3, D4, A3, A4, A6, A7) не могут быть установлены на высокий уровень?
- digitalRead продолжает давать 1
- Использовать выводы PWM в качестве обычных цифровых входов/выходов?
Связано ли это с аппаратной абстракцией Arduino / отображением контактов или связано с возможностями Atmega328?, @albert
Это аппаратные возможности ATmega328P-AU. Эти контакты подключаются только внутренне к АЦП MUX и не имеют никаких цифровых драйверов., @Majenko
@альберт, справедливости ради по отношению к авторам веб-сайта, вероятно, в то время, когда они писали это заявление, было верно, что аналоговые контакты всегда можно было использовать в качестве цифровых. Пакеты DIP ATmega328P, Atmega168P и ATmega8 использовались на более ранних платах Arduino. -AU в той части, которую упоминает Майенко, относится к версии чипа для поверхностного монтажа, в которой отсутствуют контакты в DIP-версии 328P. Вы можете видеть отсутствие и наличие A6 и A7 между версиями DIP и SMT платы Arduino UNO., @timemage