| name | perfwire |
| description | Plans and audits hand-soldered perfboard (universal board / protoboard) wiring together with a human. Generates perfwire board-state JSON from a netlist/schematic, runs solver.py to place/route/audit under physical and EE constraints, and audits the human's edits from the index.html drag editor against physical reality. Use for perfboard / protoboard / universal board / jumper wiring / solder bridge / wiring plan / netlist-to-board requests. ãŠãããŒãµã«åºæ¿ã»ç©Žããåºæ¿ã»é
ç·èšç»ã»ã¯ãã ããªããžã»perfwire ã®äŸé Œã§äœ¿çšã |
perfwire â AIÃ人éã®ãŠãããŒãµã«åºæ¿é
ç·èšç»
åå
- åçãã穎äœçœ®ãæšæž¬ããªãã宿©ã®äœçœ®ã¯äººéããšãã£ã¿ïŒindex.htmlïŒã®ãã©ãã°ã§å
¥åãããAIã®æ
åœã¯ãèšç»ã»å²ä»ã»ç£æ»ãã
- é
ç·ã¯éšåãšåãç©Žã«æ¿ããªãã被èŠç·ã®ç«¯ã¯ãã¿ãŒã²ããã®è¶³ã«é£æ¥ãã空ã穎ïŒã¯ãã ããªããžãã空ããç¡ããšãã ãè¶³ãžçŽä»ãïŒ
direct: trueïŒã
- æ£ããã®æ ¹æ ã¯åžžã«ç¶æ
JSONïŒREADME ã®ã¹ããŒãåç
§ïŒããšãã£ã¿ãš solver.py ã¯åãã¹ããŒããèªã¿æžãããã
åæïŒãã³ãã«ç©ã®åšåŠïŒã³ãã³ãã®åã«å¿
ã 1 å PLUGIN_ROOT ã確å®ïŒ
perfwire ããã©ã°ã€ã³ãšã㊠install ããå©çšè
ã§ã¯ãsolver.pyã»tools/*.pyã»config.example.jsonã»index.html 㯠~/.claude/plugins/cache/⊠ã®äžã«ãããããªãïŒãšãŒãžã§ã³ãïŒã®äœæ¥ãã£ã¬ã¯ããªïŒïŒå©çšè
ã®ãããžã§ã¯ãïŒã«ã¯ç¡ãã$CLAUDE_PLUGIN_ROOT 㯠Bash ã®ç°å¢å€æ°ãšããŠæž¡ããªãïŒinline 眮æå°çšïŒãããBash ããŒã«ã¯ã³ãã³ãéã§ã·ã§ã«å€æ°ãä¿æããªããã ããçŽ ã® solver.py ã§ã¯åããªãã
æåã« 1 åã ãæ¬¡ãå®è¡ããåºåããã絶察ãã¹ãæ§ããïŒä»¥åŸã®ã³ãã³ãã® <ROOT> ããã®å€ïŒæ«å°Ÿ / 蟌ã¿ã<PY> ã衚瀺ãããè§£éç³»ã«çœ®æããïŒ:
PY=""; for c in python3 python py; do "$c" -c "import sys" >/dev/null 2>&1 && PY="$c" && break; done
ROOT=""
for d in $(ls -dt "$HOME"/.claude/plugins/cache/*/perfwire/*/ 2>/dev/null); do [ -e "$d/.in_use" ] && [ -f "$d/solver.py" ] && ROOT="$d" && break; done
[ -n "$ROOT" ] || for d in $(ls -dt "$HOME"/.claude/plugins/cache/*/perfwire/*/ 2>/dev/null); do [ -f "$d/solver.py" ] && ROOT="$d" && break; done
[ -f "${ROOT}solver.py" ] || { [ -f ./solver.py ] && ROOT="$(pwd)/"; }
[ -f "${ROOT}solver.py" ] || { ROOT=""; echo 'perfwire: ãã©ã°ã€ã³æ¬äœãèŠã€ãããŸããïŒ~/.claude/plugins/cache/*/perfwire/*/ ã«ã cwd ã«ã solver.py ãªãïŒãinstall/æŽæ°ã: /plugin marketplace update perfwire && /plugin install perfwire@perfwire' >&2; }
echo "PERFWIRE_ROOT=$ROOT"; echo "PERFWIRE_PY=$PY"
以åŸãã¹ãŠã® solver / make_link / read_link åŒã³åºã㯠<PY> "<ROOT>solver.py" ⊠ã®ããã«çµ¶å¯Ÿãã¹ã§è¡ãïŒclone-and-open ã§ãåæé ã§ããïŒãã©ãŒã«ããã¯ã§ <ROOT> ããªããžã㪠root ã«ãªãïŒãçŽ ã® solver.py ã tools/âŠïŒcwd çžå¯ŸïŒã¯äœ¿ããªãã人ã«ãã©ãŠã¶ã§éããŠããã index.html ã <ROOT>index.html ã®çµ¶å¯Ÿ file:// URL ã§æž¡ãïŒÂ§3ãWindows 㯠/c/Users/âŠâfile:///c:/Users/⊠ãšãã©ã€ãã¬ã¿ãŒã»/ ã«ïŒãPERFWIRE_ROOT ã空ã§è¿ã£ããçŽ ã® solver.py ãå®è¡ããïŒãsolver.py ãèŠã€ãããªããã®çãšã©ãŒã«ãªãïŒãäžã®ã¡ãã»ãŒãžã®ãšãã install/æŽæ°ïŒ/plugin marketplace update perfwireïŒãäººã«æ¡å
ããã確å®ãã <ROOT> ã¯äººã«ãäžèšæ·»ããïŒäŸãperfwire ããã©ã°ã€ã³ãã£ãã·ã¥ãã䜿ã£ãŠããŸããïŒãšç©º/誀 root ã«æ©ãæ°ã¥ããã
飿ºãã¿ãŒã³ïŒèª°ãã©ã䜿ãã â ãŸãå©çšè
ã¿ã€ããèŠæ¥µããïŒ
perfwire 㯠Claude Code ãã©ã°ã€ã³ãHTML ã¯ãªãã©ã€ã³åäžãã¡ã€ã«ãsolver.py 㯠stdlib ã®ã¿ã
ãããã»datasheet 調æ»ã»JSON çµã¿ç«ãŠã»ç£æ»ã¯ãšãŒãžã§ã³ãåŽãæ
ãã穎äœçœ®ã®ç¢ºå®ãšã¯ãã äœæ¥ã¯äººéãæ
ãã
äŸé Œè
ã®ã¿ã€ãã§å
¥å£ãšæž¡ãæ¹ãå€ããïŒäžã®è¡šããå
šãã¿ãŒã³ãæºãããããã®å°å³ïŒã
| å©çšè
| å
¥å£ã®äŸ | ãšãŒãžã§ã³ãã®æ
åœïŒãã®é ã§ïŒ |
|---|
| åå¿è
ã»äŒè©±ã®ã¿ | ããã¬ããããŒãã®ãã®åè·¯ãåºæ¿ã«èµ·ããããã | JSON ãäžåèŠããªããgrid/éšå/ããããäŒè©±ã§èãåã â state ãçµã¿ç«ãŠ â --lint â --propose â make_link.py ã§ãã£ãŒããªã³ã¯ãçæããŠæž¡ãïŒè£žã® index.html ãç JSON ãæž¡ããªãïŒâ ee ãå¹³æãªèšèã§èŠçŽïŒNG ã¯ãããã®ç·ãé·ãããã®ã§é£ã®ç©Žãžããšå
·äœã«ïŒâ ãã©ãŠã¶ã®ãäœæ¥ã¬ã€ããã§1æé ãã€é²ããããæ¡å
ïŒÂ§3ïŒãå°éçšèªã»é
åãã³ãã¯åºããªã |
| ããããªã¹ã/åè·¯å³æå | åè·¯å³ã»éšå衚ã»åçª | §1 ã§ state åãIC 㯠pinTypesãå€éšå
¥åºå㯠role ã datasheet ããåããïŒåºåç«¶åã»é»æºãã³æ€æ»ãæå¹åïŒâ §2 â §4 |
| æ¢ååºæ¿ã®èšé²ïŒãªããŒã¹ïŒ | 宿©åç | §3 ã®åçäžçµµãæ¡å
ïŒäººããã¬ãŒã¹ããšãŒãžã§ã³ãã¯åçãã穎ãèªãŸãªãïŒâ æ»ã£ã JSON ã §4 ã§ç£æ» |
| 寞æ³ã»éšåã®æ ¹æ ä»ã | ããã®æµæ/ã³ã³ãã³ãµã®å®å¯žã調ã¹ãŠã | §5(a)ãdatasheet/代çåºã§èª¿ã¹ physical.<kind> ã® dims+source ã DEFCFG ãš config.example.json ã®äž¡æ¹æŽæ°ïŒparity_check.mjs ãäžèŽã CI æ€èšŒïŒãæµæã¯é»å宿 Œ(W)åäœãé»è§£ã¯ CV åäœã§åŒã |
| ã¬ã€ã¢ãŠãèª¿æŽ | ãæããå€ãïŒé£ã®ç©Žã«åºãã£ãŠå€ïŒãã£ãšæŽç¶ãšïŒçµã¿ãããã | ãŸãç®çããªã»ããïŒÂ§2 ã® --profile easy/analog/compactïŒã§æå³ãåããããããã«è©°ãããªã §5(b)(c)ïŒcraft ææšãç€é¢èªèº«ã®ååžããæž¬ãåå¥ weights ãèª¿æŽ â åãœã«ã â Pareto 宿ž¬ãå¯åºæ¿ã® trade ã¯éæ³ã®éã¿ã§é ããæ£çŽã«æç€º |
| ãã©ãŠã¶åŸåŸ© | 人ãç·šéããŠãæžãåºããã JSON | §4ãé
ç·ã®ã¿ã¢ãŒãã§åç£æ»ã ee.fabReady ãç·åå€å®ãšããŠå ±åãæ¡ïŒproposalsïŒã¯æ¯èŒçšã«æ®ã |
æž¡ãæ¹ã®æ¢å®: ç£æ»ã PASS ããã人éã«ã¯ãã£ãŒããªã³ã¯ïŒmake_link.py ã® index.html#z=âŠïŒïŒå¹³æãªèŠçŽãæž¡ãã®ãæ¢å®ãç JSON ã¯äžéçæç©ã§ãã£ãŠææç©ã§ã¯ãªãã
config ã¯åäžã»èªå解決: ãããå€ã¯ config.example.json äžã€ãsolver ã¯é£ã® config.example.json ã __file__ åºæºã§èªå解決ããã®ã§ --config ã¯çç¥å¯ïŒçµ¶å¯Ÿãã¹ã§å©ãéã cache ã§ãèŠã€ããïŒãæç€ºããã®ã¯èª¿æŽçãæž¡ããšãã ãïŒ--config "<ROOT>config.example.json"ãäžäžèŠã€ãããªããã° stderr ã« EE audit DEGRADED èŠåïŒÂ§2ïŒã
åŸåŸ©ã«ãŒãïŒäºº â Claude CodeïŒâ ãããæ¬äœãæ¯ã¿ãŒã³ãæŒãâæ»ãããã»ããã§æç€ºãã
åå¿è
ã¯1åã®å€§åŸåŸ©ã§ãªããå°ããªåŸåŸ©ãäœåºŠãããïŒãšãŒãžã§ã³ããããããæŒããŠããšèšã â 人ã perfwire ã§æŒã â çµæã Claude Code ã«æ»ã â ãšãŒãžã§ã³ãã確èªããŠæ¬¡ã®1æ â ç¹°ãè¿ããæ»ãæ¹ãæ¯åæ·»ããªããšã«ãŒããåããïŒåå¿è
ã¯æžãåºããåŸã©ãããã°ãããåãããªãïŒã
A. Claude Code â äººïŒæç€ºïŒ: out.json ã make_link.py ã§ãã£ãŒããªã³ã¯åãã1ã¢ã¯ã·ã§ã³ãã€æç€ºãããããã®ãªã³ã¯ãéã â èµ€ããã€ã©ã€ãããã穎㞠R5 ããã©ãã° â ãé
ç·ãåèšç®ããæŒãããå°éçšèªãš JSON ã¯åºããªãã<PY> "<ROOT>tools/make_link.py" out.json --base "file:///<ROOT ããã©ã€ãã¬ã¿ãŒå>index.html" --task "R5 ãèµ€ã穎ãžãã©ãã°ããŠãé
ç·ãåèšç®ã"ïŒmake_link ã¯çµ¶å¯Ÿ file:// ãªã³ã¯ã stdout ã«åºãïŒãããäººã«æž¡ãïŒã®ããã« --task ãä»ãããšãéããç¬éã«ç€é¢äžéšã®éããClaude Code 飿ºãããŒã«ãClaude ããã®æç€ºããšããŠè¡šç€ºãããåŸåŸ©ã®3æé ãš Claude Code ã«æ»ã ãã¿ã³ãåããŒã«åºãïŒãã®ããŒã¯ #z= ãªã³ã¯çµç±ã®ãšãã ãåºãïŒãã¡ã€ã«ãçŽæ¥éãäžçŽè
ã«ã¯åºãªãïŒãåå welcome 㯠#z= çä¿¡ã§ã¯ã¹ããããããã®ã§ããã®ããŒã CC çµç±åå¿è
ã®å¯äžã®æ¡å
ã«ãªãïŒæç€ºã¯å¿
ã --task ã«å
¥ããã
B. 人 â Claude CodeïŒæ»ãïŒâ æç€ºã®æåŸã«å¿
ãä»ãããç€é¢ãæ»ãææ®µãåå¿è
åãé ã«ïŒ
URLå
±æ ãã¿ã³ïŒæãç°¡åã»1ã¯ãªãã¯1貌ãä»ãïŒâ #z= ãªã³ã¯ãã¯ãªããããŒãã«å
¥ã â ãã³ããŒããã URL ãããã«è²Œã£ãŠãã ãããâ ãšãŒãžã§ã³ã㯠<PY> "<ROOT>tools/read_link.py" "<貌ãããURL>" -o back.json ã§åŸ©å
ïŒread_link.py 㯠make_link.py ã®éïŒã
æžãåºã ãã¿ã³ïŒè²Œãä»ãäžèŠïŒâ perfwire_export.json ã Downloads ã«ä¿åïŒã¯ãªããããŒãã«ã³ã㌠â ããæžãåºãããæŒããŠãã§ããããšèšã£ãŠãã ãããâ ãšãŒãžã§ã³ãã¯å OS ã® DownloadsïŒäŸ ~/Downloads/perfwire_export.jsonïŒãèªãã
- ã¯ãªããããŒãã® JSON ããã®ãŸãŸè²ŒãïŒ
æžãåºã/ã³ã㌠ãå
¥ããŠããïŒã
æ¯ã¿ãŒã³ã®å®å: ãââãæŒããŠãçµãã£ãã URLå
±æ ãæŒããã³ããŒããããªã³ã¯ãããã«è²Œã£ãŠãã ããããæ»ã£ãŠããã <PY> "<ROOT>solver.py" back.json -o out.jsonïŒé
ç·ã®ã¿ã»config èªå解決ïŒã§åç£æ»ã ee.fabReady ãšå·®åãå¹³æã«å ±å â æ¬¡ã®1æããŸãæç€ºã
ç¶æ
ãæ»ããªããŠãã micro-loop: åçŽãªç¢ºèªïŒãç£æ»ããã«ã«ãâ é
ç·ã§ããããåºãŸãããïŒããç«ãŠæµæã¯äœæ¬ïŒãïŒã¯ç»é¢ã®å¹³æãªç£æ»æèšãèªãã§ãããã ãã§ååãæ¯åãšã¯ã¹ããŒããããªããç€é¢ãå€ãã£ããšãïŒé
眮/é
ç·ã®ç·šéïŒã ã B ã§æ»ãã
ããããåŸåŸ©ãã¿ãŒã³:
- ç®çããªã»ãã調æŽ: ããšãã£ã¿äžéšãé
眮ã®ç®çãã§ãçµã¿ãããããéžãã§ â URLå
±æ ã貌ã£ãŠãâ ãšãŒãžã§ã³ãã craft ææšã§æ¹åã宿ž¬ â æ¬¡æ¡ïŒÂ§2 ã®
--profileïŒÂ§5(c)ïŒã
- ã€ãŸãã蚺æ: ãæŒãããã©äœãèµ·ããªããâãURLå
±æ ã貌ã£ãŠãã ãããã§ç¶æ
ãèŠãŠããåå ãèšãïŒç€é¢ãèŠããªããŸãŸæšæž¬ããªããäŸ: éšåã
locked ã§åããªãïŒã
- ã¬ã€ãä»ãã¯ãã :
äœæ¥ã¬ã€ã ã1æé ãã€ãããã¯ç¶æ
ã§ãªãç»é¢ã®ç¢ºèªã§ã«ãŒãïŒãä»ã®æé ã¯äœçªïŒã§ãããæ¬¡ãžãïŒã
- ãªããŒã¹èšé²: åçãã¬ãŒã¹ïŒÂ§3ïŒâ
æžãåºã â Downloads ãèªãã§ç£æ»ã
ã¯ãŒã¯ãããŒ
1. æ°èŠãããžã§ã¯ãïŒåè·¯å³/ããããªã¹ã â ç¶æ
JSONïŒ
ãŠãŒã¶ãŒã®åè·¯ãã以äžãçµã¿ç«ãŠãŠ <project>.json ãæžã:
grid: å®åºæ¿ã®ç©Žæ°ïŒãŠãŒã¶ãŒã«ç¢ºèªïŒãã¹ããªããåºæ¿ïŒããããŒãïŒã¯ grid.type:"strip" ïŒ stripAxis:"row"|"col"ãtrackCuts:[[[c,r],[c2,r2]],âŠ] ã§é
ç®ã¹ããªãããšã«ããã衚çŸïŒåäžæªã«ããã¹ããªããã«ç°ãããïŒstripShorts ïŒã·ã§ãŒãïŒ
parts: åéšåãkind 㯠icïŒpinsèŸæž: DIP-8 ã¯ãã³è¡éã3穎ïŒ/ r / film / disc / elecïŒplus=0 ã§ leads[0] ãïŒæ¥µïŒãleadNames 㯠<id>.a/.bïŒIC 㯠<id>.<pin>ïŒãåãããªãéšå㯠locked: trueãä»»æ familyïŒå®éšååãäŸ "Raspberry Pi Pico" / "ãªã¬ãŒ" / "ã€ã³ãã¯ã¿"ïŒã§ BOMã»å¡äŸã®è¡šç€ºåãäžæžãïŒäžèšã察å¿éšåãšã¡ã¿æ¡åŒµãïŒãä»»æ pkg/phys3d ã§3Dãã¥ãŒã®èŠãç®ïŒå®åœ¢ç¶ïŒãæ ¹æ ä»ãå¯ïŒäžèšã3Dãã¥ãŒã®å€èŠ³æ ¹æ ä»ãããkind ã¯ãããšã¯ç¡é¢ä¿ã«ããªããã£ãã®ãŸãŸå€ããªãïŒ
leads: å
šãªãŒãã® {net, at}ãå€éšç·ã¯ W. ãã¬ãã£ãã¯ã¹ã®åç¬ãªãŒããä»»æ role ã§é»æ°ç圹å²ã宣èšã§ããïŒout/in/bidir/pwr/pwr_in/passive/oc/tri/nc/testïŒãå€éšã® MCU åºåã黿ºãç·ã§å
¥ã£ãŠãã端å㯠role ãä»ããïŒäŸ: W.MCU_TXârole:"out"ãW.REDârole:"pwr"ïŒãããã«ããåºæ¿å€ãã©ã€ããåºåç«¶åæ€æ»ã®å¯Ÿè±¡ã«ãªã
- åºæ¿ã®å€ãžåºãæ¥ç¶ïŒå€éšã¹ããŒã«ãŒã»ãã€ã¯ã»é»æºãªã©ïŒã®è¡šçŸãšå¯èŠå: â 黿ºãMCUçã¯å°çšã®å€éšç«¯å
W.<åå> ïŒ role ã§æç€ºããã®ãæãåãããããïŒç€äžã«è§ã¿ã°ïŒå€åãç¢å°ãå¡äŸãå€éšæ¥ç¶ãã«è¡šç€ºïŒãâ¡ã¹ããŒã«ãŒ/ãã€ã¯ã®ããã«éšåã®è¶³ãçŽæ¥å€ãžåºãç¹ïŒäŸ SPK_P/SPK_N/MIC_IN ãéšåãªãŒãã®åäžãªãŒããããïŒã¯ããã®ãããã rules.single_lead_allowlist ã«å
¥ããïŒI/Oç¹ãšããŠèªèãããç€äžã«å€åãç¢å°ãå¡äŸãå€éšæ¥ç¶ãã«æ¥ç¶å
ãå¹³æèªã§ïŒã¹ããŒã«ãŒ/ãã€ã¯/黿º çããããåããæšå®ïŒè¡šç€ºãããããã®ãããªåäžãªãŒãã®å€éšI/Oã¯å¿
ã allowlist ã«å
¥ããïŒå
¥ããªããšåäžãªãŒãïŒçµç·æŒãèŠåã«ãªãããã€å€éšæ¥ç¶ãšããŠå¯èŠåãããªãïŒããããªããã«ããããªãå¥é W.SPK_P çã®å€éšç«¯åïŒwire ã§å®äœïŒã¯ãã ç¹ïŒå€éšæ©åšãžã®ç·ïŒã衚çŸããŠããã
partsïŒICïŒ: ä»»æ pinTypesïŒãã³çªå·â圹å²ãäŸ ãã¥ã¢ã«ãªãã¢ã³ãIC: {"1":"out","2":"in","3":"in","4":"pwr_in","5":"in","6":"in","7":"out","8":"pwr_in"}ïŒãIC çææã« datasheet ããåãããšåºåç«¶åã»é»æºãã³æ€æ»ãæå¹åããã
netColors: ãããããšã®è¡šç€ºè²
blockedHoles: ç©ççã«äœ¿ããªã穎ïŒãŠãŒã¶ãŒã«ç¢ºèªïŒ
察å¿éšåãšã¡ã¿æ¡åŒµïŒRaspberry Pi Picoã»ãªã¬ãŒã»é»ç£éšåãªã©ãå奿ªå¯Ÿå¿ãã®éšåã loop ã§è¶³ãïŒ
kind ã¯éããéšåãªã¹ãã§ã¯ãªãã4ã€ã®å¹Ÿäœããªããã£ãïŒæç»ã»é
眮ã»ã¹ãã³ã®åïŒãå®éã®éšåå㯠family ã§ä»ãããã ãããåå¥ã«ãµããŒããããŠããªããéšåããæ£ããããªããã£ãã§çµã¿ç«ãŠãã°ã³ãŒã倿Žãªãã§ä»ããèŒãïŒæç»ã»é
ç·ã»ERC ãŸã§å¹ãïŒããšãŒãžã§ã³ãã datasheet/ãã³é
眮ã loop ã§èª¿ã¹ãŠçµã¿ç«ãŠãã®ãæ
åœã
| å®éšå | 䜿ãããªããã£ã | çµã¿ç«ãŠæ¹ |
|---|
| Raspberry Pi Pico / MCUããŒã / ã¢ãžã¥ãŒã« | ic | pins èŸæžã«å®ãã³é
眮ïŒ2Ã20=40æ¬ãªã©ãä»»ææ¬æ°ã»ä»»æåº§æšïŒãfamily:"Raspberry Pi Pico"ãpinTypes ã datasheet ããåãããšé»æº/åºåæ€æ»ãå¹ã |
| ãªã¬ãŒã»ã³ãã¯ã¿ã»ãã³ãããã»ãã©ã³ãžã¹ã¿ã»å€ãã³éšå | ic | åäžïŒååä»ããã³ã®éåïŒãã¹ãŠ icïŒãfamily ã«å®å |
| ã€ã³ãã¯ã¿ã»ãã§ã©ã€ãããŒãºã»ç¡æ¥µæ§2ãªãŒã | r | 軞2ãªãŒãïŒleads/leadNamesïŒãfamily:"ã€ã³ãã¯ã¿" |
| ãã¶ãŒã»ææ¥µ2ãªãŒãã»é»è§£ | elec | plus ã§æ¥µæ§ãfamily ã«å®å |
| ãã£ã«ã /ã»ã©ããã¯ç®±ã»åæ¿ | film/disc | æ¢å®ã®2ãªãŒãç®±/åæ¿ |
äŸïŒPico ãèŒããïŒ: {"id":"U3","kind":"ic","family":"Raspberry Pi Pico","label":"Pico","pins":{"1":[c,r],âŠ,"40":[c,r]},"pinTypes":{âŠ}}ãic ã¯ãã³çŸ€ã®å€æ¥ç©åœ¢ã«ç®±ãæãæ±çšå€ãã³éšåãªã®ã§ 40 ãã³ã§ããã®ãŸãŸæç»ã»é
眮ã»é
ç·ãããBOM/å¡äŸã¯ family ã§ãRaspberry Pi Picoããšè¡šç€ºãããïŒ"IC" ã«ãªããªãïŒã
loop ã§ã®è¶³ãæ¹: â ãŠãŒã¶ãŒã«åçª/åçãèã â â¡ãšãŒãžã§ã³ãã datasheet ã§ãã³é
眮ã»ãããã»æ¥µæ§ã調ã¹ãïŒãªãã©ã€ã³å¢çïŒÂ§5(a) ãšåãããããäœæ¥ã¯ãšãŒãžã§ã³ãåŽïŒâ â¢äžè¡šã®ããªããã£ãïŒfamilyïŒpins/leads ã§çµã¿ç«ãŠ â â£make_link.py --task ã§äººã«æž¡ããŠå®æ©ã©ããã«é
眮ããŠããã â â€æ»ããŠç£æ»ãæ°ãã kind ãå¢ããå¿
èŠã¯ãªãã
kind ã¯å¿
ãæ¢å5çš®ã®ãŸãŸïŒic/r/film/disc/elecïŒââçºæããªããkind ã¯ç©çãã£ãã«ïŒé
眮ã»ã¹ãã³ã»ERCïŒã®åã§ããããsolver.py ã¯ãã®5皮以å€ã® kind ãæã€éšåãã©ãŠã³ãããªããã§é»ã£ãŠç€é¢ããèœãšãïŒãšãã£ã¿äžã¯èŠåæ¢ãŸãã§æ®ãããæ°ã¥ãã«ããïŒããèŠãç®ããªã¬ãŒããããããããšãã kind ã¯ããªããã£ãïŒäžè¡šã©ããic/r/elecçïŒã®ãŸãŸå€ãããæ¬¡æ®µã® pkg/phys3dïŒå€èгãã£ãã«ïŒã ãã§èŠãç®ãå€ããã
3Dãã¥ãŒã®å€èŠ³æ ¹æ ä»ãïŒpkg/phys3dïŒâ ãç®±ãã§åŠ¥åããªãããã®ä»»æãã£ãŒã«ããç©çãã£ãã«ïŒkind/physFor/ERCïŒãšã¯å®å
šã«å¥ã®å€èгå°çšãã£ãã«ã§ã3Dãã¥ãŒã®WebGLã¬ã³ãã©ãŒã ããèªãïŒERCã»é
眮ã»solver.py ã®å€å®ã«ã¯äžå圱é¿ããªãïŒãå€ãæžããªããŠãæ¢åã©ããåãïŒå®å
šåŸæ¹äºæïŒã
part.pkg: ããã±ãŒãžèŠæ ŒããŒã¯ã³ã®æååãæ¢ç¥ããŒã¯ã³ïŒto92/to220/led3/led5/do41/tact6/header254/trimpot3386/buzzer12/customãindex.html ã® GL3D_PKG ãæ£ïŒãæå®ããã ãã§å®åœ¢ç¶ïŒTO-92ã®çžŠç«ã¡åæ±ã5mm LEDã®ããŒã çïŒã«ãªãããã®ãªã¹ãã«ç¡ãããŒã¯ã³ãçºæããªãïŒé»ã£ãŠæ±çšãã©ãŒã«ããã¯=æäœéã®ç®±ã«ãªãã ãã§ããšã©ãŒã«ã¯ãªããªããå®åœ¢ç¶ã«ããªããªãïŒãåçªããèŠæ Œãåããå
žåäŸ: 2N3904/2N2222âto92ã7805/TIP120âto220ã1N4001/1N4148âdo41ã
part.phys3d: åäœããšã®äžæžãïŒpkg æªæå®ã§ãåç¬ã§äœ¿ããïŒã{shape, len_mm/wid_mm/h_mm/dia_mm, color, standoff_mm, source, confidence}ãshape 㯠GL3D_PKG ã®8çš®ããããïŒdome/dcyl/tab_box/axial/plunger_box/header/box/cylïŒãsource 㯠datasheet çã®åºå
žæååãconfidence 㯠"verified"ïŒdatasheetå®ç¢ºèªïŒ/"estimate"ïŒèšæ¶ããŒã¹ïŒ/"todo"ïŒæªç¢ºå®ïŒã®3å€ââæé çŠæ¢ã¯ config.physical ãšåãæµåã
- risk splitïŒäžç¢ºå®æ§ã®æ±ãïŒ: ãã³åº§æšã»ãããã»ãã³æ°ã»æ¥µæ§ã¯load-bearingïŒæšæž¬çŠæ¢ïŒããã¯
leads/pins/plus ãšããæ¢åã®ç©çãã£ãã«åŽã§ããããããã pkg/phys3d ã®å¯Ÿè±¡å€ïŒãæ¬äœã®å€åœ¢ã»è²ã¯cosmeticïŒæšå®å¯ã ããconfidence ãæ£çŽã«ä»ããã3Dãã¥ãŒã¯éžæäžã®éšåã estimate/todo ãªãåžžæãå€èŠ³å¯žæ³ã¯æšå®ããåºå
žä»ãã§ã¹ããŒã¿ã¹ããŒã«è¡šç€ºããïŒäŒè©±ã§ã®é瀺ã ãã«é ŒããªãïŒã
- 解決ã©ããŒ: â æšæºããã±ãŒãžãšç¢ºä¿¡ã§ããïŒåçªããJEDECèŠæ Œãæ¢ç¥ïŒâ
pkg ã ãæžã â¡æšæºå€ã ãèšæ¶ãã寞æ³ãèšããâ phys3dïŒconfidence:"estimate"ïŒâ¢èª¿ã¹ãã°ç¢ºå®ã§ããâ datasheet ã確èªããŠãã phys3dïŒconfidence:"verified"ïŒâ£åãããªãâ pkg/phys3d ãçç¥ïŒæ±çšãã©ãŒã«ããã¯ã®ç®±ã®ãŸãŸã§ããïŒããå¹³æãªèšèã§äžèšã ã人ã«ç¢ºèªããïŒãç ²åŒŸåã§ãããè§åã§ããïŒãçïŒãé»ã£ãŠäžç¢ºããªå€ãåããªãã
æ£çŽãªéçïŒããã¯ã³ãŒã倿ŽãèŠãïŒloop ã§ã¯è¶³ããªãïŒ: perfwire ã¯ã¹ã«ãŒããŒã«ïŒååä»ããã³ or 軞ãªãŒãåæãâ SMDïŒè¡šé¢å®è£
ïŒããã â¡TO-220 ã®ã¿ãçããã³ã§ã軞2ãªãŒãã§ããªãç¬èªãããããªã³ã â¢ãã®éšåå°çšã®åºæã°ãªã â ã¯ããªããã£ãã§è¿äŒŒã§ããªããã° index.html/solver.py ã®æ¹ä¿®ãèŠãããã®å Žåã¯ãããªããã£ãè¿äŒŒã§ä»£çšããããã³ãŒã察å¿ããããããŠãŒã¶ãŒã«æç€ºããã
2. ãœã«ããŒå®è¡
<PY> "<ROOT>solver.py" <project>.json --lint
<PY> "<ROOT>solver.py" <project>.json --propose --profile analog -o out.json
<PY> "<ROOT>solver.py" <project>.json --config "<ROOT>config.example.json" -o out.json
<PY> "<ROOT>solver.py" --list-profiles
<PY> "<ROOT>solver.py" <project>.json --emit-config -o my_config.json
<PY> "<ROOT>solver.py" <project>.json --propose-n --config "<ROOT>config.example.json"
<PY> "<ROOT>solver.py" out.json --emit-packet -o build_packet.md
<PY> "<ROOT>solver.py" out.json --guard INA_P --config "<ROOT>config.example.json" -o guarded.json
<PY> "<ROOT>solver.py" out.json --guard INA_P --guard-net SPK_OUT --config "<ROOT>config.example.json" -o guarded.json
çæãã JSON 㯠--lint ã§å
ã«æ€èšŒãã: æ¬ èœããŒã»åäžæ£ã»æªç¥ kindã»refdes éè€ãªã©ã®å¥çŽéåããtraceback ã§ã¯ãªã人éå¯èªãªèšºæïŒerror/warnïŒã§è¿ããerror ãããã°ä»ã®ã³ãã³ããå®è¡åã«ã¯ãªãŒã³ã«åæ¢ããã--guard èªåæšå®ã§åè£ãè€æ°ãããš stderr ã« ambiguous èŠåïŒã¹ã³ã¢ä»ãåè£äžèЧãåºãïŒé»ã£ãŠå
é æ¡çšããªãïŒïŒ --guard-net ã§æç€ºããã config.guard_of ãèšå®ãããrail_voltsïŒV3V3/VMID/GNDïŒã¯æ¢å® config ã«å梱æžã¿ã§ãæµæã« valueΩ ãããã°æ¶è²»é»åç£æ»ããã®ãŸãŸå¹ãã
config ã¯åäž: ãããå€ãã¡ã€ã«ã¯ config.example.json äžã€ã«çµ±äžæžã¿ïŒæ§ perfwire_config.json ã¯å»æ¢ïŒããã㯠--config ç¡æå®æã®æ¢å®ãã¹ã§ããããsolver ã __file__ åºæºã§èªå·±è§£æ±ºããã®ã§ <PY> "<ROOT>solver.py" <project>.json ã ãã§ãèªã¿èŸŒãŸããïŒcache ã§ã cwd éäŸåïŒã--config <file> ãæç€ºããã®ã¯èª¿æŽçãæž¡ããšãã ããäžäž config ãèŠã€ãããªããã° solver ã¯å
èµ DEF_CFG ã«ãã©ãŒã«ããã¯ããã«ãããªã³ã°è·é¢ã»é
ç·é·ã®ç£æ»ã空ã«ãªãïŒã¹ãã«ã®äžæ žæ©èœãç¡å¹åïŒãããã®é㯠stderr ã« WARNING ⊠EE audit DEGRADED ãå¿
ãåºãïŒç¡èšã§ç¡å¹åã¯ããªãããããå€ïŒéšå寞æ³ã»ãããã¯ã©ã¹ã»ãã«ãããªã³ã°è¿æ¥ã»éã¿ïŒãå€ãããšã㯠config.example.json ãçŽæ¥ç·šéãããã--emit-config ã®å©ãå°ãã¬ãã¥ãŒã㊠--config ã§æž¡ããconfig.example.json ã®å¯žæ³ã»EEäžé㯠tools/parity_check.mjs ããšãã£ã¿å
èµ DEFCFG ãšäžèŽã CI ã§ä¿èšŒããã
solver.py ã¯æšæºã©ã€ãã©ãªã®ã¿ïŒã€ã³ã¹ããŒã«äžèŠïŒãåºåã® stats / ee / warnings ãå¿
ã確èªããNG ã¯ãŠãŒã¶ãŒã«å ±åããã
é
眮ã®ç®çïŒææ³ããªã»ããïŒãå路皮å¥ã§éžã¶ â é
眮ã®è¯ãæªãã¯åäžã®éã¿ã§ãªãç®çã§æ±ºãŸãã8æ¬ã®çéã¿ãå¹³æãªç®çåã«æããããªã»ãããããã--profile <key> ã§é©çšããïŒäººã¯ãšãã£ã¿äžéšã®ãé
眮ã®ç®çãããããããŠã³ã§åããã®ãéžã¶ïŒäººãšAIã§èªåœäžèŽïŒããšãŒãžã§ã³ãã¯åè·¯ãèŠãŠç®çãéžã¶ã®ãä»äº:
| ããªã»ãã | äœãåªå
| ããããå路㫠|
|---|
easyïŒçµã¿ãããã»åå¿è
ããããïŒ | çŽäº€ã»å¯ããã»æå°ã¹ãã³ã»ããšãééãæã¯ãã ãšç®èŠç¢ºèªãæåªå
| æ±çšã»åŠç¿çšãäŸé Œè
ãåå¿è
ããŸã1æçµã¿ãã |
analogïŒã¢ããã°ã»é«æåºŠïŒ | é«Zå
¥åãçãã»å
¥åºåã匷ãåé¢ã»ãã«ãããªã³ã°è¿æ¥ | ãªãã¢ã³ã/ãªãŒãã£ãª/ã»ã³ãµ/èšè£
ïŒçºæ¯ã»ãã€ãºã«åŒ±ãåè·¯ïŒæ¢å®ïŒ |
compactïŒçã¹ããŒã¹ïŒ | ããªããžå€çšã§é
ç·æå°ã»ç«ãŠå®è£
å¯ã»å¯ã§ãå¯ | å°ããåºæ¿ã«è©°ãããäžçŽè
|
ç®çã¯**ãã©ã眮ãããã ããå€ããeeïŒfab-ready å€å®ïŒã EE äžéã¯äžå€**ïŒç®çãå€ããŠã黿°çååŠåºæºã¯åããªããå¯ãªç€é¢ã§ã¯ç®çéã«ç©çç trade ãããïŒäŸ: easy ã¯å¯ããåªå
ã§é
ç·ãå¢ããïŒcompact ã¯ããªããžã§é
ç·ãæžããç«ãŠãå¢ããïŒããã® trade ã --profile ã§å®æž¬ããŠæ£çŽã«æç€ºããïŒÂ§5(c)ïŒãããªã»ããå®çŸ©ïŒéã¿ãã¯ãã«ïŒååïŒã¯ config.example.json ã® placement_profiles ãš HTML å
èµ DEFCFG ã parity_check.mjs ã§äžèŽä¿èšŒãè¿·ã£ãã easyãåè·¯ãæåºŠç³»ãªã analogã
3. 人éã®ä¿®æ£
index.html ããã©ãŠã¶ã§éããŠããããinstall å©çšè
ã® cwd ã« index.html ã¯ç¡ãã®ã§ã<target> ã¯ Â§åæ ã® <ROOT>index.html ã file:// 絶察 URL ã«ãããã®ïŒäžèšããªããŒãã®ãã£ãŒããªã³ã¯ïŒæ¢å®ïŒãOSå¥: macOS open <target> / Linux xdg-open <target> / Windows PowerShell Start-Process <target>ïŒcmd 㯠start "" <target>ïŒã
ç€é¢ããªããŒãïŒæšå¥šïŒ: <target> ã«è£žã® index.html ã§ã¯ãªãã<PY> "<ROOT>tools/make_link.py" out.json --base "file:///<ROOT ããã©ã€ãã¬ã¿ãŒå>index.html" ãåºåãã file:///âŠ/index.html#z=... 絶察ãã£ãŒããªã³ã¯ãæž¡ããšãéããç¬éã« out.json ã®ç€é¢ãæ°èŠæ¡ãšããŠèªã¿èŸŒãŸããïŒæ¢åã®ç·šéã¯ä¿æïŒéç Žå£ïŒãWindows 㯠<ROOT> ã® /c/Users/⊠ã file:///c:/Users/âŠïŒãã©ã€ãã¬ã¿ãŒã»/ïŒã«ãmake_link.py ã¯ãã©ãã圢ç¶ïŒsolver ã® out.jsonïŒãšãã£ã¿ã®ãæžãåºããïŒå°çšãexamples/pico_plant_sitter.json ç㯠proposals[] 圢ç¶ãªã®ã§æž¡ããªãã
ããªããŒãããªãå Žå㯠out.json ããéãâŠãããã©ãã°&ããããã§èªã¿èŸŒã¿ã
ãã©ãã°ä¿®æ£ â ãæžãåºããããšãã£ã¿å
ã«ãåããœã«ããŒãå
èµãããŠããã人éãã¹ã©ã€ããŒïŒåèšç®ã§èªèµ°ã§ããã
ç·šéã¯ã¢ãŒãã¬ã¹çŽæ¥æäœ: æ¢å®ã®ãéžæïŒç§»åãã¢ãŒãã§ãéšåã端åïŒé
ç·ç«¯ã»è¶³ïŒãåãæäœã§ãã®ãŸãŸãã©ãã°ïŒã¢ãŒãåæ¿äžèŠãã¯ãªãã¯éžæïŒShiftïŒã¯ãªãã¯ã§è€æ°éžæïŒç©ºãããã©ãã°ã§ç¯å²éžæïŒéžæããŸãšããŠãã©ãã°ã§ç§»åãããã¯/åé€/éžæè§£é€ã¯ç€äžã®ã¢ã¯ã·ã§ã³ããŒïŒããŒïŒLïŒããã¯åæ¿ã»DelïŒåé€ã»EscïŒè§£é€ïŒïŒå·Šããã«ã«æ»ããªããŠãããå°éæäœïŒããªããž/穎Ã/ãã¹ã¿ãŒ/ã«ããïŒã ãå¥ã¢ãŒãã
- ããã¯ã¯äººïŒAI ã®ã確å®ïŒæªç¢ºå®ãã·ã°ãã«: ãšãŒãžã§ã³ãã¯ç¢ºå®æžã¿ïŒå®æ©ã©ãã/åææžã¿ïŒã®éšåã
locked:true ã«ããŠæž¡ããæªç¢ºå®ã¯ unlocked ã®ãŸãŸæ®ãã人ã¯ã¢ãŒãã¬ã¹ã§æªç¢ºå®ã䞊ã¹ãæ°ã«å
¥ã£ãã L ã§ããã¯ãçŽãããæã¯å€ããæ»ã£ãŠããã --propose ã¯ããã¯ãå°éïŒlocked ãš ic ã¯åããããæªããã¯ã ãåé
眮ïŒïŒäººã®æå³ãå£ãã AI ãç¶ããè©°ãããlocked ã¯ç¶æ
JSONã«ä¹ãåŸåŸ©ã§ä¿æãããã
宿©ã®èšé²ïŒãªããŒã¹ïŒã®å Žåã¯ãåçäžçµµãæ¡å
ãã: 宿©åçããšãã£ã¿ã«ãããã â
äžéæåºŠ/æ¡å€§/å転/å·Šå³å転ïŒè£é¢åçïŒã§ç©Žãåããã â éšåããªãã£ãŠãã©ãã°ã
AI ãåçãã穎äœçœ®ãèªãã®ã§ã¯ãªãã人éãåçããã¬ãŒã¹ããã®ãæ£ããåæ
ã
3Dãã¥ãŒïŒé²èЧå°çšïŒ: ããŒã«ããŒã®ã3Dãã§ç€é¢ãæãäžããèŠãçè§æåœ±è¡šç€ºã«åãæ¿ãããããéšåã®é«ãã»ãããªãæ¹ãå®å¯žã«è¿ãèŠãç®ã§åãããããåå¿è
ããå®éã«ã©ãèŠãããããç·šéåã«æŽãå©ãã«ãªããã¯ãªãã¯ã§éžæïŒ2DãšåæïŒããã©ãã°ã§ãã³ãCtrl+ãã€ãŒã«ã§ãºãŒã ã®ã¿å¯Ÿå¿ââç·šéæäœã¯ç¡å¹åãããŠããããã©ãã°ç§»åãããªããžè¿œå çãããããšãããšèªåã§2Dãžæ»ããæ¡å
ãããšãã¯ã3Dã§å
šäœãèŠãŠãã2Dã§çްéšãç·šéãã®é ãå§ãããšããã
4. ç£æ»ãšç¢ºå®
ãŠãŒã¶ãŒããæ»ã£ãŠãã JSON ã solver.pyïŒé
ç·ã®ã¿ã¢ãŒãïŒãŸãã¯ç¬èªãã§ãã¯ã§ç£æ»:
- ERCïŒã¯ãã åãã§ãã¯ïŒ â
ee ãããã¯ãå¿
ã確èªããŠãŒã¶ãŒã«å ±å: openNetsïŒæªé£çµãããïŒ/ unconnectedLeadsïŒãããæªå²åœã®è¶³ïŒ/ duplicateIdsïŒrefdes éè€ïŒ/ multipleDriversïŒåºå-åºåã·ã§ãŒãïŒãã©ã€ãç«¶åãåäžãããã« role=out ã2æ¬ä»¥äžãåºæ¿å€ MCU åºå端åãå«ãïŒ/ floatingPowerPinsïŒé»æºãã³æµ®ãïŒ/ singleLeadNetsïŒåäžãªãŒã=çµç·æŒããrules.single_lead_allowlist ã§ I/O ç¹ã¯é€å€ïŒ/ unclassifiedNetsïŒã¯ã©ã¹æªå²åœïŒEEã«ãŒã«çŽ éãïŒ/ polarityïŒé»è§£ã®é極æ§ãrail_rank èšå®æã«æå¹ïŒ/ powerReachïŒPWRãããã絊é»ãªãŒãã«å°éãpower_entry èšå®æïŒ/ keepAwayïŒé«ZããŒãã®é¢ééåïŒ/ decouplingCoverageïŒé»æºãã³ã®ãã€ãã¹ååšïŒãundrivenNetsïŒå
¥åã®ã¿ã§é§åãªãïŒãããŒãã£ã³ã°ãpassive ãã€ã¢ã¹ã¯é€å€ïŒ/ stripShortsïŒã¹ããªããåºæ¿ã§ç°ããããåäžæªã«ããã¹ããªããã«åå±
ïŒ/ resistorPowerïŒä»»æ valueΩïŒrail_volts èšå®æãP=ÎV²/R ã宿 Œè¶
ïŒ/ decouplingValueWarnïŒãã€ãã¹ã« 1µF è¶
ïŒ/ pinConflictsïŒåäžãããã« out ãš pwrïŒåºåã黿ºã«ç絡ïŒãee.fabReadyïŒ=eeNg 0 ãã€éå£åïŒãç·åã²ãŒããee.degraded:trueïŒãŸã㯠solver ã® stderr ã« DEGRADEDïŒãªã config æªããŒãã§äžæ žç£æ»ã空ïŒfabReady ã¯ä¿¡çšããªãããPASSïŒã¯ãã ä»ã OKããšäººã«èšããããŸã config ãçŽãïŒÂ§åæã®çµ¶å¯Ÿãã¹èµ·åãªã solver ã config ãèªå·±è§£æ±ºããã®ã§éåžžã¯å£åããªãïŒãee.fixes ã«åææã®æ©æ¢°å¯èªãªå¯ŸåŠæ¡ãä»ãïŒadvisoryïŒãåºåç«¶åã»é»æºãã³ã»å€èæ
®æ€æ»ã¯ pinTypes/role/value/rail_volts ã宣èšãããå Žåã®ã¿äœåïŒæªå®£èšã¯èª€æ€åºåé¿ã§ã¹ãããïŒåŸæ¹äºæïŒ
- åããããé£çµãïŒunion-findïŒ/ å¥ãããã®ããããããªããžãããŠããªãã
- ãã«ãããªã³ã°è·é¢ã»ã¯ã©ã¹å¥é
ç·é·ã»æ¬äœéãªãïŒtallÃtall=NGïŒã»ãããæ¥åæ°
- ããããž/SI ã¬ãã¥ãŒ â
ee.groundingïŒã¹ã¿ãŒ/ãã€ãžãŒãã§ãŒã³å€å®ããªã¿ãŒã³ãããã daisy-chain ãªãå
±éã€ã³ããŒãã³ã¹çµåã®èŠåïŒ/ ee.guardïŒé«ZããŒãã®ã¬ãŒãå©èšïŒ/ ee.crosstalkïŒå¹³è¡è¿æ¥ã®è¢«èŠç·å¯Ÿã端ç¹è¿äŒŒïŒçµè·¯æªã¢ãã«ã®ããå©èšïŒ
- PASS ããããã¯ãã äœæ¥ã¯ãšãã£ã¿ã®äœæ¥ã¬ã€ãïŒ1æé ãã€ãã€ã©ã€ãã»è£é¢ãã©ãŒãã¥ãŒã»é²æä¿åïŒãæ¡å
ãã
- 宿©æ€èšŒã¯ãšãã£ã¿ã®å°éãªã¹ããã¿ã³ïŒãããå¥ããŒãã¢ãŠã + ããªããžå³çŠãã¢ã® markdownïŒãš
ãã¹ã¿ãŒã¢ãŒãïŒ2穎ã¯ãªãã¯ã§èšç»äžã®å°éå€å®ïŒãæ¡å
ãããç¬èªãã§ãã¯ãªã¹ããå¥éçæããŠããã
4b. ãã«ãçš®å¥ããšã®ç©ç泚æïŒéšåæ§æã§çºç«ã»ç£æ»èŠçŽã«å¿
ãäžèšæ·»ããïŒ
solver ã® ee ã¯å¹Ÿäœã»é»æ°ããããžãèŠãããéšåçš®å¥ããšã®ãå®è£
äžã®å®çªã®èœãšã穎ãã¯ç€é¢ã ãããã¯åºãªãïŒåªç§ãªèšèšã§ãèœãšããããïŒãstate ã«æ¬¡ã®éšå/æ§æãèŠã€ããããç£æ»èŠçŽïŒÂ§4 ã®å¹³æå ±åïŒã«è©²åœããç©ç泚æãå¿
ãæ·»ããââç€é¢ã cleanïŒfabReadyïŒã§ãçããªãããã¹ãŠ advisory ã§ãããå®å
šå®£èšã¯ããªãïŒéé»åã«äººã®ç¬ç«ç¢ºèªïŒã
| state ã«èŠã€ããã | ç£æ»èŠçŽã«å¿
ãæ·»ããç©ç泚æ |
|---|
èªå°è² è·ã³ã€ã«ïŒãªã¬ãŒ/ãœã¬ãã€ã/ã¢ãŒã¿ãŒïŒfamily ã«ãªã¬ãŒ/ã³ã€ã«/ã¢ãŒã¿ãŒããŸã㯠MCU åºåâã³ã€ã«ïŒ | â ã³ã€ã«ã¯ GPIO çŽé§åã§ãªã Tr/ãã©ã€ãçµç± â¡ãã©ã€ããã¯ïŒéæµïŒãã€ãªãŒããã³ã€ã«ã«äžŠåã»åãå³å®ïŒåž¯ïŒã«ãœãŒããïŒåŽãžãéã ãšéé»ã§ã·ã§ãŒãïŒ â¢ã³ã€ã«é»æµã®æ»ãçµè·¯ãä¿¡å·/ã»ã³ãµãŒ GND ãšåãã1ç¹ïŒã¹ã¿ãŒïŒã§åæµïŒãªã¿ãŒã³ãä¿¡å· GND ãæ±ããš MCU ãªã»ãã/誀åäœïŒ |
| ã¢ãŒã¿ãŒãã©ã€ã/H ããªããžïŒDRV8833/TB6612/ULN çïŒïŒå¥é»æº | â ã¢ãŒã¿ãŒé»æº VM ãšããžã㯠VCC ã¯å¥çµŠé»ã»åã
ã«å°éç¢ºèª â¡nSLEEP/EN/STBY ãæµ®ãããªã â¢VM ã«ãã«ã¯é»è§£ â£åå GND ãšä¿¡å· GND ã1ç¹åæµïŒåé
ãšåãçç±ïŒ |
| RF/ç¡ç·ã¢ãžã¥ãŒã«ã»å±å€/ãœãŒã©ãŒé»æºïŒLoRa/SX127x/RFã»ãœãŒã©ãŒå
¥åã»ã¢ã³ããïŒ | â ãœãŒã©ãŒ/å€éšé»æºå
¥åã«éæµé²æ¢/鿥ä¿è·ã®ã·ã§ããããŒãåãå³å®ã§ â¡ã¢ã³ãã/RF 絊é»ç·ã¯ä»ä¿¡å·ãã keep-awayïŒé¢éïŒã»å¯èœãªã GND ã§å²ã â¢RF/黿ºãã³çŽè¿ã«ãã«ãããªã³ã° |
| SSR/ãªã¬ãŒã§ AC åçšïŒmainsïŒãåãèŠæ± | æã¯ãã perfboard ã« mains ã¯èŒããªãïŒæåŠããçµ¶çžæžã¿åžè²©ã¢ãžã¥ãŒã«/端åå°ã»äœå§ã®å¶åŸ¡åŽã ã perfboardããžèªå°ïŒäžèšãå®å
šãïŒãå ããŠ**ãSSR 㯠OFF æä»€ã§ãæŒã黿µãæµããè² è·ã¯å®å
šã«ã¯åããªãïŒOFF ã§ãéšåéé»ãããã**ããšãå¿
ãäŒããïŒé
ç·ã»æž
æåã¯å¿
ã倧å
ïŒå
黿º/ãã¬ãŒã«ïŒãåãïŒ |
| Li-ion/LiPo å
é»ïŒTP4056 çã»ã»ã«/黿± ãããïŒ | â ä¿è· IC/å
é»ç®¡ç IC ãå¿
é ïŒçæµæã§ã®å
é»ã¯ç±æŽèµ°ïŒèŽåœçïŒâ¡é»è§£ã®æ¥µæ§ â¢åŒ·ãå®å
šç¯ãäžå¿ã«ãéé»åã¯äººã®ç¢ºèªãDIY å
é»ãè»œãæ±ããªã |
| 5V ã»ã³ãµãŒ â 3.3V MCUïŒHC-SR04 ã® ECHO çã5V åºåãé 5V ãã¬ã©ã³ã GPIO ãžïŒ | 5V åºåã 3.3V GPIO ã«çŽçµããªãïŒåå§ïŒäŸ 1k/2kïŒãã¬ãã«ã·ãã¿ã§åãããå©çšè
ããçŽçµã§å€§äžå€«ããšåæããŠããŠãèšæ£ããïŒãã¬ããããŒãã§åããŠã GPIO ã®ä¿è·ãã€ãªãŒããããããçãïŒ |
ãããã¯éšåæ§æã§æ©æ¢°çã«çºç«ããæ¢å®ãã§ãã¯ãªã¹ããè©²åœæ§æãªãã--emit-packet ã®ãã«ããã±ãããå¹³æèŠçŽã«è©²åœè¡ãäžèšå
¥ããŠããäººã«æž¡ãã
5. ãšãŒãžã§ã³ãåŽã®èª¿æ»ã»æ¹è©ïŒãã©ã°ã€ã³ãªãã§ã¯ã®äººïŒAIã«ãŒãïŒ
perfwire ã® HTML ã¯æå³çã«ãªãã©ã€ã³ã»åäžãã¡ã€ã«ïŒå®è¡æã«ããããžåºãªãïŒãã ããããããããã datasheet ãèŠããäœæ¥ã¯ãšãŒãžã§ã³ãïŒClaude CodeïŒåŽãæ
ããçµæã configïŒç¶æ
JSONïŒHTMLã®DEFCFGã«æžãæ»ãã®ãæ£ããåæ
ããå®è¡æã®èªåæ€çŽ¢ãããã©ãŠã¶ã«å
¥ããã®ã§ã¯ãªããããã§äžåºŠèª¿ã¹ãŠåºå
žä»ãã§åã蟌ãã
(a) éšåã®å®å¯žã調ã¹ãŠå¯žæ³ãæ ¹æ ä»ããïŒïŒãèªåæ€çŽ¢ãã®æ£ãã圢ïŒ
ãŠãŒã¶ãŒã®å®éšåïŒåçªã»ç§æã³ãŒãã»é»å宿 ŒïŒãããã¡ãŒã«ãŒ datasheetïŒä»£çåºä»æ§ã§æ¬äœå¯žæ³ã調㹠config.physical ãæŽæ°ããåºå
žã䜵èšããïŒHTML åŽ DEFCFGïŒPHYSREF ãåæ§ã«ïŒã決å®çãªäºå®: è»žæµæã®å¯žæ³ã¯é»å宿 ŒïŒç³»åã§æ±ºãŸããæµæå€ã§ã¯å€ãããªãïŒ1MΩ ã 10kΩ ãåã 1/4W ãªãå寞ïŒïŒper-å€ã§ãªãããã±ãŒãžïŒWïŒåäœã§åŒããé»è§£ã¯å®¹éÃé»å§(CV)ããã£ã«ã ç®±ã¯å€/èå§ã§ããããæ±ºãŸãã®ã§å€äŸåã§åŒããpinTypes ãšåããdatasheet ããåãããæµåããªãŒãã«ãåºããã
- äŸ: ããã®åºæ¿ã®æµæã®å®å¯žã調ã¹ãŠ config ãæŽæ°ãâ 1/4W ççŽ ç®è â 6.3â6.8Ã2.3â2.5mmïŒYageo CFR-25ïŒVishay MRS25ïŒçãåæ ïŒåºå
žã³ã¡ã³ãã
- 广:
spans() ã®æå¹ã¹ãã³ïŒå¯=æ¬äœé·ããå°åºïŒç«=1â2穎ïŒãå®å¯žã«åºã¥ãããšãã£ã¿å¡äŸã«å¯žæ³ïŒæå¹ã¹ãã³ïŒåºå
žã衚瀺ãããã
(b) ã¬ã€ã¢ãŠãã®ãè·äººç®ãæ¹è©ïŒcraft å質ïŒ
ERC/EEïŒé»æ°ïŒã«å ãé
眮㮠craft åè³ªãæ¹è©: é
ç·é·ååžïŒHPWLïŒïŒæãã»é䌞é·ã®æµæïŒç«ãŠå®è£
ã®éå€ïŒäº€å·®ã»å¯éãéŸå€ã¯åºå®å€ã§ãªããã®ç€é¢èªèº«ã®ååžïŒäžå€®æ¯ã»åãœã«ãäžéïŒããå°ãïŒspan>5穎ã®ãããªæ±ºãæã¡ã¯çŠæ¢ïŒããšãã£ã¿ç£æ»ã«ããã¬ã€ã¢ãŠãå質ãè¡ãåºããç«ãŠæµæã¯äžå
·åã§ãªãæ£åœãªåçŽå®è£
ïŒERC ãšã©ãŒã«ããªãïŒé£æ¥ç©Žã«åºãã£ãŠèŠããã®ã¯æç»/å¯èªæ§ã®è©±ïŒã
(c) ããã¯ãªãŒã³ãªåé
眮ïŒéã¿èª¿æŽ â åãœã«ã â before/after 宿ž¬ïŒ
craft ææã®åå ã¯ãœã«ããŒç®ç颿°ã®é
ã®æ¬ èœãconfig.weights ã® diag_penaltyïŒæãæå¶ïŒ/ span_penaltyïŒäŒžé·æå¶ïŒ/ standing_penaltyïŒç«ãŠæå¶ïŒã調æŽã --propose ã§åãœã«ããåã craft ææšãåæž¬å®ããŠãçãè»žãæ¹å â§ ä»è»žãæªåãããªãïŒParetoïŒãã宿ž¬ç¢ºèªãããå¯ãªç€é¢ã§ã¯ trade ãç©ççã«é¿ããããªãïŒæããæ¶ããšç«ãŠãå¢ããçïŒïŒæ£çŽã«æç€ºãéæ³ã®éã¿ã§é ããªããHTML å
èµãœã«ããŒãš solver.py ã¯åãéã¿ãäžè²«æŽæ°ããïŒparity ã¯ç£æ»ãæ¯èŒïŒé
眮ç®çã®å€æŽã§ã¯ç ŽããªãïŒã
ãã£ãŒãããã¯èµ·ç¥šïŒå©çšè
ã®äžæºã»èŠæã»ãã° â GitHub IssueïŒ
perfwireãžã®æ¹åèŠæã»ãã°ã¯ GitHub IssueïŒrepo: KeckuJp/perfwireãä»¥äž <REPO>ïŒã§åãä»ããŠããã
ããªãã¯ããŒãžã§ã³ã»ç°å¢ã»å®è¡ã³ãã³ãã»stderrã»æå°åçŸç€é¢ãæ©æ¢°çã«éããããæè¯ã®å ±åè
ã ãã
起祚ã®äž»äœã¯åžžã«å©çšè
æ¬äººã§ãããããªãã¯ä»£çè
ã«åŸ¹ããã
çºç«æ¡ä»¶: å©çšè
ã®çºè©±ã perfwire èªäœãžã®äžæºã»èŠæã»ãã°ããããšãïŒããã䜿ãã«ããã
ããã§ãããããã®ã«ããåºãŸã£ããããã®ç£æ»å€å®ãããããïŒãããªãèªèº«ããšã©ãŒã«ééãã
ãšããåæ§ïŒãã ãåãåããå
ã«ãäžèšStep 0åç
§ïŒã
絶察åå
- åæã«èµ·ç¥šããªããäžæžãå
šæãèŠããŠæç€ºåæãåŸããŸã§
gh issue create ãURLæ¡å
ãããªãã
- 1åæ = 1 Issueãè€æ°ã®èª²é¡ãæ··åšããŠããã1ä»¶ãã€ææ¡ããïŒé¢é£ã匷ãå Žåã®ã¿ããŸãšããŸããã
ãšéžæè¢ãåºãïŒã
- æããããåäžã»ãã·ã§ã³å
ã§åææ¡ããªãã
- ç€é¢JSONã»ãããåã»éšååçªã¯å©çšè
ã®åè·¯èšèšïŒå
¬éã®å¯åŠãå¥é確èªãããå
±æäžå¯ãªãã
ç¡é¢ä¿ãªéšåãåã£ãåæã®æå°åçŸç€é¢ãäœããsolverãåå®è¡ããŠåé¡ãåçŸããããšã確èªããŠ
ããæ·»ä»ãããstderråæã»ç°å¢æ
å ±ã«ã¯ããŒã«ã«ã®çµ¶å¯Ÿãã¹(ãŠãŒã¶ãŒåãå«ã
C:\Users\<åå>\...ç)
ããããžã§ã¯ãåºæã®ååãæ··å
¥ãããã®ã§ã貌ãåã«ç®èŠã§ãŠãŒã¶ãŒå/ãããžã§ã¯ãåãäŒãã
ïŒäŸ: C:\Users\<user>\...ïŒã
- æšæž¬ã§ãã°ãšæå®ããªããå®éã®ãšã©ãŒåæã»å®éã®å€å®å€ãªã©ã蚌æ ãæ¬æã«å
¥ããã
gh issue create ã¯å©çšè
èªèº«ã®GitHubèªèšŒã§èµ°ãïŒIssueã¯å©çšè
æ¬äººã®ã¢ã«ãŠã³ãå矩ã§å
¬éãããã
ãããStep 4ã®åææã«æç€ºããã
ãããŒ
- Step 0 åãåã: (a) äœ¿ãæ¹ã®èª€è§£ â ãã®å Žã§è§£æ±ºã起祚ããªãïŒãã ããåèŠã§èª€è§£ãããUI/æèšã
èªäœã¯UX課é¡ãšããŠææ¡ããŠããïŒ (b) ç€é¢/config ããŒã¿ã®èª¿æŽã§è§£æ±º â 起祚ããªã
(c) æ§ãã£ãã·ã¥çã®å¯èœæ§ â
/plugin marketplace update perfwire åŸã«åçŸç¢ºèª
(d) ããã§ãæ®ãæ¬äœã®èª²é¡ â 起祚åè£ãžé²ãã
- Step 1 ghå¯åŠå€å®ïŒéè€ç¢ºèªããåã«è¡ããç¡ããã°ä»¥éã®éè€ç¢ºèªã¯ã¹ããããããã®æšã
Step 4ã§é瀺ããïŒ:
command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1 && echo GH_OK || echo GH_FALLBACK
- Step 2 ææ¡: ãperfwireæ¬äœã®æ¹åç¹ã®ããã§ããå
¬éãªããžããªã«IssueãšããŠéããŸããããïŒ
ïŒå
容ã¯å
¬éãããããªãã®GitHubã¢ã«ãŠã³ãåçŸ©ã§æçš¿ãããŸããäžæžããå
ã«ãèŠãããŸãïŒã
- Step 3 äžæžãäœæ:
.github/ISSUE_TEMPLATE/ã®è©²åœãã³ãã¬(bug/erc-dispute/feature)ã®æ§é ã§
çµã¿ç«ãŠããversionïŒinstalled pluginãªã~/.claude/plugins/cache/*/perfwire/<version>/ã®version
ãã©ã«ãåãclone-and-openãªãgit rev-parse --short HEADïŒãç°å¢ïŒOSã»ãã©ãŠã¶ã»<PY> -VïŒã
åçŸæé ïŒå®ã³ãã³ãã»stderråæã»make_link.pyã®#z=ãªã³ã¯ãç€é¢JSONïŒãåããã
æ«å°Ÿã«å¿
ãããã¿ãŒãä»ãã: Filed via Claude Code on behalf of the user (drafted by the agent, approved by the user).
- Step 4 éè€ç¢ºèªïŒGH_OKã®ãšãã®ã¿ïŒ:
gh issue list --repo <REPO> --state all --search "<ããŒã¯ãŒã>" --limit 5 --json number,title,state,urlãé¡äŒŒãããã°ãæ¢åã®#Nãžã³ã¡ã³ã远èš
ïŒgh issue commentïŒãã第äžåè£ãšããŠæç€ºãããGH_FALLBACKã®å Žåã¯ãã®ã¹ããããé£ã°ããæšã
次ã®ç¢ºèªæã«äŒããã
- Step 5 åæç¢ºèª: ã¿ã€ãã«ã»æ¬æå
šæã»å®å
ïŒå
¬érepoïŒã»ãããªãã®ã¢ã«ãŠã³ãåçŸ©ã§æçš¿ãããŸãã
ãèŠããããã®å
容ã§èµ·ç¥šããŠããã§ããïŒç€é¢ããŒã¿ã¯å«ããŠããŸã/å«ããŠããŸããããš1åã ã確èªããã
- Step 6 起祚:
- GH_OK: æ¬æãäžæãã¡ã€ã«ïŒå©çšè
ã®ãããžã§ã¯ããã£ã¬ã¯ããªã§ãªããOSæšæºã®äžæãã£ã¬ã¯ããªã
Bashãªã
mktempçïŒã«æžããgh issue create --repo <REPO> --title "..." --body-file <tmpfile> --label bug --label via-claude-codeïŒ--repoã¯å©çšè
èªèº«ã®å¥ãªããžããªãžã®èª€çãé²ãããå¿
ã
æç€ºãæªå®çŸ©ã©ãã«ã§ã®å€±ææã¯--labelãå€ããŠåå®è¡ïŒãäœæãããURLãå©çšè
ã«äŒããã
- GH_FALLBACK: â æ¬æãOSæšæºã®äžæãã£ã¬ã¯ããªã«ä¿åãå ŽæãäŒããïŒå©çšè
ã®ãããžã§ã¯ãã«
æ®éªžãæ®ããªãïŒ â¡ å¯èœãªãã¯ãªããããŒããžã³ããŒïŒWindows
Set-Clipboard / macOS pbcopy /
Linux xclipïŒ â¢ æ§é åãã©ãŒã (?template=...)ã¯åäžã®æ¬ææ¬ãæããã¯ãªããããŒã貌ãä»ããš
éäºæãªã®ã§äœ¿ããªãã代ããã«ã¿ã€ãã«ã®ã¿èŒããçŽ ã®æ°èŠIssue URLãæž¡ã:
https://github.com/KeckuJp/perfwire/issues/new?title=<URLãšã³ã³ãŒãæžã¿ã¿ã€ãã«>
ïŒãã³ãã¬ãŒãéžæç»é¢ã§ã¯ãªãã¯ã©ã·ãã¯ãšãã£ã¿ãéãïŒãããã®URLãéããä¿åããæ¬æã
貌ãä»ããŠSubmitããŠãã ããããšæ¡å
ãããGitHubã¢ã«ãŠã³ããç¡ããã°ãäžæžããã¡ã€ã«ã®å Žæã
äŒããã ãã«çãããã以äžã¯è¿œããªãã
- ç€é¢JSONãæ¬æãURLã¯ãšãªã«çŽæ¥ç©ãŸãªãïŒURLé·å¶éã»ãšã³ã³ãŒãäºæ
ãé¿ãããããããªãã£ã«ã¯
ã¿ã€ãã«ã®ã¿ã«çããïŒã
泚æ
- åå€ã®æµæã¯åœ¹å²ãå
¥ãæ¿ããŠã黿°çã«ç䟡ã圹å²ã®åå®ã¯ãICã®ã©ã®ãã³ã«ããªããžæžã¿ãããæåªå
ã®èšŒæ ã«ãã
- æ¡ïŒproposalsïŒã¯æ¯èŒã®ããã«æ®ããæ¡çšæ¡ãæç€ºãã
- ç¶æ
JSON㯠git ã«ã³ãããããŠå±¥æŽãæ®ãéçšãæšå¥š