matlab/matlab-connect-arduino
> Discover, configure, and connect to Arduino boards from MATLAB using the Arduino Support Package. Use this skill when the user wants to set up an Arduino board, connect to Arduino hardware, find connected boards, scan serial ports, configure Arduino libraries, or any task that requires an Arduino connection as a prerequisite (e.g., blink LED, read sensor, read digital pin, read analog pin, write pin, plot sensor data, scan I2C, use ultrasonic sensor, control servo, read temperature, read voltage, data serial port, hardware connection, Arduino Nano, Arduino Uno, Arduino Mega, Arduino Micro, Grove, sensor setup, I2C scan, ultrasonic, servo, readDigitalPin, writeDigitalPin, readVoltage, writePWMVoltage, temperature sensor, air pressure, pin read, pin write, analog input.
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-connect-arduino
Guides the agent through discovering, configuring, and connecting to Arduino
boards via USB, ensuring the user is informed and in control at each step.
sensors, controlling actuators, scanning I2C, etc.)
matlab-create-custom-arduino-library)arduino object in the workspaceFollow these steps in order. Do not skip steps or guess values.
Core principle: Never assume. Always ask the user before proceeding
if any information is unclear or ambiguous.
Always run both commands — do not skip serialportlist even if
arduinolist already found the board. This is a hard requirement:
list = arduinolist
ports = serialportlist("available")
Both calls are mandatory. Never omit serialportlist — arduinolist
alone misses boards without support package firmware.
arduinolist returns a table with Port, Board, Status, and Libraries
columns. However, it cannot list all connected boards as of R2026a — it
may only show one even when multiple are connected. Always also run
serialportlist("available") to catch all available ports.
If arduinolist is not available (pre-R2024a), skip it and rely on
serialportlist("available") alone.
Present both results to the user.
If arduinolist returns an empty table AND serialportlist("available")
shows no obvious Arduino ports (or all connection attempts fail), **do not
brute-force all ports.** Instead:
physically connected via USB?"
based on their operating system:
a device labeled 'Arduino' or 'USB-SERIAL CH340' / 'USB Serial
Device'? If not, the board may not be connected or needs a driver."
ls /dev/cu.usb* in a terminal. Arduino boardstypically appear as /dev/cu.usbmodem* or /dev/cu.usbserial*."
dmesg | tail -20 after plugging in the board.Look for /dev/ttyACM* or /dev/ttyUSB*."
holds the port open
arduino object, restart MATLAB and reconnect
https://www.mathworks.com/help/matlab/supportpkg/arduino-connection-failure.html
responds. If the user confirms the board is not connected, continue
troubleshooting here. If connected, return to Step 1 and re-run
discovery.
Serial port names alone do not tell the user what device is connected.
Guide the user to identify which ports are Arduino boards:
ports correspond to Arduino boards."
/dev/cu.usbmodem* or /dev/cu.usbserial*entries — these are typically Arduino boards."
dmesg | grep tty or look for /dev/ttyACM* and/dev/ttyUSB* devices."
Present the discovered boards/ports and ask the user which to connect to.
Never auto-select a board.
Ask for:
arduino('<port>') which auto-detects the board type
For multi-board scenarios, ask the user to identify each board by port
and its intended role.
The default libraries are {'I2C', 'SPI', 'Servo'} — MATLAB loads these
automatically if no Libraries argument is specified.
Library strategy:
{'I2C', 'SPI', 'Servo'}| User mentions | Add library |
|---------------|-------------|
| ultrasonic, distance sensor, HC-SR04 | 'Ultrasonic' |
| shift register, 74HC595 | 'ShiftRegister' |
| rotary encoder, quadrature | 'RotaryEncoder' |
| motor shield, Adafruit motor | 'Adafruit/MotorShieldV2' |
| motor carrier, MKR motor | 'MotorCarrier' |
| CAN bus | 'CAN' |
| serial device, UART | 'Serial' |
| APDS9960, gesture, color sensor | 'APDS9960' |
**Only infer from the table above when the match is explicit and
unambiguous.** If uncertain, ask the user rather than guessing libraries.
listArduinoLibraries andshow the full list
Build the arduino() call based on what you gathered:
% TEMPLATE — not executable
% With board type known + custom libraries:
a = arduino('<port>', '<board>', 'Libraries', {'I2C', 'SPI', 'Servo', ...});
% With board type known, default libraries only:
a = arduino('<port>', '<board>');
% Auto-detect board type (uses libraries already flashed on board):
a = arduino('<port>');
Important: You cannot specify 'Libraries' without also specifying the
board type. If the user doesn't know their board type but needs extra
libraries, run arduino('<port>') first to auto-detect, then read
a.Board and reconnect with the board type and libraries specified.
If the connection fails:
explicitly instructs
Common issues:
arduino object already exists in the workspace;the user must clear it before reconnecting
After successful connection:
with libraries: [list]."
"blink LED", "read ultrasonic sensor"), announce: "Now proceeding
with [task]..." and continue with the downstream workflow.
| Function | Purpose | Available From |
|----------|---------|----------------|
| arduinolist | Discover connected Arduino boards (table output) | R2024a |
| serialportlist("available") | List all available serial ports | R2019b |
| arduino(port) | Connect with auto-detected board type, default libraries | R2014b |
| arduino(port, board) | Connect with specified board, default libraries | R2014b |
| arduino(port, board, 'Libraries', libs) | Connect with specified board and custom libraries | R2014b |
| listArduinoLibraries | List all available add-on libraries | R2014b |
% TEMPLATE — not executable
% Step 1: Discover
list = arduinolist;
ports = serialportlist("available");
% Step 3-5: Connect (after user selects port and board is known)
a = arduino('COM8', 'Nano33BLE', 'Libraries', {'I2C', 'SPI', 'Servo', 'Ultrasonic'});
% TEMPLATE — not executable
% Connect to each board with its own variable and libraries
a1 = arduino('COM8', 'Nano33BLE', 'Libraries', {'I2C', 'SPI', 'Servo'});
a2 = arduino('COM52', 'Uno', 'Libraries', {'I2C', 'SPI', 'Servo', 'Ultrasonic'});
| Mistake | Why It's Wrong | Correct Approach |
|---------|---------------|-----------------|
| Using arduino() with no arguments | Connects to arbitrary board without user consent | Always discover first, let user choose |
| Guessing COM port or board type | Wastes time on wrong ports, reflashes wrong boards | Ask the user, or use auto-detect with port only |
| Loading only the needed library | Reconnecting later with more libraries takes 30+ sec | Load defaults {'I2C','SPI','Servo'} plus any inferred extras |
| Using arduino(port, 'Libraries', libs) without board | Error: must specify both port and board before name-value pairs | Use arduino(port, board, 'Libraries', libs) or arduino(port) for auto-detect with defaults |
| Skipping serialportlist when arduinolist succeeds | Misses boards without support package firmware or pre-R2024a boards | Always run both — serialportlist is mandatory even when arduinolist returns results |
| Killing processes to free a port | Destructive action without user consent | Report the port conflict, ask user to close the other application |
arduinolist AND serialportlist("available") in every discovery step — even if arduinolist already found the board. serialportlist catches boards that arduinolist does not recognize.{'I2C', 'SPI', 'Servo'} are always includedconnection to a given board at a time. Do not run multiple parallel agents
that each try to connect to Arduino hardware. Run Arduino workflows
sequentially.
----
Copyright 2026 The MathWorks, Inc.
----
Take matlab/matlab-connect-arduino from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.