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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -17,7 +17,10 @@ Packages
Payload: Payload:
2 bytes | Byte -> Software-Version (1.0) 2 bytes | Byte -> Software-Version (1.0)
2 bytes | Byte -> Hw Version (4.0) 2 bytes | Byte -> Hw Version (4.0)
2 bytes | DeviceId -> DeviceId Explicit 1 bytes | DeviceTypeId
| 1: Switch
| 2: Switch + Rule
| 3: UP
0x050: Input Switch Triggered 0x050: Input Switch Triggered
-> Broadcast -> Broadcast
@@ -46,4 +49,19 @@ Payload:
* 2 byte: DeviceId * 2 byte: DeviceId
* 1 byte: The State * 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

@@ -9,9 +9,9 @@ uint16_t myDeviceId;
byte _deviceTypeId = 0; byte _deviceTypeId = 0;
byte _majorHardwareVersion = 0; byte _majorHardwareVersion = 0;
byte _minorHardwareVersion = 0; byte _minorHardwareVersion = 0;
void (*LocalPinChangedHandler)(can_frame *frame);
void SetupMeyPin(PinState *state) void SetupMeyPin(PinState *state) {
{
pinMode(state->pin_id, OUTPUT); pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW); digitalWrite(state->pin_id, LOW);
state->pin_state = false; state->pin_state = false;
@@ -20,34 +20,30 @@ void SetupMeyPin(PinState *state)
void InitCanInterface(MCP2515 *interface, can_frame *frame) // can_frame is NULL. Reuse ForEach Method for smaller footprint void InitCanInterface(MCP2515 *interface, can_frame *frame) // can_frame is NULL. Reuse ForEach Method for smaller footprint
{ {
interface->reset(); interface->reset();
interface->setBitrate(CAN_500KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz interface->setBitrate(CAN_1000KBPS, MCP_8MHZ); //Sets CAN at speed 500KBPS and Clock 8MHz
interface->setNormalMode(); interface->setNormalMode();
SendVersionPackage(interface); SendVersionPackage(interface);
} }
void ForEachCanInterface(void (*handle)(MCP2515 *canInterace)) void ForEachCanInterface(void (*handle)(MCP2515 *canInterace)) {
{
CanBusses->ForEachInterface(handle); CanBusses->ForEachInterface(handle);
} }
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId) void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId) {
{
_majorHardwareVersion = majorHardwareVersion; _majorHardwareVersion = majorHardwareVersion;
_minorHardwareVersion = minorHardwareVersion; _minorHardwareVersion = minorHardwareVersion;
_deviceTypeId = deviceTypeId; _deviceTypeId = deviceTypeId;
CalculateMyDeviceId();
if (MeyPin != NULL); if (MeyPin != NULL)
;
MeyPin->ForEach(SetupMeyPin); MeyPin->ForEach(SetupMeyPin);
if (CanBusses != NULL) if (CanBusses != NULL) {
{
CanBusses->ForEach(InitCanInterface, NULL); CanBusses->ForEach(InitCanInterface, NULL);
} }
} }
void AddCanInterface(byte pinId) void AddCanInterface(byte pinId) {
{
MCP2515 *newCanInterface = new MCP2515(pinId); MCP2515 *newCanInterface = new MCP2515(pinId);
CanInterface *canInterface = new CanInterface(); CanInterface *canInterface = new CanInterface();
canInterface->interface = newCanInterface; canInterface->interface = newCanInterface;
@@ -58,8 +54,15 @@ void AddCanInterface(byte pinId)
CanBusses->AddCanInterface(canInterface); CanBusses->AddCanInterface(canInterface);
} }
void SetMeyPin(byte index, byte meyPinId, byte pinId) 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(); PinState *newState = new PinState();
newState->Init(pinId, (byte)meyPinId); newState->Init(pinId, (byte)meyPinId);
@@ -70,20 +73,17 @@ void SetMeyPin(byte index, byte meyPinId, byte pinId)
} }
bool CheckPinStatus(PinState * state) bool CheckPinStatus(PinState *state) {
{
if (!state->is_input) if (!state->is_input)
return false; return false;
bool newValue = ReadPin(state); bool newValue = ReadPin(state);
if (newValue != state->pin_state) if (newValue != state->pin_state) {
{
delay(10); delay(10);
newValue = ReadPin(state); newValue = ReadPin(state);
if (newValue != state->pin_state) if (newValue != state->pin_state) {
{
state->pin_state = newValue; state->pin_state = newValue;
SendSwitchedTriggeredCanPackage(state->meyPinId, state->pin_state); SendSwitchedTriggeredCanPackage(state->meyPinId, state->pin_state);
} }
@@ -91,44 +91,26 @@ bool CheckPinStatus(PinState * state)
return false; return false;
} }
void CheckMeyPinsTriggered() void CheckMeyPinsTriggered() {
{
MeyPin->ForEach(CheckPinStatus); MeyPin->ForEach(CheckPinStatus);
} }
bool ReadPin(PinState * state) 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); return digitalRead(state->pin_id);
} }
void HandleFrame(can_frame *frame, MCP2515 *source) void HandleFrame(can_frame *frame, MCP2515 *source) {
{
CanBusses->ForEach(DoSendCanPkg, frame, source); CanBusses->ForEach(DoSendCanPkg, frame, source);
HandleTriggerMeypinCanPackage(frame); HandleTriggerMeypinCanPackage(frame);
} }
void HandleTriggerMeypinCanPackage(can_frame *frame) void HandleTriggerMeypinCanPackage(can_frame *frame) {
{
if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID)
{ if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID) {
uint16_t adressedDeviceId = ((uint16_t)frame->data[0] << 8) | frame->data[1]; uint16_t adressedDeviceId = ((uint16_t)frame->data[0] << 8) | frame->data[1];
if (adressedDeviceId != myDeviceId) return; if (adressedDeviceId != myDeviceId) return;
@@ -138,10 +120,8 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
PinState *adressedPin = MeyPin->Find(meyPinId); PinState *adressedPin = MeyPin->Find(meyPinId);
if (adressedPin != NULL) if (adressedPin != NULL) {
{ if (adressedPin->is_input == true) {
if (adressedPin->is_input == true)
{
pinMode(adressedPin->pin_id, OUTPUT); pinMode(adressedPin->pin_id, OUTPUT);
adressedPin->is_input = false; adressedPin->is_input = false;
} }
@@ -153,49 +133,28 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
digitalWrite(adressedPin->pin_id, state); digitalWrite(adressedPin->pin_id, state);
SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state); SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state);
} }
} }
} }
} }
byte CircularShift(byte b) byte CircularShift(byte b) {
{
return (b << 1) | (b >> 7 & 1); return (b << 1) | (b >> 7 & 1);
} }
uint16_t GetDeviceId(uint32_t canFrameId) uint16_t GetDeviceId(uint32_t canFrameId) {
{
return canFrameId & 0xFFFF; return canFrameId & 0xFFFF;
} }
uint16_t GetPackageType(uint32_t canFrameId) uint16_t GetPackageType(uint32_t canFrameId) {
{
return (canFrameId / 0x10000) & 0xFFF; 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() { uint32_t CreateCanId(uint16_t commandId) {
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; return ((((uint32_t)commandId) & 0xFFF) * 0x10000) | myDeviceId | CAN_EFF_FLAG;
} }
void SendVersionPackage(MCP2515 *interface) void SendVersionPackage(MCP2515 *interface) {
{
can_frame toSend; can_frame toSend;
toSend.can_id = CreateCanId(HELP_PACKAGE_CAN_ID); toSend.can_id = CreateCanId(HELP_PACKAGE_CAN_ID);
toSend.can_dlc = 5; toSend.can_dlc = 5;
@@ -209,8 +168,7 @@ void SendVersionPackage(MCP2515 *interface)
DoSendCanPkg(interface, &toSend); DoSendCanPkg(interface, &toSend);
} }
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state) void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state) {
{
can_frame toSend; can_frame toSend;
toSend.can_id = CreateCanId(TRIGGER_SWITCH_CAN_ID); toSend.can_id = CreateCanId(TRIGGER_SWITCH_CAN_ID);
@@ -223,8 +181,32 @@ void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte sta
HandleFrame(&toSend, NULL); HandleFrame(&toSend, NULL);
} }
void SendSwitchedTriggeredCanPackage(byte pinId, int state) 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; can_frame toSend;
toSend.can_id = CreateCanId(SWITCH_TRIGGERED_CAN_ID); toSend.can_id = CreateCanId(SWITCH_TRIGGERED_CAN_ID);
toSend.can_dlc = 2; toSend.can_dlc = 2;
@@ -232,24 +214,19 @@ void SendSwitchedTriggeredCanPackage(byte pinId, int state)
toSend.data[1] = state; toSend.data[1] = state;
DoSendCanPkg(&toSend); DoSendCanPkg(&toSend);
if (LocalPinChangedHandler) {
LocalPinChangedHandler(&toSend);
}
} }
void DoSendCanPkg(can_frame *frame) void DoSendCanPkg(can_frame *frame) {
{
if (CanBusses != NULL) if (CanBusses != NULL)
CanBusses->ForEach(DoSendCanPkg, frame); CanBusses->ForEach(DoSendCanPkg, frame);
} }
void DoSendCanPkg(MCP2515 *interface, can_frame *frame) void DoSendCanPkg(MCP2515 *interface, can_frame *frame) {
{
byte cnt = 0; byte cnt = 0;
while (interface->sendMessage(frame)) while (interface->sendMessage(frame)) {
{
if (++cnt > 10) return; if (++cnt > 10) return;
} }
} }
void CalculateMyDeviceId()
{
myDeviceId = (GetDeviceIdHigh() << 8) | GetDeviceIdLow();
}

