Contact Sales & After-Sales Service

Contact & Quotation

  • Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.
  • Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.
Drag & Drop Files, Choose Files to Upload You can upload up to 3 files.

Notes:
For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.

Arduino I2C Tutorial: Complete Communication Guide

Serial communication protocols form the backbone of modern embedded systems, enabling microcontrollers to interface with sensors, displays, memory chips, and other peripherals using minimal wiring. Among these protocols, I2C (Inter-Integrated Circuit) stands out for its elegant simplicity and widespread adoption. The Arduino I2C implementation through the Wire library has made this powerful protocol accessible to makers and engineers alike, transforming what was once a challenging low-level interface into straightforward function calls.

As someone who has debugged countless I2C bus failures on prototype PCBs and production boards, I’ve learned that successful Arduino I2C communication requires understanding both the underlying protocol mechanics and practical implementation details. This comprehensive guide examines Arduino I2C from ground level through advanced multi-device configurations, covering everything from basic two-wire connections to troubleshooting mysterious address conflicts and signal integrity issues that plague longer bus lengths.

Understanding I2C Protocol Fundamentals

Before connecting wires and writing code, understanding the I2C protocol architecture prevents common implementation mistakes and enables effective troubleshooting when problems arise.

What Makes I2C Different

I2C, developed by Philips (now NXP Semiconductors) in 1982, uses a master-slave architecture with only two bidirectional signal lines:

SDA (Serial Data): Bidirectional data transfer line SCL (Serial Clock): Clock signal generated by master device

This two-wire design contrasts sharply with SPI’s four-wire minimum (MISO, MOSI, SCK, SS) and UART’s point-to-point connections. The efficiency comes from I2C’s addressing scheme – each device on the bus has a unique 7-bit or 10-bit address, allowing the master to communicate with specific slaves without additional chip select lines.

Bus Topology and Device Roles

Device TypeDescriptionQuantity AllowedPrimary Functions
MasterInitiates communication, generates clock1 (typically on Arduino)Request data, send commands, control timing
SlaveResponds to master requestsUp to 112 (7-bit) or 1008 (10-bit)Provide sensor data, accept configuration
Multi-MasterMultiple masters share bus2+ masters possibleAdvanced applications requiring arbitration

In most Arduino projects, the Arduino board functions as the sole master, communicating with multiple slave devices such as sensors (MPU6050, BMP180), displays (OLED, LCD with I2C backpack), and memory chips (EEPROM, RTC modules).

Clock Speed and Data Rates

The I2C specification defines multiple speed grades:

ModeClock FrequencyTypical Use CaseArduino Support
Standard Mode100 kHzLegacy devices, simple sensorsFull support
Fast Mode400 kHzModern sensors, displaysFull support
Fast Mode Plus1 MHzHigh-speed data acquisitionLimited (depends on board)
High Speed Mode3.4 MHzSpecialized applicationsNot supported on AVR

Most Arduino I2C implementations default to 100 kHz, providing excellent compatibility with the vast majority of available I2C devices. The speed can be increased using Wire.setClock() when faster data transfer is required.

Arduino I2C Hardware Configuration

Pin Assignments Across Arduino Boards

Different Arduino boards designate specific pins for I2C communication. Understanding your board’s pin allocation is essential for proper wiring.

Arduino BoardSDA PinSCL PinAlternative PinsNotes
UnoA4A5SDA/SCL near AREFConnect to either location
Mega 256020 (SDA)21 (SCL)NoneSeparate from analog pins
Leonardo2 (SDA)3 (SCL)NoneDifferent from Uno!
Due20 (SDA)21 (SCL)SDA1/SCL1 (pins 70/71)Two I2C interfaces
NanoA4A5NoneSame as Uno
ESP32GPIO 21 (SDA)GPIO 22 (SCL)ConfigurableSoftware-selectable pins

Critical Design Note: Arduino Uno R3 and newer include dedicated SDA/SCL pins near the AREF pin for shield compatibility, but these connect internally to A4/A5. You can use either location but not both simultaneously.

Pull-Up Resistor Requirements

I2C uses open-drain signaling, meaning devices can only pull the bus lines LOW. Pull-up resistors connected to VCC return the lines to HIGH when no device is actively driving them LOW. This architecture enables multiple devices to share the bus without electrical conflicts.

