analogRead (0) ou analogRead (A0)

14

La référence Arduino indique que vous utiliseriez le code suivant pour lire la valeur de la broche analogique # 5:

int val1 = analogRead(5);

Cependant, pour lire à partir de la broche numérique n ° 5, vous devez transmettre le même numéro de broche à digitalRead:

int val2 = digitalRead(5);

Ne devriez-vous pas utiliser à la analogRead(A5)place de analogRead(5)?

Sinon, que fait le code suivant:

int val3 = analogRead(A5);
Tyilo
la source

Réponses:

28

Pour répondre aux questions spécifiques de Tyilo:

analogRead(5)et digitalRead(5)lira à partir de deux endroits différents. Le premier lira à partir du canal analogique 5ou A5le second lira à partir de la broche 5 qui se trouve être une broche numérique. Alors oui, si vous voulez lire une broche analogique avec digitalReadvous, vous devez utiliser A5.

Pourquoi?

analogReadnécessite un numéro de canal en interne, mais il vous permettra également de lui attribuer un code PIN. Si vous lui donnez un code PIN, il le convertira en son numéro de canal correspondant. Pour autant que je sache, analogReadc'est la seule fonction qui utilise un numéro de canal en interne, est la seule à autoriser un numéro de canal, et est la seule fonction avec cette conversion pin-to-channel non documentée. Pour comprendre cela, commençons par quelques exemples.

Si vous souhaitez utiliser analogReadsur la première broche analogique, A0vous pouvez faire analogRead(0)qui utilise le numéro de canal ou analogRead(A0)qui utilise le numéro de broche. Si vous deviez utiliser la variante du numéro de broche, analogReadconvertirait le numéro de broche A0en son numéro de canal approprié 0.

Si vous souhaitez utiliser digitalWritesur la première broche analogique , A0vous pouvez seulement faire digitalWrite(A0, x). digitalWriten'utilise pas de canaux analogiques en interne et ne vous permet pas de lui transmettre un numéro de canal. Eh bien, cela vous permettra, mais vous sélectionnerez la mauvaise épingle. La même chose s'applique à digitalReadet même analogWrite.

Qu'en est-il des conversions pin-to-channel effectuées par analogRead? La source de cette fonction peut être trouvée dans hardware/arduino/avr/cores/arduino/wiring_analog.cVous verrez qu'elle effectue une soustraction simple basée sur le type de carte. Le A0/ A1/ A2/ etc. les constantes représentent le numéro de broche des canaux analogiques et peuvent être utilisées partout où vous devez vous référer aux entrées analogiques. Pour cette raison, ils sont la meilleure option à utiliser dans votre code Arduino, car il est très évident que vous utilisez le même port physique même lorsque vous utilisez différentes fonctions. Les définitions de ces constantes dépendent de votre carte.

Par exemple, voici le code de définition de broche analogique pour l'Arduino Uno dans 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;

Pour comparaison, voici le code de définition des broches analogiques pour l'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;

Discussion EE supplémentaire sur les broches analogiques: Puis-je utiliser les broches analogiques de l'Arduino pour mon projet en tant que numérique?

Kevin Mark
la source
1
Je pensais que c'était exactement comme vous l'avez expliqué, je viens d'être confus par la référence Arduino, qui contient de fausses informations.
Tyilo
1
De plus, vous ne pouvez analogReadle faire que sur des broches analogiques! D'autre part, analogWritepeut être utilisé à la fois sur les broches analogiques et PWM.
Tyilo
1
@Tyilo J'ai mis à jour ma réponse avec des informations plus précises tirées du code source.
Kevin Mark
3
analogWrite () peut être appelé sur n'importe quelle broche, mais il ne fait que quelque chose sur les broches PWM. Sur les broches non-PWM et toutes les broches analogiques, il appelle simplement digitalWrite ().
baldengineer
3
@powtac - Il est généralement admis que la documentation Arduino est assez abominable, au moins ici. Ne vous sentez pas comme si vous manquiez quelque chose, ce n'est pas vous, c'est le peuple Arduino.
Connor Wolf
3

J'ai passé des heures là-dessus. Je pensais que j'avais un problème matériel. Il s'avère que j'appelais analogRead()incorrectement.

Incorrect (exemple de code erroné de DFRobot 😣):

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

Correct:

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

Mise à jour : analogRead()prend les numéros de broches GPIO. A0etc. sont #defines pour les numéros de broche Arduino, où A0 == 36.

Attention: par exemple sur le FireBeetle ESP32, la broche étiquetée "IO36 / A0" (GPIO36) est égale à Arduino A0, mais "IO39 / A1" (GPIO39) est égale à Arduino A3(pas A1), "IO34 / A2" (GPIO34) est égale à Arduino A6(pas A2) , etc.

jrc
la source