The Arduino Uno is one of the most popular microcontroller boards for makers, hobbyists, and educators, and for good reason. It’s versatile, beginner-friendly, and opens the door to endless electronics projects. But before you start tinkering with your UNO, there’s one thing you absolutely need to understand—the pinout.
This guide will walk you through the different types of pins on the Arduino Uno, what they do, and how to use them.
So grab your Uno, and get ready to dive into this pin-tastic adventure!
Note:
While this guide focuses on the Arduino Uno R3 pinout, it’s important to note that a newer version, the Arduino Uno R4, is available. The R4 comes with some notable differences, including a faster processor and expanded capabilities.
Arduino Uno Pinout
The Arduino Uno has 32 pins in total. The pinout is as follows:

Let’s take a closer look at the Arduino pins and their functions one by one.
Arduino Uno Digital I/O Pins
The Arduino Uno has 14 digital I/O pins, labeled D0 to D13.
These pins can be configured as either inputs or outputs. When set as inputs, they can read digital signals (HIGH or LOW), and when set as outputs, they can send digital signals to control external components like LEDs, motors, and relays.

To tell the Arduino whether a digital pin should be an input or an output, you use a special function called pinMode(). For example, to set a digital pin as an input, you use the pinMode(pin, INPUT) function, and then digitalRead(pin) function to read the input pin’s state. For setting a pin as an output, you use the pinMode(pin, OUTPUT) function, and then digitalWrite(pin, HIGH) or digitalWrite(pin, LOW) to set it HIGH or LOW.
Please note that these pins operate at a 5V logic level, and each pin can source or sink a maximum of 20 mA of current.
Internal Pull-up Resistors
Each digital pin on the Arduino Uno has a built-in pull-up resistor. You can enable this resistor when you’re using a pin as an input by using pinMode(pinNumber, INPUT_PULLUP). This helps when nothing is connected to the input pin—without the resistor, the pin can sometimes “float” and pick up random electrical noise, making it hard for the Arduino to tell if it’s HIGH or LOW. The internal pull-up resistor weakly pulls the pin’s voltage up to HIGH, keeping it steady.
The value of this pull-up resistor is not exact, but it usually falls between 20 kΩ and 50 kΩ.
Arduino Uno Interrupt Pins
Interrupt pins are special digital input pins that can trigger a specific block of code (an interrupt service routine or ISR) when an external event occurs, such as a change in voltage level (HIGH to LOW or vice versa). This allows the Arduino to respond immediately to events without constantly checking the pin’s state in the main loop of your code.
The Arduino Uno has two dedicated hardware interrupt pins:

These pins can be configured to trigger an interrupt on a rising, falling, or changing signal edge. This is useful for tasks that require immediate attention, like reading a sensor that needs to be processed quickly.
The attachInterrupt(interrupt, ISR, mode) function is used to configure the pins as external interrupts, where interrupt is the interrupt number (0 for pin 2, 1 for pin 3), ISR is the interrupt service routine (a function to be called when the interrupt occurs) and mode defines the trigger condition (RISING, FALLING, or CHANGE).
Please keep in mind that Interrupt 0 (pin 2) has higher priority than Interrupt 1 (pin 3). If both interrupts are triggered simultaneously, Interrupt 0 will be serviced first.
Arduino Uno PWM Pins
PWM pins on the Arduino Uno are digital pins that can simulate analog output. They achieve this by rapidly switching the pin between HIGH and LOW states, creating a square wave signal. The ratio of the “ON” time to the total period of the signal is called the duty cycle. By varying the duty cycle, you can control the average voltage delivered to a connected component, allowing you to dim LEDs, control motor speeds, and even generate simple audio tones.
The Arduino Uno provides 6 PWM-capable digital pins: D3, D5, D6, D9, D10, and D11. These pins are marked with a tilde (~) symbol next to their pin number on the board.

