Node.js implementation of the Arduino Firmata protocol for controlling Arduino boards from JavaScript applications
npx @tessl/cli install tessl/npm-arduino-firmata@0.3.0Arduino Firmata is a Node.js library that implements the Arduino Firmata protocol, enabling developers to control Arduino boards directly from JavaScript applications. It provides a comprehensive API for digital I/O operations, analog I/O with PWM support, servo motor control, and custom SysEx message handling with real-time event-driven communication.
npm install arduino-firmataconst ArduinoFirmata = require('arduino-firmata');const ArduinoFirmata = require('arduino-firmata');
const arduino = new ArduinoFirmata();
// Connect to Arduino (auto-detects port)
arduino.connect();
arduino.on('connect', function(){
console.log("Connected to: " + arduino.serialport_name);
console.log("Board version: " + arduino.boardVersion);
// Basic digital I/O
arduino.digitalWrite(13, true); // Turn on LED
arduino.digitalWrite(13, false); // Turn off LED
// Analog operations
arduino.analogWrite(9, 128); // PWM output (50%)
const reading = arduino.analogRead(0); // Read analog pin
// Servo control
arduino.servoWrite(11, 90); // Move servo to 90 degrees
});Arduino Firmata is built around several key components:
Core connection functionality for detecting and communicating with Arduino boards over serial ports.
class ArduinoFirmata extends EventEmitter2 {
constructor();
connect(serialport_name?: string, opts?: ConnectionOptions): ArduinoFirmata;
close(callback?: Function): void;
reset(callback?: Function): void;
write(bytes: number[], callback?: Function): void;
isOpen(): boolean;
}
interface ConnectionOptions {
baudrate?: number; // default: 57600
}
// Static methods
ArduinoFirmata.list(callback: (error: Error|null, devices: string[]) => void): void;Connection and Device Management
Digital pin control for reading and writing binary states, with real-time change monitoring.
// Digital I/O methods
pinMode(pin: number, mode: number|boolean, callback?: Function): void;
digitalWrite(pin: number, value: boolean|number, callback?: Function): void;
digitalRead(pin: number): boolean;
// Pin mode constants
ArduinoFirmata.INPUT = 0;
ArduinoFirmata.OUTPUT = 1;
ArduinoFirmata.LOW = 0;
ArduinoFirmata.HIGH = 1;Analog input reading and PWM output control for interfacing with sensors and controlling analog devices.
// Analog I/O methods
analogWrite(pin: number, value: number, callback?: Function): void;
analogRead(pin: number): number;
// Additional pin mode constants
ArduinoFirmata.ANALOG = 2;
ArduinoFirmata.PWM = 3;Servo motor control with angle-based positioning for robotics and automation projects.
servoWrite(pin: number, angle: number, callback?: Function): void;
// Servo mode constant
ArduinoFirmata.SERVO = 4;Custom system exclusive messaging for extended Arduino functionality beyond standard Firmata operations.
sysex(command: number, data?: number[], callback?: Function): void;
// SysEx protocol constants
ArduinoFirmata.START_SYSEX = 0xF0;
ArduinoFirmata.END_SYSEX = 0xF7;Real-time event monitoring for pin state changes, board connection status, and custom SysEx messages.
// Event types (EventEmitter2 events)
// 'connect' - Fired when Arduino connection is established
// 'boardReady' - Fired when board is detected and initialized
// 'boardVersion' - Fired when board version is received
// 'digitalChange' - Fired when digital pin state changes
// 'analogChange' - Fired when analog pin value changes
// 'sysex' - Fired when SysEx message is received
interface DigitalChangeEvent {
pin: number;
value: boolean;
old_value: boolean;
}
interface AnalogChangeEvent {
pin: number;
value: number; // 0-1023
old_value: number;
}
interface SysexEvent {
command: number;
data: number[];
}// Connection status
ArduinoFirmata.Status = {
CLOSE: 0,
OPEN: 1
};
// Pin modes
ArduinoFirmata.INPUT = 0;
ArduinoFirmata.OUTPUT = 1;
ArduinoFirmata.ANALOG = 2;
ArduinoFirmata.PWM = 3;
ArduinoFirmata.SERVO = 4;
ArduinoFirmata.SHIFT = 5;
ArduinoFirmata.I2C = 6;
// Digital values
ArduinoFirmata.LOW = 0;
ArduinoFirmata.HIGH = 1;
// Protocol constants
ArduinoFirmata.MAX_DATA_BYTES = 32;
ArduinoFirmata.DIGITAL_MESSAGE = 0x90;
ArduinoFirmata.ANALOG_MESSAGE = 0xE0;
ArduinoFirmata.REPORT_ANALOG = 0xC0;
ArduinoFirmata.REPORT_DIGITAL = 0xD0;
ArduinoFirmata.SET_PIN_MODE = 0xF4;
ArduinoFirmata.REPORT_VERSION = 0xF9;
ArduinoFirmata.SYSTEM_RESET = 0xFF;
ArduinoFirmata.START_SYSEX = 0xF0;
ArduinoFirmata.END_SYSEX = 0xF7;interface ArduinoFirmataInstance {
readonly status: number; // Status.CLOSE (0) or Status.OPEN (1)
readonly serialport_name: string; // Name of connected serial port
readonly boardVersion: string; // Arduino board firmware version (e.g. "2.3")
}