Pull-Up Resistor Selection:

Bus ConditionRecommended Resistor ValueReasoning
Short wires (<30cm), single device4.7kΩStandard value, good starting point
Multiple devices (3-5)2.2kΩ – 3.3kΩLower resistance compensates for increased capacitance
Long wires (>1m)1.5kΩ – 2.2kΩStrong pull-up fights capacitive loading
Very short PCB traces, 400kHz2.2kΩSharper edges at higher speeds

Calculating Pull-Up Current:

The pull-up resistor determines current flow when a device pulls the line LOW:

I = VCC / R_pullup

For 5V and 4.7kΩ: I = 5V / 4700Ω ≈ 1.06mA

For 3.3V and 4.7kΩ: I = 3.3V / 4700Ω ≈ 0.7mA

Most I2C devices comfortably sink 1-3mA, making 4.7kΩ universally safe. Lower resistance values (stronger pull-ups) improve signal quality but increase power consumption – critical for battery-powered applications.

Internal Pull-Ups: The ATmega328P (Arduino Uno/Nano) includes internal pull-ups around 20-50kΩ. The Wire library enables these automatically, but they’re too weak for reliable operation above 100kHz or with multiple devices. Always add external 4.7kΩ pull-ups for production designs.

Voltage Level Compatibility

I2C operates at the VCC logic level of connected devices, creating challenges when mixing 5V Arduino boards with 3.3V sensors.

5V Arduino with 3.3V I2C Device – Safe Options:

  1. Bidirectional Level Shifter: Dedicated ICs (PCA9306, TXS0102) provide safe voltage translation
  2. Pull-Ups to 3.3V: Connect pull-up resistors to 3.3V instead of 5V (works for many devices)
  3. Resistor Divider on SCL: Simple resistor divider on clock line (SDA benefits from level shifter)

3.3V Arduino with 5V I2C Device: Generally not recommended. The 5V device may not recognize 3.3V logic levels as valid HIGH signals. Use level shifters or 5V Arduino boards.

Practical Implementation:

5V Arduino (Uno) <–> 3.3V Sensor (MPU6050)

Option 1 – Level Shifter:

Arduino 5V –> Level Shifter HV

Arduino GND –> Level Shifter GND

Arduino SDA –> Level Shifter HV1 –> LV1 –> Sensor SDA

Arduino SCL –> Level Shifter HV2 –> LV2 –> Sensor SCL

Sensor 3.3V –> Level Shifter LV

Option 2 – 3.3V Pull-Ups (if sensor is 5V tolerant):

Arduino SDA –> 4.7kΩ –> 3.3V

Arduino SCL –> 4.7kΩ –> 3.3V

Arduino SDA –> Sensor SDA

Arduino SCL –> Sensor SCL

Arduino Wire Library: Core Functions

The Wire library provides Arduino’s I2C interface, abstracting low-level register manipulation into intuitive function calls.

Essential Wire Library Functions

FunctionParametersPurposeExample
Wire.begin()None (master) or address (slave)Initialize I2C interfaceWire.begin();
Wire.beginTransmission()Device addressStart communication with deviceWire.beginTransmission(0x68);
Wire.write()Byte or arraySend data to slaveWire.write(0x3B);
Wire.endTransmission()Optional: true/falseComplete transmissionWire.endTransmission();
Wire.requestFrom()Address, quantityRequest data from slaveWire.requestFrom(0x68, 6);
Wire.available()NoneCheck bytes in receive bufferwhile(Wire.available())
Wire.read()NoneRead one byte from bufferbyte data = Wire.read();
Wire.setClock()Frequency in HzSet I2C clock speedWire.setClock(400000);

Master Device Implementation

The master device (Arduino) initiates all communication. Here’s the fundamental pattern:

#include <Wire.h>

void setup() {

  Wire.begin();  // Join I2C bus as master

  Serial.begin(9600);

  // Optional: Set faster clock speed

  Wire.setClock(400000);  // 400 kHz fast mode

}

