or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

analog-io.mdconnection.mddigital-io.mdevents.mdindex.mdservo.mdsysex.md
tile.json

tessl/npm-arduino-firmata

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

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/arduino-firmata@0.3.x

To install, run

npx @tessl/cli install tessl/npm-arduino-firmata@0.3.0

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