Compare commits

..

5 Commits

Author SHA1 Message Date
Martin Linkwitz - NUC
f8547c9ff3 audio tryout 2026-05-17 15:11:32 +02:00
Martin Linkwitz - NUC
75672d4ec4 Add ESP32-C3 Opus loopback example 2026-04-08 16:32:11 +02:00
Martin Linkwitz - NUC
3551b073d7 Add embedded MP3 playback test sketch 2026-04-08 16:30:34 +02:00
Martin Linkwitz - NUC
1047fa70a0 added arbeitsplatte 2026-04-04 19:04:04 +02:00
Martin Linkwitz - NUC
c7adbcd1c7 Initial commit 2026-04-04 12:43:12 +02:00
119 changed files with 314387 additions and 33932 deletions

154
Belegung Schütze.txt Normal file
View File

@@ -0,0 +1,154 @@
# Belegung Schütze
# Ids
* SW_FLUR = 0XD238
* SW_ANBAU = 0x87A9
* SW_WOHNZIMMER = 0x87CA
* UP_WOHNZIMMER_TUER = 0x051F
* UP_WOHNZIMMER_TERASSE = 0x05df
* UP_FLUR_EINGANG = 0x0769
* UP_BUERO = 0x1177
* UP_FLUR_BUERO = 0x05A1
* UP_FLUR_KUECHE = 0x01EF
* UP_KINDERZIMMER = 0x0196
* UP_FLUR_ELTERN = 0x0632
* UP_ELTERN = 0x08AE
* UP_KUECHE_FLUR = 0x07F5
* UP_KUECHE_BAD = 0x0585
## Offene Ideen
1. Stromzähler anzapfen und Messen
2. Gartenbeleuchtung -> 2tes Schütz im Garten
3. Klingel einbinden -> ebenfalls oben klingeln können
4. Tür von oben öffnen können.
4. Audio-Streaming
5. Garage -> Auto da, Garagentür
6. Küchenlicht an Arbeitsplatte
7. Küchenlicht von Küchentisch?
8. Automatischer Öffner Türe oben
9. Temperatursensoren einbinden in jeden Raum
## Wohnzimmer
1. Garten
2. Flur1 am Büro
3. Büro
4. Nachtlicht Vögel
5. Wohnzimmer1
6. Wohnzimmer2
7. Rollo Runter Wohnzimmer
8. Rollo Hoch Wohnzimmer
## Flur
1. ---
2. Licht Schlafzimmer
3. Licht Linus
4. Rollo hoch Linus
5. Rollo runter Linus
6. Flur2 am Eingang
## Anbau
1. Kabüffchen
2. Unterlicht Küche
3. Licht Küche
4. Badezimmer
# Unterputz IDs
## Linus Zimmer
Id: 0x0196
Belegung:
|---+---| |-------|
| 3 | 4 |--| 8 |
|---+---| |-------|
| 4 | 1 |
|---+---|
| 7 |
|-------|
# Wohnzimmer Türe
Id: 0x051F
|-------|
| - |
+---+---|
| 3 | 2 |
|---+---|
| 1 |
|---+---|
| O O |
+-------+
## Küche Badezimmer
Id: 0x0585
Belegung:
|---+---| |-------|
| 1 |--| 3 |
|---+---| |-------|
| 2 |
|---+---|
| O O |
|-------|+
## Küche Flur
Id: 0x07F5
Belegung:
|---+---|
| 1 |
|---+---|
| 2 |
|---+---|
| |
|-------|
## Flur eingang
Id: 0x0769
Belegung:
|---+---|
| 1 |
|---+---|
| 2 |
|---+---|
| |
|-------|
## Büro
Id: 0x1177
Belegung:
|---+---|
| 1 |
|---+---|
## Flur-Büro
Id: 0x05A1
Belegung:
|---+---|
| 1 |
|---+---|
## Flur-Küche
Id: 0x01EF
Belegung:
|---+---|
| 1 |
|---+---|

View File

@@ -0,0 +1,2 @@
(kicad_pcb (version 20211014) (generator pcbnew)
)

View File

