astra/iphone-encoder-counter

A CR2450-powered MSP430 FRAM counter combines an always-on dual-channel TMR rotation sensor, pushbutton input, and ST25DV NFC tag with an integrated tuned printed antenna and I²C/GPIO interface.

Version
1.0.3
License
unset
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { SKRPANE010 } from "./imports/SKRPANE010"
import { ST25DV04KC_JF6D3 } from "./imports/ST25DV04KC_JF6D3"
import { MSP430FR2433IRGER } from "./imports/MSP430FR2433IRGER"
import { BS_24_B4AA016 } from "./imports/BS_24_B4AA016"
import { ADT002 } from "./imports/ADT002"
import { Debug4 } from "./imports/Pads"
const connect=(net:string,pins:string[])=>pins.map(pin=><trace key={pin} from={pin} to={`net.${net}`} />)
const spiral=[{x:17,y:-9}]
for(let k=0;k<7;k++) {
 const d=k*0.5
 spiral.push({x:17-d,y:18-d},{x:-17+d,y:18-d},{x:-17+d,y:-8+d},{x:16.5-d,y:-8+d})
}
spiral[spiral.length-1]={x:13,y:-5}
spiral.push({x:13,y:-3})
export default () => <board schAutoLayoutEnabled={false} schLayout={{layoutMode:"relative"}} schMaxTraceDistance={4} width={60} height={100} layers={2} thickness={1.6}
 fabricatorPreset="jlcpcb_economy" minTraceWidth={0.15}
 minViaHoleDiameter={0.3} minViaPadDiameter={0.6}
 minTraceToPadEdgeClearance={0.18} minPadEdgeToPadEdgeClearance={0.18}
 minViaEdgeToPadEdgeClearance={0.20} minBoardEdgeClearance={0.3} autorouter={{preset:"auto-local", traceClearance:0.20, allowViaInPad:false}}>
 <schematicsheet name="counter" sheetWidth={340} sheetHeight={230} displayName="iPhone encoder counter — Rev C">
  <schematicsection name="power" displayName="CR2450 and measurement link">
   <BS_24_B4AA016 name="BT1" pcbX={0} pcbY={-34.0} layer="top" schX={-13.5} schY={6.0} schRotation={180}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R0" supplierPartNumbers={{jlcpcb:["C21189"]}} manufacturerPartNumber="0603WAF0000T5E" resistance="0" footprint="0603" pcbX={23} pcbY={-27} schX={-11.5} schY={6.0} schRotation={0}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C1" supplierPartNumbers={{jlcpcb:["C19666"]}} manufacturerPartNumber="CL10A475KO8NNNC" capacitance="4.7uF" footprint="0603" pcbX={8} pcbY={0.0} schX={-9.5} schY={5.5} schRotation={270}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C2" supplierPartNumbers={{jlcpcb:["C1525"]}} manufacturerPartNumber="CL05B104KO5NNNC" capacitance="100nF" footprint="0402" pcbX={9} pcbY={-2.0} schX={-7.5} schY={5.5} schRotation={270}/>
  </schematicsection>
  <schematicsection name="sensor" displayName="Always-on TMR quadrant sensing">
   <ADT002 name="U2" schWidth={2} schHeight={2} schPinArrangement={{leftSide:[3,4],rightSide:[2,5],topSide:[1],bottomSide:[6,7]}} pcbX={0} pcbY={-13.0} schX={-12.5} schY={-5.0} schRotation={0}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C3" supplierPartNumbers={{jlcpcb:["C1525"]}} manufacturerPartNumber="CL05B104KO5NNNC" capacitance="100nF" footprint="0402" pcbX={-3} pcbY={-12.0} schX={-14.5} schY={-3.5} schRotation={270}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R1" supplierPartNumbers={{jlcpcb:["C11702"]}} manufacturerPartNumber="0402WGF1001TCE" resistance="1k" footprint="0402" pcbX={0} pcbY={-16.5} schX={-10.0} schY={-4.0} schRotation={0}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R2" supplierPartNumbers={{jlcpcb:["C11702"]}} manufacturerPartNumber="0402WGF1001TCE" resistance="1k" footprint="0402" pcbX={1} pcbY={-9.5} schX={-10.0} schY={-6.0} schRotation={0}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C4" supplierPartNumbers={{jlcpcb:["C1546"]}} manufacturerPartNumber="0402CG101J500NT" capacitance="100pF" footprint="0402" pcbX={2.5} pcbY={-16.5} schX={-8.0} schY={-4.5} schRotation={270}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C5" supplierPartNumbers={{jlcpcb:["C1546"]}} manufacturerPartNumber="0402CG101J500NT" capacitance="100pF" footprint="0402" pcbX={3.5} pcbY={-9.5} schX={-8.0} schY={-6.5} schRotation={270}/>
  </schematicsection>
  <schematicsection name="mcu" displayName="FRAM counter / sleep between transitions">
   <MSP430FR2433IRGER pcbStyle={{silkscreenTextVisibility:"hidden"}} name="U1" schWidth={3.2} schHeight={5.5} schPinSpacing={0.32} schPinArrangement={{leftSide:[7,8,15,1,2],rightSide:[9,10,11,13,21,3,4,5,6,12,14,16,17,19,20,22],topSide:[24],bottomSide:[18,23,25]}} pcbX={9} pcbY={-6.0} schX={0.0} schY={5.0} schRotation={0}
    noConnect={["P1_4","P1_5","P1_6","P1_7","P3_0","P3_1","P2_5","P2_6","P2_7","P3_2","P2_1"]}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R3" supplierPartNumbers={{jlcpcb:["C25792"]}} manufacturerPartNumber="0402WGF4702TCE" resistance="47k" footprint="0402" pcbX={5} pcbY={-3.5} schX={-2.5} schY={0.0} schRotation={270}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C6" supplierPartNumbers={{jlcpcb:["C53547"]}} manufacturerPartNumber="0402CG102J500NT" capacitance="1nF" footprint="0402" pcbX={3} pcbY={-6} schX={-0.5} schY={0.0} schRotation={270}/>
   <Debug4 doNotPlace name="J2" pcbX={-12} pcbY={-3} schX={2.0} schY={0.0} schRotation={0}/>
  </schematicsection>
  <schematicsection name="nfc" displayName="Integrated NFC antenna">
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R4" supplierPartNumbers={{jlcpcb:["C25117"]}} manufacturerPartNumber="0402WGF4700TCE" resistance="470" footprint="0402" pcbX={10} pcbY={13} schX={8.0} schY={-3.5} schRotation={0}/>
  </schematicsection>
  <schematicsection name="rf" displayName="13.56 MHz coil / tune on actual phone">
   <inductor doNotPlace name="L1" inductance="3uH" schX={13.5} schY={6.0} schRotation={270} pcbX={0} pcbY={29.0}
    footprint={<footprint>
     <smtpad portHints={["pin1"]} pcbX={17} pcbY={-9} width={0.7} height={0.7} shape="rect"/>
     <platedhole portHints={["pin2"]} pcbX={13} pcbY={-3} shape="circle" holeDiameter={0.3} outerDiameter={0.6}/>
     <pcbtrace route={spiral.map(p=>({...p,route_type:"wire" as const,width:0.25,layer:"top" as const}))}/>
    </footprint>}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C9" supplierPartNumbers={{jlcpcb:["C441742"]}} manufacturerPartNumber="GJM1555C1H150FB01D" capacitance="15pF" footprint="0402" pcbX={18} pcbY={18} schX={12.0} schY={6.0} schRotation={270}/>
   <ST25DV04KC_JF6D3 name="U3" pcbRotation={180} schWidth={2.3} schHeight={3} schPinSpacing={0.4} schPinArrangement={{leftSide:[7,8,1,11],rightSide:[4,5,3,2,9,13],topSide:[12,10],bottomSide:[6]}} pcbX={14} pcbY={17.5} schX={9.0} schY={5.0} schRotation={0}
    noConnect={["NC1","NC2","V_EH","EP"]}/>
  </schematicsection>
  <schematicsection name="host" displayName="GPIO power gating / no battery charging">
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C7" supplierPartNumbers={{jlcpcb:["C15195"]}} manufacturerPartNumber="CL05B103KB5NNNC" capacitance="10nF" footprint="0402" pcbX={11} pcbY={16} schX={10.0} schY={-4.5} schRotation={270}/>
   <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C8" supplierPartNumbers={{jlcpcb:["C1525"]}} manufacturerPartNumber="CL05B104KO5NNNC" capacitance="100nF" footprint="0402" pcbX={17} pcbY={14} schX={12.5} schY={-4.5} schRotation={270}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R5" supplierPartNumbers={{jlcpcb:["C25744"]}} manufacturerPartNumber="0402WGF1002TCE" resistance="10k" footprint="0402" pcbX={12} pcbY={13} schX={9.0} schY={-7.0} schRotation={270}/>
   <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R6" supplierPartNumbers={{jlcpcb:["C25744"]}} manufacturerPartNumber="0402WGF1002TCE" resistance="10k" footprint="0402" pcbX={14} pcbY={13} schX={11.5} schY={-7.0} schRotation={270}/>
  </schematicsection>
  <SKRPANE010 internallyConnectedPins={[["pin1","pin2"],["pin3","pin4"]]} name="SW1" pcbX={-15} pcbY={-12} schX={-2.0} schY={-5.5} schRotation={0} />
  <resistor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="R7" supplierPartNumbers={{jlcpcb:["C25767"]}} manufacturerPartNumber="0402WGF2203TCE" resistance="220k" footprint="0402" pcbX={-10} pcbY={-10} schX={0.0} schY={-4.0} schRotation={270}/>
  <capacitor pcbStyle={{silkscreenTextVisibility:"hidden"}} name="C10" supplierPartNumbers={{jlcpcb:["C53547"]}} manufacturerPartNumber="0402CG102J500NT" capacitance="1nF" footprint="0402" pcbX={-10} pcbY={-13} schX={2.0} schY={-5.5} schRotation={270}/>
  {connect("BAT_RAW",[".BT1 > .pin1", ".R0 > .pin1"])}
  {connect("VBAT",[".R0 > .pin2", ".C1 > .pin1", ".C2 > .pin1", ".C3 > .pin1", ".U1 > .DVCC", ".U2 > .VDD", ".R3 > .pin1", ".J2 > .VTREF", ".U3 > .VDCG", ".C8 > .pin1", ".R7 > .pin1"])}
  {connect("GND",[".BT1 > .pin2", ".C1 > .pin2", ".C2 > .pin2", ".C3 > .pin2", ".C4 > .pin2", ".C5 > .pin2", ".C6 > .pin2", ".U1 > .DVSS1", ".U1 > .DVSS2", ".U1 > .EP", ".U2 > .GND", ".U2 > .EP", ".J2 > .GND", ".U3 > .VSS", ".C7 > .pin2", ".C8 > .pin2", ".C10 > .pin2", ".SW1 > .pin3", ".SW1 > .pin4"])}
  {connect("SIN_RAW",[".U2 > .SIN", ".R1 > .pin1"])}
  {connect("COS_RAW",[".U2 > .COS", ".R2 > .pin1"])}
  {connect("SIN",[".R1 > .pin2", ".C4 > .pin1", ".U1 > .P1_0"])}
  {connect("COS",[".R2 > .pin2", ".C5 > .pin1", ".U1 > .P1_1"])}
  {connect("RESET",[".U1 > .RST_SBWTDIO", ".R3 > .pin2", ".C6 > .pin1", ".J2 > .SBWTDIO"])}
  {connect("TEST",[".U1 > .TEST_SBWTCK", ".J2 > .SBWTCK"])}
  {connect("NFC_GPIO",[".U1 > .P2_2", ".R4 > .pin1"])}
  {connect("NFC_VCC",[".R4 > .pin2", ".U3 > .VCC", ".C7 > .pin1", ".R5 > .pin1", ".R6 > .pin1"])}
  {connect("LPD",[".U1 > .P2_3", ".U3 > .LPD"])}
  {connect("SDA",[".U1 > .P1_2_SDA", ".U3 > .SDA", ".R5 > .pin2"])}
  {connect("SCL",[".U1 > .P1_3_SCL", ".U3 > .SCL", ".R6 > .pin2"])}
  {connect("GPO",[".U1 > .P2_0", ".U3 > .GPO"])}
  {connect("AC0",[".U3 > .AC0", ".C9 > .pin1", ".L1 > .pin1"])}
  {connect("AC1",[".U3 > .AC1", ".C9 > .pin2", ".L1 > .pin2"])}
  {connect("BUTTON_N",[".R7 > .pin2", ".C10 > .pin1", ".SW1 > .pin1", ".SW1 > .pin2", ".U1 > .P2_4"])}
  <schematicbox schX={-11.0} schY={5.0} width={9.5} height={6.0} title="01  COIN CELL / DECOUPLING" titleFontSize={0.27} strokeStyle="dashed" />
  <schematicbox schX={0.0} schY={3.5} width={10.5} height={10.0} title="02  FRAM COUNTER / PROGRAMMING" titleFontSize={0.27} strokeStyle="dashed" />
  <schematicbox schX={11.0} schY={5.0} width={9.5} height={6.0} title="03  NFC TAG / PRINTED COIL" titleFontSize={0.27} strokeStyle="dashed" />
  <schematicbox schX={-11.0} schY={-5.0} width={9.5} height={8.5} title="04  ALWAYS-ON ROTATION SENSOR" titleFontSize={0.27} strokeStyle="dashed" />
  <schematicbox schX={0.0} schY={-5.5} width={10.5} height={6.8} title="05  INDEPENDENT BUTTON COUNT" titleFontSize={0.27} strokeStyle="dashed" />
  <schematicbox schX={11.0} schY={-5.0} width={9.5} height={8.5} title="06  NFC POWER / I2C PULL-UPS" titleFontSize={0.27} strokeStyle="dashed" />
  <schematictext schX={-15.5} schY={9.5} anchor="left" text="iPHONE ENCODER COUNTER  /  REV C" fontSize={0.48750000000000004} />
  <schematictext schX={-11.0} schY={3.0} text="CR2450 3 V | R0: current measurement link" fontSize={0.22749999999999998} />
  <schematictext schX={-11.0} schY={-8.5} text="U2: C17208043 | rotating in-plane magnet" fontSize={0.20800000000000002} />
  <schematictext schX={0.0} schY={-8.0} text="Active low | 20 ms firmware debounce" fontSize={0.22749999999999998} />
  <schematictext schX={11.0} schY={2.5} text="L1 / C9: tune in final phone case" fontSize={0.22749999999999998} />
  <netlabel net="GND" connectsTo=".BT1 > .pin2" schX={-12.4500} schY={6.0000} />
  <netlabel net="VBAT" connectsTo=".R0 > .pin2" schX={-10.5500} schY={6.0000} />
  <netlabel net="VBAT" connectsTo=".C1 > .pin1" schX={-9.5000} schY={6.4500} />
  <netlabel net="GND" connectsTo=".C1 > .pin2" schX={-9.5000} schY={4.5500} />
  <netlabel net="VBAT" connectsTo=".C2 > .pin1" schX={-7.5000} schY={6.4500} />
  <netlabel net="GND" connectsTo=".C2 > .pin2" schX={-7.5000} schY={4.5500} />
  <netlabel net="VBAT" connectsTo=".U2 > .pin1" schX={-12.5000} schY={-2.9500} />
  <netlabel net="VBAT" connectsTo=".C3 > .pin1" schX={-14.5000} schY={-2.5500} />
  <netlabel net="GND" connectsTo=".C3 > .pin2" schX={-14.5000} schY={-4.4500} />
  <netlabel anchorSide="left" net="SIN" connectsTo=".R1 > .pin2" schX={-9.0500} schY={-4.0000} />
  <netlabel anchorSide="left" net="COS" connectsTo=".R2 > .pin2" schX={-9.0500} schY={-6.0000} />
  <netlabel anchorSide="left" net="SIN" connectsTo=".C4 > .pin1" schX={-8.0000} schY={-3.5500} />
  <netlabel net="GND" connectsTo=".C4 > .pin2" schX={-8} schY={-5.05} />
  <netlabel anchorSide="left" net="COS" connectsTo=".C5 > .pin1" schX={-8} schY={-5.9} />
  <netlabel net="GND" connectsTo=".C5 > .pin2" schX={-8.0000} schY={-7.4500} />
  <netlabel anchorSide="right" net="RESET" connectsTo=".U1 > .pin1" schX={-2.6500} schY={4.8000} />
  <netlabel anchorSide="right" net="TEST" connectsTo=".U1 > .pin2" schX={-2.6500} schY={4.6000} />
  <netlabel anchorSide="right" net="SIN" connectsTo=".U1 > .pin7" schX={-2.6500} schY={5.4000} />
  <netlabel anchorSide="right" net="COS" connectsTo=".U1 > .pin8" schX={-2.6500} schY={5.2000} />
  <netlabel anchorSide="left" net="SDA" connectsTo=".U1 > .pin9" schX={2.6500} schY={6.5000} />
  <netlabel anchorSide="left" net="SCL" connectsTo=".U1 > .pin10" schX={2.6500} schY={6.3000} />
  <netlabel anchorSide="left" net="NFC_GPIO" connectsTo=".U1 > .pin11" schX={2.6500} schY={6.1000} />
  <netlabel anchorSide="left" net="LPD" connectsTo=".U1 > .pin13" schX={2.6500} schY={5.9000} />
  <netlabel anchorSide="right" net="BUTTON_N" connectsTo=".U1 > .pin15" schX={-2.6500} schY={5.0000} />
  <netlabel anchorSide="left" net="GPO" connectsTo=".U1 > .pin21" schX={2.6500} schY={5.7000} />
  <netlabel net="VBAT" connectsTo=".U1 > .pin24" schX={0.0000} schY={8.8000} />
  <netlabel net="VBAT" connectsTo=".R3 > .pin1" schX={-2.5000} schY={0.9500} />
  <netlabel anchorSide="left" net="RESET" connectsTo=".R3 > .pin2" schX={-2.5000} schY={-0.9500} />
  <netlabel anchorSide="left" net="RESET" connectsTo=".C6 > .pin1" schX={-0.5000} schY={0.9500} />
  <netlabel net="GND" connectsTo=".C6 > .pin2" schX={-0.5000} schY={-0.9500} />
  <netlabel net="GND" connectsTo=".J2 > .pin1" schX={0.8} schY={-0.85} />
  <netlabel net="VBAT" connectsTo=".J2 > .pin2" schX={0.8} schY={0.85} />
  <netlabel anchorSide="left" net="RESET" connectsTo=".J2 > .pin3" schX={3.9500} schY={-0.1000} />
  <netlabel anchorSide="left" net="TEST" connectsTo=".J2 > .pin4" schX={3.9500} schY={0.1000} />
  <netlabel anchorSide="right" net="NFC_GPIO" connectsTo=".R4 > .pin1" schX={7.0500} schY={-3.5000} />
  <netlabel net="NFC_VCC" connectsTo=".R4 > .pin2" schX={8.9500} schY={-3.5000} />
  <netlabel anchorSide="right" net="LPD" connectsTo=".U3 > .pin1" schX={6.8000} schY={4.9000} />
  <netlabel net="GND" connectsTo=".U3 > .pin6" schX={9.0000} schY={2.4500} />
  <netlabel anchorSide="right" net="SDA" connectsTo=".U3 > .pin7" schX={6.8000} schY={5.3000} />
  <netlabel anchorSide="right" net="SCL" connectsTo=".U3 > .pin8" schX={6.8000} schY={5.1000} />
  <netlabel net="VBAT" connectsTo=".U3 > .pin10" schX={9.9} schY={7.5500} />
  <netlabel anchorSide="right" net="GPO" connectsTo=".U3 > .pin11" schX={6.8000} schY={4.7000} />
  <netlabel net="NFC_VCC" connectsTo=".U3 > .pin12" schX={7.8} schY={7.5500} />
  <netlabel net="NFC_VCC" connectsTo=".C7 > .pin1" schX={10.0000} schY={-3.5500} />
  <netlabel net="GND" connectsTo=".C7 > .pin2" schX={10.0000} schY={-5.4500} />
  <netlabel net="VBAT" connectsTo=".C8 > .pin1" schX={12.5000} schY={-3.5500} />
  <netlabel net="GND" connectsTo=".C8 > .pin2" schX={12.5000} schY={-5.4500} />
  <netlabel net="NFC_VCC" connectsTo=".R5 > .pin1" schX={9.0000} schY={-6.0500} />
  <netlabel anchorSide="left" net="SDA" connectsTo=".R5 > .pin2" schX={9.0000} schY={-7.9500} />
  <netlabel net="NFC_VCC" connectsTo=".R6 > .pin1" schX={11.5000} schY={-6.0500} />
  <netlabel anchorSide="left" net="SCL" connectsTo=".R6 > .pin2" schX={11.5000} schY={-7.9500} />
  <netlabel anchorSide="right" net="BUTTON_N" connectsTo=".SW1 > .pin1" schX={-3.1200} schY={-5.5000} />
  <netlabel anchorSide="right" net="BUTTON_N" connectsTo=".SW1 > .pin2" schX={-3.1200} schY={-5.5000} />
  <netlabel net="GND" connectsTo=".SW1 > .pin3" schX={-0.8800} schY={-5.5000} />
  <netlabel net="GND" connectsTo=".SW1 > .pin4" schX={-0.8800} schY={-5.5000} />
  <netlabel net="VBAT" connectsTo=".R7 > .pin1" schX={-0.0000} schY={-3.0500} />
  <netlabel anchorSide="left" net="BUTTON_N" connectsTo=".R7 > .pin2" schX={0.0000} schY={-4.9500} />
  <netlabel anchorSide="left" net="BUTTON_N" connectsTo=".C10 > .pin1" schX={2.0000} schY={-4.5500} />
  <netlabel net="GND" connectsTo=".C10 > .pin2" schX={2.0000} schY={-6.4500} />
  <netlabel net="GND" connectsTo={[".U1 > .pin18", ".U1 > .pin23", ".U1 > .pin25"]} schX={0} schY={1.5} />
  <netlabel net="GND" connectsTo={[".U2 > .pin6", ".U2 > .pin7"]} schX={-12.5} schY={-6.9} />
  <schematictext schX={-13.5} schY={6.65} text="BT1 / CR2450" fontSize={0.22} />
 </schematicsheet>
 <silkscreentext text="FIDGET C / ONE BOARD" pcbX={0} pcbY={3} fontSize={1}/>
 <silkscreentext text="NFC ANTENNA" pcbX={0} pcbY={35} fontSize={1}/>
 <silkscreentext text="BUTTON COUNT" pcbX={-15} pcbY={-7} fontSize={1}/>
 <silkscreentext text="ROTOR AXIS" pcbX={0} pcbY={-19} fontSize={1}/>
 <silkscreentext text="U1" pcbX={14} pcbY={-6} fontSize={1}/>
 <keepout shape="rect" pcbX={13} pcbY={24.5} width={1.2} height={2} layers={["top"]} excludeRefs={[".L1"]}/>
 <fiducial name="FID1" pcbX={-26} pcbY={-46} padDiameter={1} soldermaskPullback={0.5}/>
 <fiducial name="FID2" pcbX={26} pcbY={46} padDiameter={1} soldermaskPullback={0.5}/>
 <fiducial name="FID3" pcbX={-26} pcbY={46} padDiameter={1} soldermaskPullback={0.5}/>
</board>