動作
Arduinoボードのピンの電圧状態をデジタルで読み取ります。
「電圧状態をデジタルで読み取る」とは、ピンの電圧が高いか低いかの2つの状態(デジタル)で読み取る、という意味です。
例えば、5V動作のArduino Unoシリーズでは、ピンの電圧が5Vであれば高い電圧(HIGH)、0Vであれば低い電圧(LOW)と読み取ります。
中間の電圧はどちらに読み取るかは状況によります。例えば4.9Vなど5Vに近い電圧はHIGH、0.2Vなど0Vに近い電圧はLOWとして読み取りますが、2.5Vなどの中間付近の電圧はどちらに読み取るかは不定になります(状況に応じてHIGHかLOW)。詳しくは「補足」セクションを参照ください。
また、ピンが出力モードになっていても(pinMode(pin, OUTPUT);に設定していても)、digitalRead関数を使用することができます。詳しくは「補足」セクションと「Arduinoボードの内部動作」セクションを参照ください。
主な用途
- プッシュボタンやトグルスイッチ状態(ONかOFFか)の読み取り
- デジタル人感センサーなどのデジタルで信号を出力するセンサーの読み取り
- 他のモジュール(他のArduinoボードなど)のデジタル出力の読み取りなど
digitalRead関数は、電圧が高いか低いかの2つの状態を読み取ります。
(「高い」と「低い」の2つの状態」=「デジタル」)
例えば温度に比例した電圧を出力する温度センサーなどの連続した電圧値を読み取ることはできません。そのような場合はanalogRead関数を使います。
書式
digitalRead(pin);| 引数 | pin | 電圧を読み取るピンを指定します。 ピン番号(10など)やピン名(A5)で指定します。 |
| 戻り値 | HIGH(=1)またはLOW(=0)(電圧が動作電圧に近い時は HIGH、0Vに近い時はLOW) | |
使用例
次のコードにより、指定したピンの電圧値をデジタルで読み取ることができます。
int button_state = digitalRead(12); // ピン番号指定 - 12ピンの電圧値を読み取って変数に代入
int switch_state = digitalRead(A5); // ピン名指定 - A5ピンの電圧値を読み取って変数に代入ピン名に「A」が付いているアナログピン(A0〜A5またはA6)もdigitalRead関数で電圧状態を読み取ることができます。
サンプルスケッチ
12番ピンに接続したスイッチの状態を読み取り、読み取った結果をシリアルモニタに表示するスケッチです。
ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度
ボタンをクリックして停止してから再度シミュレーターを開始してください。
この回路では、スイッチを離した状態で1(HIGH)、スイッチを押すと0(LOW)が表示されます。直感とは逆のイメージですが、12番ピンをpinMode関数でプルアップ抵抗付き入力(INPUT_PULLUP)に指定しているためです。
トラブルシューティング
読み取った値が安定しない
digitalRead関数で読み取った値が安定しないことがあります。
例えば、次の回路とスケッチでは、シリアルモニタに表示されるスイッチ状態の値が安定していません。(実際に動作させて確認できます。
ボタンをクリックするとシミュレーターが動作します)
シミュレーターを動作させてスイッチを押したり離したりしても、シリアルモニタに表示される値はスイッチ状態とは関係なくランダムになります。
これは、ピンに接続しているスイッチ回路がプルアップ(またはプルダウン)されていないことが原因です。解決方法は2通りあります。(プルアップの詳しい説明は「Arduino入門第19回スイッチを接続する」をご参照ください)
解決方法1:pinMode関数でINPUT_PULLUPを指定する
Arduinoボード内部にはプルアップ抵抗が内蔵されていて、それを有効にすることができます。
内部プルアップを有効にする場合、pinMode(pin, INPUT_PULLUP);と指定します。
ただし、Arduinoボード内部のプルアップ抵抗は簡易的な実装のため、有効にしてもdigitalReadで読み取った値が安定しないことがあります。その場合は解決方法2のように抵抗を接続する必要があります。
Arduinoボード(搭載マイコン)の内部プルアップ抵抗は簡易的な実装のため、抵抗値は50kΩ〜100kΩ程度と高い値になっています。プルアップ抵抗は通常10kΩ程度のものを使用しますが、抵抗値が高い場合、電気的な雑音に弱くなります。そのため、内部プルアップを有効にしても読み取り値が安定しないことがあります。その場合は次の解決方法2のように、抵抗を使用して外部回路でプルアップします。
解決方法2:プルアップ抵抗を接続する
digitalRead関数でスイッチの読み取り値が安定しない場合、スイッチ回路にプルアップ抵抗を接続する方法もあります(外部回路に接続する場合、プルダウン抵抗を接続しても問題ありません)。
例えば、次のようにスイッチ回路にプルアップ抵抗を接続すると、安定してスイッチ状態を読み取ることができます。(外部回路にプルアップ抵抗を接続した場合、pinMode関数でINPUT_PULLUPを指定する必要はない点に注意してください)
実践テクニック
digitalRead関数でデジタル制御を行う際のテクニック集です。
プルアップ有効の時、スイッチのONをHIGH、OFFをLOWにする
スイッチ回路でプルアップを有効にした場合、スイッチを離した状態がHIGH(1) 、押した状態がLOW(0) になり、感覚的には逆に感じることがあります(電気製品のスイッチに「0」と「1」が書かれていることがありますが、通常は「1」がON、つまりスイッチを押した状態を意味しています)。
プルアップを有効にした時に、スイッチOFFがLOW、スイッチONがHIGHにしたい場合、次のようにdigitalRead関数の前に!をつけます(!は論理否定の演算子で0と1を逆にします)。
int switch_status = !digitalRead(10);補足
読み取り電圧範囲
digitalRead関数でHIGHまたはLOWとして正しく読み取れる電圧にはある程度の範囲があります。この電圧範囲は、Arduinoボードに搭載されているマイコンによって異なります。
仕様書を調べるのは大変ですので、digitalRead関数でピンの電圧を読み取る場合、5V動作であれば極力0Vまたは5V近くになるように回路を製作することが吉です。
参考に、正しく読み取れる範囲がどの程度なのか、Arduino Uno R4のケースで説明します。
Arduino Uno R4は、Renesas社のRA4M1シリーズのマイコンを使用しています。Renesas社が公開しているRA4M1のデータシートを調べると、一般的な入出力ピンでは「1.0V以下がLOW、4.0V以上がHIGH」と判定されることがわかります(ピンの種類によって異なります)。回路を設計する場合、電圧範囲に注意します。
これはArduino Uno R4のケースですが、他のArduinoボードの読み取り電圧範囲を調べたい場合、次の手順で進めるのが良いでしょう。
「Arduino Uno R4 マイコン」や「Arduino Uno MCU」などのキーワードでネット検索して、搭載されているマイコンの型番を調べます。(MCU = Micro Controller Unit = マイコン)
「マイコン型番 datasheet」などのキーワードでネット検索して、仕様書があるか確認します。多くの場合、PDFファイルでダウンロードできますのでダウンロードしておきます。仕様書はできれば英語版をダウンロードしておきます。なお、マイコンによってはオンライン参照になっていることがありますので、その場合はURLをメモしておきます。
GoogleのNotebookLMで新規ノートを作成して、ダウンロードした仕様書をアップロード、または仕様書のURLを追加します。次のプロンプトで電圧範囲を調べることができます。
「I/Oポートの入力電圧のロジックレベルを教えてください」
回答には引用元のページも明示されていますので、必要に応じて確認します。
※Google NotebookLMの使い方は、このリファレンスの範囲を超えますので説明は省略します。
ピンの入出力モード
digitalRead関数はpinMode関数でOUTPUTに設定している場合でも利用することができます。
ピンの電圧が現在どちらの状態に設定されているか、digitalRead関数で読み取ることができます。
この機能をうまく利用して、ピンに接続しているLEDやモーターなどのON/OFF状態を反転させることができます。そのテクニックについては「digitalWritre関数でピンのON/OFFを反転する」をご参照ください。
Arduinoボード内部動作
Arduinoボードの内部動作は次のようになっています。次のイラストは、例として5番ピンの内部のようすを示しています。(以下の回路は実際にこのようになっているわけではなく、半導体部品(FETなど)で構成されています)