@@ -0,0 +1,130 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"shapes": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
"vias",
"footprint_text",
"footprint_anchors",
"ratsnest",
"grid",
"footprints_front",
"footprints_back",
"footprint_values",
"footprint_references",
"tracks",
"drc_errors",
"drawing_sheet",
"bitmaps",
"pads",
"zones",
"drc_warnings",
"locked_item_shadows",
"conflict_shadows",
"shapes"
],
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "MeyCan2025l.kicad_prl",
"version": 5
},
"net_inspector_panel": {
"col_hidden": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"col_order": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
],
"col_widths": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"custom_group_rules": [],
"expanded_rows": [],
"filter_by_net_name": true,
"filter_by_netclass": true,
"filter_text": "",
"group_by_constraint": false,
"group_by_netclass": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": 0
},
"open_jobsets": [],
"project": {
"files": []
},
"schematic": {
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

View File

@@ -0,0 +1,424 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.1,
"copper_line_width": 0.2,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"other_line_width": 0.15,
"silk_line_width": 0.15,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"rules": {
"min_copper_edge_clearance": 0.0,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0
},
"track_widths": [],
"via_dimensions": []
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"footprint_filter": "ignore",
"footprint_link_issues": "warning",
"four_way_junction": "ignore",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"label_multiple_wires": "warning",
"lib_symbol_issues": "warning",
"lib_symbol_mismatch": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"same_local_global_label": "warning",
"similar_label_and_power": "warning",
"similar_labels": "warning",
"similar_power": "warning",
"simulation_model_issue": "ignore",
"single_global_label": "ignore",
"unannotated": "error",
"unconnected_wire_endpoint": "warning",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "MeyCan2025l.kicad_pro",
"version": 3
},
"net_settings": {
"classes": [
{
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"priority": 2147483647,
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.25,
"via_diameter": 0.8,
"via_drill": 0.4
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_export_filename": "${PROJECTNAME}.csv",
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
},
{
"group_by": true,
"label": "Exclude from BOM",
"name": "${EXCLUDE_FROM_BOM}",
"show": true
},
{
"group_by": true,
"label": "Exclude from Board",
"name": "${EXCLUDE_FROM_BOARD}",
"show": true
},
{
"group_by": true,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"include_excluded_from_bom": true,
"name": "Default Editing",
"sort_asc": true,
"sort_field": "Referenz"
},
"connection_grid_size": 50.0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"space_save_all_events": true,
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [],
"text_variables": {}
}

View File

@@ -0,0 +1,5 @@
(kicad_sch (version 20211123) (generator eeschema)
(paper "A4")
(lib_symbols)
(symbol_instances)
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,209 +1,209 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Copper,L2,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,ComponentPad*%
%ADD10C,2.400000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD11R,2.400000X2.400000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD12R,1.600000X1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD13O,1.600000X1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD14C,1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD15R,1.000000X1.000000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD16O,1.000000X1.000000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD17C,0.250000*%
%TD*%
G04 APERTURE END LIST*
D10*
%TO.P,J1,4,Pin_4*%
%TO.N,Net-(J1-Pad4)*%
X116220000Y-100900000D03*
%TO.P,J1,3,Pin_3*%
%TO.N,Net-(J1-Pad3)*%
X112720000Y-100900000D03*
%TO.P,J1,2,Pin_2*%
%TO.N,+5V*%
X109220000Y-100900000D03*
D11*
%TO.P,J1,1,Pin_1*%
%TO.N,GNDREF*%
X105720000Y-100900000D03*
%TD*%
D12*
%TO.P,A1,1,D1/TX*%
%TO.N,unconnected-(A1-Pad1)*%
X87630000Y-83810000D03*
D13*
%TO.P,A1,2,D0/RX*%
%TO.N,unconnected-(A1-Pad2)*%
X90170000Y-83810000D03*
%TO.P,A1,3,~{RESET}*%
%TO.N,unconnected-(A1-Pad3)*%
X92710000Y-83810000D03*
%TO.P,A1,4,GND*%
%TO.N,GNDREF*%
X95250000Y-83810000D03*
%TO.P,A1,5,D2*%
%TO.N,unconnected-(A1-Pad5)*%
X97790000Y-83810000D03*
%TO.P,A1,6,D3*%
%TO.N,unconnected-(A1-Pad6)*%
X100330000Y-83810000D03*
%TO.P,A1,7,D4*%
%TO.N,unconnected-(A1-Pad7)*%
X102870000Y-83810000D03*
%TO.P,A1,8,D5*%
%TO.N,unconnected-(A1-Pad8)*%
X105410000Y-83810000D03*
%TO.P,A1,9,D6*%
%TO.N,unconnected-(A1-Pad9)*%
X107950000Y-83810000D03*
%TO.P,A1,10,D7*%
%TO.N,unconnected-(A1-Pad10)*%
X110490000Y-83810000D03*
%TO.P,A1,11,D8*%
%TO.N,unconnected-(A1-Pad11)*%
X113030000Y-83810000D03*
%TO.P,A1,12,D9*%
%TO.N,unconnected-(A1-Pad12)*%
X115570000Y-83810000D03*
%TO.P,A1,13,D10*%
%TO.N,Net-(A1-Pad13)*%
X118110000Y-83810000D03*
%TO.P,A1,14,D11*%
%TO.N,Net-(A1-Pad14)*%
X120650000Y-83810000D03*
%TO.P,A1,15,D12*%
%TO.N,Net-(A1-Pad15)*%
X123190000Y-83810000D03*
%TO.P,A1,16,D13*%
%TO.N,Net-(A1-Pad16)*%
X123190000Y-68570000D03*
%TO.P,A1,17,3V3*%
%TO.N,unconnected-(A1-Pad17)*%
X120650000Y-68570000D03*
%TO.P,A1,18,AREF*%
%TO.N,unconnected-(A1-Pad18)*%
X118110000Y-68570000D03*
%TO.P,A1,19,A0*%
%TO.N,unconnected-(A1-Pad19)*%
X115570000Y-68570000D03*
%TO.P,A1,20,A1*%
%TO.N,unconnected-(A1-Pad20)*%
X113030000Y-68570000D03*
%TO.P,A1,21,A2*%
%TO.N,unconnected-(A1-Pad21)*%
X110490000Y-68570000D03*
%TO.P,A1,22,A3*%
%TO.N,unconnected-(A1-Pad22)*%
X107950000Y-68570000D03*
%TO.P,A1,23,A4*%
%TO.N,unconnected-(A1-Pad23)*%
X105410000Y-68570000D03*
%TO.P,A1,24,A5*%
%TO.N,unconnected-(A1-Pad24)*%
X102870000Y-68570000D03*
%TO.P,A1,25,A6*%
%TO.N,unconnected-(A1-Pad25)*%
X100330000Y-68570000D03*
%TO.P,A1,26,A7*%
%TO.N,unconnected-(A1-Pad26)*%
X97790000Y-68570000D03*
%TO.P,A1,27,+5V*%
%TO.N,Net-(A1-Pad27)*%
X95250000Y-68570000D03*
%TO.P,A1,28,~{RESET}*%
%TO.N,unconnected-(A1-Pad28)*%
X92710000Y-68570000D03*
%TO.P,A1,29,GND*%
%TO.N,GNDREF*%
X90170000Y-68570000D03*
%TO.P,A1,30,VIN*%
%TO.N,unconnected-(A1-Pad30)*%
X87630000Y-68570000D03*
%TD*%
D12*
%TO.P,C1,1*%
%TO.N,GNDREF*%
X91440000Y-93980000D03*
D14*
%TO.P,C1,2*%
%TO.N,Net-(C1-Pad2)*%
X93940000Y-93980000D03*
%TD*%
D15*
%TO.P,JP1,1,A*%
%TO.N,Net-(J1-Pad4)*%
X96520000Y-99060000D03*
D16*
%TO.P,JP1,2,B*%
%TO.N,Net-(JP1-Pad2)*%
X96520000Y-97790000D03*
%TD*%
D12*
%TO.P,C2,1*%
%TO.N,GNDREF*%
X94020000Y-88900000D03*
D14*
%TO.P,C2,2*%
%TO.N,Net-(C2-Pad2)*%
X96520000Y-88900000D03*
%TD*%
D17*
%TO.N,Net-(A1-Pad27)*%
X117555311Y-91440000D02*
X120650000Y-94534689D01*
X120650000Y-94534689D02*
X120650000Y-99060000D01*
X106680000Y-88900000D02*
X109220000Y-91440000D01*
X109220000Y-91440000D02*
X117555311Y-91440000D01*
X106690000Y-88890000D02*
X106680000Y-88900000D01*
X106690000Y-87645000D02*
X106690000Y-88890000D01*
X105425000Y-87645000D02*
X106690000Y-87645000D01*
X104140000Y-86360000D02*
X105425000Y-87645000D01*
X99060000Y-86360000D02*
X104140000Y-86360000D01*
X97780000Y-87640000D02*
X99060000Y-86360000D01*
X97780000Y-93985000D02*
X97780000Y-87640000D01*
X106690000Y-80010000D02*
X106690000Y-87645000D01*
X95250000Y-68570000D02*
X106690000Y-80010000D01*
X99060000Y-63500000D02*
X101600000Y-63500000D01*
X95250000Y-67310000D02*
X99060000Y-63500000D01*
X95250000Y-68570000D02*
X95250000Y-67310000D01*
%TD*%
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Copper,L2,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,ComponentPad*%
%ADD10C,2.400000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD11R,2.400000X2.400000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD12R,1.600000X1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD13O,1.600000X1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD14C,1.600000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD15R,1.000000X1.000000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD16O,1.000000X1.000000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD17C,0.250000*%
%TD*%
G04 APERTURE END LIST*
D10*
%TO.P,J1,4,Pin_4*%
%TO.N,Net-(J1-Pad4)*%
X116220000Y-100900000D03*
%TO.P,J1,3,Pin_3*%
%TO.N,Net-(J1-Pad3)*%
X112720000Y-100900000D03*
%TO.P,J1,2,Pin_2*%
%TO.N,+5V*%
X109220000Y-100900000D03*
D11*
%TO.P,J1,1,Pin_1*%
%TO.N,GNDREF*%
X105720000Y-100900000D03*
%TD*%
D12*
%TO.P,A1,1,D1/TX*%
%TO.N,unconnected-(A1-Pad1)*%
X87630000Y-83810000D03*
D13*
%TO.P,A1,2,D0/RX*%
%TO.N,unconnected-(A1-Pad2)*%
X90170000Y-83810000D03*
%TO.P,A1,3,~{RESET}*%
%TO.N,unconnected-(A1-Pad3)*%
X92710000Y-83810000D03*
%TO.P,A1,4,GND*%
%TO.N,GNDREF*%
X95250000Y-83810000D03*
%TO.P,A1,5,D2*%
%TO.N,unconnected-(A1-Pad5)*%
X97790000Y-83810000D03*
%TO.P,A1,6,D3*%
%TO.N,unconnected-(A1-Pad6)*%
X100330000Y-83810000D03*
%TO.P,A1,7,D4*%
%TO.N,unconnected-(A1-Pad7)*%
X102870000Y-83810000D03*
%TO.P,A1,8,D5*%
%TO.N,unconnected-(A1-Pad8)*%
X105410000Y-83810000D03*
%TO.P,A1,9,D6*%
%TO.N,unconnected-(A1-Pad9)*%
X107950000Y-83810000D03*
%TO.P,A1,10,D7*%
%TO.N,unconnected-(A1-Pad10)*%
X110490000Y-83810000D03*
%TO.P,A1,11,D8*%
%TO.N,unconnected-(A1-Pad11)*%
X113030000Y-83810000D03*
%TO.P,A1,12,D9*%
%TO.N,unconnected-(A1-Pad12)*%
X115570000Y-83810000D03*
%TO.P,A1,13,D10*%
%TO.N,Net-(A1-Pad13)*%
X118110000Y-83810000D03*
%TO.P,A1,14,D11*%
%TO.N,Net-(A1-Pad14)*%
X120650000Y-83810000D03*
%TO.P,A1,15,D12*%
%TO.N,Net-(A1-Pad15)*%
X123190000Y-83810000D03*
%TO.P,A1,16,D13*%
%TO.N,Net-(A1-Pad16)*%
X123190000Y-68570000D03*
%TO.P,A1,17,3V3*%
%TO.N,unconnected-(A1-Pad17)*%
X120650000Y-68570000D03*
%TO.P,A1,18,AREF*%
%TO.N,unconnected-(A1-Pad18)*%
X118110000Y-68570000D03*
%TO.P,A1,19,A0*%
%TO.N,unconnected-(A1-Pad19)*%
X115570000Y-68570000D03*
%TO.P,A1,20,A1*%
%TO.N,unconnected-(A1-Pad20)*%
X113030000Y-68570000D03*
%TO.P,A1,21,A2*%
%TO.N,unconnected-(A1-Pad21)*%
X110490000Y-68570000D03*
%TO.P,A1,22,A3*%
%TO.N,unconnected-(A1-Pad22)*%
X107950000Y-68570000D03*
%TO.P,A1,23,A4*%
%TO.N,unconnected-(A1-Pad23)*%
X105410000Y-68570000D03*
%TO.P,A1,24,A5*%
%TO.N,unconnected-(A1-Pad24)*%
X102870000Y-68570000D03*
%TO.P,A1,25,A6*%
%TO.N,unconnected-(A1-Pad25)*%
X100330000Y-68570000D03*
%TO.P,A1,26,A7*%
%TO.N,unconnected-(A1-Pad26)*%
X97790000Y-68570000D03*
%TO.P,A1,27,+5V*%
%TO.N,Net-(A1-Pad27)*%
X95250000Y-68570000D03*
%TO.P,A1,28,~{RESET}*%
%TO.N,unconnected-(A1-Pad28)*%
X92710000Y-68570000D03*
%TO.P,A1,29,GND*%
%TO.N,GNDREF*%
X90170000Y-68570000D03*
%TO.P,A1,30,VIN*%
%TO.N,unconnected-(A1-Pad30)*%
X87630000Y-68570000D03*
%TD*%
D12*
%TO.P,C1,1*%
%TO.N,GNDREF*%
X91440000Y-93980000D03*
D14*
%TO.P,C1,2*%
%TO.N,Net-(C1-Pad2)*%
X93940000Y-93980000D03*
%TD*%
D15*
%TO.P,JP1,1,A*%
%TO.N,Net-(J1-Pad4)*%
X96520000Y-99060000D03*
D16*
%TO.P,JP1,2,B*%
%TO.N,Net-(JP1-Pad2)*%
X96520000Y-97790000D03*
%TD*%
D12*
%TO.P,C2,1*%
%TO.N,GNDREF*%
X94020000Y-88900000D03*
D14*
%TO.P,C2,2*%
%TO.N,Net-(C2-Pad2)*%
X96520000Y-88900000D03*
%TD*%
D17*
%TO.N,Net-(A1-Pad27)*%
X117555311Y-91440000D02*
X120650000Y-94534689D01*
X120650000Y-94534689D02*
X120650000Y-99060000D01*
X106680000Y-88900000D02*
X109220000Y-91440000D01*
X109220000Y-91440000D02*
X117555311Y-91440000D01*
X106690000Y-88890000D02*
X106680000Y-88900000D01*
X106690000Y-87645000D02*
X106690000Y-88890000D01*
X105425000Y-87645000D02*
X106690000Y-87645000D01*
X104140000Y-86360000D02*
X105425000Y-87645000D01*
X99060000Y-86360000D02*
X104140000Y-86360000D01*
X97780000Y-87640000D02*
X99060000Y-86360000D01*
X97780000Y-93985000D02*
X97780000Y-87640000D01*
X106690000Y-80010000D02*
X106690000Y-87645000D01*
X95250000Y-68570000D02*
X106690000Y-80010000D01*
X99060000Y-63500000D02*
X101600000Y-63500000D01*
X95250000Y-67310000D02*
X99060000Y-63500000D01*
X95250000Y-68570000D02*
X95250000Y-67310000D01*
%TD*%
M02*

View File

@@ -1,87 +1,87 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Bot*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,2.100000*%
%ADD11C,2.400000*%
%ADD12R,2.400000X2.400000*%
%ADD13R,1.600000X1.600000*%
%ADD14O,1.600000X1.600000*%
%ADD15C,1.600000*%
%ADD16R,1.000000X1.000000*%
%ADD17O,1.000000X1.000000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X109220000Y-58420000D03*
%TD*%
D11*
%TO.C,J1*%
X116220000Y-100900000D03*
X112720000Y-100900000D03*
X109220000Y-100900000D03*
D12*
X105720000Y-100900000D03*
%TD*%
D13*
%TO.C,A1*%
X87630000Y-83810000D03*
D14*
X90170000Y-83810000D03*
X92710000Y-83810000D03*
X95250000Y-83810000D03*
X97790000Y-83810000D03*
X100330000Y-83810000D03*
X102870000Y-83810000D03*
X105410000Y-83810000D03*
X107950000Y-83810000D03*
X110490000Y-83810000D03*
X113030000Y-83810000D03*
X115570000Y-83810000D03*
X118110000Y-83810000D03*
X120650000Y-83810000D03*
X123190000Y-83810000D03*
X123190000Y-68570000D03*
X120650000Y-68570000D03*
X118110000Y-68570000D03*
X115570000Y-68570000D03*
X113030000Y-68570000D03*
X110490000Y-68570000D03*
X107950000Y-68570000D03*
X105410000Y-68570000D03*
X102870000Y-68570000D03*
X100330000Y-68570000D03*
X97790000Y-68570000D03*
X95250000Y-68570000D03*
X92710000Y-68570000D03*
X90170000Y-68570000D03*
X87630000Y-68570000D03*
%TD*%
D13*
%TO.C,C1*%
X91440000Y-93980000D03*
D15*
X93940000Y-93980000D03*
%TD*%
D16*
%TO.C,JP1*%
X96520000Y-99060000D03*
D17*
X96520000Y-97790000D03*
%TD*%
D13*
%TO.C,C2*%
X94020000Y-88900000D03*
D15*
X96520000Y-88900000D03*
%TD*%
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Bot*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,2.100000*%
%ADD11C,2.400000*%
%ADD12R,2.400000X2.400000*%
%ADD13R,1.600000X1.600000*%
%ADD14O,1.600000X1.600000*%
%ADD15C,1.600000*%
%ADD16R,1.000000X1.000000*%
%ADD17O,1.000000X1.000000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X109220000Y-58420000D03*
%TD*%
D11*
%TO.C,J1*%
X116220000Y-100900000D03*
X112720000Y-100900000D03*
X109220000Y-100900000D03*
D12*
X105720000Y-100900000D03*
%TD*%
D13*
%TO.C,A1*%
X87630000Y-83810000D03*
D14*
X90170000Y-83810000D03*
X92710000Y-83810000D03*
X95250000Y-83810000D03*
X97790000Y-83810000D03*
X100330000Y-83810000D03*
X102870000Y-83810000D03*
X105410000Y-83810000D03*
X107950000Y-83810000D03*
X110490000Y-83810000D03*
X113030000Y-83810000D03*
X115570000Y-83810000D03*
X118110000Y-83810000D03*
X120650000Y-83810000D03*
X123190000Y-83810000D03*
X123190000Y-68570000D03*
X120650000Y-68570000D03*
X118110000Y-68570000D03*
X115570000Y-68570000D03*
X113030000Y-68570000D03*
X110490000Y-68570000D03*
X107950000Y-68570000D03*
X105410000Y-68570000D03*
X102870000Y-68570000D03*
X100330000Y-68570000D03*
X97790000Y-68570000D03*
X95250000Y-68570000D03*
X92710000Y-68570000D03*
X90170000Y-68570000D03*
X87630000Y-68570000D03*
%TD*%
D13*
%TO.C,C1*%
X91440000Y-93980000D03*
D15*
X93940000Y-93980000D03*
%TD*%
D16*
%TO.C,JP1*%
X96520000Y-99060000D03*
D17*
X96520000Y-97790000D03*
%TD*%
D13*
%TO.C,C2*%
X94020000Y-88900000D03*
D15*
X96520000Y-88900000D03*
%TD*%
M02*

View File

@@ -1,15 +1,15 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -1,71 +1,71 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Legend,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.150000*%
G04 APERTURE END LIST*
D10*
X124086666Y-63285714D02*
X123705714Y-63285714D01*
X123943809Y-62952380D02*
X123943809Y-63809523D01*
X123896190Y-63904761D01*
X123800952Y-63952380D01*
X123705714Y-63952380D01*
X122991428Y-63904761D02*
X123086666Y-63952380D01*
X123277142Y-63952380D01*
X123372380Y-63904761D01*
X123420000Y-63809523D01*
X123420000Y-63428571D01*
X123372380Y-63333333D01*
X123277142Y-63285714D01*
X123086666Y-63285714D01*
X122991428Y-63333333D01*
X122943809Y-63428571D01*
X122943809Y-63523809D01*
X123420000Y-63619047D01*
X122562857Y-63904761D02*
X122467619Y-63952380D01*
X122277142Y-63952380D01*
X122181904Y-63904761D01*
X122134285Y-63809523D01*
X122134285Y-63761904D01*
X122181904Y-63666666D01*
X122277142Y-63619047D01*
X122420000Y-63619047D01*
X122515238Y-63571428D01*
X122562857Y-63476190D01*
X122562857Y-63428571D01*
X122515238Y-63333333D01*
X122420000Y-63285714D01*
X122277142Y-63285714D01*
X122181904Y-63333333D01*
X121848571Y-63285714D02*
X121467619Y-63285714D01*
X121705714Y-62952380D02*
X121705714Y-63809523D01*
X121658095Y-63904761D01*
X121562857Y-63952380D01*
X121467619Y-63952380D01*
X120420000Y-63047619D02*
X120372380Y-63000000D01*
X120277142Y-62952380D01*
X120039047Y-62952380D01*
X119943809Y-63000000D01*
X119896190Y-63047619D01*
X119848571Y-63142857D01*
X119848571Y-63238095D01*
X119896190Y-63380952D01*
X120467619Y-63952380D01*
X119848571Y-63952380D01*
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Legend,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.150000*%
G04 APERTURE END LIST*
D10*
X124086666Y-63285714D02*
X123705714Y-63285714D01*
X123943809Y-62952380D02*
X123943809Y-63809523D01*
X123896190Y-63904761D01*
X123800952Y-63952380D01*
X123705714Y-63952380D01*
X122991428Y-63904761D02*
X123086666Y-63952380D01*
X123277142Y-63952380D01*
X123372380Y-63904761D01*
X123420000Y-63809523D01*
X123420000Y-63428571D01*
X123372380Y-63333333D01*
X123277142Y-63285714D01*
X123086666Y-63285714D01*
X122991428Y-63333333D01*
X122943809Y-63428571D01*
X122943809Y-63523809D01*
X123420000Y-63619047D01*
X122562857Y-63904761D02*
X122467619Y-63952380D01*
X122277142Y-63952380D01*
X122181904Y-63904761D01*
X122134285Y-63809523D01*
X122134285Y-63761904D01*
X122181904Y-63666666D01*
X122277142Y-63619047D01*
X122420000Y-63619047D01*
X122515238Y-63571428D01*
X122562857Y-63476190D01*
X122562857Y-63428571D01*
X122515238Y-63333333D01*
X122420000Y-63285714D01*
X122277142Y-63285714D01*
X122181904Y-63333333D01*
X121848571Y-63285714D02*
X121467619Y-63285714D01*
X121705714Y-62952380D02*
X121705714Y-63809523D01*
X121658095Y-63904761D01*
X121562857Y-63952380D01*
X121467619Y-63952380D01*
X120420000Y-63047619D02*
X120372380Y-63000000D01*
X120277142Y-62952380D01*
X120039047Y-62952380D01*
X119943809Y-63000000D01*
X119896190Y-63047619D01*
X119848571Y-63142857D01*
X119848571Y-63238095D01*
X119896190Y-63380952D01*
X120467619Y-63952380D01*
X119848571Y-63952380D01*
M02*

View File

@@ -1,37 +1,37 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Profile,NP*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,Profile*%
%ADD10C,0.100000*%
%TD*%
G04 APERTURE END LIST*
D10*
X119380000Y-60960000D02*
X124460000Y-60960000D01*
X119380000Y-58420000D02*
X119380000Y-60960000D01*
X134620001Y-81280000D02*
G75*
G03*
X134620001Y-81280000I-1J0D01*
G01*
X124460001Y-104140000D02*
G75*
G03*
X124460001Y-104140000I-1J0D01*
G01*
X132619430Y-81280000D02*
G75*
G03*
X132619430Y-81280000I-25000000J0D01*
G01*
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Profile,NP*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,Profile*%
%ADD10C,0.100000*%
%TD*%
G04 APERTURE END LIST*
D10*
X119380000Y-60960000D02*
X124460000Y-60960000D01*
X119380000Y-58420000D02*
X119380000Y-60960000D01*
X134620001Y-81280000D02*
G75*
G03*
X134620001Y-81280000I-1J0D01*
G01*
X124460001Y-104140000D02*
G75*
G03*
X124460001Y-104140000I-1J0D01*
G01*
X132619430Y-81280000D02*
G75*
G03*
X132619430Y-81280000I-25000000J0D01*
G01*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,154 +1,154 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Top*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,2.100000*%
%ADD11R,2.275000X2.200000*%
%ADD12RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD13R,0.950000X2.800000*%
%ADD14RoundRect,0.100000X-0.100000X-0.200000X0.100000X-0.200000X0.100000X0.200000X-0.100000X0.200000X0*%
%ADD15RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*%
%ADD16RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD17C,2.400000*%
%ADD18R,2.400000X2.400000*%
%ADD19R,1.600000X1.600000*%
%ADD20O,1.600000X1.600000*%
%ADD21C,1.600000*%
%ADD22R,1.000000X1.000000*%
%ADD23O,1.000000X1.000000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X109220000Y-58420000D03*
%TD*%
D11*
%TO.C,Y1*%
X114300000Y-88900000D03*
X109125000Y-88900000D03*
%TD*%
D12*
%TO.C,U3*%
X122857500Y-100010000D03*
X122857500Y-98110000D03*
X120982500Y-99060000D03*
%TD*%
D13*
%TO.C,U2*%
X124220000Y-88040000D03*
X122680000Y-88040000D03*
X121160000Y-88040000D03*
X119620000Y-88040000D03*
X119620000Y-94840000D03*
X121160000Y-94840000D03*
X122680000Y-94840000D03*
X124220000Y-94840000D03*
%TD*%
D14*
%TO.C,U1*%
X110785000Y-95380000D03*
X111435000Y-95380000D03*
X112085000Y-95380000D03*
X112735000Y-95380000D03*
X112735000Y-92580000D03*
X112085000Y-92580000D03*
X111435000Y-92580000D03*
X110785000Y-92580000D03*
%TD*%
D15*
%TO.C,R2*%
X99060000Y-102110000D03*
X99060000Y-101090000D03*
%TD*%
D16*
%TO.C,R1*%
X101090000Y-63500000D03*
X102110000Y-63500000D03*
%TD*%
D17*
%TO.C,J1*%
X116220000Y-100900000D03*
X112720000Y-100900000D03*
X109220000Y-100900000D03*
D18*
X105720000Y-100900000D03*
%TD*%
D19*
%TO.C,A1*%
X87630000Y-83810000D03*
D20*
X90170000Y-83810000D03*
X92710000Y-83810000D03*
X95250000Y-83810000D03*
X97790000Y-83810000D03*
X100330000Y-83810000D03*
X102870000Y-83810000D03*
X105410000Y-83810000D03*
X107950000Y-83810000D03*
X110490000Y-83810000D03*
X113030000Y-83810000D03*
X115570000Y-83810000D03*
X118110000Y-83810000D03*
X120650000Y-83810000D03*
X123190000Y-83810000D03*
X123190000Y-68570000D03*
X120650000Y-68570000D03*
X118110000Y-68570000D03*
X115570000Y-68570000D03*
X113030000Y-68570000D03*
X110490000Y-68570000D03*
X107950000Y-68570000D03*
X105410000Y-68570000D03*
X102870000Y-68570000D03*
X100330000Y-68570000D03*
X97790000Y-68570000D03*
X95250000Y-68570000D03*
X92710000Y-68570000D03*
X90170000Y-68570000D03*
X87630000Y-68570000D03*
%TD*%
D19*
%TO.C,C1*%
X91440000Y-93980000D03*
D21*
X93940000Y-93980000D03*
%TD*%
D22*
%TO.C,JP1*%
X96520000Y-99060000D03*
D23*
X96520000Y-97790000D03*
%TD*%
D19*
%TO.C,C2*%
X94020000Y-88900000D03*
D21*
X96520000Y-88900000D03*
%TD*%
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Top*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,2.100000*%
%ADD11R,2.275000X2.200000*%
%ADD12RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD13R,0.950000X2.800000*%
%ADD14RoundRect,0.100000X-0.100000X-0.200000X0.100000X-0.200000X0.100000X0.200000X-0.100000X0.200000X0*%
%ADD15RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*%
%ADD16RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD17C,2.400000*%
%ADD18R,2.400000X2.400000*%
%ADD19R,1.600000X1.600000*%
%ADD20O,1.600000X1.600000*%
%ADD21C,1.600000*%
%ADD22R,1.000000X1.000000*%
%ADD23O,1.000000X1.000000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X109220000Y-58420000D03*
%TD*%
D11*
%TO.C,Y1*%
X114300000Y-88900000D03*
X109125000Y-88900000D03*
%TD*%
D12*
%TO.C,U3*%
X122857500Y-100010000D03*
X122857500Y-98110000D03*
X120982500Y-99060000D03*
%TD*%
D13*
%TO.C,U2*%
X124220000Y-88040000D03*
X122680000Y-88040000D03*
X121160000Y-88040000D03*
X119620000Y-88040000D03*
X119620000Y-94840000D03*
X121160000Y-94840000D03*
X122680000Y-94840000D03*
X124220000Y-94840000D03*
%TD*%
D14*
%TO.C,U1*%
X110785000Y-95380000D03*
X111435000Y-95380000D03*
X112085000Y-95380000D03*
X112735000Y-95380000D03*
X112735000Y-92580000D03*
X112085000Y-92580000D03*
X111435000Y-92580000D03*
X110785000Y-92580000D03*
%TD*%
D15*
%TO.C,R2*%
X99060000Y-102110000D03*
X99060000Y-101090000D03*
%TD*%
D16*
%TO.C,R1*%
X101090000Y-63500000D03*
X102110000Y-63500000D03*
%TD*%
D17*
%TO.C,J1*%
X116220000Y-100900000D03*
X112720000Y-100900000D03*
X109220000Y-100900000D03*
D18*
X105720000Y-100900000D03*
%TD*%
D19*
%TO.C,A1*%
X87630000Y-83810000D03*
D20*
X90170000Y-83810000D03*
X92710000Y-83810000D03*
X95250000Y-83810000D03*
X97790000Y-83810000D03*
X100330000Y-83810000D03*
X102870000Y-83810000D03*
X105410000Y-83810000D03*
X107950000Y-83810000D03*
X110490000Y-83810000D03*
X113030000Y-83810000D03*
X115570000Y-83810000D03*
X118110000Y-83810000D03*
X120650000Y-83810000D03*
X123190000Y-83810000D03*
X123190000Y-68570000D03*
X120650000Y-68570000D03*
X118110000Y-68570000D03*
X115570000Y-68570000D03*
X113030000Y-68570000D03*
X110490000Y-68570000D03*
X107950000Y-68570000D03*
X105410000Y-68570000D03*
X102870000Y-68570000D03*
X100330000Y-68570000D03*
X97790000Y-68570000D03*
X95250000Y-68570000D03*
X92710000Y-68570000D03*
X90170000Y-68570000D03*
X87630000Y-68570000D03*
%TD*%
D19*
%TO.C,C1*%
X91440000Y-93980000D03*
D21*
X93940000Y-93980000D03*
%TD*%
D22*
%TO.C,JP1*%
X96520000Y-99060000D03*
D23*
X96520000Y-97790000D03*
%TD*%
D19*
%TO.C,C2*%
X94020000Y-88900000D03*
D21*
X96520000Y-88900000D03*
%TD*%
M02*

View File

@@ -1,82 +1,82 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10R,2.275000X2.200000*%
%ADD11RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD12R,0.950000X2.800000*%
%ADD13RoundRect,0.100000X-0.100000X-0.200000X0.100000X-0.200000X0.100000X0.200000X-0.100000X0.200000X0*%
%ADD14RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*%
%ADD15RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
G04 APERTURE END LIST*
D10*
%TO.C,Y1*%
X114300000Y-88900000D03*
X109125000Y-88900000D03*
%TD*%
D11*
%TO.C,U3*%
X122857500Y-100010000D03*
X122857500Y-98110000D03*
X120982500Y-99060000D03*
%TD*%
D12*
%TO.C,U2*%
X124220000Y-88040000D03*
X122680000Y-88040000D03*
X121160000Y-88040000D03*
X119620000Y-88040000D03*
X119620000Y-94840000D03*
X121160000Y-94840000D03*
X122680000Y-94840000D03*
X124220000Y-94840000D03*
%TD*%
D13*
%TO.C,U1*%
X110785000Y-95380000D03*
X111435000Y-95380000D03*
X112085000Y-95380000D03*
X112735000Y-95380000D03*
X112735000Y-92580000D03*
X112085000Y-92580000D03*
X111435000Y-92580000D03*
X110785000Y-92580000D03*
%TD*%
D14*
%TO.C,R2*%
X99060000Y-102110000D03*
X99060000Y-101090000D03*
%TD*%
D15*
%TO.C,R1*%
X101090000Y-63500000D03*
X102110000Y-63500000D03*
%TD*%
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10R,2.275000X2.200000*%
%ADD11RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD12R,0.950000X2.800000*%
%ADD13RoundRect,0.100000X-0.100000X-0.200000X0.100000X-0.200000X0.100000X0.200000X-0.100000X0.200000X0*%
%ADD14RoundRect,0.135000X0.185000X-0.135000X0.185000X0.135000X-0.185000X0.135000X-0.185000X-0.135000X0*%
%ADD15RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
G04 APERTURE END LIST*
D10*
%TO.C,Y1*%
X114300000Y-88900000D03*
X109125000Y-88900000D03*
%TD*%
D11*
%TO.C,U3*%
X122857500Y-100010000D03*
X122857500Y-98110000D03*
X120982500Y-99060000D03*
%TD*%
D12*
%TO.C,U2*%
X124220000Y-88040000D03*
X122680000Y-88040000D03*
X121160000Y-88040000D03*
X119620000Y-88040000D03*
X119620000Y-94840000D03*
X121160000Y-94840000D03*
X122680000Y-94840000D03*
X124220000Y-94840000D03*
%TD*%
D13*
%TO.C,U1*%
X110785000Y-95380000D03*
X111435000Y-95380000D03*
X112085000Y-95380000D03*
X112735000Y-95380000D03*
X112735000Y-92580000D03*
X112085000Y-92580000D03*
X111435000Y-92580000D03*
X110785000Y-92580000D03*
%TD*%
D14*
%TO.C,R2*%
X99060000Y-102110000D03*
X99060000Y-101090000D03*
%TD*%
D15*
%TO.C,R1*%
X101090000Y-63500000D03*
X102110000Y-63500000D03*
%TD*%
M02*

View File

@@ -1,493 +1,493 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Legend,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.150000*%
%ADD11C,0.120000*%
%ADD12C,0.100000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X107886666Y-55672380D02*
X107553333Y-55196190D01*
X107315238Y-55672380D02*
X107315238Y-54672380D01*
X107696190Y-54672380D01*
X107791428Y-54720000D01*
X107839047Y-54767619D01*
X107886666Y-54862857D01*
X107886666Y-55005714D01*
X107839047Y-55100952D01*
X107791428Y-55148571D01*
X107696190Y-55196190D01*
X107315238Y-55196190D01*
X108315238Y-55148571D02*
X108648571Y-55148571D01*
X108791428Y-55672380D02*
X108315238Y-55672380D01*
X108315238Y-54672380D01*
X108791428Y-54672380D01*
X109553333Y-55148571D02*
X109220000Y-55148571D01*
X109220000Y-55672380D02*
X109220000Y-54672380D01*
X109696190Y-54672380D01*
X110220000Y-54672380D02*
X110220000Y-54910476D01*
X109981904Y-54815238D02*
X110220000Y-54910476D01*
X110458095Y-54815238D01*
X110077142Y-55100952D02*
X110220000Y-54910476D01*
X110362857Y-55100952D01*
X110981904Y-54672380D02*
X110981904Y-54910476D01*
X110743809Y-54815238D02*
X110981904Y-54910476D01*
X111220000Y-54815238D01*
X110839047Y-55100952D02*
X110981904Y-54910476D01*
X111124761Y-55100952D01*
%TO.C,Y1*%
X111236309Y-91026190D02*
X111236309Y-91502380D01*
X110902976Y-90502380D02*
X111236309Y-91026190D01*
X111569642Y-90502380D01*
X112426785Y-91502380D02*
X111855357Y-91502380D01*
X112141071Y-91502380D02*
X112141071Y-90502380D01*
X112045833Y-90645238D01*
X111950595Y-90740476D01*
X111855357Y-90788095D01*
%TO.C,U3*%
X121158095Y-100912380D02*
X121158095Y-101721904D01*
X121205714Y-101817142D01*
X121253333Y-101864761D01*
X121348571Y-101912380D01*
X121539047Y-101912380D01*
X121634285Y-101864761D01*
X121681904Y-101817142D01*
X121729523Y-101721904D01*
X121729523Y-100912380D01*
X122110476Y-100912380D02*
X122729523Y-100912380D01*
X122396190Y-101293333D01*
X122539047Y-101293333D01*
X122634285Y-101340952D01*
X122681904Y-101388571D01*
X122729523Y-101483809D01*
X122729523Y-101721904D01*
X122681904Y-101817142D01*
X122634285Y-101864761D01*
X122539047Y-101912380D01*
X122253333Y-101912380D01*
X122158095Y-101864761D01*
X122110476Y-101817142D01*
%TO.C,U2*%
X125872380Y-92201904D02*
X126681904Y-92201904D01*
X126777142Y-92154285D01*
X126824761Y-92106666D01*
X126872380Y-92011428D01*
X126872380Y-91820952D01*
X126824761Y-91725714D01*
X126777142Y-91678095D01*
X126681904Y-91630476D01*
X125872380Y-91630476D01*
X125967619Y-91201904D02*
X125920000Y-91154285D01*
X125872380Y-91059047D01*
X125872380Y-90820952D01*
X125920000Y-90725714D01*
X125967619Y-90678095D01*
X126062857Y-90630476D01*
X126158095Y-90630476D01*
X126300952Y-90678095D01*
X126872380Y-91249523D01*
X126872380Y-90630476D01*
%TO.C,U1*%
X108712380Y-94741904D02*
X109521904Y-94741904D01*
X109617142Y-94694285D01*
X109664761Y-94646666D01*
X109712380Y-94551428D01*
X109712380Y-94360952D01*
X109664761Y-94265714D01*
X109617142Y-94218095D01*
X109521904Y-94170476D01*
X108712380Y-94170476D01*
X109712380Y-93170476D02*
X109712380Y-93741904D01*
X109712380Y-93456190D02*
X108712380Y-93456190D01*
X108855238Y-93551428D01*
X108950476Y-93646666D01*
X108998095Y-93741904D01*
%TO.C,R2*%
X98342380Y-101766666D02*
X97866190Y-102100000D01*
X98342380Y-102338095D02*
X97342380Y-102338095D01*
X97342380Y-101957142D01*
X97390000Y-101861904D01*
X97437619Y-101814285D01*
X97532857Y-101766666D01*
X97675714Y-101766666D01*
X97770952Y-101814285D01*
X97818571Y-101861904D01*
X97866190Y-101957142D01*
X97866190Y-102338095D01*
X97437619Y-101385714D02*
X97390000Y-101338095D01*
X97342380Y-101242857D01*
X97342380Y-101004761D01*
X97390000Y-100909523D01*
X97437619Y-100861904D01*
X97532857Y-100814285D01*
X97628095Y-100814285D01*
X97770952Y-100861904D01*
X98342380Y-101433333D01*
X98342380Y-100814285D01*
%TO.C,R1*%
X101433333Y-62782380D02*
X101100000Y-62306190D01*
X100861904Y-62782380D02*
X100861904Y-61782380D01*
X101242857Y-61782380D01*
X101338095Y-61830000D01*
X101385714Y-61877619D01*
X101433333Y-61972857D01*
X101433333Y-62115714D01*
X101385714Y-62210952D01*
X101338095Y-62258571D01*
X101242857Y-62306190D01*
X100861904Y-62306190D01*
X102385714Y-62782380D02*
X101814285Y-62782380D01*
X102100000Y-62782380D02*
X102100000Y-61782380D01*
X102004761Y-61925238D01*
X101909523Y-62020476D01*
X101814285Y-62068095D01*
%TO.C,J1*%
X110636666Y-96192380D02*
X110636666Y-96906666D01*
X110589047Y-97049523D01*
X110493809Y-97144761D01*
X110350952Y-97192380D01*
X110255714Y-97192380D01*
X111636666Y-97192380D02*
X111065238Y-97192380D01*
X111350952Y-97192380D02*
X111350952Y-96192380D01*
X111255714Y-96335238D01*
X111160476Y-96430476D01*
X111065238Y-96478095D01*
%TO.C,A1*%
X82716666Y-76904285D02*
X82716666Y-76428095D01*
X83002380Y-76999523D02*
X82002380Y-76666190D01*
X83002380Y-76332857D01*
X83002380Y-75475714D02*
X83002380Y-76047142D01*
X83002380Y-75761428D02*
X82002380Y-75761428D01*
X82145238Y-75856666D01*
X82240476Y-75951904D01*
X82288095Y-76047142D01*
%TO.C,C1*%
X92523333Y-90837142D02*
X92475714Y-90884761D01*
X92332857Y-90932380D01*
X92237619Y-90932380D01*
X92094761Y-90884761D01*
X91999523Y-90789523D01*
X91951904Y-90694285D01*
X91904285Y-90503809D01*
X91904285Y-90360952D01*
X91951904Y-90170476D01*
X91999523Y-90075238D01*
X92094761Y-89980000D01*
X92237619Y-89932380D01*
X92332857Y-89932380D01*
X92475714Y-89980000D01*
X92523333Y-90027619D01*
X93475714Y-90932380D02*
X92904285Y-90932380D01*
X93190000Y-90932380D02*
X93190000Y-89932380D01*
X93094761Y-90075238D01*
X92999523Y-90170476D01*
X92904285Y-90218095D01*
%TO.C,JP1*%
X95686666Y-100207380D02*
X95686666Y-100921666D01*
X95639047Y-101064523D01*
X95543809Y-101159761D01*
X95400952Y-101207380D01*
X95305714Y-101207380D01*
X96162857Y-101207380D02*
X96162857Y-100207380D01*
X96543809Y-100207380D01*
X96639047Y-100255000D01*
X96686666Y-100302619D01*
X96734285Y-100397857D01*
X96734285Y-100540714D01*
X96686666Y-100635952D01*
X96639047Y-100683571D01*
X96543809Y-100731190D01*
X96162857Y-100731190D01*
X97686666Y-101207380D02*
X97115238Y-101207380D01*
X97400952Y-101207380D02*
X97400952Y-100207380D01*
X97305714Y-100350238D01*
X97210476Y-100445476D01*
X97115238Y-100493095D01*
%TO.C,C2*%
X95103333Y-85757142D02*
X95055714Y-85804761D01*
X94912857Y-85852380D01*
X94817619Y-85852380D01*
X94674761Y-85804761D01*
X94579523Y-85709523D01*
X94531904Y-85614285D01*
X94484285Y-85423809D01*
X94484285Y-85280952D01*
X94531904Y-85090476D01*
X94579523Y-84995238D01*
X94674761Y-84900000D01*
X94817619Y-84852380D01*
X94912857Y-84852380D01*
X95055714Y-84900000D01*
X95103333Y-84947619D01*
X95484285Y-84947619D02*
X95531904Y-84900000D01*
X95627142Y-84852380D01*
X95865238Y-84852380D01*
X95960476Y-84900000D01*
X96008095Y-84947619D01*
X96055714Y-85042857D01*
X96055714Y-85138095D01*
X96008095Y-85280952D01*
X95436666Y-85852380D01*
X96055714Y-85852380D01*
D11*
%TO.C,Y1*%
X112962500Y-90050000D02*
X110462500Y-90050000D01*
X112962500Y-87750000D02*
X110462500Y-87750000D01*
X115637500Y-90000000D02*
X115637500Y-87800000D01*
%TO.C,U3*%
X121920000Y-100620000D02*
X121270000Y-100620000D01*
X121920000Y-97500000D02*
X121270000Y-97500000D01*
X121920000Y-100620000D02*
X123595000Y-100620000D01*
X121920000Y-97500000D02*
X122570000Y-97500000D01*
%TO.C,U2*%
X124920000Y-86640000D02*
X124920000Y-89440000D01*
X118920000Y-93440000D02*
X118420000Y-93440000D01*
X124920000Y-89440000D02*
X125320000Y-89440000D01*
X118420000Y-93440000D02*
X118420000Y-89440000D01*
X125320000Y-93440000D02*
X124920000Y-93440000D01*
X125320000Y-89440000D02*
X125320000Y-93440000D01*
X118420000Y-89440000D02*
X118920000Y-89440000D01*
D12*
%TO.C,U1*%
X113310000Y-92730000D02*
X113160000Y-92730000D01*
X110310000Y-95230000D02*
X110210000Y-95230000D01*
X113310000Y-95230000D02*
X113310000Y-92730000D01*
X113160000Y-95230000D02*
X113310000Y-95230000D01*
X110210000Y-95230000D02*
X110210000Y-92730000D01*
X110210000Y-92730000D02*
X110310000Y-92730000D01*
X110310000Y-95630000D02*
X110310000Y-95230000D01*
D11*
%TO.C,R2*%
X98680000Y-101753641D02*
X98680000Y-101446359D01*
X99440000Y-101753641D02*
X99440000Y-101446359D01*
%TO.C,R1*%
X101446359Y-63120000D02*
X101753641Y-63120000D01*
X101446359Y-63880000D02*
X101753641Y-63880000D01*
%TO.C,J1*%
X114400000Y-100900000D02*
G75*
G03*
X114400000Y-100900000I-1680000J0D01*
G01*
X117900000Y-100900000D02*
G75*
G03*
X117900000Y-100900000I-1680000J0D01*
G01*
X110900000Y-100900000D02*
G75*
G03*
X110900000Y-100900000I-1680000J0D01*
G01*
X106586000Y-99459999D02*
G75*
G03*
X104830106Y-99474642I-866000J-1439999D01*
G01*
X104279999Y-100034000D02*
G75*
G03*
X104294642Y-101789894I1439999J-866000D01*
G01*
X107145000Y-101791000D02*
G75*
G03*
X107145504Y-100009807I-1425003J891000D01*
G01*
X105720000Y-102580000D02*
G75*
G03*
X106610264Y-102324721I3J1679990D01*
G01*
X104854000Y-102340000D02*
G75*
G03*
X105748674Y-102580099I866003J1440014D01*
G01*
X108245000Y-102081000D02*
X108151000Y-102174000D01*
X108075000Y-101841000D02*
X107946000Y-101969000D01*
X115075000Y-101841000D02*
X114946000Y-101969000D01*
X103670000Y-105060000D02*
X103670000Y-105700000D01*
X110290000Y-99625000D02*
X110196000Y-99719000D01*
X103670000Y-105700000D02*
X104070000Y-105700000D01*
X118030000Y-97740000D02*
X118030000Y-105460000D01*
X103910000Y-103900000D02*
X118030000Y-103900000D01*
X115245000Y-102081000D02*
X115151000Y-102174000D01*
X111575000Y-101841000D02*
X111446000Y-101969000D01*
X103910000Y-97740000D02*
X118030000Y-97740000D01*
X113790000Y-99625000D02*
X113696000Y-99719000D01*
X103910000Y-105460000D02*
X118030000Y-105460000D01*
X111745000Y-102081000D02*
X111651000Y-102174000D01*
X117495000Y-99831000D02*
X117366000Y-99959000D01*
X110495000Y-99831000D02*
X110366000Y-99959000D01*
X113995000Y-99831000D02*
X113866000Y-99959000D01*
X117290000Y-99625000D02*
X117196000Y-99719000D01*
X103910000Y-105000000D02*
X118030000Y-105000000D01*
X103910000Y-97740000D02*
X103910000Y-105460000D01*
%TO.C,A1*%
X83690000Y-85210000D02*
X86360000Y-85210000D01*
X127130000Y-67170000D02*
X83690000Y-67170000D01*
X124460000Y-69840000D02*
X124460000Y-67170000D01*
X88900000Y-82540000D02*
X86360000Y-82540000D01*
X86360000Y-82540000D02*
X86360000Y-85210000D01*
X124460000Y-82540000D02*
X124460000Y-85210000D01*
X127130000Y-85210000D02*
X127130000Y-67170000D01*
X88900000Y-82540000D02*
X124460000Y-82540000D01*
X83690000Y-67170000D02*
X83690000Y-85210000D01*
X88900000Y-82540000D02*
X88900000Y-85210000D01*
X88900000Y-85210000D02*
X127130000Y-85210000D01*
X86360000Y-69840000D02*
X86360000Y-67170000D01*
X86360000Y-69840000D02*
X124460000Y-69840000D01*
%TO.C,C1*%
X90377712Y-92420000D02*
X90377712Y-92870000D01*
X90152712Y-92645000D02*
X90602712Y-92645000D01*
X90570259Y-95040000D02*
G75*
G03*
X90570259Y-92920000I2119741J1060000D01*
G01*
%TO.C,JP1*%
X97630000Y-98300000D02*
X97630000Y-97095000D01*
X95410000Y-98300000D02*
X95410000Y-97095000D01*
X97630000Y-97095000D02*
X96827530Y-97095000D01*
X97630000Y-98300000D02*
X97083471Y-98300000D01*
X97630000Y-99060000D02*
X97630000Y-99820000D01*
X95956529Y-98300000D02*
X95410000Y-98300000D01*
X96212470Y-97095000D02*
X95410000Y-97095000D01*
X97630000Y-99820000D02*
X96520000Y-99820000D01*
%TO.C,C2*%
X92957712Y-87340000D02*
X92957712Y-87790000D01*
X92732712Y-87565000D02*
X93182712Y-87565000D01*
X93150259Y-89960000D02*
G75*
G03*
X93150259Y-87840000I2119741J1060000D01*
G01*
%TD*%
M02*
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.4)*%
%TF.CreationDate,2022-05-25T07:35:57+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Legend,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.4)) date 2022-05-25 07:35:57*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,0.150000*%
%ADD11C,0.120000*%
%ADD12C,0.100000*%
G04 APERTURE END LIST*
D10*
%TO.C,REF\u002A\u002A*%
X107886666Y-55672380D02*
X107553333Y-55196190D01*
X107315238Y-55672380D02*
X107315238Y-54672380D01*
X107696190Y-54672380D01*
X107791428Y-54720000D01*
X107839047Y-54767619D01*
X107886666Y-54862857D01*
X107886666Y-55005714D01*
X107839047Y-55100952D01*
X107791428Y-55148571D01*
X107696190Y-55196190D01*
X107315238Y-55196190D01*
X108315238Y-55148571D02*
X108648571Y-55148571D01*
X108791428Y-55672380D02*
X108315238Y-55672380D01*
X108315238Y-54672380D01*
X108791428Y-54672380D01*
X109553333Y-55148571D02*
X109220000Y-55148571D01*
X109220000Y-55672380D02*
X109220000Y-54672380D01*
X109696190Y-54672380D01*
X110220000Y-54672380D02*
X110220000Y-54910476D01*
X109981904Y-54815238D02*
X110220000Y-54910476D01*
X110458095Y-54815238D01*
X110077142Y-55100952D02*
X110220000Y-54910476D01*
X110362857Y-55100952D01*
X110981904Y-54672380D02*
X110981904Y-54910476D01*
X110743809Y-54815238D02*
X110981904Y-54910476D01*
X111220000Y-54815238D01*
X110839047Y-55100952D02*
X110981904Y-54910476D01*
X111124761Y-55100952D01*
%TO.C,Y1*%
X111236309Y-91026190D02*
X111236309Y-91502380D01*
X110902976Y-90502380D02*
X111236309Y-91026190D01*
X111569642Y-90502380D01*
X112426785Y-91502380D02*
X111855357Y-91502380D01*
X112141071Y-91502380D02*
X112141071Y-90502380D01*
X112045833Y-90645238D01*
X111950595Y-90740476D01*
X111855357Y-90788095D01*
%TO.C,U3*%
X121158095Y-100912380D02*
X121158095Y-101721904D01*
X121205714Y-101817142D01*
X121253333Y-101864761D01*
X121348571Y-101912380D01*
X121539047Y-101912380D01*
X121634285Y-101864761D01*
X121681904Y-101817142D01*
X121729523Y-101721904D01*
X121729523Y-100912380D01*
X122110476Y-100912380D02*
X122729523Y-100912380D01*
X122396190Y-101293333D01*
X122539047Y-101293333D01*
X122634285Y-101340952D01*
X122681904Y-101388571D01*
X122729523Y-101483809D01*
X122729523Y-101721904D01*
X122681904Y-101817142D01*
X122634285Y-101864761D01*
X122539047Y-101912380D01*
X122253333Y-101912380D01*
X122158095Y-101864761D01*
X122110476Y-101817142D01*
%TO.C,U2*%
X125872380Y-92201904D02*
X126681904Y-92201904D01*
X126777142Y-92154285D01*
X126824761Y-92106666D01*
X126872380Y-92011428D01*
X126872380Y-91820952D01*
X126824761Y-91725714D01*
X126777142Y-91678095D01*
X126681904Y-91630476D01*
X125872380Y-91630476D01*
X125967619Y-91201904D02*
X125920000Y-91154285D01*
X125872380Y-91059047D01*
X125872380Y-90820952D01*
X125920000Y-90725714D01*
X125967619Y-90678095D01*
X126062857Y-90630476D01*
X126158095Y-90630476D01*
X126300952Y-90678095D01*
X126872380Y-91249523D01*
X126872380Y-90630476D01*
%TO.C,U1*%
X108712380Y-94741904D02*
X109521904Y-94741904D01*
X109617142Y-94694285D01*
X109664761Y-94646666D01*
X109712380Y-94551428D01*
X109712380Y-94360952D01*
X109664761Y-94265714D01*
X109617142Y-94218095D01*
X109521904Y-94170476D01*
X108712380Y-94170476D01*
X109712380Y-93170476D02*
X109712380Y-93741904D01*
X109712380Y-93456190D02*
X108712380Y-93456190D01*
X108855238Y-93551428D01*
X108950476Y-93646666D01*
X108998095Y-93741904D01*
%TO.C,R2*%
X98342380Y-101766666D02*
X97866190Y-102100000D01*
X98342380Y-102338095D02*
X97342380Y-102338095D01*
X97342380Y-101957142D01*
X97390000Y-101861904D01*
X97437619Y-101814285D01*
X97532857Y-101766666D01*
X97675714Y-101766666D01*
X97770952Y-101814285D01*
X97818571Y-101861904D01*
X97866190Y-101957142D01*
X97866190Y-102338095D01*
X97437619Y-101385714D02*
X97390000Y-101338095D01*
X97342380Y-101242857D01*
X97342380Y-101004761D01*
X97390000Y-100909523D01*
X97437619Y-100861904D01*
X97532857Y-100814285D01*
X97628095Y-100814285D01*
X97770952Y-100861904D01*
X98342380Y-101433333D01*
X98342380Y-100814285D01*
%TO.C,R1*%
X101433333Y-62782380D02*
X101100000Y-62306190D01*
X100861904Y-62782380D02*
X100861904Y-61782380D01*
X101242857Y-61782380D01*
X101338095Y-61830000D01*
X101385714Y-61877619D01*
X101433333Y-61972857D01*
X101433333Y-62115714D01*
X101385714Y-62210952D01*
X101338095Y-62258571D01*
X101242857Y-62306190D01*
X100861904Y-62306190D01*
X102385714Y-62782380D02*
X101814285Y-62782380D01*
X102100000Y-62782380D02*
X102100000Y-61782380D01*
X102004761Y-61925238D01*
X101909523Y-62020476D01*
X101814285Y-62068095D01*
%TO.C,J1*%
X110636666Y-96192380D02*
X110636666Y-96906666D01*
X110589047Y-97049523D01*
X110493809Y-97144761D01*
X110350952Y-97192380D01*
X110255714Y-97192380D01*
X111636666Y-97192380D02*
X111065238Y-97192380D01*
X111350952Y-97192380D02*
X111350952Y-96192380D01*
X111255714Y-96335238D01*
X111160476Y-96430476D01*
X111065238Y-96478095D01*
%TO.C,A1*%
X82716666Y-76904285D02*
X82716666Y-76428095D01*
X83002380Y-76999523D02*
X82002380Y-76666190D01*
X83002380Y-76332857D01*
X83002380Y-75475714D02*
X83002380Y-76047142D01*
X83002380Y-75761428D02*
X82002380Y-75761428D01*
X82145238Y-75856666D01*
X82240476Y-75951904D01*
X82288095Y-76047142D01*
%TO.C,C1*%
X92523333Y-90837142D02*
X92475714Y-90884761D01*
X92332857Y-90932380D01*
X92237619Y-90932380D01*
X92094761Y-90884761D01*
X91999523Y-90789523D01*
X91951904Y-90694285D01*
X91904285Y-90503809D01*
X91904285Y-90360952D01*
X91951904Y-90170476D01*
X91999523Y-90075238D01*
X92094761Y-89980000D01*
X92237619Y-89932380D01*
X92332857Y-89932380D01*
X92475714Y-89980000D01*
X92523333Y-90027619D01*
X93475714Y-90932380D02*
X92904285Y-90932380D01*
X93190000Y-90932380D02*
X93190000Y-89932380D01*
X93094761Y-90075238D01*
X92999523Y-90170476D01*
X92904285Y-90218095D01*
%TO.C,JP1*%
X95686666Y-100207380D02*
X95686666Y-100921666D01*
X95639047Y-101064523D01*
X95543809Y-101159761D01*
X95400952Y-101207380D01*
X95305714Y-101207380D01*
X96162857Y-101207380D02*
X96162857Y-100207380D01*
X96543809Y-100207380D01*
X96639047Y-100255000D01*
X96686666Y-100302619D01*
X96734285Y-100397857D01*
X96734285Y-100540714D01*
X96686666Y-100635952D01*
X96639047Y-100683571D01*
X96543809Y-100731190D01*
X96162857Y-100731190D01*
X97686666Y-101207380D02*
X97115238Y-101207380D01*
X97400952Y-101207380D02*
X97400952Y-100207380D01*
X97305714Y-100350238D01*
X97210476Y-100445476D01*
X97115238Y-100493095D01*
%TO.C,C2*%
X95103333Y-85757142D02*
X95055714Y-85804761D01*
X94912857Y-85852380D01*
X94817619Y-85852380D01*
X94674761Y-85804761D01*
X94579523Y-85709523D01*
X94531904Y-85614285D01*
X94484285Y-85423809D01*
X94484285Y-85280952D01*
X94531904Y-85090476D01*
X94579523Y-84995238D01*
X94674761Y-84900000D01*
X94817619Y-84852380D01*
X94912857Y-84852380D01*
X95055714Y-84900000D01*
X95103333Y-84947619D01*
X95484285Y-84947619D02*
X95531904Y-84900000D01*
X95627142Y-84852380D01*
X95865238Y-84852380D01*
X95960476Y-84900000D01*
X96008095Y-84947619D01*
X96055714Y-85042857D01*
X96055714Y-85138095D01*
X96008095Y-85280952D01*
X95436666Y-85852380D01*
X96055714Y-85852380D01*
D11*
%TO.C,Y1*%
X112962500Y-90050000D02*
X110462500Y-90050000D01*
X112962500Y-87750000D02*
X110462500Y-87750000D01*
X115637500Y-90000000D02*
X115637500Y-87800000D01*
%TO.C,U3*%
X121920000Y-100620000D02*
X121270000Y-100620000D01*
X121920000Y-97500000D02*
X121270000Y-97500000D01*
X121920000Y-100620000D02*
X123595000Y-100620000D01*
X121920000Y-97500000D02*
X122570000Y-97500000D01*
%TO.C,U2*%
X124920000Y-86640000D02*
X124920000Y-89440000D01*
X118920000Y-93440000D02*
X118420000Y-93440000D01*
X124920000Y-89440000D02*
X125320000Y-89440000D01*
X118420000Y-93440000D02*
X118420000Y-89440000D01*
X125320000Y-93440000D02*
X124920000Y-93440000D01*
X125320000Y-89440000D02*
X125320000Y-93440000D01*
X118420000Y-89440000D02*
X118920000Y-89440000D01*
D12*
%TO.C,U1*%
X113310000Y-92730000D02*
X113160000Y-92730000D01*
X110310000Y-95230000D02*
X110210000Y-95230000D01*
X113310000Y-95230000D02*
X113310000Y-92730000D01*
X113160000Y-95230000D02*
X113310000Y-95230000D01*
X110210000Y-95230000D02*
X110210000Y-92730000D01*
X110210000Y-92730000D02*
X110310000Y-92730000D01*
X110310000Y-95630000D02*
X110310000Y-95230000D01*
D11*
%TO.C,R2*%
X98680000Y-101753641D02*
X98680000Y-101446359D01*
X99440000Y-101753641D02*
X99440000Y-101446359D01*
%TO.C,R1*%
X101446359Y-63120000D02*
X101753641Y-63120000D01*
X101446359Y-63880000D02*
X101753641Y-63880000D01*
%TO.C,J1*%
X114400000Y-100900000D02*
G75*
G03*
X114400000Y-100900000I-1680000J0D01*
G01*
X117900000Y-100900000D02*
G75*
G03*
X117900000Y-100900000I-1680000J0D01*
G01*
X110900000Y-100900000D02*
G75*
G03*
X110900000Y-100900000I-1680000J0D01*
G01*
X106586000Y-99459999D02*
G75*
G03*
X104830106Y-99474642I-866000J-1439999D01*
G01*
X104279999Y-100034000D02*
G75*
G03*
X104294642Y-101789894I1439999J-866000D01*
G01*
X107145000Y-101791000D02*
G75*
G03*
X107145504Y-100009807I-1425003J891000D01*
G01*
X105720000Y-102580000D02*
G75*
G03*
X106610264Y-102324721I3J1679990D01*
G01*
X104854000Y-102340000D02*
G75*
G03*
X105748674Y-102580099I866003J1440014D01*
G01*
X108245000Y-102081000D02*
X108151000Y-102174000D01*
X108075000Y-101841000D02*
X107946000Y-101969000D01*
X115075000Y-101841000D02*
X114946000Y-101969000D01*
X103670000Y-105060000D02*
X103670000Y-105700000D01*
X110290000Y-99625000D02*
X110196000Y-99719000D01*
X103670000Y-105700000D02*
X104070000Y-105700000D01*
X118030000Y-97740000D02*
X118030000Y-105460000D01*
X103910000Y-103900000D02*
X118030000Y-103900000D01*
X115245000Y-102081000D02*
X115151000Y-102174000D01*
X111575000Y-101841000D02*
X111446000Y-101969000D01*
X103910000Y-97740000D02*
X118030000Y-97740000D01*
X113790000Y-99625000D02*
X113696000Y-99719000D01*
X103910000Y-105460000D02*
X118030000Y-105460000D01*
X111745000Y-102081000D02*
X111651000Y-102174000D01*
X117495000Y-99831000D02*
X117366000Y-99959000D01*
X110495000Y-99831000D02*
X110366000Y-99959000D01*
X113995000Y-99831000D02*
X113866000Y-99959000D01*
X117290000Y-99625000D02*
X117196000Y-99719000D01*
X103910000Y-105000000D02*
X118030000Y-105000000D01*
X103910000Y-97740000D02*
X103910000Y-105460000D01*
%TO.C,A1*%
X83690000Y-85210000D02*
X86360000Y-85210000D01*
X127130000Y-67170000D02*
X83690000Y-67170000D01*
X124460000Y-69840000D02*
X124460000Y-67170000D01*
X88900000Y-82540000D02*
X86360000Y-82540000D01*
X86360000Y-82540000D02*
X86360000Y-85210000D01*
X124460000Y-82540000D02*
X124460000Y-85210000D01*
X127130000Y-85210000D02*
X127130000Y-67170000D01*
X88900000Y-82540000D02*
X124460000Y-82540000D01*
X83690000Y-67170000D02*
X83690000Y-85210000D01*
X88900000Y-82540000D02*
X88900000Y-85210000D01*
X88900000Y-85210000D02*
X127130000Y-85210000D01*
X86360000Y-69840000D02*
X86360000Y-67170000D01*
X86360000Y-69840000D02*
X124460000Y-69840000D01*
%TO.C,C1*%
X90377712Y-92420000D02*
X90377712Y-92870000D01*
X90152712Y-92645000D02*
X90602712Y-92645000D01*
X90570259Y-95040000D02*
G75*
G03*
X90570259Y-92920000I2119741J1060000D01*
G01*
%TO.C,JP1*%
X97630000Y-98300000D02*
X97630000Y-97095000D01*
X95410000Y-98300000D02*
X95410000Y-97095000D01*
X97630000Y-97095000D02*
X96827530Y-97095000D01*
X97630000Y-98300000D02*
X97083471Y-98300000D01*
X97630000Y-99060000D02*
X97630000Y-99820000D01*
X95956529Y-98300000D02*
X95410000Y-98300000D01*
X96212470Y-97095000D02*
X95410000Y-97095000D01*
X97630000Y-99820000D02*
X96520000Y-99820000D01*
%TO.C,C2*%
X92957712Y-87340000D02*
X92957712Y-87790000D01*
X92732712Y-87565000D02*
X93182712Y-87565000D01*
X93150259Y-89960000D02*
G75*
G03*
X93150259Y-87840000I2119741J1060000D01*
G01*
%TD*%
M02*

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,120 +1,120 @@
{
"Header": {
"GenerationSoftware": {
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "(6.0.4)"
},
"CreationDate": "2022-05-25T07:35:57+02:00"
},
"GeneralSpecs": {
"ProjectId": {
"Name": "Meycad",
"GUID": "4d657963-6164-42e6-9b69-6361645f7063",
"Revision": "rev?"
},
"Size": {
"X": 52.1006,
"Y": 50.1
},
"LayerNumber": 2,
"BoardThickness": 1.6,
"Finish": "None"
},
"DesignRules": [
{
"Layers": "Outer",
"PadToPad": 0.2,
"PadToTrack": 0.2,
"TrackToTrack": 0.2,
"MinLineWidth": 0.25
}
],
"FilesAttributes": [
{
"Path": "Meycad-F_Cu.gbr",
"FileFunction": "Copper,L1,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Cu.gbr",
"FileFunction": "Copper,L2,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Paste.gbr",
"FileFunction": "SolderPaste,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Paste.gbr",
"FileFunction": "SolderPaste,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Silkscreen.gbr",
"FileFunction": "Legend,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Silkscreen.gbr",
"FileFunction": "Legend,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Mask.gbr",
"FileFunction": "SolderMask,Top",
"FilePolarity": "Negative"
},
{
"Path": "Meycad-B_Mask.gbr",
"FileFunction": "SolderMask,Bot",
"FilePolarity": "Negative"
},
{
"Path": "Meycad-Edge_Cuts.gbr",
"FileFunction": "Profile",
"FilePolarity": "Positive"
}
],
"MaterialStackup": [
{
"Type": "Legend",
"Name": "Top Silk Screen"
},
{
"Type": "SolderPaste",
"Name": "Top Solder Paste"
},
{
"Type": "SolderMask",
"Name": "Top Solder Mask"
},
{
"Type": "Copper",
"Name": "F.Cu"
},
{
"Type": "Dielectric",
"Material": "FR4",
"Name": "F.Cu/B.Cu",
"Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)"
},
{
"Type": "Copper",
"Name": "B.Cu"
},
{
"Type": "SolderMask",
"Name": "Bottom Solder Mask"
},
{
"Type": "SolderPaste",
"Name": "Bottom Solder Paste"
},
{
"Type": "Legend",
"Name": "Bottom Silk Screen"
}
]
}
{
"Header": {
"GenerationSoftware": {
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "(6.0.4)"
},
"CreationDate": "2022-05-25T07:35:57+02:00"
},
"GeneralSpecs": {
"ProjectId": {
"Name": "Meycad",
"GUID": "4d657963-6164-42e6-9b69-6361645f7063",
"Revision": "rev?"
},
"Size": {
"X": 52.1006,
"Y": 50.1
},
"LayerNumber": 2,
"BoardThickness": 1.6,
"Finish": "None"
},
"DesignRules": [
{
"Layers": "Outer",
"PadToPad": 0.2,
"PadToTrack": 0.2,
"TrackToTrack": 0.2,
"MinLineWidth": 0.25
}
],
"FilesAttributes": [
{
"Path": "Meycad-F_Cu.gbr",
"FileFunction": "Copper,L1,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Cu.gbr",
"FileFunction": "Copper,L2,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Paste.gbr",
"FileFunction": "SolderPaste,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Paste.gbr",
"FileFunction": "SolderPaste,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Silkscreen.gbr",
"FileFunction": "Legend,Top",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-B_Silkscreen.gbr",
"FileFunction": "Legend,Bot",
"FilePolarity": "Positive"
},
{
"Path": "Meycad-F_Mask.gbr",
"FileFunction": "SolderMask,Top",
"FilePolarity": "Negative"
},
{
"Path": "Meycad-B_Mask.gbr",
"FileFunction": "SolderMask,Bot",
"FilePolarity": "Negative"
},
{
"Path": "Meycad-Edge_Cuts.gbr",
"FileFunction": "Profile",
"FilePolarity": "Positive"
}
],
"MaterialStackup": [
{
"Type": "Legend",
"Name": "Top Silk Screen"
},
{
"Type": "SolderPaste",
"Name": "Top Solder Paste"
},
{
"Type": "SolderMask",
"Name": "Top Solder Mask"
},
{
"Type": "Copper",
"Name": "F.Cu"
},
{
"Type": "Dielectric",
"Material": "FR4",
"Name": "F.Cu/B.Cu",
"Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)"
},
{
"Type": "Copper",
"Name": "B.Cu"
},
{
"Type": "SolderMask",
"Name": "Bottom Solder Mask"
},
{
"Type": "SolderPaste",
"Name": "Bottom Solder Paste"
},
{
"Type": "Legend",
"Name": "Bottom Silk Screen"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,75 +1,75 @@
{
"board": {
"active_layer": 36,
"active_layer_preset": "",
"auto_track_width": false,
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 1.0
},
"ratsnest_display_mode": 0,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36
],
"visible_layers": "0001030_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "Meycad.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}
{
"board": {
"active_layer": 36,
"active_layer_preset": "",
"auto_track_width": false,
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 1.0
},
"ratsnest_display_mode": 0,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36
],
"visible_layers": "0001030_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "Meycad.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Attach) - openHAB",
"request": "attach",
"hostName": "localhost",
"port": 5005,
"preLaunchTask": "Build"
}
]
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Debug (Attach) - openHAB",
"request": "attach",
"hostName": "localhost",
"port": 5005,
"preLaunchTask": "Build"
}
]
}

