部品 · 読了まで17分

Arduino Unoのピン配置:デジタル、PWM、アナログ、電源ピンを解説

Arduino Unoのピン配置を1つの表で:デジタルピン0〜13、PWMの~3、5、6、9、10、11、アナログA0〜A5、Vin、5V、3.3V、I2C、SPI、割り込みピン、ピンあたり20 mAの上限。

Arduino Unoのピン配置は、ボードの2つの長辺に沿って並ぶ黒いメスのピンヘッダーにある32の接続点で構成されています。14本のデジタル入出力ピン(0〜13)とそのうちPWMを出力できる6本(~3、5、6、9、10、11)、6本のアナログ入力(A0〜A5)、そしてボードに給電したりほかの部品に電源を供給したりする電源ピン(Vin、5V、3.3V、GND、IOREF、AREF、RESET)です。どのピンにもおもな役割がありますが、多くのピンは2つ目の役割も持っています。A4とA5はI2Cバスでもあり、10〜13はSPIバスを構成し、2と3は割り込みピン、0と1はパソコンと通信するシリアル線です。

正しいピンを選べるかどうかで、一度で動くプロジェクトになるか、何時間もデバッグすることになるかが決まります。この記事の表を見れば、サーボをつないだとたんに9番と10番のPWMが止まる理由、Bluetoothモジュールをつないでいるとスケッチが書き込めない理由、数個のLEDでボードに負担がかかる理由も簡単にわかります。最後には、すべての種類のピンを一度に試すテスト用スケッチ、ピン割り当ての例、Uno R3とR4のピンの違いも紹介します。

Arduino Uno R3のボードとピン
Arduino Uno R3:上の辺にデジタルピン(0〜13)、下の辺に電源ピンとアナログ入力(A0〜A5)、右の辺に2×3のICSPヘッダーがあります。

Arduino Unoのピン配置図:各ピンはどこにある?

USBソケットと電源ジャックを左にして、ボードを手前に置きます。上の辺の2つのヘッダーにはデジタルピンがあり、番号は右から左へ増えていくので、一番右のピンが0(RX)、一番左のデジタルピンが13です。下の辺では、左のヘッダーに電源ピン、右のヘッダーにアナログ入力があります。番号の横の~(チルダ)は、そのピンがPWMを出力できることを示します。ボードの右の辺にある2×3のオスピンのまとまりがICSPヘッダーです。

ヘッダーピン(左から右)用途
上の左(10ピン)SCL, SDA, AREF, GND, 13, 12, ~11, ~10, ~9, 8I2Cの複製、アナログ基準電圧、SPIとデジタルピン
上の右(8ピン)7, ~6, ~5, 4, ~3, 2, TX→1, RX←0デジタルピン、割り込みピン、シリアル線
下の左(8ピン)未使用(NC)、IOREF、RESET、3.3V、5V、GND、GND、Vin電源ピン
下の右(6ピン)A0, A1, A2, A3, A4, A5アナログ入力(A4/A5はI2Cも兼ねる)
右の辺(2×3)1 MISO, 2 5V, 3 SCK, 4 MOSI, 5 RESET, 6 GNDICSP書き込み用ヘッダー
項目Arduino Uno R3
マイコンATmega328P、16 MHz
動作(ロジック)電圧5 V
入力電圧(ジャック / Vin)推奨7〜12 V、限界6〜20 V
デジタル入出力14ピン(D0〜D13)
PWM出力6ピン:3、5、6、9、10、11
アナログ入力6ピン(A0〜A5)、10ビット(0〜1023)
ピンあたりの電流推奨20 mA、絶対最大40 mA
合計の電流(VCC/GND)200 mA
3.3Vピンの電流最大50 mA
メモリフラッシュ32 KB(ブートローダー0.5 KB)、SRAM 2 KB、EEPROM 1 KB

ピンの一覧表:D0〜D13とA0〜A5

