72 Commits

Author SHA1 Message Date
254e2f2d56 auto commited 2026-06-16 22:32:14 +12:00
291f2c0b76 auto commited 2026-06-16 22:32:13 +12:00
14932f43e9 auto commited 2026-06-16 22:32:13 +12:00
523e2dd9c6 auto commited 2026-06-16 22:32:04 +12:00
52c05d283c auto commited 2026-06-16 22:32:04 +12:00
521e643e0a auto commited 2026-06-16 22:32:04 +12:00
d82330c539 fixed power switch 2026-06-16 22:31:51 +12:00
914a60ed6d auto commited 2026-06-16 22:26:37 +12:00
e49af9f3f8 auto commited 2026-06-16 22:26:37 +12:00
8fa4decbed auto commited 2026-06-16 22:26:37 +12:00
3f45ca0df7 auto commited 2026-06-16 22:26:37 +12:00
09188a2ec6 auto commited 2026-06-16 22:26:29 +12:00
3ca7c37e71 auto commited 2026-06-16 22:26:29 +12:00
4ee0467bee auto commited 2026-06-16 22:26:29 +12:00
19ab12ab3b auto commited 2026-06-16 22:26:29 +12:00
551e7e04c0 auto commited 2026-06-16 22:26:29 +12:00
157730c2a2 cleaned up pos of decoupling caps 2026-06-16 22:26:13 +12:00
c68a4acd42 bump 2026-06-16 22:25:52 +12:00
2f26909ae8 relinked files 2026-06-16 22:25:02 +12:00
053f2c8078 renamed PWR to USB_input 2026-06-16 22:24:44 +12:00
3aff43f51c made sheet A3, fixed suffix, removed en from input buck, fixed battery input, fixed TMR resistor, fixed decoupling caps voltage and value 2026-06-16 22:23:41 +12:00
437cb1f7f4 cleaned up sch 2026-06-16 22:16:58 +12:00
60fbfede6f bump 2026-06-06 23:10:38 +12:00
e68279169b cleaned up decoupling caps 2026-06-06 23:10:10 +12:00
1c4ae03c3d attached modules togeather 2026-06-06 23:09:49 +12:00
1b8043023f bump 2026-06-06 23:09:00 +12:00
6399e11017 bump 2026-06-06 23:08:36 +12:00
1c50a9a380 fixed usb pd input 2026-06-06 23:08:03 +12:00
363f24d3e0 added battery charger, buck for usbPD input, 2 boots for usb hub and power, 3v3 reg, power monitor and adc for voltage rail reading 2026-06-06 23:07:38 +12:00
9781403d7c added rtc and connected pins to new power circuit 2026-06-06 23:06:05 +12:00
sirlilpanda
99b458e93b auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
4b48a1a61b auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
d8f066e072 auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
21562a28f3 auto commited 2026-03-09 10:47:12 +13:00
sirlilpanda
28aada4ef7 auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
7e877eacac auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
ac5d2d9655 auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
8dbbb4dfea auto commited 2026-03-09 10:47:10 +13:00
sirlilpanda
508ac0c534 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
2c89991d23 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
b473a78ef1 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
f06bf61ee5 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
3534683f47 auto commited 2026-03-09 10:46:12 +13:00
sirlilpanda
74a5c90e18 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
02f6063051 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
6896ed2822 auto commited 2026-03-09 10:46:10 +13:00
sirlilpanda
6c1505d6da auto commited 2026-03-09 10:46:10 +13:00
d3dec943a0 Merge pull request 'keyboard_interface_fix' (#2) from keyboard_interface_fix into main
Reviewed-on: #2
2026-02-19 00:48:14 -08:00
sirlilpanda
45772a7dec moved pull downs to MCU sheet 2026-02-09 10:39:24 +13:00
sirlilpanda
2269c4def1 moved pull downs from keyboard interface to here to avoid duplacates 2026-02-09 10:38:43 +13:00
f80573ab1f Merge pull request 'removing_github_actions' (#3) from removing_github_actions into main
Reviewed-on: #3
2026-01-22 17:44:08 -08:00
f78c7157eb auto commited 2026-01-23 14:42:50 +13:00
a3dda2ce81 auto commited 2026-01-23 14:42:50 +13:00
fe279ea87c auto commited 2026-01-23 14:42:50 +13:00
ad10ed6c61 auto commited 2026-01-23 14:42:50 +13:00
8a9e7c5548 auto commited 2026-01-23 14:42:50 +13:00
3697a2548e auto commited 2026-01-23 14:42:48 +13:00
0b667a4af2 auto commited 2026-01-23 14:42:48 +13:00
2a21b2c892 auto commited 2026-01-23 14:42:48 +13:00
e3d5cd219e auto commited 2026-01-23 14:42:48 +13:00
126f8b2806 auto commited 2026-01-23 14:42:48 +13:00
62907b10c7 get removed egg 2026-01-23 14:42:26 +13:00
903b09e8ca updated readme slightly it still needs work 2026-01-23 14:42:11 +13:00
91e6ed00c2 added a temp dir 2026-01-23 14:41:48 +13:00
56c30b7241 hooks setup script 2026-01-23 14:41:24 +13:00
c4010680b8 kicad cli hook 2026-01-23 14:41:04 +13:00
e42b38e44f keyboard interface now has display interface with uart and perphieral interface with i2c in a multimaster config 2026-01-23 14:34:06 +13:00
29513d59fe interface is now wired up to the micro 2026-01-23 14:33:21 +13:00
179cd7651d added display enable 2026-01-23 14:32:42 +13:00
0243b330dc merged i2c for keyboard and power perfs 2026-01-23 14:30:18 +13:00
8415c5d871 keyboard and power perfs are now on the same i2c bus with the perfs being on another 2026-01-23 14:29:49 +13:00
2f45d73360 merged perpherial and display interfaces in to 1 uart bus 2026-01-23 13:28:26 +13:00
36 changed files with 48791 additions and 10700 deletions

41
.github/rename.py vendored
View File

@@ -1,41 +0,0 @@
from pathlib import Path
import os
import sys
from ruamel.yaml import YAML
# renames the main project in the template dir and in the project settings
def rename_project(project_name, new_name = "template"):
"""renames the kicad project"""
project_path = str(Path(f"Hardware/{project_name}_PROJECT"))
files = os.listdir(project_path)
for index, file in enumerate(files):
print(file)
os.rename(os.path.join(project_path, file), os.path.join(project_path, file.replace(project_name, new_name)))
os.rename(project_path, project_path.replace(project_name, new_name))
pcb_path = str(Path(f"Hardware/{project_name}_PCB"))
os.rename(pcb_path, pcb_path.replace(project_name, new_name))
doc_path = str(Path(f"Hardware/{project_name}_DOCS"))
os.rename(doc_path, doc_path.replace(project_name, new_name))
def main():
yaml : YAML = YAML()
with open(Path("project_settings.yaml"), "r") as yaml_file:
settings = yaml.load(yaml_file)
print(f"{settings['project_name']=}")
print(f"{settings=}")
rename_project(settings["project_name"], sys.argv[1])
settings["project_name"] = sys.argv[1]
settings["needs_setup"] = False
# have to just print it out a rewrite over .project_settings because this guy
# is dumb and doesnt just let you write these out to string
with open(Path("project_settings.yaml"), "w", encoding=("utf-8")) as file:
yaml.dump(settings, file)
if __name__ == "__main__":
main()

View File

@@ -1,46 +0,0 @@
# look it would be piss easy to just keep it as a CSV but we can post process to add cool things like cost to each of the parts
import csv
import sys
import chevron
import datetime
from pprint import pprint
file_path_delimter = "\\" if sys.platform == "win32" else "/"
def load_bom(filename : str) -> dict:
out_dict = {
"parts" : [],
"time" : str(datetime.datetime.now().time()),
"date" : str(datetime.datetime.now().date().strftime("%d-%m-%Y")),
"total_cost" : 0,
"total_parts" : 0,
"project_name" : filename.strip(".csv").strip("bom").split(file_path_delimter)[-1]
}
with open(filename, "r") as csv_file:
for row in csv.DictReader(csv_file):
part_cost = 0
out_dict["total_parts"] += 1
out_dict["parts"].append(
{
"Reference" : row["Refs"],
"Value" : row["Value"],
"Quantity" : row["Qty"],
"part_number" : row["Footprint"],
"cost" : part_cost, # add some API call somewhere here
}
)
return out_dict
def main():
report_hash = load_bom(sys.argv[1])
# pprint(report_hash)
with open(sys.argv[2], "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open(sys.argv[3], "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,57 +0,0 @@
from violation import Violation
import datetime
import json
from pprint import pprint
def process_violation_list(drc_json : dict, list_name : str) -> None:
if list_name in drc_json.keys():
unconnected_items_errors = []
unconnected_items_warns = []
number_of_errors = 0
number_of_warns = 0
for violation in drc_json[list_name]:
v = Violation(violation, "drc")
if (v.violation_type == "error"):
unconnected_items_errors.append(v)
number_of_errors += 1
if (v.violation_type == "warn"):
unconnected_items_warns.append(v)
number_of_warns += 1
drc_json[list_name] = {
"errors" : unconnected_items_errors,
"warns" : unconnected_items_warns,
"number_of_errors" : number_of_errors,
"number_of_warns" : number_of_warns,
}
else:
drc_json.setdefault(list_name, {})
drc_json[list_name].setdefault("number_of_errors", 0)
drc_json[list_name].setdefault("number_of_warns", 0)
def process_report(report : str) -> dict:
out_dict : dict = json.loads(report)
number_of_errors = 0;
number_of_errors = 0;
process_violation_list(out_dict, "unconnected_items")
process_violation_list(out_dict, "violations")
process_violation_list(out_dict, "schematic_parity")
out_dict.setdefault(
"total_errors",
out_dict["unconnected_items"]["number_of_errors"] +
out_dict["violations"]["number_of_errors"] +
out_dict["schematic_parity"]["number_of_errors"]
)
out_dict.setdefault(
"total_warns",
out_dict["unconnected_items"]["number_of_warns"] +
out_dict["violations"]["number_of_warns"] +
out_dict["schematic_parity"]["number_of_warns"]
)
return out_dict

View File

@@ -1,53 +0,0 @@
from violation import Violation
import datetime
import json
class Sheet:
def __init__(self, json_obj : dict) -> None:
self.name : str = json_obj["path"]
self.name_md : str = self.name.replace(" ", "-")
self.number_of_errors : int = 0
self.number_of_warns : int = 0
self.errors : list[Violation] = list()
self.warns : list[Violation] = list()
for violation in json_obj["violations"]:
v = Violation(violation, "erc")
if (v.violation_type == "error"):
self.errors.append(v)
self.number_of_errors += 1
if (v.violation_type == "warn"):
self.warns.append(v)
self.number_of_warns += 1
def to_dict(self) -> dict:
out_dict = self.__dict__
errors_strings = []
warns_strings = []
for error in out_dict["errors"]:
errors_strings.append(error.__dict__)
out_dict["errors"] = errors_strings
for warn in out_dict["warns"]:
warns_strings.append(warn.__dict__)
out_dict["warns"] = warns_strings
return out_dict
def process_report(report : str) -> dict:
out_dict : dict = json.loads(report)
sheets = [Sheet(sheet) for sheet in out_dict["sheets"]]
out_dict["sheets"] = [sheet.to_dict() for sheet in sheets]
out_dict.setdefault(
"total_errors",
sum(sheet.number_of_errors for sheet in sheets)
)
out_dict.setdefault(
"total_warns",
sum(sheet.number_of_warns for sheet in sheets)
)
return out_dict

View File

@@ -1,50 +0,0 @@
# usage: python process_json_reports.py report.json template.mustache outfile.md project_name
import chevron
import sys
import datetime
import json
import process_erc_json
import process_drc_json
from pprint import pprint
def load_report(filename : str, project_name : str) -> dict:
out_dict : dict = {}
with open(filename, "r") as js:
if ("erc" in filename.lower()):
out_dict = process_erc_json.process_report(js.read())
if ("drc" in filename.lower()):
out_dict = process_drc_json.process_report(js.read())
out_dict.setdefault(
"time",
str(datetime.datetime.now().time())
)
out_dict.setdefault(
"date",
str(datetime.datetime.now().date().strftime("%d-%m-%Y"))
)
out_dict.setdefault(
"project_name",
project_name
)
out_dict.setdefault(
"has_violations",
True if out_dict["total_warns"] + out_dict["total_errors"] else None
)
return out_dict
def main():
report_hash = load_report(sys.argv[1], sys.argv[4])
# pprint(report_hash)
with open(sys.argv[2], "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open(sys.argv[3], "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,94 +0,0 @@
import chevron
import sys
import datetime
import json
import glob
from pathlib import Path
from pprint import pprint
# erc
# {
# "project_name" : "string",
# "passing_erc" : "bool",
# "erc_summary_link" : "link",
# }
# drc
# {
# "project_name" : "string",
# "passing_drc" : "bool",
# "drc_summary_link" : "link",
# }
# project
# {
# "project_name" : "string",
# "project_link" : "link",
# "schematic_link" : "link",
# "gerber_link" : "link",
# "bom_report_link" : "link",
# "bom_csv_link" : "link"
# }
EXTRAS_FILENAME = "readme_extras.json"
def load_json_file(filename : str) -> dict:
with open(Path(f"{filename}/{filename}"), "r") as js:
return json.loads(js.read())
def create_hash(filenames : list[str]) -> dict:
report_outs = filenames
report_outs.remove("readme_extras.json")
extras = {}
with open("readme_extras.json", "r") as js:
extras = json.loads(js.read())
reports_dicts : list[dict] = []
for report_name in report_outs:
reports_dicts.append(load_json_file(report_name))
readme_hash = {
**extras,
"projects" : [],
"did_error" : False,
"multiple_projects" : None
}
for report in reports_dicts:
for project in readme_hash["projects"]:
if project["project_name"] == report["project_name"]:
for key in report.keys():
project.setdefault(key, report[key])
break
else:
readme_hash["projects"].append(report)
pprint(readme_hash)
for project in readme_hash["projects"]:
readme_hash["did_error"] |= not project["passing_erc"]
readme_hash["did_error"] |= not project["passing_drc"]
project.setdefault("passing_erc_emoji", "" if project["passing_erc"] == "true" else "")
project.setdefault("passing_drc_emoji", "" if project["passing_drc"] == "true" else "")
readme_hash["multiple_projects"] = True if len(readme_hash["projects"]) > 1 else None
pprint(readme_hash)
return readme_hash
def main():
print(sys.argv)
readme_template, *args = sys.argv[1:]
report_hash = create_hash(args)
with open(readme_template, "r") as txt:
out = chevron.render(txt.read(), report_hash)
with open("README.md", "w") as md:
md.write(out)
if __name__ == "__main__":
main()

View File

@@ -1,3 +0,0 @@
chevron
pathlib
ruamel.yaml

View File

@@ -1,18 +0,0 @@
class Violation:
def __init__(self, violation : dict, violation_report_type : str = ["erc", "drc"]) -> None:
self.violation_type : str = \
"warn" if violation["severity"] == "warning" else "error"
self.name : str = violation["description"]
self.content : str = ""
# this violation_report_type purely exists because of a bug
# in kicads json output format where json output on erc reports
# the position in decimeters
for item in violation["items"]:
item_string = item["description"]
x : float = float(item["pos"]["x"]) * (100.0 if (violation_report_type == "erc") else 1.0)
y : float = float(item["pos"]["y"]) * (100.0 if (violation_report_type == "erc") else 1.0)
# print(f"{x=}")
item_string += f" at [x = {x:.4}mm, y = {y:.4}mm]\n"
self.content += item_string

View File

@@ -1,29 +0,0 @@
{{! hash schema }}
{{! {
"project_name" : "the name of the project",
"time" : "the name of the project",
"date" : "the name of the project",
"total_parts" : "number",
"total_cost" : "number",
"parts" : [
{
"Reference" : "part_reference" ,
"Value" : "the value of the part" ,
"Quantity" : "number" ,
"part_number" : "the part number" ,
"cost" : "number"
}
]
} }}
# 📄 BOM for {{project_name}} 📄
report created at {{time}} on {{date}}.
{{project_name}} has a total of {{total_parts}} parts with a cost of ${{total_cost}}.
| Reference | Value | Quantity | part number | cost |
| --------- | ----- | -------- | ----------- | ---- |
{{#parts}}
| {{Reference}} | {{Value}} | {{Quantity}} | {{part_number}} | ${{cost}} |
{{/parts}}
| | total | {{total_parts}} | total | ${{total_cost}} |

View File

@@ -1,133 +0,0 @@
{{! hash schema }}
{{! {
"date" : "the date of creation",
"time" : "the time of creation",
"total_warns" : "number",
"total_errors" : "number",
"has_violations" : "flag to say if the project has a violation",
"violations" : {
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
},
"unconnected_items" : {
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
},
"schematic_parity" :{
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
}
} }}
# 📟 {{project_name}} DRC report 📟
report created at {{time}} 🕧 on {{date}} 🗓️.
the design rule check found:
- {{total_errors}} errors in your design 😱
- {{total_warns}} warns in your design 🫨
{{#has_violations}}
number of errors and warns breakdown per sheet:
| error type | number of errors 🔴 | number of warns 🟠 |
| ----------------------------------------- | -------------------------------------- | ------------------------------------- |
| [violations](#violations) ❌ | {{violations.number_of_errors}} | {{violations.number_of_warns}} |
| [unconnected items](#unconnected-items) ⛓️‍💥| {{unconnected_items.number_of_errors}} | {{unconnected_items.number_of_warns}} |
| [schematic parity](#schematic-parity) 🔗 | {{schematic_parity.number_of_errors}} | {{schematic_parity.number_of_warns}} |
| total | {{total_errors}} | {{total_warns}} |
below is a more in-depth breakdown of the errors and warns per error type.
note you should only use this for quickly checking that the project
you uploaded has no error or warn. YOU SHOULD *NOT* use this to actually
run the drc in kicad so you can see where is erroring.
# violations
## errors : {{violations.number_of_errors}}
{{#violations.errors}}
### {{name}}
{{content}}
{{loction}}
{{/violations.errors}}
## warns : {{violations.number_of_warns}}
{{#violations.warns}}
### {{name}}
{{content}}
{{loction}}
{{/violations.warns}}
# unconnected items
## errors : {{unconnected_items.number_of_errors}}
{{#unconnected_items.errors}}
### {{name}}
{{content}}
{{loction}}
{{/unconnected_items.errors}}
## warns : {{unconnected_items.number_of_warns}}
{{#unconnected_items.warns}}
### {{name}}
{{content}}
{{loction}}
{{/unconnected_items.warns}}
# schematic parity
## errors : {{schematic_parity.number_of_errors}}
{{#schematic_parity.errors}}
### {{name}}
{{content}}
{{loction}}
{{/schematic_parity.errors}}
## warns : {{schematic_parity.number_of_warns}}
{{#schematic_parity.warns}}
### {{name}}
{{content}}
{{loction}}
{{/schematic_parity.warns}}
{{/has_violations}}
{{^has_violations}}
the design had no errors or warns, good job. ✅✅
{{/has_violations}}

View File

@@ -1,73 +0,0 @@
{{! hash schema }}
{{! {
"date" : "the date of creation",
"time" : "the time of creation",
"total_warns" : "number",
"total_errors" : "number",
"has_violations" : "flag to say if the project has a violation",
"sheets" : [
{
"name" : "string",
"name_md" : "just name but i replaced the spaces with hyphens",
"number_of_errors" : "number",
"number_of_warns" : "number",
"warns" : [
{
"name" : "string",
"content" : "string"
}
],
"errors" : [
{
"name" : "string",
"content" : "string"
}
]
}
]
} }}
# ⚡{{project_name}} ERC report ⚡
report created at {{time}} 🕧 on {{date}} 🗓️.
the electronic rules check found:
- {{total_errors}} errors in your design 😱
- {{total_warns}} warns in your design 🫨
{{#has_violations}}
number of errors and warns breakdown per sheet:
| sheet name 📄| number of errors 🔴 | number of warns 🟠 |
| ---------- | ---------------- | --------------- |
{{#sheets}}
| [{{name}}](#{{name_md}}) | {{number_of_errors}} | {{number_of_warns}} |
{{/sheets}}
| total | {{total_errors}}| {{total_warns}}|
below is a more in-depth breakdown of the errors and warn per sheets.
note you should only use this for quickly checking that the project
you uploaded has no error or warn. YOU SHOULD *NOT* use this to actually
run your ERC in kicad so you can see where is erroring.
{{#sheets}}
# {{name}}
## errors : {{number_of_errors}}
{{#errors}}
### {{name}}
{{content}}
{{/errors}}
## warns : {{number_of_warns}}
{{#warns}}
### {{name}}
{{content}}
{{/warns}}
{{/sheets}}
{{/has_violations}}
{{^has_violations}}
the design had no errors or warns, good job. ✅✅
{{/has_violations}}

View File

@@ -1,5 +0,0 @@
# how the templates work
templates work by using a json file to fill in the templating spots. for more information on the templates checkout [mustache templates](https://mustache.github.io/). these templates use a json file format as what they call a "hash" to fill out the templates. the hashs for each of these templates are layout at the top of each of the `.mustache` files in a comment. These are also the hashes outputted by the processing scripts. usages for these scripts are at the top of the file.
if any schema says bool this actually means the value is either something or either doesnt exist/null.

View File

@@ -1,153 +0,0 @@
{{! hash schema }}
{{! {
"badge" : "the ci badge",
"lastest_action_run_link" : "link to the lastest action",
"did_error" : "to check if errors occured in the pipeline",
"title" : "the tiltle of the project, can be set in project_settings or it will use the repo name",
"multiple_projects" : "bool",
"projects" : [
{
"project_name" : "string",
"project_link" : "link",
"passing_erc" : "bool",
"passing_erc_emoji" : "string",
"erc_summary_link" : "link",
"passing_drc" : "bool",
"passing_drc_emoji" : "string",
"drc_summary_link" : "link",
"gerber_link" : "link",
"schematic_link" : "link",
"bom_report_link" : "link",
"bom_csv_link" : "link"
}
]
} }}
# kicad project {{title}}
{{badge}}
{{! [![.github/workflows/main.yaml](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml/badge.svg)](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml) }}
a cool table showing the workflow of all the kicad projects.
| project_name | DRC | ERC |
| ------------ | --- | --- |
{{#projects}}
| {{project_name}} | [{{passing_erc_emoji}}]({{erc_summary_link}})| [{{passing_drc_emoji}}]({{drc_summary_link}}) |
{{/projects}}
for a quick guide check [project setup](#project-setup)
This is a simple project template for new kicad projects. This template has some basic setup already completed such as workflows for auto creating all the things you forget when creating a kicad project such as:
{{^multiple_projects}}
{{#projects}}
- [gerbers]({{gerber_link}})
- [bom]({{bom_report_link}})
- [schematic pdf]({{schematic_link}})
{{/projects}}
{{/multiple_projects}}
{{#multiple_projects}}
| project_name | schematic | bom | bom report | gerbers |
| ------------ | --------- | --- | ---------- | ------- |
{{#projects}}
| [{{project_name}}]({{project_link}}) | [{{project_name}}_schematic.pdf]({{schematic_link}}) | [{{project_name}}_bill_of_materials.csv]({{bom_csv_link}}) | [{{project_name}}_bom_report.md]({{bom_report_link}}) | [{{project_name}}_grbr.zip]({{gerber_link}}) |
{{/projects}}
{{/multiple_projects}}
This workflow will also run the design rules check on the PCB and schematic to ensure that you upload a working PCB. These reports are uploaded as summaries within the github [actions tab]({{lastest_action_run_link}}). This template has a simple schematic PCB in it (because DRC fails on an empty PCB). Shown below is the example PCB.
![example pcb with battery diode and resistor](res/image.png)
besides from that the project also has:
- common predefined trace widths
- smallest vias size [JLCPBC allows](https://jlcpcb.com/capabilities/Capabilities#Drilling)
- custom net colours in the schematic editor
- `red` for +V
- `blue` for -V
- `grey` for ground
to create a repo from this template follow this [guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
contained in this template are:
---
- `.github/` : all files relating to github actions and other admin see [here](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions) for more example of what can be placed in it
- `report_processing` : where the python scripts are stored for processing the json report data from kicad
- `report_templates` : where the template for said reports are stored
- `workflows/` : this is where the github actions are kept
- `main.yaml` : the main github action that will auto generate all files required and run DRC and ERC
- `rename.py` : the script for renaming the project
- `hardware/` : this is where the kicad projects live note this can be changed
- `docs/` : this is where the generate docs are placed by default
- `BOM/` : where the bill of materials and price breakdown are kept
- `bill_of_materials.csv`: the auto generated bom for the kicad project
- `bom_report.md` : a report for the bill of materials
- `template_schematic.pdf` : the schematic for the kicad project, auto generated by the github action
- `pcbs/` : this is where the auto generated gerbers for the kicad project are stored
- `res/` : where resources are stored for the README
- `.gitignore`: a slightly modified gitignore from the [standard one](https://github.com/github/gitignore/blob/main/KiCad.gitignore)
- `project_settings.yaml` : where the settings for this project is stored
- `README.md` : this file, suggest you change this one creating your project
## project settings
there are currently very few project settings that can be changed (will will be change in the future) these are:
| setting | description |
| --------------------------- | ----------------------------------------------------------------- |
| has_been_set_up | a flag to tell the setup action if the project has been set up |
| project_name | the name of the project, this will be set to the name of the repo |
| production_formats | the output production format for the PCBs |
| dynamic_read_me | allow the readme to be updated using the given template |
| bom_template_path | the template used to write the bom report files |
| erc_report_template_path | the template used to write the erc report files |
| drc_report_template_path | the template used to write the drc report files |
| readme_template_path | the template used to write projects readme |
| schematic_output_name | the name suffix of the generated schematics |
| bom_csv_output_name | the name suffix of the generated bom csv file |
| bom_report_output_name | the name suffix of the generated bom report |
| production_file_output_name | the name suffix of the generated production file |
| schematic_output_path | the output path of the generated schematics files |
| bom_csv_output_path | the output path of the generated bom csv file |
| bom_report_output_path | the output path of the generated bom report |
| production_file_output_path | the output path of the generated production file |
## project setup
### creating a new repo with the template
creating a new template from a repo is simple:
1. click on the button in the top right hand corner called `use this template`
![alt text](res/image-5.png)
2. when the drop down menu appears click on `create a new repository`
![alt text](res/image-6.png)
3. once you click you will be brought to this page, note that the repo name you choose here will be the name that you kicad project is called.
![alt text](res/image-7.png)
after these steps you then need to configure the repo settings to do their magic see [configuring repo settings](#configuring-repo-settings) for what to do next.
### configuring repo settings
once you have created a new repo with the template, you ill have to configure the github action settings. this is because you will get an error that looks something along these lines:
![alt text](res/image-4.png)
where the action can not commit the changes due to not having permissions follow these steps:
1. open the repo setting
![alt text](res/image-1.png)
2. then head in to actions : General
![alt text](res/image-2.png)
3. then scroll down to workflow permissions and ensure that both
`Read and write permissions` and `Allow GitHub Actions to create and approve pull requests` are ticked as seen below
![alt text](res/image-3.png)
this should fix the problem if not, go harass stack overflow they need it
Once all of these steps have been followed the workflow should be passing, however the `README.md` will only update on the next push request.
## editing the readme
As this repo can and will automatically update the repo corresponding to the given readme template. If you dont want to use this you can always disable this by setting the `dynamic_read_me` to `false`. but if you want some very cool features like auto updating tables to show what projects are passing the rules check or simple links to parts of your directory. then have a look at the template readme and learn [mustache](https://mustache.github.io/)
## improvements

View File

@@ -1,539 +0,0 @@
on:
push:
branches: [main, master, workflow_testing]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
ERC_JOB_NAME : "⚡ERC report⚡"
DRC_JOB_NAME : "📟 DRC report 📟"
jobs:
setup_new_project: # this job only exists for project creation
runs-on: ubuntu-latest
name: set up project
steps:
- name: Checkout
uses: actions/checkout@v4
# reads the project_setting.yaml file allowing you to access it with steps.id.outputs.[key]
- name: read yaml file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: check setup
run: |
echo ${{steps.yaml.outputs.needs_setup}}
- name: Setting up Python and chevron to processes failed reports
# workflows really need some more work done on them
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: rename project if setup has not been completed
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
run: python ${{ github.workspace }}/.github/rename.py ${{github.event.repository.name}}
- name: commit production files
if: ${{ !cancelled() && steps.yaml.outputs.needs_setup == 'true' && github.repository != 'sirlilpanda/kicad-project-template'}}
uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: 'setup project'
push: true
add: "."
setup_matrixs:
outputs:
projects: ${{ steps.projects.outputs.projects }}
runs-on: ubuntu-latest
name: matrix setup 🗓️
needs: setup_new_project
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setting up Python
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install pyyaml
- name: creating list start
run:
echo -n "projects=[" >> temp.txt
# this find commad outputs path1,path2,path3 with out the .kicad_pro ext
# .kicad_pro ext is removed because the erc and drc steps want either a
# .kicad_sch or .kicad_pcb file it also makes it easier to name files
# with the project name
# this output will look like
# projects=["path/projet_name", "path/projet_name2", ...]
- name: get kicad project names
run:
find . -type f -name "*.kicad_pro" -exec sh -c 'echo -n "\"${0%.kicad_pro}\","' {} \; | sed 's/.\{1\}$//' >> temp.txt
- name: creating list end
run:
echo "]" >> temp.txt
- name: list output
run:
cat temp.txt
- name: creating list end
id: projects
run:
cat temp.txt >> "$GITHUB_OUTPUT"
# basename is used here to remove the rest of the path from the find
#
DRC:
runs-on: ubuntu-latest
name: "📟 DRC report 📟"
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: check matrix
run: basename ${{ matrix.project_path }}
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Run KiCad DRC
id: drc
uses: sparkengineering/kicad-action@v4
with:
kicad_pcb: ${{ matrix.project_path }}.kicad_pcb
pcb_drc: true
report_format: json
pcb_drc_file: drc.json
- name: checking files were created
run:
ls -R
- name: creating DRC report in markdown
if: ${{ always() }}
run: python
${{ github.workspace }}/.github/report_processing/process_json_reports.py
${{ github.workspace }}/$(dirname ${{matrix.project_path}})/drc.json
${{ github.workspace }}/${{steps.yaml.outputs.drc_report_template_path}}
${{ github.workspace }}/${{ env.PROJECT_NAME }}_drc.md
${{ env.PROJECT_NAME }}
- name: upload report summary
if: ${{ always() }}
run: cat ${{ github.workspace }}/${{ env.PROJECT_NAME }}_drc.md >> $GITHUB_STEP_SUMMARY
- name: get summary url
if: ${{always()}}
id: exp
uses: pl-strflt/job-summary-url-action@v1
with:
job: "${{env.DRC_JOB_NAME}} (${{matrix.project_path}})"
- name: create files to upload
if: ${{always()}}
run: |
echo "{\"passing_drc\":\"${{steps.drc.conclusion != 'failure'}}\",\"project_name\":\"${{env.PROJECT_NAME}}\", \"drc_summary_link\":\"${{ steps.exp.outputs.job_summary_url }}\"}" >> ${{env.PROJECT_NAME}}_drc.json
- name: upload data for readme updating
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_drc.json
path: ${{env.PROJECT_NAME}}_drc.json
ERC:
runs-on: ubuntu-latest
name: "⚡ERC report⚡"
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: check matrix
run: basename ${{ matrix.project_path }}
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Run KiCad ERC
id: erc
uses: sparkengineering/kicad-action@v4
with:
kicad_sch: ${{ matrix.project_path }}.kicad_sch
sch_erc: true
report_format: json
sch_erc_file: erc.json
- name: checking files were created
run:
ls -R
- name: creating ERC report in markdown
if: ${{ always() }}
run: python
${{ github.workspace }}/.github/report_processing/process_json_reports.py
${{ github.workspace }}/$(dirname ${{matrix.project_path}})/erc.json
${{ github.workspace }}/${{steps.yaml.outputs.erc_report_template_path}}
${{ github.workspace }}/${{ env.PROJECT_NAME }}_erc.md
${{ env.PROJECT_NAME }}
- name: upload report summary
if: ${{ always() }}
run: cat ${{ github.workspace }}/${{ env.PROJECT_NAME }}_erc.md >> $GITHUB_STEP_SUMMARY
- name: get summary url
if: ${{always()}}
id: exp
uses: pl-strflt/job-summary-url-action@v1
with:
job: "${{env.ERC_JOB_NAME}} (${{matrix.project_path}})"
- name: print summary url
if: ${{always()}}
run: echo '${{ steps.exp.outputs.job_summary_url }}'
shell: bash
- name: create files to upload
if: ${{always()}}
run: |
echo "{\"passing_erc\":\"${{steps.erc.conclusion != 'failure'}}\",\"project_name\":\"${{env.PROJECT_NAME}}\", \"erc_summary_link\":\"${{ steps.exp.outputs.job_summary_url }}\"}" >> ${{env.PROJECT_NAME}}_erc.json
- name: upload data for readme updating
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_erc.json
path: ${{env.PROJECT_NAME}}_erc.json
production_job:
runs-on: ubuntu-latest
name: creating production files bom sch gerbers 📂
needs: setup_matrixs
strategy:
matrix:
project_path: ${{ fromJSON(needs.setup_matrixs.outputs.projects) }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run: | # | the / here is defined in the project settings
echo "schematic_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.schematic_output_name}}.pdf" >> $GITHUB_ENV
echo "bill_of_materials_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_csv_output_name}}.csv" >> $GITHUB_ENV
echo "production_format_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.production_file_output_name}}.zip" >> $GITHUB_ENV
echo "bom_report_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_report_output_name}}.md" >> $GITHUB_ENV
- name: checking envs
run:
echo "${{env.schematic_file}}"
echo "${{env.bill_of_materials_file}}"
echo "${{env.production_format_file}}"
echo "${{env.bom_report_file}}"
- name: setting env
run:
echo "PROJECT_NAME=$(basename ${{ matrix.project_path }})" >> $GITHUB_ENV
- name: setting env
run: | # | the / here is defined in the project settings
echo "schematic_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.schematic_output_name}}.pdf" >> $GITHUB_ENV
echo "bill_of_materials_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_csv_output_name}}.csv" >> $GITHUB_ENV
echo "production_format_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.production_file_output_name}}.zip" >> $GITHUB_ENV
echo "bom_report_file=${{env.PROJECT_NAME}}${{steps.yaml.outputs.bom_report_output_name}}.md" >> $GITHUB_ENV
- name: checking envs
run:
echo "${{env.schematic_file}}"
echo "${{env.bill_of_materials_file}}"
echo "${{env.production_format_file}}"
echo "${{env.bom_report_file}}"
- name: Setting up Python and chevron to processes reports
# workflows really need some more work done on them
if: ${{ !cancelled() }}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() }}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: Export production files
id: production
uses: sparkengineering/kicad-action@v4
if: '!cancelled()'
with:
kicad_sch: ${{ matrix.project_path }}.kicad_sch
sch_pdf: true # Generate PDF
sch_bom: true # Generate BOM
kicad_pcb: ${{ matrix.project_path }}.kicad_pcb
pcb_gerbers: true # Generate Gerbers
- name: Moving production files to correct location
if: ${{ !cancelled() && steps.production.conclusion == 'success' }}
run: |
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/sch.pdf ${{ github.workspace }}/${{env.schematic_file}}
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/bom.csv ${{ github.workspace }}/${{env.bill_of_materials_file}}
mv ${{ github.workspace }}/$(dirname ${{matrix.project_path}})/gbr.zip ${{ github.workspace }}/${{env.production_format_file}}
- name: creating BOM report in markdown
if: ${{ !cancelled() }}
run: python
${{ github.workspace }}/.github/report_processing/process_bom_files.py
${{ github.workspace }}/${{env.bill_of_materials_file}}
${{ github.workspace }}/${{steps.yaml.outputs.bom_template_path}}
${{ github.workspace }}/${{env.bom_report_file}}
- name: upload report'
uses: actions/upload-artifact@v4
with:
name: production-files-${{env.PROJECT_NAME}}.zip
path: |
${{ github.workspace }}/${{env.schematic_file}}
${{ github.workspace }}/${{env.bill_of_materials_file}}
${{ github.workspace }}/${{env.production_format_file}}
${{ github.workspace }}/${{env.bom_report_file}}
- name: data for readme updating
if: ${{always()}}
run: |
echo "{" >> ${{env.PROJECT_NAME}}_project.json
echo "\"schematic_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.schematic_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"bom_csv_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.bill_of_materials_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"bom_report_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.bom_report_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"gerber_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/${{env.production_format_file}}\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"project_link\":\"https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}/$(dirname ${{matrix.project_path}})\"," >> ${{env.PROJECT_NAME}}_project.json
echo "\"project_name\":\"${{env.PROJECT_NAME}}\"" >> ${{env.PROJECT_NAME}}_project.json
echo "}" >> ${{env.PROJECT_NAME}}_project.json
- name: upload report
if: ${{always()}}
uses: actions/upload-artifact@v4
with:
name: ${{env.PROJECT_NAME}}_project.json
path: ${{env.PROJECT_NAME}}_project.json
readme_job:
runs-on: ubuntu-latest
name: update readme
if: ${{ always() }}
needs: [DRC, ERC, production_job]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: download ercs files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_erc.json"
path: ${{ github.workspace }}
- name: download drcs files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_drc.json"
path: ${{ github.workspace }}
- name: download production json files
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/download-artifact@v4
with:
pattern: "*_project.json"
path: ${{ github.workspace }}
- name: Setting up Python
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: 'pip'
- name: installing requirements
if: ${{ !cancelled() && steps.yaml.outputs.dynamic_read_me == 'true' }}
run: pip install -r ${{ github.workspace }}/.github/report_processing/requirements.txt
- name: create extra info for readme hash
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
run: |
echo "{" >> readme_extras.json
echo "\"badge\" : \"[![.github/workflows/main.yaml](https://github.com/${{github.repository}}/actions/workflows/main.yaml/badge.svg?branch=${{github.ref_name}})](https://github.com/${{github.repository}}/actions/workflows/main.yaml)\"," >> readme_extras.json
echo "\"lastest_action_run_link\" : \"https://github.com/${{github.repository}}/actions/runs/${{ github.run_id }}\"," >> readme_extras.json
echo "\"title\" : \"${{steps.yaml.outputs.project_name}}\"" >> readme_extras.json
echo "}" >> readme_extras.json
- name: show extras
run:
cat readme_extras.json
- name: create new readme
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
run:
python
${{ github.workspace }}/.github/report_processing/process_output_files.py
${{ github.workspace }}/${{steps.yaml.outputs.readme_template_path}} *.json
- name: upload data for readme updating
if: ${{ steps.yaml.outputs.dynamic_read_me == 'true' }}
uses: actions/upload-artifact@v4
with:
name: README.md
path: README.md
- name: list everything
if: ${{always()}}
run: ls -R
upload_job:
runs-on: ubuntu-latest
name: commit production files
if: ${{ always() }}
needs: [readme_job]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: read-yaml-file
uses: juliojimenez/yamler@v1.1.0
id: yaml
with:
yaml-file: ${{ github.workspace }}/project_settings.yaml
- name: download production files
uses: actions/download-artifact@v4
with:
pattern: production-files-*
path: ${{ github.workspace }}
- name: download readme
uses: actions/download-artifact@v4
with:
name: README.md
path: ${{ github.workspace }}
- name: check downloads
run: ls -R
- name: Moving files to correct location
run: |
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.schematic_output_name}}.pdf ${{ github.workspace }}/${{steps.yaml.outputs.schematic_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.bom_csv_output_name}}.csv ${{ github.workspace }}/${{steps.yaml.outputs.bom_csv_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.bom_report_output_name}}.md ${{ github.workspace }}/${{steps.yaml.outputs.bom_report_output_path}}
mv ${{ github.workspace }}/production-files-*/*${{steps.yaml.outputs.production_file_output_name}}.zip ${{ github.workspace }}/${{steps.yaml.outputs.production_file_output_path}}
- name: commit production files
uses: EndBug/add-and-commit@v9
with:
default_author: github_actions
message: 'production files'
push: true
pull: '--rebase --autostash'
tag_push: '--force' # just makes life easier
tag: 'v1.0.0 --force'
add: |
${{ github.workspace }}/*${{steps.yaml.outputs.schematic_output_name}}.pdf
${{ github.workspace }}/*${{steps.yaml.outputs.bom_csv_output_name}}.csv
${{ github.workspace }}/*${{steps.yaml.outputs.bom_report_output_name}}.md
${{ github.workspace }}/*${{steps.yaml.outputs.production_file_output_name}}.zip
${{ github.workspace }}/README.md
- name: list everything
if: ${{always()}}
run: ls -R

2
.gitignore vendored
View File

@@ -29,3 +29,5 @@ Hardware/*/*.xml
Hardware/*/*.csv Hardware/*/*.csv
__pycache__/ __pycache__/
temp/

216
.hooks/kicad_cli_tools.py Normal file
View File

@@ -0,0 +1,216 @@
# yes we are using json because
# i dont want to install a yaml
# parser on the users computer
import json
import os
import subprocess
import csv
from enum import Enum
from pathlib import Path
from os import listdir
from os.path import isfile, join
KICAD_CLI_PATH = "kicad-cli"
TEMP_FILE_PATH = "docs/"
PCB_IMAGE_OUTPUT_PATH = "res/"
PCB_PDF_OUTPUT_PATH = "docs/"
PCB_PDF_FILE_SUFFIX = "_pcb"
SCHEMATIC_OUTPUT_PATH = "docs/"
SCHEMATIC_FILE_SUFFIX = "_schematic"
BOM_OUTPUT_PATH = "docs/"
BOM_REPORT_NAME = "_bom"
TEMP_DRC_REPORT_NAME = "_drc"
TEMP_ERC_REPORT_NAME = "_erc"
# quiet
KICAD_CLI_STDOUT=subprocess.DEVNULL
# verbose
# KICAD_CLI_STDOUT=subprocess.STDOUT
class OutputReportType(Enum):
JSON = 1
REPORT = 2
def get_file_extension(self) -> str:
if (self == OutputReportType.JSON):
return "json"
if (self == OutputReportType.REPORT):
return "rpt"
return "txt"
# this is a thin vale on the kicad cli tool
class KicadProject:
def __init__(self, path : Path) -> None:
self.project_path = path.parent
self.project_name = path.name.removesuffix(".kicad_pro")
self.created_files : list[Path] = []
print(f"{self.project_path=}")
print(f"{self.project_name=}")
def erc_check(
self,
report_format : OutputReportType = OutputReportType.JSON,
return_report : bool = False
) -> None | dict | str:
format_type = report_format.name.lower()
pcb_file_path = self.project_path / f"{self.project_name}.kicad_sch"
erc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_ERC_REPORT_NAME}.{report_format.get_file_extension()}"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch erc {pcb_file_path} --output {erc_report_path} --format {format_type}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"erc check failed return code {retcode}")
exit(1)
self.created_files.append(erc_report_path)
if (return_report):
with open(erc_report_path, "r") as txt:
if format_type == OutputReportType.JSON:
return json.loads(txt.read())
if format_type == OutputReportType.RPT:
return txt.read()
def drc_check(
self,
report_format : OutputReportType = OutputReportType.JSON,
return_report : bool = False
) -> None | dict | str:
format_type = report_format.name.lower()
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
drc_report_path = Path(TEMP_FILE_PATH) / f"{self.project_name}{TEMP_DRC_REPORT_NAME}.{report_format.get_file_extension()}"
print(f"{format_type=}, {drc_report_path=}")
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb drc {pcb_file_path} --output {drc_report_path} --format {format_type}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
print(f"{retcode=}")
if (retcode != 0):
print(f"drc check failed return code {retcode}")
exit(1)
self.created_files.append(drc_report_path)
if (return_report):
with open(drc_report_path, "r") as txt:
if format_type == OutputReportType.JSON:
return json.loads(txt.read())
if format_type == OutputReportType.RPT:
return txt.read()
def process_bom(
self,
return_csv : bool = False
) -> None | list[list[str]]:
sch_file_path = self.project_path / f"{self.project_name}.kicad_sch"
bom_output_path = Path(BOM_OUTPUT_PATH) / f"{self.project_name}{BOM_REPORT_NAME}.csv"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch export bom {sch_file_path} --output {bom_output_path}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"process_bom failed return code {retcode}")
exit(1)
self.created_files.append(bom_output_path)
if (return_csv):
with open(bom_output_path, "r") as csvfile:
bom_csv = csv.reader(csvfile, delimiter=',', quotechar='"')
return [row for row in bom_csv]
def get_image(self,
image_type : str = "png",
height : int = 900,
width : int = 1600,
side : str = "top",
background : str = "default",
preset : str = "follow_pcb_editor",
zoom : int = 2,
) -> None:
"""
image_typ = "png" | "jpg"
side = "top" | "bottom" | "left" | "right" | "front" | "back"
background = "default" | "transparent" | "opaque"
"""
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
render_output_path = Path(PCB_IMAGE_OUTPUT_PATH) / f"{self.project_name}_render.{image_type}"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb render {pcb_file_path} --output {render_output_path} --preset {preset} --zoom {zoom} ',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"get_image failed return code {retcode}")
exit(1)
self.created_files.append(render_output_path)
# i am not giving you the pdf to output if you want to do that yourself go ahead
def create_schmatic_pdf(self) -> None:
sch_file_path = self.project_path / f"{self.project_name}.kicad_sch"
sch_report_path = Path(SCHEMATIC_OUTPUT_PATH) / f"{self.project_name}{SCHEMATIC_FILE_SUFFIX}.pdf"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} sch export pdf {sch_file_path} --output {sch_report_path}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"create_schmatic_pdf failed return code {retcode}")
exit(1)
self.created_files.append(sch_report_path)
def create_pcb_pdf(self, layers : list[str] = ["F.Cu", "B.Cu"]) -> None:
pcb_file_path = self.project_path / f"{self.project_name}.kicad_pcb"
pcb_report_path = Path(PCB_PDF_OUTPUT_PATH) / f"{self.project_name}{PCB_PDF_FILE_SUFFIX}.pdf"
retcode = subprocess.call(
f'{KICAD_CLI_PATH} pcb export pdf {pcb_file_path} --output {pcb_report_path} --layers {",".join(layers)}',
shell=True,
stdout=KICAD_CLI_STDOUT
)
if (retcode != 0):
print(f"create_pcb_pdf failed return code {retcode}")
exit(1)
self.created_files.append(pcb_report_path)
def commit_files(files: list[Path], commit_message : str) -> None:
for file in files:
# add & commit, could use the return code however these should never fail
print(f"adding and commiting {file}")
ret_add = subprocess.call(f"git add {file}", shell=True)
ret_commit = subprocess.call(f"git commit -m \"{commit_message}\"", shell=True)
def main() -> None:
# find all kicad project files to operate on
for path in Path(".").rglob('*.kicad_pro'):
k = KicadProject(path)
k.drc_check(report_format= OutputReportType.REPORT)
k.erc_check(report_format= OutputReportType.REPORT)
k.process_bom()
k.create_schmatic_pdf()
k.get_image()
commit_files(k.created_files, "auto commited")
if __name__ == "__main__":
try:
main()
exit(0)
except Exception as e:
exit(1)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -10,17 +10,28 @@
"via_dimensions": [] "via_dimensions": []
}, },
"ipc2581": { "ipc2581": {
"bom_rev": "",
"dist": "", "dist": "",
"distpn": "", "distpn": "",
"internal_id": "", "internal_id": "",
"mfg": "", "mfg": "",
"mpn": "" "mpn": "",
"sch_revision": ""
}, },
"layer_pairs": [], "layer_pairs": [],
"layer_presets": [], "layer_presets": [],
"viewports": [] "viewports": []
}, },
"boards": [], "boards": [],
"component_class_settings": {
"assignments": [],
"meta": {
"version": 0
},
"sheet_component_classes": {
"enabled": false
}
},
"cvpcb": { "cvpcb": {
"equivalence_files": [] "equivalence_files": []
}, },
@@ -210,11 +221,14 @@
"duplicate_sheet_names": "error", "duplicate_sheet_names": "error",
"endpoint_off_grid": "warning", "endpoint_off_grid": "warning",
"extra_units": "error", "extra_units": "error",
"field_name_whitespace": "warning",
"footprint_filter": "ignore", "footprint_filter": "ignore",
"footprint_link_issues": "warning", "footprint_link_issues": "warning",
"four_way_junction": "ignore", "four_way_junction": "ignore",
"global_label_dangling": "warning", "global_label_dangling": "warning",
"ground_pin_not_ground": "warning",
"hier_label_mismatch": "error", "hier_label_mismatch": "error",
"isolated_pin_label": "warning",
"label_dangling": "error", "label_dangling": "error",
"label_multiple_wires": "warning", "label_multiple_wires": "warning",
"lib_symbol_issues": "warning", "lib_symbol_issues": "warning",
@@ -237,6 +251,7 @@
"similar_power": "warning", "similar_power": "warning",
"simulation_model_issue": "ignore", "simulation_model_issue": "ignore",
"single_global_label": "ignore", "single_global_label": "ignore",
"stacked_pin_name": "warning",
"unannotated": "error", "unannotated": "error",
"unconnected_wire_endpoint": "warning", "unconnected_wire_endpoint": "warning",
"undefined_netclass": "error", "undefined_netclass": "error",
@@ -269,13 +284,14 @@
"priority": 2147483647, "priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)", "schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2, "track_width": 0.2,
"tuning_profile": "",
"via_diameter": 0.6, "via_diameter": 0.6,
"via_drill": 0.3, "via_drill": 0.3,
"wire_width": 6 "wire_width": 6
} }
], ],
"meta": { "meta": {
"version": 4 "version": 5
}, },
"net_colors": null, "net_colors": null,
"netclass_assignments": null, "netclass_assignments": null,
@@ -297,6 +313,10 @@
}, },
"schematic": { "schematic": {
"annotate_start_num": 0, "annotate_start_num": 0,
"annotation": {
"method": 0,
"sort_order": 0
},
"bom_export_filename": "${PROJECTNAME}.csv", "bom_export_filename": "${PROJECTNAME}.csv",
"bom_fmt_presets": [], "bom_fmt_presets": [],
"bom_fmt_settings": { "bom_fmt_settings": {
@@ -368,6 +388,7 @@
"sort_asc": true, "sort_asc": true,
"sort_field": "Reference" "sort_field": "Reference"
}, },
"bus_aliases": {},
"connection_grid_size": 50.0, "connection_grid_size": 50.0,
"drawing": { "drawing": {
"dashed_lines_dash_length_ratio": 12.0, "dashed_lines_dash_length_ratio": 12.0,
@@ -375,6 +396,7 @@
"default_line_thickness": 6.0, "default_line_thickness": 6.0,
"default_text_size": 50.0, "default_text_size": 50.0,
"field_names": [], "field_names": [],
"hop_over_size_choice": 0,
"intersheets_ref_own_page": false, "intersheets_ref_own_page": false,
"intersheets_ref_prefix": "", "intersheets_ref_prefix": "",
"intersheets_ref_short": false, "intersheets_ref_short": false,
@@ -398,6 +420,7 @@
"net_format_name": "", "net_format_name": "",
"page_layout_descr_file": "", "page_layout_descr_file": "",
"plot_directory": "", "plot_directory": "",
"reuse_designators": true,
"space_save_all_events": true, "space_save_all_events": true,
"spice_current_sheet_as_root": false, "spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"", "spice_external_command": "spice \"%I\"",
@@ -406,12 +429,21 @@
"spice_save_all_dissipations": false, "spice_save_all_dissipations": false,
"spice_save_all_voltages": false, "spice_save_all_voltages": false,
"subpart_first_id": 65, "subpart_first_id": 65,
"subpart_id_separator": 0 "subpart_id_separator": 0,
"top_level_sheets": [
{
"filename": "keyboard_controller.kicad_sch",
"name": "keyboard_controller",
"uuid": "b230ff6d-d62b-4e9b-b4a9-a03792e35fdd"
}
],
"used_designators": "#PWR185",
"variants": []
}, },
"sheets": [ "sheets": [
[ [
"b230ff6d-d62b-4e9b-b4a9-a03792e35fdd", "b230ff6d-d62b-4e9b-b4a9-a03792e35fdd",
"Root" "keyboard_controller"
], ],
[ [
"3e008f42-c8a7-4e04-b8be-bf15bd9f122f", "3e008f42-c8a7-4e04-b8be-bf15bd9f122f",
@@ -438,5 +470,11 @@
"POWER" "POWER"
] ]
], ],
"text_variables": {} "text_variables": {},
"tuning_profiles": {
"meta": {
"version": 0
},
"tuning_profiles_impedance_geometric": []
}
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

123
README.md
View File

@@ -1,115 +1,18 @@
# kicad project template # How to use this template
[![.github/workflows/main.yaml](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml/badge.svg?branch=main)](https://github.com/sirlilpanda/kicad-project-template/actions/workflows/main.yaml)
a cool table showing the workflow of all the kicad projects. custom keyboard
| project_name | DRC | ERC |
| ------------ | --- | --- |
| template | [](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830/attempts/1#summary-40698563204)| [](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830/attempts/1#summary-40698563199) |
for a quick guide check [project setup](#project-setup) ![rendered pcb](res/keyboard_render.png)
This is a simple project template for new kicad projects. This template has some basic setup already completed such as workflows for auto creating all the things you forget when creating a kicad project such as: the code for creating all of this lives in `.hooks/`
- [gerbers](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_gerber.zip) ## setup
- [bom](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_bom_report.md) dependencies:
- [schematic pdf](https://github.com/sirlilpanda/kicad-project-template/tree/main/template_schematic.pdf) - python3.9+ (used for crossplatfrom scripting)
- kicad-cli
to set up the hooks just run
This workflow will also run the design rules check on the PCB and schematic to ensure that you upload a working PCB. These reports are uploaded as summaries within the github [actions tab](https://github.com/sirlilpanda/kicad-project-template/actions/runs/14507154830). This template has a simple schematic PCB in it (because DRC fails on an empty PCB). Shown below is the example PCB. ```
python setup.py
![example pcb with battery diode and resistor](res/image.png) ```
This script will add a line in the `.git/hooks/pre-push` to auto run `.hooks/kicad_cli_tools.py`
besides from that the project also has:
- common predefined trace widths
- smallest vias size [JLCPBC allows](https://jlcpcb.com/capabilities/Capabilities#Drilling)
- custom net colours in the schematic editor
- `red` for +V
- `blue` for -V
- `grey` for ground
to create a repo from this template follow this [guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
contained in this template are:
---
- `.github/` : all files relating to github actions and other admin see [here](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions) for more example of what can be placed in it
- `report_processing` : where the python scripts are stored for processing the json report data from kicad
- `report_templates` : where the template for said reports are stored
- `workflows/` : this is where the github actions are kept
- `main.yaml` : the main github action that will auto generate all files required and run DRC and ERC
- `rename.py` : the script for renaming the project
- `hardware/` : this is where the kicad projects live note this can be changed
- `docs/` : this is where the generate docs are placed by default
- `BOM/` : where the bill of materials and price breakdown are kept
- `bill_of_materials.csv`: the auto generated bom for the kicad project
- `bom_report.md` : a report for the bill of materials
- `template_schematic.pdf` : the schematic for the kicad project, auto generated by the github action
- `pcbs/` : this is where the auto generated gerbers for the kicad project are stored
- `res/` : where resources are stored for the README
- `.gitignore`: a slightly modified gitignore from the [standard one](https://github.com/github/gitignore/blob/main/KiCad.gitignore)
- `project_settings.yaml` : where the settings for this project is stored
- `README.md` : this file, suggest you change this one creating your project
## project settings
there are currently very few project settings that can be changed (will will be change in the future) these are:
| setting | description |
| --------------------------- | ----------------------------------------------------------------- |
| has_been_set_up | a flag to tell the setup action if the project has been set up |
| project_name | the name of the project, this will be set to the name of the repo |
| production_formats | the output production format for the PCBs |
| dynamic_read_me | allow the readme to be updated using the given template |
| bom_template_path | the template used to write the bom report files |
| erc_report_template_path | the template used to write the erc report files |
| drc_report_template_path | the template used to write the drc report files |
| readme_template_path | the template used to write projects readme |
| schematic_output_name | the name suffix of the generated schematics |
| bom_csv_output_name | the name suffix of the generated bom csv file |
| bom_report_output_name | the name suffix of the generated bom report |
| production_file_output_name | the name suffix of the generated production file |
| schematic_output_path | the output path of the generated schematics files |
| bom_csv_output_path | the output path of the generated bom csv file |
| bom_report_output_path | the output path of the generated bom report |
| production_file_output_path | the output path of the generated production file |
## project setup
### creating a new repo with the template
creating a new template from a repo is simple:
1. click on the button in the top right hand corner called `use this template`
![alt text](res/image-5.png)
2. when the drop down menu appears click on `create a new repository`
![alt text](res/image-6.png)
3. once you click you will be brought to this page, note that the repo name you choose here will be the name that you kicad project is called.
![alt text](res/image-7.png)
after these steps you then need to configure the repo settings to do their magic see [configuring repo settings](#configuring-repo-settings) for what to do next.
### configuring repo settings
once you have created a new repo with the template, you ill have to configure the github action settings. this is because you will get an error that looks something along these lines:
![alt text](res/image-4.png)
where the action can not commit the changes due to not having permissions follow these steps:
1. open the repo setting
![alt text](res/image-1.png)
2. then head in to actions : General
![alt text](res/image-2.png)
3. then scroll down to workflow permissions and ensure that both
`Read and write permissions` and `Allow GitHub Actions to create and approve pull requests` are ticked as seen below
![alt text](res/image-3.png)
this should fix the problem if not, go harass stack overflow they need it
Once all of these steps have been followed the workflow should be passing, however the `README.md` will only update on the next push request.
## editing the readme
As this repo can and will automatically update the repo corresponding to the given readme template. If you dont want to use this you can always disable this by setting the `dynamic_read_me` to `false`. but if you want some very cool features like auto updating tables to show what projects are passing the rules check or simple links to parts of your directory. then have a look at the template readme and learn [mustache](https://mustache.github.io/)
## improvements

154
docs/keyboard_bom.csv Normal file
View File

@@ -0,0 +1,154 @@
"Refs","Value","Footprint","Qty","DNP"
"C1","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C2","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C3","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"C4","100n","Capacitor_SMD:C_0603_1608Metric","1",""
"D1","NeoPixel_THT","key_switches:Untitled","1",""
"D2","NeoPixel_THT","key_switches:Untitled","1",""
"D3","NeoPixel_THT","key_switches:Untitled","1",""
"D4","NeoPixel_THT","key_switches:Untitled","1",""
"D5","NeoPixel_THT","key_switches:Untitled","1",""
"D6","NeoPixel_THT","key_switches:Untitled","1",""
"D7","NeoPixel_THT","key_switches:Untitled","1",""
"D8","NeoPixel_THT","key_switches:Untitled","1",""
"D9","NeoPixel_THT","key_switches:Untitled","1",""
"D10","NeoPixel_THT","key_switches:Untitled","1",""
"D11","NeoPixel_THT","key_switches:Untitled","1",""
"D12","NeoPixel_THT","key_switches:Untitled","1",""
"D13","NeoPixel_THT","key_switches:Untitled","1",""
"D14","NeoPixel_THT","key_switches:Untitled","1",""
"D15","NeoPixel_THT","key_switches:Untitled","1",""
"D16","NeoPixel_THT","key_switches:Untitled","1",""
"D17","NeoPixel_THT","key_switches:Untitled","1",""
"D18","NeoPixel_THT","key_switches:Untitled","1",""
"D19","NeoPixel_THT","key_switches:Untitled","1",""
"D20","NeoPixel_THT","key_switches:Untitled","1",""
"D21","NeoPixel_THT","key_switches:Untitled","1",""
"D22","NeoPixel_THT","key_switches:Untitled","1",""
"D23","NeoPixel_THT","key_switches:Untitled","1",""
"D24","NeoPixel_THT","key_switches:Untitled","1",""
"D25","NeoPixel_THT","key_switches:Untitled","1",""
"D26","NeoPixel_THT","key_switches:Untitled","1",""
"D27","NeoPixel_THT","key_switches:Untitled","1",""
"D28","NeoPixel_THT","key_switches:Untitled","1",""
"D29","NeoPixel_THT","key_switches:Untitled","1",""
"D30","NeoPixel_THT","key_switches:Untitled","1",""
"D31","NeoPixel_THT","key_switches:Untitled","1",""
"D32","NeoPixel_THT","key_switches:Untitled","1",""
"D33","NeoPixel_THT","key_switches:Untitled","1",""
"D34","NeoPixel_THT","key_switches:Untitled","1",""
"D35","NeoPixel_THT","key_switches:Untitled","1",""
"D36","NeoPixel_THT","key_switches:Untitled","1",""
"D37","NeoPixel_THT","key_switches:Untitled","1",""
"D38","NeoPixel_THT","key_switches:Untitled","1",""
"D39","NeoPixel_THT","key_switches:Untitled","1",""
"D40","NeoPixel_THT","key_switches:Untitled","1",""
"D41","NeoPixel_THT","key_switches:Untitled","1",""
"D42","NeoPixel_THT","key_switches:Untitled","1",""
"D43","NeoPixel_THT","key_switches:Untitled","1",""
"D44","NeoPixel_THT","key_switches:Untitled","1",""
"D45","NeoPixel_THT","key_switches:Untitled","1",""
"D46","NeoPixel_THT","key_switches:Untitled","1",""
"D47","NeoPixel_THT","key_switches:Untitled","1",""
"D48","NeoPixel_THT","key_switches:Untitled","1",""
"D49","NeoPixel_THT","key_switches:Untitled","1",""
"D50","NeoPixel_THT","key_switches:Untitled","1",""
"D51","NeoPixel_THT","key_switches:Untitled","1",""
"D52","NeoPixel_THT","key_switches:Untitled","1",""
"D53","NeoPixel_THT","key_switches:Untitled","1",""
"D54","NeoPixel_THT","key_switches:Untitled","1",""
"D55","NeoPixel_THT","key_switches:Untitled","1",""
"D56","NeoPixel_THT","key_switches:Untitled","1",""
"D57","NeoPixel_THT","key_switches:Untitled","1",""
"D58","NeoPixel_THT","key_switches:Untitled","1",""
"D59","NeoPixel_THT","key_switches:Untitled","1",""
"D60","NeoPixel_THT","key_switches:Untitled","1",""
"D61","NeoPixel_THT","key_switches:Untitled","1",""
"D62","NeoPixel_THT","key_switches:Untitled","1",""
"D63","NeoPixel_THT","key_switches:Untitled","1",""
"D64","NeoPixel_THT","key_switches:Untitled","1",""
"D65","NeoPixel_THT","key_switches:Untitled","1",""
"D66","NeoPixel_THT","key_switches:Untitled","1",""
"D67","NeoPixel_THT","key_switches:Untitled","1",""
"D68","NeoPixel_THT","key_switches:Untitled","1",""
"D69","NeoPixel_THT","key_switches:Untitled","1",""
"D70","NeoPixel_THT","key_switches:Untitled","1",""
"J1","AudioJack2","Connector_Audio:Jack_3.5mm_PJ320E_Horizontal","1",""
"J2","AudioJack2","Connector_Audio:Jack_3.5mm_PJ320E_Horizontal","1",""
"J3","Conn_01x10_Socket","Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical","1",""
"R1","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R2","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R3","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"R4","TBD","Resistor_SMD:R_0603_1608Metric","1",""
"SW1","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW2","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW3","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW4","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW5","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW6","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW7","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW8","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW9","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW10","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW11","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW12","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW13","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW14","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW15","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW16","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW17","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW18","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW19","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW20","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW21","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW22","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW23","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW24","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW25","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW26","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW27","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW28","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW29","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW30","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW31","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW32","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW33","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW34","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW35","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW36","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW37","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW38","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW39","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW40","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW41","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW42","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW43","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW44","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW45","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW46","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW47","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW48","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW49","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW50","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW51","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW52","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW53","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW54","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW55","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW56","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW57","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW58","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW59","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW60","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW61","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW62","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW63","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW64","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW65","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW66","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW67","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW68","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW69","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"SW70","CherryMX","CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket","1",""
"UC1","PCA9506BS","Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm","1",""
"UC2","PCA9506BS","Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm","1",""
1 Refs Value Footprint Qty DNP
2 C1 100n Capacitor_SMD:C_0603_1608Metric 1
3 C2 100n Capacitor_SMD:C_0603_1608Metric 1
4 C3 100n Capacitor_SMD:C_0603_1608Metric 1
5 C4 100n Capacitor_SMD:C_0603_1608Metric 1
6 D1 NeoPixel_THT key_switches:Untitled 1
7 D2 NeoPixel_THT key_switches:Untitled 1
8 D3 NeoPixel_THT key_switches:Untitled 1
9 D4 NeoPixel_THT key_switches:Untitled 1
10 D5 NeoPixel_THT key_switches:Untitled 1
11 D6 NeoPixel_THT key_switches:Untitled 1
12 D7 NeoPixel_THT key_switches:Untitled 1
13 D8 NeoPixel_THT key_switches:Untitled 1
14 D9 NeoPixel_THT key_switches:Untitled 1
15 D10 NeoPixel_THT key_switches:Untitled 1
16 D11 NeoPixel_THT key_switches:Untitled 1
17 D12 NeoPixel_THT key_switches:Untitled 1
18 D13 NeoPixel_THT key_switches:Untitled 1
19 D14 NeoPixel_THT key_switches:Untitled 1
20 D15 NeoPixel_THT key_switches:Untitled 1
21 D16 NeoPixel_THT key_switches:Untitled 1
22 D17 NeoPixel_THT key_switches:Untitled 1
23 D18 NeoPixel_THT key_switches:Untitled 1
24 D19 NeoPixel_THT key_switches:Untitled 1
25 D20 NeoPixel_THT key_switches:Untitled 1
26 D21 NeoPixel_THT key_switches:Untitled 1
27 D22 NeoPixel_THT key_switches:Untitled 1
28 D23 NeoPixel_THT key_switches:Untitled 1
29 D24 NeoPixel_THT key_switches:Untitled 1
30 D25 NeoPixel_THT key_switches:Untitled 1
31 D26 NeoPixel_THT key_switches:Untitled 1
32 D27 NeoPixel_THT key_switches:Untitled 1
33 D28 NeoPixel_THT key_switches:Untitled 1
34 D29 NeoPixel_THT key_switches:Untitled 1
35 D30 NeoPixel_THT key_switches:Untitled 1
36 D31 NeoPixel_THT key_switches:Untitled 1
37 D32 NeoPixel_THT key_switches:Untitled 1
38 D33 NeoPixel_THT key_switches:Untitled 1
39 D34 NeoPixel_THT key_switches:Untitled 1
40 D35 NeoPixel_THT key_switches:Untitled 1
41 D36 NeoPixel_THT key_switches:Untitled 1
42 D37 NeoPixel_THT key_switches:Untitled 1
43 D38 NeoPixel_THT key_switches:Untitled 1
44 D39 NeoPixel_THT key_switches:Untitled 1
45 D40 NeoPixel_THT key_switches:Untitled 1
46 D41 NeoPixel_THT key_switches:Untitled 1
47 D42 NeoPixel_THT key_switches:Untitled 1
48 D43 NeoPixel_THT key_switches:Untitled 1
49 D44 NeoPixel_THT key_switches:Untitled 1
50 D45 NeoPixel_THT key_switches:Untitled 1
51 D46 NeoPixel_THT key_switches:Untitled 1
52 D47 NeoPixel_THT key_switches:Untitled 1
53 D48 NeoPixel_THT key_switches:Untitled 1
54 D49 NeoPixel_THT key_switches:Untitled 1
55 D50 NeoPixel_THT key_switches:Untitled 1
56 D51 NeoPixel_THT key_switches:Untitled 1
57 D52 NeoPixel_THT key_switches:Untitled 1
58 D53 NeoPixel_THT key_switches:Untitled 1
59 D54 NeoPixel_THT key_switches:Untitled 1
60 D55 NeoPixel_THT key_switches:Untitled 1
61 D56 NeoPixel_THT key_switches:Untitled 1
62 D57 NeoPixel_THT key_switches:Untitled 1
63 D58 NeoPixel_THT key_switches:Untitled 1
64 D59 NeoPixel_THT key_switches:Untitled 1
65 D60 NeoPixel_THT key_switches:Untitled 1
66 D61 NeoPixel_THT key_switches:Untitled 1
67 D62 NeoPixel_THT key_switches:Untitled 1
68 D63 NeoPixel_THT key_switches:Untitled 1
69 D64 NeoPixel_THT key_switches:Untitled 1
70 D65 NeoPixel_THT key_switches:Untitled 1
71 D66 NeoPixel_THT key_switches:Untitled 1
72 D67 NeoPixel_THT key_switches:Untitled 1
73 D68 NeoPixel_THT key_switches:Untitled 1
74 D69 NeoPixel_THT key_switches:Untitled 1
75 D70 NeoPixel_THT key_switches:Untitled 1
76 J1 AudioJack2 Connector_Audio:Jack_3.5mm_PJ320E_Horizontal 1
77 J2 AudioJack2 Connector_Audio:Jack_3.5mm_PJ320E_Horizontal 1
78 J3 Conn_01x10_Socket Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical 1
79 R1 TBD Resistor_SMD:R_0603_1608Metric 1
80 R2 TBD Resistor_SMD:R_0603_1608Metric 1
81 R3 TBD Resistor_SMD:R_0603_1608Metric 1
82 R4 TBD Resistor_SMD:R_0603_1608Metric 1
83 SW1 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
84 SW2 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
85 SW3 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
86 SW4 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
87 SW5 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
88 SW6 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
89 SW7 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
90 SW8 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
91 SW9 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
92 SW10 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
93 SW11 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
94 SW12 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
95 SW13 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
96 SW14 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
97 SW15 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
98 SW16 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
99 SW17 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
100 SW18 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
101 SW19 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
102 SW20 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
103 SW21 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
104 SW22 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
105 SW23 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
106 SW24 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
107 SW25 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
108 SW26 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
109 SW27 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
110 SW28 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
111 SW29 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
112 SW30 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
113 SW31 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
114 SW32 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
115 SW33 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
116 SW34 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
117 SW35 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
118 SW36 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
119 SW37 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
120 SW38 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
121 SW39 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
122 SW40 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
123 SW41 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
124 SW42 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
125 SW43 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
126 SW44 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
127 SW45 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
128 SW46 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
129 SW47 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
130 SW48 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
131 SW49 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
132 SW50 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
133 SW51 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
134 SW52 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
135 SW53 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
136 SW54 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
137 SW55 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
138 SW56 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
139 SW57 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
140 SW58 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
141 SW59 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
142 SW60 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
143 SW61 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
144 SW62 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
145 SW63 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
146 SW64 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
147 SW65 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
148 SW66 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
149 SW67 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
150 SW68 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
151 SW69 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
152 SW70 CherryMX CherryMX_KailhSocket_LTST-A683CEGBW-Rotated:CherryMX_1.00u_KailhSocket 1
153 UC1 PCA9506BS Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm 1
154 UC2 PCA9506BS Package_DFN_QFN:QFN-56-1EP_8x8mm_P0.5mm_EP4.3x4.3mm 1

View File

@@ -0,0 +1,295 @@
"Refs","Value","Footprint","Qty","DNP"
"BT1","1S LIPO","","1",""
"BT2","Coin_Cell","","1",""
"C1","100n","","1",""
"C2","1u","","1",""
"C3","1u","","1",""
"C4","10u","","1",""
"C5","1u","","1",""
"C6","100n","","1",""
"C7","100n","","1",""
"C8","100n","","1",""
"C9","100n","","1",""
"C10","100n","","1",""
"C11","1u","","1",""
"C12","1u","","1",""
"C13","100n","","1",""
"C14","1u","","1",""
"C15","100n","","1",""
"C16","100n","","1",""
"C17","100n","","1",""
"C18","100n","","1",""
"C19","1u","","1",""
"C20","100n","","1",""
"C21","100n","","1",""
"C22","1u","","1",""
"C23","C","","1",""
"C24","C","","1",""
"C25","100n","","1",""
"C26","100n","","1",""
"C27","100n","","1",""
"C28","1u","","1",""
"C29","100n","","1",""
"C30","10u","","1",""
"C32","100n","","1",""
"C33","10u","","1",""
"C34","100n","","1",""
"C36","10u","","1",""
"C37","100n","","1",""
"C38","100n","","1",""
"C40","100n","","1",""
"C41","100n","","1",""
"C42","100n","","1",""
"C43","100n","","1",""
"C44","100n","","1",""
"C45","100n","","1",""
"C46","100n","","1",""
"C47","1u","","1",""
"C48","10u","","1",""
"C49","22u","","1",""
"C50","100n","","1",""
"C51","100n","","1",""
"C53","100n","","1",""
"C54","1u","","1",""
"C55","100n","","1",""
"C57","100n","","1",""
"C58","100n","","1",""
"C59","1u","","1",""
"C60","100n","","1",""
"C61","100n","","1",""
"C62","1u","","1",""
"C63","100n","","1",""
"C64","1u","","1",""
"C65","100n","","1",""
"C66","100n","","1",""
"C67","1u","","1",""
"C68","100n","","1",""
"C69","10u","","1",""
"C70","1u","","1",""
"C71","100n","","1",""
"C72","22u","","1",""
"C73","1u","","1",""
"C74","1u","","1",""
"C75","1u","","1",""
"C76","10u","","1",""
"C77","100n","","1",""
"C78","22u","","1",""
"C79","22u","","1",""
"C80","1u","","1",""
"C81","4.7u","","1",""
"C82","22u","","1",""
"C83","22u","","1",""
"C84","22u","","1",""
"C85","22u","","1",""
"C86","22u","","1",""
"C87","22u","","1",""
"C88","22u","","1",""
"C89","22u","","1",""
"C90","22u","","1",""
"C91","22u","","1",""
"C92","22u","","1",""
"C93","22u","","1",""
"C94","1u","","1",""
"C95","100n","","1",""
"C96","100n","","1",""
"C97","100n","","1",""
"C98","100n","","1",""
"C99","1u","","1",""
"D1","NUP2105L","Package_TO_SOT_SMD:SOT-23","1",""
"D2","TSM24A","Package_TO_SOT_SMD:SOT-23","1",""
"D3","LED","","1",""
"D4","LED","","1",""
"D5","LED","","1",""
"D6","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"D7","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"D8","SK6812","LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm","1",""
"D12","D","","1",""
"D13","LED","","1",""
"D14","LED","","1",""
"D15","D_Zener","","1",""
"D16","LED","","1",""
"D17","LED","","1",""
"D18","LED","","1",""
"D19","LED","","1",""
"D20","LED","","1",""
"D21","LED","","1",""
"D22","LED","","1",""
"D23","LED","","1",""
"D24","LED","","1",""
"D25","ESD9B5.0ST5G","Diode_SMD:D_SOD-923","1",""
"F1","4A","","1",""
"J1","USB_C_Receptacle_USB2.0_14P","","1",""
"J2","USB_A","","1",""
"J3","USB_A","","1",""
"J4","USB_A","","1",""
"J5","Conn_01x10_Socket","Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical","1",""
"J6","Conn_01x04_Pin","","1",""
"J7","Conn_01x04_Pin","","1",""
"J8","Conn_01x04_Pin","","1",""
"J9","Conn_01x04_Pin","","1",""
"JP3","PUEN","","1",""
"JP4","PUEN","","1",""
"JP5","PUEN","","1",""
"JP6","PUEN","","1",""
"JP7","PUEN","","1",""
"JP8","PUEN","","1",""
"JP9","PUEN","","1",""
"JP10","PUEN","","1",""
"JP11","PUEN","","1",""
"JP12","PUEN","","1",""
"L1","5.6uH","","1",""
"L3","2.2u","","1",""
"L4","2.2u","","1",""
"Q1","PMOS","","1",""
"Q2","LRC L8050QLT1G","","1",""
"Q3","LRC L8050QLT1G","","1",""
"Q4","NMOS","","1",""
"Q5","STL9P3LLH6","","1",""
"R1","0","","1",""
"R2","100k","","1",""
"R3","100k","","1",""
"R4","100k","","1",""
"R5","12k","","1",""
"R6","0R","","1",""
"R7","0R","","1",""
"R8","0R","","1",""
"R9","0R","","1",""
"R10","0R","","1",""
"R11","0R","","1",""
"R12","0R","","1",""
"R13","0R","","1",""
"R14","0R","","1","DNP"
"R15","0R","","1","DNP"
"R16","0R","","1",""
"R17","10k","","1",""
"R18","10k","","1",""
"R19","10k","","1",""
"R20","10k","","1",""
"R21","10k","","1",""
"R22","10k","","1",""
"R23","50k","","1",""
"R24","100k","","1",""
"R25","0","","1",""
"R26","100k","","1",""
"R27","100","","1",""
"R28","22k","","1",""
"R29","1k","","1",""
"R30","1k","","1",""
"R31","4.7K","","1",""
"R32","1k","","1",""
"R33","1k","","1",""
"R34","10k","","1",""
"R35","10k","","1",""
"R36","0","","1",""
"R37","0","","1",""
"R38","0","","1",""
"R39","10k","","1",""
"R40","10k","","1",""
"R41","10k","","1",""
"R42","4.7K","","1",""
"R43","4.7K","","1",""
"R44","10k","","1",""
"R45","100k","","1",""
"R46","100k","","1",""
"R47","0","","1",""
"R48","0","","1",""
"R49","0","","1",""
"R50","4.7k","","1",""
"R51","4.7K","","1",""
"R52","30","","1",""
"R53","49R9","","1",""
"R54","52k3","","1",""
"R55","10k","","1",""
"R57","0","","1",""
"R58","100K","","1",""
"R59","819k","","1",""
"R60","1k","","1",""
"R61","470","","1",""
"R62","91k","","1",""
"R63","4.7K","","1",""
"R64","4.7K","","1",""
"R65","8k","","1",""
"R66","4.7K","","1",""
"R67","10k","","1",""
"R68","1k1","","1",""
"R71","10k","","1",""
"R72","4.7K","","1",""
"R73","590","","1",""
"R74","4.7K","","1",""
"R75","4.7K","","1",""
"R76","8.9k","","1",""
"R77","1k","","1",""
"R78","1k","","1",""
"R79","4.7K","","1",""
"R80","4.7K","","1",""
"R81","4.7K","","1",""
"R82","4.7K","","1",""
"R83","4.7K","","1",""
"R84","100k","","1",""
"R85","1M","","1",""
"R86","4.7K","","1",""
"R87","4.7K","","1",""
"R88","4.7K","","1",""
"R89","1.5M","","1",""
"R90","1M","","1",""
"R91","147k","","1",""
"R92","4.7K","","1",""
"R93","100k","","1",""
"R94","5m","","1",""
"R95","1M","","1",""
"R96","1M","","1",""
"R97","1M","","1",""
"R98","1M","","1",""
"R99","1M","","1",""
"R100","100k","","1",""
"R103","819k","","1",""
"R104","91k","","1",""
"R105","3.1M","","1",""
"R106","10k","","1",""
"R107","10k","","1",""
"R108","10k","","1",""
"R109","1k","","1",""
"R110","1k","","1",""
"R111","1k","","1",""
"R112","1k","","1",""
"R113","100k","","1",""
"R114","18k","","1",""
"R115","1k","","1",""
"R116","1k","","1",""
"SW1","SW_Nidec_CAS-120A1","Button_Switch_SMD:Nidec_Copal_CAS-120A","1",""
"SW2","SW_Nidec_CAS-120A1","Button_Switch_SMD:Nidec_Copal_CAS-120A","1",""
"SW3","SW_Nidec_CAS-120A1","Button_Switch_SMD:Nidec_Copal_CAS-120A","1",""
"SW4","POWER_SW","","1",""
"SW5","SW_Nidec_CAS-120A1","Button_Switch_SMD:Nidec_Copal_CAS-120A","1",""
"SW10","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW11","OS102011MS2QN1","Button_Switch_THT:SW_Slide-03_Wuerth-WS-SLTV_10x2.5x6.4_P2.54mm","1",""
"SW12","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW13","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"SW14","SW_Push","Button_Switch_SMD:SW_SPST_PTS810","1",""
"TH1","10k","","1",""
"U1","STUSB4500QTR","Package_DFN_QFN:QFN-24-1EP_4x4mm_P0.5mm_EP2.7x2.7mm","1",""
"U2","USB2534","Package_DFN_QFN:QFN-36-1EP_6x6mm_P0.5mm_EP3.7x3.7mm","1",""
"U3","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U4","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U5","LM3235-H","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U7","CH340X","Package_SO:MSOP-10_3x3mm_P0.5mm","1",""
"U8","TS3USB30EDGSR","Package_SO:VSSOP-10_3x3mm_P0.5mm","1",""
"U9","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U10","SN74LV1T34DBV","Package_TO_SOT_SMD:SOT-23-5","1",""
"U11","TLV61070ADBV","Package_TO_SOT_SMD:SOT-23-6","1",""
"U12","TPS56339DDC","Package_TO_SOT_SMD:SOT-23-6","1",""
"U13","ESP32-S3-WROOM-2","RF_Module:ESP32-S3-WROOM-2","1",""
"U14","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U15","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U16","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U17","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U18","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U19","BQ24079RGT","Package_DFN_QFN:VQFN-16-1EP_3x3mm_P0.5mm_EP1.6x1.6mm","1",""
"U20","TXS0102DCT","Package_SO:SSOP-8_2.95x2.8mm_P0.65mm","1",""
"U21","TLV61070ADBV","Package_TO_SOT_SMD:SOT-23-6","1",""
"U22","AZ1117-3.3","","1",""
"U23","ADC128D818","Package_SO:TSSOP-16_4.4x5mm_P0.65mm","1",""
"U24","DS3231MZ","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","1",""
"U25","INA226","Package_SO:TSSOP-10_3x3mm_P0.5mm","1",""
"U26","TPD2EUSB30A","Package_TO_SOT_SMD:Texas_DRT-3","1",""
"Y1","Crystal","","1",""
1 Refs Value Footprint Qty DNP
2 BT1 1S LIPO 1
3 BT2 Coin_Cell 1
4 C1 100n 1
5 C2 1u 1
6 C3 1u 1
7 C4 10u 1
8 C5 1u 1
9 C6 100n 1
10 C7 100n 1
11 C8 100n 1
12 C9 100n 1
13 C10 100n 1
14 C11 1u 1
15 C12 1u 1
16 C13 100n 1
17 C14 1u 1
18 C15 100n 1
19 C16 100n 1
20 C17 100n 1
21 C18 100n 1
22 C19 1u 1
23 C20 100n 1
24 C21 100n 1
25 C22 1u 1
26 C23 C 1
27 C24 C 1
28 C25 100n 1
29 C26 100n 1
30 C27 100n 1
31 C28 1u 1
32 C29 100n 1
33 C30 10u 1
34 C32 100n 1
35 C33 10u 1
36 C34 100n 1
37 C36 10u 1
38 C37 100n 1
39 C38 100n 1
40 C40 100n 1
41 C41 100n 1
42 C42 100n 1
43 C43 100n 1
44 C44 100n 1
45 C45 100n 1
46 C46 100n 1
47 C47 1u 1
48 C48 10u 1
49 C49 22u 1
50 C50 100n 1
51 C51 100n 1
52 C53 100n 1
53 C54 1u 1
54 C55 100n 1
55 C57 100n 1
56 C58 100n 1
57 C59 1u 1
58 C60 100n 1
59 C61 100n 1
60 C62 1u 1
61 C63 100n 1
62 C64 1u 1
63 C65 100n 1
64 C66 100n 1
65 C67 1u 1
66 C68 100n 1
67 C69 10u 1
68 C70 1u 1
69 C71 100n 1
70 C72 22u 1
71 C73 1u 1
72 C74 1u 1
73 C75 1u 1
74 C76 10u 1
75 C77 100n 1
76 C78 22u 1
77 C79 22u 1
78 C80 1u 1
79 C81 4.7u 1
80 C82 22u 1
81 C83 22u 1
82 C84 22u 1
83 C85 22u 1
84 C86 22u 1
85 C87 22u 1
86 C88 22u 1
87 C89 22u 1
88 C90 22u 1
89 C91 22u 1
90 C92 22u 1
91 C93 22u 1
92 C94 1u 1
93 C95 100n 1
94 C96 100n 1
95 C97 100n 1
96 C98 100n 1
97 C99 1u 1
98 D1 NUP2105L Package_TO_SOT_SMD:SOT-23 1
99 D2 TSM24A Package_TO_SOT_SMD:SOT-23 1
100 D3 LED 1
101 D4 LED 1
102 D5 LED 1
103 D6 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
104 D7 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
105 D8 SK6812 LED_SMD:LED_SK6812_PLCC4_5.0x5.0mm_P3.2mm 1
106 D12 D 1
107 D13 LED 1
108 D14 LED 1
109 D15 D_Zener 1
110 D16 LED 1
111 D17 LED 1
112 D18 LED 1
113 D19 LED 1
114 D20 LED 1
115 D21 LED 1
116 D22 LED 1
117 D23 LED 1
118 D24 LED 1
119 D25 ESD9B5.0ST5G Diode_SMD:D_SOD-923 1
120 F1 4A 1
121 J1 USB_C_Receptacle_USB2.0_14P 1
122 J2 USB_A 1
123 J3 USB_A 1
124 J4 USB_A 1
125 J5 Conn_01x10_Socket Connector_Molex:Molex_CLIK-Mate_502382-1070_1x10-1MP_P1.25mm_Vertical 1
126 J6 Conn_01x04_Pin 1
127 J7 Conn_01x04_Pin 1
128 J8 Conn_01x04_Pin 1
129 J9 Conn_01x04_Pin 1
130 JP3 PUEN 1
131 JP4 PUEN 1
132 JP5 PUEN 1
133 JP6 PUEN 1
134 JP7 PUEN 1
135 JP8 PUEN 1
136 JP9 PUEN 1
137 JP10 PUEN 1
138 JP11 PUEN 1
139 JP12 PUEN 1
140 L1 5.6uH 1
141 L3 2.2u 1
142 L4 2.2u 1
143 Q1 PMOS 1
144 Q2 LRC L8050QLT1G 1
145 Q3 LRC L8050QLT1G 1
146 Q4 NMOS 1
147 Q5 STL9P3LLH6 1
148 R1 0 1
149 R2 100k 1
150 R3 100k 1
151 R4 100k 1
152 R5 12k 1
153 R6 0R 1
154 R7 0R 1
155 R8 0R 1
156 R9 0R 1
157 R10 0R 1
158 R11 0R 1
159 R12 0R 1
160 R13 0R 1
161 R14 0R 1 DNP
162 R15 0R 1 DNP
163 R16 0R 1
164 R17 10k 1
165 R18 10k 1
166 R19 10k 1
167 R20 10k 1
168 R21 10k 1
169 R22 10k 1
170 R23 50k 1
171 R24 100k 1
172 R25 0 1
173 R26 100k 1
174 R27 100 1
175 R28 22k 1
176 R29 1k 1
177 R30 1k 1
178 R31 4.7K 1
179 R32 1k 1
180 R33 1k 1
181 R34 10k 1
182 R35 10k 1
183 R36 0 1
184 R37 0 1
185 R38 0 1
186 R39 10k 1
187 R40 10k 1
188 R41 10k 1
189 R42 4.7K 1
190 R43 4.7K 1
191 R44 10k 1
192 R45 100k 1
193 R46 100k 1
194 R47 0 1
195 R48 0 1
196 R49 0 1
197 R50 4.7k 1
198 R51 4.7K 1
199 R52 30 1
200 R53 49R9 1
201 R54 52k3 1
202 R55 10k 1
203 R57 0 1
204 R58 100K 1
205 R59 819k 1
206 R60 1k 1
207 R61 470 1
208 R62 91k 1
209 R63 4.7K 1
210 R64 4.7K 1
211 R65 8k 1
212 R66 4.7K 1
213 R67 10k 1
214 R68 1k1 1
215 R71 10k 1
216 R72 4.7K 1
217 R73 590 1
218 R74 4.7K 1
219 R75 4.7K 1
220 R76 8.9k 1
221 R77 1k 1
222 R78 1k 1
223 R79 4.7K 1
224 R80 4.7K 1
225 R81 4.7K 1
226 R82 4.7K 1
227 R83 4.7K 1
228 R84 100k 1
229 R85 1M 1
230 R86 4.7K 1
231 R87 4.7K 1
232 R88 4.7K 1
233 R89 1.5M 1
234 R90 1M 1
235 R91 147k 1
236 R92 4.7K 1
237 R93 100k 1
238 R94 5m 1
239 R95 1M 1
240 R96 1M 1
241 R97 1M 1
242 R98 1M 1
243 R99 1M 1
244 R100 100k 1
245 R103 819k 1
246 R104 91k 1
247 R105 3.1M 1
248 R106 10k 1
249 R107 10k 1
250 R108 10k 1
251 R109 1k 1
252 R110 1k 1
253 R111 1k 1
254 R112 1k 1
255 R113 100k 1
256 R114 18k 1
257 R115 1k 1
258 R116 1k 1
259 SW1 SW_Nidec_CAS-120A1 Button_Switch_SMD:Nidec_Copal_CAS-120A 1
260 SW2 SW_Nidec_CAS-120A1 Button_Switch_SMD:Nidec_Copal_CAS-120A 1
261 SW3 SW_Nidec_CAS-120A1 Button_Switch_SMD:Nidec_Copal_CAS-120A 1
262 SW4 POWER_SW 1
263 SW5 SW_Nidec_CAS-120A1 Button_Switch_SMD:Nidec_Copal_CAS-120A 1
264 SW10 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
265 SW11 OS102011MS2QN1 Button_Switch_THT:SW_Slide-03_Wuerth-WS-SLTV_10x2.5x6.4_P2.54mm 1
266 SW12 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
267 SW13 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
268 SW14 SW_Push Button_Switch_SMD:SW_SPST_PTS810 1
269 TH1 10k 1
270 U1 STUSB4500QTR Package_DFN_QFN:QFN-24-1EP_4x4mm_P0.5mm_EP2.7x2.7mm 1
271 U2 USB2534 Package_DFN_QFN:QFN-36-1EP_6x6mm_P0.5mm_EP3.7x3.7mm 1
272 U3 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
273 U4 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
274 U5 LM3235-H Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
275 U7 CH340X Package_SO:MSOP-10_3x3mm_P0.5mm 1
276 U8 TS3USB30EDGSR Package_SO:VSSOP-10_3x3mm_P0.5mm 1
277 U9 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
278 U10 SN74LV1T34DBV Package_TO_SOT_SMD:SOT-23-5 1
279 U11 TLV61070ADBV Package_TO_SOT_SMD:SOT-23-6 1
280 U12 TPS56339DDC Package_TO_SOT_SMD:SOT-23-6 1
281 U13 ESP32-S3-WROOM-2 RF_Module:ESP32-S3-WROOM-2 1
282 U14 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
283 U15 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
284 U16 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
285 U17 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
286 U18 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
287 U19 BQ24079RGT Package_DFN_QFN:VQFN-16-1EP_3x3mm_P0.5mm_EP1.6x1.6mm 1
288 U20 TXS0102DCT Package_SO:SSOP-8_2.95x2.8mm_P0.65mm 1
289 U21 TLV61070ADBV Package_TO_SOT_SMD:SOT-23-6 1
290 U22 AZ1117-3.3 1
291 U23 ADC128D818 Package_SO:TSSOP-16_4.4x5mm_P0.65mm 1
292 U24 DS3231MZ Package_SO:SOIC-8_3.9x4.9mm_P1.27mm 1
293 U25 INA226 Package_SO:TSSOP-10_3x3mm_P0.5mm 1
294 U26 TPD2EUSB30A Package_TO_SOT_SMD:Texas_DRT-3 1
295 Y1 Crystal 1

View File

@@ -0,0 +1,21 @@
** Drc report for keyboard_controller.kicad_pcb **
** Created on 2026-06-16T22:32:01 **
** Report includes: Errors, Warnings **
** Found 1 DRC violations **
[invalid_outline]: Board has malformed outline (no edges found on Edge.Cuts layer)
Local override; error
@(0.0000 mm, 0.0000 mm): PCB
** Found 0 unconnected pads **
** Found 0 Footprint errors **
** Ignored checks **
- Footprint has no courtyard defined
- Track endpoint not centered on via
- Tuning profile track geometries
- Footprint doesn't match symbol's footprint filters
- Footprint component type doesn't match footprint pads
** End of Report **

File diff suppressed because it is too large Load Diff

Binary file not shown.

1524
docs/keyboard_drc.rpt Normal file

File diff suppressed because it is too large Load Diff

1793
docs/keyboard_erc.rpt Normal file

File diff suppressed because it is too large Load Diff

BIN
docs/keyboard_schematic.pdf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/keyboard_render.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

28
setup.py Normal file
View File

@@ -0,0 +1,28 @@
import sys
import os
import stat
from pathlib import Path
PYTHON_BIN = sys.executable
HOOK_SCRIPT_PATH = Path(".hooks/kicad_cli_tools.py")
HOOK_TYPE = "pre-push"
HOOK_PATH = Path(f".git/hooks/{HOOK_TYPE}")
# used if the hook path already exists we dont want to over write anything you have in there
# we would append however all of the default hooks have and `exit 0` which means it wont run
OLD_HOOK_PATH = Path(f".git/hooks/{HOOK_TYPE}-old")
if (os.path.exists(HOOK_PATH)):
os.rename(HOOK_PATH, OLD_HOOK_PATH)
with open(HOOK_PATH, "w") as txt:
txt.writelines([
"#!/bin/sh\n", #shebang
f"{PYTHON_BIN} {HOOK_SCRIPT_PATH}\n"
"exit 0\n" #make sure she closes
])
# make sure its executable
st = os.stat(HOOK_PATH)
os.chmod(HOOK_PATH, st.st_mode | stat.S_IEXEC)