benikigai/plus-onePublic

Plus One

interface.yaml · 6.3 KB · commit #5 · Nov 2, 2026

SHA-256 0bec166e28a2b0e8eb71feaf2cc72a6cbc65de1839d9b1a067038d4ba1d6c65d

# The Plus One base, as an interface any accessory can be built against.
# Hand this file to your agent with accessories/README.md.
# Status: proposal for a prototype in design. Nothing is built; every number is a target.

interface: plus-one-base@1
status: proposal
product: Plus One, generation one (OPD benikigai/plus-one)
frame: >
  Millimetres. Origin at the centre of the puck's footprint, z = 0 at the puck's base face,
  +z up into the puck, +y toward the alignment key. Angles are measured counter-clockwise
  from +x, seen from above (looking down at the plus). An accessory sits below z = 0.

puck:
  diameter: 57.0
  thickness: 9.5
  base_face: flat disc, radius 27.2, inside the top shell's rim (outer radius 28.5)

magnets:
  # The magnets are sealed inside the puck. Never put magnets in a printed back; use the steel ring.
  ring:
    inner_radius: 23.0
    outer_radius: 26.8
    thickness: 1.0
    depth_below_base_face: 0.3
  layout: sized for magnetic phone mounts and chargers
  polarity: to be checked against the WPC spec
  note: No Qi2 or MagSafe claim. The puck works with magnetic phone mounts and chargers.

steel_ring_for_printed_backs:
  inner_radius: 23.0
  outer_radius: 26.8
  thickness: 0.6
  material: low-carbon steel, zinc-plated (a plain washer or a laser-cut ring)
  pocket_in_the_back: 0.15 mm larger all round, 0.65 deep, flush with the back's top face

charging_coil:
  radius: 19.0
  keep_out: no metal within radius 20 of the centre, or wireless charging stops

twist_lock:
  # Three windows in the puck's rim expose three lugs. A back's hooks drop into the open half
  # of each window and twist 18 degrees counter-clockwise (seen from above) to sit over the lugs.
  windows:
    centres_deg: [30, 150, 270]
    span_deg: 34
    height_above_base_face: 1.8
    radial: from radius 27.0 out through the rim
  lugs:
    centre_offset_deg: 9.0     # the lug fills the counter-clockwise half of its window
    width: 7.0                 # tangential
    radial: [27.2, 28.3]
    z: [0.35, 1.15]
  back_hooks:
    entry_offset_deg: -9.0     # where the hook drops in
    locked_offset_deg: 9.0     # where it sits after the twist
    width: 6.4
    inner_radius: 27.7         # 0.6 mm radial overlap with the lug
    z: [1.25, 1.65]
  back_collar:
    inner_radius: 28.75        # 0.25 mm clearance to the puck
    outer_radius: 30.35
    height: 1.65
  twist_deg: 18
  load_carrier: the lugs carry the load; the magnets only align

alignment_key:
  slot_in_puck: arc from 70 to 93 degrees, radial 25.8 to 27.2, 1.0 deep
  tab_on_back: 1.0 radial x 0.9 tangential x 0.8 tall, at radius 26.5; enters at 72 degrees, locks at 90

pogo_pads:
  # Flat gold pads on the puck, flush with the base face. Modules carry the spring pins.
  radius: 21.0
  pad_diameter: 2.0
  positions_deg: [246, 258, 270, 282, 294]
  placement: outside the charging coil, inside the magnet ring
  pinout:
    - {pad: 1, angle_deg: 246, name: PWR}
    - {pad: 2, angle_deg: 258, name: SDA}
    - {pad: 3, angle_deg: 270, name: GND}
    - {pad: 4, angle_deg: 282, name: SCL}
    - {pad: 5, angle_deg: 294, name: ID}
  order_status: proposal
  electrical:
    PWR:
      out_to_module: battery voltage, 3.5 to 4.2 V, limited to 300 mA, switched on only after the ID is read
      in_from_dock_or_power_module: 5.0 V, up to 500 mA, charges the cell
      short_circuit: the puck's load switch trips; a shorted module is safe
    SDA_SCL: 3.3 V I2C, up to 400 kHz, 4.7 kOhm pull-ups in the puck; modules add none below 10 kOhm
    ID: 3.3 V 1-Wire, 4.7 kOhm pull-up in the puck; left open means a passive back
  spring_pins_on_the_module:
    travel: 0.5 to 1.0 mm working
    force: 0.4 to 0.8 N per pin
    tip: gold-plated, radius at least 0.5 mm

accessory_id:
  status: proposal
  carrier: a 1-Wire EEPROM on the ID pad (64-bit ROM plus at least 128 bytes)
  record_v1:
    - {field: magic, type: ascii4, value: P1A1}
    - {field: record_version, type: u8, value: 1}
    - {field: vendor_id, type: u16, note: "0x0001 is N+1 Labs; other makers get one when they list on the hub"}
    - {field: product_id, type: u16}
    - {field: hardware_revision, type: u8}
    - {field: class, type: u8, values: {0: passive with ID, 1: power source, 2: sensor, 3: display, 4: radio, 5: infrared}}
    - {field: power_draw_ma, type: u16, note: "peak from PWR; the puck refuses above 300"}
    - {field: i2c_addresses, type: "u8[4]", note: "0 for unused"}
    - {field: name, type: ascii24}
    - {field: opd, type: ascii32, note: "hub slug of the accessory's OPD, for example maker/bike-mount"}
    - {field: crc16, type: u16, note: "CRC-16/CCITT over every field before it"}
  firmware_behaviour: >
    The puck reads the ID before switching PWR on. No ID means a passive back: PWR stays off.
    A bad CRC, an unknown class or a power draw over 300 mA leaves PWR off and shows it on the ring.

keep_outs:
  - {what: charging coil, rule: "no metal within radius 20 of the centre"}
  - {what: antenna, rule: "no metal over the module's antenna end, x 3 to 11, y 1 to 21 on the base face, to be confirmed with the module vendor's guidance"}
  - {what: USB-C, rule: "leave the -x side clear from z 2.4 to 6.4; a back's collar stops at 1.65"}
  - {what: BOOT pinhole, rule: "a hole of at least 3 mm under (-12, -1) so a pin can reach it"}
  - {what: pads, rule: "a passive back leaves the five pads untouched: 1.8 mm radius clear around each"}
  - {what: speaker and mics, rule: "never cover the top: the speaker fires through the light-ring seam and the mics through two top ports"}

loads:
  magnetic_hold_n: {target: 8.0, status: target, note: "on a reference magnetic phone mount"}
  lug_pull_out_n: {target: 30.0, status: target, note: "puck pulled straight off a locked back"}
  measured: none yet; nothing is built

fdm_printing:
  printers: any hobby FDM printer; flat on the bed, collar up, no supports
  materials: PETG preferred; PLA for indoor use
  clearances_mm:
    collar_to_puck: 0.25     # radial
    hook_over_lug: 0.10      # vertical
    window_over_hook: 0.15   # vertical
    key_tab_in_slot: 0.15    # each side
  scale_check: print accessories/cad/fit-gauge.step first; it must lock with a firm click and release without force

files:
  fit_gauge: accessories/cad/fit-gauge.step
  flat_back_template: accessories/cad/flat-back-template.step
  steel_ring: accessories/cad/steel-ring.step
  parametric_template: accessories/template/mating_half.py
  catalog: accessories/catalog.yaml