View File

@@ -1,149 +1,149 @@
{
"version": "2.0.0",
"options": {
"env": {
"openhab_home": "C://source//openhab_runtime",
"openhab_runtime": "C://source//openhab_runtime//runtime",
"openhab_addons": "C://source//openhab_runtime//addons",
"openhab_logs": "C://source//openhab_runtime//userdata/logs",
"dist" : "org.openhab.binding.meycan-4.0.0-SNAPSHOT.jar"
}
},
"tasks": [
{
"label": "Start openHAB (Debug)",
"type": "shell",
"isBackground": true,
"command": "$openhab_home/start.sh debug",
"windows": {
"command": "& $env:openhab_home/start.bat debug"
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "Stop openHAB",
"type": "shell",
"command": "$openhab_runtime/bin/stop",
"windows": {
"command": "& $env:openhab_runtime/bin/stop.bat"
},
"problemMatcher": []
},
{
"label": "mvn Compile (Release)",
"type": "shell",
"command": "mvn",
"args": [
"clean",
"install"
],
"problemMatcher": []
},
{
"label": "mvn Compile (Online)",
"type": "shell",
"command": "mvn",
"args": [
"clean",
"install",
"-DskipChecks"
],
"problemMatcher": []
},
{
"label": "mvn Compile (Offline)",
"type": "shell",
"command": "mvn",
"args": [
"-o",
"clean",
"install",
"-DskipChecks"
],
"problemMatcher": []
},
{
"label": "Copy Distribution to Addons",
"type": "shell",
"command": "cp",
"args": [
"${workspaceFolder}/target/$dist",
"$openhab_addons"
],
"windows": {
"command": "copy",
"args": [
"${workspaceFolder}/target/$env:dist",
"$env:openhab_addons"
]
},
"dependsOn": [
"mvn Compile (Offline)"
],
"problemMatcher": []
},
{
"label": "Build",
"dependsOn": [
"Copy Distribution to Addons"
],
"problemMatcher": []
},
{
"label": "Tail events.log",
"type": "shell",
"command": "tail",
"args": [
"-n",
"50",
"-F",
"$openhab_logs/events.log"
],
"windows": {
"command": "Get-Content",
"args": [
"-Last",
"50",
"-Path",
"$env:openhab_logs/events.log",
"-Wait"
]
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "Tail openhab.log",
"type": "shell",
"command": "tail",
"args": [
"-n",
"50",
"-F",
"$openhab_logs/openhab.log"
],
"windows": {
"command": "Get-Content",
"args": [
"-Last",
"50",
"-Path",
"$env:openhab_logs/openhab.log",
"-Wait"
]
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
}
]
{
"version": "2.0.0",
"options": {
"env": {
"openhab_home": "C://source//openhab_runtime",
"openhab_runtime": "C://source//openhab_runtime//runtime",
"openhab_addons": "C://source//openhab_runtime//addons",
"openhab_logs": "C://source//openhab_runtime//userdata/logs",
"dist" : "org.openhab.binding.meycan-4.0.0-SNAPSHOT.jar"
}
},
"tasks": [
{
"label": "Start openHAB (Debug)",
"type": "shell",
"isBackground": true,
"command": "$openhab_home/start.sh debug",
"windows": {
"command": "& $env:openhab_home/start.bat debug"
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "Stop openHAB",
"type": "shell",
"command": "$openhab_runtime/bin/stop",
"windows": {
"command": "& $env:openhab_runtime/bin/stop.bat"
},
"problemMatcher": []
},
{
"label": "mvn Compile (Release)",
"type": "shell",
"command": "mvn",
"args": [
"clean",
"install"
],
"problemMatcher": []
},
{
"label": "mvn Compile (Online)",
"type": "shell",
"command": "mvn",
"args": [
"clean",
"install",
"-DskipChecks"
],
"problemMatcher": []
},
{
"label": "mvn Compile (Offline)",
"type": "shell",
"command": "mvn",
"args": [
"-o",
"clean",
"install",
"-DskipChecks"
],
"problemMatcher": []
},
{
"label": "Copy Distribution to Addons",
"type": "shell",
"command": "cp",
"args": [
"${workspaceFolder}/target/$dist",
"$openhab_addons"
],
"windows": {
"command": "copy",
"args": [
"${workspaceFolder}/target/$env:dist",
"$env:openhab_addons"
]
},
"dependsOn": [
"mvn Compile (Offline)"
],
"problemMatcher": []
},
{
"label": "Build",
"dependsOn": [
"Copy Distribution to Addons"
],
"problemMatcher": []
},
{
"label": "Tail events.log",
"type": "shell",
"command": "tail",
"args": [
"-n",
"50",
"-F",
"$openhab_logs/events.log"
],
"windows": {
"command": "Get-Content",
"args": [
"-Last",
"50",
"-Path",
"$env:openhab_logs/events.log",
"-Wait"
]
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "Tail openhab.log",
"type": "shell",
"command": "tail",
"args": [
"-n",
"50",
"-F",
"$openhab_logs/openhab.log"
],
"windows": {
"command": "Get-Content",
"args": [
"-Last",
"50",
"-Path",
"$env:openhab_logs/openhab.log",
"-Wait"
]
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
}
]
}

View File

@@ -1,13 +1,13 @@
This content is produced and maintained by the openHAB project.
* Project home: https://www.openhab.org
== Declared Project Licenses
This program and the accompanying materials are made available under the terms
of the Eclipse Public License 2.0 which is available at
https://www.eclipse.org/legal/epl-2.0/.
== Source Code
https://github.com/openhab/openhab-addons
This content is produced and maintained by the openHAB project.
* Project home: https://www.openhab.org
== Declared Project Licenses
This program and the accompanying materials are made available under the terms
of the Eclipse Public License 2.0 which is available at
https://www.eclipse.org/legal/epl-2.0/.
== Source Code
https://github.com/openhab/openhab-addons

View File

@@ -1,94 +1,94 @@
# MeyCan Binding
_Give some details about what this binding is meant for - a protocol, system, specific device._
_If possible, provide some resources like pictures (only PNG is supported currently), a video, etc. to give an impression of what can be done with this binding._
_You can place such resources into a `doc` folder next to this README.md._
_Put each sentence in a separate line to improve readability of diffs._
## Supported Things
_Please describe the different supported things / devices including their ThingTypeUID within this section._
_Which different types are supported, which models were tested etc.?_
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
- `bridge`: Short description of the Bridge, if any
- `sample`: Short description of the Thing with the ThingTypeUID `sample`
## Discovery
_Describe the available auto-discovery features here._
_Mention for what it works and what needs to be kept in mind when using it._
## Binding Configuration
_If your binding requires or supports general configuration settings, please create a folder ```cfg``` and place the configuration file ```<bindingId>.cfg``` inside it._
_In this section, you should link to this file and provide some information about the options._
_The file could e.g. look like:_
```
# Configuration for the MeyCan Binding
#
# Default secret key for the pairing of the MeyCan Thing.
# It has to be between 10-40 (alphanumeric) characters.
# This may be changed by the user for security reasons.
secret=openHABSecret
```
_Note that it is planned to generate some part of this based on the information that is available within ```src/main/resources/OH-INF/binding``` of your binding._
_If your binding does not offer any generic configurations, you can remove this section completely._
## Thing Configuration
_Describe what is needed to manually configure a thing, either through the UI or via a thing-file._
_This should be mainly about its mandatory and optional configuration parameters._
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
### `sample` Thing Configuration
| Name | Type | Description | Default | Required | Advanced |
|-----------------|---------|---------------------------------------|---------|----------|----------|
| hostname | text | Hostname or IP address of the device | N/A | yes | no |
| password | text | Password to access the device | N/A | yes | no |
| refreshInterval | integer | Interval the device is polled in sec. | 600 | no | yes |
## Channels
_Here you should provide information about available channel types, what their meaning is and how they can be used._
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
| Channel | Type | Read/Write | Description |
|---------|--------|------------|-----------------------------|
| control | Switch | RW | This is the control channel |
## Full Example
_Provide a full usage example based on textual configuration files._
_*.things, *.items examples are mandatory as textual configuration is well used by many users._
_*.sitemap examples are optional._
### Thing Configuration
```java
Example thing configuration goes here.
```
### Item Configuration
```java
Example item configuration goes here.
```
### Sitemap Configuration
```perl
Optional Sitemap configuration goes here.
Remove this section, if not needed.
```
## Any custom content here!
_Feel free to add additional sections for whatever you think should also be mentioned about your binding!_
# MeyCan Binding
_Give some details about what this binding is meant for - a protocol, system, specific device._
_If possible, provide some resources like pictures (only PNG is supported currently), a video, etc. to give an impression of what can be done with this binding._
_You can place such resources into a `doc` folder next to this README.md._
_Put each sentence in a separate line to improve readability of diffs._
## Supported Things
_Please describe the different supported things / devices including their ThingTypeUID within this section._
_Which different types are supported, which models were tested etc.?_
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
- `bridge`: Short description of the Bridge, if any
- `sample`: Short description of the Thing with the ThingTypeUID `sample`
## Discovery
_Describe the available auto-discovery features here._
_Mention for what it works and what needs to be kept in mind when using it._
## Binding Configuration
_If your binding requires or supports general configuration settings, please create a folder ```cfg``` and place the configuration file ```<bindingId>.cfg``` inside it._
_In this section, you should link to this file and provide some information about the options._
_The file could e.g. look like:_
```
# Configuration for the MeyCan Binding
#
# Default secret key for the pairing of the MeyCan Thing.
# It has to be between 10-40 (alphanumeric) characters.
# This may be changed by the user for security reasons.
secret=openHABSecret
```
_Note that it is planned to generate some part of this based on the information that is available within ```src/main/resources/OH-INF/binding``` of your binding._
_If your binding does not offer any generic configurations, you can remove this section completely._
## Thing Configuration
_Describe what is needed to manually configure a thing, either through the UI or via a thing-file._
_This should be mainly about its mandatory and optional configuration parameters._
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
### `sample` Thing Configuration
| Name | Type | Description | Default | Required | Advanced |
|-----------------|---------|---------------------------------------|---------|----------|----------|
| hostname | text | Hostname or IP address of the device | N/A | yes | no |
| password | text | Password to access the device | N/A | yes | no |
| refreshInterval | integer | Interval the device is polled in sec. | 600 | no | yes |
## Channels
_Here you should provide information about available channel types, what their meaning is and how they can be used._
_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._
| Channel | Type | Read/Write | Description |
|---------|--------|------------|-----------------------------|
| control | Switch | RW | This is the control channel |
## Full Example
_Provide a full usage example based on textual configuration files._
_*.things, *.items examples are mandatory as textual configuration is well used by many users._
_*.sitemap examples are optional._
### Thing Configuration
```java
Example thing configuration goes here.
```
### Item Configuration
```java
Example item configuration goes here.
```
### Sitemap Configuration
```perl
Optional Sitemap configuration goes here.
Remove this section, if not needed.
```
## Any custom content here!
_Feel free to add additional sections for whatever you think should also be mentioned about your binding!_

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.openhab.addons.bundles</groupId>
<artifactId>org.openhab.addons.reactor.bundles</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.openhab.binding.meycan</artifactId>
<name>openHAB Add-ons :: Bundles :: MeyCan Binding</name>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.openhab.addons.bundles</groupId>
<artifactId>org.openhab.addons.reactor.bundles</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>org.openhab.binding.meycan</artifactId>
<name>openHAB Add-ons :: Bundles :: MeyCan Binding</name>
</project>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<features name="org.openhab.binding.meycan-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository>
<feature name="openhab-binding-meycan" description="MeyCan Binding" version="${project.version}">
<feature>openhab-runtime-base</feature>
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.meycan/${project.version}</bundle>
</feature>
</features>
<?xml version="1.0" encoding="UTF-8"?>
<features name="org.openhab.binding.meycan-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
<repository>mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features</repository>
<feature name="openhab-binding-meycan" description="MeyCan Binding" version="${project.version}">
<feature>openhab-runtime-base</feature>
<bundle start-level="80">mvn:org.openhab.addons.bundles/org.openhab.binding.meycan/${project.version}</bundle>
</feature>
</features>

View File

@@ -1,34 +1,34 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.thing.ThingTypeUID;
/**
* The {@link MeyCanBindingConstants} class defines common constants, which are
* used across the whole binding.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanBindingConstants {
private static final String BINDING_ID = "meycan";
// List of all Thing Type UIDs
public static final ThingTypeUID THING_TYPE_SAMPLE = new ThingTypeUID(BINDING_ID, "sample");
// List of all Channel ids
public static final String CHANNEL_1 = "channel1";
}
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.thing.ThingTypeUID;
/**
* The {@link MeyCanBindingConstants} class defines common constants, which are
* used across the whole binding.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanBindingConstants {
private static final String BINDING_ID = "meycan";
// List of all Thing Type UIDs
public static final ThingTypeUID THING_TYPE_SAMPLE = new ThingTypeUID(BINDING_ID, "sample");
// List of all Channel ids
public static final String CHANNEL_1 = "channel1";
}

View File

@@ -1,31 +1,31 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* The {@link MeyCanConfiguration} class contains fields mapping thing configuration parameters.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanConfiguration {
/**
* Sample configuration parameters. Replace with your own.
*/
public String hostname = "";
public String password = "";
public int refreshInterval = 600;
}
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
/**
* The {@link MeyCanConfiguration} class contains fields mapping thing configuration parameters.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanConfiguration {
/**
* Sample configuration parameters. Replace with your own.
*/
public String hostname = "";
public String password = "";
public int refreshInterval = 600;
}

View File

@@ -1,104 +1,104 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import static org.openhab.binding.meycan.internal.MeyCanBindingConstants.*;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.binding.BaseThingHandler;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The {@link MeyCanHandler} is responsible for handling commands, which are
* sent to one of the channels.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanHandler extends BaseThingHandler {
private final Logger logger = LoggerFactory.getLogger(MeyCanHandler.class);
private @Nullable MeyCanConfiguration config;
public MeyCanHandler(Thing thing) {
super(thing);
}
@Override
public void handleCommand(ChannelUID channelUID, Command command) {
if (CHANNEL_1.equals(channelUID.getId())) {
if (command instanceof RefreshType) {
// TODO: handle data refresh
}
// TODO: handle command
// Note: if communication with thing fails for some reason,
// indicate that by setting the status with detail information:
// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
// "Could not control device at IP address x.x.x.x");
}
}
@Override
public void initialize() {
config = getConfigAs(MeyCanConfiguration.class);
// TODO: Initialize the handler.
// The framework requires you to return from this method quickly, i.e. any network access must be done in
// the background initialization below.
// Also, before leaving this method a thing status from one of ONLINE, OFFLINE or UNKNOWN must be set. This
// might already be the real thing status in case you can decide it directly.
// In case you can not decide the thing status directly (e.g. for long running connection handshake using WAN
// access or similar) you should set status UNKNOWN here and then decide the real status asynchronously in the
// background.
// set the thing status to UNKNOWN temporarily and let the background task decide for the real status.
// the framework is then able to reuse the resources from the thing handler initialization.
// we set this upfront to reliably check status updates in unit tests.
updateStatus(ThingStatus.UNKNOWN);
// Example for background initialization:
scheduler.execute(() -> {
boolean thingReachable = true; // <background task with long running initialization here>
// when done do:
if (thingReachable) {
updateStatus(ThingStatus.ONLINE);
} else {
updateStatus(ThingStatus.OFFLINE);
}
});
// These logging types should be primarily used by bindings
// logger.trace("Example trace message");
// logger.debug("Example debug message");
// logger.warn("Example warn message");
//
// Logging to INFO should be avoided normally.
// See https://www.openhab.org/docs/developer/guidelines.html#f-logging
// Note: When initialization can NOT be done set the status with more details for further
// analysis. See also class ThingStatusDetail for all available status details.
// Add a description to give user information to understand why thing does not work as expected. E.g.
// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
// "Can not access device as username and/or password are invalid");
}
}
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import static org.openhab.binding.meycan.internal.MeyCanBindingConstants.*;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingStatus;
import org.openhab.core.thing.binding.BaseThingHandler;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The {@link MeyCanHandler} is responsible for handling commands, which are
* sent to one of the channels.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
public class MeyCanHandler extends BaseThingHandler {
private final Logger logger = LoggerFactory.getLogger(MeyCanHandler.class);
private @Nullable MeyCanConfiguration config;
public MeyCanHandler(Thing thing) {
super(thing);
}
@Override
public void handleCommand(ChannelUID channelUID, Command command) {
if (CHANNEL_1.equals(channelUID.getId())) {
if (command instanceof RefreshType) {
// TODO: handle data refresh
}
// TODO: handle command
// Note: if communication with thing fails for some reason,
// indicate that by setting the status with detail information:
// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
// "Could not control device at IP address x.x.x.x");
}
}
@Override
public void initialize() {
config = getConfigAs(MeyCanConfiguration.class);
// TODO: Initialize the handler.
// The framework requires you to return from this method quickly, i.e. any network access must be done in
// the background initialization below.
// Also, before leaving this method a thing status from one of ONLINE, OFFLINE or UNKNOWN must be set. This
// might already be the real thing status in case you can decide it directly.
// In case you can not decide the thing status directly (e.g. for long running connection handshake using WAN
// access or similar) you should set status UNKNOWN here and then decide the real status asynchronously in the
// background.
// set the thing status to UNKNOWN temporarily and let the background task decide for the real status.
// the framework is then able to reuse the resources from the thing handler initialization.
// we set this upfront to reliably check status updates in unit tests.
updateStatus(ThingStatus.UNKNOWN);
// Example for background initialization:
scheduler.execute(() -> {
boolean thingReachable = true; // <background task with long running initialization here>
// when done do:
if (thingReachable) {
updateStatus(ThingStatus.ONLINE);
} else {
updateStatus(ThingStatus.OFFLINE);
}
});
// These logging types should be primarily used by bindings
// logger.trace("Example trace message");
// logger.debug("Example debug message");
// logger.warn("Example warn message");
//
// Logging to INFO should be avoided normally.
// See https://www.openhab.org/docs/developer/guidelines.html#f-logging
// Note: When initialization can NOT be done set the status with more details for further
// analysis. See also class ThingStatusDetail for all available status details.
// Add a description to give user information to understand why thing does not work as expected. E.g.
// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
// "Can not access device as username and/or password are invalid");
}
}

View File

@@ -1,55 +1,55 @@
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import static org.openhab.binding.meycan.internal.MeyCanBindingConstants.*;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingTypeUID;
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.thing.binding.ThingHandlerFactory;
import org.osgi.service.component.annotations.Component;
/**
* The {@link MeyCanHandlerFactory} is responsible for creating things and thing
* handlers.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
@Component(configurationPid = "binding.meycan", service = ThingHandlerFactory.class)
public class MeyCanHandlerFactory extends BaseThingHandlerFactory {
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_SAMPLE);
@Override
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID);
}
@Override
protected @Nullable ThingHandler createHandler(Thing thing) {
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (THING_TYPE_SAMPLE.equals(thingTypeUID)) {
return new MeyCanHandler(thing);
}
return null;
}
}
/**
* Copyright (c) 2010-2023 Contributors to the openHAB project
*
* See the NOTICE file(s) distributed with this work for additional
* information.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.openhab.binding.meycan.internal;
import static org.openhab.binding.meycan.internal.MeyCanBindingConstants.*;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingTypeUID;
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.thing.binding.ThingHandlerFactory;
import org.osgi.service.component.annotations.Component;
/**
* The {@link MeyCanHandlerFactory} is responsible for creating things and thing
* handlers.
*
* @author Martin Linkwitz - Initial contribution
*/
@NonNullByDefault
@Component(configurationPid = "binding.meycan", service = ThingHandlerFactory.class)
public class MeyCanHandlerFactory extends BaseThingHandlerFactory {
private static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(THING_TYPE_SAMPLE);
@Override
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID);
}
@Override
protected @Nullable ThingHandler createHandler(Thing thing) {
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (THING_TYPE_SAMPLE.equals(thingTypeUID)) {
return new MeyCanHandler(thing);
}
return null;
}
}

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon:addon id="meycan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:addon="https://openhab.org/schemas/addon/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/addon/v1.0.0 https://openhab.org/schemas/addon-1.0.0.xsd">
<type>binding</type>
<name>MeyCan Binding</name>
<description>This is the binding for MeyCan.</description>
</addon:addon>
<?xml version="1.0" encoding="UTF-8"?>
<addon:addon id="meycan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:addon="https://openhab.org/schemas/addon/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/addon/v1.0.0 https://openhab.org/schemas/addon-1.0.0.xsd">
<type>binding</type>
<name>MeyCan Binding</name>
<description>This is the binding for MeyCan.</description>
</addon:addon>

View File

@@ -1,3 +1,3 @@
# FIXME: please add all English translations to this file so the texts can be translated using Crowdin
# FIXME: to generate the content of this file run: mvn i18n:generate-default-translations
# FIXME: see also: https://www.openhab.org/docs/developer/utils/i18n.html
# FIXME: please add all English translations to this file so the texts can be translated using Crowdin
# FIXME: to generate the content of this file run: mvn i18n:generate-default-translations
# FIXME: see also: https://www.openhab.org/docs/developer/utils/i18n.html

View File

@@ -1,48 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="meycan"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- Sample Thing Type -->
<thing-type id="sample">
<!-- Comment this in for Things which need a Bridge to function.
<supported-bridge-type-refs>
<bridge-type-ref id="MeyCanBridge" />
</supported-bridge-type-refs>
-->
<label>MeyCan Binding Thing</label>
<description>Sample thing for MeyCan Binding</description>
<channels>
<channel id="channel1" typeId="sample-channel"/>
</channels>
<config-description>
<parameter name="hostname" type="text" required="true">
<context>network-address</context>
<label>Hostname</label>
<description>Hostname or IP address of the device</description>
</parameter>
<parameter name="password" type="text" required="true">
<context>password</context>
<label>Password</label>
<description>Password to access the device</description>
</parameter>
<parameter name="refreshInterval" type="integer" unit="s" min="1">
<label>Refresh Interval</label>
<description>Interval the device is polled in sec.</description>
<default>600</default>
<advanced>true</advanced>
</parameter>
</config-description>
</thing-type>
<!-- Sample Channel Type -->
<channel-type id="sample-channel">
<item-type>Number:Temperature</item-type>
<label>Example Temperature</label><!-- Use uppercase words, except prepositions. 2-3 words, max 25 chars -->
<description>Sample channel for MeyCan Binding</description>
</channel-type>
</thing:thing-descriptions>
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="meycan"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- Sample Thing Type -->
<thing-type id="sample">
<!-- Comment this in for Things which need a Bridge to function.
<supported-bridge-type-refs>
<bridge-type-ref id="MeyCanBridge" />
</supported-bridge-type-refs>
-->
<label>MeyCan Binding Thing</label>
<description>Sample thing for MeyCan Binding</description>
<channels>
<channel id="channel1" typeId="sample-channel"/>
</channels>
<config-description>
<parameter name="hostname" type="text" required="true">
<context>network-address</context>
<label>Hostname</label>
<description>Hostname or IP address of the device</description>
</parameter>
<parameter name="password" type="text" required="true">
<context>password</context>
<label>Password</label>
<description>Password to access the device</description>
</parameter>
<parameter name="refreshInterval" type="integer" unit="s" min="1">
<label>Refresh Interval</label>
<description>Interval the device is polled in sec.</description>
<default>600</default>
<advanced>true</advanced>
</parameter>
</config-description>
</thing-type>
<!-- Sample Channel Type -->
<channel-type id="sample-channel">
<item-type>Number:Temperature</item-type>
<label>Example Temperature</label><!-- Use uppercase words, except prepositions. 2-3 words, max 25 chars -->
<description>Sample channel for MeyCan Binding</description>
</channel-type>
</thing:thing-descriptions>

View File

@@ -1,49 +1,67 @@
MeyCan: PROTOCOL
ArbitartionID:
|<-- 13 bits -->| |<-- 16 bits -->|
COMMAND DEVICE_ID
ABC 0x14 6A
COMMAND: The Command or data type transfered. -> 2^11 = 2048 Package-Types
DEVICE_ID: A unique id for the device within the CAN Network (Home) -> 2^18 bit = 65.536 devices allowed
Packages
---------------------------------
0xF00: HELLO->ADOPT
Payload:
2 bytes | Byte -> Software-Version (1.0)
2 bytes | Byte -> Hw Version (4.0)
2 bytes | DeviceId -> DeviceId Explicit
0x050: Input Switch Triggered
-> Broadcast
---------------------------------
Payload:
1 byte| PinId -> Id of the pin of the local board.
1 byte| State -> 1 for Switched, 0 for Unswitched
0x055: Command Set Switch
-> Broadcast
---------------------------------
2 bytes | TargetDeviceId -> The id of the device to set the pin of
1 byte | PinId -> Idof the pin of the board
1 byte | state -> 1 to swtich on, 0 to switch off
0x010: Request Remote Pin State
-> Broadcast
---------------------------------
2 bytes | TargetDeviceId -> The id of the board to request the remote pin states from. This needs to be a control device (not UP)
1 byte | 0: Request
| 1: Response
DAT |
-- n Items of format ------------
* 2 byte: DeviceId
* 1 byte: The State
MeyCan: PROTOCOL
ArbitartionID:
|<-- 13 bits -->| |<-- 16 bits -->|
COMMAND DEVICE_ID
ABC 0x14 6A
COMMAND: The Command or data type transfered. -> 2^11 = 2048 Package-Types
DEVICE_ID: A unique id for the device within the CAN Network (Home) -> 2^18 bit = 65.536 devices allowed
Packages
---------------------------------
0xF00: HELLO->ADOPT
Payload:
2 bytes | Byte -> Software-Version (1.0)
2 bytes | Byte -> Hw Version (4.0)
1 bytes | DeviceTypeId
| 1: Switch
| 2: Switch + Rule
| 3: UP
0x050: Input Switch Triggered
-> Broadcast
---------------------------------
Payload:
1 byte| PinId -> Id of the pin of the local board.
1 byte| State -> 1 for Switched, 0 for Unswitched
0x055: Command Set Switch
-> Broadcast
---------------------------------
2 bytes | TargetDeviceId -> The id of the device to set the pin of
1 byte | PinId -> Idof the pin of the board
1 byte | state -> 1 to swtich on, 0 to switch off
0x010: Request Remote Pin State
-> Broadcast
---------------------------------
2 bytes | TargetDeviceId -> The id of the board to request the remote pin states from. This needs to be a control device (not UP)
1 byte | 0: Request
| 1: Response
DAT |
-- n Items of format ------------
* 2 byte: DeviceId
* 1 byte: The State
0x009: Debug
-> Debug Package
----------------------------------
some debug information
0xAA AudioStream #1
0xAB AudioStream #2
0xBA AudioStream #3
0xBB AudioStream #4
0xAAXX -> XX = Sequence Counter
0xY -> Reserve - Flag
|<-- 4 bits -->| |<-- 24 bits -->|
-> 3 Byte / Paket

Binary file not shown.

View File

@@ -1,7 +1,7 @@
{
"configuration": "pinout=48pin_standard,eeprom=keep,resetpin=reset,BOD=2v6,clock=internal_8MHz,bootloader=no_bootloader",
"board": "MegaCoreX:megaavr:809",
"sketch": "Switch.ino",
"port": "COM6",
"programmer": "jtag2updi"
{
"configuration": "pinout=48pin_standard,eeprom=keep,resetpin=reset,BOD=2v6,clock=internal_8MHz,bootloader=no_bootloader",
"board": "MegaCoreX:megaavr:809",
"sketch": "Switch.ino",
"port": "COM6",
"programmer": "jtag2updi"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,255 +1,232 @@
#include "MeyCan.h";
#include <SPI.h>;
#include <mcp2515.h>;
PinState *MeyPin = NULL;
CanInterface *CanBusses = NULL;
uint16_t myDeviceId;
byte _deviceTypeId = 0;
byte _majorHardwareVersion = 0;
byte _minorHardwareVersion = 0;
void SetupMeyPin(PinState *state)
{
pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW);
state->pin_state = false;
}
void InitCanInterface(MCP2515 *interface, can_frame *frame) // can_frame is NULL. Reuse ForEach Method for smaller footprint
{
interface->reset();
interface->setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
interface->setNormalMode();
SendVersionPackage(interface);
}
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace))
{
CanBusses->ForEachInterface(handle);
}
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId)
{
_majorHardwareVersion = majorHardwareVersion;
_minorHardwareVersion = minorHardwareVersion;
_deviceTypeId = deviceTypeId;
CalculateMyDeviceId();
if (MeyPin != NULL);
MeyPin->ForEach(SetupMeyPin);
if (CanBusses != NULL)
{
CanBusses->ForEach(InitCanInterface, NULL);
}
}
void AddCanInterface(byte pinId)
{
MCP2515* newCanInterface = new MCP2515(pinId);
CanInterface* canInterface = new CanInterface();
canInterface->interface = newCanInterface;
if (CanBusses == NULL)
CanBusses = canInterface;
else
CanBusses->AddCanInterface(canInterface);
}
void SetMeyPin(byte index, byte meyPinId, byte pinId)
{
PinState* newState = new PinState();
newState->Init(pinId, (byte) meyPinId);
if (MeyPin == NULL)
MeyPin = newState;
else
MeyPin->AddPinState(newState);
}
bool CheckPinStatus(PinState * state)
{
if (!state->is_input)
return false;
bool newValue = ReadPin(state);
if (newValue != state->pin_state)
{
delay(10);
newValue = ReadPin(state);
if (newValue != state->pin_state)
{
state->pin_state = newValue;
SendSwitchedTriggeredCanPackage(state->meyPinId, state->pin_state);
}
}
return false;
}
void CheckMeyPinsTriggered()
{
MeyPin->ForEach(CheckPinStatus);
}
bool ReadPin(PinState * state)
{
if (state->pin_id == PIN_PD2)
return digitalReadFast(PIN_PD2);
else if (state->pin_id == PIN_PC7)
return digitalReadFast(PIN_PC7);
else if (state->pin_id == PIN_PD1)
return digitalReadFast(PIN_PD1);
else if (state->pin_id == PIN_PD0)
return digitalReadFast(PIN_PD0);
else if (state->pin_id == PIN_PD6)
return digitalReadFast(PIN_PD6);
else if (state->pin_id == PIN_PD5)
return digitalReadFast(PIN_PD5);
else if (state->pin_id == PIN_PD4)
return digitalReadFast(PIN_PD4);
else if (state->pin_id == PIN_PD3)
return digitalReadFast(PIN_PD3);
else
return digitalRead(state->pin_id);
}
void HandleFrame(can_frame *frame, MCP2515 *source)
{
CanBusses->ForEach(DoSendCanPkg, frame, source);
HandleTriggerMeypinCanPackage(frame);
}
void HandleTriggerMeypinCanPackage(can_frame *frame)
{
if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID)
{
uint16_t adressedDeviceId = ((uint16_t )frame->data[0] << 8) | frame->data[1] ;
if (adressedDeviceId != myDeviceId) return;
byte meyPinId = frame->data[2];
bool state = frame->data[3] > 0;
PinState *adressedPin = MeyPin->Find(meyPinId);
if (adressedPin != NULL)
{
if (adressedPin->is_input == true)
{
pinMode(adressedPin->pin_id, OUTPUT);
adressedPin->is_input = false;
}
bool pinChanged = adressedPin->pin_state != state;
adressedPin->pin_state = state;
if (pinChanged) {
digitalWrite(adressedPin->pin_id, state);
SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state);
}
}
}
}
byte CircularShift(byte b)
{
return (b << 1) | (b >> 7 & 1);
}
uint16_t GetDeviceId(uint32_t canFrameId)
{
return canFrameId & 0xFFFF;
}
uint16_t GetPackageType(uint32_t canFrameId)
{
return (canFrameId / 0x10000) & 0xFFF;
}
byte GetDeviceIdLow() {
return (SIGROW.SERNUM0 ^
CircularShift(SIGROW.SERNUM2) << 1 ^
CircularShift( CircularShift(SIGROW.SERNUM4)) ^
CircularShift( CircularShift( CircularShift(SIGROW.SERNUM6))) ^
CircularShift( CircularShift( CircularShift( CircularShift(SIGROW.SERNUM8)))));
}
byte GetDeviceIdHigh() {
return (SIGROW.SERNUM1 ^
CircularShift(SIGROW.SERNUM3) << 1 ^
CircularShift( CircularShift(SIGROW.SERNUM5)) ^
CircularShift( CircularShift( CircularShift(SIGROW.SERNUM7))) ^
CircularShift( CircularShift( CircularShift( CircularShift(SIGROW.SERNUM9)))));
}
uint32_t CreateCanId(uint16_t commandId)
{
return ((((uint32_t)commandId) & 0xFFF) * 0x10000) | myDeviceId | CAN_EFF_FLAG;
}
void SendVersionPackage(MCP2515 *interface)
{
can_frame toSend;
toSend.can_id = CreateCanId(HELP_PACKAGE_CAN_ID);
toSend.can_dlc = 5;
toSend.data[0] = SOFTWARE_VERSION_HIGH;
toSend.data[1] = SOFTWARE_VERSION_LOW;
toSend.data[2] = _majorHardwareVersion;
toSend.data[3] = _minorHardwareVersion;
toSend.data[4] = _deviceTypeId;
DoSendCanPkg(interface, &toSend);
}
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state)
{
can_frame toSend;
toSend.can_id = CreateCanId(TRIGGER_SWITCH_CAN_ID);
toSend.can_dlc = 4;
toSend.data[0] = (targetCanId & 0xFF00) >> 8;
toSend.data[1] = targetCanId & 0xFF;
toSend.data[2] = pinId;
toSend.data[3] = state;
HandleFrame(&toSend, NULL);
}
void SendSwitchedTriggeredCanPackage(byte pinId, int state)
{
can_frame toSend;
toSend.can_id = CreateCanId(SWITCH_TRIGGERED_CAN_ID);
toSend.can_dlc = 2;
toSend.data[0] = pinId;
toSend.data[1] = state;
DoSendCanPkg(&toSend);
}
void DoSendCanPkg(can_frame *frame)
{
if (CanBusses != NULL)
CanBusses->ForEach(DoSendCanPkg, frame);
}
void DoSendCanPkg(MCP2515 *interface, can_frame *frame)
{
byte cnt = 0;
while (interface->sendMessage(frame))
{
if (++cnt > 10) return;
}
}
void CalculateMyDeviceId()
{
myDeviceId = (GetDeviceIdHigh() << 8) | GetDeviceIdLow();
}
#include "MeyCan.h";
#include <SPI.h>;
#include <mcp2515.h>;
PinState *MeyPin = NULL;
CanInterface *CanBusses = NULL;
uint16_t myDeviceId;
byte _deviceTypeId = 0;
byte _majorHardwareVersion = 0;
byte _minorHardwareVersion = 0;
void (*LocalPinChangedHandler)(can_frame *frame);
void SetupMeyPin(PinState *state) {
pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW);
state->pin_state = false;
}
void InitCanInterface(MCP2515 *interface, can_frame *frame) // can_frame is NULL. Reuse ForEach Method for smaller footprint
{
interface->reset();
interface->setBitrate(CAN_1000KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
interface->setNormalMode();
SendVersionPackage(interface);
}
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace)) {
CanBusses->ForEachInterface(handle);
}
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId) {
_majorHardwareVersion = majorHardwareVersion;
_minorHardwareVersion = minorHardwareVersion;
_deviceTypeId = deviceTypeId;
if (MeyPin != NULL)
;
MeyPin->ForEach(SetupMeyPin);
if (CanBusses != NULL) {
CanBusses->ForEach(InitCanInterface, NULL);
}
}
void AddCanInterface(byte pinId) {
MCP2515 *newCanInterface = new MCP2515(pinId);
CanInterface *canInterface = new CanInterface();
canInterface->interface = newCanInterface;
if (CanBusses == NULL)
CanBusses = canInterface;
else
CanBusses->AddCanInterface(canInterface);
}
void AddLocalPinChangedHandler(void (*localPinChangedHandler)(can_frame *frame)) {
LocalPinChangedHandler = localPinChangedHandler;
}
void SetDevicedId(byte high, byte low) {
myDeviceId = (high << 8) | low;
}
void SetMeyPin(byte meyPinId, byte pinId) {
PinState *newState = new PinState();
newState->Init(pinId, (byte)meyPinId);
if (MeyPin == NULL)
MeyPin = newState;
else
MeyPin->AddPinState(newState);
}
bool CheckPinStatus(PinState *state) {
if (!state->is_input)
return false;
bool newValue = ReadPin(state);
if (newValue != state->pin_state) {
delay(10);
newValue = ReadPin(state);
if (newValue != state->pin_state) {
state->pin_state = newValue;
SendSwitchedTriggeredCanPackage(state->meyPinId, state->pin_state);
}
}
return false;
}
void CheckMeyPinsTriggered() {
MeyPin->ForEach(CheckPinStatus);
}
bool ReadPin(PinState *state) {
return digitalRead(state->pin_id);
}
void HandleFrame(can_frame *frame, MCP2515 *source) {
CanBusses->ForEach(DoSendCanPkg, frame, source);
HandleTriggerMeypinCanPackage(frame);
}
void HandleTriggerMeypinCanPackage(can_frame *frame) {
if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID) {
uint16_t adressedDeviceId = ((uint16_t)frame->data[0] << 8) | frame->data[1];
if (adressedDeviceId != myDeviceId) return;
byte meyPinId = frame->data[2];
bool state = frame->data[3] > 0;
PinState *adressedPin = MeyPin->Find(meyPinId);
if (adressedPin != NULL) {
if (adressedPin->is_input == true) {
pinMode(adressedPin->pin_id, OUTPUT);
adressedPin->is_input = false;
}
bool pinChanged = adressedPin->pin_state != state;
adressedPin->pin_state = state;
if (pinChanged) {
digitalWrite(adressedPin->pin_id, state);
SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state);
}
}
}
}
byte CircularShift(byte b) {
return (b << 1) | (b >> 7 & 1);
}
uint16_t GetDeviceId(uint32_t canFrameId) {
return canFrameId & 0xFFFF;
}
uint16_t GetPackageType(uint32_t canFrameId) {
return (canFrameId / 0x10000) & 0xFFF;
}
uint32_t CreateCanId(uint16_t commandId) {
return ((((uint32_t)commandId) & 0xFFF) * 0x10000) | myDeviceId | CAN_EFF_FLAG;
}
void SendVersionPackage(MCP2515 *interface) {
can_frame toSend;
toSend.can_id = CreateCanId(HELP_PACKAGE_CAN_ID);
toSend.can_dlc = 5;
toSend.data[0] = SOFTWARE_VERSION_HIGH;
toSend.data[1] = SOFTWARE_VERSION_LOW;
toSend.data[2] = _majorHardwareVersion;
toSend.data[3] = _minorHardwareVersion;
toSend.data[4] = _deviceTypeId;
DoSendCanPkg(interface, &toSend);
}
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state) {
can_frame toSend;
toSend.can_id = CreateCanId(TRIGGER_SWITCH_CAN_ID);
toSend.can_dlc = 4;
toSend.data[0] = (targetCanId & 0xFF00) >> 8;
toSend.data[1] = targetCanId & 0xFF;
toSend.data[2] = pinId;
toSend.data[3] = state;
HandleFrame(&toSend, NULL);
}
void BroadcastDebugPackage(uint8_t length, byte *data) {
can_frame toSend;
toSend.can_id = CreateCanId(DEBUG_PKG_CAN_ID);
toSend.can_dlc = length;
for (int i = 0; i < length; i++) {
toSend.data[i] = data[i];
}
HandleFrame(&toSend, NULL);
}
void BroadcastDebugPackage(byte b0, byte b1) {
byte data[2];
data[0] = b0;
data[1] = b1;
BroadcastDebugPackage(2, data);
}
void BroadcastDebugPackage(byte b0, byte b1, byte b2) {
byte data[3];
data[0] = b0;
data[1] = b1;
data[2] = b2;
BroadcastDebugPackage(3, data);
}
void SendSwitchedTriggeredCanPackage(byte pinId, int state) {
can_frame toSend;
toSend.can_id = CreateCanId(SWITCH_TRIGGERED_CAN_ID);
toSend.can_dlc = 2;
toSend.data[0] = pinId;
toSend.data[1] = state;
DoSendCanPkg(&toSend);
if (LocalPinChangedHandler) {
LocalPinChangedHandler(&toSend);
}
}
void DoSendCanPkg(can_frame *frame) {
if (CanBusses != NULL)
CanBusses->ForEach(DoSendCanPkg, frame);
}
void DoSendCanPkg(MCP2515 *interface, can_frame *frame) {
byte cnt = 0;
while (interface->sendMessage(frame)) {
if (++cnt > 10) return;
}
}

