ArduinoのpinMode()は、指定したピンを「出力(OUTPUT)」「入力(INPUT)」「内部プルアップ付き入力(INPUT_PULLUP)」のどれとして使うかを決める関数です。LEDなど外へ信号を送るピンはOUTPUT、ボタンやセンサーの信号を受け取るピンはINPUTかINPUT_PULLUPを指定し、ふつうはsetup()の中に書きます。
pinMode(ピン番号, モード); // モードは INPUT / OUTPUT / INPUT_PULLUP

| モード | ピンの役割 | 主な用途 | 配線上の注意点 | 初心者向けの使い分け |
|---|---|---|---|---|
OUTPUT |
デジタル出力(HIGH/LOWを出す) | LEDの点灯、ブザー、ほかの回路への信号 | LEDには電流制限抵抗が必須。モーターなど大電流の部品は直接つながない | 「Arduinoから何かを動かしたい」ならこれ |
INPUT |
高インピーダンスの入力(電圧を読むだけ) | HIGH/LOWを出力するセンサー・モジュールの読み取り | 何もつながっていない・スイッチが開いている状態だと値が不安定(フローティング) | 相手がHIGH/LOWをはっきり出す部品のとき |
INPUT_PULLUP |
入力+内部プルアップ抵抗を有効化 | ボタン・スイッチの読み取り | 外付けのプルアップ抵抗は不要。ボタンはピンとGNDの間につなぐ。押すとLOW | ボタンを読むなら、まずこれ |
- LEDを光らせる →
OUTPUT - ボタンを読む →
INPUT_PULLUP(押していないとHIGH、押すとLOW) - HIGH/LOWを出力するセンサーを読む →
INPUT
Arduinoそのものが初めての方は、先にArduino入門ガイド(IDEの準備からBlinkまで)でLED点滅を体験しておくと、この記事のコードがスムーズに読めます。
pinMode()とは?まず意味と書き方を理解しよう
Arduinoの基板に並んでいるデジタルピン(Unoなら0〜13番)は、同じ端子を「信号を送る係」にも「信号を受け取る係」にも切り替えられます。その役割を決めるのがpinMode()です。受付窓口に「今日は発行窓口」「今日は受付窓口」と貼り紙を出しておくようなもの、とイメージすると覚えやすいでしょう。

