analogRead (0) oder analogRead (A0)

14

Die Arduino-Referenz besagt, dass Sie den folgenden Code verwenden würden, um den Wert vom analogen Pin # 5 zu lesen:

int val1 = analogRead(5);

Um jedoch von dem digitalen Pin # 5 zu lesen, würden Sie die gleiche Pin-Nummer übergeben an digitalRead:

int val2 = digitalRead(5);

Solltest du nicht analogRead(A5)statt verwenden analogRead(5)?

Wenn nicht, was bewirkt der folgende Code:

int val3 = analogRead(A5);
Tyilo
quelle

Antworten:

28

Um Tyilos spezifische Fragen zu beantworten:

analogRead(5)und digitalRead(5)wird von zwei verschiedenen Orten lesen. Ersteres liest vom analogen Kanal 5oder A5Letzteres von Pin 5, der zufällig ein digitaler Pin ist. Also ja, wenn du einen analogen Pin mit lesen digitalReadwillst solltest du verwenden A5.

Warum?

analogReaderfordert eine interne Kanalnummer, aber Sie können auch eine PIN-Nummer vergeben. Wenn Sie eine PIN-Nummer vergeben, wird diese in die entsprechende Kanalnummer umgewandelt. Soweit ich weiß, analogReadist dies die einzige Funktion, die intern eine Kanalnummer verwendet, die einzige, die eine Kanalnummer zulässt, und die einzige Funktion bei dieser undokumentierten Pin-zu-Kanal-Konvertierung. Um dies zu verstehen, beginnen wir mit einigen Beispielen.

Wenn Sie analogReadden ersten analogen Pin verwenden möchten, A0können Sie festlegen, analogRead(0)welcher die Kanalnummer oder analogRead(A0)welcher die Pin-Nummer verwendet. Wenn Sie die Pin-Nummer-Variante verwenden analogReadwürden , würden Sie die Pin-Nummer A0in die richtige Kanalnummer umwandeln 0.

Wenn Sie digitalWriteauf dem ersten analogen Stift verwenden möchten, A0können Sie nur tun digitalWrite(A0, x). digitalWriteverwendet keine analogen Kanäle intern und lässt Sie keine Kanalnummer übergeben. Nun, es wird Ihnen erlauben , aber Sie werden den falschen Stift auswählen. Gleiches gilt für digitalReadund gerade analogWrite.

Was ist mit den Pin-zu-Kanal-Konvertierungen von analogRead? Die Quelle für diese Funktion finden Sie unter hardware/arduino/avr/cores/arduino/wiring_analog.cSie werden sehen, dass sie eine einfache Subtraktion basierend auf dem Kartentyp ausführt. Die A0/ A1/ A2/ etc. Konstanten stellen die Pin-Nummer der analogen Kanäle dar und können überall dort verwendet werden, wo Sie auf die analogen Eingänge verweisen müssen. Aus diesem Grund sind sie die beste Option, um sie in Ihrem Arduino-Code zu verwenden, da es sehr offensichtlich ist, dass Sie denselben physischen Port verwenden, auch wenn Sie verschiedene Funktionen verwenden. Die Definitionen dieser Konstanten hängen von Ihrer Karte ab.

Hier ist zum Beispiel der analoge PIN-Definitionscode für den Arduino Uno in 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;

Zum Vergleich hier der analoge Pin-Definitionscode für den 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;

Weitere EE-Diskussion zu analogen Pins: Kann ich die analogen Pins auf dem Arduino für mein Projekt als digital verwenden?

Kevin Mark
quelle
1
Obwohl es genau so war, wie Sie es erklärt haben, hat mich die Arduino-Referenz verwirrt, die falsche Informationen enthält.
Tyilo
1
Sie können auch nur tun , analogReadauf analoge Stifte! Auf der anderen Seite analogWritekönnen sowohl die analogen als auch die PWM-Pins verwendet werden.
Tyilo
1
@ Tyilo Ich habe meine Antwort mit genaueren Informationen aus dem Quellcode aktualisiert.
Kevin Mark
3
analogWrite () kann an jedem der Pins aufgerufen werden, tut aber nur etwas an den PWM-Pins. Bei Nicht-PWM-Ditial-Pins und allen analogen Pins wird einfach digitalWrite () aufgerufen.
Baldengineer
3
@ Powtac - Es ist allgemein anerkannt, dass die Arduino-Dokumentation ziemlich abscheulich ist, zumindest hier. Haben Sie nicht das Gefühl, etwas zu verpassen, es sind nicht Sie, es sind die Arduino-Leute.
Connor Wolf
3

Ich habe Stunden damit verbracht. Ich dachte, ich hätte ein Hardwareproblem. Es stellt sich heraus, dass ich analogRead()falsch angerufen habe .

Falscher (fehlerhafter Beispielcode von Falscher DFRobot 😣):

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

Richtig:

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

Aktualisieren : analogRead()Nimmt GPIO-Pin-Nummern an. A0usw. sind #definiert für Arduino-Pin-Nummern, wobei A0 == 36.

Seien Sie vorsichtig: Auf dem FireBeetle ESP32 entspricht der Pin mit der Bezeichnung "IO36 / A0" (GPIO36) Arduino A0, aber "IO39 / A1" (GPIO39) entspricht Arduino A3(nicht A1), "IO34 / A2" (GPIO34) entspricht Arduino A6(nicht A2) , etc.

jrc
quelle