ピンポートおもな機能追加の機能メモ
D0(RX)PD0デジタル入出力UART RX(Serial)USBシリアル変換チップにつながっている。空けておく
D1(TX)PD1デジタル入出力UART TX(Serial)USBシリアル変換チップにつながっている。空けておく
D2PD2デジタル入出力外部割り込みINT0ボタン、エンコーダー、回転数の計測
D3 ~PD3デジタル入出力、PWM 490 Hz外部割り込みINT1、Timer2tone()の再生中はPWMが乱れる
D4PD4デジタル入出力-追加の機能なし、自由に使える
D5 ~PD5デジタル入出力、PWM 980 HzTimer0millis()と同じタイマー
D6 ~PD6デジタル入出力、PWM 980 HzTimer0millis()と同じタイマー
D7PD7デジタル入出力-追加の機能なし、自由に使える
D8PB0デジタル入出力-追加の機能なし、自由に使える
D9 ~PB1デジタル入出力、PWM 490 HzTimer1ServoライブラリがPWMを無効にする
D10 ~PB2デジタル入出力、PWM 490 HzSPI SS、Timer1SPIを使うときは出力のままにする
D11 ~PB3デジタル入出力、PWM 490 HzSPI MOSI、Timer2ICSPヘッダーにもある
D12PB4デジタル入出力SPI MISOICSPヘッダーにもある
D13PB5デジタル入出力SPI SCKボード上のLのLEDがこのピンにある
A0PC0アナログ入力デジタル14-
A1PC1アナログ入力デジタル15-
A2PC2アナログ入力デジタル16-
A3PC3アナログ入力デジタル17-
A4PC4アナログ入力I2C SDA、デジタル18I2Cの使用中はアナログの読み取り不可
A5PC5アナログ入力I2C SCL、デジタル19I2Cの使用中はアナログの読み取り不可
必要なときは、アナログピンも通常のデジタルピンとして使えます。A0 = 14、A1 = 15 … A5 = 19です。pinMode(A2, OUTPUT)と書いてLEDを点けたり、digitalRead(A3)でボタンを読んだりできるので、Unoでは合計20本のデジタルピンが使えます。表の「ポート」の列は、ATmega328Pの内部でのピンの本当の名前(デジタル13 = PB5)で、ポートを直接操作する高速なコードを書くときに役立ちます。A6とA7は、NanoやPro Miniなどのボードにしかありません。

デジタルピン(0〜13)のしくみ

各デジタルピンはpinMode()で入力か出力に設定します。出力では、digitalWrite(pin, HIGH)でピンが約5 Vに、LOWで0 Vになります。入力では、digitalRead()が電圧をしきい値と比べます。ATmega328Pが5 Vで動いているとき、3.0 Vより上は確実にHIGH、1.5 Vより下は確実にLOWで、その間は不定です。そのため、3.3 Vのセンサーの出力はUnoではふつうHIGHとして読めます。ただし、Unoの5 Vの出力を3.3 Vのモジュールの入力に直接つないではいけません。間にレベル変換モジュールが必要です。

何もつながっていない入力ピンは浮いた状態で、手を近づけるだけでもHIGHとLOWがでたらめに読めます。解決策は、抵抗でピンを決まった電圧に引っぱることです。pinMode(pin, INPUT_PULLUP)でチップ内部の20〜50 kΩの抵抗がオンになり、ボタンはピンとGNDの間に入れます。詳しくはArduinoに押しボタンをつなぐ方法をご覧ください。13番ピンはボード上のLのLEDにつながっています。純正品のR3ではこのLEDはオペアンプのバッファを通して駆動されるので、ピンを入力として使っても問題ありませんが、一部の互換品ではLEDと抵抗がピンに直接つながっていて、内部プルアップでのボタンの読み取りを乱すことがあります。

PWMピン(~3、5、6、9、10、11)とタイマー

Unoは本物のアナログ出力を出せません。その代わり、この6本のピンでは、とても速くオン・オフを繰り返す方形波であるPWMが使えます。analogWrite(pin, value)で、波がオンになっている長さを0〜255で設定します。0は完全にオフ、127はおよそ半分、255は完全にオンです。LEDの明るさ、モーターの速度、ファンの回転は、すべてこの方法で制御します。6本のPWMピンは2本ずつ3つのハードウェアタイマーに結びついていて、これが一部のライブラリとの競合の原因です。PWMの考え方とデューティ比の計算方法はPWMとは?で解説しています。

タイマーPWMピン周波数このタイマーを使うもの
Timer0(8ビット)5, 6約980 Hzmillis()、delay()、micros()
Timer1(16ビット)9, 10約490 HzServoライブラリ
Timer2(8ビット)3, 11約490 Hztone()やIRremoteなどのライブラリ
Servoライブラリを使ったとたん、サーボがつながっていなくても9番と10番ではanalogWrite()が効かなくなります。tone()でブザーを鳴らしている間は、3番と11番のPWMも乱れます。プロジェクトにサーボとブザーの両方があるなら、安全なPWMピンは5番と6番です。この2本のPWMはmillis()と同じタイマーから作られるため、とても小さい値(0〜10)では、予想より少し長くオンになることがあります。

アナログピン(A0〜A5)とAREF

