Native bindings for i2c-dev. Plays well with Raspberry Pi and BeagleBone.
Install
Requires Node.js >= 18 and a Linux system with I2C support. The native addon uses Node-API for ABI stability across Node.js versions — no recompilation needed when upgrading Node.js.
Usage
const I2C = require('i2c'); const address = 0x18; const wire = new I2C(address, { device: '/dev/i2c-1' }); wire.on('open', () => { // device is ready wire.scan((err, data) => { // data contains an array of detected device addresses }); wire.writeByte(byte, (err) => {}); wire.writeBytes(command, [byte0, byte1], (err) => {}); wire.readByte((err, res) => { // res is a single byte }); wire.readBytes(command, length, (err, res) => { // res contains a buffer of bytes }); // plain read/write wire.write([byte0, byte1], (err) => {}); wire.read(length, (err, res) => { // res contains a buffer of bytes }); // continuous streaming wire.on('data', (data) => { // data contains: { address, data, cmd, length, timestamp } }); wire.stream(command, length, delay); // delay in ms (default: 100) wire.stopStream(); // stop streaming });
Raspberry Pi Setup
Enable I2C on Raspberry Pi OS:
Navigate to Interface Options > I2C and select Yes to enable.
Alternatively, enable manually:
sudo dtparam i2c_arm=on sudo modprobe i2c-dev
To load i2c-dev automatically on boot, add it to /etc/modules-load.d/:
echo "i2c-dev" | sudo tee /etc/modules-load.d/i2c.conf
Verify the I2C bus is available:
Install I2C tools for debugging:
sudo apt install i2c-tools i2cdetect -y 1
By default, the I2C device requires root access. To allow non-root users, add your user to the i2c group:
sudo usermod -aG i2c $USERLog out and back in for the group change to take effect.
Device path
The default device path is /dev/i2c-1, which is correct for most Raspberry Pi models (2 and later). For the original Raspberry Pi (rev 1), use /dev/i2c-0:
new I2C(address, { device: '/dev/i2c-0' }); // RPi rev 1 new I2C(address, { device: '/dev/i2c-1' }); // RPi 2+ (default)
BeagleBone Setup
I2C is enabled by default on BeagleBone. Install Node.js and the package:
The I2C buses are available at /dev/i2c-0, /dev/i2c-1, and /dev/i2c-2 depending on your BeagleBone variant. Use i2cdetect to verify:
Projects using i2c
- bonescript — Physical computing library for BeagleBone (GitHub)
- mpu6050 — MPU-6050 accelerometer/gyroscope (GitHub)
- adxl345 — ADXL345 accelerometer (GitHub)
- mcp3424 — MCP3424 ADC (GitHub)
- blinkm — BlinkM LED controller (GitHub)
Contributors
Thanks to @alphacharlie, @J-Cat, and all contributors.