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);

回答:


28

Tyiloの具体的な質問に答えるには:

analogRead(5)そしてdigitalRead(5)2つの異なる場所から読み込まれます。前者は、アナログチャンネルから読み取り、5又はA5、後者はピン5から読み出されます起こるデジタルピンであること。はい、アナログピンを読みたいdigitalRead場合はを使用してくださいA5

どうして?

analogRead内部でチャンネル番号が必要ですが、ピン番号も付けることができます。ピン番号を指定すると、対応するチャンネル番号に変換されます。私が知る限りanalogRead、チャンネル番号を内部で使用する唯一の機能であり、チャンネル番号を許可する唯一の機能であり、この文書化されていないピンからチャンネルへの変換を持つ唯一の機能です。これを理解するために、いくつかの例から始めましょう。

analogRead最初のアナログピンで使用する場合は、チャンネル番号を使用するか、ピン番号を使用するかを選択A0できます。ピン番号バリアントを使用する場合、ピン番号を適切なチャネル番号に変換します。analogRead(0)analogRead(A0)analogReadA00

あなたがdigitalWrite最初のアナログピンで使用したい場合にのみ行うA0ことができます。内部でアナログチャンネルを使用せず、チャンネル番号を渡せません。まあ、それはあなたを許可しますが、間違ったピンを選択します。同じことが適用されるにも。digitalWrite(A0, x)digitalWritedigitalReadanalogWrite

によって行われたピンからチャネルへの変換は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のリファレンスに混乱しました。
ティロ

1
また、アナログピンでのみ行うことができanalogReadます!一方、analogWriteアナログピンとPWMピンの両方で使用できます。
ティロ

1
@Tyiloソースコードから取得したより正確な情報で応答を更新しました。
ケビンマーク

3
analogWrite()はどのピンでも呼び出すことができますが、PWMピンで何かをするだけです。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などは、Arduinoピン番号の#definesですA0 == 36

注意:FireBeetle ESP32などでは、「IO36 / A0」(GPIO36)というラベルのピンはArduino A0と同じですが、「IO39 / A1」(GPIO39)はArduino A3(not A1)と等しく、「IO34 / A2」(GPIO34)はArduino A6(not A2)と等しいなど

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.