analogRead (0) o analogRead (A0)

14

La referencia de arduino indica que usaría el siguiente código para leer el valor del pin analógico # 5:

int val1 = analogRead(5);

Sin embargo, para leer desde el pin digital # 5, pasaría el mismo número de pin a digitalRead:

int val2 = digitalRead(5);

¿No deberías usar en analogRead(A5)lugar de analogRead(5)?

Si no, ¿qué hace el siguiente código:

int val3 = analogRead(A5);
Tyilo
fuente

Respuestas:

28

Para responder las preguntas específicas de Tyilo:

analogRead(5)y digitalRead(5)leerá desde dos lugares diferentes. El primero leerá desde el canal analógico 5o A5y el segundo leerá desde el pin 5, que resulta ser un pin digital. Entonces, sí, si quieres leer un pin analógico digitalRead, deberías estar usando A5.

¿Por qué?

analogReadrequiere un número de canal internamente, pero también le permitirá darle un número PIN. Si le da un número pin, lo convertirá en su número de canal correspondiente. Por lo que puedo decir analogReades que la única función que usa un número de canal internamente, es la única que permite un número de canal, y es la única función con esta conversión de pin a canal no documentada. Para entender esto, comencemos con algunos ejemplos.

Si desea usar analogReadel primer pin analógico A0, puede hacer analogRead(0)qué usa el número de canal o analogRead(A0)cuál usa el número de pin. Si usara la variante de número de pin, analogReadconvertiría el número de pin A0a su número de canal adecuado 0.

Si desea utilizar digitalWriteel primer pin analógico A0, solo puede hacerlo digitalWrite(A0, x). digitalWriteno usa canales analógicos internamente y no le permite pasarle un número de canal. Bueno, te lo permitirá , pero seleccionarás el pin incorrecto. Lo mismo se aplica a digitalReade incluso analogWrite.

¿Qué pasa con las conversiones de pin a canal realizadas por analogRead? La fuente de esa función se puede encontrar en hardware/arduino/avr/cores/arduino/wiring_analog.cVerá que hace una resta simple basada en el tipo de placa. El A0/ A1/ A2/ etc. Las constantes representan el número de pin de los canales analógicos y se pueden usar en cualquier lugar donde necesite referirse a las entradas analógicas. Por esa razón, son la mejor opción para usar en su código Arduino porque es muy obvio que está usando el mismo puerto físico incluso cuando usa diferentes funciones. Las definiciones de esas constantes dependen de su tablero.

Por ejemplo, aquí está el código de definición de pin analógico para el Arduino Uno en 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;

Para comparar, aquí está el código de definición de pin analógico para el 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;

Más discusión sobre EE en pines analógicos: ¿Puedo usar los pines analógicos en el Arduino para mi proyecto como digital?

Kevin Mark
fuente
1
Pensé que era exactamente como lo explicaste, la referencia de Arduino, que contiene información falsa, me confundió.
Tyilo
1
¡También solo puedes hacerlo analogReaden pines analógicos! Por otro lado, analogWritese puede usar tanto en los pines analógicos como en los PWM.
Tyilo
1
@Tyilo Actualicé mi respuesta con información más precisa tomada del código fuente.
Kevin Mark
3
Se puede llamar a analogWrite () en cualquiera de los pines, pero solo hace algo en los pines PWM. En pines ditiales no PWM y todos los pines analógicos, simplemente llama a digitalWrite ().
baldengineer
3
@powtac: en general, se acepta que la documentación de arduino es bastante abominable, al menos por aquí. No sientas que te estás perdiendo algo, no eres tú, son las personas arduino.
Connor Wolf
3

Pasé horas en esto. Pensé que tenía un problema de hardware. Resulta que estaba llamando analogRead()incorrectamente.

Incorrecto (código de muestra erróneo de DFRobot 😣):

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

Correcto:

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

Actualización : analogRead()toma los números de pin GPIO. A0etc.son #defines para los números de pin de Arduino, donde A0 == 36.

Tenga cuidado: por ejemplo, en FireBeetle ESP32, el pin etiquetado "IO36 / A0" (GPIO36) es igual a Arduino A0, pero "IO39 / A1" (GPIO39) es igual a Arduino A3(no A1), "IO34 / A2" (GPIO34) es igual a Arduino A6(no A2) etc.

jrc
fuente