pinMode(ピン番号, モード)の基本構文
カッコの中には2つの値を書きます。1つ目がピン番号、2つ目がモード(INPUT・OUTPUT・INPUT_PULLUPのいずれか)です。pinMode()は値を返しません。
void setup() {
pinMode(8, OUTPUT); // 8番ピン:LEDなどへ信号を出す
pinMode(7, INPUT); // 7番ピン:センサーの信号を読む
pinMode(2, INPUT_PULLUP); // 2番ピン:内部プルアップ付きでボタンを読む
}
void loop() {
}
- 大文字・小文字は区別されます。
pinmodeやoutputと書くとコンパイルエラーになります。 - A0〜A5などのアナログ入力ピンも、
pinMode(A0, OUTPUT)のようにデジタルピンとして使えます。ただしArduino NanoのA6・A7はアナログ入力専用で、デジタル入出力には使えません。 - ピン番号は
const int LED_PIN = 8;のように名前を付けておくと、配線を変えたときに1か所直すだけで済みます。
pinMode()はsetup()に書くのが基本
ピンの役割は、ふつう電源が入っている間ずっと変わりません。そのため、起動時に1回だけ実行されるsetup()に書くのが基本です。loop()に書いても文法エラーにはなりませんが、毎回同じ設定をやり直すだけで意味がなく、コードも読みにくくなります(途中でピンの役割を切り替える特殊な回路では、あえてloop()内で変えることもあります)。setup()とloop()の実行順序はsetup()とloop()の違いと実行順序の解説で詳しく説明しています。
INPUT・OUTPUT・INPUT_PULLUPの違い【比較表】
3つのモードの違いは、「電気の流れる向き」と「ピンの内部状態」で整理できます。
| 項目 | OUTPUT | INPUT | INPUT_PULLUP |
|---|---|---|---|
| 信号の向き | Arduino → 外部部品 | 外部部品 → Arduino | 外部部品 → Arduino |
| 使う関数 | digitalWrite() |
digitalRead() |
digitalRead() |
| ピンの電気的な状態 | 低インピーダンス(電流を流し出す・吸い込む) | 高インピーダンス(電流をほとんど流さず電圧を見る) | 高インピーダンス+内部抵抗で電源側へ引き上げ |
| 何もつながっていないとき | — | 値が不定(フローティング) | HIGHで安定 |
| ボタンを押したとき(ピン〜GND配線) | — | 別途プルアップ/プルダウン抵抗が必要 | LOW |
OUTPUT|LEDなどを制御する出力設定
OUTPUTにしたピンは、digitalWrite()でHIGH(Uno・Nanoでは約5V)かLOW(0V)の電圧レベルを出します。注意したいのは、HIGHは「電圧を出している」状態であって、「必ず電流が流れる」わけではないことです。実際に流れる電流は、つないだ回路(LEDと抵抗など)で決まります。
出力ピンが流せる電流は小さく、ボードによって上限も違います(Uno R4では1ピンあたり8mAと、Uno R3より小さい)。モーター・リレー・大きなLED群などは、ピンに直接つながず、トランジスタやモータードライバを介して制御します。
INPUT|外部信号を読み取る入力設定
INPUTにしたピンは高インピーダンス状態になり、電流をほとんど流さずに「今の電圧がHIGHかLOWか」だけを読みます。センサーモジュールのように出力側がHIGH/LOWをはっきり出す部品なら、追加の抵抗なしでそのまま読めることも多いです。一方、ボタンのように「つながる/つながらない」だけの部品では、押していないときにピンが宙に浮き、値が不安定になります。
なお、公式リファレンスによるとINPUTを指定すると内部プルアップは明示的に無効になります。
INPUT_PULLUP|内部プルアップ抵抗を使う入力設定
INPUT_PULLUPは、入力にしたうえでマイコン内蔵のプルアップ抵抗を有効にするモードです。何もつながっていないときのピンが電源側(HIGH)に引き上げられるので、外付けのプルアップ抵抗を用意しなくてもボタンを安定して読めます。「配線が要らない」のではなく、「ボタンとGNDの配線だけで済み、抵抗の部品を省ける」という点がポイントです。
OUTPUTの使い方|LEDを点滅させるコード

