CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-arduino-firmata

Node.js implementation of the Arduino Firmata protocol for controlling Arduino boards from JavaScript applications

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

index.mddocs/

Arduino Firmata

Arduino 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.

Package Information

  • Package Name: arduino-firmata
  • Package Type: npm
  • Language: JavaScript (compiled from CoffeeScript)
  • Installation: npm install arduino-firmata

Core Imports

const ArduinoFirmata = require('arduino-firmata');

Basic Usage

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
});

Architecture

Arduino Firmata is built around several key components:

  • Connection Management: Auto-detection of Arduino devices and connection handling
  • Event System: Real-time pin state change monitoring via EventEmitter2
  • Protocol Implementation: Complete Firmata 2.2 protocol with binary message parsing
  • I/O Operations: Digital/analog read/write operations with pin mode management
  • SysEx Support: Custom message system for extended functionality
  • Multi-Process Support: Ability to share Arduino connections across Node.js processes

Capabilities

Connection and Device Management

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 I/O Operations

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;

Digital I/O Operations

Analog I/O and PWM

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;

Analog I/O and PWM

Servo Control

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;

Servo Control

SysEx Messaging

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;

SysEx Messaging

Event System

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[];
}

Event System

Constants and Status Values

// 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;

Instance Properties

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")
}

docs

analog-io.md

connection.md

digital-io.md

events.md

index.md

servo.md

sysex.md

tile.json