View File

@@ -95,9 +95,16 @@ const byte HARDWARE_VERSION_LOW = 0;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL; const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050; const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055; 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 AddCanInterface(byte pinId);
void SetMeyPin(byte index, byte meyPinId, byte pinId);
void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId); void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId);
@@ -118,6 +125,10 @@ uint32_t CreateCanId(uint16_t commandId);
void SendVersionPackage(MCP2515 *interface); void SendVersionPackage(MCP2515 *interface);
void SendSwitchedTriggeredCanPackage(byte pinId, int state); 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 BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state);
void DoSendCanPkg(can_frame *frame); void DoSendCanPkg(can_frame *frame);

View File

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

View File

@@ -4,22 +4,24 @@
#include <Arduino.h> #include <Arduino.h>
#include <mcp2515.h>; #include <mcp2515.h>;
struct Rule struct TargetPin{
{ uint16_t devId;
byte meyPinId;
bool lastPinState = false;
};
struct Rule {
uint16_t sourceDevId; uint16_t sourceDevId;
byte sourceMeyPinId; byte sourceMeyPinId;
uint16_t targetDevId; TargetPin target = TargetPin();
byte targetMeyPinId;
bool toggle; bool toggle;
bool inverse; bool inverse;
Rule *nextRule = NULL; Rule *nextRule = NULL;
bool lastPinState = false;
bool triggeredOnce = false; bool triggeredOnce = false;
void AddRule(Rule *rule) void AddRule(Rule *rule) {
{ if (this->nextRule == NULL) {
if (this->nextRule == NULL)
{
this->nextRule = rule; this->nextRule = rule;
rule->nextRule = NULL; rule->nextRule = NULL;
} else { } else {
@@ -27,33 +29,28 @@ struct Rule
} }
} }
void Traverse( uint16_t deviceId, uint8_t dt, uint8_t state, void (*handle)(uint16_t, uint8_t, uint8_t, 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) if (this->sourceDevId == deviceId && this->sourceMeyPinId == state)
handle(deviceId, dt, state, this); handle(deviceId, dt, state, this);
if (this->nextRule != NULL) if (this->nextRule != NULL)
this->nextRule->Traverse(deviceId, dt, state, handle); this->nextRule->Traverse(deviceId, dt, state, handle);
} }
}; };
typedef struct RemotePinInfo typedef struct RemotePinInfo {
{
const byte MAX_REMOTE_PIN_COUNT = 64; const byte MAX_REMOTE_PIN_COUNT = 64;
uint16_t DeviceId = 0; // the id of the device 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 uint8_t pinState = 0; // bitmap of 8 MeyPin states of the device. 0000 0100, MeyPin #3 is HIGH in this example
RemotePinInfo *next = NULL; RemotePinInfo *next = NULL;
bool getPinState(byte meyPin) bool getPinState(byte meyPin) {
{
return (this->pinState >> (meyPin - 1)) & 1; return (this->pinState >> (meyPin - 1)) & 1;
} }
void setPinState(byte meyPin, bool state) void setPinState(byte meyPin, bool state) {
{
if (state) if (state)
this->pinState = this->pinState | (1 << (meyPin - 1)); // 0001 0000 this->pinState = this->pinState | (1 << (meyPin - 1)); // 0001 0000
else else
@@ -61,32 +58,27 @@ typedef struct RemotePinInfo
} }
int16_t Count() int16_t Count() {
{
if (this->next == NULL) return 1; if (this->next == NULL) return 1;
return this->next->Count() + 1; return this->next->Count() + 1;
} }
RemotePinInfo* FindOrAdd(uint16_t deviceId, byte count = 0) RemotePinInfo *FindOrAdd(uint16_t deviceId, byte count = 0) {
{
if (count > MAX_REMOTE_PIN_COUNT) if (count > MAX_REMOTE_PIN_COUNT)
return NULL; return NULL;
if (this->DeviceId == 0 && this->pinState == 0) if (this->DeviceId == 0 && this->pinState == 0) {
{
this->DeviceId = deviceId; this->DeviceId = deviceId;
this->pinState = 0; this->pinState = 0;
} }
if (this->DeviceId == deviceId) if (this->DeviceId == deviceId) {
{
//ToggleDebug(); //ToggleDebug();
return this; return this;
} }
if (next != NULL) if (next != NULL) {
{
return next->FindOrAdd(deviceId, count + 1); return next->FindOrAdd(deviceId, count + 1);
} }
@@ -98,16 +90,18 @@ typedef struct RemotePinInfo
this->next = theNext; this->next = theNext;
return this->next; return this->next;
} }
}; };
extern RemotePinInfo remotePinInfo; extern RemotePinInfo remotePinInfo;
extern Rule *rules; extern Rule *rules;
void SetLocalPinState(can_frame *frame);
void AddSimple(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId); 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 AddToggle(uint16_t sourceDevId, byte sourceMeyPinId, uint16_t targetDevId, byte targetMeyPinId);
void AddToggleInverse(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 HandleRules(can_frame *frame);
void PutRule(Rule *rule); void PutRule(Rule *rule);
void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule); void CheckRule(uint16_t deviceId, uint8_t dt, uint8_t state, Rule *rule);
#endif #endif