必要な部品と接続方法
まずは外付け部品なしで試せる内蔵LEDから始め、次に外付けLEDへ進みます。
- 必要な部品
- Arduinoボード、データ通信対応USBケーブル(外付けLED版はLED×1、抵抗×1、ブレッドボード、ジャンパーワイヤ)
- 対象ボード
- Arduino Uno R3 / Uno R4 Minima・WiFi / Nano
- 配線
- 内蔵LED版:不要(
LED_BUILTINはUno R3・R4・NanoではD13)
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // 内蔵LEDのピンを出力にする
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // HIGHを出力 → 点灯
delay(500); // 0.5秒待つ
digitalWrite(LED_BUILTIN, LOW); // LOWを出力 → 消灯
delay(500);
}
実行時の動作:基板上の「L」と書かれたLEDが0.5秒ごとに点滅します。
次は外付けLEDです。LEDには向きがあり、必ず電流制限抵抗を直列に入れます。抵抗値はボードの電流仕様に合わせて選びます。
- 配線
- D8 → 抵抗 → LEDの長い足(アノード)/LEDの短い足(カソード) → GND(抵抗はLEDのGND側に入れても同じ)
- 抵抗の目安
- 下の表を参照。迷ったら1kΩ(少し暗いが十分見える)
| ボード | 1ピンあたりの電流(公式仕様) | 赤色LEDの抵抗の目安 | 流れる電流の概算 |
|---|---|---|---|
| Uno R3 / Nano | 20mA(ATmegaの絶対最大定格は40mA) | 220Ω以上 | (5V−約2V)÷220Ω ≒ 約14mA |
| Uno R4 Minima / WiFi | 8mA | 470Ω以上 | (5V−約2V)÷470Ω ≒ 約6mA |
| どのボードでも安全側 | — | 1kΩ | 約3mA |
※LEDの順方向電圧を約2Vとした概算です。LEDの色や品番で変わるため、正確にはLEDのデータシートを確認してください。抵抗値の計算はArduinoでLEDを光らせる基本回路と抵抗値計算、ブレッドボードの穴のつながりはブレッドボード入門で解説しています。
動くコードと1行ずつの解説
const int LED_PIN = 8; // 外付けLEDをつないだピン
void setup() {
pinMode(LED_PIN, OUTPUT); // 8番ピンを出力に設定
}
void loop() {
digitalWrite(LED_PIN, HIGH); // 8番ピンをHIGH → LED点灯
delay(500);
digitalWrite(LED_PIN, LOW); // 8番ピンをLOW → LED消灯
delay(500);
}
| 行 | 意味 |
|---|---|
const int LED_PIN = 8; |
「8」にLED_PINという名前を付ける。constは途中で値を変えないという印 |
pinMode(LED_PIN, OUTPUT); |
8番ピンを出力にする。setup()で1回だけ実行 |
digitalWrite(LED_PIN, HIGH); |
ピンをHIGHにする。抵抗とLEDを通ってGNDへ電流が流れ、LEDが光る |
delay(500); |
500ミリ秒(0.5秒)待つ |
実行時の動作:外付けLEDが0.5秒ごとに点滅します。よくある間違い:LEDの向きが逆、抵抗とLEDをブレッドボードの別グループに挿している、GNDにつないでいない、の3つが大半です。
pinMode()を書き忘れた場合の違い
Uno R3やNanoなどATmega系のボードでは、ピンは起動直後に入力になっています。この状態でpinMode(LED_PIN, OUTPUT)を書き忘れてdigitalWrite(LED_PIN, HIGH)を実行すると、出力にはならず内部プルアップ抵抗がオンになるだけです。プルアップ経由のわずかな電流でLEDがとても暗く光る、またはほとんど見えない、という症状になります。「LEDが暗い」と感じたら、まずpinMode()を疑ってください。ほかのマイコンを使うボードでは症状が異なることがあります。
INPUTの使い方|センサーやボタンを読み取る

digitalRead()との役割の違い
pinMode()は「役割を決める」だけで、それ自体は値を読んだり出したりしません。実際の入出力は別の関数が担当します。
| 関数 | 役割 | pinMode()との関係 |
|---|---|---|
pinMode() |
ピンの役割(入力/出力/プルアップ付き入力)を決める | — |
digitalWrite() |
出力ピンをHIGH/LOWにする | OUTPUTを指定してから使う |
digitalRead() |
ピンがHIGHかLOWかを読む | 通常はINPUTかINPUT_PULLUPを指定して使う |
analogRead() |
アナログ入力ピン(A0など)の電圧を数値で読む(Unoの初期設定は0〜1023) | ADCでの読み取りにpinMode()は不要 |
OUTPUTに設定したピンにdigitalRead()を使ってもエラーにはなりません。ただしその場合に読めるのは基本的にそのピン自身の現在の出力レベルで、外部センサーの信号を読み取る使い方ではありません。外部の信号を読みたいピンは、入力モードに設定しましょう。アナログ値の読み方はanalogRead()とanalogWrite()の違いと使い方で解説しています。
// HIGH/LOWを出力するセンサーモジュールのOUT端子をD7へ
// センサーのVCCを5V、GNDをGNDへ(モジュールの仕様を確認)
const int SENSOR_PIN = 7;
void setup() {
pinMode(SENSOR_PIN, INPUT);
Serial.begin(9600);
}
void loop() {
int state = digitalRead(SENSOR_PIN);
Serial.println(state); // 1(HIGH)または 0(LOW)
delay(200);
}
センサーがHIGHとLOWのどちらで「検知」を表すかは製品ごとに違います。使うモジュールの説明書を確認してください。
フローティングと外付け抵抗
フローティングとは、入力ピンがどこにも電気的に固定されず、周囲のノイズや指を近づけただけでHIGHとLOWがばらばらに変わる状態です。INPUTのピンにボタンだけをつなぐと、押していない間はこの状態になります。
対策は、ピンを抵抗でどちらかに固定しておくことです。
- プルダウン抵抗:ピンとGNDの間に10kΩ程度。ボタンはピンと5Vの間 → 押すとHIGH
- プルアップ抵抗:ピンと5Vの間に10kΩ程度。ボタンはピンとGNDの間 → 押すとLOW
- INPUT_PULLUP:上のプルアップ抵抗をマイコン内蔵のもので代用 → 押すとLOW
Uno R3など多くのボードでは、D13に基板上のLEDと抵抗がつながっています。そのため公式ドキュメントでは、D13はほかのピンより入力として使いにくく、どうしても使う場合はINPUT+外付けプルダウン抵抗にするよう案内されています。ボタン入力には、D2などほかのピンを使うのが無難です。
5V・GND・デジタルピンの関係から確認したい方はArduino配線の基本も参考にしてください。
INPUT_PULLUPの使い方|ボタンを押すとLOWになる理由