void loop() {

  // Writing to a slave device (address 0x68)

  Wire.beginTransmission(0x68);

  Wire.write(0x3B);  // Register address

  Wire.write(0x01);  // Data to write

  Wire.endTransmission();

  delay(100);

  // Reading from a slave device

  Wire.beginTransmission(0x68);

  Wire.write(0x3B);  // Register to read from

  Wire.endTransmission(false);  // Restart, don’t release bus

  Wire.requestFrom(0x68, 6);  // Request 6 bytes

  byte data[6];

  int i = 0;

  while(Wire.available()) {

    data[i] = Wire.read();

    i++;

  }

  // Process received data

  Serial.print(“Received bytes: “);

  for(int j = 0; j < 6; j++) {

    Serial.print(data[j], HEX);

    Serial.print(” “);

  }

  Serial.println();

  delay(1000);

}

Slave Device Implementation (Arduino as Slave)

Arduino can also function as an I2C slave, useful for creating custom sensors or extending another Arduino’s I/O capabilities.

#include <Wire.h>

#define SLAVE_ADDRESS 0x08

volatile byte command = 0;

volatile byte sensorValue = 0;

void setup() {

  Wire.begin(SLAVE_ADDRESS);  // Join as slave with address 0x08

  Wire.onReceive(receiveData);  // Register receive callback

  Wire.onRequest(sendData);     // Register request callback

  pinMode(A0, INPUT);

  Serial.begin(9600);

}

void loop() {

  // Continuously update sensor reading

  sensorValue = analogRead(A0) / 4;  // Scale to 0-255

  delay(50);

}

// Callback when master sends data

void receiveData(int byteCount) {

  while(Wire.available()) {

    command = Wire.read();

    Serial.print(“Received command: “);

    Serial.println(command);

  }

}

// Callback when master requests data

void sendData() {

  Wire.write(sensorValue);

  Serial.print(“Sent value: “);

  Serial.println(sensorValue);

}

I2C Device Addressing

Finding I2C Device Addresses

Each I2C device requires a unique address. Most devices use preset addresses (often found in datasheets), but some allow address configuration through jumper pins or solder bridges.

Common I2C Device Addresses:

DeviceDefault AddressAlternative AddressesConfigurable?
MPU6050 (Gyro/Accel)0x680x69Via AD0 pin
BMP180/BMP280 (Pressure)0x770x76Via SDO pin
OLED Display (SSD1306)0x3C0x3DVia resistor/jumper
PCF8574 (I2C I/O Expander)0x20-0x270x38-0x3FVia A0-A2 pins
DS3231 (RTC)0x68NoneFixed address

Address Conflicts: If two devices share the same address, they cannot coexist on the same I2C bus without using an I2C multiplexer (TCA9548A) to create separate bus segments.

I2C Scanner Sketch

When device addresses are unknown or uncertain, the I2C scanner sketch identifies all connected devices:

#include <Wire.h>

void setup() {

  Wire.begin();

  Serial.begin(9600);

  while (!Serial);

  Serial.println(“\nI2C Scanner”);

}

void loop() {

  byte error, address;

  int nDevices;

  Serial.println(“Scanning…”);

  nDevices = 0;

  for(address = 1; address < 127; address++ ) {

    Wire.beginTransmission(address);

    error = Wire.endTransmission();

    if (error == 0) {

      Serial.print(“I2C device found at address 0x”);

      if (address < 16)

        Serial.print(“0”);

      Serial.print(address, HEX);

      Serial.println(”  !”);

      nDevices++;

    }

    else if (error == 4) {

      Serial.print(“Unknown error at address 0x”);

      if (address < 16)

        Serial.print(“0”);

      Serial.println(address, HEX);

    }    

  }

  if (nDevices == 0)

    Serial.println(“No I2C devices found\n”);

  else

    Serial.println(“done\n”);

  delay(5000);

}

This scanner iterates through all 127 possible addresses, attempting communication with each and reporting which addresses respond successfully.

Practical Arduino I2C Examples

Example 1: Reading MPU6050 Accelerometer

The MPU6050 combines a 3-axis accelerometer and gyroscope in a single I2C package, commonly used for motion sensing and orientation tracking.

#include <Wire.h>

const int MPU_ADDR = 0x68;  // MPU6050 default address

