Arduino Uno ATmega328P Schematic Tutorial
Overview
This tutorial guides you through designing a complete Arduino Uno compatible board using tscircuit. The Arduino Uno is one of the most popular microcontroller boards, and understanding its circuit design is foundational for electronics engineers.
System Architecture
The Arduino Uno consists of four main subsystems:
- MCU: ATmega328P — the heart of the board
- USB Interface: ATmega16U2 — USB-to-serial conversion
- Power: 5V regulator and auto-switching (USB/external)
- I/O: Digital/analog pin headers, ICSP connectors
Components
| Ref | Part | Description | Footprint |
|---|---|---|---|
| U1 | ATmega328P-PU | Main MCU, 32KB Flash, 2KB SRAM | dip-28 |
| U2 | ATmega16U2 | USB-to-Serial interface | tqfp-32 |
| U3 | NCP1117-5.0 | 5V LDO regulator | sot-223 |
| J1 | USB-B | USB Type-B connector | usb-b |
| Y1 | 16 MHz Crystal | MCU clock source | hc49 |
| R1 | Reset pull-up | 10kΩ resistor | 0805 |
| C1-C3 | Decoupling caps | 100nF ceramic | 0805 |
| C4 | Crystal load (×2) | 22pF ceramic | 0805 |
| LED_P | Power LED | Green indicator | 0805 |
| LED_L | D13 LED | Yellow activity LED | 0805 |
| JP1-JP4 | Pin headers | Digital/Analog I/O | pin_header_1x15 |
Step 1: ATmega328P MCU
The ATmega328P is an 8-bit AVR microcontroller with 32KB of flash memory:
<chip
name="U1"
footprint="dip-28"
pcbX={0}
pcbY={0}
/>
Key Pin Assignments
| Pin | Function | Description |
|---|---|---|
| 1 | RESET | Active-low reset, pulled up to 5V |
| 2-4 | PD0-PD2 | Digital I/O 0-2 (RX, TX, INT0) |
| 5-6 | PD3-PD4 | Digital I/O 3-4 (INT1, XCK) |
| 7-8 | VCC/GND | Power supply |
| 9-10 | PB6-PB7 | XTAL1/XTAL2 (crystal oscillator) |
| 11-13 | PB0-PB2 | Digital I/O 8-10 (SPI) |
| 14-17 | PB3-PB5 | Digital I/O 11-13 (SPI, PWM) |
| 18-19 | XTAL2/GND | Crystal and ground |
| 20 | AVCC | ADC power supply (connect to VCC) |
| 21 | AREF | ADC reference voltage |
| 22-27 | PC0-PC5 | Analog inputs A0-A5 |
| 28 | VCC | Power supply |
Step 2: 16 MHz Crystal Oscillator
The ATmega328P requires an external 16 MHz crystal for clock generation:
<crystal
name="Y1"
footprint="hc49"
frequency="16MHz"
pcbX={-5}
pcbY={-10}
/>
<capacitor name="C_Y1A" footprint="0805" capacitance="22pF" pcbX={-6} pcbY={-11} />
<capacitor name="C_Y1B" footprint="0805" capacitance="22pF" pcbX={-4} pcbY={-11} />
<trace from=".Y1 .1" to=".U1 > .XTAL1" />
<trace from=".Y1 .2" to=".U1 > .XTAL2" />
<trace from=".C_Y1A .pos" to=".Y1 .1" />
<trace from=".C_Y1B .pos" to=".Y1 .2" />
<trace from=".C_Y1A .neg" to="net.GND" />
<trace from=".C_Y1B .neg" to="net.GND" />
Step 3: Reset Circuit
The reset circuit ensures the MCU starts in a known state:
<resistor name="R1" footprint="0805" resistance="10k" pcbX={5} pcbY={-10} />
<capacitor name="C_RST" footprint="0805" capacitance="100nF" pcbX={7} pcbY={-10} />
<trace from="net.5V" to=".R1 .pos" />
<trace from=".R1 .neg" to=".U1 > .RESET" />
<trace from=".R1 .neg" to=".C_RST .pos" />
<trace from=".C_RST .neg" to="net.GND" />
The pull-up resistor keeps RESET high during normal operation. The capacitor provides noise filtering.
Step 4: Power Regulation
The Arduino can be powered via USB or an external barrel jack (7-12V):
<chip name="U3" footprint="sot-223" pcbX={-15} pcbY={-10} />
<trace from=".U3 .vin" to="net.VIN" />
<trace from=".U3 .gnd" to="net.GND" />
<trace from=".U3 .vout" to="net.5V" />
<capacitor name="C_IN" footprint="0805" capacitance="10uF" />
<capacitor name="C_OUT" footprint="0805" capacitance="10uF" />
<trace from="net.VIN" to=".C_IN .pos" />
<trace from="net.5V" to=".C_OUT .pos" />
<trace from=".C_IN .neg" to="net.GND" />
<trace from=".C_OUT .neg" to="net.GND" />
Step 5: LED Indicators
<led name="LED_P" color="green" footprint="0805" pcbX={-15} pcbY={10} />
<resistor name="R_LED_P" footprint="0805" resistance="330" pcbX={-17} pcbY={10} />
<trace from="net.5V" to=".R_LED_P .pos" />
<trace from=".R_LED_P .neg" to=".LED_P .pos" />
<trace from=".LED_P .neg" to="net.GND" />
<led name="LED_L" color="yellow" footprint="0805" pcbX={-10} pcbY={10} />
<resistor name="R_LED_L" footprint="0805" resistance="330" pcbX={-12} pcbY={10} />
<trace from=".U1 > .PB5" to=".R_LED_L .pos" />
<trace from=".R_LED_L .neg" to=".LED_L .pos" />
<trace from=".LED_L .neg" to="net.GND" />
Step 6: Pin Headers
<chip name="JP1" footprint="pin_header_1x15" pcbX={-25} pcbY={0} />
<chip name="JP2" footprint="pin_header_1x15" pcbX={25} pcbY={0} />
<chip name="JP3" footprint="pin_header_1x6" pcbX={-25} pcbY={-15} />
<chip name="JP4" footprint="pin_header_1x6" pcbX={25} pcbY={-15} />
Digital I/O Mapping
| Header Pin | ATmega328P Pin | Arduino Pin |
|---|---|---|
| JP1:1 | PD0 | D0 (RX) |
| JP1:2 | PD1 | D1 (TX) |
| JP1:3 | PD2 | D2 |
| JP1:4 | PD3 | D3 (PWM) |
| JP1:5 | PD4 | D4 |
| JP1:6 | PD5 | D5 (PWM) |
| JP1:7 | PD6 | D6 (PWM) |
| JP1:8 | PD7 | D7 |
Complete Circuit
export default () => {
return (
<board width="70mm" height="55mm">
{/* ATmega328P MCU */}
<chip name="U1" footprint="dip-28" pcbX={0} pcbY={0} />
{/* 16 MHz Crystal */}
<crystal name="Y1" footprint="hc49" frequency="16MHz" pcbX={-5} pcbY={-10} />
<capacitor name="C_Y1A" footprint="0805" capacitance="22pF" pcbX={-6} pcbY={-11} />
<capacitor name="C_Y1B" footprint="0805" capacitance="22pF" pcbX={-4} pcbY={-11} />
{/* Reset Circuit */}
<resistor name="R1" footprint="0805" resistance="10k" pcbX={5} pcbY={-10} />
<capacitor name="C_RST" footprint="0805" capacitance="100nF" pcbX={7} pcbY={-10} />
{/* Power Regulator */}
<chip name="U3" footprint="sot-223" pcbX={-15} pcbY={-10} />
<capacitor name="C_IN" footprint="0805" capacitance="10uF" />
<capacitor name="C_OUT" footprint="0805" capacitance="10uF" />
{/* LEDs */}
<led name="LED_P" color="green" footprint="0805" pcbX={-15} pcbY={10} />
<resistor name="R_LED_P" footprint="0805" resistance="330" pcbX={-17} pcbY={10} />
<led name="LED_L" color="yellow" footprint="0805" pcbX={-10} pcbY={10} />
<resistor name="R_LED_L" footprint="0805" resistance="330" pcbX={-12} pcbY={10} />
{/* Pin Headers */}
<chip name="JP1" footprint="pin_header_1x15" pcbX={-25} pcbY={0} />
<chip name="JP2" footprint="pin_header_1x15" pcbX={25} pcbY={0} />
<chip name="JP3" footprint="pin_header_1x6" pcbX={-25} pcbY={-15} />
<chip name="JP4" footprint="pin_header_1x6" pcbX={25} pcbY={-15} />
</board>
)
}
PCB Layout Guidelines
Power Traces
- 5V supply: Minimum 0.5mm width for 500mA current
- 3.3V supply: Minimum 0.3mm width
- GND plane: Solid ground plane on bottom layer
Crystal Routing
- Keep traces short: Under 10mm from crystal to MCU pins
- Guard ring: Route ground pour around crystal traces
- No vias: Avoid vias in crystal signal paths
Decoupling Capacitors
- Placement: Within 2mm of MCU power pins
- Trace width: 0.3mm minimum
- Via placement: Use multiple vias for ground connections
Manufacturing Files
# Generate Gerbers
tsci build --gerber
# Generate BOM
tsci build --bom
# Generate Assembly
tsci build --pick-and-place
Cost Estimate
| Component | Unit Cost | Qty | Total |
|---|---|---|---|
| ATmega328P-PU | $1.80 | 1 | $1.80 |
| ATmega16U2 | $1.20 | 1 | $1.20 |
| NCP1117-5.0 | $0.20 | 1 | $0.20 |
| USB-B Connector | $0.15 | 1 | $0.15 |
| 16 MHz Crystal | $0.15 | 1 | $0.15 |
| Passives (×15) | $0.02 | 15 | $0.30 |
| Pin Headers (×4) | $0.10 | 4 | $0.40 |
| PCB (2-layer) | $1.00 | 1 | $1.00 |
| Total | $5.20 |
Summary
You've designed a complete Arduino Uno compatible board covering:
- ATmega328P MCU configuration
- 16 MHz crystal oscillator circuit
- Reset circuit with noise filtering
- Power regulation and filtering
- LED indicators for status and activity
- Pin header layout matching Arduino Uno form factor
- Manufacturing file generation
This design is fully compatible with the Arduino IDE and bootloader.