View File

@@ -1,128 +1,139 @@
#ifndef MEYCAN_H
#define MEYCAN_H
#include <SPI.h>
#include <mcp2515.h>
typedef struct CanInterface
{
MCP2515 *interface;
CanInterface *next = NULL;
void ForEachInterface(void (*handle)( MCP2515 *interface))
{
if (this->interface != NULL)
handle(this->interface);
if (this->next != NULL)
this->next->ForEachInterface(handle);
}
void ForEach(void (*handle)( MCP2515 *interface, can_frame *frame), can_frame *frame, MCP2515* exclude = NULL)
{
if (this->interface != NULL && this->interface != exclude)
handle(this->interface, frame);
if (this->next != NULL)
this->next->ForEach(handle, frame, exclude);
}
void AddCanInterface(CanInterface *newCanInterface)
{
if (next == NULL)
{
this->next = newCanInterface;
newCanInterface->next = NULL;
} else {
next->AddCanInterface(newCanInterface);
}
}
};
typedef struct PinState
{
int pin_id;
bool pin_state;
bool is_input;
byte meyPinId;
PinState *next = NULL;
PinState() {}
void Init(int pin_id, byte meyPinId)
{
this->pin_id = pin_id;
this->pin_state = true;
this->is_input = true;
this->meyPinId = meyPinId;
}
void AddPinState(PinState *nextPinState)
{
if (next == NULL)
{
this->next = nextPinState;
nextPinState->next = NULL;
} else {
next->AddPinState(nextPinState);
}
}
PinState* Find(byte meyPinId)
{
if (this->meyPinId == meyPinId)
return this;
if (this->next != NULL)
return this->next->Find(meyPinId);
return NULL;
}
void ForEach(void (*handle)(PinState *theState))
{
handle(this);
if (this->next != NULL)
this->next->ForEach(handle);
}
};
const byte SOFTWARE_VERSION_HIGH = 5;
const byte SOFTWARE_VERSION_LOW = 0;
const byte HARDWARE_VERSION_HIGH = 7;
const byte HARDWARE_VERSION_LOW = 0;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055;
void AddCanInterface(byte pinId);
void SetMeyPin(byte index, byte meyPinId, byte pinId);
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId);
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace));
bool ReadPin(PinState *state);
bool CheckPinStatus(PinState * state);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */
void HandleFrame(can_frame *frame, MCP2515 *source);
void HandleTriggerMeypinCanPackage(can_frame *frame);
byte CircularShift(byte b);
uint16_t GetDeviceId(uint32_t canFrameId);
uint16_t GetPackageType(uint32_t canFrameId);
byte GetDeviceIdLow();
byte GetDeviceIdHigh();
uint32_t CreateCanId(uint16_t commandId);
void SendVersionPackage(MCP2515 *interface);
void SendSwitchedTriggeredCanPackage(byte pinId, int state);
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state);
void DoSendCanPkg(can_frame *frame);
void DoSendCanPkg(MCP2515 *interface, can_frame *frame);
void CalculateMyDeviceId();
#endif
#ifndef MEYCAN_H
#define MEYCAN_H
#include <SPI.h>
#include <mcp2515.h>
typedef struct CanInterface
{
MCP2515 *interface;
CanInterface *next = NULL;
void ForEachInterface(void (*handle)( MCP2515 *interface))
{
if (this->interface != NULL)
handle(this->interface);
if (this->next != NULL)
this->next->ForEachInterface(handle);
}
void ForEach(void (*handle)( MCP2515 *interface, can_frame *frame), can_frame *frame, MCP2515* exclude = NULL)
{
if (this->interface != NULL && this->interface != exclude)
handle(this->interface, frame);
if (this->next != NULL)
this->next->ForEach(handle, frame, exclude);
}
void AddCanInterface(CanInterface *newCanInterface)
{
if (next == NULL)
{
this->next = newCanInterface;
newCanInterface->next = NULL;
} else {
next->AddCanInterface(newCanInterface);
}
}
};
typedef struct PinState
{
int pin_id;
bool pin_state;
bool is_input;
byte meyPinId;
PinState *next = NULL;
PinState() {}
void Init(int pin_id, byte meyPinId)
{
this->pin_id = pin_id;
this->pin_state = true;
this->is_input = true;
this->meyPinId = meyPinId;
}
void AddPinState(PinState *nextPinState)
{
if (next == NULL)
{
this->next = nextPinState;
nextPinState->next = NULL;
} else {
next->AddPinState(nextPinState);
}
}
PinState* Find(byte meyPinId)
{
if (this->meyPinId == meyPinId)
return this;
if (this->next != NULL)
return this->next->Find(meyPinId);
return NULL;
}
void ForEach(void (*handle)(PinState *theState))
{
handle(this);
if (this->next != NULL)
this->next->ForEach(handle);
}
};
const byte SOFTWARE_VERSION_HIGH = 5;
const byte SOFTWARE_VERSION_LOW = 0;
const byte HARDWARE_VERSION_HIGH = 7;
const byte HARDWARE_VERSION_LOW = 0;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055;
const uint16_t DEBUG_PKG_CAN_ID = 0x0009;
void SetDevicedId(byte high, byte low);
void SetMeyPin(byte meyPinId, byte pinId);
// we need to put the local change to the rules engine. otherwise local changes on a pin will not come to the rules state.
void AddLocalPinChangedHandler(void (*localPinChangedHandler)(can_frame *frame));
void AddCanInterface(byte pinId);
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId);
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace));
bool ReadPin(PinState *state);
bool CheckPinStatus(PinState * state);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */
void HandleFrame(can_frame *frame, MCP2515 *source);
void HandleTriggerMeypinCanPackage(can_frame *frame);
byte CircularShift(byte b);
uint16_t GetDeviceId(uint32_t canFrameId);
uint16_t GetPackageType(uint32_t canFrameId);
byte GetDeviceIdLow();
byte GetDeviceIdHigh();
uint32_t CreateCanId(uint16_t commandId);
void SendVersionPackage(MCP2515 *interface);
void SendSwitchedTriggeredCanPackage(byte pinId, int state);
void BroadcastDebugPackage(byte b0, byte b1);
void BroadcastDebugPackage(byte b0, byte b1, byte b2);
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state);
void DoSendCanPkg(can_frame *frame);
void DoSendCanPkg(MCP2515 *interface, can_frame *frame);
void CalculateMyDeviceId();
#endif

View File

@@ -1,114 +1,117 @@
#include "MeyRule.h"
#include "MeyCan.h"
#include <Arduino.h>
#include <mcp2515.h>;
RemotePinInfo remotePinInfo = RemotePinInfo();
Rule *rules = NULL;
void PutRule(Rule *rule)
{
if (rules == NULL)
rules = rule;
else
rules->AddRule(rule);
}
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = false;
rule->inverse = false;
rule->lastPinState = false;
PutRule(rule);
}
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true;
rule->inverse = false;
rule->lastPinState = false;
PutRule(rule);
}
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true;
rule->inverse = true;
rule->lastPinState = false;
PutRule(rule);
}
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule)
{
RemotePinInfo *currentRemotePinInfo = remotePinInfo.FindOrAdd(rule->targetDevId);
if (currentRemotePinInfo == NULL) return;
// check the new state with the last one. Needs to be done, as the UP switch might
// send it multiple times like "01 01" "01 01" for a single tip.(antibeat)
bool lastPinState = rule->lastPinState;
bool pinState = dt > 0;
if (rule->triggeredOnce && lastPinState == pinState) return;
rule->lastPinState = pinState;
rule->triggeredOnce = true;
if (rule->inverse)
pinState = !pinState;
if (rule->toggle)
pinState = (currentRemotePinInfo->getPinState(rule->targetMeyPinId) ^ true);
BroadcastTriggerMeyPinCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState);
currentRemotePinInfo->setPinState(rule->targetMeyPinId, pinState);
}
void HandleTriggered(can_frame *frame)
{
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID)
{
RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(GetDeviceId(frame->can_id) );
if (currentPinState == NULL)
return;
currentPinState->setPinState(frame->data[0], frame->data[1]);
}
}
void HandleRules(can_frame *frame)
{
HandleTriggered(frame);
if (rules == NULL) return;
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID)
{
uint16_t deviceId = GetDeviceId(frame->can_id);
uint8_t dt = frame->data[1];
uint8_t state = frame->data[0];
rules->Traverse(deviceId, dt, state, CheckRule);
}
}
#include "MeyRule.h"
#include "MeyCan.h"
#include <Arduino.h>
#include <mcp2515.h>;
RemotePinInfo remotePinInfo = RemotePinInfo();
Rule *rules = NULL;
void PutRule(Rule *rule) {
if (rules == NULL)
rules = rule;
else
rules->AddRule(rule);
}
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) {
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->target.devId = targetDevId;
rule->target.meyPinId = targetMeyPinId;
rule->target.lastPinState = false;
rule->toggle = false;
rule->inverse = false;
PutRule(rule);
}
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) {
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->target.devId = targetDevId;
rule->target.meyPinId = targetMeyPinId;
rule->target.lastPinState = false;
rule->toggle = true;
rule->inverse = false;
PutRule(rule);
}
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId) {
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->target.devId = targetDevId;
rule->target.meyPinId = targetMeyPinId;
rule->target.lastPinState = false;
rule->toggle = true;
rule->inverse = true;
PutRule(rule);
}
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule) {
RemotePinInfo *currentRemotePinInfo = remotePinInfo.FindOrAdd(rule->target.devId);
if (currentRemotePinInfo == NULL) return;
// check the new state with the last one. Needs to be done, as the UP switch might
// send it multiple times like "01 01" "01 01" for a single tip.(antibeat)
bool lastPinState = rule->target.lastPinState;
bool pinState = dt > 0;
if (rule->triggeredOnce && lastPinState == pinState) return;
rule->target.lastPinState = pinState;
rule->triggeredOnce = true;
if (rule->inverse)
pinState = !pinState;
if (rule->toggle)
pinState = (currentRemotePinInfo->getPinState(rule->target.meyPinId) ^ true);
currentRemotePinInfo->setPinState(rule->target.meyPinId, pinState);
BroadcastTriggerMeyPinCanPackage(rule->target.devId, rule->target.meyPinId, pinState);
}
void HandleTriggered(can_frame *frame) {
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID) {
RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(GetDeviceId(frame->can_id));
if (currentPinState == NULL) {
return;
}
currentPinState->setPinState(frame->data[0], frame->data[1]);
}
}
void SetLocalPinState(can_frame *frame)
{
HandleTriggered(frame);
}
void HandleRules(can_frame *frame) {
if (rules != NULL) {
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID) {
uint16_t deviceId = GetDeviceId(frame->can_id);
uint8_t dt = frame->data[1];
uint8_t state = frame->data[0];
rules->Traverse(deviceId, dt, state, CheckRule);
}
}
HandleTriggered(frame);
}

View File

@@ -1,113 +1,107 @@
#ifndef MEYRULE_H
#define MEYRULE_H
#include <Arduino.h>
#include <mcp2515.h>;
struct Rule
{
uint16_t sourceDevId;
byte sourceMeyPinId;
uint16_t targetDevId;
byte targetMeyPinId;
bool toggle;
bool inverse;
Rule *nextRule = NULL;
bool lastPinState = false;
bool triggeredOnce = false;
void AddRule(Rule *rule)
{
if (this->nextRule == NULL)
{
this->nextRule = rule;
rule->nextRule = NULL;
} else {
this->nextRule->AddRule(rule);
}
}
void Traverse( uint16_t deviceId, uint8_t dt, uint8_t state, void (*handle)(uint16_t, uint8_t, uint8_t, Rule*))
{
if ( this->sourceDevId == deviceId && this->sourceMeyPinId == state)
handle(deviceId, dt, state, this);
if (this->nextRule != NULL)
this->nextRule->Traverse(deviceId, dt, state, handle);
}
};
typedef struct RemotePinInfo
{
const byte MAX_REMOTE_PIN_COUNT = 64;
uint16_t DeviceId = 0; // the id of the device
uint8_t pinState = 0; // bitmap of 8 MeyPin states of the device. 0000 0100, MeyPin #3 is HIGH in this example
RemotePinInfo *next = NULL;
bool getPinState(byte meyPin)
{
return (this->pinState >> (meyPin - 1)) & 1;
}
void setPinState(byte meyPin, bool state)
{
if (state)
this->pinState = this->pinState | (1 << (meyPin - 1)); // 0001 0000
else
this->pinState = this->pinState & (~(1 << (meyPin - 1))); // 1110 1111 -> not
}
int16_t Count()
{
if (this->next == NULL) return 1;
return this->next->Count() + 1;
}
RemotePinInfo* FindOrAdd(uint16_t deviceId, byte count = 0)
{
if (count > MAX_REMOTE_PIN_COUNT)
return NULL;
if (this->DeviceId == 0 && this->pinState == 0)
{
this->DeviceId = deviceId;
this->pinState = 0;
}
if (this->DeviceId == deviceId)
{
//ToggleDebug();
return this;
}
if (next != NULL)
{
return next->FindOrAdd(deviceId, count + 1);
}
RemotePinInfo *theNext = new RemotePinInfo;
theNext->DeviceId = deviceId;
theNext->pinState = 0;
theNext->next = NULL;
this->next = theNext;
return this->next;
}
};
extern RemotePinInfo remotePinInfo;
extern Rule *rules;
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void HandleRules(can_frame *frame);
void PutRule(Rule *rule);
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule);
#endif
#ifndef MEYRULE_H
#define MEYRULE_H
#include <Arduino.h>
#include <mcp2515.h>;
struct TargetPin{
uint16_t devId;
byte meyPinId;
bool lastPinState = false;
};
struct Rule {
uint16_t sourceDevId;
byte sourceMeyPinId;
TargetPin target = TargetPin();
bool toggle;
bool inverse;
Rule *nextRule = NULL;
bool triggeredOnce = false;
void AddRule(Rule *rule) {
if (this->nextRule == NULL) {
this->nextRule = rule;
rule->nextRule = NULL;
} else {
this->nextRule->AddRule(rule);
}
}
void Traverse(uint16_t deviceId, uint8_t dt, uint8_t state, void (*handle)(uint16_t, uint8_t, uint8_t, Rule *)) {
if (this->sourceDevId == deviceId && this->sourceMeyPinId == state)
handle(deviceId, dt, state, this);
if (this->nextRule != NULL)
this->nextRule->Traverse(deviceId, dt, state, handle);
}
};
typedef struct RemotePinInfo {
const byte MAX_REMOTE_PIN_COUNT = 64;
uint16_t DeviceId = 0; // the id of the device
uint8_t pinState = 0; // bitmap of 8 MeyPin states of the device. 0000 0100, MeyPin #3 is HIGH in this example
RemotePinInfo *next = NULL;
bool getPinState(byte meyPin) {
return (this->pinState >> (meyPin - 1)) & 1;
}
void setPinState(byte meyPin, bool state) {
if (state)
this->pinState = this->pinState | (1 << (meyPin - 1)); // 0001 0000
else
this->pinState = this->pinState & (~(1 << (meyPin - 1))); // 1110 1111 -> not
}
int16_t Count() {
if (this->next == NULL) return 1;
return this->next->Count() + 1;
}
RemotePinInfo *FindOrAdd(uint16_t deviceId, byte count = 0) {
if (count > MAX_REMOTE_PIN_COUNT)
return NULL;
if (this->DeviceId == 0 && this->pinState == 0) {
this->DeviceId = deviceId;
this->pinState = 0;
}
if (this->DeviceId == deviceId) {
//ToggleDebug();
return this;
}
if (next != NULL) {
return next->FindOrAdd(deviceId, count + 1);
}
RemotePinInfo *theNext = new RemotePinInfo;
theNext->DeviceId = deviceId;
theNext->pinState = 0;
theNext->next = NULL;
this->next = theNext;
return this->next;
}
};
extern RemotePinInfo remotePinInfo;
extern Rule *rules;
void SetLocalPinState(can_frame *frame);
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void HandleRules(can_frame *frame);
void PutRule(Rule *rule);
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule);
#endif

View File

@@ -1,96 +1,117 @@
#include <SPI.h>;
#include <mcp2515.h>;
#include "MeyCan.h";
#include "MeyRule.h";
const int16_t SW_FLUR = 0XD238;
const int16_t SW_ANBAU = 0x87A9;
const int16_t SW_WOHNZIMMER = 0x87CA;
const int16_t UP_WOHNZIMMER_TUER = 0x051F;
const int16_t UP_WOHNZIMMER_TERASSE = 0x05df;
const int16_t UP_FLUR_EINGANG = 0x0769;
const int16_t UP_BUERO = 0x1177;
const int16_t UP_FLUR_BUERO = 0x05A1;
const int16_t UP_FLUR_KUECHE = 0x01EF;
const int16_t UP_KINDERZIMMER = 0x0196;
const int16_t UP_FLUR_ELTERN = 0x0632;
const int16_t UP_KUECHE_FLUR = 0x07F5;
const int16_t UP_KUECHE_BAD = 0x0585;
struct can_frame incomingCanFrame;
void setup() {
SPI.begin();
// AddToggleInverse(UP_WOHNZIMMER_TUER, 5, SW_WOHNZIMMER, 4); // Lichtschalter Wohnzimmer Licht 1
// AddToggleInverse(UP_WOHNZIMMER_TUER, 5, SW_WOHNZIMMER, 3); // Lichtschalter Wohnzimmer Licht 2
// AddToggle(UP_WOHNZIMMER_TERASSE, 1, SW_WOHNZIMMER, 4); // Licht 1 von Terassenschalter
// AddToggle(UP_WOHNZIMMER_TERASSE, 1, SW_WOHNZIMMER, 3); // Licht 2 von Terassenschalter
//
// AddToggle(0x0769, 1, SW_WOHNZIMMER, 7); // Eingangstür Flur Licht 2
// AddToggle(0x0769, 1, SW_FLUR, 1); //Eingangstür Flur Licht 1
//
// AddToggle(UP_WOHNZIMMER_TUER, 3, SW_WOHNZIMMER, 1); // Licht 1 Wochzimmer Eingangstür
// AddToggle(UP_WOHNZIMMER_TUER, 4, SW_WOHNZIMMER, 2); // Licht 2 Wochzimmer Eingangstür
//
// AddToggle(0x1177, 1, SW_WOHNZIMMER, 6); // Licht Papa Büro
// AddToggle(0x05A1, 1, SW_WOHNZIMMER, 7); // Flurlicht von Papas Büro
// AddToggle(0x05A1, 1, SW_FLUR, 1); // Flurlicht von Papas Büro
// AddToggle(0x01EF, 1, SW_WOHNZIMMER, 7); // Flurlicht von Papas Büro
// AddToggle(0x01EF, 1, SW_FLUR, 1); // Flurlicht von Papas Büro
// AddToggle(0x0196, 3, SW_WOHNZIMMER, 7); // Flurlicht von Papas Büro
// AddToggle(0x0196, 3, SW_FLUR, 1); // Flurlicht von Papas Büro
// AddToggle(0x0632, 1, SW_FLUR, 5); // Flurlicht von Papas Büro
//
// AddToggle(UP_WOHNZIMMER_TUER, 2, SW_FLUR, 2); // Linus Zimmer hoch aus Wohnzimmer
// AddToggle(UP_WOHNZIMMER_TUER, 1, SW_FLUR, 3); // Linus Zimmer runter hoch aus Wohnzimmer
//
// AddToggle(0x0769, 2, SW_FLUR, 4); // Linus Zimmer runter hoch aus Wohnzimmer
//
//
// AddToggle(UP_KUECHE_FLUR, 1, SW_ANBAU, 2);
// AddToggle(UP_KUECHE_FLUR, 2, SW_ANBAU, 3);
// AddToggle(UP_KUECHE_BAD, 1, SW_ANBAU, 2);
// AddToggle(UP_KUECHE_BAD, 3, SW_ANBAU, 1);
// AddToggle(UP_KUECHE_BAD, 2, SW_ANBAU, 4);
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLA | 1 << 7);
delay(10); // a bit delay for mcp2515 to get the clock
SetMeyPin(0, 1, PIN_PC7);
SetMeyPin(1, 2, PIN_PC6);
SetMeyPin(2, 3, PIN_PC5);
SetMeyPin(3, 4, PIN_PC4);
SetMeyPin(4, 5, PIN_PC3);
SetMeyPin(5, 6, PIN_PC2);
SetMeyPin(6, 7, PIN_PC1);
SetMeyPin(7, 8, PIN_PC0);
AddCanInterface(PIN_PA2);
AddCanInterface(PIN_PA3);
AddCanInterface(PIN_PB0);
AddCanInterface(PIN_PB1);
SetupMeyCan(7, 0, 1);
}
void loop()
{
ForEachCanInterface(CheckCanInterface);
}
void CheckCanInterface(MCP2515 *interface)
{
if (interface->readMessage(&incomingCanFrame) == MCP2515::ERROR_OK)
{
HandleFrame(&incomingCanFrame, interface);
HandleRules(&incomingCanFrame);
}
}
#include <SPI.h>;
#include <mcp2515.h>;
#include "MeyCan.h";
#include "MeyRule.h";
#define PIN8 8
#define PIN9 9
const int16_t SW_FLUR = 0XD238;
const int16_t SW_ANBAU = 0x87A9;
const int16_t SW_WOHNZIMMER = 0x87CA;
const int16_t SW_TERRASSE = 0x618A;
const int16_t UP_WOHNZIMMER_TUER = 0x051F; // [X X]
const int16_t UP_WOHNZIMMER_TERASSE = 0x05df;
const int16_t UP_FLUR_EINGANG = 0x0769; // [X]
const int16_t UP_BUERO = 0x1177;
const int16_t UP_FLUR_BUERO = 0x05A1; // [X]
const int16_t UP_FLUR_KUECHE = 0x01EF;
const int16_t UP_KINDERZIMMER = 0x0196; // [X X]
const int16_t UP_FLUR_ELTERN = 0x0632;
const int16_t UP_ELTERN = 0x08AE;
const int16_t UP_KUECHE_FLUR = 0x07F5; // [X]
const int16_t UP_KUECHE_BAD = 0x0585; // [X X]
const int16_t UP_KUECHE_ARBEITSPLATTE = 0x07A9; // [X X]
struct can_frame incomingCanFrame;
/*
Software matching Hardware of meycan v8.1
*/
void setup() {
SPI.begin();
AddToggle(UP_WOHNZIMMER_TUER, 1, SW_WOHNZIMMER, 5);
AddToggle(UP_WOHNZIMMER_TUER, 1, SW_WOHNZIMMER, 6);
AddSimple(UP_WOHNZIMMER_TUER, 2, SW_WOHNZIMMER, 7);
AddSimple(UP_WOHNZIMMER_TUER, 3, SW_WOHNZIMMER, 8);
AddToggle(UP_KINDERZIMMER, 3, SW_FLUR, 6);
AddToggle(UP_KINDERZIMMER, 3, SW_WOHNZIMMER, 2);
AddToggle(UP_KINDERZIMMER, 2, SW_FLUR, 3);
AddSimple(UP_KINDERZIMMER, 4, SW_FLUR, 4);
AddSimple(UP_KINDERZIMMER, 1, SW_FLUR, 5);
AddToggle(UP_FLUR_EINGANG, 1, SW_FLUR, 1);
AddToggle(UP_FLUR_EINGANG, 2, SW_FLUR, 6);
AddToggle(UP_FLUR_EINGANG, 2, SW_WOHNZIMMER, 2);
AddToggle(UP_ELTERN, 1, SW_FLUR, 2);
AddToggle(UP_BUERO, 1, SW_WOHNZIMMER, 3);
AddToggle(UP_FLUR_BUERO, 1, SW_FLUR, 6);
AddToggle(UP_FLUR_BUERO, 1, SW_WOHNZIMMER, 2);
AddToggle (UP_WOHNZIMMER_TERASSE, 1, SW_WOHNZIMMER, 7); // Licht 1 von Terassenschalter
AddToggle (UP_WOHNZIMMER_TERASSE, 2, SW_WOHNZIMMER, 8); // Licht
AddToggle (UP_WOHNZIMMER_TERASSE, 3, SW_TERRASSE, 2); // Pergola
/// RULE FOR SWITCH WOHNZIMMER (BOTH) OF TERASSE
// AddSimple (UP_WOHNZIMMER_TERASSE, 3, SW_WOHNZIMMER, 5); // Eingangstür Flur Licht 2
// AddSimple (UP_WOHNZIMMER_TERASSE, 3, SW_WOHNZIMMER, 6); // Eingangstür Flur Licht 2
AddToggle(UP_KUECHE_ARBEITSPLATTE, 1, SW_ANBAU, 2);
AddToggle(UP_KUECHE_FLUR, 1, SW_ANBAU, 3);
AddToggle(UP_KUECHE_FLUR, 2, SW_ANBAU, 2);
AddToggle(UP_KUECHE_BAD, 1, SW_ANBAU, 3);
AddToggle(UP_KUECHE_BAD, 2, SW_ANBAU, 1);
AddToggle(UP_KUECHE_BAD, 3, SW_ANBAU, 4);
AddToggle(UP_FLUR_KUECHE, 1, SW_FLUR, 6);
AddToggle(UP_FLUR_KUECHE, 1, SW_WOHNZIMMER, 2);
SetMeyPin(1, PIN3);
SetMeyPin(2, PIN5);
SetMeyPin(3, PIN7);
SetMeyPin(4, PIN9);
SetMeyPin(5, PIN8);
SetMeyPin(6, PIN6);
SetMeyPin(7, PIN4);
SetMeyPin(8, PIN2);
SetDevicedId(0x87, 0xCA);
AddLocalPinChangedHandler(SetLocalPinStateAdapter);
AddCanInterface(PIN_A0);
AddCanInterface(PIN_A1);
AddCanInterface(PIN_A2);
AddCanInterface(PIN_A3);
SetupMeyCan(8, 0, 2);
}
void loop() {
ForEachCanInterface(CheckCanInterface);
}
void SetLocalPinStateAdapter(can_frame *frame)
{
SetLocalPinState(frame);
}
void CheckCanInterface(MCP2515 *interface) {
if (interface->readMessage(&incomingCanFrame) == MCP2515::ERROR_OK) {
HandleFrame(&incomingCanFrame, interface);
HandleRules(&incomingCanFrame);
}
}