void setup() {

  Wire.begin();

  Serial.begin(9600);

  // Wake up MPU6050 (it starts in sleep mode)

  Wire.beginTransmission(MPU_ADDR);

  Wire.write(0x6B);  // PWR_MGMT_1 register

  Wire.write(0);     // Set to zero (wakes up MPU6050)

  Wire.endTransmission(true);

  Serial.println(“MPU6050 Initialized”);

}

void loop() {

  int16_t AcX, AcY, AcZ;

  // Request accelerometer data

  Wire.beginTransmission(MPU_ADDR);

  Wire.write(0x3B);  // Starting register for accel data

  Wire.endTransmission(false);

  Wire.requestFrom(MPU_ADDR, 6, true);  // Request 6 bytes

  // Read 6 bytes (2 bytes per axis)

  AcX = Wire.read() << 8 | Wire.read();

  AcY = Wire.read() << 8 | Wire.read();

  AcZ = Wire.read() << 8 | Wire.read();

  Serial.print(“AcX = “); Serial.print(AcX);

  Serial.print(” | AcY = “); Serial.print(AcY);

  Serial.print(” | AcZ = “); Serial.println(AcZ);

  delay(500);

}

Key Implementation Details:

  • MPU6050 starts in sleep mode; must write 0 to PWR_MGMT_1 register (0x6B)
  • Accelerometer data stored as 16-bit signed integers across 6 registers
  • High byte read first, combined with low byte using bit shift and OR operation

Example 2: Arduino to Arduino I2C Communication

Demonstrating master-slave communication between two Arduino boards:

Master Arduino:

#include <Wire.h>

const int SLAVE_ADDR = 0x08;

void setup() {

  Wire.begin();

  Serial.begin(9600);

}

void loop() {

  int potValue = analogRead(A0);

  byte sendValue = map(potValue, 0, 1023, 0, 255);

  // Send data to slave

  Wire.beginTransmission(SLAVE_ADDR);

  Wire.write(sendValue);

  Wire.endTransmission();

  Serial.print(“Sent to slave: “);

  Serial.println(sendValue);

  // Request data from slave

  Wire.requestFrom(SLAVE_ADDR, 1);

  if(Wire.available()) {

    byte received = Wire.read();

    Serial.print(“Received from slave: “);

    Serial.println(received);

    // Control LED brightness based on slave’s value

    analogWrite(9, received);

  }

  delay(100);

}

Slave Arduino:

#include <Wire.h>

const int SLAVE_ADDR = 0x08;

volatile byte receivedValue = 0;

void setup() {

  Wire.begin(SLAVE_ADDR);

  Wire.onReceive(receiveEvent);

  Wire.onRequest(requestEvent);

  pinMode(9, OUTPUT);

  Serial.begin(9600);

}

void loop() {

  // Update LED based on received value

  analogWrite(9, receivedValue);

  delay(10);

}

void receiveEvent(int howMany) {

  if(Wire.available()) {

    receivedValue = Wire.read();

    Serial.print(“Received: “);

    Serial.println(receivedValue);

  }

}

void requestEvent() {

  int potValue = analogRead(A0);

  byte sendValue = map(potValue, 0, 1023, 0, 255);

  Wire.write(sendValue);

}

This bidirectional example demonstrates both sending commands and requesting data between two Arduino boards.

Troubleshooting Common Arduino I2C Issues

Problem: No Devices Found by I2C Scanner

Symptoms: I2C scanner reports “No I2C devices found”

Diagnostic Steps:

Verify Wiring:

    • Check SDA and SCL connections (not swapped)
    • Confirm ground connection between devices
    • Verify VCC connection to power supply

Check Pull-Up Resistors:

    • Measure voltage on SDA/SCL lines (should be VCC when idle)
    • Add 4.7kΩ pull-ups if not present
    • Remove excessive pull-ups (parallel resistors reduce total resistance)

Test Device Separately:

    • Connect only one device to eliminate address conflicts
    • Try different device if available (rule out defective hardware)

Measure Bus Signals:

    • Use oscilloscope or logic analyzer to verify clock and data signals
    • Look for square waves on SCL when scanner runs
    • Verify SDA changes during transmission

