4 Commits

Author SHA1 Message Date
23fae3e290 small adjustments during welding 2026-05-23 18:39:30 +02:00
b0ba83ca4b PCB v0.1 created 2026-05-14 19:59:33 +02:00
9c805359e8 Schematics & start PCB - Rev1 2026-05-10 17:42:25 +02:00
64da9b5010 Starting Repo and Project 2026-05-03 14:50:10 +02:00
29 changed files with 22232 additions and 595 deletions

125
README.md
View File

@ -1,116 +1,47 @@
# ToGo-Lab FireFly Morse Blinker
# FireFly Solar / 日輪蛍
**DIY kit**: ATtiny-based Morse blinker. Through-hole. No mains. Simple on purpose.
**Default license**: [CC-BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/)
**Nichirin Hotaru**
*A small solar-powered Morse firefly for the outdoors.*
---
**太陽を宿し、夜にモールスを灯す蛍。**
*Taiyō o yadoshi, yoru ni Mōrusu o tomosu hotaru.*
*A firefly carrying the sun, lighting Morse in the night.*
## Intro
## Overview
This is my “Hello World” hardware project on the new ToGo-Lab server.
FireFly Solar is a small outdoor LED blinker inspired by the idea of an LED throwie, but powered by sunlight instead of a disposable coin cell.
Years ago I built a tiny Morse throwie: ATtiny + one LED + one resistor, plus firmware. This version adds a supercapacitor and small solar cells. It uses the LED as a light detector, so it only blinks in the dark.
During the day, the solar cell charges the energy storage.
At night, the circuit wakes up and sends a simple Morse-style light signal.
It's not a throwie anymore. Hang it anywhere with decent light (for charging) and dry conditions and let it blink Morse on its own during night.
The project is partly a small garden object, partly a low-power electronics experiment, and partly a design exercise for future DIY kits.
Goal: a beginner-friendly DIY kit with clear docs and hackable firmware.
## Project Goals
Checkout also the [blog about this project](https://https://togo-lab.io/?p=82).
ToGo-Lab Cloud [link](https://nextcloud.togo-lab.io/index.php/f/1176), actual internal link only.
Suggestions welcome. Open an issue or email [tgohle@togo-lab.io](mailto:tgohle@togo-lab.io).
- Build a solar-powered outdoor Morse blinker
- Keep the hardware simple and robust
- Improve practical low-power design skills
- Test mechanical concepts for outdoor 3D-printed parts
- Learn what is needed to turn a small electronics project into a possible DIY kit
---
## Naming
## Repo layout
```
├── doc
│   ├── assets // pictures, diagrams..
│   └── logs // lab logs
├── firmware
│   ├── archive // archive, derived from...
│   │   └── ATTINY45_2014_MorseThrowie
│   │   ├── ATTINY45_2014_MorseThrowie.ino
│   │   └── pitches.h
│   ├── include
│ ├── FireFly_MorseBlinker // arduino IDE file
│   └── src
├── hardware
│   ├── CAD // CAD files for mechanical work
│   │   └── ToGo-Lab_FireFly_MorseThrowie.dxf
│   └── KiCad // KiCad project files
│   └── 0001-FireFly
│   ├── 0001-FireFly-backups
│   │   ├── 0001-FireFly-2025-09-07_180819.zip
│   │   └── 0001-FireFly-2025-09-07_181506.zip
│   ├── 0001-FireFly.kicad_pcb
│   ├── 0001-FireFly.kicad_prl
│   ├── 0001-FireFly.kicad_pro
│   └── 0001-FireFly.kicad_sch
├── License_-_CC_BY-NC_4.0.md
└── README.md
```
The English project name remains:
---
**FireFly Solar**
## Hardware
- **MCU**: ATtiny45/85 (internal RC clock, no crystal).
- **I/O**: 1× LED + series resistor. Unused pins broken out to breadboard-style pads.
- **Burning Attiny**: external ISP programmer via Arduino IDE; PDIP-8 ATtiny45/85 footprint.
- **Power**: 3V DC (coin cell & & solar cell + supercapacitor with Schottky diodes to extend battery power).
- **Safety**: low voltage only. Observe polarity.
- **PCB**: hackable; access to unused ATtiny pins. (big pads for beginners, clear silks, LED polarity marks)
For blog posts, documentation, and presentation, the project also uses the Japanese name:
---
**日輪蛍 / Nichirin Hotaru**
## Firmware / Arduino IDE
- Follow `Documentation/ToGo-Lab_FireFly_ArduinoIDE_Program_Guide.md`.
- Board core: any stable ATtiny45/85 core.
- Clock: **internal**. No fuse change required for first tests.
- Programmer: USBasp / AVRISPmkII / Arduino-as-ISP.
- Open the sketch in `0001_FireFly/Program/`.
---
## Assembly
- Follow `Documentation/ToGo-Lab_FireFly_Assembly_Guide.md`.
- First power-up: LED should blink test pattern. If not, recheck polarity and bridges.
---
## Test / Bring-up
1. Visual check; no shorts.
2. Power at 35 V. Current < 10 mA idle.
3. Program firmware over ISP.
4. Verify Morse timing; adjust WPM in `config.h` if needed.
5. Optional: measure current.
---
## BOM
- Follow `Documentation/ToGo-Lab_FireFly_BOM.csv` as source of truth.
---
## Files to fabricate
- Gerbers and drill files from `KiCad/fab/` (board house-ready).
- Project file: `0001_FireFly/KiCad/ToGo-Lab_FireFly.kicad_pro`.
---
## Known constraints
- Through-hole only. No reflow.
- Minimal I/O to keep it beginner-friendly.
- Low power is nice but optional; optimize after the basic release.
---
## Roadmap (tech only)
- v0.1-proto: breadboard + first PCB, single message, speed presets.
- v1.0: build guide, BOM with alternates, pilot 10 units.
- v1.1: docs polish, optional brightness setting, minor PCB tweaks.
The name roughly means **sun-disc firefly**. It keeps the solar theme, adds a slightly mythic tone, and still fits a small piece of outdoor hardware.
---
## Contributing
PRs and issues welcome. Keep it simple.
Photos of your build you send me go in `Documentation/gallery/` with a short caption and license notice.
Photos of your build you send me go in `Documentation/gallery/` with a short caption and license notice.
---
## Default license**: [CC-BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/)

Submodule hardware/0001_FireFly-Solar/.history added at 1c8d4d7c5c

View File

@ -0,0 +1,5 @@
(version 1)
(rule Minimum_text_height_and_thickness_1
(constraint text_height (min 0.6mm))
(constraint text_thickness (min 0.1mm))
)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,127 @@
{
"board": {
"active_layer": 5,
"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
},
"prototype_zone_fills": false,
"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",
"drc_exclusions",
"locked_item_shadows",
"conflict_shadows",
"shapes",
"board_outline_area",
"ly_points"
],
"visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"integration_disabled": false,
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "0001_FireFly-Solar.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": [],
"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_time_domain_details": false,
"show_unconnected_nets": false,
"show_zero_pad_nets": false,
"sort_ascending": true,
"sorting_column": -1
},
"open_jobsets": [],
"project": {
"files": []
},
"schematic": {
"hierarchy_collapsed": [],
"selection_filter": {
"graphics": true,
"images": true,
"labels": true,
"lockedItems": false,
"otherItems": true,
"pins": true,
"ruleAreas": true,
"symbols": true,
"text": true,
"wires": true
}
}
}