アナログピンは0〜5 Vの電圧を10ビットの分解能で測り、analogRead()は0〜1023の数値を返します。1ステップは約4.9 mVです。数値を電圧に直すには電圧 = 値 × 5.0 / 1023を使うので、512なら約2.5 Vです。6本のピンは1つのADCを順番に共有し、1回の読み取りに約100 µsかかるので、1秒に約10,000回読み取れます。正確な結果を得るには、センサーの出力インピーダンスが10 kΩを超えないようにします。それより高いと、2本のピンを続けて読んだときに値が互いに混ざることがあり、最初の値を捨てて2回目の値を使うと解決します。5 Vを超える電圧を測るには、分圧回路の計算ツールで適切な抵抗を選びましょう。

AREFピンを使うと、アナログ測定の上限を変えられます。analogReference(DEFAULT)は5 Vを、analogReference(INTERNAL)はチップ内部の1.1 Vの基準電圧を、analogReference(EXTERNAL)はAREFピンに加えた電圧(0〜5 V)を範囲の上限として使います。0〜1 Vを出力するセンサーなら、1.1 Vの基準電圧で1ステップが約1.1 mVに縮み、測定が約4.5倍細かくなります。ポテンショメーター、LDR、土壌水分センサーなどの部品はこれらのピンにつなぎます。アナログ・デジタル変換について詳しくはADCの記事を、実際の例はポテンショメーターの記事をご覧ください。

AREFピンに外部の電圧を加える場合は、最初のanalogRead()の前に必ずanalogReference(EXTERNAL)を呼んでください。そうしないと、チップ内部の基準電圧と外部の電圧がショートし、マイコンが壊れることがあります。また、アナログピンに5 Vを超える電圧やマイナスの電圧を加えてはいけません。

電源ピン:Vin、5V、3.3V、GND、IOREF、RESET

ピン役割上限と注意点
Vinジャックから来る電圧を出す、または7〜12 Vでボードに給電する逆接続防止ダイオードを通らないので極性に注意
5VレギュレーターかUSBからの5 V出力USBには500 mAのヒューズ。外から入れるのは安定化した5 Vのみ
3.3Vボード上のレギュレーターからの3.3 V出力最大50 mA。RC522のような小さなモジュール用
GND共通GND(下に2本、上に1本)外部電源のGNDはすべてここにつなぐ
IOREFボードのロジック電圧をシールドに知らせるUnoでは5Vにつながっている。給電用ではない
RESETLOWにするとボードが再起動するシールドのリセットボタンが使う
AREFアナログ読み取り用の外部基準電圧の入力0〜5 V。先にanalogReference(EXTERNAL)を呼ぶ
NC(表示のないピン)R3では将来のために予約どこにもつながっていない

Unoへの給電方法は3つあります。USBでは、ボードはパソコンから5 Vを直接受け取り、500 mAの復帰型ヒューズがパソコンのポートを守ります。DCジャックかVinから7〜12 Vを入れると、ボード上のレギュレーターが5 Vに下げます。両方つながっている場合、Vinが約6.6 Vを超えると、ボードは自動で外部電源に切り替わります。レギュレーターは余分な電圧を熱に変えるので、12 V入力で5Vピンから数百mAを取り出すとすぐに熱くなります。最も健全なのは、サーボ、モーター、LEDテープなどの負荷を別の電源から給電し、GNDだけをつなぐ方法です。電池の選び方と動作時間は電池寿命の計算ツールで、すべての給電方法はArduinoの電源の取り方で確認できます。

5Vピンには決して5 Vを超える電圧を入れないでください。レギュレーターを通らないため、6 Vを超えるとATmega328Pが壊れることがあります。うっかり9 Vの電池を5Vピンにつなぐのは、初心者がボードを壊す最も多い原因の1つです。電池は必ずDCジャックかVinピンにつなぎましょう。

0番と1番のピンを空けておくべき理由

0番(RX)と1番(TX)のピンはATmega328Pの唯一のハードウェアシリアルポートで、ボード上では1 kΩの抵抗を通してUSBシリアル変換チップ(ATmega16U2)につながっています。パソコンは、コードを書き込むときとシリアルモニタに文字を送るときにこの2本のピンを使います。Bluetoothモジュールなどの信号のTX線が0番ピンにつながっていると、2つの信号源が同じ線を奪い合い、書き込みがavrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00(同期できない)で止まります。さらに、Serial.print()が実行されるたびに1番ピンが細かく切り替わるので、そこにつないだLEDやリレーがでたらめに動きます。