Problem: Intermittent Communication Failures

Symptoms: Devices work sometimes but fail randomly

Common Causes and Solutions:

CauseSymptomsSolution
Insufficient pull-upsWeak or slow signal edgesAdd stronger pull-ups (2.2kΩ)
Cable too longWorks at short distance, fails when extendedAdd repeater or reduce speed
EMI interferenceFails near motors or power suppliesRoute away from noise sources, add ferrite beads
Power supply noiseCorrelates with device activityAdd decoupling capacitors near each device
Address conflictTwo devices respond simultaneouslyChange address or use I2C multiplexer

Problem: Devices Don’t Acknowledge

Symptoms: Wire.endTransmission() returns non-zero error code

Error Code Meanings:

Return ValueMeaningTypical Cause
0SuccessNormal operation
1Data too longBuffer overflow (>32 bytes)
2NACK on addressDevice not present at that address
3NACK on dataDevice doesn’t recognize register/command
4Other errorBus collision, timing issue

Resolution Steps:

  • Verify correct device address using I2C scanner
  • Check device datasheet for correct register addresses
  • Ensure device is powered and initialized properly
  • Try reducing clock speed: Wire.setClock(100000);

Problem: Data Corruption or Wrong Values

Symptoms: Received data doesn’t match expected values

Potential Issues:

Timing Problems: Clock speed too fast for device capability

    • Solution: Reduce to 100 kHz standard mode

Buffer Overrun: Reading more bytes than device provides

    • Solution: Request exact byte count from datasheet

Voltage Level Mismatch: 5V/3.3V logic incompatibility

    • Solution: Add level shifter or adjust pull-ups

Electrical Noise: Poor signal integrity from capacitance/inductance

    • Solution: Shorten wires, add ground plane, twisted pairs

Advanced Arduino I2C Techniques

Clock Stretching Support

Some I2C slaves need extra time to prepare data. They hold the SCL line LOW, “stretching” the clock until ready. The Arduino Wire library supports this automatically, but extremely long stretches (>1 second) may appear as timeouts.

Multi-Master Configurations

While rare in Arduino projects, multiple masters can share an I2C bus using arbitration. The Wire library supports this by checking if the bus is busy before transmitting. Implementation requires careful coordination to prevent collisions.

Using I2C Multiplexers

When multiple devices share the same address (common with identical sensors), I2C multiplexers like TCA9548A create separate bus segments:

#include <Wire.h>

#define TCAADDR 0x70

void tcaselect(uint8_t i) {

  if (i > 7) return;

  Wire.beginTransmission(TCAADDR);

  Wire.write(1 << i);

  Wire.endTransmission();  

}

void setup() {

  Wire.begin();

  // Initialize device on channel 0

  tcaselect(0);

  // Configure device…

  // Initialize device on channel 1

  tcaselect(1);

  // Configure device…

}

Useful Resources and Tools

Official Documentation

ResourceDescriptionAccess
Arduino Wire Library ReferenceComplete function documentationArduino.cc/Reference/Wire
I2C Bus SpecificationOfficial NXP I2C protocol documentNXP website
ATmega328P DatasheetTWI (I2C) hardware implementationSection 22 TWI

Essential Development Tools

ToolPurposeTypical Cost
I2C Scanner SketchIdentify device addressesFree
Logic AnalyzerCapture and decode I2C transactions$10-50
OscilloscopeVerify signal integrity$50-500+
I2C Multiplexer (TCA9548A)Resolve address conflicts$5-10
Bidirectional Level Shifter5V/3.3V voltage translation$2-5

Common I2C Sensor Libraries

SensorLibraryRepository
MPU6050MPU6050 by Electronic CatsGitHub
BMP280Adafruit BMP280Arduino Library Manager
OLED SSD1306Adafruit SSD1306Arduino Library Manager
DS3231 RTCRTClib by AdafruitArduino Library Manager

Educational Resources

Books:

  • “I2C for Embedded Systems” – Comprehensive protocol reference
  • “Arduino Cookbook” – Practical I2C examples

Online Tutorials:

  • SparkFun I2C Tutorial – Excellent visual explanations
  • Adafruit Learning Guides – Device-specific examples
  • DroneBot Workshop I2C Series – Video tutorials with demonstrations

