analogRead (0) или analogRead (A0)

14

Ссылка arduino утверждает, что вы будете использовать следующий код для считывания значения с аналогового вывода № 5:

int val1 = analogRead(5);

Однако для чтения с цифрового контакта № 5 вы должны передать тот же номер контакта digitalRead:

int val2 = digitalRead(5);

Разве вы не должны использовать analogRead(A5)вместо analogRead(5)?

Если нет, что делает следующий код:

int val3 = analogRead(A5);
Tyilo
источник

Ответы:

28

Чтобы ответить на конкретные вопросы Tyilo:

analogRead(5)и digitalRead(5)будет читать из двух разных мест. Бывший будет считывать с аналогового канала 5или A5и последний будет читать из пальца 5 , который происходит , чтобы быть цифровой контактный. Так что да, если вы хотите прочитать аналоговый пин-код, digitalReadвы должны использовать A5.

Почему?

analogReadтребуется внутренний номер канала, но это также позволит вам присвоить ему пин-код. Если вы дадите ему пин-код, он будет преобразован в соответствующий ему номер канала. Насколько я могу судить, analogReadединственная функция, которая использует номер канала внутри, единственная, которая разрешает номер канала, и единственная функция с этим недокументированным преобразованием pin-to-channel. Чтобы понять это, давайте начнем с нескольких примеров.

Если вы хотите использовать analogReadпервый аналоговый вывод, A0вы можете analogRead(0)использовать номер канала или analogRead(A0)номер контакта. Если бы вы использовали вариант с номером контакта, analogReadконвертировал бы номер контакта A0в его правильный номер канала 0.

Если вы хотите использовать digitalWriteна первом аналоговом выводе, A0вы можете только сделать digitalWrite(A0, x). digitalWriteне использует аналоговые каналы внутри и не позволяет передавать ему номер канала. Ну, это позволит вам, но вы выберете неправильный контакт. То же касается digitalReadи даже analogWrite.

А как насчет преобразований pin-to-channel analogRead? Источник этой функции можно найти в. hardware/arduino/avr/cores/arduino/wiring_analog.cВы увидите, что она выполняет простое вычитание в зависимости от типа платы. A0/ A1/ A2/ И т.д.. Константы представляют номер контакта аналоговых каналов и могут использоваться везде, где вам нужно обратиться к аналоговым входам. По этой причине они являются лучшим вариантом для использования в вашем коде Arduino, потому что совершенно очевидно, что вы используете один и тот же физический порт, даже если вы используете разные функции. Определения этих констант зависят от вашей доски.

Например, вот код определения аналогового вывода для Arduino Uno в hardware/arduino/avr/variants/standard/pins_arduino.h

static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;

Для сравнения вот код определения аналогового вывода для Arduino Mega:

static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;

Дальнейшее обсуждение EE аналоговых выводов: Могу ли я использовать аналоговые выводы на Arduino для моего проекта в качестве цифрового?

Кевин Марк
источник
1
Я думал, что это было именно так, как вы объяснили, но меня просто смутила ссылка на Arduino, которая содержит ложную информацию
Tyilo
1
Также вы можете делать толькоanalogRead на аналоговые контакты! С другой стороны, analogWriteможет использоваться как на аналоговых, так и на ШИМ-выводах.
Tyilo
1
@Tyilo Я обновил свой ответ более точной информацией, взятой из исходного кода.
Кевин Марк
3
analogWrite () может быть вызван на любом из контактов, но он только что-то делает на контактах PWM. На дополнительных цифро-выводах без ШИМ и на всех аналоговых выводах он просто вызывает digitalWrite ().
Бальдженер
3
@powtac - Общепринято, что документация arduino довольно отвратительна, по крайней мере, здесь. Не чувствуй, что ты что-то упускаешь, это не ты, это люди из Arduino.
Коннор Вольф
3

Я потратил часы на это. Я думал, что у меня проблема с оборудованием. Оказывается, я звонил analogRead()неправильно.

Неверно (ошибочный пример кода от DFRobot 😣):

val = analogRead(0); //connect sensor to Analog 0

Верный:

val = analogRead(A0); //connect sensor to Analog 0

Обновление : analogRead()принимает номера контактов GPIO. A0и т. д. являются #defines для номеров выводов Arduino, где A0 == 36.

Будьте осторожны: например, в FireBeetle ESP32, вывод с меткой «IO36 / A0» (GPIO36) равен Arduino A0, но «IO39 / A1» (GPIO39) равен Arduino A3(не A1), «IO34 / A2» (GPIO34) равен Arduino A6(не A2) , и т.д.

JRC
источник