benikigai/plus-onePublic
Plus One
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