そのため、ほかのピンが足りなくなるまでは0番と1番を空けておきましょう。HC-05、GPS、MP3プレーヤーなどのシリアルモジュールをつなぐ必要があるなら、SoftwareSerialライブラリでほかの2本のピンに2つ目のシリアルポートを作れます。下のスケッチはモジュールを8番(RX)と7番(TX)のピンにつなぎ、シリアルモニタで入力した文字をモジュールへ、モジュールが送った文字をパソコンへ転送します。HC-05のような3.3 Vロジックのモジュールでは、UnoのTX出力(7番ピン)を分圧回路を通してモジュールのRXピンにつなぎます。書き込みのトラブルの対処法はArduinoにコードが書き込めないときに、シリアル通信のしくみはUARTシリアル通信にまとめています。

C++ (Arduino IDE)
1#include <SoftwareSerial.h>
2
3SoftwareSerial moduleSerial(8, 7);   // RX = 8, TX = 7; 0 ve 1 boş kalır / 0 and 1 stay free
4
5void setup() {
6  Serial.begin(9600);                // USB üzerinden bilgisayar / computer over USB
7  moduleSerial.begin(9600);          // HC-05 veri modu hızı / HC-05 data mode baud rate
8  Serial.println(F("Seri kopru hazir / Serial bridge ready"));
9}
10
11void loop() {
12  if (moduleSerial.available()) {
13    Serial.write(moduleSerial.read());   // modülden bilgisayara / module to computer
14  }
15  if (Serial.available()) {
16    moduleSerial.write(Serial.read());   // bilgisayardan modüle / computer to module
17  }
18}

通信用のピン:I2C(A4/A5)、SPI(10〜13)、割り込みピン(2、3)

I2Cを使うと、わずか2本の線(SDAとSCL)で同じバスに何十ものデバイスをつなげます。LCDディスプレイ、OLED、RTC時計モジュール、BME280などのセンサーはどれもI2Cを使います。Unoでは、SDA = A4、SCL = A5です。R3のボードでAREFの横にあるSDAとSCLのピンは別のバスではなく、内部でA4とA5につながっているので、I2Cを使っている間はA4とA5をアナログの読み取りに使えません。Wireライブラリは初期設定で100 kHzで動き、Wire.setClock(400000)で400 kHzまで上げられます。アドレス、プルアップ抵抗、I2CスキャナーのスケッチはI2Cとは?で、実際の例はI2C LCDディスプレイの使い方で紹介しています。

SPIはより高速ですが、線が多く必要です。MOSI = 11、MISO = 12、SCK = 13、SS(CS) = 10です。SDカードモジュール、RFIDリーダー、TFTディスプレイはSPIを使います。複数のデバイスでバスを共有でき、MOSI、MISO、SCKは共通で、デバイスごとに専用のCSピンを割り当てます。大切な点として、SPIがマスターモードの間は、10番ピンを出力のままにしておく必要があります。10番ピンを入力にしてLOWに引っぱられると、ATmega328Pは自分でスレーブモードに切り替わり、SPIが止まります。MISO、MOSI、SCKはICSPヘッダーにもあり、そこからSPIにつなぐシールドもあります。詳しくはSPIとは?とRFID RC522をご覧ください。

割り込みを使うと、loop()がその瞬間に何をしていても、ピンの変化をすぐにとらえられます。Unoの外部割り込みは2番(INT0)と3番(INT1)のピンにしかありません。attachInterrupt(digitalPinToInterrupt(2), function, FALLING)のように書き、トリガーのモードはLOW、CHANGE、RISING、FALLINGから選べます。エンコーダー、回転数センサー、水流センサー、決して見逃してはいけないボタンはこれらのピンにつなぎます。ほかのピンにも「ピン変化割り込み」(PCINT)がありますが、同じポートのピンが1つの割り込み関数を共有するため、どのピンが変化したかはコードで調べる必要があります。ルールと例はArduinoの割り込みで紹介しています。

機能Arduino UnoESP32(DevKit)Raspberry Pi Pico
I2C SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
SPI MOSI / MISO / SCK / CS11 / 12 / 13 / 10GPIO 23 / 19 / 18 / 5GP19 / GP16 / GP18 / GP17
UART TX / RX1 / 0GPIO 1 / 3(USBにつながっている)GP0 / GP1
外部割り込み2と3のみすべてのGPIOすべてのGPIO
PWM6ピン出力できるほぼすべてのピンすべてのGPIO
アナログ入力6ピン、10ビットADC1:GPIO 32〜39、12ビットGP26、GP27、GP28。12ビット
ロジックレベル5 V3.3 V(5 Vトレラントではない)3.3 V(5 Vトレラントではない)
ピンあたりの電流20 mA(最大40 mA)推奨は約20 mA初期設定で4 mA、最大12 mA