View File

@ -0,0 +1,778 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_barcodes": false,
"apply_defaults_to_fp_dimensions": false,
"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.7,
"height": 1.4,
"width": 1.4
},
"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": {
"border_display_style": 2,
"border_hatch_pitch": 0.5,
"corner_radius": 0.0,
"corner_smoothing": 0,
"fill_mode": 0,
"hatch_gap": 1.5,
"hatch_orientation": 0.0,
"hatch_smoothing_level": 0,
"hatch_smoothing_value": 0.1,
"hatch_thickness": 1.0,
"min_clearance": 0.5,
"min_island_area": 10.0,
"min_thickness": 0.25,
"pad_connection": 1,
"remove_islands": 0,
"thermal_relief_gap": 0.5,
"thermal_relief_spoke_width": 0.5
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [
[
"copper_edge_clearance|131952996|49276030|d5a8d279-1277-4128-8111-479753d97832|74ba0eb0-a42b-49db-8990-e7e337244d89",
""
],
[
"copper_edge_clearance|135254996|49276021|d5a8d279-1277-4128-8111-479753d97832|6760cf2b-9d51-44e9-8541-9b08cc6bed3a",
""
],
[
"copper_edge_clearance|138556996|49276011|d5a8d279-1277-4128-8111-479753d97832|5b16be99-1a09-4cc0-a4d6-0e5fae921e96",
""
],
[
"text_height|141224000|109999000|18cc7c24-1e1e-47b4-bd81-2abaec8c3831|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|119126000|be078bc2-b3be-4c33-abfe-930461332b78|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|122936000|57275588-b94d-44a7-b263-ab2e942abbb9|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|126746000|ac73bb6c-6b4c-4683-bc6b-c539afa6834f|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|130556000|dfc1c2d5-221c-45bf-8f4f-92d8a3ddf04a|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|134366000|e9026731-8c2e-491a-9b73-4cda2fa80a02|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|138176000|cf4eeb69-e06f-463f-be45-22626ac2c2b4|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129032000|141986000|c29774df-bdb9-44e2-a17d-cfa3cd693d71|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|129184400|150241000|88401ad0-1dea-4344-ab33-329fd06bd493|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|135148000|106152000|7c4ccd6a-1b52-4734-bd95-092ada163852|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|135382000|84709000|88b0a397-e4a2-4145-86f6-0fa60b4a4bd9|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141224000|109999000|18cc7c24-1e1e-47b4-bd81-2abaec8c3831|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141325600|150144800|5da7a07f-f063-43b3-a149-e672965b459b|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|119126000|40b0fefb-8b86-43f7-b24d-e20c4677b223|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|122936000|77ee43fb-9700-42ab-8702-560042b5edd3|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|126746000|833d2a60-9010-4cb2-8045-b8050c8ee771|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|130556000|5a756363-e24d-4c12-82cf-59fc84a986ae|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|134366000|685c5797-de13-4bd0-a3b9-5fb75b4b9dad|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|138176000|15931c23-e5f6-4be3-ba3e-7a720c730e9b|00000000-0000-0000-0000-000000000000",
""
],
[
"text_thickness|141478000|141986000|e240b788-8dbb-43c9-8c9f-717e069201be|00000000-0000-0000-0000-000000000000",
""
]
],
"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_field_mismatch": "warning",
"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",
"missing_tuning_profile": "warning",
"net_conflict": "warning",
"nonmirrored_text_on_back_layer": "warning",
"npth_inside_courtyard": "error",
"padstack": "warning",
"pth_inside_courtyard": "error",
"shorting_items": "error",
"silk_edge_clearance": "ignore",
"silk_over_copper": "warning",
"silk_overlap": "ignore",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "ignore",
"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_not_centered_on_via": "ignore",
"track_on_post_machined_layer": "error",
"track_segment_length": "error",
"track_width": "error",
"tracks_crossing": "error",
"tuning_profile_track_geometries": "ignore",
"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.2,
"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": [
0.0,
0.127,
0.254,
0.508,
0.635,
1.27
],
"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": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false
},
"ipc2581": {
"bom_rev": "",
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": "",
"sch_revision": "1"
},
"layer_pairs": [],
"layer_presets": [],
"viewports": []
},
"boards": [],
"component_class_settings": {
"assignments": [],
"meta": {
"version": 0
},
"sheet_component_classes": {
"enabled": false
}
},
"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",
"field_name_whitespace": "warning",
"footprint_filter": "warning",
"footprint_link_issues": "warning",
"four_way_junction": "warning",
"ground_pin_not_ground": "warning",
"hier_label_mismatch": "error",
"isolated_pin_label": "warning",
"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": "error",
"power_pin_not_driven": "error",
"same_local_global_label": "warning",
"similar_label_and_power": "warning",
"similar_labels": "warning",
"similar_power": "warning",
"simulation_model_issue": "warning",
"single_global_label": "warning",
"stacked_pin_name": "warning",
"unannotated": "error",
"unconnected_wire_endpoint": "warning",
"undefined_netclass": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "0001_FireFly-Solar.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,
"tuning_profile": "",
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 5
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"idf": "",
"netlist": "",
"plot": "",
"specctra_dsn": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"annotation": {
"method": 0,
"sort_order": 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": "Reference"
},
"bus_aliases": {},
"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": [],
"hop_over_size_choice": 0,
"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
},
"page_layout_descr_file": "",
"plot_directory": "",
"reuse_designators": true,
"subpart_first_id": 65,
"subpart_id_separator": 0,
"top_level_sheets": [
{
"filename": "0001_FireFly-Solar.kicad_sch",
"name": "Root",
"uuid": "d6486f66-f0ec-4484-bce4-0ec6b0e57e1d"
}
],
"used_designators": "J1-2",
"variants": []
},
"sheets": [
[
"d6486f66-f0ec-4484-bce4-0ec6b0e57e1d",
"Root"
]
],
"text_variables": {},
"tuning_profiles": {
"meta": {
"version": 0
},
"tuning_profiles_impedance_geometric": []
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,26 @@
*
.subckt 0001_FireFly-Solar
J2 __J2
D2 __D2
D3 __D3
J3 __J3
R1 Net-_D1-K_ Net-_D4-K_ 33
D1 __D1
J1 __J1
J4 __J4
D5 __D5
U1 __U1
L1 Net-_D4-K_ Net-_D5-A_ 22u
D4 __D4
C1 Net-_D4-K_ GND 50F SuperCap
C2 Net-_D4-K_ GND 150u
C3 Net-_D5-K_ GND 100u
C4 Net-_U1-REF_ GND 0.1u
U2 __U2
D6 Net-_D6-K_ Net-_D6-A_ LED
R2 Net-_U2-XTAL1/PB3_ Net-_D6-K_ R
.ends

Binary file not shown.

View File

@ -0,0 +1,288 @@
/*
FireFly tetrahedron adapter
Base STL: tetrahedron40mmC.stl
Purpose:
- Import original 40 mm foldable tetrahedron STL
- Scale it to 60 mm base geometry
- Add cable holes, vent/drain holes, and optional PCB mounting holes
Workflow:
1. Set PART = "upper"
2. Render with F6
3. Export STL
4. Set PART = "lower"
5. Render with F6
6. Export STL
Notes:
- Hole coordinates are defined on the original 40 mm STL coordinate system.
- The script scales them automatically to 60 mm.
- First export should be treated as v0.1 prototype.
*/
/* =========================
Main selection
========================= */
PART = "upper"; // "upper", "lower", or "both_preview"
/* =========================
Input file
========================= */
input_stl = "tetrahedron40mmC.stl";
/* =========================
Scaling
========================= */
// Original tetrahedron edge length
original_edge_mm = 40;
// Target mechanical base size
target_edge_mm = 60;
// XY scale from 40 mm to 60 mm
scale_xy = target_edge_mm / original_edge_mm; // 1.5
// Keep original thickness.
// Set to 1.2 or 1.3 if you want a slightly thicker part.
scale_z = 1.0;
/* =========================
General hole settings
========================= */
hole_fn = 40;
cut_height = 20;
/* =========================
Feature switches
========================= */
add_upper_cable_holes = true;
add_upper_hanger_hole = true;
add_lower_vent_holes = true;
add_lower_cable_holes = true;
add_lower_pcb_mount_holes = true;
// Keep this false for the first prototype.
// Standoffs may interfere with folding depending on print orientation.
add_lower_pcb_standoffs = false;
/* =========================
Hole sizes
========================= */
cable_hole_d = 3.2; // for small solar-panel wires
hanger_hole_d = 3.5; // for small ring / wire / eyelet
vent_hole_d = 2.0; // condensation vent / drain holes
pcb_screw_hole_d = 2.2; // M2 clearance-ish
pcb_standoff_d = 6.0;
pcb_standoff_h = 3.0;
/* =========================
Coordinate reference
=========================
The uploaded STL is approximately:
X: -34.64 to +34.64
Y: -20.00 to +60.00
Z: -0.10 to +2.00
The original model is a flat foldable tetrahedron net.
Coordinates below are before scaling.
*/
/* =========================
Upper part hole positions
========================= */
// Cable holes for three solar panels.
// Adjust after checking where your real panel wires exit.
upper_cable_points = [
[-18, 20],
[ 24, 7],
[ 24, 33]
];
// Optional hanger hole close to one upper fold/vertex area.
// If this weakens the corner too much, disable it and use an external loop instead.
upper_hanger_points = [
[0, 38]
];
/* =========================
Lower part hole positions
========================= */
// Cable transfer holes between upper solar section and lower electronics bay.
lower_cable_points = [
[-10, 20],
[ 12, 13],
[ 12, 27]
];
// Small vent/drain hole clusters near likely lower/edge areas.
// These are deliberately small.
lower_vent_centres = [
[ 0, 3],
[ 0, 37],
[-30, 20],
[ 31, 20]
];
// Approximate triangular PCB mounting pattern.
// Tune this after measuring your actual red triangle PCB.
lower_pcb_mount_points = [
[ 0, 8],
[ 25, 20],
[ 0, 32]
];
/* =========================
Basic modules
========================= */
module base_import_scaled()
{
scale([scale_xy, scale_xy, scale_z])
import(input_stl, convexity = 10);
}
module vertical_hole(p, d)
{
translate([p[0] * scale_xy, p[1] * scale_xy, 1])
cylinder(h = cut_height, d = d, center = true, $fn = hole_fn);
}
module vent_cluster(p)
{
// Small 2 x 3 vent/drain pattern.
// Pitch is in final millimetres, not original model coordinates.
pitch = 3.0;
for (ix = [-1, 0, 1])
for (iy = [0, 1])
translate([
p[0] * scale_xy + ix * pitch,
p[1] * scale_xy + iy * pitch,
1
])
cylinder(h = cut_height, d = vent_hole_d, center = true, $fn = hole_fn);
}
module pcb_standoff(p)
{
// Standoff added on top of the flat STL.
// Use only if you confirm it does not block folding.
translate([p[0] * scale_xy, p[1] * scale_xy, 2.1 * scale_z])
cylinder(h = pcb_standoff_h, d = pcb_standoff_d, center = false, $fn = hole_fn);
}
/* =========================
Upper tetrahedron
========================= */
module upper_part()
{
difference()
{
base_import_scaled();
if (add_upper_cable_holes)
{
for (p = upper_cable_points)
vertical_hole(p, cable_hole_d);
}
if (add_upper_hanger_hole)
{
for (p = upper_hanger_points)
vertical_hole(p, hanger_hole_d);
}
}
}
/* =========================
Lower tetrahedron
========================= */
module lower_part()
{
difference()
{
union()
{
base_import_scaled();
if (add_lower_pcb_standoffs)
{
for (p = lower_pcb_mount_points)
pcb_standoff(p);
}
}
if (add_lower_cable_holes)
{
for (p = lower_cable_points)
vertical_hole(p, cable_hole_d);
}
if (add_lower_vent_holes)
{
for (p = lower_vent_centres)
vent_cluster(p);
}
if (add_lower_pcb_mount_holes)
{
for (p = lower_pcb_mount_points)
vertical_hole(p, pcb_screw_hole_d);
}
}
}
/* =========================
Output
========================= */
if (PART == "upper")
{
upper_part();
}
else if (PART == "lower")
{
lower_part();
}
else if (PART == "both_preview")
{
translate([-80, 0, 0])
upper_part();
translate([80, 0, 0])
lower_part();
}
else
{
echo("Invalid PART setting. Use upper, lower, or both_preview.");
}

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +0,0 @@
(kicad_pcb (version 20240108) (generator "pcbnew") (generator_version "8.0")
)

View File

@ -1,83 +0,0 @@
{
"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,
"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": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "0001-FireFly.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View File

@ -1,392 +0,0 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"rules": {},
"track_widths": [],
"via_dimensions": []
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"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",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "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",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "0001-FireFly.kicad_pro",
"version": 1
},
"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)",
"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": 3
},
"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": "",
"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": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "Grouped By Value",
"sort_asc": true,
"sort_field": "Reference"
},
"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": "",
"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": [
[
"f227a2cd-5cbd-41a5-87f8-a5c1515170aa",
"Root"
]
],
"text_variables": {}
}

View File

@ -1,21 +0,0 @@
(kicad_sch
(version 20231120)
(generator "eeschema")
(generator_version "8.0")
(uuid "f227a2cd-5cbd-41a5-87f8-a5c1515170aa")
(paper "A4")
(title_block
(title "ToGo Lab FireFly Morse Throwie")
(rev "#001")
(company "ToGo-Lab")
(comment 1 "- https://togo-lab.io/")
(comment 2 "- Email: tgohle@togo-lab.io")
(comment 3 "Thomas Gohle")
)
(lib_symbols)
(sheet_instances
(path "/"
(page "1")
)
)
)