動作
Arduinoボードのピンの入出力モードを以下のいずれかに設定します。
| モード | 内容 |
|---|---|
| 入力モード・プルアップなし(デフォルト) | ピンの電圧を読み取るモード 内部プルアップ抵抗は無効 |
| 入力モード・プルアップあり | ピンの電圧を読み取るモード 内部プルアップ抵抗は有効 |
| 出力モード | ピンの電圧を制御するモード |
入力モード設定時は、digitalRead関数やanalogRead関数でピンの電圧を読み取ることができます。入力モード設定は、内部プルアップ抵抗の有効・無効設定も可能です。
出力モード設定時は、digitalWritre関数、analogWrite関数、tone関数などでピンの電圧を制御することができます。
pinMode関数でモードを指定しない場合、デフォルトは「入力モード・プルアップなし」になります。
書式
pinMode(pin, mode);| 引数 | pin | 入出力モードを設定するピンを指定します。 ピン番号(10など)やピン名(A5)で指定します。 |
mode | INPUT:入力・プルアップなし(デフォルト)INPUT_PULLUP:入力・プルアップありOUTPUT:出力 | |
| 戻り値 | なし | |
使用例
次のコードにより、指定したピンの入出力モードを設定します。
pinMode(10, INPUT_PULLUP); // 10番ピンをプルアップ付きの入力モードに設定
pinMode(A5, OUTPUT); // A5ピンを出力モードに設定サンプルスケッチ
3番ピンに接続したスイッチの状態を読み取り、スイッチが押されたことを検知したら5番ピンに接続したLEDを1秒間点灯するスケッチです。
ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度
ボタンをクリックして停止してから再度シミュレーターを開始してください。
ピンの入出力モードは、デフォルトでINPUT(プルアップなしの入力モード)ですが、サンプルのようにOUTPUT(出力モード)やINPUT_PULLUP(プルアップありの入力モード)にする場合、必ずpinMode関数で指定する必要があります。
トラブルシューティング
pinMode関数でOUTPUTを指定してもdigialWriteで制御できない
pinMode(ピン, OUTPUT);と指定したにもかかわらず、digitalWrite関数で制御できない場合、そのピンが入力専用(出力制御できない)ピンである可能性があります。
代表的なボードでは次のピンは出力制御できないため注意が必要です。
| 製品 | デジタル出力制御できないピン (digitalWriteが使えないピン) |
|---|---|
| Arduino Nano | A6、A7 |
| ESP32 | GPIO34、35、36、39 |
| ESP8266 | A0 |
実践テクニック
pinMode関数を使ったテクニック集です。
1つのピンにスイッチとLEDを接続して制御する
ピンの入出力モードは、スケッチの実行中いつでもpinMode関数で切り替えることができます。
例えば、1つのピンにスイッチとLEDを接続して、入力モードと出力モードを切り替えながら制御することができます。
次のサンプルは、5番ピンにLEDとスイッチを接続しています。スケッチでは、通常はピンを入力モード(INPUT)にしてスイッチの状態を確認しています。確認した結果、スイッチが押されていた場合、ピンを出力モードに設定してLEDを1秒間点灯する、という制御をしています。
ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度
ボタンをクリックして停止してから再度シミュレーターを開始してください。
1つのピンにスイッチと圧電スピーカーを接続して制御する
上のテクニックはLEDを使用した例ですが、1つのピンに圧電スピーカーとスイッチを接続した場合、回路の特性を考慮したスケッチが必要です。
圧電スピーカーは一般的にPWM信号で制御しますが、制御直後(音を鳴らした直後)は圧電スピーカーに電荷が溜まった状態になっていることがあります(圧電スピーカーは電極が向かい合った構造になっているため、電圧を加えると電荷が溜まります)。つまり、圧電スピーカー制御直後に、接続したピンの状態を読み取るとHIGHになっていることがあります。
これを避けるためには、制御直後にしばらく時間待ちをして、圧電スピーカーに溜まった電荷を逃す必要があります。
次の例では、圧電スピーカーの制御直後に500ms時間待ちをして(delay(500);)、並列に接続した抵抗を利用して電荷を逃しています。
ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度
ボタンをクリックして停止してから再度シミュレーターを開始してください。
補足
内部プルアップ抵抗
内部プルアップ抵抗は50kΩ〜100kΩ程度の比較的高い抵抗値になっています。
そのため、digitalRead関数でスイッチ状態の読み取りを行うと、値が安定しない場合があります。その場合はスイッチ回路にプルアップ抵抗を接続する方法もあります(外部回路に接続する場合、プルダウン抵抗を接続しても問題ありません)。
例えば、次のようにスイッチ回路にプルアップ抵抗を接続すると、安定してスイッチ状態を読み取ることができます。(外部回路にプルアップ抵抗を接続した場合、pinMode関数でINPUT_PULLUPを指定する必要はない点に注意してください)
Arduinoボード内部動作
Arduinoボードの内部動作は次のようになっています。次のイラストは、例として5番ピンの内部のようすを示しています。(以下の回路は実際にこのようになっているわけではなく、半導体部品(FETなど)で構成されています)

pinMode関数で指定するINPUT、INPUT_PULLUP、OUTPUTのそれぞれの設定時のArduinoボード内部回路状態は次のようになります。
INPUTを指定した場合
INPUTを指定した場合、内部プルアップは無効になります。

INPUT_PULLUPを指定した場合
INPUT_PULLUPを指定した場合、5番ピンは内部プルアップ抵抗に接続されます。

OUTPUTを指定した場合
OUTPUTを指定した場合、5番ピンはdigitalWriteで制御するスイッチに接続されます。

ピンが出力モードの時、上のイラストのようにプルアップ抵抗は無効になります。
ただし、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関数が実装されているケースもあります。