View File

@@ -1,68 +1,68 @@
Testfälle Meycan Switch
PreCons for each:
GIVEN XX XX is the deviceId of the target device
GIVEN YY YY is another device id, which is NOT XX XX
GIVEN 2nd CAN Debug Device on another CanBus of switch
1) A MeyPin can be triggered directly (repeat Test for all MeyPins and each CAN Bus Interface specified)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01 -> (MeyPin1 Should switch to on)
THEN The MeyPin 1 should trigger
THEN you receive a message 00 50 XX XX | 01 01
THEN 2nd device should receive 2 messages
* 00 50 XX XX | 01 01
* 00 55 11 11 | XX XX 01 01
1a) A MeyPin trigger is effecltess, if only set
GIVEN the above testcast
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01
THEN Nothing changed
THEN you dont receive a message
THEN 2nd device should receive 00 55 11 11 | XX XX 01 01
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 00 -> (MeyPin1 Should switch to off)
THEN The MeyPin 1 should switch to OFF
THEN you receive a message 00 50 XX XX | 01 00
THEN 2nd device should receive 2 messages
* 00 50 XX XX | 01 00
* 00 55 11 11 | XX XX 01 00
2) A MeyPin is not triggered, if the device id dont match
WHEN Send CAN Pkg 00 55 11 11 | YY YY 01 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 00 55 11 11 | XX XX 01 01
3) A MeyPin is not triggered, if the Package Type dont match
WHEN Send CAN Pkg 50 00 11 11 | YY YY 01 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 50 00 11 11 | XX XX 01 01
3) A MeyPin is not triggered, if the MeyPin is above 8 (max pins)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 09 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 00 55 11 11 | XX XX 09 01
THEN you can execute any other testcase, as the switch didnt crash
4) All MeyPins can be activated more than 15 minutes in parallel(Activate each port for at least 15 mins)
GIVE You have a relais connected to each of the ports
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01 -> (MeyPin1 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 02 01 -> (MeyPin2 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 03 01 -> (MeyPin3 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 04 01 -> (MeyPin4 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 05 01 -> (MeyPin5 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 06 01 -> (MeyPin6 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 07 01 -> (MeyPin7 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 08 01 -> (MeyPin8 Should switch to on)
THEN you should only receive the packages from above.
THEN you should NOT receive a VersionPackage
WHEN you wait 15 Minutes
THEN nothing should be send
Testfälle Meycan Switch
PreCons for each:
GIVEN XX XX is the deviceId of the target device
GIVEN YY YY is another device id, which is NOT XX XX
GIVEN 2nd CAN Debug Device on another CanBus of switch
1) A MeyPin can be triggered directly (repeat Test for all MeyPins and each CAN Bus Interface specified)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01 -> (MeyPin1 Should switch to on)
THEN The MeyPin 1 should trigger
THEN you receive a message 00 50 XX XX | 01 01
THEN 2nd device should receive 2 messages
* 00 50 XX XX | 01 01
* 00 55 11 11 | XX XX 01 01
1a) A MeyPin trigger is effecltess, if only set
GIVEN the above testcast
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01
THEN Nothing changed
THEN you dont receive a message
THEN 2nd device should receive 00 55 11 11 | XX XX 01 01
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 00 -> (MeyPin1 Should switch to off)
THEN The MeyPin 1 should switch to OFF
THEN you receive a message 00 50 XX XX | 01 00
THEN 2nd device should receive 2 messages
* 00 50 XX XX | 01 00
* 00 55 11 11 | XX XX 01 00
2) A MeyPin is not triggered, if the device id dont match
WHEN Send CAN Pkg 00 55 11 11 | YY YY 01 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 00 55 11 11 | XX XX 01 01
3) A MeyPin is not triggered, if the Package Type dont match
WHEN Send CAN Pkg 50 00 11 11 | YY YY 01 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 50 00 11 11 | XX XX 01 01
3) A MeyPin is not triggered, if the MeyPin is above 8 (max pins)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 09 01
THEN None of the pins of the device triggered
THEN you receive no message
THEN 2nd device should receive 1 messages
* 00 55 11 11 | XX XX 09 01
THEN you can execute any other testcase, as the switch didnt crash
4) All MeyPins can be activated more than 15 minutes in parallel(Activate each port for at least 15 mins)
GIVE You have a relais connected to each of the ports
WHEN Send CAN Pkg 00 55 11 11 | XX XX 01 01 -> (MeyPin1 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 02 01 -> (MeyPin2 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 03 01 -> (MeyPin3 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 04 01 -> (MeyPin4 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 05 01 -> (MeyPin5 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 06 01 -> (MeyPin6 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 07 01 -> (MeyPin7 Should switch to on)
WHEN Send CAN Pkg 00 55 11 11 | XX XX 08 01 -> (MeyPin8 Should switch to on)
THEN you should only receive the packages from above.
THEN you should NOT receive a VersionPackage
WHEN you wait 15 Minutes
THEN nothing should be send
THEN the Pins should not trigger

View File

@@ -0,0 +1,7 @@
{
"configuration": "pinout=48pin_standard,eeprom=keep,resetpin=reset,BOD=2v6,clock=internal_8MHz,bootloader=no_bootloader",
"board": "MegaCoreX:megaavr:809",
"sketch": "Switch.ino",
"port": "COM6",
"programmer": "jtag2updi"
}

View File

@@ -0,0 +1,540 @@
{
"version": 4,
"configurations": [
{
"name": "Arduino",
"compilerPath": "C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\bin\\avr-g++",
"compilerArgs": [
"-w",
"-std=gnu++17",
"-fpermissive",
"-fno-exceptions",
"-ffunction-sections",
"-fdata-sections",
"-fno-threadsafe-statics",
"-Wno-error=narrowing"
],
"intelliSenseMode": "gcc-x64",
"includePath": [
"C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\MegaCoreX\\hardware\\megaavr\\1.1.0\\cores\\coreX-corefiles\\api\\deprecated",
"C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\MegaCoreX\\hardware\\megaavr\\1.1.0\\cores\\coreX-corefiles",
"C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\MegaCoreX\\hardware\\megaavr\\1.1.0\\variants\\48pin-standard",
"C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\MegaCoreX\\hardware\\megaavr\\1.1.0\\libraries\\SPI\\src",
"C:\\Users\\Martin\\Documents\\Arduino\\libraries\\autowp-mcp2515",
"c:\\users\\martin\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\lib\\gcc\\avr\\7.3.0\\include",
"c:\\users\\martin\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\lib\\gcc\\avr\\7.3.0\\include-fixed",
"c:\\users\\martin\\appdata\\local\\arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7\\avr\\include"
],
"forcedInclude": [
"C:\\Users\\Martin\\AppData\\Local\\Arduino15\\packages\\MegaCoreX\\hardware\\megaavr\\1.1.0\\cores\\coreX-corefiles\\Arduino.h"
],
"cStandard": "c11",
"cppStandard": "c++17",
"defines": [
"F_CPU=8000000L",
"ARDUINO=10607",
"ARDUINO_AVR_ATmega809",
"ARDUINO_ARCH_MEGAAVR",
"__DBL_MIN_EXP__=(-125)",
"__HQ_FBIT__=15",
"__cpp_attributes=200809",
"__UINT_LEAST16_MAX__=0xffffU",
"__ATOMIC_ACQUIRE=2",
"__SFRACT_IBIT__=0",
"__FLT_MIN__=1.17549435e-38F",
"__GCC_IEC_559_COMPLEX=0",
"__BUILTIN_AVR_SLEEP=1",
"__BUILTIN_AVR_COUNTLSULLK=1",
"__cpp_aggregate_nsdmi=201304",
"__BUILTIN_AVR_COUNTLSULLR=1",
"__UFRACT_MAX__=0XFFFFP-16UR",
"__UINT_LEAST8_TYPE__=unsigned char",
"__DQ_FBIT__=63",
"__INTMAX_C(c)=c ## LL",
"__ULFRACT_FBIT__=32",
"__SACCUM_EPSILON__=0x1P-7HK",
"__CHAR_BIT__=8",
"__USQ_IBIT__=0",
"__UINT8_MAX__=0xff",
"__ACCUM_FBIT__=15",
"__WINT_MAX__=0x7fff",
"__FLT32_MIN_EXP__=(-125)",
"__cpp_static_assert=200410",
"__USFRACT_FBIT__=8",
"__ORDER_LITTLE_ENDIAN__=1234",
"__SIZE_MAX__=0xffffU",
"__WCHAR_MAX__=0x7fff",
"__LACCUM_IBIT__=32",
"__DBL_DENORM_MIN__=double(1.40129846e-45L)",
"__GCC_ATOMIC_CHAR_LOCK_FREE=1",
"__GCC_IEC_559=0",
"__FLT_EVAL_METHOD__=0",
"__BUILTIN_AVR_LLKBITS=1",
"__cpp_binary_literals=201304",
"__LLACCUM_MAX__=0X7FFFFFFFFFFFFFFFP-47LLK",
"__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1",
"__BUILTIN_AVR_HKBITS=1",
"__BUILTIN_AVR_BITSLLK=1",
"__FRACT_FBIT__=15",
"__BUILTIN_AVR_BITSLLR=1",
"__cpp_variadic_templates=200704",
"__UINT_FAST64_MAX__=0xffffffffffffffffULL",
"__SIG_ATOMIC_TYPE__=char",
"__BUILTIN_AVR_UHKBITS=1",
"__UACCUM_FBIT__=16",
"__DBL_MIN_10_EXP__=(-37)",
"__FINITE_MATH_ONLY__=0",
"__cpp_variable_templates=201304",
"__LFRACT_IBIT__=0",
"__GNUC_PATCHLEVEL__=0",
"__FLT32_HAS_DENORM__=1",
"__LFRACT_MAX__=0X7FFFFFFFP-31LR",
"__UINT_FAST8_MAX__=0xff",
"__has_include(STR)=__has_include__(STR)",
"__DEC64_MAX_EXP__=385",
"__INT8_C(c)=c",
"__INT_LEAST8_WIDTH__=8",
"__UINT_LEAST64_MAX__=0xffffffffffffffffULL",
"__SA_FBIT__=15",
"__SHRT_MAX__=0x7fff",
"__LDBL_MAX__=3.40282347e+38L",
"__FRACT_MAX__=0X7FFFP-15R",
"__UFRACT_FBIT__=16",
"__UFRACT_MIN__=0.0UR",
"__UINT_LEAST8_MAX__=0xff",
"__GCC_ATOMIC_BOOL_LOCK_FREE=1",
"__UINTMAX_TYPE__=long long unsigned int",
"__LLFRACT_EPSILON__=0x1P-63LLR",
"__BUILTIN_AVR_DELAY_CYCLES=1",
"__DEC32_EPSILON__=1E-6DF",
"__FLT_EVAL_METHOD_TS_18661_3__=0",
"__UINT32_MAX__=0xffffffffUL",
"__GXX_EXPERIMENTAL_CXX0X__=1",
"__ULFRACT_MAX__=0XFFFFFFFFP-32ULR",
"__TA_IBIT__=16",
"__LDBL_MAX_EXP__=128",
"__WINT_MIN__=(-__WINT_MAX__ - 1)",
"__INT_LEAST16_WIDTH__=16",
"__ULLFRACT_MIN__=0.0ULLR",
"__SCHAR_MAX__=0x7f",
"__WCHAR_MIN__=(-__WCHAR_MAX__ - 1)",
"__INT64_C(c)=c ## LL",
"__DBL_DIG__=6",
"__GCC_ATOMIC_POINTER_LOCK_FREE=1",
"__AVR_HAVE_SPH__=1",
"__LLACCUM_MIN__=(-0X1P15LLK-0X1P15LLK)",
"__BUILTIN_AVR_KBITS=1",
"__BUILTIN_AVR_ABSK=1",
"__BUILTIN_AVR_ABSR=1",
"__SIZEOF_INT__=2",
"__SIZEOF_POINTER__=2",
"__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1",
"__USACCUM_IBIT__=8",
"__USER_LABEL_PREFIX__",
"__STDC_HOSTED__=1",
"__LDBL_HAS_INFINITY__=1",
"__LFRACT_MIN__=(-0.5LR-0.5LR)",
"__HA_IBIT__=8",
"__FLT32_DIG__=6",
"__TQ_IBIT__=0",
"__FLT_EPSILON__=1.19209290e-7F",
"__GXX_WEAK__=1",
"__SHRT_WIDTH__=16",
"__USFRACT_IBIT__=0",
"__LDBL_MIN__=1.17549435e-38L",
"__FRACT_MIN__=(-0.5R-0.5R)",
"__AVR_SFR_OFFSET__=0x20",
"__DEC32_MAX__=9.999999E96DF",
"__cpp_threadsafe_static_init=200806",
"__DA_IBIT__=32",
"__INT32_MAX__=0x7fffffffL",
"__UQQ_FBIT__=8",
"__INT_WIDTH__=16",
"__SIZEOF_LONG__=4",
"__UACCUM_MAX__=0XFFFFFFFFP-16UK",
"__UINT16_C(c)=c ## U",
"__PTRDIFF_WIDTH__=16",
"__DECIMAL_DIG__=9",
"__LFRACT_EPSILON__=0x1P-31LR",
"__AVR_2_BYTE_PC__=1",
"__ULFRACT_MIN__=0.0ULR",
"__INTMAX_WIDTH__=64",
"__has_include_next(STR)=__has_include_next__(STR)",
"__BUILTIN_AVR_ULLRBITS=1",
"__LDBL_HAS_QUIET_NAN__=1",
"__ULACCUM_IBIT__=32",
"__UACCUM_EPSILON__=0x1P-16UK",
"__BUILTIN_AVR_SEI=1",
"__GNUC__=7",
"__ULLACCUM_MAX__=0XFFFFFFFFFFFFFFFFP-48ULLK",
"__cpp_delegating_constructors=200604",
"__HQ_IBIT__=0",
"__BUILTIN_AVR_SWAP=1",
"__FLT_HAS_DENORM__=1",
"__SIZEOF_LONG_DOUBLE__=4",
"__BIGGEST_ALIGNMENT__=1",
"__STDC_UTF_16__=1",
"__UINT24_MAX__=16777215UL",
"__BUILTIN_AVR_NOP=1",
"__GNUC_STDC_INLINE__=1",
"__DQ_IBIT__=0",
"__FLT32_HAS_INFINITY__=1",
"__DBL_MAX__=double(3.40282347e+38L)",
"__ULFRACT_IBIT__=0",
"__cpp_raw_strings=200710",
"__INT_FAST32_MAX__=0x7fffffffL",
"__DBL_HAS_INFINITY__=1",
"__INT64_MAX__=0x7fffffffffffffffLL",
"__ACCUM_IBIT__=16",
"__DEC32_MIN_EXP__=(-94)",
"__BUILTIN_AVR_UKBITS=1",
"__INTPTR_WIDTH__=16",
"__BUILTIN_AVR_FMULSU=1",
"__LACCUM_MAX__=0X7FFFFFFFFFFFFFFFP-31LK",
"__INT_FAST16_TYPE__=int",
"__LDBL_HAS_DENORM__=1",
"__BUILTIN_AVR_BITSK=1",
"__BUILTIN_AVR_BITSR=1",
"__cplusplus=201402L",
"__cpp_ref_qualifiers=200710",
"__DEC128_MAX__=9.999999999999999999999999999999999E6144DL",
"__INT_LEAST32_MAX__=0x7fffffffL",
"__USING_SJLJ_EXCEPTIONS__=1",
"__DEC32_MIN__=1E-95DF",
"__ACCUM_MAX__=0X7FFFFFFFP-15K",
"__DEPRECATED=1",
"__cpp_rvalue_references=200610",
"__DBL_MAX_EXP__=128",
"__USACCUM_EPSILON__=0x1P-8UHK",
"__WCHAR_WIDTH__=16",
"__FLT32_MAX__=3.40282347e+38F32",
"__DEC128_EPSILON__=1E-33DL",
"__SFRACT_MAX__=0X7FP-7HR",
"__FRACT_IBIT__=0",
"__PTRDIFF_MAX__=0x7fff",
"__UACCUM_MIN__=0.0UK",
"__UACCUM_IBIT__=16",
"__BUILTIN_AVR_NOPS=1",
"__BUILTIN_AVR_WDR=1",
"__FLT32_HAS_QUIET_NAN__=1",
"__GNUG__=7",
"__LONG_LONG_MAX__=0x7fffffffffffffffLL",
"__SIZEOF_SIZE_T__=2",
"__ULACCUM_MAX__=0XFFFFFFFFFFFFFFFFP-32ULK",
"__cpp_rvalue_reference=200610",
"__cpp_nsdmi=200809",
"__SIZEOF_WINT_T__=2",
"__LONG_LONG_WIDTH__=64",
"__cpp_initializer_lists=200806",
"__FLT32_MAX_EXP__=128",
"__SA_IBIT__=16",
"__ULLACCUM_MIN__=0.0ULLK",
"__BUILTIN_AVR_ROUNDUHK=1",
"__BUILTIN_AVR_ROUNDUHR=1",
"__cpp_hex_float=201603",
"__GXX_ABI_VERSION=1011",
"__INT24_MAX__=8388607L",
"__UTA_FBIT__=48",
"__FLT_MIN_EXP__=(-125)",
"__USFRACT_MAX__=0XFFP-8UHR",
"__UFRACT_IBIT__=0",
"__BUILTIN_AVR_ROUNDFX=1",
"__BUILTIN_AVR_ROUNDULK=1",
"__BUILTIN_AVR_ROUNDULR=1",
"__cpp_lambdas=200907",
"__BUILTIN_AVR_COUNTLSLLK=1",
"__BUILTIN_AVR_COUNTLSLLR=1",
"__BUILTIN_AVR_ROUNDHK=1",
"__INT_FAST64_TYPE__=long long int",
"__BUILTIN_AVR_ROUNDHR=1",
"__DBL_MIN__=double(1.17549435e-38L)",
"__BUILTIN_AVR_COUNTLSK=1",
"__BUILTIN_AVR_ROUNDLK=1",
"__BUILTIN_AVR_COUNTLSR=1",
"__BUILTIN_AVR_ROUNDLR=1",
"__LACCUM_MIN__=(-0X1P31LK-0X1P31LK)",
"__ULLACCUM_FBIT__=48",
"__BUILTIN_AVR_LKBITS=1",
"__ULLFRACT_EPSILON__=0x1P-64ULLR",
"__DEC128_MIN__=1E-6143DL",
"__REGISTER_PREFIX__",
"__UINT16_MAX__=0xffffU",
"__DBL_HAS_DENORM__=1",
"__BUILTIN_AVR_ULKBITS=1",
"__ACCUM_MIN__=(-0X1P15K-0X1P15K)",
"__AVR_ARCH__=2",
"__SQ_IBIT__=0",
"__FLT32_MIN__=1.17549435e-38F32",
"__UINT8_TYPE__=unsigned char",
"__BUILTIN_AVR_ROUNDUK=1",
"__BUILTIN_AVR_ROUNDUR=1",
"__UHA_FBIT__=8",
"__NO_INLINE__=1",
"__SFRACT_MIN__=(-0.5HR-0.5HR)",
"__UTQ_FBIT__=128",
"__FLT_MANT_DIG__=24",
"__LDBL_DECIMAL_DIG__=9",
"__VERSION__=\"7.3.0\"",
"__UINT64_C(c)=c ## ULL",
"__ULLFRACT_FBIT__=64",
"__cpp_unicode_characters=200704",
"__FRACT_EPSILON__=0x1P-15R",
"__ULACCUM_MIN__=0.0ULK",
"__UDA_FBIT__=32",
"__cpp_decltype_auto=201304",
"__LLACCUM_EPSILON__=0x1P-47LLK",
"__GCC_ATOMIC_INT_LOCK_FREE=1",
"__FLT32_MANT_DIG__=24",
"__BUILTIN_AVR_BITSUHK=1",
"__BUILTIN_AVR_BITSUHR=1",
"__FLOAT_WORD_ORDER__=__ORDER_LITTLE_ENDIAN__",
"__USFRACT_MIN__=0.0UHR",
"__BUILTIN_AVR_BITSULK=1",
"__ULLACCUM_IBIT__=16",
"__BUILTIN_AVR_BITSULR=1",
"__UQQ_IBIT__=0",
"__BUILTIN_AVR_LLRBITS=1",
"__SCHAR_WIDTH__=8",
"__BUILTIN_AVR_BITSULLK=1",
"__BUILTIN_AVR_BITSULLR=1",
"__INT32_C(c)=c ## L",
"__DEC64_EPSILON__=1E-15DD",
"__ORDER_PDP_ENDIAN__=3412",
"__DEC128_MIN_EXP__=(-6142)",
"__UHQ_FBIT__=16",
"__LLACCUM_FBIT__=47",
"__FLT32_MAX_10_EXP__=38",
"__BUILTIN_AVR_ROUNDULLK=1",
"__BUILTIN_AVR_ROUNDULLR=1",
"__INT_FAST32_TYPE__=long int",
"__BUILTIN_AVR_HRBITS=1",
"__UINT_LEAST16_TYPE__=unsigned int",
"__BUILTIN_AVR_UHRBITS=1",
"__INT16_MAX__=0x7fff",
"__SIZE_TYPE__=unsigned int",
"__UINT64_MAX__=0xffffffffffffffffULL",
"__UDQ_FBIT__=64",
"__INT8_TYPE__=signed char",
"__cpp_digit_separators=201309",
"__ELF__=1",
"__ULFRACT_EPSILON__=0x1P-32ULR",
"__LLFRACT_FBIT__=63",
"__FLT_RADIX__=2",
"__INT_LEAST16_TYPE__=int",
"__BUILTIN_AVR_ABSFX=1",
"__LDBL_EPSILON__=1.19209290e-7L",
"__UINTMAX_C(c)=c ## ULL",
"__INT24_MIN__=(-__INT24_MAX__-1)",
"__SACCUM_MAX__=0X7FFFP-7HK",
"__BUILTIN_AVR_ABSHR=1",
"__SIG_ATOMIC_MAX__=0x7f",
"__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1",
"__cpp_sized_deallocation=201309",
"__SIZEOF_PTRDIFF_T__=2",
"__AVR=1",
"__BUILTIN_AVR_ABSLK=1",
"__BUILTIN_AVR_ABSLR=1",
"__LACCUM_EPSILON__=0x1P-31LK",
"__DEC32_SUBNORMAL_MIN__=0.000001E-95DF",
"__INT_FAST16_MAX__=0x7fff",
"__UINT_FAST32_MAX__=0xffffffffUL",
"__UINT_LEAST64_TYPE__=long long unsigned int",
"__USACCUM_MAX__=0XFFFFP-8UHK",
"__SFRACT_EPSILON__=0x1P-7HR",
"__FLT_HAS_QUIET_NAN__=1",
"__FLT_MAX_10_EXP__=38",
"__LONG_MAX__=0x7fffffffL",
"__DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL",
"__FLT_HAS_INFINITY__=1",
"__cpp_unicode_literals=200710",
"__USA_FBIT__=16",
"__UINT_FAST16_TYPE__=unsigned int",
"__DEC64_MAX__=9.999999999999999E384DD",
"__INT_FAST32_WIDTH__=32",
"__BUILTIN_AVR_RBITS=1",
"__CHAR16_TYPE__=unsigned int",
"__PRAGMA_REDEFINE_EXTNAME=1",
"__SIZE_WIDTH__=16",
"__INT_LEAST16_MAX__=0x7fff",
"__DEC64_MANT_DIG__=16",
"__UINT_LEAST32_MAX__=0xffffffffUL",
"__SACCUM_FBIT__=7",
"__FLT32_DENORM_MIN__=1.40129846e-45F32",
"__GCC_ATOMIC_LONG_LOCK_FREE=1",
"__SIG_ATOMIC_WIDTH__=8",
"__INT_LEAST64_TYPE__=long long int",
"__INT16_TYPE__=int",
"__INT_LEAST8_TYPE__=signed char",
"__SQ_FBIT__=31",
"__DEC32_MAX_EXP__=97",
"__INT_FAST8_MAX__=0x7f",
"__INTPTR_MAX__=0x7fff",
"__QQ_FBIT__=7",
"__cpp_range_based_for=200907",
"__UTA_IBIT__=16",
"__AVR_ERRATA_SKIP__=1",
"__FLT32_MIN_10_EXP__=(-37)",
"__LDBL_MANT_DIG__=24",
"__SFRACT_FBIT__=7",
"__SACCUM_MIN__=(-0X1P7HK-0X1P7HK)",
"__DBL_HAS_QUIET_NAN__=1",
"__SIG_ATOMIC_MIN__=(-__SIG_ATOMIC_MAX__ - 1)",
"AVR=1",
"__BUILTIN_AVR_FMULS=1",
"__cpp_return_type_deduction=201304",
"__INTPTR_TYPE__=int",
"__UINT16_TYPE__=unsigned int",
"__WCHAR_TYPE__=int",
"__SIZEOF_FLOAT__=4",
"__AVR__=1",
"__BUILTIN_AVR_INSERT_BITS=1",
"__USQ_FBIT__=32",
"__UINTPTR_MAX__=0xffffU",
"__INT_FAST64_WIDTH__=64",
"__DEC64_MIN_EXP__=(-382)",
"__cpp_decltype=200707",
"__FLT32_DECIMAL_DIG__=9",
"__INT_FAST64_MAX__=0x7fffffffffffffffLL",
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1",
"__FLT_DIG__=6",
"__UINT_FAST64_TYPE__=long long unsigned int",
"__BUILTIN_AVR_BITSHK=1",
"__BUILTIN_AVR_BITSHR=1",
"__INT_MAX__=0x7fff",
"__LACCUM_FBIT__=31",
"__USACCUM_MIN__=0.0UHK",
"__UHA_IBIT__=8",
"__INT64_TYPE__=long long int",
"__BUILTIN_AVR_BITSLK=1",
"__BUILTIN_AVR_BITSLR=1",
"__FLT_MAX_EXP__=128",
"__UTQ_IBIT__=0",
"__DBL_MANT_DIG__=24",
"__cpp_inheriting_constructors=201511",
"__BUILTIN_AVR_ULLKBITS=1",
"__INT_LEAST64_MAX__=0x7fffffffffffffffLL",
"__DEC64_MIN__=1E-383DD",
"__WINT_TYPE__=int",
"__UINT_LEAST32_TYPE__=long unsigned int",
"__SIZEOF_SHORT__=2",
"__ULLFRACT_IBIT__=0",
"__LDBL_MIN_EXP__=(-125)",
"__UDA_IBIT__=32",
"__WINT_WIDTH__=16",
"__INT_LEAST8_MAX__=0x7f",
"__LFRACT_FBIT__=31",
"__LDBL_MAX_10_EXP__=38",
"__ATOMIC_RELAXED=0",
"__DBL_EPSILON__=double(1.19209290e-7L)",
"__BUILTIN_AVR_BITSUK=1",
"__BUILTIN_AVR_BITSUR=1",
"__UINT8_C(c)=c",
"__INT_LEAST32_TYPE__=long int",
"__BUILTIN_AVR_URBITS=1",
"__SIZEOF_WCHAR_T__=2",
"__LLFRACT_MAX__=0X7FFFFFFFFFFFFFFFP-63LLR",
"__TQ_FBIT__=127",
"__INT_FAST8_TYPE__=signed char",
"__ULLACCUM_EPSILON__=0x1P-48ULLK",
"__BUILTIN_AVR_ROUNDK=1",
"__BUILTIN_AVR_ROUNDR=1",
"__UHQ_IBIT__=0",
"__LLACCUM_IBIT__=16",
"__FLT32_EPSILON__=1.19209290e-7F32",
"__DBL_DECIMAL_DIG__=9",
"__STDC_UTF_32__=1",
"__INT_FAST8_WIDTH__=8",
"__DEC_EVAL_METHOD__=2",
"__TA_FBIT__=47",
"__UDQ_IBIT__=0",
"__ORDER_BIG_ENDIAN__=4321",
"__cpp_runtime_arrays=198712",
"__WITH_AVRLIBC__=1",
"__UINT64_TYPE__=long long unsigned int",
"__ACCUM_EPSILON__=0x1P-15K",
"__UINT32_C(c)=c ## UL",
"__BUILTIN_AVR_COUNTLSUHK=1",
"__INTMAX_MAX__=0x7fffffffffffffffLL",
"__cpp_alias_templates=200704",
"__BUILTIN_AVR_COUNTLSUHR=1",
"__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__",
"__FLT_DENORM_MIN__=1.40129846e-45F",
"__LLFRACT_IBIT__=0",
"__INT8_MAX__=0x7f",
"__LONG_WIDTH__=32",
"__UINT_FAST32_TYPE__=long unsigned int",
"__CHAR32_TYPE__=long unsigned int",
"__BUILTIN_AVR_COUNTLSULK=1",
"__BUILTIN_AVR_COUNTLSULR=1",
"__FLT_MAX__=3.40282347e+38F",
"__cpp_constexpr=201304",
"__USACCUM_FBIT__=8",
"__BUILTIN_AVR_COUNTLSFX=1",
"__INT32_TYPE__=long int",
"__SIZEOF_DOUBLE__=4",
"__FLT_MIN_10_EXP__=(-37)",
"__UFRACT_EPSILON__=0x1P-16UR",
"__INT_LEAST32_WIDTH__=32",
"__BUILTIN_AVR_COUNTLSHK=1",
"__BUILTIN_AVR_COUNTLSHR=1",
"__INTMAX_TYPE__=long long int",
"__BUILTIN_AVR_ABSLLK=1",
"__BUILTIN_AVR_ABSLLR=1",
"__DEC128_MAX_EXP__=6145",
"__AVR_HAVE_16BIT_SP__=1",
"__ATOMIC_CONSUME=1",
"__GNUC_MINOR__=3",
"__INT_FAST16_WIDTH__=16",
"__UINTMAX_MAX__=0xffffffffffffffffULL",
"__DEC32_MANT_DIG__=7",
"__HA_FBIT__=7",
"__BUILTIN_AVR_COUNTLSLK=1",
"__BUILTIN_AVR_COUNTLSLR=1",
"__BUILTIN_AVR_CLI=1",
"__DBL_MAX_10_EXP__=38",
"__LDBL_DENORM_MIN__=1.40129846e-45L",
"__INT16_C(c)=c",
"__cpp_generic_lambdas=201304",
"__STDC__=1",
"__PTRDIFF_TYPE__=int",
"__LLFRACT_MIN__=(-0.5LLR-0.5LLR)",
"__BUILTIN_AVR_LRBITS=1",
"__ATOMIC_SEQ_CST=5",
"__DA_FBIT__=31",
"__UINT32_TYPE__=long unsigned int",
"__BUILTIN_AVR_ROUNDLLK=1",
"__UINTPTR_TYPE__=unsigned int",
"__BUILTIN_AVR_ROUNDLLR=1",
"__USA_IBIT__=16",
"__BUILTIN_AVR_ULRBITS=1",
"__DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD",
"__DEC128_MANT_DIG__=34",
"__LDBL_MIN_10_EXP__=(-37)",
"__BUILTIN_AVR_COUNTLSUK=1",
"__BUILTIN_AVR_COUNTLSUR=1",
"__SIZEOF_LONG_LONG__=8",
"__ULACCUM_EPSILON__=0x1P-32ULK",
"__cpp_user_defined_literals=200809",
"__SACCUM_IBIT__=8",
"__GCC_ATOMIC_LLONG_LOCK_FREE=1",
"__LDBL_DIG__=6",
"__FLT_DECIMAL_DIG__=9",
"__UINT_FAST16_MAX__=0xffffU",
"__GCC_ATOMIC_SHORT_LOCK_FREE=1",
"__BUILTIN_AVR_ABSHK=1",
"__BUILTIN_AVR_FLASH_SEGMENT=1",
"__INT_LEAST64_WIDTH__=64",
"__ULLFRACT_MAX__=0XFFFFFFFFFFFFFFFFP-64ULLR",
"__UINT_FAST8_TYPE__=unsigned char",
"__USFRACT_EPSILON__=0x1P-8UHR",
"__ULACCUM_FBIT__=32",
"__QQ_IBIT__=0",
"__cpp_init_captures=201304",
"__ATOMIC_ACQ_REL=4",
"__ATOMIC_RELEASE=3",
"__BUILTIN_AVR_FMUL=1",
"USBCON"
]
}
]
}

View File

@@ -0,0 +1,52 @@
#include <SPI.h>;
#include <mcp2515.h>;
struct can_frame frame;
MCP2515 mcp2515(10);
/*
Software matching Hardware of meycan v8.1
*/
void setup() {
SPI.begin();
Serial.begin(9600);
pinMode(PD3, OUTPUT);
digitalWrite(PD3, HIGH);
delay(1000);
digitalWrite(PD3, LOW);
delay(2000);
mcp2515.reset();
mcp2515.setBitrate(CAN_1000KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
void loop() {
if (mcp2515.readMessage(&frame) == MCP2515::ERROR_OK) {
// frame contains received message
Serial.print(" Id: ");
Serial.print(frame.can_id, HEX);
Serial.print(" [");
for (int i = 0; i < 8; i++) {
Serial.print(frame.data[i], HEX);
Serial.print(" ");
}
Serial.println("]");
digitalWrite(PD3, HIGH);
delay(50);
digitalWrite(PD3, LOW);
delay(50);
mcp2515.sendMessage(&frame);
mcp2515.sendMessage(&frame);
mcp2515.sendMessage(&frame);
mcp2515.sendMessage(&frame);
}
}

View File

View File

@@ -1,61 +1,46 @@
#include "HardwareSerial.h"
#include <iterator>
#include "esp32-hal-gpio.h"
#include "MeyCan.h";
#include <SPI.h>;
#include <mcp2515.h>;
#include "driver/twai.h"
PinState *MeyPin = NULL;
CanInterface *CanBusses = NULL;
uint16_t myDeviceId;
uint16_t myDeviceId = 0;
byte _deviceTypeId = 0;
byte _majorHardwareVersion = 0;
byte _minorHardwareVersion = 0;
void SetupMeyPin(PinState *state)
{
pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW);
state->pin_state = false;
}
void InitCanInterface(MCP2515 *interface, can_frame *frame) // can_frame is NULL. Reuse ForEach Method for smaller footprint
{
interface->reset();
interface->setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
interface->setNormalMode();
SendVersionPackage(interface);
}
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace))
{
CanBusses->ForEach(handle);
}
void SetupMeyCan()
{
CalculateMyDeviceId();
if (MeyPin != NULL);
MeyPin->ForEach(SetupMeyPin);
if (CanBusses != NULL)
{
CanBusses->ForEach(InitCanInterface, NULL);
void SetupMeyPin(PinState *state) {
if (state->is_input) {
pinMode(state->pin_id, INPUT_PULLUP);
state->pin_state = digitalRead(state->pin_id);
} else {
pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW);
state->pin_state = true;
}
}
void SetCanInterface(byte index, byte pinId)
{
MCP2515* newCanInterface = new MCP2515(pinId);
CanInterface* canInterface = new CanInterface();
if (CanBusses == NULL)
CanBusses = canInterface;
else
CanBusses->AddCanInterface(canInterface);
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId) {
_majorHardwareVersion = majorHardwareVersion;
_minorHardwareVersion = minorHardwareVersion;
_deviceTypeId = deviceTypeId;
if (MeyPin != NULL)
MeyPin->ForEach(SetupMeyPin);
}
void SetMeyPin(byte index, byte meyPinId, byte pinId)
{
PinState* newState = new PinState();
newState->Init(pinId, (byte) meyPinId);
void SetDevicedId(byte high, byte low) {
myDeviceId = (high << 8) | low;
}
void SetMeyPin(byte meyPinId, byte pinId) {
PinState *newState = new PinState();
newState->Init(pinId, (byte)meyPinId);
if (MeyPin == NULL)
MeyPin = newState;
@@ -64,66 +49,69 @@ void SetMeyPin(byte index, byte meyPinId, byte pinId)
}
bool CheckPinStatus(PinState * state)
{
bool ReadPin(PinState *state) {
return digitalRead(state->pin_id);
}
void SendSwitchedTriggeredCanPackage(byte pinId, int state) {
twai_message_t message;
message.extd = 1;
message.rtr = 0;
message.ss = 0;
message.self = 0;
message.dlc_non_comp = 0;
message.identifier = CreateCanId(SWITCH_TRIGGERED_CAN_ID);
message.data_length_code = 2;
message.data[0] = pinId;
message.data[1] = state;
DoSendCanPkg(&message);
}
void CheckPinStatus(PinState *state) {
if (!state->is_input)
return false;
return;
bool newValue = ReadPin(state);
if (newValue != state->pin_state)
{
if (newValue != state->pin_state) {
delay(10);
newValue = ReadPin(state);
if (newValue != state->pin_state)
{
if (newValue != state->pin_state) {
state->pin_state = newValue;
SendSwitchedTriggeredCanPackage(state->meyPinId, state->pin_state);
}
}
return false;
return;
}
void CheckMeyPinsTriggered()
{
void CheckMeyPinsTriggered() {
MeyPin->ForEach(CheckPinStatus);
}
bool ReadPin(PinState * state)
{
if (state->pin_id == PIN_PD2)
return digitalReadFast(PIN_PD2);
else if (state->pin_id == PIN_PC7)
return digitalReadFast(PIN_PC7);
else if (state->pin_id == PIN_PD1)
return digitalReadFast(PIN_PD1);
else if (state->pin_id == PIN_PD0)
return digitalReadFast(PIN_PD0);
else if (state->pin_id == PIN_PD6)
return digitalReadFast(PIN_PD6);
else if (state->pin_id == PIN_PD5)
return digitalReadFast(PIN_PD5);
else if (state->pin_id == PIN_PD4)
return digitalReadFast(PIN_PD4);
else if (state->pin_id == PIN_PD3)
return digitalReadFast(PIN_PD3);
else
return digitalRead(state->pin_id);
uint16_t GetDeviceId(uint32_t canFrameId) {
return canFrameId & 0xFFFF;
}
void HandleFrame(can_frame *frame, MCP2515 *source)
{
CanBusses->ForEach(DoSendCanPkg, frame, source);
HandleTriggerMeypinCanPackage(frame);
uint16_t GetPackageType(uint32_t canFrameId) {
return (canFrameId / 0x10000) & 0xFFF;
}
void HandleTriggerMeypinCanPackage(can_frame *frame)
{
if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID)
{
uint16_t adressedDeviceId = ((uint16_t )frame->data[0] << 8) | frame->data[1] ;
uint32_t CreateCanId(uint16_t commandId) {
return ((((uint32_t)commandId) & 0xFFF) * 0x10000) | myDeviceId;
}
void HandleTriggerMeypinCanPackage(twai_message_t *frame) {
if (GetPackageType(frame->identifier) == TRIGGER_SWITCH_CAN_ID) {
uint16_t adressedDeviceId = ((uint16_t)frame->data[0] << 8) | frame->data[1];
if (adressedDeviceId != myDeviceId) return;
@@ -132,10 +120,8 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
PinState *adressedPin = MeyPin->Find(meyPinId);
if (adressedPin != NULL)
{
if (adressedPin->is_input == true)
{
if (adressedPin != NULL) {
if (adressedPin->is_input == true) {
pinMode(adressedPin->pin_id, OUTPUT);
adressedPin->is_input = false;
}
@@ -147,104 +133,17 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
digitalWrite(adressedPin->pin_id, state);
SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state);
}
}
}
}
byte CircularShift(byte b)
{
return (b << 1) | (b >> 7 & 1);
void HandleFrame(twai_message_t *frame) {
HandleTriggerMeypinCanPackage(frame);
}
uint16_t GetDeviceId(uint32_t canFrameId)
{
return canFrameId & 0xFFFF;
}
uint16_t GetPackageType(uint32_t canFrameId)
{
return (canFrameId / 0x10000) & 0xFFF;
}
byte GetDeviceIdLow() {
return (SIGROW.SERNUM0 ^
CircularShift(SIGROW.SERNUM2) << 1 ^
CircularShift( CircularShift(SIGROW.SERNUM4)) ^
CircularShift( CircularShift( CircularShift(SIGROW.SERNUM6))) ^
CircularShift( CircularShift( CircularShift( CircularShift(SIGROW.SERNUM8)))));
}
byte GetDeviceIdHigh() {
return (SIGROW.SERNUM1 ^
CircularShift(SIGROW.SERNUM3) << 1 ^
CircularShift( CircularShift(SIGROW.SERNUM5)) ^
CircularShift( CircularShift( CircularShift(SIGROW.SERNUM7))) ^
CircularShift( CircularShift( CircularShift( CircularShift(SIGROW.SERNUM9)))));
}
uint32_t CreateCanId(uint16_t commandId)
{
return ((((uint32_t)commandId) & 0xFFF) * 0x10000) | myDeviceId | CAN_EFF_FLAG;
}
void SendVersionPackage(MCP2515 *interface)
{
can_frame toSend;
toSend.can_id = CreateCanId(HELP_PACKAGE_CAN_ID);
toSend.can_dlc = 6;
toSend.data[0] = SOFTWARE_VERSION_HIGH;
toSend.data[1] = SOFTWARE_VERSION_LOW;
toSend.data[2] = HARDWARE_VERSION_HIGH;
toSend.data[3] = HARDWARE_VERSION_LOW;
toSend.data[4] = (myDeviceId >> 8) & 0xFF;
toSend.data[5] = myDeviceId & 0xFF;
DoSendCanPkg(interface, &toSend);
}
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state)
{
can_frame toSend;
toSend.can_id = CreateCanId(TRIGGER_SWITCH_CAN_ID);
toSend.can_dlc = 4;
toSend.data[0] = (targetCanId & 0xFF00) >> 8;
toSend.data[1] = targetCanId & 0xFF;
toSend.data[2] = pinId;
toSend.data[3] = state;
HandleFrame(&toSend, NULL);
}
void SendSwitchedTriggeredCanPackage(byte pinId, int state)
{
can_frame toSend;
toSend.can_id = CreateCanId(SWITCH_TRIGGERED_CAN_ID);
toSend.can_dlc = 2;
toSend.data[0] = pinId;
toSend.data[1] = state;
DoSendCanPkg(&toSend);
}
void DoSendCanPkg(can_frame *frame)
{
if (CanBusses != NULL)
CanBusses->ForEach(DoSendCanPkg, frame);
}
void DoSendCanPkg(MCP2515 *interface, can_frame *frame)
{
byte cnt = 0;
while (interface->sendMessage(frame))
{
if (++cnt > 10) return;
}
}
void CalculateMyDeviceId()
{
myDeviceId = (GetDeviceIdHigh() << 8) | GetDeviceIdLow();
void DoSendCanPkg(twai_message_t *frame) {
esp_err_t ret = twai_transmit(frame, pdMS_TO_TICKS(1000));
}

View File

@@ -1,128 +1,80 @@
#ifndef MEYCAN_H
#define MEYCAN_H
#include <SPI.h>
#include <mcp2515.h>
typedef struct CanInterface
{
MCP2515 *interface;
CanInterface *next = NULL;
void ForEach(void (*handle)( MCP2515 *interface))
{
if (this->interface != NULL)
handle(this->interface);
if (this->next != NULL)
this->next->ForEach(handle);
}
void ForEach(void (*handle)( MCP2515 *interface, can_frame *frame), can_frame *frame, MCP2515* exclude = NULL)
{
if (this->interface != NULL && this->interface != exclude)
handle(this->interface, frame);
if (this->next != NULL)
this->next->ForEach(handle, frame);
}
void AddCanInterface(CanInterface *newCanInterface)
{
if (next == NULL)
{
this->next = newCanInterface;
newCanInterface->next = NULL;
} else {
next->AddCanInterface(newCanInterface);
}
}
};
typedef struct PinState
{
int pin_id;
bool pin_state;
bool is_input;
byte meyPinId;
PinState *next = NULL;
PinState() {}
void Init(int pin_id, byte meyPinId)
{
this->pin_id = pin_id;
this->pin_state = true;
this->is_input = true;
this->meyPinId = meyPinId;
}
void AddPinState(PinState *nextPinState)
{
if (next == NULL)
{
this->next = nextPinState;
nextPinState->next = NULL;
} else {
next->AddPinState(nextPinState);
}
}
PinState* Find(byte meyPinId)
{
if (this->meyPinId == meyPinId)
return this;
if (this->next != NULL)
return this->next->Find(meyPinId);
return NULL;
}
void ForEach(void (*handle)(PinState *theState))
{
handle(this);
if (this->next != NULL)
this->next->ForEach(handle);
}
};
const byte SOFTWARE_VERSION_HIGH = 5;
const byte SOFTWARE_VERSION_LOW = 0;
const byte HARDWARE_VERSION_HIGH = 7;
const byte HARDWARE_VERSION_LOW = 0;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055;
void SetCanInterface(byte index, byte pinId);
void SetMeyPin(byte index, byte meyPinId, byte pinId);
void SetupMeyCan();
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace));
bool ReadPin(PinState *state);
bool CheckPinStatus(PinState * state);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */
void HandleFrame(can_frame *frame, MCP2515 *source);
void HandleTriggerMeypinCanPackage(can_frame *frame);
byte CircularShift(byte b);
uint16_t GetDeviceId(uint32_t canFrameId);
uint16_t GetPackageType(uint32_t canFrameId);
byte GetDeviceIdLow();
byte GetDeviceIdHigh();
uint32_t CreateCanId(uint16_t commandId);
void SendVersionPackage(MCP2515 *interface);
void SendSwitchedTriggeredCanPackage(byte pinId, int state);
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state);
void DoSendCanPkg(can_frame *frame);
void DoSendCanPkg(MCP2515 *interface, can_frame *frame);
void CalculateMyDeviceId();
#endif
#ifndef MEYCAN_H
#define MEYCAN_H
#include <Arduino.h>
#include <SPI.h>
#include "driver/twai.h"
typedef struct PinState
{
int pin_id;
bool pin_state;
bool is_input;
byte meyPinId;
PinState *next = NULL;
PinState() {}
void Init(int pin_id, byte meyPinId)
{
this->pin_id = pin_id;
this->pin_state = true;
this->is_input = true;
this->meyPinId = meyPinId;
}
void AddPinState(PinState *nextPinState)
{
if (next == NULL)
{
this->next = nextPinState;
nextPinState->next = NULL;
} else {
next->AddPinState(nextPinState);
}
}
PinState* Find(byte meyPinId)
{
if (this->meyPinId == meyPinId)
return this;
if (this->next != NULL)
return this->next->Find(meyPinId);
return NULL;
}
void ForEach(void (*handle)(PinState *theState))
{
handle(this);
if (this->next != NULL)
this->next->ForEach(handle);
}
};
const byte SOFTWARE_VERSION_HIGH = 6;
const byte SOFTWARE_VERSION_LOW = 0;
const byte HARDWARE_VERSION_HIGH = 8;
const byte HARDWARE_VERSION_LOW = 1;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055;
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId);
uint32_t CreateCanId(uint16_t commandId);
void SetDevicedId(byte high, byte low);
void SetMeyPin(byte meyPinId, byte pinId);
uint16_t GetDeviceId(uint32_t canFrameId);
uint16_t GetPackageType(uint32_t canFrameId);
void SendSwitchedTriggeredCanPackage(byte pinId, int state);
void HandleFrame(twai_message_t *frame);
void CheckPinStatus(PinState *state);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */
void DoSendCanPkg(twai_message_t *frame) ;
#endif

View File

@@ -1,104 +0,0 @@
#include "MeyRule.h"
#include "MeyCan.h"
#include <Arduino.h>
#include <mcp2515.h>;
RemotePinInfo remotePinInfo = RemotePinInfo();
Rule *rules = NULL;
void PutRule(Rule *rule)
{
if (rules == NULL)
rules = rule;
else
rules->AddRule(rule);
}
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = false;
rule->inverse = false;
PutRule(rule);
}
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true;
rule->inverse = false;
PutRule(rule);
}
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId)
{
Rule *rule = new Rule();
rule->sourceDevId = sourceDevId;
rule->sourceMeyPinId = sourceMeyPinId;
rule->targetDevId = targetDevId;
rule->targetMeyPinId = targetMeyPinId;
rule->toggle = true;
rule->inverse = true;
PutRule(rule);
}
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule)
{
RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(rule->targetDevId);
if (currentPinState == NULL) return;
bool pinState = state > 0;
if (rule->inverse)
pinState = !pinState;
if (rule->toggle)
pinState = (currentPinState->getPinState(rule->targetMeyPinId) ^ true);
BroadcastTriggerMeyPinCanPackage(rule->targetDevId, rule->targetMeyPinId, pinState);
currentPinState->setPinState(rule->targetMeyPinId, pinState);
}
void HandleTriggered(can_frame *frame)
{
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID)
{
RemotePinInfo *currentPinState = remotePinInfo.FindOrAdd(GetDeviceId(frame->can_id) );
if (currentPinState == NULL)
return;
currentPinState->setPinState(frame->data[0], frame->data[1]);
}
}
void HandleRules(can_frame *frame)
{
HandleTriggered(frame);
if (rules == NULL) return;
if (GetPackageType(frame->can_id) == SWITCH_TRIGGERED_CAN_ID)
{
uint16_t deviceId = GetDeviceId(frame->can_id);
uint8_t dt = frame->data[1];
uint8_t state = frame->data[0];
rules->Traverse(deviceId, dt, state, CheckRule);
}
}

View File

@@ -1,111 +0,0 @@
#ifndef MEYRULE_H
#define MEYRULE_H
#include <Arduino.h>
#include <mcp2515.h>;
struct Rule
{
uint16_t sourceDevId;
byte sourceMeyPinId;
uint16_t targetDevId;
byte targetMeyPinId;
bool toggle;
bool inverse;
Rule *nextRule = NULL;
void AddRule(Rule *rule)
{
if (this->nextRule == NULL)
{
this->nextRule = rule;
rule->nextRule = NULL;
} else {
this->nextRule->AddRule(rule);
}
}
void Traverse( uint16_t deviceId, uint8_t dt, uint8_t state, void (*handle)(uint16_t, uint8_t, uint8_t, Rule*))
{
if ( this->sourceDevId == deviceId && this->sourceMeyPinId == state)
handle(deviceId, dt, state, this);
if (this->nextRule != NULL)
this->nextRule->Traverse(deviceId, dt, state, handle);
}
};
typedef struct RemotePinInfo
{
const byte MAX_REMOTE_PIN_COUNT = 64;
uint16_t DeviceId = 0; // the id of the device
uint8_t pinState = 0; // bitmap of 8 MeyPin states of the device. 0000 0100, MeyPin #3 is HIGH in this example
RemotePinInfo *next = NULL;
bool getPinState(byte meyPin)
{
return (this->pinState >> (meyPin - 1)) & 1;
}
void setPinState(byte meyPin, bool state)
{
if (state)
this->pinState = this->pinState | (1 << (meyPin - 1)); // 0001 0000
else
this->pinState = this->pinState & (~(1 << (meyPin - 1))); // 1110 1111 -> not
}
int16_t Count()
{
if (this->next == NULL) return 1;
return this->next->Count() + 1;
}
RemotePinInfo* FindOrAdd(uint16_t deviceId, byte count = 0)
{
if (count > MAX_REMOTE_PIN_COUNT)
return NULL;
if (this->DeviceId == 0 && this->pinState == 0)
{
this->DeviceId = deviceId;
this->pinState = 0;
}
if (this->DeviceId == deviceId)
{
//ToggleDebug();
return this;
}
if (next != NULL)
{
return next->FindOrAdd(deviceId, count + 1);
}
RemotePinInfo *theNext = new RemotePinInfo;
theNext->DeviceId = deviceId;
theNext->pinState = 0;
theNext->next = NULL;
this->next = theNext;
return this->next;
}
};
extern RemotePinInfo remotePinInfo;
extern Rule *rules;
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggleInverse(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void HandleRules(can_frame *frame);
void PutRule(Rule *rule);
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule);
#endif

View File

@@ -1,32 +1,220 @@
#include <SPI.h>;
#include <mcp2515.h>;
#include "MeyCan.h";
#include <Arduino.h>
#include <driver/i2s.h>
#include "opus.h"
#include "opus_data.h"
#include "MeyCan.h"
constexpr int RX_PIN = 2; // CAN_TRANCEIVER_RX_PIN
constexpr int TX_PIN = 3; // CAN_TRANCEIVER_TX_PIN
bool driver_installed = false;
constexpr i2s_port_t I2S_PORT = I2S_NUM_0; // I2S-Peripherie-Instanz (0 = erster Controller)
constexpr int I2S_DIN = 9; // GPIO-Pin für serielle Datenleitug (Data-Out → DAC)
constexpr int I2S_BCLK = 10; // GPIO-Pin für Bit-Clock (BCLK)
constexpr int I2S_LRC = 20; // GPIO-Pin für Word-Select / Left-Right-Clock
constexpr int SAMPLE_RATE = 48000; // Abtastrate in Hz (Opus-Standard: 48 kHz)
constexpr int CHANNELS = 1; // Anzahl Audiokanäle (1 = Mono)
constexpr int MAX_FRAME = 5760; // Maximale Samples pro Opus-Frame (120 ms @ 48 kHz)
float OUTPUT_GAIN = 0.02f; // Lautstärkeskalierung vor I2S-Ausgabe (0.01.0)
static OpusDecoder *dec = nullptr;
static int16_t pcm[MAX_FRAME];
static int16_t stereo[MAX_FRAME * 2];
static void i2s_setup() {
i2s_config_t cfg = {};
cfg.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
cfg.sample_rate = SAMPLE_RATE;
cfg.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;
cfg.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
cfg.communication_format = I2S_COMM_FORMAT_STAND_I2S;
cfg.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
cfg.dma_buf_count = 8;
cfg.dma_buf_len = 512;
cfg.tx_desc_auto_clear = true;
i2s_pin_config_t pins = {};
pins.bck_io_num = I2S_BCLK;
pins.ws_io_num = I2S_LRC;
pins.data_out_num = I2S_DIN;
pins.data_in_num = I2S_PIN_NO_CHANGE;
i2s_driver_install(I2S_PORT, &cfg, 0, nullptr);
i2s_set_pin(I2S_PORT, &pins);
i2s_zero_dma_buffer(I2S_PORT);
}
static void decode_packet(const uint8_t *pkt, size_t len) {
int samples = opus_decode(dec, pkt, (opus_int32)len, pcm, MAX_FRAME, 0);
if (samples <= 0) return;
// Mono → Stereo mit Gain
for (int i = 0; i < samples; i++) {
int16_t s = (int16_t)(pcm[i] * OUTPUT_GAIN);
stereo[i * 2] = s;
stereo[i * 2 + 1] = s;
}
size_t written;
i2s_write(I2S_PORT, stereo, samples * 2 * sizeof(int16_t), &written, portMAX_DELAY);
CheckMeyPinsTriggered();
}
void DebugBlink(int d) {
pinMode(20, OUTPUT);
while (true) {
digitalWrite(20, HIGH);
delay(d);
digitalWrite(20, LOW);
delay(d);
}
}
void ConfigureAndSetupMeyCan() {
// Initialize configuration structures using macro initializers
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_1MBITS(); //Look in the api-reference for other speed sets.
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
Serial.println("Driver installed");
} else {
DebugBlink(100);
return;
}
esp_err_t e = twai_start();
// Start TWAI driver
if (e == ESP_OK) {
driver_installed = true;
} else {
DebugBlink(500);
return;
}
SetDevicedId(0x09, 0x09);
SetMeyPin(1, 5);
SetMeyPin(2, 6);
SetMeyPin(3, 7);
SetMeyPin(4, 8);
SetupMeyCan(8, 1, 3);
}
// Ogg-Container-Format:
// Der Stream besteht aus aufeinanderfolgenden "Pages" (Seiten).
// Jede Page beginnt mit dem 4-Byte-Capture-Pattern "OggS".
// Der Page-Header ist immer mindestens 27 Bytes lang:
// Byte 0 3: "OggS" (Capture Pattern)
// Byte 4 : Stream-Struktur-Version (immer 0)
// Byte 5 : Header-Type-Flag (0=normal, 1=continued, 2=first, 4=last)
// Byte 613 : Granule Position (Zeitstempel, 8 Bytes)
// Byte 1417 : Stream Serial Number
// Byte 1821 : Page Sequence Number
// Byte 2225 : CRC Checksum
// Byte 26 : Anzahl der Segmente (num_segs)
// Danach folgt die Segment-Tabelle (num_segs Bytes),
// und anschließend die eigentlichen Nutzdaten.
//
// Ogg-Lacing-Regel für Paketgrenzen:
// Jeder Eintrag in der Segment-Tabelle gibt die Größe eines Segments an (0255).
// Ist ein Segment genau 255 Bytes → das Paket geht weiter (nächstes Segment gehört dazu).
// Ist ein Segment < 255 Bytes → das Paket endet hier.
// So können Pakete größer als 255 Bytes über mehrere Segmente verteilt sein.
//
// Bei Opus in Ogg sind die ersten zwei Pages immer Metadaten:
// Page 0: OpusHead (Samplerate, Kanalanzahl, Preskip …)
// Page 1: OpusTags (Künstler, Titel, Encoder …)
// Ab Page 2 folgen die eigentlichen Audio-Pakete (je ~20 ms Opus-Frame).
static void play_ogg_opus(const uint8_t *buf, size_t buf_len) {
size_t pos = 0; // aktuelle Leseposition im Buffer
int page_n = 0; // Page-Zähler (0 und 1 sind Header-Pages)
while (pos + 27 <= buf_len) {
// --- 1. Capture Pattern "OggS" suchen ---
// Falls pos nicht direkt auf eine Page zeigt, byte-weise vorwärts suchen.
if (!(buf[pos] == 'O' && buf[pos + 1] == 'g' && buf[pos + 2] == 'g' && buf[pos + 3] == 'S')) {
pos++;
continue;
}
// --- 2. Page-Header lesen ---
uint8_t num_segs = buf[pos + 26]; // Anzahl Segmente aus Byte 26
size_t hdr_end = pos + 27 + num_segs; // Ende des Headers (= Beginn der Nutzdaten)
if (hdr_end > buf_len) break;
// Gesamtgröße der Nutzdaten = Summe aller Segmentlängen
size_t data_size = 0;
for (int s = 0; s < num_segs; s++) data_size += buf[pos + 27 + s];
// --- 3. Audio-Pages verarbeiten (Page 0+1 sind Metadaten → überspringen) ---
if (page_n >= 2) {
size_t pkt_start = hdr_end; // Startposition des aktuellen Pakets
size_t pkt_size = 0; // akkumulierte Paketgröße über Segmente
for (int s = 0; s < num_segs; s++) {
uint8_t seg = buf[pos + 27 + s]; // Größe dieses Segments
pkt_size += seg;
if (seg < 255) {
// Paketende erreicht → vollständiges Opus-Paket dekodieren und ausgeben
decode_packet(buf + pkt_start, pkt_size);
pkt_start += pkt_size; // nächstes Paket beginnt direkt dahinter
pkt_size = 0;
}
// seg == 255 → Paket geht im nächsten Segment weiter (Lacing)
}
}
// --- 4. Zur nächsten Page springen ---
pos = hdr_end + data_size;
page_n++;
}
}
int changeVolume = 0;
static void canTaskFunc(void *) {
twai_message_t frame;
for (;;) {
// blockiert ohne CPU-Last; der interne TWAI-Interrupt weckt den Task sobald ein Frame ankommt
if (twai_receive(&frame, portMAX_DELAY) == ESP_OK) {
HandleFrame(&frame);
if (changeVolume > 20)
changeVolume = 0;
OUTPUT_GAIN = 0.1f + changeVolume*0.1f;
changeVolume++;
}
}
}
void setup() {
return;
SPI.begin();
Serial.begin(115200);
i2s_setup();
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLA | 1 << 7);
delay(10); // a bit delay for mcp2515 to get the clock
// Explicit GND for LED and Input
pinMode(21, OUTPUT);
digitalWrite(21, LOW);
SetMeyPin(0, 1, PIN_PD0);
SetMeyPin(1, 2, PIN_PC7);
SetMeyPin(2, 3, PIN_PD2);
SetMeyPin(3, 4, PIN_PD1);
SetMeyPin(4, 5, PIN_PD5);
SetMeyPin(5, 6, PIN_PD3);
SetMeyPin(6, 7, PIN_PD7);
SetMeyPin(7, 8, PIN_PD6);
int err;
dec = opus_decoder_create(SAMPLE_RATE, CHANNELS, &err);
if (err != OPUS_OK) {
Serial.printf("opus_decoder_create failed: %d\n", err);
return;
}
Serial.println("Opus playback started");
ConfigureAndSetupMeyCan();
delay(20);
SetCanInterface(0, PIN_PD4);
SetupMeyCan();
xTaskCreate(canTaskFunc, "can", 4096, nullptr, 5, nullptr);
}
void loop()
{
CheckMeyPinsTriggered();
void loop() {
play_ogg_opus(music_opus, music_opus_len);
opus_decoder_ctl(dec, OPUS_RESET_STATE);
}

Binary file not shown.

View File

@@ -0,0 +1,56 @@
#include <Arduino.h>
#include <AudioTools.h>
#include <AudioTools/AudioCodecs/CodecOpus.h>
using namespace audio_tools;
constexpr int I2S_BCLK = 6;
constexpr int I2S_LRC = 7;
constexpr int I2S_DIN = 5;
// Keep the test intentionally light so it is realistic for an ESP32-C3.
AudioInfo audioInfo(16000, 1, 16);
SineWaveGenerator<int16_t> sineWave(10000);
GeneratedSoundStream<int16_t> source(sineWave);
I2SStream i2s;
OpusAudioEncoder opusEncoder;
OpusAudioDecoder opusDecoder;
EncodedAudioStream decodedAudio(&i2s, &opusDecoder);
EncodedAudioStream encodedAudio(&decodedAudio, &opusEncoder);
StreamCopy copier(encodedAudio, source);
void setup() {
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
auto i2sConfig = i2s.defaultConfig(TX_MODE);
i2sConfig.copyFrom(audioInfo);
i2sConfig.pin_bck = I2S_BCLK;
i2sConfig.pin_ws = I2S_LRC;
i2sConfig.pin_data = I2S_DIN;
i2sConfig.buffer_count = 8;
i2sConfig.buffer_size = 256;
i2s.begin(i2sConfig);
auto sineConfig = sineWave.defaultConfig();
sineConfig.copyFrom(audioInfo);
sineWave.begin(sineConfig, N_B4);
auto &encoderConfig = opusEncoder.config();
encoderConfig.copyFrom(audioInfo);
encoderConfig.application = OPUS_APPLICATION_RESTRICTED_LOWDELAY;
encoderConfig.bitrate = 24000;
encoderConfig.complexity = 1;
encoderConfig.frame_sizes_ms_x2 = OPUS_FRAMESIZE_20_MS;
decodedAudio.begin(audioInfo);
encodedAudio.begin(audioInfo);
Serial.println("Opus loopback test started");
}
void loop() {
if (copier.copy() == 0) {
delay(1);
}
}

View File

@@ -0,0 +1,26 @@
This sketch is a minimal ESP32-C3 Opus codec smoke test.
What it does:
- Generates a sine wave locally
- Encodes it with Opus
- Decodes it immediately again
- Sends the decoded PCM to I2S
Why this example:
- It tests the raw Opus codec path without Ogg or CAN framing
- It is closer to the later Pi -> CAN -> ESP32 decoder path than MP3
- It keeps CPU load down by using 16 kHz mono and low encoder complexity
Expected hardware:
- ESP32-C3
- I2S DAC / amp on:
- BCLK = GPIO 6
- LRCK = GPIO 7
- DIN = GPIO 5
Required Arduino libraries:
- `arduino-audio-tools`
- `arduino-libopus`
If this sketch runs and outputs a stable sine tone, the basic Opus encode/decode
chain is working on the ESP32-C3.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,29 @@
Solid Edge in STL konvertieren
Datum: Montag,Januar 23,2023 06:20
Quelldatei:C:\source\DeckelV6.par
Ausgangssystem: SOLID EDGE
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL-Exportoptionen:
Ausgabedateiformat:BINARY
Angezeigte Teile exportieren: Aus
Strukturoption: Monolithic
Einheiten exportieren:Millimeter
Toleranzwert exportieren:0,001000
Toleranztyp exportieren:Fine
Flächenplanwinkelwert exportieren:0,523599
Konvertierungsfortschritt:
Phase 1 von 2 - Abrufen der Parasolid-Informationen...
Anzahl erstellter STL-Dateien : 1
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 00
Solid Edge in STL konvertieren
Datum: Montag,Januar 23,2023 06:20
Quelldatei:C:\source\DeckelV6.par
Ausgangssystem: SOLID EDGE
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL-Exportoptionen:
Ausgabedateiformat:BINARY
Angezeigte Teile exportieren: Aus
Strukturoption: Monolithic
Einheiten exportieren:Millimeter
Toleranzwert exportieren:0,001000
Toleranztyp exportieren:Fine
Flächenplanwinkelwert exportieren:0,523599
Konvertierungsfortschritt:
Phase 1 von 2 - Abrufen der Parasolid-Informationen...
Anzahl erstellter STL-Dateien : 1
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 00

View File

@@ -1,25 +1,25 @@
STL translation to Solid Edge
Datum: Dienstag,April 25,2023 09:00
Quelldatei:C:\Users\Martin\Documents\MeyCad\Meycad\SolidEdgeCase\GehaeuseV6.stl
Autor: Unbekannt
Organisation: Unbekannt
Ausgangssystem: DEX
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL Import Options
Vernetzungsfehler reparieren:Aus
Basisformelement erstellen:Ein
Protokollierung aktivieren:Ein
Konvertierungsfortschritt:
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 02
STL translation to Solid Edge
Datum: Dienstag,April 25,2023 09:00
Quelldatei:C:\Users\Martin\Documents\MeyCad\Meycad\SolidEdgeCase\GehaeuseV6.stl
Autor: Unbekannt
Organisation: Unbekannt
Ausgangssystem: DEX
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL Import Options
Vernetzungsfehler reparieren:Aus
Basisformelement erstellen:Ein
Protokollierung aktivieren:Ein
Konvertierungsfortschritt:
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 02

View File

@@ -1,29 +1,29 @@
Solid Edge in STL konvertieren
Datum: Montag,Januar 23,2023 06:21
Quelldatei:C:\source\GehaeuseV6.par
Ausgangssystem: SOLID EDGE
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL-Exportoptionen:
Ausgabedateiformat:BINARY
Angezeigte Teile exportieren: Aus
Strukturoption: Monolithic
Einheiten exportieren:Millimeter
Toleranzwert exportieren:0,001000
Toleranztyp exportieren:Fine
Flächenplanwinkelwert exportieren:0,523599
Konvertierungsfortschritt:
Phase 1 von 2 - Abrufen der Parasolid-Informationen...
Anzahl erstellter STL-Dateien : 1
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 00
Solid Edge in STL konvertieren
Datum: Montag,Januar 23,2023 06:21
Quelldatei:C:\source\GehaeuseV6.par
Ausgangssystem: SOLID EDGE
Hardware:
Prozessor: Intel(R) Core(TM) i7-8559U CPU @ 2.70GHz
Betriebssystem: Windows 10 Professional
Installierter Speicher: 15,87 GB
Software-Informationen:
Parasolid-Version: 35.0.149
PSBodyshop-Version: 35.0.82
Solid Edge-Version: 223.00.00.101 x64
STL-Exportoptionen:
Ausgabedateiformat:BINARY
Angezeigte Teile exportieren: Aus
Strukturoption: Monolithic
Einheiten exportieren:Millimeter
Toleranzwert exportieren:0,001000
Toleranztyp exportieren:Fine
Flächenplanwinkelwert exportieren:0,523599
Konvertierungsfortschritt:
Phase 1 von 2 - Abrufen der Parasolid-Informationen...
Anzahl erstellter STL-Dateien : 1
Konvertierungsvorgang ist abgeschlossen
Zum Konvertieren benötigte Zeit:00 : 00 : 00

1
Switch V8/Meycad/+.txt Normal file
View File

@@ -0,0 +1 @@
Warnung: Breitenkorrektur eingeschränkt. Für die aktuellen Designregeln muss sich der Breitenkorrekturwert im Bereich [0,00004 mils; 7,87398 mils] befinden.

View File

@@ -0,0 +1,820 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:29+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Copper,L2,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:29*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,ComponentPad*%
%ADD10R,1.700000X1.700000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD11C,1.700000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD12C,0.508000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD13C,0.635000*%
%TD*%
G04 APERTURE END LIST*
D10*
%TO.P,J_Extension1,1,Pin_1*%
%TO.N,/E5*%
X104140000Y-71120000D03*
D11*
%TO.P,J_Extension1,2,Pin_2*%
%TO.N,/E6*%
X104140000Y-73660000D03*
%TO.P,J_Extension1,3,Pin_3*%
%TO.N,/E7*%
X101600000Y-71120000D03*
%TO.P,J_Extension1,4,Pin_4*%
%TO.N,/E8*%
X101600000Y-73660000D03*
%TO.P,J_Extension1,5,Pin_5*%
%TO.N,/E4*%
X99060000Y-71120000D03*
%TO.P,J_Extension1,6,Pin_6*%
%TO.N,/E3*%
X99060000Y-73660000D03*
%TO.P,J_Extension1,7,Pin_7*%
%TO.N,/E2*%
X96520000Y-71120000D03*
%TO.P,J_Extension1,8,Pin_8*%
%TO.N,/E1*%
X96520000Y-73660000D03*
%TD*%
%TO.P,CAN_4_1,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-73660000D03*
%TO.P,CAN_4_1,3,Pin_3*%
%TO.N,/CAN4_H*%
X180340000Y-76200000D03*
%TO.P,CAN_4_1,2,Pin_2*%
%TO.N,/CAN4_L*%
X180340000Y-78740000D03*
D10*
%TO.P,CAN_4_1,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-81280000D03*
%TD*%
%TO.P,J_Front_1_1,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-99060000D03*
D11*
%TO.P,J_Front_1_1,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-96520000D03*
%TO.P,J_Front_1_1,3,Pin_3*%
X175260000Y-93980000D03*
%TD*%
D10*
%TO.P,J6,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-93980000D03*
D11*
%TO.P,J6,2,Pin_2*%
%TO.N,/CAN3_L*%
X187960000Y-91440000D03*
%TO.P,J6,3,Pin_3*%
%TO.N,/CAN3_H*%
X187960000Y-88900000D03*
%TO.P,J6,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-86360000D03*
%TD*%
%TO.P,Arduino_R1,12,Pin_12*%
%TO.N,unconnected-(Arduino_R1-Pin_12-Pad12)*%
X107696000Y-111760000D03*
%TO.P,Arduino_R1,11,Pin_11*%
%TO.N,unconnected-(Arduino_R1-Pin_11-Pad11)*%
X107696000Y-109220000D03*
%TO.P,Arduino_R1,10,Pin_10*%
%TO.N,unconnected-(Arduino_R1-Pin_10-Pad10)*%
X107696000Y-106680000D03*
%TO.P,Arduino_R1,9,Pin_9*%
%TO.N,unconnected-(Arduino_R1-Pin_9-Pad9)*%
X107696000Y-104140000D03*
%TO.P,Arduino_R1,8,Pin_8*%
%TO.N,/E1*%
X107696000Y-101600000D03*
%TO.P,Arduino_R1,7,Pin_7*%
%TO.N,/E2*%
X107696000Y-99060000D03*
%TO.P,Arduino_R1,6,Pin_6*%
%TO.N,/E3*%
X107696000Y-96520000D03*
%TO.P,Arduino_R1,5,Pin_5*%
%TO.N,/E4*%
X107696000Y-93980000D03*
%TO.P,Arduino_R1,4,Pin_4*%
%TO.N,/E8*%
X107696000Y-91440000D03*
%TO.P,Arduino_R1,3,Pin_3*%
%TO.N,/E7*%
X107696000Y-88900000D03*
%TO.P,Arduino_R1,2,Pin_2*%
%TO.N,/E6*%
X107696000Y-86360000D03*
D10*
%TO.P,Arduino_R1,1,Pin_1*%
%TO.N,/E5*%
X107696000Y-83820000D03*
%TD*%
%TO.P,J2,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-119380000D03*
D11*
%TO.P,J2,2,Pin_2*%
%TO.N,/CAN1_L*%
X180340000Y-116840000D03*
%TO.P,J2,3,Pin_3*%
%TO.N,/CAN1_H*%
X180340000Y-114300000D03*
%TO.P,J2,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-111760000D03*
%TD*%
D10*
%TO.P,J10,1,Pin_1*%
%TO.N,/CAN3_L*%
X175260000Y-91440000D03*
D11*
%TO.P,J10,2,Pin_2*%
%TO.N,/CAN3_H*%
X175260000Y-88900000D03*
%TD*%
D10*
%TO.P,J_Front_1_3,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-86360000D03*
D11*
%TO.P,J_Front_1_3,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-83820000D03*
%TO.P,J_Front_1_3,3,Pin_3*%
X175260000Y-81280000D03*
%TD*%
D10*
%TO.P,J_Front_2,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-93980000D03*
D11*
%TO.P,J_Front_2,2,Pin_2*%
%TO.N,unconnected-(J_Front_2-Pin_2-Pad2)*%
X167640000Y-96520000D03*
%TO.P,J_Front_2,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-99060000D03*
%TD*%
D10*
%TO.P,J4,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-93980000D03*
D11*
%TO.P,J4,2,Pin_2*%
%TO.N,/CAN3_L*%
X180340000Y-91440000D03*
%TO.P,J4,3,Pin_3*%
%TO.N,/CAN3_H*%
X180340000Y-88900000D03*
%TO.P,J4,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-86360000D03*
%TD*%
D10*
%TO.P,J_CAN_2,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-106680000D03*
D11*
%TO.P,J_CAN_2,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-106680000D03*
%TO.P,J_CAN_2,3,Pin_3*%
%TO.N,/CS2*%
X127000000Y-106680000D03*
%TO.P,J_CAN_2,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-106680000D03*
%TO.P,J_CAN_2,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-106680000D03*
%TO.P,J_CAN_2,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-106680000D03*
%TO.P,J_CAN_2,7,Pin_7*%
%TO.N,unconnected-(J_CAN_2-Pin_7-Pad7)*%
X137160000Y-106680000D03*
%TD*%
D10*
%TO.P,J_Front_3,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-106680000D03*
D11*
%TO.P,J_Front_3,2,Pin_2*%
%TO.N,unconnected-(J_Front_3-Pin_2-Pad2)*%
X167640000Y-109220000D03*
%TO.P,J_Front_3,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-111760000D03*
%TD*%
%TO.P,Arduino_L1,12,Pin_12*%
%TO.N,/5V*%
X92456000Y-111760000D03*
%TO.P,Arduino_L1,11,Pin_11*%
%TO.N,/GND*%
X92456000Y-109220000D03*
%TO.P,Arduino_L1,10,Pin_10*%
%TO.N,unconnected-(Arduino_L1-Pin_10-Pad10)*%
X92456000Y-106680000D03*
%TO.P,Arduino_L1,9,Pin_9*%
%TO.N,unconnected-(Arduino_L1-Pin_9-Pad9)*%
X92456000Y-104140000D03*
%TO.P,Arduino_L1,8,Pin_8*%
%TO.N,/CS1*%
X92456000Y-101600000D03*
%TO.P,Arduino_L1,7,Pin_7*%
%TO.N,/CS2*%
X92456000Y-99060000D03*
%TO.P,Arduino_L1,6,Pin_6*%
%TO.N,/CS3*%
X92456000Y-96520000D03*
%TO.P,Arduino_L1,5,Pin_5*%
%TO.N,/CS4*%
X92456000Y-93980000D03*
%TO.P,Arduino_L1,4,Pin_4*%
%TO.N,/SO*%
X92456000Y-91440000D03*
%TO.P,Arduino_L1,3,Pin_3*%
%TO.N,/SI*%
X92456000Y-88900000D03*
%TO.P,Arduino_L1,2,Pin_2*%
%TO.N,/SCK*%
X92456000Y-86360000D03*
D10*
%TO.P,Arduino_L1,1,Pin_1*%
%TO.N,unconnected-(Arduino_L1-Pin_1-Pad1)*%
X92456000Y-83820000D03*
%TD*%
%TO.P,J_CAN_1,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-119380000D03*
D11*
%TO.P,J_CAN_1,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-119380000D03*
%TO.P,J_CAN_1,3,Pin_3*%
%TO.N,/CS1*%
X127000000Y-119380000D03*
%TO.P,J_CAN_1,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-119380000D03*
%TO.P,J_CAN_1,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-119380000D03*
%TO.P,J_CAN_1,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-119380000D03*
%TO.P,J_CAN_1,7,Pin_7*%
%TO.N,unconnected-(J_CAN_1-Pin_7-Pad7)*%
X137160000Y-119380000D03*
%TD*%
D10*
%TO.P,J_Front_1_2,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-111760000D03*
D11*
%TO.P,J_Front_1_2,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-109220000D03*
%TO.P,J_Front_1_2,3,Pin_3*%
X175260000Y-106680000D03*
%TD*%
%TO.P,J_Front_1,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-86360000D03*
%TO.P,J_Front_1,2,Pin_2*%
%TO.N,unconnected-(J_Front_1-Pin_2-Pad2)*%
X167640000Y-83820000D03*
D10*
%TO.P,J_Front_1,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-81280000D03*
%TD*%
%TO.P,J7,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-81280000D03*
D11*
%TO.P,J7,2,Pin_2*%
%TO.N,/CAN4_L*%
X187960000Y-78740000D03*
%TO.P,J7,3,Pin_3*%
%TO.N,/CAN4_H*%
X187960000Y-76200000D03*
%TO.P,J7,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-73660000D03*
%TD*%
D10*
%TO.P,J9,1,Pin_1*%
%TO.N,/CAN2_L*%
X175260000Y-104140000D03*
D11*
%TO.P,J9,2,Pin_2*%
%TO.N,/CAN2_H*%
X175260000Y-101600000D03*
%TD*%
D10*
%TO.P,JJ_CAN_4,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-81280000D03*
D11*
%TO.P,JJ_CAN_4,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-81280000D03*
%TO.P,JJ_CAN_4,3,Pin_3*%
%TO.N,/CS4*%
X127000000Y-81280000D03*
%TO.P,JJ_CAN_4,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-81280000D03*
%TO.P,JJ_CAN_4,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-81280000D03*
%TO.P,JJ_CAN_4,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-81280000D03*
%TO.P,JJ_CAN_4,7,Pin_7*%
%TO.N,unconnected-(JJ_CAN_4-Pin_7-Pad7)*%
X137160000Y-81280000D03*
%TD*%
D10*
%TO.P,J8,1,Pin_1*%
%TO.N,/CAN1_L*%
X175260000Y-116840000D03*
D11*
%TO.P,J8,2,Pin_2*%
%TO.N,/CAN1_H*%
X175260000Y-114300000D03*
%TD*%
D10*
%TO.P,CAN_2_1,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-106680000D03*
D11*
%TO.P,CAN_2_1,2,Pin_2*%
%TO.N,/CAN2_L*%
X180340000Y-104140000D03*
%TO.P,CAN_2_1,3,Pin_3*%
%TO.N,/CAN2_H*%
X180340000Y-101600000D03*
%TO.P,CAN_2_1,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-99060000D03*
%TD*%
D10*
%TO.P,J_CAN_3,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-93980000D03*
D11*
%TO.P,J_CAN_3,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-93980000D03*
%TO.P,J_CAN_3,3,Pin_3*%
%TO.N,/CS3*%
X127000000Y-93980000D03*
%TO.P,J_CAN_3,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-93980000D03*
%TO.P,J_CAN_3,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-93980000D03*
%TO.P,J_CAN_3,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-93980000D03*
%TO.P,J_CAN_3,7,Pin_7*%
%TO.N,unconnected-(J_CAN_3-Pin_7-Pad7)*%
X137160000Y-93980000D03*
%TD*%
%TO.P,J1,2,Pin_2*%
%TO.N,/24V*%
X167640000Y-116750000D03*
D10*
%TO.P,J1,1,Pin_1*%
%TO.N,/GND*%
X165100000Y-116750000D03*
%TD*%
%TO.P,J11,1,Pin_1*%
%TO.N,/CAN4_L*%
X175260000Y-78740000D03*
D11*
%TO.P,J11,2,Pin_2*%
%TO.N,/CAN4_H*%
X175260000Y-76200000D03*
%TD*%
D10*
%TO.P,J_Extension_2,1,Pin_1*%
%TO.N,/5V*%
X167640000Y-66040000D03*
D11*
%TO.P,J_Extension_2,2,Pin_2*%
%TO.N,/GND*%
X167640000Y-68580000D03*
%TO.P,J_Extension_2,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-71120000D03*
%TD*%
D10*
%TO.P,J5,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-106680000D03*
D11*
%TO.P,J5,2,Pin_2*%
%TO.N,/CAN2_L*%
X187960000Y-104140000D03*
%TO.P,J5,3,Pin_3*%
%TO.N,/CAN2_H*%
X187960000Y-101600000D03*
%TO.P,J5,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-99060000D03*
%TD*%
D10*
%TO.P,J3,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-119380000D03*
D11*
%TO.P,J3,2,Pin_2*%
%TO.N,/CAN1_L*%
X187960000Y-116840000D03*
%TO.P,J3,3,Pin_3*%
%TO.N,/CAN1_H*%
X187960000Y-114300000D03*
%TO.P,J3,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-111760000D03*
%TD*%
D10*
%TO.P,J_Stepdown1,1,Pin_1*%
%TO.N,/5V*%
X153341400Y-83594200D03*
D11*
%TO.P,J_Stepdown1,2,Pin_2*%
%TO.N,/GND*%
X153341400Y-86134200D03*
%TO.P,J_Stepdown1,3,Pin_3*%
%TO.N,/24V*%
X153341400Y-88674200D03*
%TD*%
D12*
%TO.N,/CS3*%
X100063401Y-83492200D02*
X100063400Y-88484165D01*
X113251223Y-80846700D02*
X102708902Y-80846700D01*
X102708902Y-80846700D02*
X100063401Y-83492200D01*
X117187720Y-84783198D02*
X113251223Y-80846700D01*
X117190396Y-84783198D02*
X117187720Y-84783198D01*
X96518400Y-94997600D02*
X94996000Y-96520000D01*
X117190401Y-84783200D02*
X117190396Y-84783198D01*
X117481401Y-85074200D02*
X117190401Y-84783200D01*
X117484078Y-85074200D02*
X117481401Y-85074200D01*
X118484078Y-86074200D02*
X117484078Y-85074200D01*
X125317200Y-86074200D02*
X118484078Y-86074200D01*
X100063400Y-88484165D02*
X96518400Y-92029167D01*
X127000000Y-87757000D02*
X125317200Y-86074200D01*
X127000000Y-93980000D02*
X127000000Y-87757000D01*
X96518400Y-92029167D02*
X96518400Y-94997600D01*
X94996000Y-96520000D02*
X92456000Y-96520000D01*
%TO.N,/CS4*%
X117484074Y-84074195D02*
X117775079Y-84365200D01*
X117481395Y-84074195D02*
X117484074Y-84074195D01*
X118777756Y-85365200D02*
X125200800Y-85365200D01*
X113544901Y-80137700D02*
X117481395Y-84074195D01*
X117775079Y-84365200D02*
X117777756Y-84365200D01*
X102415225Y-80137700D02*
X113544901Y-80137700D01*
X99354401Y-83198522D02*
X102415225Y-80137700D01*
X99354400Y-88190487D02*
X99354401Y-83198522D01*
X95809400Y-92658600D02*
X95809400Y-91735489D01*
X117777756Y-84365200D02*
X118777756Y-85365200D01*
X95809400Y-91735489D02*
X99354400Y-88190487D01*
X94488000Y-93980000D02*
X95809400Y-92658600D01*
X125200800Y-85365200D02*
X127000000Y-83566000D01*
X92456000Y-93980000D02*
X94488000Y-93980000D01*
X127000000Y-83566000D02*
X127000000Y-81280000D01*
%TO.N,/CS1*%
X118772400Y-88367878D02*
X118772400Y-110365200D01*
X116896722Y-86492200D02*
X118772400Y-88367878D01*
X103296258Y-82264700D02*
X112663869Y-82264700D01*
X116600369Y-86201200D02*
X116603046Y-86201200D01*
X101481400Y-84079557D02*
X103296258Y-82264700D01*
X116603046Y-86201200D02*
X116894050Y-86492200D01*
X101481400Y-89071518D02*
X101481400Y-84079557D01*
X116894050Y-86492200D02*
X116896722Y-86492200D01*
X97936400Y-92616522D02*
X101481400Y-89071518D01*
X97936400Y-100691600D02*
X97936400Y-92616522D01*
X112663869Y-82264700D02*
X116600369Y-86201200D01*
X97028000Y-101600000D02*
X97936400Y-100691600D01*
X125790200Y-112074200D02*
X127000000Y-113284000D01*
X92456000Y-101600000D02*
X97028000Y-101600000D01*
X118772400Y-110365200D02*
X120481401Y-112074200D01*
X120481401Y-112074200D02*
X125790200Y-112074200D01*
X127000000Y-113284000D02*
X127000000Y-119380000D01*
%TO.N,/CS2*%
X112957547Y-81555700D02*
X116894045Y-85492198D01*
X100772400Y-83785879D02*
X103002581Y-81555700D01*
X103002581Y-81555700D02*
X112957547Y-81555700D01*
X100772400Y-88777841D02*
X100772400Y-83785879D01*
X97227400Y-92322845D02*
X100772400Y-88777841D01*
X97227400Y-97336600D02*
X97227400Y-92322845D01*
X116894045Y-85492198D02*
X116896719Y-85492198D01*
X95504000Y-99060000D02*
X97227400Y-97336600D01*
X119481400Y-88074201D02*
X119481400Y-110071522D01*
X127000000Y-110236000D02*
X127000000Y-106680000D01*
X117190400Y-85783200D02*
X119481400Y-88074201D01*
X125870800Y-111365200D02*
X127000000Y-110236000D01*
X117187723Y-85783200D02*
X117190400Y-85783200D01*
X120775078Y-111365200D02*
X125870800Y-111365200D01*
X116896719Y-85492198D02*
X117187723Y-85783200D01*
X92456000Y-99060000D02*
X95504000Y-99060000D01*
X119481400Y-110071522D02*
X120775078Y-111365200D01*
%TO.N,/SCK*%
X101623992Y-78010700D02*
X101937240Y-78010700D01*
X101092564Y-78272720D02*
X101133284Y-78232000D01*
X102211339Y-78010693D02*
X102211346Y-78010700D01*
X101424088Y-78031000D02*
X101603692Y-78031000D01*
X101133284Y-78232000D02*
X101223088Y-78232000D01*
X101937240Y-78010700D02*
X102211339Y-78010693D01*
X101092564Y-78362522D02*
X101092564Y-78272720D01*
X101603692Y-78031000D02*
X101623992Y-78010700D01*
X97227400Y-82227687D02*
X101092564Y-78362522D01*
X97227400Y-85652600D02*
X97227400Y-82227687D01*
X134620000Y-78740000D02*
X134620000Y-81280000D01*
X96520000Y-86360000D02*
X97227400Y-85652600D01*
X101223088Y-78232000D02*
X101424088Y-78031000D01*
X92456000Y-86360000D02*
X96520000Y-86360000D01*
X102211346Y-78010700D02*
X133890700Y-78010700D01*
X133890700Y-78010700D02*
X134620000Y-78740000D01*
%TO.N,/SI*%
X92456000Y-88900000D02*
X96520000Y-88900000D01*
X96520000Y-88900000D02*
X97936400Y-87483600D01*
X101717765Y-78740000D02*
X101897370Y-78740000D01*
X101897388Y-78739992D02*
X101917679Y-78719700D01*
X97936400Y-87483600D02*
X97936400Y-82521365D01*
X97936400Y-82521365D02*
X101717765Y-78740000D01*
X101917679Y-78719700D02*
X130789700Y-78719700D01*
X101897370Y-78740000D02*
X101897378Y-78739992D01*
X101897378Y-78739992D02*
X101897388Y-78739992D01*
X130789700Y-78719700D02*
X132080000Y-80010000D01*
X132080000Y-80010000D02*
X132080000Y-81280000D01*
%TO.N,/SO*%
X129540000Y-81280000D02*
X127688700Y-79428700D01*
X127688700Y-79428700D02*
X102211347Y-79428700D01*
%TO.N,/GND*%
X92456000Y-109220000D02*
X94488000Y-109220000D01*
X94488000Y-109220000D02*
X95504000Y-110236000D01*
X95504000Y-110236000D02*
X95504000Y-113284000D01*
X96520000Y-114300000D02*
X121920000Y-114300000D01*
X95504000Y-113284000D02*
X96520000Y-114300000D01*
X121920000Y-114300000D02*
X124460000Y-116840000D01*
X124460000Y-116840000D02*
X124460000Y-119380000D01*
%TO.N,/SO*%
X98645400Y-87896810D02*
X95102210Y-91440000D01*
X95102210Y-91440000D02*
X92456000Y-91440000D01*
%TO.N,/SCK*%
X134620000Y-119380000D02*
X134620000Y-81280000D01*
%TO.N,/SI*%
X132080000Y-81280000D02*
X132080000Y-119380000D01*
%TO.N,/SO*%
X129540000Y-119380000D02*
X129540000Y-81280000D01*
X98645400Y-87896810D02*
X98645400Y-82904845D01*
X98645400Y-82904845D02*
X102058045Y-79492200D01*
D13*
%TO.N,/GND*%
X163941400Y-105621400D02*
X165100000Y-106780000D01*
X165100000Y-106780000D02*
X165100000Y-116750000D01*
X163941400Y-84274200D02*
X163941400Y-82058600D01*
X163941400Y-82058600D02*
X164720000Y-81280000D01*
X164720000Y-81280000D02*
X167640000Y-81280000D01*
X162081400Y-86134200D02*
X163941400Y-84274200D01*
X163941400Y-84274200D02*
X163941400Y-84600000D01*
%TO.N,/CAN_GND*%
X182500000Y-105750000D02*
X182500000Y-118750000D01*
X182500000Y-118750000D02*
X181870000Y-119380000D01*
X181870000Y-119380000D02*
X180340000Y-119380000D01*
X182500000Y-92750000D02*
X182500000Y-105750000D01*
X182500000Y-105750000D02*
X181570000Y-106680000D01*
X181570000Y-106680000D02*
X180340000Y-106680000D01*
X180340000Y-81280000D02*
X181530000Y-81280000D01*
X181530000Y-81280000D02*
X182500000Y-82250000D01*
X182500000Y-82250000D02*
X182500000Y-92750000D01*
X182500000Y-92750000D02*
X181270000Y-93980000D01*
X181270000Y-93980000D02*
X180340000Y-93980000D01*
%TO.N,/CAN_24V*%
X177750000Y-98000000D02*
X177750000Y-111000000D01*
X177750000Y-111000000D02*
X178510000Y-111760000D01*
X178510000Y-111760000D02*
X180340000Y-111760000D01*
X177750000Y-85750000D02*
X177750000Y-98000000D01*
X177750000Y-98000000D02*
X178810000Y-99060000D01*
X178810000Y-99060000D02*
X180340000Y-99060000D01*
X180340000Y-73660000D02*
X178590000Y-73660000D01*
X178590000Y-73660000D02*
X177750000Y-74500000D01*
X177750000Y-74500000D02*
X177750000Y-85750000D01*
X177750000Y-85750000D02*
X178360000Y-86360000D01*
X178360000Y-86360000D02*
X180340000Y-86360000D01*
%TO.N,/GND*%
X163941400Y-92941400D02*
X164980000Y-93980000D01*
X163941400Y-91800000D02*
X163941400Y-92941400D01*
X162201400Y-86134200D02*
X163941400Y-87874200D01*
X153341400Y-86134200D02*
X162081400Y-86134200D01*
X163941400Y-91800000D02*
X163941400Y-105621400D01*
X163941400Y-87874200D02*
X163941400Y-84600000D01*
X163941400Y-105621400D02*
X165000000Y-106680000D01*
X162081400Y-86134200D02*
X162201400Y-86134200D01*
X164980000Y-93980000D02*
X167640000Y-93980000D01*
X165000000Y-106680000D02*
X167640000Y-106680000D01*
X163941400Y-91800000D02*
X163941400Y-87874200D01*
D12*
%TO.N,/E5*%
X107421400Y-84134200D02*
X107981400Y-84134200D01*
%TD*%
%TA.AperFunction,Conductor*%
%TO.N,/GND*%
G36*
X163889279Y-84807265D02*
G01*
X163939802Y-84855526D01*
X163956118Y-84909694D01*
X164123282Y-87584312D01*
X164107817Y-87652449D01*
X164057970Y-87701409D01*
X163989567Y-87715647D01*
X163924324Y-87690643D01*
X163919509Y-87686777D01*
X163127182Y-87017531D01*
X162197722Y-86232452D01*
X162159210Y-86174157D01*
X162158329Y-86104293D01*
X162195359Y-86045043D01*
X162201160Y-86040194D01*
X163755797Y-84819888D01*
X163820684Y-84793980D01*
X163889279Y-84807265D01*
G37*
%TD.AperFunction*%
%TD*%
M02*

View File

@@ -0,0 +1,245 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:30+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Bot*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:30*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10R,1.700000X1.700000*%
%ADD11C,1.700000*%
G04 APERTURE END LIST*
D10*
%TO.C,J_Extension1*%
X104140000Y-71120000D03*
D11*
X104140000Y-73660000D03*
X101600000Y-71120000D03*
X101600000Y-73660000D03*
X99060000Y-71120000D03*
X99060000Y-73660000D03*
X96520000Y-71120000D03*
X96520000Y-73660000D03*
%TD*%
%TO.C,CAN_4_1*%
X180340000Y-73660000D03*
X180340000Y-76200000D03*
X180340000Y-78740000D03*
D10*
X180340000Y-81280000D03*
%TD*%
%TO.C,J_Front_1_1*%
X175260000Y-99060000D03*
D11*
X175260000Y-96520000D03*
X175260000Y-93980000D03*
%TD*%
D10*
%TO.C,J6*%
X187960000Y-93980000D03*
D11*
X187960000Y-91440000D03*
X187960000Y-88900000D03*
X187960000Y-86360000D03*
%TD*%
%TO.C,Arduino_R1*%
X107696000Y-111760000D03*
X107696000Y-109220000D03*
X107696000Y-106680000D03*
X107696000Y-104140000D03*
X107696000Y-101600000D03*
X107696000Y-99060000D03*
X107696000Y-96520000D03*
X107696000Y-93980000D03*
X107696000Y-91440000D03*
X107696000Y-88900000D03*
X107696000Y-86360000D03*
D10*
X107696000Y-83820000D03*
%TD*%
%TO.C,J2*%
X180340000Y-119380000D03*
D11*
X180340000Y-116840000D03*
X180340000Y-114300000D03*
X180340000Y-111760000D03*
%TD*%
D10*
%TO.C,J10*%
X175260000Y-91440000D03*
D11*
X175260000Y-88900000D03*
%TD*%
D10*
%TO.C,J_Front_1_3*%
X175260000Y-86360000D03*
D11*
X175260000Y-83820000D03*
X175260000Y-81280000D03*
%TD*%
D10*
%TO.C,J_Front_2*%
X167640000Y-93980000D03*
D11*
X167640000Y-96520000D03*
X167640000Y-99060000D03*
%TD*%
D10*
%TO.C,J4*%
X180340000Y-93980000D03*
D11*
X180340000Y-91440000D03*
X180340000Y-88900000D03*
X180340000Y-86360000D03*
%TD*%
D10*
%TO.C,J_CAN_2*%
X121920000Y-106680000D03*
D11*
X124460000Y-106680000D03*
X127000000Y-106680000D03*
X129540000Y-106680000D03*
X132080000Y-106680000D03*
X134620000Y-106680000D03*
X137160000Y-106680000D03*
%TD*%
D10*
%TO.C,J_Front_3*%
X167640000Y-106680000D03*
D11*
X167640000Y-109220000D03*
X167640000Y-111760000D03*
%TD*%
%TO.C,Arduino_L1*%
X92456000Y-111760000D03*
X92456000Y-109220000D03*
X92456000Y-106680000D03*
X92456000Y-104140000D03*
X92456000Y-101600000D03*
X92456000Y-99060000D03*
X92456000Y-96520000D03*
X92456000Y-93980000D03*
X92456000Y-91440000D03*
X92456000Y-88900000D03*
X92456000Y-86360000D03*
D10*
X92456000Y-83820000D03*
%TD*%
%TO.C,J_CAN_1*%
X121920000Y-119380000D03*
D11*
X124460000Y-119380000D03*
X127000000Y-119380000D03*
X129540000Y-119380000D03*
X132080000Y-119380000D03*
X134620000Y-119380000D03*
X137160000Y-119380000D03*
%TD*%
D10*
%TO.C,J_Front_1_2*%
X175260000Y-111760000D03*
D11*
X175260000Y-109220000D03*
X175260000Y-106680000D03*
%TD*%
%TO.C,J_Front_1*%
X167640000Y-86360000D03*
X167640000Y-83820000D03*
D10*
X167640000Y-81280000D03*
%TD*%
%TO.C,J7*%
X187960000Y-81280000D03*
D11*
X187960000Y-78740000D03*
X187960000Y-76200000D03*
X187960000Y-73660000D03*
%TD*%
D10*
%TO.C,J9*%
X175260000Y-104140000D03*
D11*
X175260000Y-101600000D03*
%TD*%
D10*
%TO.C,JJ_CAN_4*%
X121920000Y-81280000D03*
D11*
X124460000Y-81280000D03*
X127000000Y-81280000D03*
X129540000Y-81280000D03*
X132080000Y-81280000D03*
X134620000Y-81280000D03*
X137160000Y-81280000D03*
%TD*%
D10*
%TO.C,J8*%
X175260000Y-116840000D03*
D11*
X175260000Y-114300000D03*
%TD*%
D10*
%TO.C,CAN_2_1*%
X180340000Y-106680000D03*
D11*
X180340000Y-104140000D03*
X180340000Y-101600000D03*
X180340000Y-99060000D03*
%TD*%
D10*
%TO.C,J_CAN_3*%
X121920000Y-93980000D03*
D11*
X124460000Y-93980000D03*
X127000000Y-93980000D03*
X129540000Y-93980000D03*
X132080000Y-93980000D03*
X134620000Y-93980000D03*
X137160000Y-93980000D03*
%TD*%
%TO.C,J1*%
X167640000Y-116750000D03*
D10*
X165100000Y-116750000D03*
%TD*%
%TO.C,J11*%
X175260000Y-78740000D03*
D11*
X175260000Y-76200000D03*
%TD*%
D10*
%TO.C,J_Extension_2*%
X167640000Y-66040000D03*
D11*
X167640000Y-68580000D03*
X167640000Y-71120000D03*
%TD*%
D10*
%TO.C,J5*%
X187960000Y-106680000D03*
D11*
X187960000Y-104140000D03*
X187960000Y-101600000D03*
X187960000Y-99060000D03*
%TD*%
D10*
%TO.C,J3*%
X187960000Y-119380000D03*
D11*
X187960000Y-116840000D03*
X187960000Y-114300000D03*
X187960000Y-111760000D03*
%TD*%
D10*
%TO.C,J_Stepdown1*%
X153341400Y-83594200D03*
D11*
X153341400Y-86134200D03*
X153341400Y-88674200D03*
%TD*%
M02*

View File

@@ -0,0 +1,15 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:29+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:29*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -0,0 +1,15 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:29+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Legend,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:29*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

View File

@@ -0,0 +1,43 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:30+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Profile,NP*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:30*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,Profile*%
%ADD10C,0.050000*%
%TD*%
G04 APERTURE END LIST*
D10*
X171037200Y-57750000D02*
X171500000Y-57750000D01*
X171500000Y-121250000D01*
X171037200Y-121250000D01*
X171037200Y-57750000D01*
X90116400Y-57574200D02*
X190436400Y-57574200D01*
X190436400Y-121574200D01*
X90116400Y-121574200D01*
X90116400Y-57574200D01*
X106605200Y-76441200D02*
X161000000Y-76441200D01*
X161000000Y-77000000D01*
X106605200Y-77000000D01*
X106605200Y-76441200D01*
X165287200Y-76441200D02*
X170750000Y-76441200D01*
X170750000Y-77000000D01*
X165287200Y-77000000D01*
X165287200Y-76441200D01*
X90250000Y-76352400D02*
X93560000Y-76352400D01*
X93560000Y-76911200D01*
X90250000Y-76911200D01*
X90250000Y-76352400D01*
M02*

View File

@@ -0,0 +1,808 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:29+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Copper,L1,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:29*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,ComponentPad*%
%ADD10R,1.700000X1.700000*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD11C,1.700000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD12C,0.635000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD13C,0.381000*%
%TD*%
G04 APERTURE END LIST*
D10*
%TO.P,J_Extension1,1,Pin_1*%
%TO.N,/E5*%
X104140000Y-71120000D03*
D11*
%TO.P,J_Extension1,2,Pin_2*%
%TO.N,/E6*%
X104140000Y-73660000D03*
%TO.P,J_Extension1,3,Pin_3*%
%TO.N,/E7*%
X101600000Y-71120000D03*
%TO.P,J_Extension1,4,Pin_4*%
%TO.N,/E8*%
X101600000Y-73660000D03*
%TO.P,J_Extension1,5,Pin_5*%
%TO.N,/E4*%
X99060000Y-71120000D03*
%TO.P,J_Extension1,6,Pin_6*%
%TO.N,/E3*%
X99060000Y-73660000D03*
%TO.P,J_Extension1,7,Pin_7*%
%TO.N,/E2*%
X96520000Y-71120000D03*
%TO.P,J_Extension1,8,Pin_8*%
%TO.N,/E1*%
X96520000Y-73660000D03*
%TD*%
%TO.P,CAN_4_1,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-73660000D03*
%TO.P,CAN_4_1,3,Pin_3*%
%TO.N,/CAN4_H*%
X180340000Y-76200000D03*
%TO.P,CAN_4_1,2,Pin_2*%
%TO.N,/CAN4_L*%
X180340000Y-78740000D03*
D10*
%TO.P,CAN_4_1,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-81280000D03*
%TD*%
%TO.P,J_Front_1_1,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-99060000D03*
D11*
%TO.P,J_Front_1_1,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-96520000D03*
%TO.P,J_Front_1_1,3,Pin_3*%
X175260000Y-93980000D03*
%TD*%
D10*
%TO.P,J6,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-93980000D03*
D11*
%TO.P,J6,2,Pin_2*%
%TO.N,/CAN3_L*%
X187960000Y-91440000D03*
%TO.P,J6,3,Pin_3*%
%TO.N,/CAN3_H*%
X187960000Y-88900000D03*
%TO.P,J6,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-86360000D03*
%TD*%
%TO.P,Arduino_R1,12,Pin_12*%
%TO.N,unconnected-(Arduino_R1-Pin_12-Pad12)*%
X107696000Y-111760000D03*
%TO.P,Arduino_R1,11,Pin_11*%
%TO.N,unconnected-(Arduino_R1-Pin_11-Pad11)*%
X107696000Y-109220000D03*
%TO.P,Arduino_R1,10,Pin_10*%
%TO.N,unconnected-(Arduino_R1-Pin_10-Pad10)*%
X107696000Y-106680000D03*
%TO.P,Arduino_R1,9,Pin_9*%
%TO.N,unconnected-(Arduino_R1-Pin_9-Pad9)*%
X107696000Y-104140000D03*
%TO.P,Arduino_R1,8,Pin_8*%
%TO.N,/E1*%
X107696000Y-101600000D03*
%TO.P,Arduino_R1,7,Pin_7*%
%TO.N,/E2*%
X107696000Y-99060000D03*
%TO.P,Arduino_R1,6,Pin_6*%
%TO.N,/E3*%
X107696000Y-96520000D03*
%TO.P,Arduino_R1,5,Pin_5*%
%TO.N,/E4*%
X107696000Y-93980000D03*
%TO.P,Arduino_R1,4,Pin_4*%
%TO.N,/E8*%
X107696000Y-91440000D03*
%TO.P,Arduino_R1,3,Pin_3*%
%TO.N,/E7*%
X107696000Y-88900000D03*
%TO.P,Arduino_R1,2,Pin_2*%
%TO.N,/E6*%
X107696000Y-86360000D03*
D10*
%TO.P,Arduino_R1,1,Pin_1*%
%TO.N,/E5*%
X107696000Y-83820000D03*
%TD*%
%TO.P,J2,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-119380000D03*
D11*
%TO.P,J2,2,Pin_2*%
%TO.N,/CAN1_L*%
X180340000Y-116840000D03*
%TO.P,J2,3,Pin_3*%
%TO.N,/CAN1_H*%
X180340000Y-114300000D03*
%TO.P,J2,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-111760000D03*
%TD*%
D10*
%TO.P,J10,1,Pin_1*%
%TO.N,/CAN3_L*%
X175260000Y-91440000D03*
D11*
%TO.P,J10,2,Pin_2*%
%TO.N,/CAN3_H*%
X175260000Y-88900000D03*
%TD*%
D10*
%TO.P,J_Front_1_3,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-86360000D03*
D11*
%TO.P,J_Front_1_3,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-83820000D03*
%TO.P,J_Front_1_3,3,Pin_3*%
X175260000Y-81280000D03*
%TD*%
D10*
%TO.P,J_Front_2,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-93980000D03*
D11*
%TO.P,J_Front_2,2,Pin_2*%
%TO.N,unconnected-(J_Front_2-Pin_2-Pad2)*%
X167640000Y-96520000D03*
%TO.P,J_Front_2,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-99060000D03*
%TD*%
D10*
%TO.P,J4,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-93980000D03*
D11*
%TO.P,J4,2,Pin_2*%
%TO.N,/CAN3_L*%
X180340000Y-91440000D03*
%TO.P,J4,3,Pin_3*%
%TO.N,/CAN3_H*%
X180340000Y-88900000D03*
%TO.P,J4,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-86360000D03*
%TD*%
D10*
%TO.P,J_CAN_2,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-106680000D03*
D11*
%TO.P,J_CAN_2,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-106680000D03*
%TO.P,J_CAN_2,3,Pin_3*%
%TO.N,/CS2*%
X127000000Y-106680000D03*
%TO.P,J_CAN_2,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-106680000D03*
%TO.P,J_CAN_2,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-106680000D03*
%TO.P,J_CAN_2,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-106680000D03*
%TO.P,J_CAN_2,7,Pin_7*%
%TO.N,unconnected-(J_CAN_2-Pin_7-Pad7)*%
X137160000Y-106680000D03*
%TD*%
D10*
%TO.P,J_Front_3,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-106680000D03*
D11*
%TO.P,J_Front_3,2,Pin_2*%
%TO.N,unconnected-(J_Front_3-Pin_2-Pad2)*%
X167640000Y-109220000D03*
%TO.P,J_Front_3,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-111760000D03*
%TD*%
%TO.P,Arduino_L1,12,Pin_12*%
%TO.N,/5V*%
X92456000Y-111760000D03*
%TO.P,Arduino_L1,11,Pin_11*%
%TO.N,/GND*%
X92456000Y-109220000D03*
%TO.P,Arduino_L1,10,Pin_10*%
%TO.N,unconnected-(Arduino_L1-Pin_10-Pad10)*%
X92456000Y-106680000D03*
%TO.P,Arduino_L1,9,Pin_9*%
%TO.N,unconnected-(Arduino_L1-Pin_9-Pad9)*%
X92456000Y-104140000D03*
%TO.P,Arduino_L1,8,Pin_8*%
%TO.N,/CS1*%
X92456000Y-101600000D03*
%TO.P,Arduino_L1,7,Pin_7*%
%TO.N,/CS2*%
X92456000Y-99060000D03*
%TO.P,Arduino_L1,6,Pin_6*%
%TO.N,/CS3*%
X92456000Y-96520000D03*
%TO.P,Arduino_L1,5,Pin_5*%
%TO.N,/CS4*%
X92456000Y-93980000D03*
%TO.P,Arduino_L1,4,Pin_4*%
%TO.N,/SO*%
X92456000Y-91440000D03*
%TO.P,Arduino_L1,3,Pin_3*%
%TO.N,/SI*%
X92456000Y-88900000D03*
%TO.P,Arduino_L1,2,Pin_2*%
%TO.N,/SCK*%
X92456000Y-86360000D03*
D10*
%TO.P,Arduino_L1,1,Pin_1*%
%TO.N,unconnected-(Arduino_L1-Pin_1-Pad1)*%
X92456000Y-83820000D03*
%TD*%
%TO.P,J_CAN_1,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-119380000D03*
D11*
%TO.P,J_CAN_1,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-119380000D03*
%TO.P,J_CAN_1,3,Pin_3*%
%TO.N,/CS1*%
X127000000Y-119380000D03*
%TO.P,J_CAN_1,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-119380000D03*
%TO.P,J_CAN_1,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-119380000D03*
%TO.P,J_CAN_1,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-119380000D03*
%TO.P,J_CAN_1,7,Pin_7*%
%TO.N,unconnected-(J_CAN_1-Pin_7-Pad7)*%
X137160000Y-119380000D03*
%TD*%
D10*
%TO.P,J_Front_1_2,1,Pin_1*%
%TO.N,/CAN_24V*%
X175260000Y-111760000D03*
D11*
%TO.P,J_Front_1_2,2,Pin_2*%
%TO.N,/CAN_GND*%
X175260000Y-109220000D03*
%TO.P,J_Front_1_2,3,Pin_3*%
X175260000Y-106680000D03*
%TD*%
%TO.P,J_Front_1,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-86360000D03*
%TO.P,J_Front_1,2,Pin_2*%
%TO.N,unconnected-(J_Front_1-Pin_2-Pad2)*%
X167640000Y-83820000D03*
D10*
%TO.P,J_Front_1,1,Pin_1*%
%TO.N,/GND*%
X167640000Y-81280000D03*
%TD*%
%TO.P,J7,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-81280000D03*
D11*
%TO.P,J7,2,Pin_2*%
%TO.N,/CAN4_L*%
X187960000Y-78740000D03*
%TO.P,J7,3,Pin_3*%
%TO.N,/CAN4_H*%
X187960000Y-76200000D03*
%TO.P,J7,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-73660000D03*
%TD*%
D10*
%TO.P,J9,1,Pin_1*%
%TO.N,/CAN2_L*%
X175260000Y-104140000D03*
D11*
%TO.P,J9,2,Pin_2*%
%TO.N,/CAN2_H*%
X175260000Y-101600000D03*
%TD*%
D10*
%TO.P,JJ_CAN_4,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-81280000D03*
D11*
%TO.P,JJ_CAN_4,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-81280000D03*
%TO.P,JJ_CAN_4,3,Pin_3*%
%TO.N,/CS4*%
X127000000Y-81280000D03*
%TO.P,JJ_CAN_4,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-81280000D03*
%TO.P,JJ_CAN_4,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-81280000D03*
%TO.P,JJ_CAN_4,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-81280000D03*
%TO.P,JJ_CAN_4,7,Pin_7*%
%TO.N,unconnected-(JJ_CAN_4-Pin_7-Pad7)*%
X137160000Y-81280000D03*
%TD*%
D10*
%TO.P,J8,1,Pin_1*%
%TO.N,/CAN1_L*%
X175260000Y-116840000D03*
D11*
%TO.P,J8,2,Pin_2*%
%TO.N,/CAN1_H*%
X175260000Y-114300000D03*
%TD*%
D10*
%TO.P,CAN_2_1,1,Pin_1*%
%TO.N,/CAN_GND*%
X180340000Y-106680000D03*
D11*
%TO.P,CAN_2_1,2,Pin_2*%
%TO.N,/CAN2_L*%
X180340000Y-104140000D03*
%TO.P,CAN_2_1,3,Pin_3*%
%TO.N,/CAN2_H*%
X180340000Y-101600000D03*
%TO.P,CAN_2_1,4,Pin_4*%
%TO.N,/CAN_24V*%
X180340000Y-99060000D03*
%TD*%
D10*
%TO.P,J_CAN_3,1,Pin_1*%
%TO.N,/5V*%
X121920000Y-93980000D03*
D11*
%TO.P,J_CAN_3,2,Pin_2*%
%TO.N,/GND*%
X124460000Y-93980000D03*
%TO.P,J_CAN_3,3,Pin_3*%
%TO.N,/CS3*%
X127000000Y-93980000D03*
%TO.P,J_CAN_3,4,Pin_4*%
%TO.N,/SO*%
X129540000Y-93980000D03*
%TO.P,J_CAN_3,5,Pin_5*%
%TO.N,/SI*%
X132080000Y-93980000D03*
%TO.P,J_CAN_3,6,Pin_6*%
%TO.N,/SCK*%
X134620000Y-93980000D03*
%TO.P,J_CAN_3,7,Pin_7*%
%TO.N,unconnected-(J_CAN_3-Pin_7-Pad7)*%
X137160000Y-93980000D03*
%TD*%
%TO.P,J1,2,Pin_2*%
%TO.N,/24V*%
X167640000Y-116750000D03*
D10*
%TO.P,J1,1,Pin_1*%
%TO.N,/GND*%
X165100000Y-116750000D03*
%TD*%
%TO.P,J11,1,Pin_1*%
%TO.N,/CAN4_L*%
X175260000Y-78740000D03*
D11*
%TO.P,J11,2,Pin_2*%
%TO.N,/CAN4_H*%
X175260000Y-76200000D03*
%TD*%
D10*
%TO.P,J_Extension_2,1,Pin_1*%
%TO.N,/5V*%
X167640000Y-66040000D03*
D11*
%TO.P,J_Extension_2,2,Pin_2*%
%TO.N,/GND*%
X167640000Y-68580000D03*
%TO.P,J_Extension_2,3,Pin_3*%
%TO.N,/24V*%
X167640000Y-71120000D03*
%TD*%
D10*
%TO.P,J5,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-106680000D03*
D11*
%TO.P,J5,2,Pin_2*%
%TO.N,/CAN2_L*%
X187960000Y-104140000D03*
%TO.P,J5,3,Pin_3*%
%TO.N,/CAN2_H*%
X187960000Y-101600000D03*
%TO.P,J5,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-99060000D03*
%TD*%
D10*
%TO.P,J3,1,Pin_1*%
%TO.N,/CAN_GND*%
X187960000Y-119380000D03*
D11*
%TO.P,J3,2,Pin_2*%
%TO.N,/CAN1_L*%
X187960000Y-116840000D03*
%TO.P,J3,3,Pin_3*%
%TO.N,/CAN1_H*%
X187960000Y-114300000D03*
%TO.P,J3,4,Pin_4*%
%TO.N,/CAN_24V*%
X187960000Y-111760000D03*
%TD*%
D10*
%TO.P,J_Stepdown1,1,Pin_1*%
%TO.N,/5V*%
X153341400Y-83594200D03*
D11*
%TO.P,J_Stepdown1,2,Pin_2*%
%TO.N,/GND*%
X153341400Y-86134200D03*
%TO.P,J_Stepdown1,3,Pin_3*%
%TO.N,/24V*%
X153341400Y-88674200D03*
%TD*%
D12*
%TO.N,/GND*%
X153341400Y-86134200D02*
X156881400Y-86134200D01*
X156881400Y-86134200D02*
X162705400Y-80310200D01*
X162705400Y-80310200D02*
X162705400Y-69794600D01*
X162705400Y-69794600D02*
X163920000Y-68580000D01*
X163920000Y-68580000D02*
X167640000Y-68580000D01*
D13*
%TO.N,/E5*%
X105641400Y-83289400D02*
X105641400Y-72621400D01*
X105641400Y-72621400D02*
X104140000Y-71120000D01*
%TO.N,/E7*%
X102899900Y-78363484D02*
X102899900Y-72419900D01*
X102899900Y-72419900D02*
X101600000Y-71120000D01*
%TO.N,/E4*%
X107696000Y-93980000D02*
X105156000Y-93980000D01*
X105156000Y-93980000D02*
X103313400Y-92137400D01*
X100301500Y-72361500D02*
X99060000Y-71120000D01*
X103313400Y-92137400D02*
X103313400Y-80423128D01*
X103313400Y-80423128D02*
X100301500Y-77411228D01*
X100301500Y-77411228D02*
X100301500Y-72361500D01*
%TO.N,/E2*%
X97762900Y-76518772D02*
X97762900Y-72362900D01*
X97762900Y-72362900D02*
X96520000Y-71120000D01*
%TO.N,/E1*%
X107696000Y-101600000D02*
X102616000Y-101600000D01*
X102616000Y-101600000D02*
X101559400Y-100543400D01*
X101559400Y-100543400D02*
X101559400Y-81138344D01*
X101559400Y-81138344D02*
X96520000Y-76098944D01*
X96520000Y-76098944D02*
X96520000Y-73660000D01*
D12*
%TO.N,/GND*%
X124460000Y-88392000D02*
X124460000Y-119380000D01*
%TO.N,/5V*%
X92456000Y-111760000D02*
X93980000Y-111760000D01*
X93980000Y-111760000D02*
X96520000Y-114300000D01*
X96520000Y-114300000D02*
X117856000Y-114300000D01*
X117856000Y-114300000D02*
X121920000Y-110236000D01*
X121920000Y-110236000D02*
X121920000Y-106680000D01*
%TO.N,/GND*%
X124460000Y-81280000D02*
X124460000Y-84328000D01*
X126209800Y-86134200D02*
X126209800Y-86077800D01*
X126209800Y-86077800D02*
X124460000Y-84328000D01*
%TO.N,/5V*%
X121920000Y-81280000D02*
X121920000Y-119380000D01*
X121920000Y-81280000D02*
X121920000Y-80264000D01*
X121920000Y-80264000D02*
X122936000Y-79248000D01*
X122936000Y-79248000D02*
X151384000Y-79248000D01*
X151384000Y-79248000D02*
X153341400Y-81205400D01*
X153341400Y-81205400D02*
X153341400Y-83594200D01*
%TO.N,/GND*%
X124460000Y-87884000D02*
X124460000Y-88392000D01*
X153341400Y-86134200D02*
X126209800Y-86134200D01*
X126209800Y-86134200D02*
X124460000Y-87884000D01*
D13*
%TO.N,/E2*%
X102141400Y-98077400D02*
X103124000Y-99060000D01*
X102141400Y-80897272D02*
X102141400Y-98077400D01*
X103124000Y-99060000D02*
X107696000Y-99060000D01*
%TO.N,/E3*%
X102731400Y-95111400D02*
X104140000Y-96520000D01*
X102731400Y-80664200D02*
X102731400Y-95111400D01*
X104140000Y-96520000D02*
X107696000Y-96520000D01*
%TO.N,/E8*%
X101601400Y-74114200D02*
X101601400Y-77888056D01*
X101601400Y-77888056D02*
X103895400Y-80182056D01*
X103895400Y-80182056D02*
X103895400Y-90179400D01*
X103895400Y-90179400D02*
X105156000Y-91440000D01*
X105156000Y-91440000D02*
X107696000Y-91440000D01*
%TO.N,/E7*%
X102899900Y-78363484D02*
X104477400Y-79940984D01*
X105664000Y-88900000D02*
X107696000Y-88900000D01*
X104477400Y-79940984D02*
X104477400Y-87713400D01*
X104477400Y-87713400D02*
X105664000Y-88900000D01*
%TO.N,/E6*%
X104141400Y-74114200D02*
X104141400Y-78781912D01*
X104141400Y-78781912D02*
X105059400Y-79699912D01*
X105059400Y-79699912D02*
X105059400Y-85247400D01*
X105059400Y-85247400D02*
X106172000Y-86360000D01*
X106172000Y-86360000D02*
X107696000Y-86360000D01*
%TO.N,/E5*%
X105641400Y-83289400D02*
X106172000Y-83820000D01*
X106172000Y-83820000D02*
X107696000Y-83820000D01*
D12*
%TO.N,/5V*%
X162960000Y-66040000D02*
X167640000Y-66040000D01*
%TO.N,/GND*%
X92021400Y-109534200D02*
X92481400Y-109534200D01*
D13*
%TO.N,/E3*%
X99061400Y-74114200D02*
X99061400Y-76994200D01*
X99061400Y-76994200D02*
X102731400Y-80664200D01*
D12*
%TO.N,/24V*%
X155541400Y-88674200D02*
X161941400Y-88674200D01*
X163941400Y-86674200D02*
X163941400Y-86658600D01*
X163941400Y-97941400D02*
X165060000Y-99060000D01*
X153341400Y-88674200D02*
X155541400Y-88674200D01*
X163941400Y-90500000D02*
X163941400Y-97600000D01*
X163941400Y-98374200D02*
X163941400Y-97600000D01*
X163941400Y-98374200D02*
X163941400Y-110941400D01*
X164760000Y-111760000D02*
X167640000Y-111760000D01*
X163941400Y-110941400D02*
X164760000Y-111760000D01*
X155541400Y-88674200D02*
X155506400Y-88639200D01*
X163941400Y-97600000D02*
X163941400Y-97941400D01*
X165060000Y-99060000D02*
X167640000Y-99060000D01*
X161941400Y-88674200D02*
X163941400Y-86674200D01*
D13*
%TO.N,/E2*%
X97762900Y-76518772D02*
X102141400Y-80897272D01*
D12*
%TO.N,/24V*%
X167640000Y-116750000D02*
X167640000Y-111760000D01*
X162115600Y-88674200D02*
X163941400Y-90500000D01*
X164240000Y-86360000D02*
X163941400Y-86658600D01*
%TO.N,/5V*%
X161869400Y-79946200D02*
X161869400Y-67130600D01*
%TO.N,/24V*%
X167640000Y-86360000D02*
X164240000Y-86360000D01*
X155541400Y-88674200D02*
X157741400Y-88674200D01*
%TO.N,/5V*%
X153341400Y-83594200D02*
X158221400Y-83594200D01*
X161869400Y-67130600D02*
X162960000Y-66040000D01*
%TO.N,/24V*%
X163941400Y-86750000D02*
X163941400Y-72308600D01*
X163941400Y-72308600D02*
X165130000Y-71120000D01*
X163941400Y-86674200D02*
X163941400Y-86750000D01*
X163941400Y-86750000D02*
X163941400Y-90500000D01*
X165130000Y-71120000D02*
X167640000Y-71120000D01*
%TO.N,/5V*%
X121920000Y-117856000D02*
X121920000Y-119380000D01*
%TO.N,/24V*%
X161941400Y-88674200D02*
X162115600Y-88674200D01*
%TO.N,/5V*%
X158221400Y-83594200D02*
X161869400Y-79946200D01*
%TO.N,/GND*%
X124460000Y-84328000D02*
X124460000Y-88392000D01*
%TO.N,/CAN_24V*%
X180340000Y-73660000D02*
X187960000Y-73660000D01*
%TO.N,/CAN4_H*%
X175260000Y-76200000D02*
X187960000Y-76200000D01*
%TO.N,/CAN4_L*%
X175260000Y-78740000D02*
X187960000Y-78740000D01*
%TO.N,/CAN_GND*%
X180340000Y-119380000D02*
X187960000Y-119380000D01*
%TO.N,/CAN1_L*%
X175260000Y-116840000D02*
X187960000Y-116840000D01*
%TO.N,/CAN_24V*%
X175260000Y-86360000D02*
X187960000Y-86360000D01*
X175260000Y-111760000D02*
X187960000Y-111760000D01*
X175260000Y-99060000D02*
X187960000Y-99060000D01*
%TO.N,/CAN2_L*%
X175260000Y-104140000D02*
X187960000Y-104140000D01*
%TO.N,/CAN2_H*%
X175260000Y-101600000D02*
X187960000Y-101600000D01*
%TO.N,/CAN_GND*%
X175260000Y-81280000D02*
X175260000Y-83820000D01*
X175260000Y-109220000D02*
X175260000Y-106680000D01*
X175260000Y-106680000D02*
X187960000Y-106680000D01*
X175260000Y-81280000D02*
X187960000Y-81280000D01*
X175260000Y-93980000D02*
X187960000Y-93980000D01*
X175260000Y-93980000D02*
X175260000Y-96520000D01*
%TO.N,/CAN1_H*%
X175260000Y-114300000D02*
X187960000Y-114300000D01*
%TO.N,/CAN3_L*%
X175260000Y-91440000D02*
X187960000Y-91440000D01*
%TO.N,/CAN3_H*%
X175260000Y-88900000D02*
X187960000Y-88900000D01*
%TD*%
%TA.AperFunction,Conductor*%
%TO.N,/24V*%
G36*
X163866780Y-87038880D02*
G01*
X163920436Y-87083634D01*
X163941378Y-87150291D01*
X163941400Y-87152624D01*
X163941400Y-90195775D01*
X163921715Y-90262814D01*
X163868911Y-90308569D01*
X163799753Y-90318513D01*
X163736197Y-90289488D01*
X163734494Y-90287985D01*
X162043805Y-88766364D01*
X162007147Y-88706890D01*
X162008461Y-88637033D01*
X162043806Y-88582033D01*
X163734449Y-87060455D01*
X163797447Y-87030240D01*
X163866780Y-87038880D01*
G37*
%TD.AperFunction*%
%TD*%
%TA.AperFunction,Conductor*%
%TO.N,/GND*%
G36*
X124665203Y-84533649D02*
G01*
X124671681Y-84539681D01*
X126390902Y-86258902D01*
X126424387Y-86320225D01*
X126419403Y-86389917D01*
X126377621Y-86445783D01*
X124658400Y-87735200D01*
X124592958Y-87759676D01*
X124524671Y-87744886D01*
X124475222Y-87695525D01*
X124460000Y-87636000D01*
X124460000Y-84627362D01*
X124479685Y-84560323D01*
X124532489Y-84514568D01*
X124601647Y-84504624D01*
X124665203Y-84533649D01*
G37*
%TD.AperFunction*%
%TD*%
M02*

View File

@@ -0,0 +1,245 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:30+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Top*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:30*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10R,1.700000X1.700000*%
%ADD11C,1.700000*%
G04 APERTURE END LIST*
D10*
%TO.C,J_Extension1*%
X104140000Y-71120000D03*
D11*
X104140000Y-73660000D03*
X101600000Y-71120000D03*
X101600000Y-73660000D03*
X99060000Y-71120000D03*
X99060000Y-73660000D03*
X96520000Y-71120000D03*
X96520000Y-73660000D03*
%TD*%
%TO.C,CAN_4_1*%
X180340000Y-73660000D03*
X180340000Y-76200000D03*
X180340000Y-78740000D03*
D10*
X180340000Y-81280000D03*
%TD*%
%TO.C,J_Front_1_1*%
X175260000Y-99060000D03*
D11*
X175260000Y-96520000D03*
X175260000Y-93980000D03*
%TD*%
D10*
%TO.C,J6*%
X187960000Y-93980000D03*
D11*
X187960000Y-91440000D03*
X187960000Y-88900000D03*
X187960000Y-86360000D03*
%TD*%
%TO.C,Arduino_R1*%
X107696000Y-111760000D03*
X107696000Y-109220000D03*
X107696000Y-106680000D03*
X107696000Y-104140000D03*
X107696000Y-101600000D03*
X107696000Y-99060000D03*
X107696000Y-96520000D03*
X107696000Y-93980000D03*
X107696000Y-91440000D03*
X107696000Y-88900000D03*
X107696000Y-86360000D03*
D10*
X107696000Y-83820000D03*
%TD*%
%TO.C,J2*%
X180340000Y-119380000D03*
D11*
X180340000Y-116840000D03*
X180340000Y-114300000D03*
X180340000Y-111760000D03*
%TD*%
D10*
%TO.C,J10*%
X175260000Y-91440000D03*
D11*
X175260000Y-88900000D03*
%TD*%
D10*
%TO.C,J_Front_1_3*%
X175260000Y-86360000D03*
D11*
X175260000Y-83820000D03*
X175260000Y-81280000D03*
%TD*%
D10*
%TO.C,J_Front_2*%
X167640000Y-93980000D03*
D11*
X167640000Y-96520000D03*
X167640000Y-99060000D03*
%TD*%
D10*
%TO.C,J4*%
X180340000Y-93980000D03*
D11*
X180340000Y-91440000D03*
X180340000Y-88900000D03*
X180340000Y-86360000D03*
%TD*%
D10*
%TO.C,J_CAN_2*%
X121920000Y-106680000D03*
D11*
X124460000Y-106680000D03*
X127000000Y-106680000D03*
X129540000Y-106680000D03*
X132080000Y-106680000D03*
X134620000Y-106680000D03*
X137160000Y-106680000D03*
%TD*%
D10*
%TO.C,J_Front_3*%
X167640000Y-106680000D03*
D11*
X167640000Y-109220000D03*
X167640000Y-111760000D03*
%TD*%
%TO.C,Arduino_L1*%
X92456000Y-111760000D03*
X92456000Y-109220000D03*
X92456000Y-106680000D03*
X92456000Y-104140000D03*
X92456000Y-101600000D03*
X92456000Y-99060000D03*
X92456000Y-96520000D03*
X92456000Y-93980000D03*
X92456000Y-91440000D03*
X92456000Y-88900000D03*
X92456000Y-86360000D03*
D10*
X92456000Y-83820000D03*
%TD*%
%TO.C,J_CAN_1*%
X121920000Y-119380000D03*
D11*
X124460000Y-119380000D03*
X127000000Y-119380000D03*
X129540000Y-119380000D03*
X132080000Y-119380000D03*
X134620000Y-119380000D03*
X137160000Y-119380000D03*
%TD*%
D10*
%TO.C,J_Front_1_2*%
X175260000Y-111760000D03*
D11*
X175260000Y-109220000D03*
X175260000Y-106680000D03*
%TD*%
%TO.C,J_Front_1*%
X167640000Y-86360000D03*
X167640000Y-83820000D03*
D10*
X167640000Y-81280000D03*
%TD*%
%TO.C,J7*%
X187960000Y-81280000D03*
D11*
X187960000Y-78740000D03*
X187960000Y-76200000D03*
X187960000Y-73660000D03*
%TD*%
D10*
%TO.C,J9*%
X175260000Y-104140000D03*
D11*
X175260000Y-101600000D03*
%TD*%
D10*
%TO.C,JJ_CAN_4*%
X121920000Y-81280000D03*
D11*
X124460000Y-81280000D03*
X127000000Y-81280000D03*
X129540000Y-81280000D03*
X132080000Y-81280000D03*
X134620000Y-81280000D03*
X137160000Y-81280000D03*
%TD*%
D10*
%TO.C,J8*%
X175260000Y-116840000D03*
D11*
X175260000Y-114300000D03*
%TD*%
D10*
%TO.C,CAN_2_1*%
X180340000Y-106680000D03*
D11*
X180340000Y-104140000D03*
X180340000Y-101600000D03*
X180340000Y-99060000D03*
%TD*%
D10*
%TO.C,J_CAN_3*%
X121920000Y-93980000D03*
D11*
X124460000Y-93980000D03*
X127000000Y-93980000D03*
X129540000Y-93980000D03*
X132080000Y-93980000D03*
X134620000Y-93980000D03*
X137160000Y-93980000D03*
%TD*%
%TO.C,J1*%
X167640000Y-116750000D03*
D10*
X165100000Y-116750000D03*
%TD*%
%TO.C,J11*%
X175260000Y-78740000D03*
D11*
X175260000Y-76200000D03*
%TD*%
D10*
%TO.C,J_Extension_2*%
X167640000Y-66040000D03*
D11*
X167640000Y-68580000D03*
X167640000Y-71120000D03*
%TD*%
D10*
%TO.C,J5*%
X187960000Y-106680000D03*
D11*
X187960000Y-104140000D03*
X187960000Y-101600000D03*
X187960000Y-99060000D03*
%TD*%
D10*
%TO.C,J3*%
X187960000Y-119380000D03*
D11*
X187960000Y-116840000D03*
X187960000Y-114300000D03*
X187960000Y-111760000D03*
%TD*%
D10*
%TO.C,J_Stepdown1*%
X153341400Y-83594200D03*
D11*
X153341400Y-86134200D03*
X153341400Y-88674200D03*
%TD*%
M02*

View File

@@ -0,0 +1,15 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.2*%
%TF.CreationDate,2025-07-20T17:27:29+02:00*%
%TF.ProjectId,Meycad,4d657963-6164-42e6-9b69-6361645f7063,rev?*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.2) date 2025-07-20 17:27:29*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More