digitalRead関数はデジタルでピンの電圧状態を読み取りますので、上のようにHIGHかLOWかで読み取る電圧計が接続されています。
この電圧計は、pinMode関数が制御するスイッチよりピン側に接続されていますので、ピンの入出力モードに関わらずいつでもピンの状態を読み取ることができます。
なお、pinMode関数で入力モードに設定する場合、INPUT、INPUT_PULLUP、OUTPUTのいずれかの指定ができますが、それぞれ内部の回路状態は次のようになります。
INPUTを指定した場合
INPUTを指定した場合、内部プルアップは無効になります。5番ピンに何も接続していない場合、digitalRead関数で読み取った値は不定になります。

INPUT_PULLUPを指定した場合
INPUT_PULLUPを指定した場合、5番ピンは内部プルアップ抵抗に接続されます。5番ピンの外部に何も接続していない場合でもプルアップ抵抗によりdigitalRead関数で読み取るとHIGHになります。

OUTPUTを指定した場合
OUTPUTを指定した場合、5番ピンはdigitalWriteで制御するスイッチに接続されます。この時、内部電圧計は5番ピンに接続されたままですので、digitalReadでピンの状態を読み取ることができます。

ピンが出力モードの時、上のイラストのようにプルアップ抵抗は無効になります。
ただし、AVRマイコンを使用したArduinoボードでは、digitalWrite(pin, HIGH);により出力電圧をHIGHの状態にすると、内部プルアップ抵抗が有効になります(pinMode関数でINPUTまたはOUTPUTを指定した場合でも内部プルアップ抵抗が有効になります)。
これはAVRマイコンの仕様に起因しています。AVRマイコンでは、「ピンの入出力モード設定」と「内部プルアップ抵抗設定」は2つのレジスタで設定をしています。具体的には、DDRレジスタ(Data Direction Register・データ方向レジスタ)とPORTレジスタ(Port・入出力制御)の2つのレジスタを0か1に設定し、それぞれの設定でピンのモードは次のようになっています。
| DDRレジスタ データ方向指定 | PORTレジスタ 入出力制御 | 動作 |
|---|---|---|
| 0 | 0 | 入力・プルアップ無効 |
| 0 | 1 | 入力・プルアップ有効 |
| 1 | 0 | 出力LOW(プルアップ無効) |
| 1 | 1 | 出力HIGH(プルアップ有効) |
なお、AVRマイコン以外ではプルアップ抵抗は独立して制御される場合もあります。例えばESP32系のボードでは、プルアップ抵抗の有効無効レジスタが別に用意されていて独立して制御できますので、出力をHIGHにしてもプルアップの有効無効は連動しません(Espressif社のArduinoボード情報ファイルで実機確認)。
ただし、プルアップ抵抗を独立に制御できる場合でも、AVRマイコンの挙動に合わせてdigitalWrite関数が実装されているケースもあります。