View File

@@ -3,93 +3,114 @@
#include "MeyCan.h"; #include "MeyCan.h";
#include "MeyRule.h"; #include "MeyRule.h";
#define PIN8 8
#define PIN9 9
const int16_t SW_FLUR = 0XD238; const int16_t SW_FLUR = 0XD238;
const int16_t SW_ANBAU = 0x87A9; const int16_t SW_ANBAU = 0x87A9;
const int16_t SW_WOHNZIMMER = 0x87CA; const int16_t SW_WOHNZIMMER = 0x87CA;
const int16_t SW_TERRASSE = 0x618A;
const int16_t UP_WOHNZIMMER_TUER = 0x051F;
const int16_t UP_WOHNZIMMER_TUER = 0x051F; // [X X]
const int16_t UP_WOHNZIMMER_TERASSE = 0x05df; const int16_t UP_WOHNZIMMER_TERASSE = 0x05df;
const int16_t UP_FLUR_EINGANG = 0x0769; const int16_t UP_FLUR_EINGANG = 0x0769; // [X]
const int16_t UP_BUERO = 0x1177; const int16_t UP_BUERO = 0x1177;
const int16_t UP_FLUR_BUERO = 0x05A1; const int16_t UP_FLUR_BUERO = 0x05A1; // [X]
const int16_t UP_FLUR_KUECHE = 0x01EF; const int16_t UP_FLUR_KUECHE = 0x01EF;
const int16_t UP_KINDERZIMMER = 0x0196; const int16_t UP_KINDERZIMMER = 0x0196; // [X X]
const int16_t UP_FLUR_ELTERN = 0x0632; const int16_t UP_FLUR_ELTERN = 0x0632;
const int16_t UP_KUECHE_FLUR = 0x07F5; const int16_t UP_ELTERN = 0x08AE;
const int16_t UP_KUECHE_BAD = 0x0585; 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; struct can_frame incomingCanFrame;
/*
Software matching Hardware of meycan v8.1
*/
void setup() { void setup() {
SPI.begin(); SPI.begin();
// AddToggleInverse(UP_WOHNZIMMER_TUER, 5, SW_WOHNZIMMER, 4); // Lichtschalter Wohnzimmer Licht 1 AddToggle(UP_WOHNZIMMER_TUER, 1, SW_WOHNZIMMER, 5);
// AddToggleInverse(UP_WOHNZIMMER_TUER, 5, SW_WOHNZIMMER, 3); // Lichtschalter Wohnzimmer Licht 2 AddToggle(UP_WOHNZIMMER_TUER, 1, SW_WOHNZIMMER, 6);
// AddToggle(UP_WOHNZIMMER_TERASSE, 1, SW_WOHNZIMMER, 4); // Licht 1 von Terassenschalter AddSimple(UP_WOHNZIMMER_TUER, 2, SW_WOHNZIMMER, 7);
// AddToggle(UP_WOHNZIMMER_TERASSE, 1, SW_WOHNZIMMER, 3); // Licht 2 von Terassenschalter AddSimple(UP_WOHNZIMMER_TUER, 3, SW_WOHNZIMMER, 8);
//
// 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); AddToggle(UP_KINDERZIMMER, 3, SW_FLUR, 6);
AddToggle(UP_KINDERZIMMER, 3, SW_WOHNZIMMER, 2);
delay(10); // a bit delay for mcp2515 to get the clock AddToggle(UP_KINDERZIMMER, 2, SW_FLUR, 3);
AddSimple(UP_KINDERZIMMER, 4, SW_FLUR, 4);
AddSimple(UP_KINDERZIMMER, 1, SW_FLUR, 5);
SetMeyPin(0, 1, PIN_PC7); AddToggle(UP_FLUR_EINGANG, 1, SW_FLUR, 1);
SetMeyPin(1, 2, PIN_PC6); AddToggle(UP_FLUR_EINGANG, 2, SW_FLUR, 6);
SetMeyPin(2, 3, PIN_PC5); AddToggle(UP_FLUR_EINGANG, 2, SW_WOHNZIMMER, 2);
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); AddToggle(UP_ELTERN, 1, SW_FLUR, 2);
AddCanInterface(PIN_PA3);
AddCanInterface(PIN_PB0); AddToggle(UP_BUERO, 1, SW_WOHNZIMMER, 3);
AddCanInterface(PIN_PB1);
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
SetupMeyCan(7, 0, 1); 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() {
void loop()
{
ForEachCanInterface(CheckCanInterface); ForEachCanInterface(CheckCanInterface);
} }
void CheckCanInterface(MCP2515 *interface)
{ void SetLocalPinStateAdapter(can_frame *frame)
if (interface->readMessage(&incomingCanFrame) == MCP2515::ERROR_OK)
{ {
SetLocalPinState(frame);
}
void CheckCanInterface(MCP2515 *interface) {
if (interface->readMessage(&incomingCanFrame) == MCP2515::ERROR_OK) {
HandleFrame(&incomingCanFrame, interface); HandleFrame(&incomingCanFrame, interface);
HandleRules(&incomingCanFrame); HandleRules(&incomingCanFrame);
} }

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,59 +1,44 @@
#include "HardwareSerial.h"
#include <iterator>
#include "esp32-hal-gpio.h"
#include "MeyCan.h"; #include "MeyCan.h";
#include <SPI.h>; #include "driver/twai.h"
#include <mcp2515.h>;
PinState *MeyPin = NULL; PinState *MeyPin = NULL;
CanInterface *CanBusses = NULL; uint16_t myDeviceId = 0;
uint16_t myDeviceId; byte _deviceTypeId = 0;
byte _majorHardwareVersion = 0;
byte _minorHardwareVersion = 0;
void SetupMeyPin(PinState *state)
{ 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); pinMode(state->pin_id, OUTPUT);
digitalWrite(state->pin_id, LOW); digitalWrite(state->pin_id, LOW);
state->pin_state = false; state->pin_state = true;
}
} }
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)) void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId) {
{ _majorHardwareVersion = majorHardwareVersion;
CanBusses->ForEach(handle); _minorHardwareVersion = minorHardwareVersion;
} _deviceTypeId = deviceTypeId;
void SetupMeyCan() if (MeyPin != NULL)
{
CalculateMyDeviceId();
if (MeyPin != NULL);
MeyPin->ForEach(SetupMeyPin); MeyPin->ForEach(SetupMeyPin);
if (CanBusses != NULL)
{
CanBusses->ForEach(InitCanInterface, NULL);
}
} }
void SetCanInterface(byte index, byte pinId)
{
MCP2515* newCanInterface = new MCP2515(pinId);
CanInterface* canInterface = new CanInterface();
if (CanBusses == NULL) void SetDevicedId(byte high, byte low) {
CanBusses = canInterface; myDeviceId = (high << 8) | low;
else
CanBusses->AddCanInterface(canInterface);
} }
void SetMeyPin(byte index, byte meyPinId, byte pinId) void SetMeyPin(byte meyPinId, byte pinId) {
{
PinState *newState = new PinState(); PinState *newState = new PinState();
newState->Init(pinId, (byte)meyPinId); newState->Init(pinId, (byte)meyPinId);
@@ -64,65 +49,68 @@ void SetMeyPin(byte index, byte meyPinId, byte pinId)
} }
bool CheckPinStatus(PinState * state) bool ReadPin(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); return digitalRead(state->pin_id);
} }
void HandleFrame(can_frame *frame, MCP2515 *source) void SendSwitchedTriggeredCanPackage(byte pinId, int state) {
{ twai_message_t message;
CanBusses->ForEach(DoSendCanPkg, frame, source); message.extd = 1;
HandleTriggerMeypinCanPackage(frame); 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 HandleTriggerMeypinCanPackage(can_frame *frame) void CheckPinStatus(PinState *state) {
{ if (!state->is_input)
if (GetPackageType(frame->can_id) == TRIGGER_SWITCH_CAN_ID) return;
{
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;
}
void CheckMeyPinsTriggered() {
MeyPin->ForEach(CheckPinStatus);
}
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;
}
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]; uint16_t adressedDeviceId = ((uint16_t)frame->data[0] << 8) | frame->data[1];
if (adressedDeviceId != myDeviceId) return; if (adressedDeviceId != myDeviceId) return;
@@ -132,10 +120,8 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
PinState *adressedPin = MeyPin->Find(meyPinId); PinState *adressedPin = MeyPin->Find(meyPinId);
if (adressedPin != NULL) if (adressedPin != NULL) {
{ if (adressedPin->is_input == true) {
if (adressedPin->is_input == true)
{
pinMode(adressedPin->pin_id, OUTPUT); pinMode(adressedPin->pin_id, OUTPUT);
adressedPin->is_input = false; adressedPin->is_input = false;
} }
@@ -147,104 +133,17 @@ void HandleTriggerMeypinCanPackage(can_frame *frame)
digitalWrite(adressedPin->pin_id, state); digitalWrite(adressedPin->pin_id, state);
SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state); SendSwitchedTriggeredCanPackage(adressedPin->meyPinId, state);
} }
} }
} }
} }
byte CircularShift(byte b)
{ void HandleFrame(twai_message_t *frame) {
return (b << 1) | (b >> 7 & 1); HandleTriggerMeypinCanPackage(frame);
} }
uint16_t GetDeviceId(uint32_t canFrameId)
{
return canFrameId & 0xFFFF; void DoSendCanPkg(twai_message_t *frame) {
} esp_err_t ret = twai_transmit(frame, pdMS_TO_TICKS(1000));
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();
} }