内部プルアップ抵抗の仕組み
マイコンの各ピンには、ソフトウェアでオン・オフできるプルアップ抵抗が内蔵されています。INPUT_PULLUPを指定すると、この抵抗を通してピンが電源電圧側へ引き上げられます。抵抗値はマイコンによって異なり、Arduino公式のボード資料では、ATmega328P系のボードで20〜50kΩと案内されています。ほかのボードの値は、そのボードの公式資料で確認してください。
抵抗値が大きいので、ピンを強く「HIGHに縛りつける」わけではありません。外からGNDにつなげば、簡単にLOWへ引き下げられます。この性質を利用するのがボタン入力です。
ボタンとGNDの接続方法
- 必要な部品
- Arduinoボード、タクトスイッチ×1、ジャンパーワイヤ、ブレッドボード
- 対象ボード
- Arduino Uno R3 / Uno R4 / Nano
- 配線
- タクトスイッチの片側 → D2、反対側 → GND(抵抗は不要)
4本足のタクトスイッチは、2本ずつが内部でつながっています。どの2本が「押すとつながる組」か迷ったら、対角線上の2本を使うと確実です。
const int BUTTON_PIN = 2; // ボタン:D2とGNDの間
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // 内部プルアップを有効にした入力
Serial.begin(9600);
}
void loop() {
int state = digitalRead(BUTTON_PIN);
if (state == LOW) {
Serial.println("LOW:押している");
} else {
Serial.println("HIGH:押していない");
}
delay(200);
}
実行時の動作:シリアルモニタ(速度9600 baud)を開くと、ボタンを押していない間は「HIGH:押していない」、押している間は「LOW:押している」と表示されます。よくある間違い:ボタンを5V側につないでいる(INPUT_PULLUPでは常にHIGHのままになる)、同じ内部グループの足を2本使っていて押しても状態が変わらない、など。
押していないとHIGH、押すとLOW
- 押していないとき:ピンは内部プルアップ抵抗だけで電源側につながっている →
HIGH - 押したとき:ピンがボタンを通してGNDに直結される → GNDの方が圧倒的に強く、
LOW
つまり「押す=LOW」は故障ではなく、この配線の正しい動作です。コードではif (digitalRead(BUTTON_PIN) == LOW)を「押されている」と読み替えます。「押すたびにオン・オフを切り替える」処理では、接点のバタつき(チャタリング)対策も必要になります。詳しくはタクトスイッチの使い方(配線・チャタリング対策)で解説しています。
実践|ボタンを押している間だけLEDを点灯する