ESP32やPicoに移るときの最大の違いは電圧です。どちらのボードも3.3 Vで動き、ピンは5 Vトレラントではないので、Unoに直接つないでいた5 Vのモジュールにはレベル変換が必要になることがあります。一方、これらのボードはほぼすべてのピンで割り込みとPWMが使え、I2CとSPIのバスもほかのピンに移せます。ボードを比べるにはArduinoとESP32の違いは?を、ピンの配置図を見るにはピン配置ツールを使いましょう。ボードそのものについてはESP32とは?とRaspberry Pi Picoとは?で解説しています。

ICSPヘッダーは何のためにある?

ICSP(In-Circuit Serial Programming)は、USBやブートローダーを使わず、SPIの線で直接マイコンにプログラムを書き込むための2×3のヘッダーです。ボードの右の辺にあるICSPはATmega328P用で、USBソケットの横にある小さなICSP1はUSBシリアル変換チップ(ATmega16U2)用です。ふだんの使い方では触れませんが、ブートローダーが壊れたとき、新しいATmega328Pにブートローダーを書き込むとき、USBaspなどの書込装置でコードを書き込むときにICSPを使います。ArduinoISPのスケッチ例で2台目のUnoを書込装置にする場合は、書込装置側の10、11、12、13番ピンをターゲットのボードのRESET、MOSI、MISO、SCKの線につなぎ、書込装置のUnoのRESETとGNDの間に10 µFのコンデンサを入れて自動リセットを防ぎます。ボードが壊れていないか調べるには、Arduinoが壊れたかどうかの確認方法をご覧ください。

ICSPのピン信号Unoでの対応ピン
1MISOD12
2VCC(+5 V)5V
3SCKD13
4MOSID11
5RESETRESET
6GNDGND

ピンあたり20 mA、合計200 mA:電流の上限

Unoのピンを安全に使えるのは20 mAまでです。ATmega328Pのデータシートにある40 mAは絶対最大定格で、それを超えるとチップが永久に壊れることがある値であり、動作させる値ではありません。チップのVCCとGNDピンを流れる合計の電流は200 mAを超えてはいけません。データシートではピンをグループにも分けています。電流を出す(HIGH)ときは、D0〜D4とA0〜A5の合計、D5〜D13の合計をそれぞれ150 mA未満に、電流を吸い込む(LOW)ときは、D0〜D4、D5〜D13、A0〜A5の各グループを100 mA未満に保ちます。赤のLEDを5 Vから220 Ωの抵抗で駆動すると、電流は(5 − 2) / 220 ≈ 13.6 mAです。10個のLEDを同時に点けると合計136 mAで、200 mAは下回りますが、すべて同じグループにあると、グループの上限150 mAにかなり近づきます。LEDがピンのLOWで点く配線(5Vからピンへ抵抗)で、ほとんどが同じグループにあると、100 mAの上限を超えてしまいます。LEDをグループに分散させるか、抵抗を330〜470 Ωに上げましょう。適切な抵抗はLEDの抵抗の計算ツールかオームの法則の計算ツールで求められます。

  • モーター:小さなDCモーターでも数百mAを流し、電圧スパイクを生みます。L298Nなどのモータードライバかトランジスタを使いましょう。
  • リレーのコイル:5 Vリレーのコイルは約70〜90 mAを流します。トランジスタとダイオード付きのリレーモジュールを使いましょう。
  • サーボモーター:信号線はピンにつないでかまいませんが、サーボの電源は5Vピンではなく別の電源から取ります。詳しくはサーボモーターの記事をご覧ください。
  • LEDテープとハイパワーLED:12 Vのテープや1 WのLEDには、ロジックレベルのMOSFETが必要です。
  • ショート:HIGHになっている出力をGNDに直接つなぐと、ピンから40 mAをはるかに超える電流が流れ、ピンが二度と使えなくなります。

テスト用スケッチ:デジタル、PWM、アナログ、割り込みのピンをまとめて試す

  1. 220 Ωの抵抗を通して9番ピンにLEDをつなぎます。長い足を抵抗へ、短い足をGNDへつなぎます。
  2. ポテンショメーターの両端の足を5VとGNDに、中央の足をA0につなぎます。
  3. 2番ピンとGNDの間にボタンをつなぎます。内部プルアップを使うので、抵抗は不要です。
  4. スケッチを書き込み、シリアルモニタを開いて9600ボーに設定します。
  5. ポテンショメーターを回すと、9番ピンのLEDの明るさが変わり、電圧が2.5 Vを超えるとボード上のLのLED(13番ピン)が点き、ボタンを押すたびにカウンターが1つ増えます。
