The Arduino Nano is one of the most versatile and beginner-friendly microcontroller boards available. Whether you're interested in robotics, IoT, home automation, or just learning electronics, this guide will walk you through everything you need to know to get started and build amazing projects.
In this comprehensive guide, you'll learn:
The Arduino Nano is a small, breadboard-friendly microcontroller board based on the ATmega328P processor (or ATmega4809 in newer versions). It's perfect for embedded projects where space is limited.
Advantages:
Ideal For:
| Specification | Details |
|---|---|
| Processor | ATmega328P |
| Operating Voltage | 5V |
| Input Voltage | 7-12V (via Vin) or 5V (via USB) |
| Digital I/O Pins | 14 (6 PWM capable) |
| Analog Input Pins | 8 |
| DC Current per I/O | 40mA |
| Flash Memory | 32 KB |
| SRAM | 2 KB |
| EEPROM | 1 KB |
| Clock Speed | 16 MHz |
| Dimensions | 45mm × 18mm |
The Arduino Nano has the following pin groups:
Digital Pins (0-13):
Analog Pins (A0-A7):
Special Pins:
For detailed pinout diagrams, search "Arduino Nano pinout diagram" on Google Images or visit arduino.cc
Essential Components:
Arduino Nano Microcontroller Board
USB Cable (USB Type-A to Mini-B)
Breadboard (400-830 hole)
Jumper Wires
Important Note: The two rows of pins should sit on opposite sides of the center channel. This leaves the center section free for adding sensors and other components.
Identify Power Pins on Nano:
Create Power Rails on Breadboard:
Visual Layout:
[Arduino Nano]
5V → Red Rail (Power)
GND → Black Rail (Ground)
You have two excellent options for programming your Arduino Nano. We'll cover both.
Arduino IDE is the official development environment, perfect for beginners.
Download Arduino IDE:
Install the IDE:
./install.shLaunch Arduino IDE:
setup() and loop() functionsSelect Board:
Tools → Board: → Arduino AVR Boards → Arduino NanoSelect Processor:
Tools → Processor: → ATmega328P (or ATmega328P (Old Bootloader) if your Nano is older)Select COM Port:
Tools → Port: → Select the COM port that appearedCOM3 or higher/dev/cu.usbserial-####/dev/ttyUSB0Test Connection:
Tools → Get Board InfoVS Code offers a professional development environment with better code editing.
Install VS Code:
Install Arduino Extension:
Install Arduino CLI (Required backend):
arduino-cli version in terminalConfigure VS Code:
Ctrl+Shift+P (Cmd+Shift+P on Mac)Arduino AVR BoardsCreate Your First Project:
sketch.inoConfigure Board Settings:
.ino file open, press Ctrl+Alt+U to uploadLet's write and upload your first program: a simple LED blink.
Physical Setup:
Code:
// Arduino Nano - Simple LED Blink // This program blinks the built-in LED on pin 13 void setup() { // setup() runs once when the board starts // Configure pin 13 as an output pinMode(13, OUTPUT); } void loop() { // loop() runs repeatedly, forever // Turn LED on digitalWrite(13, HIGH); // Wait for 1000 milliseconds (1 second) delay(1000); // Turn LED off digitalWrite(13, LOW); // Wait for 1000 milliseconds (1 second) delay(1000); }
Upload Instructions:
Arduino IDE:
Sketch → Upload (or Ctrl+U)VS Code:
.ino fileCtrl+Alt+UExpected Result:
pinMode(pin, mode)
setup()pinMode(13, OUTPUT) makes pin 13 an outputdigitalWrite(pin, value)
digitalWrite(13, HIGH) sends 5V to pin 13delay(milliseconds)
delay(500) pauses for 500ms (half second)setup() vs loop()
setup(): Runs once at startup, used for initializationloop(): Runs repeatedly forever, where your main program logic goesArduino code is actually a simplified version of C++. Understanding the basics will help you write better programs.
Variables store information. Here are the common types:
// Integer - whole numbers int age = 25; int count = 0; // Float - decimal numbers float temperature = 23.5; float voltage = 3.14; // Byte - 0 to 255 (saves memory) byte brightness = 255; // Boolean - true or false boolean isMotorRunning = true; bool ledIsOn = false; // Character - single character char initial = 'A'; // String - text String sensorName = "Temperature Sensor";
Constants are values that never change. Use them for pin numbers:
// Define constants at the top of your program const int LED_PIN = 13; const int BUTTON_PIN = 2; const int SENSOR_PIN = A0; // Use them in your code pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);
Perform operations on variables:
// Arithmetic int result = 10 + 5; // addition int math = 20 - 8; // subtraction int product = 4 * 5; // multiplication int quotient = 20 / 4; // division int remainder = 17 % 5; // modulo (remainder) // Comparison (returns true or false) if (10 > 5) { } // greater than if (5 < 10) { } // less than if (5 == 5) { } // equals if (5 != 10) { } // not equals // Logical if (a > 5 && b < 10) { } // AND (both must be true) if (a > 5 || b < 10) { } // OR (at least one true) if (!isRunning) { } // NOT (opposite of true/false)
Control what your program does:
// IF statement if (temperature > 30) { digitalWrite(COOLER_PIN, HIGH); } // IF-ELSE if (buttonPressed) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } // FOR loop - repeat a specific number of times for (int i = 0; i < 10; i++) { digitalWrite(LED_PIN, HIGH); delay(100); digitalWrite(LED_PIN, LOW); delay(100); } // WHILE loop - repeat until condition is false while (sensorValue > 500) { Serial.println(sensorValue); sensorValue = analogRead(A0); }
Create reusable blocks of code:
// Function declaration void blinkLED(int times) { for (int i = 0; i < times; i++) { digitalWrite(LED_PIN, HIGH); delay(200); digitalWrite(LED_PIN, LOW); delay(200); } } // Function that returns a value int readSensorValue() { int value = analogRead(A0); return value; } // Using functions void loop() { blinkLED(3); // Call function with parameter int sensorReading = readSensorValue(); }
Communicate with your computer:
void setup() { // Start serial communication at 9600 baud rate Serial.begin(9600); // Print messages Serial.println("System started!"); } void loop() { // Print sensor value int value = analogRead(A0); Serial.print("Sensor: "); Serial.println(value); delay(1000); }
Viewing Serial Output:
Tools → Serial MonitorNow let's connect and use popular sensors with your Arduino Nano.
What It Does: Detects motion or objects using infrared light
Where to Buy:
Specifications:
Wiring Diagram Description:
┌─────────────────┐
│ IR Sensor │
│ (PIR) │
├─────────────────┤
│ Vcc Out GND │
└─────────────────┘
│ │ │
│ │ └──→ GND (Nano)
│ │
│ └──→ Pin 2 (Nano)
│
└──→ 5V (Nano)
Code Example:
const int PIR_PIN = 2; void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); } void loop() { int motionDetected = digitalRead(PIR_PIN); if (motionDetected == HIGH) { Serial.println("Motion detected!"); digitalWrite(13, HIGH); // Turn on LED } else { Serial.println("No motion"); digitalWrite(13, LOW); // Turn off LED } delay(100); }
Tips:
What It Does: Measures distance to objects using sound waves
Where to Buy:
Specifications:
Wiring Diagram Description (HC-SR04 Compatible Mode):
The DFRobot URM13 sensor supports HC-SR04 compatible TRIG/ECHO mode, so you can use the same wiring:
┌──────────────────┐
│ Ultrasonic │
│ URM13/HC-SR04 │
├──────────────────┤
│ Vcc Trig Ech Gnd│
└──────────────────┘
│ │ │ │
│ │ │ └──→ GND (Nano)
│ │ │
│ │ └──→ Pin 3 (Nano) - ECHO
│ │
│ └──→ Pin 4 (Nano) - TRIG
│
└──→ 5V (Nano)
Note: The URM13 also supports I2C and UART interfaces for more advanced applications, but the TRIG/ECHO mode works with the same code as HC-SR04.
Code Example:
const int TRIG_PIN = 4; const int ECHO_PIN = 3; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); } void loop() { // Send 10 microsecond pulse to trigger digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure the echo time long duration = pulseIn(ECHO_PIN, HIGH); // Calculate distance // Speed of sound: 343 m/s = 0.0343 cm/microsecond // Distance = (duration * 0.0343) / 2 (divide by 2 for round trip) int distance = duration * 0.034 / 2; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); delay(100); }
Tips:
What It Does: Emits light when current flows through it
Where to Buy:
Specifications:
Color Specifications:
Wiring Diagram Description:
Positive (Long leg)
│
├─────[LED]─────[220Ω Resistor]─────┐
│ │
Pin 13 GND
Code Example:
const int RED_LED = 5; const int GREEN_LED = 6; const int BLUE_LED = 9; void setup() { pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); } void loop() { // Blink red digitalWrite(RED_LED, HIGH); delay(500); digitalWrite(RED_LED, LOW); // Blink green digitalWrite(GREEN_LED, HIGH); delay(500); digitalWrite(GREEN_LED, LOW); // Fade blue using PWM for (int brightness = 0; brightness <= 255; brightness += 5) { analogWrite(BLUE_LED, brightness); delay(50); } }
Tips:
digitalWrite for full on/off, analogWrite for brightnessWhat It Does: Rotates in precise steps, excellent for positioning
Where to Buy:
Specifications:
Wiring Diagram Description:
The DFRobot 28BYJ-48 module includes an integrated A4988 driver with a simplified 4-pin interface:
┌─────────────────────┐
│ 28BYJ-48 Module │
│ (Motor + Driver) │
├─────────────────────┤
│ STEP DIR 5V GND │
└─────────────────────┘
│ │ │ │
│ │ │ └──→ GND (Nano)
│ │ │
│ │ └──→ 5V (Nano)
│ │
│ └──→ Pin 11 (Nano) - Direction
│
└──→ Pin 10 (Nano) - Step
Note: For traditional ULN2003 driver setups (without integrated driver), use pins 10-13 as shown in the code example below.
Code Example (for DFRobot module with STEP/DIR interface):
const int STEP_PIN = 10; const int DIR_PIN = 11; void setup() { pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); Serial.begin(9600); } void loop() { // Set direction (HIGH = clockwise, LOW = counter-clockwise) digitalWrite(DIR_PIN, HIGH); // Rotate one full revolution (4096 steps with 1:64 gear ratio) for (int i = 0; i < 4096; i++) { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(500); // Adjust for speed digitalWrite(STEP_PIN, LOW); delayMicroseconds(500); } delay(1000); // Reverse direction digitalWrite(DIR_PIN, LOW); for (int i = 0; i < 4096; i++) { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(500); digitalWrite(STEP_PIN, LOW); delayMicroseconds(500); } delay(1000); }
Code Example (for traditional ULN2003 driver - manual control):
const int IN1 = 10; const int IN2 = 11; const int IN3 = 12; const int IN4 = 13; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } // Step sequence for motor void step(int stepNum) { switch(stepNum) { case 0: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 1: digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 2: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 3: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break; case 4: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break; case 5: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); break; case 6: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; case 7: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; } } void loop() { // Rotate 2048 steps (one full revolution) for (int i = 0; i < 2048; i++) { step(i % 8); delay(2); // Delay between steps } delay(1000); }
Better Approach: Use Stepper.h Library
#include <Stepper.h> const int STEPS_PER_REVOLUTION = 2048; Stepper stepper(STEPS_PER_REVOLUTION, 10, 11, 12, 13); void setup() { stepper.setSpeed(10); // Speed in RPM } void loop() { // Rotate clockwise stepper.step(STEPS_PER_REVOLUTION); delay(1000); // Rotate counter-clockwise stepper.step(-STEPS_PER_REVOLUTION); delay(1000); }
Tips:
What It Does: Measures temperature and humidity
Where to Buy:
Specifications:
Wiring Diagram Description:
┌─────────────┐
│ DHT22 │
├─────────────┤
│ 1 2 4 │
│ +5V Data GND│
└─────────────┘
│ │ │
│ │ └──→ GND
│ │
│ └──→ Pin 2 (with 10kΩ pull-up resistor to +5V)
│
└──→ +5V
Code Example:
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); // Sensor needs 2 seconds between readings float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); if (isnan(humidity) || isnan(temperature)) { Serial.println("Failed to read from sensor!"); return; } Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C"); Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %"); }
Installation of DHT Library:
Sketch → Include Library → Manage LibrariesTips:
Components Needed:
Wiring:
Complete Code:
#include <Arduino.h> const int PIR_SENSOR = 2; const int BUZZER = 5; const int LED = 13; const int DEBOUNCE_DELAY = 100; unsigned long lastMotionTime = 0; boolean alarmActive = false; void setup() { pinMode(PIR_SENSOR, INPUT); pinMode(BUZZER, OUTPUT); pinMode(LED, OUTPUT); Serial.begin(9600); Serial.println("Motion alarm system initialized"); Serial.println("PIR sensor warming up..."); delay(30000); // 30 seconds for sensor calibration Serial.println("System ready!"); } void loop() { int motionDetected = digitalRead(PIR_SENSOR); if (motionDetected == HIGH) { unsigned long currentTime = millis(); // Debounce: ignore if less than 100ms since last motion if (currentTime - lastMotionTime > DEBOUNCE_DELAY) { if (!alarmActive) { triggerAlarm(); alarmActive = true; } lastMotionTime = currentTime; } } else { if (alarmActive) { stopAlarm(); alarmActive = false; } } delay(50); } void triggerAlarm() { Serial.println("MOTION DETECTED - ALARM TRIGGERED!"); // Alarm pattern: beep and flash for (int i = 0; i < 5; i++) { digitalWrite(BUZZER, HIGH); digitalWrite(LED, HIGH); delay(200); digitalWrite(BUZZER, LOW); digitalWrite(LED, LOW); delay(200); } } void stopAlarm() { digitalWrite(BUZZER, LOW); digitalWrite(LED, LOW); Serial.println("Motion stopped - alarm deactivated"); }
Components Needed:
Wiring for LCD I2C Module:
Complete Code:
#include <Wire.h> #include <LiquidCrystal_I2C.h> const int TRIG_PIN = 4; const int ECHO_PIN = 3; // LCD address 0x27 (adjust if different) LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); // Initialize LCD lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Distance Meter"); lcd.setCursor(0, 1); lcd.print("Ready"); Serial.begin(9600); delay(2000); lcd.clear(); } void loop() { int distance = measureDistance(); // Display on LCD lcd.setCursor(0, 0); lcd.print("Distance: "); lcd.print(distance); lcd.print(" cm "); // Display on Serial Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // Status on LCD lcd.setCursor(0, 1); if (distance < 10) { lcd.print("CLOSE! "); } else if (distance < 30) { lcd.print("NEAR "); } else { lcd.print("FAR "); } delay(500); } int measureDistance() { // Send trigger pulse digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure echo duration long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout // Calculate distance // Speed of sound: 343 m/s = 0.0343 cm/microsecond int distance = duration * 0.034 / 2; return distance; }
Installation of LiquidCrystal I2C Library:
Sketch → Include Library → Manage LibrariesComponents Needed:
Wiring:
Complete Code:
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT22 const int GREEN_LED = 9; const int YELLOW_LED = 10; const int RED_LED = 11; DHT dht(DHTPIN, DHTTYPE); // Temperature thresholds const float COLD_TEMP = 15.0; const float WARM_TEMP = 25.0; const float HOT_TEMP = 35.0; void setup() { pinMode(GREEN_LED, OUTPUT); pinMode(YELLOW_LED, OUTPUT); pinMode(RED_LED, OUTPUT); Serial.begin(9600); dht.begin(); Serial.println("Temperature Monitor Started"); } void loop() { delay(2000); float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); // Check for sensor errors if (isnan(temperature) || isnan(humidity)) { Serial.println("Sensor read failed!"); return; } // Print to Serial Serial.print("Temp: "); Serial.print(temperature); Serial.print("°C, Humidity: "); Serial.print(humidity); Serial.println("%"); // Turn on appropriate LED updateLEDs(temperature); } void updateLEDs(float temp) { // Turn all off first digitalWrite(GREEN_LED, LOW); digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, LOW); // Determine which LED to turn on if (temp < COLD_TEMP) { // Cold - Blue would be nice, but we use GREEN digitalWrite(GREEN_LED, HIGH); Serial.println("Status: COLD"); } else if (temp < WARM_TEMP) { // Comfortable digitalWrite(GREEN_LED, HIGH); Serial.println("Status: COMFORTABLE"); } else if (temp < HOT_TEMP) { // Warm - warning digitalWrite(YELLOW_LED, HIGH); Serial.println("Status: WARM"); } else { // Hot - alarm digitalWrite(RED_LED, HIGH); Serial.println("Status: HOT ALERT!"); } }
Components Needed:
Complete Code (with Serial data logging):
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT22 const int TRIG_PIN = 4; const int ECHO_PIN = 3; DHT dht(DHTPIN, DHTTYPE); struct SensorData { float temperature; float humidity; int distance; unsigned long timestamp; }; SensorData currentReading; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); dht.begin(); Serial.println("=== Arduino Nano Multi-Sensor Logger ==="); Serial.println("Time(ms),Temperature(C),Humidity(%),Distance(cm)"); } void loop() { // Read all sensors currentReading.timestamp = millis(); currentReading.temperature = dht.readTemperature(); currentReading.humidity = dht.readHumidity(); currentReading.distance = measureDistance(); // Log data logData(currentReading); delay(5000); // Read every 5 seconds } int measureDistance() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH, 30000); int distance = duration * 0.034 / 2; return distance; } void logData(SensorData data) { // Print in CSV format for easy import to spreadsheet Serial.print(data.timestamp); Serial.print(","); Serial.print(data.temperature); Serial.print(","); Serial.print(data.humidity); Serial.print(","); Serial.println(data.distance); }
How to use the logged data:
.csvIssue 1: "Unknown Serial Port"
Issue 2: "Failed to upload sketch"
Issue 3: Sensor not responding
Issue 4: LED won't light up
pinMode() is set to OUTPUTIssue 5: Motor won't spin
stepper.setSpeed(5)1. Use Constants Instead of Magic Numbers
// BAD pinMode(13, OUTPUT); digitalWrite(13, HIGH); // GOOD const int LED_PIN = 13; pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);
2. Add Comments to Explain Logic
// Check if temperature exceeds threshold if (temperature > MAX_TEMP) { // Turn on cooling fan digitalWrite(FAN_PIN, HIGH); }
3. Use Functions for Repeated Code
// Instead of repeating this pattern multiple times: void blinkPattern(int pin, int times) { for (int i = 0; i < times; i++) { digitalWrite(pin, HIGH); delay(200); digitalWrite(pin, LOW); delay(200); } }
4. Manage Your Pins
// Define all pins at the top const int LED_PIN = 13; const int SENSOR_PIN = 2; const int BUTTON_PIN = 4; const int MOTOR_PIN = 5;
5. Use Serial for Debugging
void loop() { int sensorValue = analogRead(A0); Serial.print("Raw value: "); Serial.println(sensorValue); if (sensorValue > 500) { Serial.println("Threshold exceeded!"); } }
6. Avoid Long Delays in Critical Loops
// BAD - blocks everything for 5 seconds void loop() { doSomething(); delay(5000); // Nothing else runs! } // BETTER - use millis() for non-blocking timing unsigned long lastTime = 0; void loop() { unsigned long currentTime = millis(); if (currentTime - lastTime > 5000) { doSomething(); lastTime = currentTime; } }
Memory Tips:
byte instead of int when possibleSpeed Tips:
Never connect:
Always use:
Protect your USB port:
Prevent shorts:
You now have a comprehensive understanding of the Arduino Nano, from basic setup through advanced projects. Start with simple LED blinkers, move to sensor integration, and gradually tackle more complex projects.
Remember:
The Arduino Nano opens a world of creative possibilities. Happy building!
pinMode(pin, OUTPUT/INPUT) // Configure pin mode digitalWrite(pin, HIGH/LOW) // Digital output digitalRead(pin) // Digital input analogRead(pin) // Analog input (0-1023) analogWrite(pin, value) // PWM output (0-255) delay(milliseconds) // Pause execution delayMicroseconds(microseconds) // Pause (tiny delay) millis() // Milliseconds since start Serial.begin(9600) // Start serial at baud rate Serial.println(value) // Print with newline Serial.print(value) // Print without newline pulseIn(pin, HIGH/LOW) // Measure pulse width
Digital I/O: 0-13 (0,1 = serial, 13 = built-in LED)
PWM Pins: 3, 5, 6, 9, 10, 11
Analog Input: A0-A7
Power: 5V, 3.3V, GND (×3)
Special: AREF, RST, ICSP
PIR Motion Sensor: Pin 2 (Digital)
Ultrasonic Echo: Pin 3 (Digital)
DHT Temperature: Pin 2 (Digital)
Buzzer/Speaker: Pin 5 (PWM)
Stepper Motor (4 pins): Pins 10-13
LED (PWM for brightness): Pins 3, 5, 6, 9, 10, 11
Button: Any digital pin
Analog Sensor: A0-A7
Document Version: 1.0
Last Updated: December 2025
Target Audience: Complete Beginners to Intermediate Makers
Total Content: Comprehensive Guide with Code Examples and Component Links
Happy coding and building amazing projects!