View File

@@ -1,43 +1,9 @@
#ifndef MEYCAN_H #ifndef MEYCAN_H
#define MEYCAN_H #define MEYCAN_H
#include <Arduino.h>
#include <SPI.h> #include <SPI.h>
#include <mcp2515.h> #include "driver/twai.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 typedef struct PinState
{ {
@@ -87,42 +53,28 @@ typedef struct PinState
}; };
const byte SOFTWARE_VERSION_HIGH = 5; const byte SOFTWARE_VERSION_HIGH = 6;
const byte SOFTWARE_VERSION_LOW = 0; const byte SOFTWARE_VERSION_LOW = 0;
const byte HARDWARE_VERSION_HIGH = 7; const byte HARDWARE_VERSION_HIGH = 8;
const byte HARDWARE_VERSION_LOW = 0; const byte HARDWARE_VERSION_LOW = 1;
const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL; const uint16_t HELP_PACKAGE_CAN_ID = 0x0FFFUL;
const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050; const uint16_t SWITCH_TRIGGERED_CAN_ID = 0x0050;
const uint16_t TRIGGER_SWITCH_CAN_ID = 0x0055; 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)); void SetupMeyCan(byte majorHardwareVersion, byte minorHardwareVersion, byte deviceTypeId);
bool ReadPin(PinState *state); uint32_t CreateCanId(uint16_t commandId);
bool CheckPinStatus(PinState * state); void SetDevicedId(byte high, byte low);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */ void SetMeyPin(byte meyPinId, byte pinId);
void HandleFrame(can_frame *frame, MCP2515 *source);
void HandleTriggerMeypinCanPackage(can_frame *frame);
byte CircularShift(byte b);
uint16_t GetDeviceId(uint32_t canFrameId); uint16_t GetDeviceId(uint32_t canFrameId);
uint16_t GetPackageType(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 SendSwitchedTriggeredCanPackage(byte pinId, int state);
void BroadcastTriggerMeyPinCanPackage(uint16_t targetCanId, byte pinId, byte state);
void DoSendCanPkg(can_frame *frame); void HandleFrame(twai_message_t *frame);
void DoSendCanPkg(MCP2515 *interface, can_frame *frame); void CheckPinStatus(PinState *state);
void CheckMeyPinsTriggered(); /* checks weather a meypin triggered and sends a can pkg is neccessary */
void CalculateMyDeviceId();
void DoSendCanPkg(twai_message_t *frame) ;
#endif #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 <Arduino.h>
#include <mcp2515.h>; #include <driver/i2s.h>
#include "MeyCan.h"; #include "opus.h"
#include "opus_data.h"
#include "MeyCan.h"
void setup() { constexpr int RX_PIN = 2; // CAN_TRANCEIVER_RX_PIN
return; constexpr int TX_PIN = 3; // CAN_TRANCEIVER_TX_PIN
SPI.begin(); bool driver_installed = false;
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLA | 1 << 7); constexpr i2s_port_t I2S_PORT = I2S_NUM_0; // I2S-Peripherie-Instanz (0 = erster Controller)
delay(10); // a bit delay for mcp2515 to get the clock 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)
SetMeyPin(0, 1, PIN_PD0); static OpusDecoder *dec = nullptr;
SetMeyPin(1, 2, PIN_PC7); static int16_t pcm[MAX_FRAME];
SetMeyPin(2, 3, PIN_PD2); static int16_t stereo[MAX_FRAME * 2];
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);
delay(20); 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;
SetCanInterface(0, PIN_PD4); i2s_pin_config_t pins = {};
SetupMeyCan(); 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;
void loop() // 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(); 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() {
Serial.begin(115200);
i2s_setup();
// Explicit GND for LED and Input
pinMode(21, OUTPUT);
digitalWrite(21, LOW);
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();
xTaskCreate(canTaskFunc, "can", 4096, nullptr, 5, nullptr);
}
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

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