C++ (Arduino IDE)
1const byte BUTTON_PIN = 2;    // kesme pini INT0 / interrupt pin INT0
2const byte PWM_LED    = 9;    // ~9: PWM çıkışı / PWM output
3const byte STATUS_LED = 13;   // kart üzerindeki L LED'i / onboard L LED
4const byte POT_PIN    = A0;   // analog giriş / analog input
5
6volatile unsigned int pressCount = 0;   // ISR içinde değişir / changed inside the ISR
7
8void onButton() {
9  static unsigned long lastPressMs = 0;
10  unsigned long now = millis();
11  if (now - lastPressMs > 50) {         // 50 ms sıçrama filtresi / 50 ms debounce
12    pressCount++;
13    lastPressMs = now;
14  }
15}
16
17void setup() {
18  Serial.begin(9600);                   // 0 ve 1 numaralı pinleri kullanır / uses pins 0 and 1
19  pinMode(STATUS_LED, OUTPUT);
20  pinMode(PWM_LED, OUTPUT);
21  pinMode(BUTTON_PIN, INPUT_PULLUP);    // dahili pull-up direnci / internal pull-up resistor
22  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), onButton, FALLING);
23}
24
25void loop() {
26  int raw = analogRead(POT_PIN);        // 0-1023 arası ham değer / raw value 0-1023
27  float volts = raw * 5.0 / 1023.0;     // volta çevir / convert to volts
28  analogWrite(PWM_LED, raw / 4);        // 0-255 arası PWM / PWM from 0 to 255
29  digitalWrite(STATUS_LED, volts > 2.5 ? HIGH : LOW);   // 2,5 V eşiği / 2.5 V threshold
30
31  noInterrupts();                       // sayacı güvenle kopyala / copy the counter safely
32  unsigned int presses = pressCount;
33  interrupts();
34
35  Serial.print(F("A0: "));
36  Serial.print(raw);
37  Serial.print(F("  V: "));
38  Serial.print(volts, 2);
39  Serial.print(F("  Buton / Button: "));
40  Serial.println(presses);
41  delay(200);
42}

このスケッチでは、Unoの4種類のピンを同時に使っています。analogRead(A0)は0〜1023の値を読み、raw / 4でanalogWrite()が受け付ける0〜255の範囲に縮めます。チャタリングを数えないように、割り込み関数は前回の押下から50 ms以内に来た信号を無視します。割り込みの中で変わるカウンターはvolatileで宣言し、loop()では割り込みを一瞬止めている間にコピーします。8ビットのUnoは16ビットの数値を2回に分けて読むため、その間に割り込みが来ると間違った値になることがあるからです。0番と1番のピンはSerialだけに使い、ほかには何もつないでいません。

ピン割り当ての例:どの部品をどのピンにつなぐ?

部品の多いプロジェクトでピンを適当に割り当てると、競合が起きます。まず特別な役割(I2C、SPI、割り込み、PWM)を持つ部品を専用のピンに置き、それから単純なデジタルの役割を空いているピンに割り当てます。下は、RFIDカードのドアロックの例です。RC522リーダー、I2C LCD、サーボ、ブザー、ボタン、LED 2個を使います。サーボとtone()を一緒に使うので、3、9、10、11番のPWMは最初から使えず、割り当てではそれを考慮しています。

部品Unoのピンこのピンにした理由
RC522のSDA(SS)10SPIのSSピン。出力のままにする必要がある
RC522のSCK / MOSI / MISO13 / 11 / 12ハードウェアSPIのピンは変えられない
RC522のRST9どのデジタルピンでもよい。9番のPWMはサーボのためどのみち使えない
RC522のVCC3.3Vモジュールは3.3 Vで動き、電流も上限の50 mA未満
I2C LCDのSDA / SCLA4 / A5Unoの唯一のI2Cバス
サーボの信号6Servoライブラリはどのピンでも動く。電源は外部の5 Vから
ブザー8tone()はどのピンでも動くので、PWMピンをむだにしない
ボタン2割り込みピン。INPUT_PULLUPなら抵抗は不要
緑 / 赤のLED4 / 7追加の機能のない普通のデジタルピン
空けておく0, 1, 3, 5, A0–A3シリアル線は空けておく。3は2つ目の割り込み、5はPWM、A0〜A3はセンサー用

Arduino Uno R3とR4のピンの違い