必要なもの・配線・動作条件
- 必要な部品
- Arduinoボード、タクトスイッチ×1、LED×1、抵抗×1(Uno R3/Nanoは220Ω以上、Uno R4は470Ω以上、迷ったら1kΩ)、ブレッドボード、ジャンパーワイヤ
- 対象ボード
- Arduino Uno R3 / Uno R4 / Nano
- 配線
- ボタン:D2 ⇔ GND(対角の足)/LED:D8 → 抵抗 → LEDアノード(長い足)、LEDカソード(短い足)→ GND
- 動作条件
- USB給電で可。ボタン用の外付け抵抗は不要
Arduinoコード全文
const int BUTTON_PIN = 2; // ボタン:D2とGNDの間
const int LED_PIN = 8; // LED:D8 → 抵抗 → LED → GND
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // ボタンは内部プルアップ付き入力
pinMode(LED_PIN, OUTPUT); // LEDは出力
}
void loop() {
int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) { // LOW = 押されている
digitalWrite(LED_PIN, HIGH); // 点灯
} else {
digitalWrite(LED_PIN, LOW); // 消灯
}
}
実行時の動作:ボタンを押している間だけLEDが点灯し、離すと消灯します。「押している間だけ」の動作なので、チャタリング対策がなくても実用上ほぼ問題ありません。ifとelseの書き方はArduinoのif文の書き方で解説しています。
if (buttonState == HIGH)と書いてしまい、押していないときに点灯する(INPUT_PULLUPは押すとLOW)==(比較)を=(代入)と書いてしまう- 2つのピンのpinMode()を入れ替えてしまう
動かないときの確認手順
- LEDだけ確認:コード例3を書き込み、外付けLEDが点滅するか見る。点滅しなければLED側の配線(向き・抵抗・GND)が原因
- ボタンだけ確認:コード例4を書き込み、シリアルモニタでHIGH/LOWが切り替わるか見る。変わらなければボタンの足の向きか、D2・GNDの配線が原因
- 両方OKなら:コード例5のピン番号と、実際の配線のピン番号が一致しているか確認
このように部品を1つずつ確かめると、原因が「LED側」「ボタン側」「コード側」のどれかすぐ絞り込めます。
pinMode()でよくあるエラーと解決方法
症状から原因の候補を探せるようにまとめました。原因は1つとは限らないので、上から順に確認してください。
| 症状 | 主な原因 | 確認方法 | 対処法 |
|---|---|---|---|
| LEDが光らない | LEDの向きが逆/GND未接続/ピン番号違い/LED不良 | コード例2で内蔵LEDが点滅するか、外付けLEDの長い足がピン側か | 向き・配線を直す。別のLEDに交換して試す |
| digitalWrite()でHIGHにしても点灯しない・とても暗い | pinMode(ピン, OUTPUT)の書き忘れ/抵抗値が大きすぎる | setup()にOUTPUT指定があるか、抵抗のカラーコード | OUTPUTを追加。抵抗値をボードの目安内で見直す |
| INPUTの値が安定しない | フローティング(プルアップ/プルダウンなし) | 何も触らずに値がばらつくか | INPUT_PULLUPに変更するか、10kΩ程度の外付け抵抗を入れる |
| INPUT_PULLUPでボタンを押すとLOWになる | 正常な動作 | 押していないときにHIGHなら正常 | コードの判定を== LOWで「押された」と扱う |
| ボタンを押しても状態が変わらない | ボタンの同じ内部グループの足を使っている/ボタンが5V側に接続/ピン番号違い | コード例4で値を表示 | 対角の足を使う。D2とGNDの間につなぎ直す |
| ピン番号を間違えた | コードの番号と基板の挿し位置の不一致 | 基板の印字とコードの番号を1本ずつ照合 | 定数(const int)で番号を一元管理する |
| OUTPUTとINPUTを逆に設定した | LEDのピンをINPUT、ボタンのピンをOUTPUTにしている | setup()内の各pinMode()を確認 | 役割に合わせて直す。出力ピンをGNDに直結した状態でHIGHにすると過電流のおそれがあるため注意 |
| pinModeをpinmodeと書いた | 大文字・小文字の違い | エラー文に'pinmode' was not declared in this scope |
pinMode(Mだけ大文字)に直す |
| セミコロンを忘れた | 行末の;漏れ |
エラー文にexpected ';'。表示行の1行前を確認 |
行末に;を追加 |
| LEDの抵抗を省いた・複数LEDを1ピンにつないだ | ボードの電流仕様を超えている可能性 | 抵抗値とLED数を確認(Uno R4は1ピン8mA) | 適切な抵抗を入れる。大電流はトランジスタ等で駆動 |
書き込みエラーやセンサー全般のトラブルは、Arduinoトラブル解決大全に症状別でまとめています。
pinMode()に関するよくある質問
pinMode()はすべてのピンで必ず書く必要がありますか?
出力として使うピンには必要です。Uno R3などATmega系のボードは起動時にピンが入力になっているため、INPUTとして使うだけなら省略しても動きます。ただし意図を明確にするため、使うピンにはすべて書いておくのがおすすめです。analogRead()でアナログ値を読む場合や、analogWrite()を使う場合はpinMode()は不要です。
pinMode()を書き忘れるとどうなりますか?
出力のつもりのピンが入力のままになります。Uno R3やNanoでは、その状態でdigitalWrite(HIGH)を実行すると内部プルアップがオンになるだけなので、LEDがとても暗く光るなどの症状になります。
INPUTとINPUT_PULLUPはどちらを使えばいいですか?
ボタンやスイッチならINPUT_PULLUPが手軽です。HIGH/LOWをはっきり出力するセンサーモジュールならINPUTで読めることが多いですが、製品の説明書でプルアップの要否を確認してください。押したときにHIGHにしたい場合は、INPUT+外付けプルダウン抵抗を使います。
なぜINPUT_PULLUPではボタンを押すとLOWになるのですか?
押していないときは内部抵抗でピンが電源側(HIGH)に引き上げられ、押すとボタンを通してGNDに直結されるからです。直結されたGNDの方が強いため、ピンはLOWになります。
OUTPUTに設定したピンをdigitalRead()で読むとどうなりますか?
エラーにはなりませんが、読めるのは基本的にそのピン自身の出力レベルです。外部のボタンやセンサーを読みたい場合は、INPUTかINPUT_PULLUPに設定してください。
A0などのアナログピンにもpinMode()は使えますか?
使えます。pinMode(A0, OUTPUT)のようにデジタルピンとして扱えます。ただしArduino NanoのA6・A7はアナログ入力専用です。また、analogRead()で電圧を読むだけならpinMode()は不要です。
Uno R3とUno R4でpinMode()の書き方は違いますか?
書き方は同じです。違うのは電気的な仕様で、たとえば1ピンあたりの電流はUno R3が20mA、Uno R4が8mAです。LEDの抵抗値などはボードの公式仕様に合わせて選んでください。違いの詳細はArduino Uno R3とR4の違いで解説しています。
ボタンの値が不安定なときはどうすればいいですか?
まずINPUT_PULLUPになっているか、ボタンがピンとGNDの間にしっかり挿さっているかを確認します。押した瞬間に値がバタつく場合はチャタリングなので、短い待ち時間を入れるなどの対策をします。
まとめ|3つのモードの使い分けと次の学習
- OUTPUT:Arduinoから信号を出す。LEDには必ず抵抗を入れ、大電流の部品は駆動回路を介す
- INPUT:高インピーダンスで信号を読む。何もつながないとフローティングになる
- INPUT_PULLUP:内部プルアップで外付け抵抗を省ける。ボタンはピンとGNDの間、押すとLOW
- pinMode()はsetup()に書くのが基本。書き忘れると「LEDが暗い」などの症状になる
まずは実践コード(コード例5)を配線して、ボタンを押した瞬間にLEDが反応するのを確かめてみてください。入力と出力がつながれば、センサーで動きを変える作品づくりに進めます。次に何を学べばよいかはArduino学習ロードマップで、ステップごとに整理しています。
- Arduino入門ガイド
- setup()とloop()
- タクトスイッチの使い方
- analogRead()とanalogWrite()
- Arduinoのif文
- ブレッドボード入門
- Arduinoトラブル解決大全
- Arduino学習ロードマップ
参考(Arduino公式):pinMode() リファレンス/Digital Pins/Input Pullup Serial/digitalRead() リファレンス(2026年10月確認)
※掲載コードはコード例です。ボードの種類・互換機・部品の個体差によって動作が異なる場合があります。
コメント