serial-arduino · git:20260913.38a8ac8 · 2026-09-13 · sha256 bf1f48e247c2991f

serial-arduino git:20260913.38a8ac8A

Immutable. This exact content is served forever at /api/v1/blob/bf1f48e247c2991f.

---
name: serial-arduino
description: Adapter oficial Serial/USB — placas Arduino e compatíveis falando o protocolo JSONL de linha, com o firmware de referência versionado no repo.
kind: hardware-adapter
triggers:
  - arduino
  - serial
  - usb
provides:
  transport: serial
  capabilities: [digital_read, analog_read, digital_write, pwm]
  presets:
    - entity: bancada
      capability: analog_read
      synonyms: ["placa da bancada", "workbench board"]
    - entity: bancada
      capability: digital_write
      synonyms: ["rele da bancada", "workbench relay"]
---

# Serial / Arduino

A ponte direta: uma placa plugada no cabo USB, falando JSON por linha.

## O que este skill declara

- `transport: serial` — o core (`garraia-hardware`, feature
  `hardware-serial`) abre a porta, faz o handshake e lê/escreve JSONL;
- as quatro capabilities da tabela **fechada** de periféricos.

## Firmware de referência

O sketch está em `crates/garraia-hardware/examples/firmware/` — é código
Arduino/C++, não um alvo Cargo.

## Risco: a tabela é fechada, e por quê

Ao contrário do MQTT, aqui o risco **não** vem do dispositivo. Uma placa
plugada num cabo USB não passou por ACL nenhuma, então ela não pode ser a
fonte da própria classificação: `digital_read` e `analog_read` são R0,
`digital_write` e `pwm` são R2, e isso está no código
(`garraia_hardware::perifericos`), não no manifesto que a placa envia.

O id que a placa declara também não vira chave de registry sozinho: ele sai
como `serial:<id>` e o registro usa `register_if_absent`, então uma segunda
placa não sequestra as leituras endereçadas à primeira.

## Editar para a sua bancada

Troque `entity: bancada` pelo id que o seu firmware declara no handshake.