View File

@@ -0,0 +1,127 @@
{
"Header": {
"GenerationSoftware": {
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "9.0.2"
},
"CreationDate": "2025-07-20T17:27:30+02:00"
},
"GeneralSpecs": {
"ProjectId": {
"Name": "Meycad",
"GUID": "4d657963-6164-42e6-9b69-6361645f7063",
"Revision": "rev?"
},
"Size": {
"X": 100.37,
"Y": 64.05
},
"LayerNumber": 2,
"BoardThickness": 1.6,
"Finish": "None"
},
"DesignRules": [
{
"Layers": "Outer",
"PadToPad": 0.2,
"PadToTrack": 0.2,
"TrackToTrack": 0.2,
"MinLineWidth": 0.381,
"TrackToRegion": 0.5,
"RegionToRegion": 0.5
}
],
"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",
"Thickness": 0.01,
"Name": "Top Solder Mask"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "F.Cu"
},
{
"Type": "Dielectric",
"Thickness": 1.51,
"Material": "FR4",
"Name": "F.Cu/B.Cu",
"Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "B.Cu"
},
{
"Type": "SolderMask",
"Thickness": 0.01,
"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

@@ -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_fffffff7_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "Meycad.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,618 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": true,
"text_position": 0,
"units_format": 0
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.8,
"height": 1.27,
"width": 2.54
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"creepage": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_filters_mismatch": "ignore",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_to_hole": "warning",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"mirrored_text_on_front_layer": "warning",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"nonmirrored_text_on_back_layer": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_on_edge_cuts": "error",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_angle": "error",
"track_dangling": "warning",
"track_segment_length": "error",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_groove_width": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpthpad": true,
"td_onroundshapesonly": false,
"td_onsmdpad": true,
"td_ontrackend": false,
"td_onvia": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"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": "Meycad.kicad_pro",
"version": 3
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"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.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 4
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "../../../../tmp/MeyCanV8/",
"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": [
[
"95707ee4-6ed9-4d00-9b28-1b2b2ac99ef3",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

102642
Switch V8/Meycad/fp-info-cache Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
{"hostname":"meydin","username":"meydin"}

View File

@@ -0,0 +1 @@
{"hostname":"meydin","username":"meydin"}

9
unlock_keyring.txt Normal file
View File

@@ -0,0 +1,9 @@
echo 'NOTE: This script will only work if launched via source or .' >&2
echo -n 'Login password: ' >&2
read -s _UNLOCK_PASSWORD || return
killall -q -u "$(whoami)" gnome-keyring-daemon
eval $(echo -n "${_UNLOCK_PASSWORD}" \
| gnome-keyring-daemon --daemonize --login \
| sed -e 's/^/export /')
unset _UNLOCK_PASSWORD
echo '' >&2