The PWM output is an 8-bit signal, meaning it can take any value from 0 to 255. This translates to 256 discrete levels of duty cycle.
The pinMode(pin, OUTPUT) function is used to set the desired PWM pin as an output. The analogWrite(pin, value) function is then used to set the PWM value on a pin. Here, pin is the PWM-capable pin number, and value is an integer between 0 and 255.
analogWrite(pin, 0): Sets the duty cycle to 0% (always off).analogWrite(pin, 127): Sets the duty cycle to approximately 50%.analogWrite(pin, 255): Sets the duty cycle to 100% (always on).
The default frequency of the PWM signal is approximately 490 Hz on all pins, except for pins D5 and D6 which have a frequency of around 980 Hz.
The PWM pins on the Arduino Uno are associated with different timers of the ATmega328P microcontroller:
- D3 and D11: Controlled by Timer 2.
- D5 and D6: Controlled by Timer 0.
- D9 and D10: Controlled by Timer 1.
You can manipulate the timers directly to change the frequency and mode of PWM by configuring the registers of the ATmega328P microcontroller. However, doing this also affects functions like delay() and millis(), which rely on Timer 0.
Arduino Uno ADC Pins
Analog input pins on the Arduino Uno are designed to read continuous analog signals. These signals often come from sensors that measure physical quantities like temperature, light intensity, or pressure. The Arduino Uno converts these analog signals into digital values using an Analog-to-Digital Converter (ADC), allowing you to process and analyze the data within your Arduino code.
The Arduino Uno has six analog input pins, labeled A0 to A5.

The ADC on the Arduino Uno has a resolution of 10 bits, which means it can detect 1024 (2^10) discrete analog levels. In other words, it will convert input voltages ranging from 0 to 5V (operating voltage) into integer values ranging from 0 to 1023. This results in a resolution of 5 volts / 1024 units, or approximately 0.0049 volts (4.9 mV) per unit.
This level of precision is generally sufficient for most of our projects, but for more precise measurements, an external ADC with a higher resolution should be used.
To read an analog value from a pin, you use the analogRead(pin) function. This function returns an integer value between 0 and 1023, representing the measured voltage on the pin. For example, if the pin is measuring a voltage of 2.5V (half of the maximum 5V), the analogRead() function will return approximately 512.
Keep in mind that the analog pins (A0-A5) can also be used as digital pins if you need extra digital I/O.
Changing Reference Voltage
By default, the ADC measures voltages from 0V to 5V, but this range can be adjusted using the AREF pin and the analogReference(type) function. Possible values for the type are:
DEFAULT: Uses the default analog reference of 5V.INTERNAL: Uses an internal reference voltage of 1.1V.EXTERNAL: Uses an external reference voltage applied to the AREF pin.
Arduino Uno ICSP Header Pins
The Arduino Uno has two ICSP (In-Circuit Serial Programming) headers, each with six pins.

These headers are used for:
- Programming the Arduino: You can use an external programmer (like an AVR ISP programmer or another Arduino board acting as an ISP) to upload code to the Arduino directly through the ICSP header. This is particularly useful if the bootloader is corrupted or if you want to burn a bootloader onto a new microcontroller.
- Communicating with SPI Devices: The header provides access to the SPI (Serial Peripheral Interface) pins: MISO (Master In Slave Out), MOSI (Master Out Slave In), and SCK (Serial Clock). These pins can be used to connect and communicate with SPI devices, such as SD card modules or external sensors. It’s important to note that the Slave Select (SS) pin, necessary for controlling multiple SPI devices, is not included on the header and must be controlled manually.
Arduino Uno I2C Pins
On the Arduino Uno, the I2C pins (SDA and SCL) are also available on the dedicated pins near the AREF pin. These pins are directly connected to A4 and A5 on the board, providing an alternate and often more convenient way to connect I2C devices.

Please keep in mind that both SDA and SCL lines typically require external pull-up resistors (usually around 4.7kΩ) to ensure reliable communication.
Arduino Uno SPI Pins
The Arduino Uno has a dedicated set of pins for SPI communication:

Pin 11, labeled MOSI (Master Out Slave In), is used by the master device (Arduino) to send data to the slave device. Conversely, pin 12, labeled MISO (Master In Slave Out), is used by the slave device to send data back to the Arduino. Pin 13, marked SCK (Serial Clock), carries the clock signal that synchronizes the data transfer between the master and slave. Lastly, pin 10, typically assigned as SS (Slave Select), is used to select the specific slave device you want to communicate with if you have multiple SPI devices connected.
In addition to the standard SPI pins, the Arduino Uno also has an ICSP (In-Circuit Serial Programming) header that provides access to the same SPI signals. You can use either the standard pins or the ICSP header for SPI communication.
Arduino Uno UART Pins
The Arduino Uno has a single hardware UART interface, which is mapped to the digital pins 0 (RX) and 1 (TX).

This hardware UART is also used for uploading sketches and serial communication with the computer via the USB connection, which means it is shared with the USB-to-serial converter on the board.
If you need more UART channels, the Arduino Uno supports a library called SoftwareSerial, which allows you to create additional software-based UART connections on other digital pins. However, SoftwareSerial has limitations in terms of speed and reliability compared to hardware UART.
Arduino Uno Power Pins
The Arduino Uno has several power pins. These pins are essential for powering the board itself and for supplying power to connected components and sensors.

VIN: This pin allows you to supply power to the Arduino board using an external power source like a wall adapter or a battery pack. This is useful for standalone projects where the board is not connected to a computer via USB. The input voltage range for VIN is typically 7-12 volts. The input voltage supplied to this pin is regulated down to a stable 5V by the onboard voltage regulator, which then powers the microcontroller and other components on the board. The Vin pin is internally connected to the positive terminal of the DC power jack. This means that when you supply voltage through the DC power jack, it is accessible through the Vin pin.
5V: This pin provides a regulated 5V output from the onboard voltage regulator. You can use this pin to power various components and sensors that require a stable 5V supply. The 5V pin can provide a maximum of 500mA of current if you’re powering your Arduino Uno through a USB cable. The onboard voltage regulator is technically rated for 800mA, but due to power dissipation issues, you shouldn’t go over 400 to 500mA. Should your project demand more power than the 5V pin can safely supply, you’ll need to consider an external power source.
3.3V: This pin provides a regulated 3.3V output, which is useful for components that operate at lower voltages. Be cautious not to draw excessive current from this pin, as it has a limited current capacity of approximately 50mA. It’s worth noting that the 3.3V regulator is connected to the output of the 5V regulator. Drawing current from the 3.3V regulator will dissipate heat in both the 3.3V regulator and the 5V regulator. This means that if you connect a 3.3V device to the 3.3V pin, then it also limits the maximum current you can use for the 5V modules connected to the 5V pin.
GND: This pin represents the common ground reference for all electrical connections on the Arduino. It’s essential to connect the ground pins of your external components to this pin to complete the electrical circuit.
Arduino Uno Special Function Pins

D13: This pin has an onboard LED connected to it. It illuminates when the pin is set to HIGH and turns off when set to LOW. This makes it a handy indicator for debugging or signaling the status of a project. If you use D13 for other purposes besides controlling the LED, remember that the onboard LED will also respond to changes in the pin’s state. This could be confusing if you’re unaware of the connection.
IOREF: stands for Input/Output Reference Voltage. This pin provides a voltage reference that indicates the operating voltage of the Arduino board. In the case of the Arduino UNO, the IOREF pin outputs a voltage of 5V. This pin is primarily designed for use with expansion boards called shields. When a shield is properly designed, it can read the voltage on the IOREF pin to determine the Arduino’s operating voltage. This information allows the shield to adjust its own voltage levels or enable voltage translators as needed, ensuring compatibility and avoiding potential damage due to voltage mismatches. Please keep in mind that the IOREF pin is not intended to be used as a power source for external components. Doing so could potentially damage the Arduino board.
RESET: pin is used to reset the microcontroller on the Arduino UNO, essentially restarting the program running on it. The RESET pin is active LOW, meaning that when it is pulled LOW (connected to ground), the microcontroller resets. Typically, there’s an internal pull-up resistor that keeps the RESET pin HIGH by default. You can reset the Arduino programmatically by connecting the RESET pin to a digital output pin and toggling it LOW using digitalWrite(RESET_PIN, LOW) and then back HIGH. Or you can connect an external switch or device to this pin. When the switch is closed or the device sends a LOW signal, the Arduino will reset.