項目Uno R3Uno R4(Minima / WiFi)
マイコンATmega328P、8ビット、16 MHzRenesas RA4M1、32ビット、48 MHz
ピン配置標準のUno同じ。シールドが使える
ピンあたりの電流20 mA8 mA
アナログの分解能10ビット初期設定で10ビット、最大14ビット
本物のアナログ出力(DAC)なしA0に12ビットDAC
0番と1番のピンUSBと共有(Serial)USBとは別(Serial1)
Vinの範囲推奨7〜12 V6〜24 V
USBUSB-B、ATmega16U2経由USB-C。Minimaはプロセッサに直接、WiFiはESP32-S3のブリッジ経由

まとめると、R4でもピン番号と機能は同じですが(PWMは~3、5、6、9、10、11、I2CはA4/A5、SPIは10〜13、割り込みは2、3)、ピンあたりの電流が8 mAに下がります。R3でピンから直接駆動していたLEDは、R4ではより大きな抵抗(たとえば約3 mAになる1 kΩ)かトランジスタが必要です。詳しい比較はArduino Uno R4にあります。もっと小さなボードを探しているなら、Arduino Nanoのピン配置とどのArduinoを買えばいい?が役に立ちます。

よくある失敗と対処法

症状原因対処法
スケッチが書き込めない、「not in sync」エラー0番か1番のピンにモジュールがつながっている書き込み中はモジュールを外すか、SoftwareSerialでほかのピンに移す
サーボを追加したらLEDの明るさが変わらなくなったServoライブラリが9番と10番のPWMを無効にしたLEDを3、5、6、11番に移す
ブザーが鳴っている間、モーターの速度がおかしくなるtone()がTimer2を使い、3番と11番に影響するPWMを5、6、9、10番に移す
アナログの値が勝手に変わるピンが浮いている、または信号源のインピーダンスが高すぎるセンサーをしっかりつなぎ、必要なら2回読む
ボタンがでたらめに押されたように見える入力ピンが浮いているINPUT_PULLUPを使うか、10 kΩの抵抗を入れる
I2Cディスプレイをつなぐと、A4/A5の値がおかしくなるA4/A5はI2Cバスと共有されているアナログセンサーはA0〜A3につなぐ
SPIモジュールが応答しない10番ピンを入力にした、またはCSが違う10番ピンは出力のままにし、デバイスごとに専用のCSを割り当てる
ボードが熱くなる、または勝手にリセットするピンや5Vピンから電流を取りすぎている負荷は別の電源から給電し、GNDをつなぐ
プロジェクトを始める前に、部品、ピン、目的を書いた小さなピン割り当てを紙に書いておきましょう。コードの最初で、const byte LED_PIN = 9;のようにピンを名前付きの定数として定義すれば、部品を別のピンに移すときも1行変えるだけで済みます。ボードが予期せず再起動するなら、Arduinoがリセットを繰り返すときの診断手順に沿って確認しましょう。

Arduino Unoのピンがわかれば、部品をどこにつなぐかを暗記する必要はありません。部品に何が必要かを見て、正しいピンを自分で選べるようになります。基本をもう一度おさらいしたいなら、Arduinoとは?から始めましょう。BlueGraysアプリには、LEDの点灯、ボタンの読み取り、LDRでの明るさの測定、PWMでのRGB LED、I2C LCD、RFID、シリアル線で通信する2台のArduinoなどのプロジェクトがあり、それぞれ各ピンを選んだ理由がわかる回路図とすぐに使えるコード付きで、ステップごとに学べます。

よくある質問

Arduino Unoにはピンが何本ありますか?

Arduino Uno R3には、14本のデジタル入出力ピン(0〜13)と6本のアナログ入力(A0〜A5)があります。アナログピンはデジタルピンとしても使えるので、信号用のピンは合計20本です。デジタルピンのうち6本はPWMが使えます。さらに、Vin、5V、3.3V、GND、IOREF、AREF、RESETなどの電源・制御ピンと、6ピンのICSPヘッダーがあります。

Arduino UnoのPWMピンはどれですか?

PWMピンは3、5、6、9、10、11番で、ボード上では番号の横に~が付いています。5番と6番は約980 Hz、ほかは約490 Hzで動きます。Servoライブラリを使うと9番と10番のPWMが、tone()を使うと3番と11番のPWMが影響を受けます。

Arduinoのアナログピンはデジタルピンとして使えますか?

はい。UnoのA0〜A5のピンは、pinMode、digitalWrite、digitalReadで普通のデジタルピンと同じように動き、14〜19番に対応します。そのため、A0にLEDを、A3にボタンをつなげます。唯一の例外は、I2Cを使っている間はA4とA5がバス専用になることです。

Arduino Unoのピンはどのくらいの電流を流せますか?