Frequently Asked Questions

1. Do I need pull-up resistors if my sensor module already has them?

Most breakout boards include pull-up resistors (typically 10kΩ). However, having multiple pull-ups in parallel isn’t harmful – they combine to create a lower total resistance. If your module has 10kΩ pull-ups and you add external 4.7kΩ resistors, the effective resistance becomes approximately 3.2kΩ, which is perfectly acceptable for I2C operation. Problems only occur when too many parallel pull-ups create excessively low resistance (<1.5kΩ), potentially exceeding device current sink capabilities.

2. Why does my I2C communication work at short distances but fail with longer wires?

Every wire adds capacitance (approximately 30-50pF per meter), which slows signal rise/fall times and can cause bit errors. At 100 kHz with 1 meter of wire, you’re near the practical limit. Solutions include: reducing clock speed to 50 kHz or lower, using stronger pull-ups (2.2kΩ instead of 4.7kΩ), implementing active I2C extenders/repeaters for distances beyond 2 meters, or using twisted-pair or shielded cables to reduce capacitance and noise pickup.

3. Can I connect 3.3V I2C devices directly to 5V Arduino boards?

This is risky and depends on the specific device. Most modern 3.3V chips tolerate 5V inputs, but many (especially older sensors) can be permanently damaged. The safest approach uses bidirectional level shifters designed for I2C. A budget-friendly alternative connects pull-up resistors to 3.3V instead of 5V, which works for many devices because the 3.3V HIGH signal often meets the Arduino’s HIGH threshold (minimum 3.0V). Always consult device datasheets for absolute maximum voltage ratings before connecting.

4. What does “NACK on address” mean and how do I fix it?

NACK (Negative Acknowledge) on address means no device responded to the specified address. Common causes: incorrect address (verify with I2C scanner), device not powered (check VCC and GND connections), wiring error (swapped SDA/SCL, missing pull-ups), device in sleep/shutdown mode (some sensors require initialization), or device failure. Run the I2C scanner first to identify all connected devices, then verify your code uses the correct hexadecimal address from the scanner output.

5. How many devices can I connect to a single I2C bus?

Theoretically, 112 devices with 7-bit addressing (addresses 0x08-0x77 are usable). Practically, limitations appear around 8-10 devices due to: increased bus capacitance requiring stronger pull-ups, address conflicts (many devices use the same default addresses), current limitations of pull-up resistors, and timing challenges with many devices. For networks exceeding 10 devices, consider using I2C multiplexers to create separate bus segments, implementing multiple I2C buses (if your Arduino has multiple interfaces), or switching to alternative protocols like RS-485 for longer distances and more nodes.

Conclusion

The Arduino I2C implementation through the Wire library has democratized inter-integrated circuit communication, making sophisticated sensor networks accessible to makers and embedded engineers alike. Understanding the protocol fundamentals – open-drain signaling, pull-up requirements, master-slave architecture, and addressing schemes – transforms I2C from mysterious to manageable. Success with Arduino I2C communication requires attention to both hardware details (proper pull-up resistor values, voltage level matching, wire length limitations) and software implementation (correct addressing, proper data sequencing, error handling).

From simple single-sensor projects to complex multi-device networks, I2C provides an elegant solution for Arduino peripheral communication using minimal pins and straightforward code. The extensive ecosystem of I2C-compatible sensors, displays, and modules ensures that mastering Arduino I2C communication opens doors to countless project possibilities. While troubleshooting can occasionally frustrate (particularly with mysterious address conflicts or signal integrity issues), systematic debugging using I2C scanners and understanding common failure modes resolves most problems quickly.

Whether building weather stations, motion tracking systems, or data logging applications, Arduino I2C communication provides the foundation for reliable, scalable embedded systems. The two-wire simplicity, widespread device support, and robust Wire library implementation make I2C an essential skill for anyone serious about Arduino development.

Leave a Reply

Your email address will not be published. Required fields are marked *

Contact Sales & After-Sales Service

Contact & Quotation

  • Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.

  • Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.

Drag & Drop Files, Choose Files to Upload You can upload up to 3 files.

Notes:
For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.