1本のピンから安全に取り出せるのは20 mAです。40 mAは絶対最大定格で、それを超えるとピンが永久に壊れることがあります。全ピンの合計は200 mAを超えてはいけません。そのため、LEDは抵抗を通してつなぎ、モーターやリレーなどの負荷はトランジスタ、MOSFET、ドライバモジュールで駆動します。

Arduino Unoの0番と1番のピンは使えますか?

使えますが、おすすめしません。これらのピンはUSBシリアル変換チップにつながっていて、パソコンはコードの書き込みやシリアルモニタの使用にこの線を使います。0番ピンにモジュールがつながっていると、書き込みが「not in sync」エラーで失敗することがあるので、これらのピンは最後に使うか、SoftwareSerialでほかのピンに切り替えましょう。

Arduino UnoのSDAとSCLのピンはどれですか?

Unoでは、I2CバスのSDA線がA4ピン、SCLがA5ピンです。R3のボードにはAREFの横にSDAとSCLと書かれた2本のピンもありますが、内部でA4とA5につながっていて、別のバスではありません。ESP32の初期設定のI2CピンはGPIO 21と22です。Raspberry Pi PicoではI2Cを多くのピンに移せますが、GP4(SDA)とGP5(SCL)が最もよく使われます。

全プロジェクトを見る
LEDの点滅
#1初級

LEDの点滅

電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

4.6(188)
1127
ボタンでLEDを点灯(押している間のみ)
#9初級

ボタンでLEDを点灯(押している間のみ)

呼び鈴のように、押している間は点灯し、離すと消灯します。Arduinoはボタンの状態を常に読み取り、押されている間はLEDを点灯させ、指を離した瞬間に消灯させます。このシンプルな回路で、ボードが外部からの操作を検知する仕組みを学べます。

4.8(113)
229
LDRで光の強さを測定
#11初級

LDRで光の強さを測定

部屋の明るさを数値で見てみませんか?光に反応する小さな部品、LDRで周囲の光を測定し、Arduinoが0.5秒ごとにその値をコンピューターの画面に表示します。手で覆うと数値が変わる様子を確認できます。自動で点灯する常夜灯などのプロジェクトへの第一歩です。

4.6(81)
139
HC-SR04で距離を測定(シリアルモニタ表示)
#27初級

HC-SR04で距離を測定(シリアルモニタ表示)

HC-SR04センサーは、コウモリが暗闇で道を見つけるのと同じ仕組みで動作します。人には聞こえない音を出し、その反響を捉えて前方の物体までの距離を測ります。Arduinoは0.5秒ごとに距離をセンチメートル単位でコンピューターの画面に表示し、3〜100センチメートルの測定値を示します。駐車センサーや障害物を避けるロボットなどのプロジェクトの基礎になります。

4.6(46)
71
RGB LEDで滑らかに色を変える
#40初級
プレミアム

RGB LEDで滑らかに色を変える

1つのRGB LEDが赤から緑、緑から青、そして再び赤へとゆっくり変わり、虹色のサイクルを繰り返します。1回の色の変化には約2.5秒かかり、色が混ざることで、その間に黄色、ターコイズ、紫が自然に現れます。光が滑らかに暗くなったり明るくなったりする様子を、自分の目で確かめられます。

4.8(58)
76
I2CでLCDディスプレイを使う
#32初級
プレミアム

I2CでLCDディスプレイを使う

Arduinoにディスプレイを接続し、最初のメッセージを表示します。2行のLCDディスプレイは数本の配線だけで接続できます。まず上の行にあいさつを表示し、次に下の行にもう1つのメッセージを表示します。その後、表示を消去して最初から繰り返します。温度や時刻、スコアを表示するプロジェクトは、すべてこのステップから始まります。

4.8(53)
70
RFIDの値の読み取り
#53初級
プレミアム

RFIDの値の読み取り

建物のキーフォブや入館カードには、見えない識別番号が保存されています。このプロジェクトでは、その番号を読み取ります。カードをRFIDリーダーに近づけると、Arduinoがカードの番号をコンピューターの画面に表示します。カード式のドアや錠のプロジェクトで、どのカードに解錠を許可するかを決めるための第一歩です。

4.7(47)
61
2台のArduinoで一方向通信
#57中級
プレミアム

2台のArduinoで一方向通信

2台のArduinoを1本のワイヤーで通信させます。一方のボタンを押すともう一方のLEDが点灯し、もう一度押すと消灯します。送信側のボードがボタンの押下を短いメッセージで伝え、受信側のボードはそのメッセージを受け取るとLEDの点灯と消灯を切り替えます。機器同士が情報を伝える仕組みを、最もシンプルな形で確かめられます。

4.4(37)
50