├── img ├── RPi.jpg ├── kit.jpg ├── lipo_jst.jpg ├── rclocal.png ├── 15mm_drill.png ├── Hero_shot.png ├── Outdoor_Node.jpg ├── Outdoor_Node.png ├── PhotonPowerZero.jpg ├── Put_together_1.jpg ├── Put_together_2.jpg ├── SD_card_install.png ├── Solar_wiring_1.png ├── Solar_wiring_2.png ├── Solar_wiring_3.png ├── Solar_wiring_4.png ├── PhotonPowerZero2.jpg ├── Pins_in_use_by_PPZ.png ├── heat_set_inserts.jpg ├── Installing_PPZ_thumb.png ├── panel_multicomp_mount.jpg ├── Wireless_Interfaces │ ├── nrf24.png │ ├── RAK2245.png │ ├── nrf_load.png │ ├── Pi_Control.png │ ├── SIMA7670SA.png │ ├── RAK811_pHAT.png │ ├── SIM7600_idle.png │ ├── SIM7600_load.png │ ├── SIM7020XNB-IoT.png │ └── SIM7600X_wwan0.png ├── hea_set_inserts_two_parts.jpg ├── two_parts_joined_together.jpg ├── heat_set_inserts_two_parts.jpg ├── 10W_voltaic_to_Multicomp_MC002194.png ├── 6W_voltaic_to_Multicomp_MC002194.png ├── Finished_Voltaic_to_Multicomp_MC002194.jpg ├── Mount_Pi_PPZ_inside_Multicomp_MC002194.png ├── case_mount_inside_Multicomp_MC002194.jpg └── clearing_hole_after_heat_set_inserts.jpg ├── PCBs ├── gerbers │ ├── PPZ.zip │ ├── Photon_Power_Zero_PCB_r1_01-B_Silkscreen.gbr │ ├── Photon_Power_Zero_PCB_r1_01-Edge_Cuts.gbr │ ├── Photon_Power_Zero_PCB_r1_01-B_Paste.gbr │ ├── Photon_Power_Zero_PCB_r1_01-PTH.drl │ ├── Photon_Power_Zero_PCB_r1_01-NPTH.drl │ ├── Photon_Power_Zero_PCB_r1_01-B_Mask.gbr │ ├── Photon_Power_Zero_PCB_r1_01-job.gbrjob │ └── Photon_Power_Zero_PCB_r1_01-F_Paste.gbr ├── PhotonPowerZeroSchematic_Informational_Only.kicad_prl ├── README.md ├── Photon_Power_Zero_PCB_r1_02.kicad_prl ├── Photon_Power_Zero_PCB_r1_01.kicad_prl ├── PhotonPowerZeroSchematic_Informational_Only.kicad_pro ├── Photon_Power_Zero_PCB_r1_02.kicad_pro └── Photon_Power_Zero_PCB_r1_01.kicad_pro ├── FDM ├── UPS_mount │ ├── UPS_mount_r10.stl │ ├── UPS_mount_r11.stl │ ├── UPS_mount_r12.stl │ ├── README.md │ ├── UPS_mount_r11.scad │ ├── UPS_mount_r12.scad │ └── UPS_mount_r10.scad ├── 6W_Voltaic_Panel_to_Multicomp_enclosure │ ├── Pole_mount.stl │ ├── Panel_Mount_6W.stl │ ├── Jaycar_case_mount_r9.stl │ ├── README.md │ ├── case_mount_r9.scad │ └── Panel_Mount_6W.scad ├── 10W_Voltaic_Panel_to_Multicomp_enclosure │ ├── pole_mount.stl │ ├── case_mount_r10.stl │ ├── Panel_Mount_10W_r2.stl │ ├── Jaycar_case_mount_r10.stl │ ├── Jaycar_case_mount_r9.stl │ ├── Panel_Mount_10W_1st_half.stl │ ├── Panel_Mount_10W_2nd_half.stl │ ├── case_mount_r10.scad │ ├── case_mount_r9.scad │ ├── README.md │ ├── Panel_Mount_10W_r2.scad │ └── Panel_Mount_10W.scad ├── README.md └── LICENSE ├── LIPO_PURCHASING.md ├── README.md ├── DESIGN_AND_DECISIONS.md ├── REDUCING_ENERGY_CONSUMPTION.md ├── USERDOCS.md ├── Code ├── PPZ_RPi_code.py ├── ATtiny_2025_06_24.c │ └── ATtiny_2025_06_24.c.ino ├── ATtiny_2023_11_03.c │ └── ATtiny_2023_11_03.c.ino └── ATtiny_2024_01_18.c │ └── ATtiny_2024_01_18.c.ino └── LICENSE /img/RPi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/RPi.jpg -------------------------------------------------------------------------------- /img/kit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/kit.jpg -------------------------------------------------------------------------------- /img/lipo_jst.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/lipo_jst.jpg -------------------------------------------------------------------------------- /img/rclocal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/rclocal.png -------------------------------------------------------------------------------- /img/15mm_drill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/15mm_drill.png -------------------------------------------------------------------------------- /img/Hero_shot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Hero_shot.png -------------------------------------------------------------------------------- /PCBs/gerbers/PPZ.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/PCBs/gerbers/PPZ.zip -------------------------------------------------------------------------------- /img/Outdoor_Node.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Outdoor_Node.jpg -------------------------------------------------------------------------------- /img/Outdoor_Node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Outdoor_Node.png -------------------------------------------------------------------------------- /img/PhotonPowerZero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/PhotonPowerZero.jpg -------------------------------------------------------------------------------- /img/Put_together_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Put_together_1.jpg -------------------------------------------------------------------------------- /img/Put_together_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Put_together_2.jpg -------------------------------------------------------------------------------- /img/SD_card_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/SD_card_install.png -------------------------------------------------------------------------------- /img/Solar_wiring_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Solar_wiring_1.png -------------------------------------------------------------------------------- /img/Solar_wiring_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Solar_wiring_2.png -------------------------------------------------------------------------------- /img/Solar_wiring_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Solar_wiring_3.png -------------------------------------------------------------------------------- /img/Solar_wiring_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Solar_wiring_4.png -------------------------------------------------------------------------------- /img/PhotonPowerZero2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/PhotonPowerZero2.jpg -------------------------------------------------------------------------------- /img/Pins_in_use_by_PPZ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Pins_in_use_by_PPZ.png -------------------------------------------------------------------------------- /img/heat_set_inserts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/heat_set_inserts.jpg -------------------------------------------------------------------------------- /img/Installing_PPZ_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Installing_PPZ_thumb.png -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r10.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/UPS_mount/UPS_mount_r10.stl -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r11.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/UPS_mount/UPS_mount_r11.stl -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r12.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/UPS_mount/UPS_mount_r12.stl -------------------------------------------------------------------------------- /img/panel_multicomp_mount.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/panel_multicomp_mount.jpg -------------------------------------------------------------------------------- /img/Wireless_Interfaces/nrf24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/nrf24.png -------------------------------------------------------------------------------- /img/hea_set_inserts_two_parts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/hea_set_inserts_two_parts.jpg -------------------------------------------------------------------------------- /img/two_parts_joined_together.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/two_parts_joined_together.jpg -------------------------------------------------------------------------------- /img/Wireless_Interfaces/RAK2245.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/RAK2245.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/nrf_load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/nrf_load.png -------------------------------------------------------------------------------- /img/heat_set_inserts_two_parts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/heat_set_inserts_two_parts.jpg -------------------------------------------------------------------------------- /img/Wireless_Interfaces/Pi_Control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/Pi_Control.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/SIMA7670SA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/SIMA7670SA.png -------------------------------------------------------------------------------- /img/10W_voltaic_to_Multicomp_MC002194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/10W_voltaic_to_Multicomp_MC002194.png -------------------------------------------------------------------------------- /img/6W_voltaic_to_Multicomp_MC002194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/6W_voltaic_to_Multicomp_MC002194.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/RAK811_pHAT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/RAK811_pHAT.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/SIM7600_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/SIM7600_idle.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/SIM7600_load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/SIM7600_load.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/SIM7020XNB-IoT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/SIM7020XNB-IoT.png -------------------------------------------------------------------------------- /img/Wireless_Interfaces/SIM7600X_wwan0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Wireless_Interfaces/SIM7600X_wwan0.png -------------------------------------------------------------------------------- /img/Finished_Voltaic_to_Multicomp_MC002194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Finished_Voltaic_to_Multicomp_MC002194.jpg -------------------------------------------------------------------------------- /img/Mount_Pi_PPZ_inside_Multicomp_MC002194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/Mount_Pi_PPZ_inside_Multicomp_MC002194.png -------------------------------------------------------------------------------- /img/case_mount_inside_Multicomp_MC002194.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/case_mount_inside_Multicomp_MC002194.jpg -------------------------------------------------------------------------------- /img/clearing_hole_after_heat_set_inserts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/img/clearing_hole_after_heat_set_inserts.jpg -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Pole_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Pole_mount.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/pole_mount.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/pole_mount.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/case_mount_r10.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/case_mount_r10.stl -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_6W.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_6W.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_r2.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_r2.stl -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r9.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r9.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r10.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r10.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r9.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Jaycar_case_mount_r9.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_1st_half.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_1st_half.stl -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_2nd_half.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/HEAD/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_2nd_half.stl -------------------------------------------------------------------------------- /FDM/README.md: -------------------------------------------------------------------------------- 1 | # Photon Power Zero Mounts and Cases 2 | 3 | The purpose of this section is to provide ways to mount your Raspberry Pi Zero and Photon Power Zero as well as provide mounts inside cases, batteries, solar panels, cameras and common acessories. 4 | 5 | In each of these subdirectories, there should be links to 3D printer files as well as instructions on how to print, and links to what should be purchased. 6 | 7 | The hope is that, as a community, we can suport a wide range of solar panels, batteries and water proof enclosures. 8 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-B_Silkscreen.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,8.0.2*% 2 | %TF.CreationDate,2024-05-13T09:46:36+08:00*% 3 | %TF.ProjectId,Photon_Power_Zero_PCB_r1_01,50686f74-6f6e-45f5-906f-7765725f5a65,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Legend,Bot*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 8.0.2) date 2024-05-13 09:46:36* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 APERTURE END LIST* 15 | M02* 16 | -------------------------------------------------------------------------------- /FDM/UPS_mount/README.md: -------------------------------------------------------------------------------- 1 | # Photon Power Zero 3D Prints 2 | 3 | All of these Parts are designed to be printed in ABS or better. You may print is PLA if your use case is indoor only but otherwise, the reccomendation is ABS. 4 | 5 | ## Indoor UPS 6 | - 4x M2.5 heat set inserts like https://www.aliexpress.com/item/1005004535859664.html 7 | - M2.5 Mounting hardware https://www.aliexpress.com/item/1005004275784627.html 8 | - USB to barrel Jack cable: https://www.aliexpress.com/item/1005003706471183.html 9 | - See LiPo instructions below 10 | 11 | image1 12 | 13 | ## Outdoor Solar Node 14 | 15 | ### Enclosure 16 | 17 | - 4x M2.5 heat set inserts like https://www.aliexpress.com/item/1005004535859664.html 18 | - M2.5 Mounting hardware https://www.aliexpress.com/item/1005004275784627.html 19 | - Aluminium Enclosure https://www.jaycar.com.au/aluminium-enclosure-with-clear-ends/p/HB6294 20 | 21 | ### Solar Panel and Mount 22 | Image 3 23 | 24 | - 6 x M3 heat set inserts OD 5mm Length 10mm https://www.aliexpress.com/item/1005004535859664.html 25 | - 6 x M3 50mm Staintelss steel hex bolt https://www.thefastenerfactory.com.au/stainless-steel-hex-socket-head-cap-screw-m3-x-50mm-100pc 26 | - Solar Panel https://voltaicsystems.com/6-watt-panel/ 27 | -------------------------------------------------------------------------------- /LIPO_PURCHASING.md: -------------------------------------------------------------------------------- 1 | # LiPo Purchasing considerations 2 | 3 | A single cell 3.7V LiPo battery must be sourced and this should be done carefully. I have had success with 4400mAH as a capacity for the Raspberry Pi Zero. 4 | 5 | You must only buy from a trusted supplier such as Adafruit, Core Electronics, Little Bird, Pimoroni. DO NOT buy LiPo from ebay or ali express vendors. 6 | - https://www.adafruit.com/product/354 7 | - https://core-electronics.com.au/polymer-lithium-ion-battery-4400mah.html 8 | - https://shop.pimoroni.com/products/lithium-ion-battery-pack?variant=23417820423 9 | - https://littlebirdelectronics.com.au/products/lithium-ion-battery-pack-3-7v-4400mah 10 | - https://www.digikey.com/en/products/detail/adafruit-industries-llc/354/5054541 11 | 12 | Many vendors may reverse the polarity of their LiPo Batteries. Do not take any risks or shortcuts here. 13 | 14 | The LiPo connector uses a 2 Pin JST connector. It is very important that you get your battery from a reputable supplier and that the polarity on the 2 Pin JST connector is correct. 15 | 16 | ![Production Kit](img/lipo_jst.jpg?raw=true "Title") 17 |

Make sure the polarity on the JST connector is correct.

18 | 19 | This project is not worth doing if you buy cheap batteries, please don't do it. -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-Edge_Cuts.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,8.0.2*% 2 | %TF.CreationDate,2024-05-13T09:46:36+08:00*% 3 | %TF.ProjectId,Photon_Power_Zero_PCB_r1_01,50686f74-6f6e-45f5-906f-7765725f5a65,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Profile,NP*% 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW 8.0.2) date 2024-05-13 09:46:36* 9 | %MOMM*% 10 | %LPD*% 11 | G01* 12 | G04 APERTURE LIST* 13 | %TA.AperFunction,Profile*% 14 | %ADD10C,0.120000*% 15 | %TD*% 16 | G04 APERTURE END LIST* 17 | D10* 18 | %TO.C,REF\u002A\u002A*% 19 | X131350000Y-79450000D02* 20 | X131350000Y-100010000D01* 21 | X131350000Y-100010000D02* 22 | X131350000Y-103450000D01* 23 | X134410000Y-76390000D02* 24 | X193410000Y-76390000D01* 25 | X134410000Y-106510000D02* 26 | X189720000Y-106510000D01* 27 | X189720000Y-106510000D02* 28 | X193410000Y-106510000D01* 29 | X196470000Y-79450000D02* 30 | X196470000Y-103450000D01* 31 | X131350000Y-79450000D02* 32 | G75* 33 | G02* 34 | X134410000Y-76390000I3060000J0D01* 35 | G01* 36 | X134410000Y-106510000D02* 37 | G75* 38 | G02* 39 | X131350000Y-103450000I-1J3059999D01* 40 | G01* 41 | X193410000Y-76390000D02* 42 | G75* 43 | G02* 44 | X196470000Y-79450000I0J-3060000D01* 45 | G01* 46 | X196470000Y-103450000D02* 47 | G75* 48 | G02* 49 | X193410000Y-106510000I-3059999J-1D01* 50 | G01* 51 | %TD*% 52 | M02* 53 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-B_Paste.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,8.0.2*% 2 | %TF.CreationDate,2024-05-13T09:46:36+08:00*% 3 | %TF.ProjectId,Photon_Power_Zero_PCB_r1_01,50686f74-6f6e-45f5-906f-7765725f5a65,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Paste,Bot*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 8.0.2) date 2024-05-13 09:46:36* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | %ADD10C,1.750000*% 15 | %ADD11R,1.800000X1.800000*% 16 | %ADD12C,1.800000*% 17 | G04 APERTURE END LIST* 18 | D10* 19 | %TO.C,*% 20 | X166890000Y-90560000D03* 21 | %TD*% 22 | %TO.C,*% 23 | X164350000Y-93100000D03* 24 | %TD*% 25 | %TO.C,*% 26 | X166890000Y-93100000D03* 27 | %TD*% 28 | %TO.C,*% 29 | X139300000Y-92530000D03* 30 | %TD*% 31 | %TO.C,*% 32 | X161810000Y-93100000D03* 33 | %TD*% 34 | %TO.C,*% 35 | X164350000Y-90560000D03* 36 | %TD*% 37 | %TO.C,*% 38 | X161810000Y-90560000D03* 39 | %TD*% 40 | %TO.C,*% 41 | X136550000Y-84685000D03* 42 | %TD*% 43 | D11* 44 | %TO.C,*% 45 | X139290000Y-94630000D03* 46 | %TD*% 47 | D10* 48 | %TO.C,*% 49 | X191260000Y-97500000D03* 50 | %TD*% 51 | D11* 52 | %TO.C,REF\u002A\u002A*% 53 | X191210000Y-86070000D03* 54 | %TD*% 55 | %TO.C,REF\u002A\u002A*% 56 | X159270000Y-90560000D03* 57 | %TD*% 58 | D12* 59 | %TO.C,REF\u002A\u002A*% 60 | X159280000Y-93110000D03* 61 | %TD*% 62 | M02* 63 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 8.0.2} date 2024-05-13T09:46:40+0800 3 | ; FORMAT={-:-/ absolute / inch / decimal} 4 | ; #@! TF.CreationDate,2024-05-13T09:46:40+08:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,8.0.2 6 | ; #@! TF.FileFunction,Plated,1,2,PTH 7 | FMAT,2 8 | INCH 9 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 10 | T1C0.0079 11 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 12 | T2C0.0118 13 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 14 | T3C0.0157 15 | % 16 | G90 17 | G05 18 | T1 19 | X5.8486Y-3.5287 20 | X5.8486Y-3.5744 21 | X5.8715Y-3.5516 22 | X5.8943Y-3.5287 23 | X5.8943Y-3.5744 24 | T2 25 | X5.6776Y-3.9189 26 | X5.7497Y-3.8035 27 | X5.9175Y-3.46 28 | X5.9791Y-3.3433 29 | X5.9807Y-3.415 30 | X6.0547Y-3.0472 31 | X6.1563Y-3.6732 32 | X6.2673Y-3.785 33 | X6.3528Y-3.0551 34 | X6.3531Y-4.0043 35 | X6.6472Y-3.2626 36 | X6.7323Y-4.0339 37 | X6.8469Y-3.0555 38 | X7.0469Y-3.0539 39 | X7.4567Y-3.0831 40 | T3 41 | X5.2311Y-3.3177 42 | X5.2449Y-3.1012 43 | X5.415Y-3.2319 44 | X5.4307Y-3.7752 45 | X5.4453Y-3.5996 46 | X5.6185Y-3.6972 47 | X5.6465Y-3.0543 48 | X5.6555Y-3.5807 49 | X5.7433Y-3.3406 50 | X5.774Y-3.7587 51 | X5.7783Y-3.5819 52 | X5.7783Y-3.615 53 | X5.8976Y-3.7626 54 | X5.9441Y-3.2614 55 | X5.989Y-3.7055 56 | X6.095Y-3.5343 57 | X6.0964Y-3.476 58 | X6.1689Y-3.7795 59 | X6.6949Y-3.9894 60 | X6.6957Y-3.8315 61 | X6.7199Y-3.6669 62 | X6.801Y-3.6031 63 | X6.8169Y-3.7815 64 | X6.8945Y-3.8039 65 | X6.9394Y-4.115 66 | X6.952Y-3.8028 67 | X7.0014Y-3.6079 68 | X7.0484Y-4.1126 69 | X7.0514Y-3.6091 70 | X7.1472Y-4.028 71 | X7.2382Y-3.4575 72 | X7.2472Y-3.1035 73 | X7.2642Y-4.0283 74 | X7.4469Y-3.3878 75 | X7.526Y-3.7681 76 | M30 77 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 8.0.2} date 2024-05-13T09:46:40+0800 3 | ; FORMAT={-:-/ absolute / inch / decimal} 4 | ; #@! TF.CreationDate,2024-05-13T09:46:40+08:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,8.0.2 6 | ; #@! TF.FileFunction,NonPlated,1,2,NPTH 7 | FMAT,2 8 | INCH 9 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 10 | T1C0.0382 11 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 12 | T2C0.0669 13 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 14 | T3C0.0701 15 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 16 | T4C0.0709 17 | ; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill 18 | T5C0.1083 19 | % 20 | G90 21 | G05 22 | T1 23 | X5.4965Y-3.1043 24 | X5.4965Y-3.2043 25 | X5.5965Y-3.1043 26 | X5.5965Y-3.2043 27 | X5.6965Y-3.1043 28 | X5.6965Y-3.2043 29 | X5.7965Y-3.1043 30 | X5.7965Y-3.2043 31 | X5.8965Y-3.1043 32 | X5.8965Y-3.2043 33 | X5.9965Y-3.1043 34 | X5.9965Y-3.2043 35 | X6.0965Y-3.1043 36 | X6.0965Y-3.2043 37 | X6.1965Y-3.1043 38 | X6.1965Y-3.2043 39 | X6.2965Y-3.1043 40 | X6.2965Y-3.2043 41 | X6.3965Y-3.1043 42 | X6.3965Y-3.2043 43 | X6.4965Y-3.1043 44 | X6.4965Y-3.2043 45 | X6.5965Y-3.1043 46 | X6.5965Y-3.2043 47 | X6.6965Y-3.1043 48 | X6.6965Y-3.2043 49 | X6.7965Y-3.1043 50 | X6.7965Y-3.2043 51 | X6.8965Y-3.1043 52 | X6.8965Y-3.2043 53 | X6.9965Y-3.1043 54 | X6.9965Y-3.2043 55 | X7.0965Y-3.1043 56 | X7.0965Y-3.2043 57 | X7.1965Y-3.1043 58 | X7.1965Y-3.2043 59 | X7.2965Y-3.1043 60 | X7.2965Y-3.2043 61 | X7.3965Y-3.1043 62 | X7.3965Y-3.2043 63 | T2 64 | X7.5276Y-3.613 65 | T3 66 | X5.5465Y-3.1543 67 | X7.3465Y-3.1543 68 | T4 69 | X7.3504Y-3.613 70 | T5 71 | X5.3114Y-4.0531 72 | X7.5949Y-4.0531 73 | M30 74 | -------------------------------------------------------------------------------- /PCBs/PhotonPowerZeroSchematic_Informational_Only.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "tracks": 1.0, 14 | "vias": 1.0, 15 | "zones": 0.6 16 | }, 17 | "selection_filter": { 18 | "dimensions": true, 19 | "footprints": true, 20 | "graphics": true, 21 | "keepouts": true, 22 | "lockedItems": false, 23 | "otherItems": true, 24 | "pads": true, 25 | "text": true, 26 | "tracks": true, 27 | "vias": true, 28 | "zones": true 29 | }, 30 | "visible_items": [ 31 | 0, 32 | 1, 33 | 2, 34 | 3, 35 | 4, 36 | 5, 37 | 8, 38 | 9, 39 | 10, 40 | 11, 41 | 12, 42 | 13, 43 | 15, 44 | 16, 45 | 17, 46 | 18, 47 | 19, 48 | 20, 49 | 21, 50 | 22, 51 | 23, 52 | 24, 53 | 25, 54 | 26, 55 | 27, 56 | 28, 57 | 29, 58 | 30, 59 | 32, 60 | 33, 61 | 34, 62 | 35, 63 | 36, 64 | 39, 65 | 40 66 | ], 67 | "visible_layers": "fffffff_ffffffff", 68 | "zone_display_mode": 0 69 | }, 70 | "git": { 71 | "repo_password": "", 72 | "repo_type": "", 73 | "repo_username": "", 74 | "ssh_key": "" 75 | }, 76 | "meta": { 77 | "filename": "PhotonPowerZeroSchematic_Informational_Only.kicad_prl", 78 | "version": 3 79 | }, 80 | "project": { 81 | "files": [] 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /PCBs/README.md: -------------------------------------------------------------------------------- 1 | # PhotonPowerZero PCB 2 | 3 | 4 | ![Alt text](../img/PhotonPowerZero.jpg?raw=true "Title")

Photon Power Zero Board

5 | 6 | ### BOM ### 7 | - 1k 4 https://www.digikey.com.au/en/products/detail/yageo/RC0603FR-071KL/726843 8 | - 10k 5 https://www.digikey.com.au/en/products/detail/yageo/RC0603JR-0710KL/726700 9 | - 1.13k 1 https://www.digikey.com.au/en/products/detail/yageo/RC0603FR-071K13L/726849 10 | - 1.18k 1 https://www.digikey.com.au/en/products/detail/yageo/RC0603FR-071K18L/726851 11 | - 10uf 6 https://www.digikey.com.au/en/products/detail/yageo/CC0805ZKY5V6BB106/2103093 12 | - Red 0603 LEDs 2 https://www.digikey.com.au/en/products/detail/liteon/LTST-C191KRKT/386837 13 | - Green 0603 LEDs 2 https://www.digikey.com.au/en/products/detail/rohm-semiconductor/SML-D12M8WT86/1641797 14 | - 100uf 1210 2 https://www.digikey.com.au/en/products/detail/samsung-electro-mechanics/CL31A107MQHNNNE/3887440 15 | - 2.2 µH Shielded Inductor 2.5 A 90mOhm Max 1210 1 https://www.digikey.com.au/en/products/detail/delta-electronics-cyntec/HMLE32251B-2R2MS/9761439 16 | - ATtiny84-SSFR 1 https://www.digikey.com.au/en/products/detail/microchip-technology/ATTINY84A-SSFR/3789533 17 | - AP2161-WG 1 https://www.digikey.com.au/en/products/detail/diodes-incorporated/AP2161WG-7/1964659 18 | - Diode 60 V 2A Surface Mount SOD-123F 1 https://www.digikey.com.au/en/products/detail/smc-diode-solutions/SK34A/6023036 19 | - REG_MCP1700T-3602E/MB 1 https://www.digikey.com.au/en/products/detail/microchip-technology/MCP1700T-3002E%2FMB/3622376 20 | - bq2407 1 https://www.digikey.com.au/en/products/detail/texas-instruments/BQ24074RGTR/2047269 21 | - TPS613222A 1 https://www.digikey.com.au/en/products/detail/texas-instruments/TPS613222ADBVT/9371270 22 | - SMT_Solar_barrel 1 https://www.aliexpress.com/item/32730853300.html 23 | - JST_S2B-PH-SM4-TB_LF__SN_ 1 https://www.aliexpress.com/item/4000906681691.html 24 | - Barrel Jack to USB 1 https://www.aliexpress.com/item/1005003706471183.html 25 | - Samtech Pi headers 1 https://www.samtec.com/ HLE-120-02-L-DV-BE-A-K 26 | - Raspberry Pi header extender 1 https://www.aliexpress.com/item/4001267078607.html 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PhotonPowerZero 2 | 3 | The Photon Power Zero project aims to build an ecosystem of electronics, code, BoM and 3D printable parts that make it as easy as possible to go from a Raspberry Pi Zero proof of concept, sitting on someone's desk, to an outdoor deployment. The first 50 boards sold out through this [Kickstarter](https://www.kickstarter.com/projects/packets2photons/photon-power-zero) and you can purchase boards avaliable after the kickstarter at [Packets2Photons](https://packets2photons.com.au) 4 | 5 | You can find the user docs, showing you how to get started with the Photon Power Zero, and the design decisions around the board here: 6 | * [USERDOCS](USERDOCS.md) 7 | * [6W SOLAR BUILD](FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/README.md) 8 | * [10W SOLAR BUILD](FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/README.md) 9 | * [REDUCING_ENERGY_CONSUMPTION](REDUCING_ENERGY_CONSUMPTION.md) 10 | * [DESIGN_AND_DECISIONS](DESIGN_AND_DECISIONS.md) 11 | * [LIPO_PURCHASING](LIPO_PURCHASING.md) 12 | 13 | 14 | ![Alt text](img/PhotonPowerZero.jpg?raw=true "Title")

Photon Power Zero Board

15 | 16 | The project is more than just the Photon Power Zero board. I want to create and share all components to make deploying a Raspberry Pi Zero outdoors as easy as possible. You can collaborate on the project and recieve support through the [Discord](https://discord.gg/BphNWmj6Xg) 17 | 18 | [![Video Thumbnail](img/Outdoor_Node.png)]( https://www.youtube.com/watch?v=qGwqMnN81YI")

Youtube Video describing the Project and the goals

19 | 20 | As an open-source project, you can find the code for the Photon Power Zero and the Raspberry Pi, the Kicad PCB files and the FDM 3D printing files below 21 | * [Code](Code) 22 | * [PCBs](PCBs) 23 | * [FDM (3D Print Files)](FDM) 24 | 25 | ![Production Kit](img/kit.jpg?raw=true "Title") 26 |

Production kit

27 | 28 | Note that the Photon Power Zero does not come with a LiPo battery. You need to self-source your battery and carefully read our [LIPO_PURCHASING](LIPO_PURCHASING.md) guide. 29 | 30 | We have tested the solar panels from [Voltaic Systems](https://voltaicsystems.com/). We used the 6-watt 6-volt panels during testing, but now recommend the the 9-10-watt panels specified in the [10W SOLAR BUILD](FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/README.md) 31 | -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/README.md: -------------------------------------------------------------------------------- 1 | # 6W Voltaic Solar Panel to MULTICOMP PRO MC002194 enclosure 2 | 3 | All of these Parts are designed to be printed in ABS or better. You may print is PLA if your use case is indoor only but otherwise, the reccomendation is ABS. 4 | 5 | ![Alt text](../../img/6W_voltaic_to_Multicomp_MC002194.png?raw=true "Title")

Connect the 6W volatic Panel to the Mutlicomp MC002194 Enclosure and 25mm OD PVC Pipe. This is obviously printed in two parts. 6 | 7 | ![Alt text](../../img/Mount_Pi_PPZ_inside_Multicomp_MC002194.png?raw=true "Title")

Mount inside the Multicomp MC002194 Enclosure 8 | 9 | ![Alt text](../../img/panel_multicomp_mount.jpg?raw=true "Title")

Physically Fitting it together, put a 25mm PVC pipe to connect the structure to the soil or a Ubolt clamp 10 | panel_multicomp_mount.jpg 11 | 12 | ![Alt text](../../img/case_mount_inside_Multicomp_MC002194.jpg?raw=true "Title")

The case mount goes inside the multicomp. you need to drill a hole in the aluminium and use a Waterproof cable gland PG-7 13 | 14 | ## BOM 15 | 16 | #### MULTICOMP PRO MC002194 17 | Metal Enclosure, Small, Extruded Aluminium, 51.6 mm, 119 mm, 115.1 mm Links: 18 | - https://www.jaycar.com.au/aluminium-enclosure-with-clear-ends/p/HB6294 19 | - https://il.farnell.com/multicomp/mc002194/multipurpose-enclosure-alum-silver/dp/2830527 20 | - https://www.newark.com/multicomp-pro/mc002194/enclosure-4-53-x-4-69-x-2-03/dp/57AC8361 21 | - https://www.devicemart.co.kr/goods/view?no=12072777 22 | - https://dk.farnell.com/en-DK/multicomp/mc002194/multipurpose-enclosure-alum-silver/dp/2830527 23 | 24 | #### Fixing hardware 25 | 26 | - 4x M2.5 heat set inserts like https://www.aliexpress.com/item/1005004535859664.html 27 | - M2.5 Mounting hardware https://www.aliexpress.com/item/1005004275784627.html 28 | - Waterproof Cable Gland PG-7 https://core-electronics.com.au/waterproof-cable-gland-pg-7-size-gray.html 29 | - 6 x M3 heat set inserts OD 5mm Length 10mm https://www.aliexpress.com/item/1005004535859664.html - These go on the underside of the pannel fitting 30 | - 6 x M3 50mm Staintelss steel hex bolt https://www.thefastenerfactory.com.au/stainless-steel-hex-socket-head-cap-screw-m3-x-50mm-100pc 31 | 32 | #### 6W Voltaic Panel 33 | 34 | - Solar Panel https://voltaicsystems.com/6-watt-panel/ 35 | - Right angled Female 3.5x1.1mm - 5.5x2.1mm: https://voltaicsystems.com/A106 or https://www.adafruit.com/product/4287 36 | - If you get an EFTE panel you need to get ETFE Panel Screw & Washer Set https://voltaicsystems.com/mount-set-etfe/ these are 4-40 but an M3 should work 37 | 38 | ## Finished Construction 39 | 40 | The 25mm PVC pipe can go in the ground or you could use a UBolt. You can modify the scad to support any size round post that you like. 41 | 42 | ![Alt text](../../img/Finished_Voltaic_to_Multicomp_MC002194.jpg?raw=true "Title")

Finished construction 43 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-B_Mask.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,8.0.2*% 2 | %TF.CreationDate,2024-05-13T09:46:36+08:00*% 3 | %TF.ProjectId,Photon_Power_Zero_PCB_r1_01,50686f74-6f6e-45f5-906f-7765725f5a65,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Soldermask,Bot*% 6 | %TF.FilePolarity,Negative*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 8.0.2) date 2024-05-13 09:46:36* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | %ADD10C,1.750000*% 15 | %ADD11C,1.700000*% 16 | %ADD12C,1.800000*% 17 | %ADD13C,6.000000*% 18 | %ADD14C,0.970000*% 19 | %ADD15C,1.780000*% 20 | %ADD16R,1.800000X1.800000*% 21 | G04 APERTURE END LIST* 22 | D10* 23 | %TO.C,*% 24 | X166890000Y-90560000D03* 25 | %TD*% 26 | D11* 27 | %TO.C,J3*% 28 | X191200000Y-91770000D03* 29 | D12* 30 | X186700000Y-91770000D03* 31 | %TD*% 32 | D13* 33 | %TO.C,REF\u002A\u002A*% 34 | X134910000Y-102950000D03* 35 | X192910000Y-102950000D03* 36 | D14* 37 | X139610000Y-81390000D03* 38 | X142150000Y-81390000D03* 39 | X144690000Y-81390000D03* 40 | X147230000Y-81390000D03* 41 | X149770000Y-81390000D03* 42 | X152310000Y-81390000D03* 43 | X154850000Y-81390000D03* 44 | X157390000Y-81390000D03* 45 | X159930000Y-81390000D03* 46 | X162470000Y-81390000D03* 47 | X165010000Y-81390000D03* 48 | X167550000Y-81390000D03* 49 | X170090000Y-81390000D03* 50 | X172630000Y-81390000D03* 51 | X175170000Y-81390000D03* 52 | X177710000Y-81390000D03* 53 | X180250000Y-81390000D03* 54 | X182790000Y-81390000D03* 55 | X185330000Y-81390000D03* 56 | X187870000Y-81390000D03* 57 | D15* 58 | X140880000Y-80120000D03* 59 | X186600000Y-80120000D03* 60 | D14* 61 | X139610000Y-78850000D03* 62 | X142150000Y-78850000D03* 63 | X144690000Y-78850000D03* 64 | X147230000Y-78850000D03* 65 | X149770000Y-78850000D03* 66 | X152310000Y-78850000D03* 67 | X154850000Y-78850000D03* 68 | X157390000Y-78850000D03* 69 | X159930000Y-78850000D03* 70 | X162470000Y-78850000D03* 71 | X165010000Y-78850000D03* 72 | X167550000Y-78850000D03* 73 | X170090000Y-78850000D03* 74 | X172630000Y-78850000D03* 75 | X175170000Y-78850000D03* 76 | X177710000Y-78850000D03* 77 | X180250000Y-78850000D03* 78 | X182790000Y-78850000D03* 79 | X185330000Y-78850000D03* 80 | X187870000Y-78850000D03* 81 | %TD*% 82 | D10* 83 | %TO.C,*% 84 | X164350000Y-93100000D03* 85 | %TD*% 86 | %TO.C,*% 87 | X166890000Y-93100000D03* 88 | %TD*% 89 | %TO.C,*% 90 | X139300000Y-92530000D03* 91 | %TD*% 92 | %TO.C,*% 93 | X161810000Y-93100000D03* 94 | %TD*% 95 | %TO.C,*% 96 | X164350000Y-90560000D03* 97 | %TD*% 98 | %TO.C,*% 99 | X161810000Y-90560000D03* 100 | %TD*% 101 | %TO.C,*% 102 | X136550000Y-84685000D03* 103 | %TD*% 104 | D16* 105 | %TO.C,*% 106 | X139290000Y-94630000D03* 107 | %TD*% 108 | D10* 109 | %TO.C,*% 110 | X191260000Y-97500000D03* 111 | %TD*% 112 | D16* 113 | %TO.C,REF\u002A\u002A*% 114 | X191210000Y-86070000D03* 115 | %TD*% 116 | %TO.C,REF\u002A\u002A*% 117 | X159270000Y-90560000D03* 118 | %TD*% 119 | D12* 120 | %TO.C,REF\u002A\u002A*% 121 | X159280000Y-93110000D03* 122 | %TD*% 123 | M02* 124 | -------------------------------------------------------------------------------- /PCBs/Photon_Power_Zero_PCB_r1_02.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 5, 4 | "active_layer_preset": "All Layers", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "shapes": 1.0, 14 | "tracks": 1.0, 15 | "vias": 1.0, 16 | "zones": 0.6 17 | }, 18 | "selection_filter": { 19 | "dimensions": true, 20 | "footprints": true, 21 | "graphics": true, 22 | "keepouts": true, 23 | "lockedItems": false, 24 | "otherItems": true, 25 | "pads": true, 26 | "text": true, 27 | "tracks": true, 28 | "vias": true, 29 | "zones": true 30 | }, 31 | "visible_items": [ 32 | "vias", 33 | "footprint_text", 34 | "footprint_anchors", 35 | "ratsnest", 36 | "grid", 37 | "footprints_front", 38 | "footprints_back", 39 | "footprint_values", 40 | "footprint_references", 41 | "tracks", 42 | "drc_errors", 43 | "drawing_sheet", 44 | "bitmaps", 45 | "pads", 46 | "zones", 47 | "drc_warnings", 48 | "locked_item_shadows", 49 | "conflict_shadows", 50 | "shapes" 51 | ], 52 | "visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff", 53 | "zone_display_mode": 0 54 | }, 55 | "git": { 56 | "repo_password": "", 57 | "repo_type": "", 58 | "repo_username": "", 59 | "ssh_key": "" 60 | }, 61 | "meta": { 62 | "filename": "Photon_Power_Zero_PCB_r1_02.kicad_prl", 63 | "version": 5 64 | }, 65 | "net_inspector_panel": { 66 | "col_hidden": [ 67 | false, 68 | false, 69 | false, 70 | false, 71 | false, 72 | false, 73 | false, 74 | false, 75 | false, 76 | false 77 | ], 78 | "col_order": [ 79 | 0, 80 | 1, 81 | 2, 82 | 3, 83 | 4, 84 | 5, 85 | 6, 86 | 7, 87 | 8, 88 | 9 89 | ], 90 | "col_widths": [ 91 | 0, 92 | 0, 93 | 0, 94 | 0, 95 | 0, 96 | 0, 97 | 0, 98 | 0, 99 | 0, 100 | 0 101 | ], 102 | "custom_group_rules": [], 103 | "expanded_rows": [], 104 | "filter_by_net_name": true, 105 | "filter_by_netclass": true, 106 | "filter_text": "", 107 | "group_by_constraint": false, 108 | "group_by_netclass": false, 109 | "show_unconnected_nets": false, 110 | "show_zero_pad_nets": false, 111 | "sort_ascending": true, 112 | "sorting_column": 0 113 | }, 114 | "open_jobsets": [], 115 | "project": { 116 | "files": [] 117 | }, 118 | "schematic": { 119 | "selection_filter": { 120 | "graphics": true, 121 | "images": true, 122 | "labels": true, 123 | "lockedItems": false, 124 | "otherItems": true, 125 | "pins": true, 126 | "symbols": true, 127 | "text": true, 128 | "wires": true 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /PCBs/Photon_Power_Zero_PCB_r1_01.kicad_prl: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "active_layer": 0, 4 | "active_layer_preset": "All Layers", 5 | "auto_track_width": true, 6 | "hidden_netclasses": [], 7 | "hidden_nets": [], 8 | "high_contrast_mode": 0, 9 | "net_color_mode": 1, 10 | "opacity": { 11 | "images": 0.6, 12 | "pads": 1.0, 13 | "shapes": 1.0, 14 | "tracks": 1.0, 15 | "vias": 1.0, 16 | "zones": 0.6 17 | }, 18 | "ratsnest_display_mode": 0, 19 | "selection_filter": { 20 | "dimensions": true, 21 | "footprints": true, 22 | "graphics": true, 23 | "keepouts": true, 24 | "lockedItems": false, 25 | "otherItems": true, 26 | "pads": true, 27 | "text": true, 28 | "tracks": true, 29 | "vias": true, 30 | "zones": true 31 | }, 32 | "visible_items": [ 33 | "vias", 34 | "footprint_text", 35 | "footprint_anchors", 36 | "ratsnest", 37 | "grid", 38 | "footprints_front", 39 | "footprints_back", 40 | "footprint_values", 41 | "footprint_references", 42 | "tracks", 43 | "drc_errors", 44 | "drawing_sheet", 45 | "bitmaps", 46 | "pads", 47 | "zones", 48 | "drc_warnings", 49 | "locked_item_shadows", 50 | "conflict_shadows", 51 | "shapes" 52 | ], 53 | "visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff", 54 | "zone_display_mode": 0 55 | }, 56 | "git": { 57 | "repo_password": "", 58 | "repo_type": "", 59 | "repo_username": "", 60 | "ssh_key": "" 61 | }, 62 | "meta": { 63 | "filename": "Photon_Power_Zero_PCB_r1_01.kicad_prl", 64 | "version": 5 65 | }, 66 | "net_inspector_panel": { 67 | "col_hidden": [ 68 | false, 69 | false, 70 | false, 71 | false, 72 | false, 73 | false, 74 | false, 75 | false, 76 | false, 77 | false 78 | ], 79 | "col_order": [ 80 | 0, 81 | 1, 82 | 2, 83 | 3, 84 | 4, 85 | 5, 86 | 6, 87 | 7, 88 | 8, 89 | 9 90 | ], 91 | "col_widths": [ 92 | 0, 93 | 0, 94 | 0, 95 | 0, 96 | 0, 97 | 0, 98 | 0, 99 | 0, 100 | 0, 101 | 0 102 | ], 103 | "custom_group_rules": [], 104 | "expanded_rows": [], 105 | "filter_by_net_name": true, 106 | "filter_by_netclass": true, 107 | "filter_text": "", 108 | "group_by_constraint": false, 109 | "group_by_netclass": false, 110 | "show_unconnected_nets": false, 111 | "show_zero_pad_nets": false, 112 | "sort_ascending": true, 113 | "sorting_column": 0 114 | }, 115 | "open_jobsets": [], 116 | "project": { 117 | "files": [] 118 | }, 119 | "schematic": { 120 | "selection_filter": { 121 | "graphics": true, 122 | "images": true, 123 | "labels": true, 124 | "lockedItems": false, 125 | "otherItems": true, 126 | "pins": true, 127 | "symbols": true, 128 | "text": true, 129 | "wires": true 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-job.gbrjob: -------------------------------------------------------------------------------- 1 | { 2 | "Header": { 3 | "GenerationSoftware": { 4 | "Vendor": "KiCad", 5 | "Application": "Pcbnew", 6 | "Version": "8.0.2" 7 | }, 8 | "CreationDate": "2024-05-13T09:46:36+08:00" 9 | }, 10 | "GeneralSpecs": { 11 | "ProjectId": { 12 | "Name": "Photon_Power_Zero_PCB_r1_01", 13 | "GUID": "50686f74-6f6e-45f5-906f-7765725f5a65", 14 | "Revision": "rev?" 15 | }, 16 | "Size": { 17 | "X": 65.24, 18 | "Y": 30.24 19 | }, 20 | "LayerNumber": 2, 21 | "BoardThickness": 1.6, 22 | "Finish": "None" 23 | }, 24 | "DesignRules": [ 25 | { 26 | "Layers": "Outer", 27 | "PadToPad": 0.1, 28 | "PadToTrack": 0.1, 29 | "TrackToTrack": 0.1, 30 | "MinLineWidth": 0.2, 31 | "TrackToRegion": 0.508, 32 | "RegionToRegion": 0.508 33 | } 34 | ], 35 | "FilesAttributes": [ 36 | { 37 | "Path": "Photon_Power_Zero_PCB_r1_01-F_Cu.gbr", 38 | "FileFunction": "Copper,L1,Top", 39 | "FilePolarity": "Positive" 40 | }, 41 | { 42 | "Path": "Photon_Power_Zero_PCB_r1_01-B_Cu.gbr", 43 | "FileFunction": "Copper,L2,Bot", 44 | "FilePolarity": "Positive" 45 | }, 46 | { 47 | "Path": "Photon_Power_Zero_PCB_r1_01-F_Paste.gbr", 48 | "FileFunction": "SolderPaste,Top", 49 | "FilePolarity": "Positive" 50 | }, 51 | { 52 | "Path": "Photon_Power_Zero_PCB_r1_01-B_Paste.gbr", 53 | "FileFunction": "SolderPaste,Bot", 54 | "FilePolarity": "Positive" 55 | }, 56 | { 57 | "Path": "Photon_Power_Zero_PCB_r1_01-F_Silkscreen.gbr", 58 | "FileFunction": "Legend,Top", 59 | "FilePolarity": "Positive" 60 | }, 61 | { 62 | "Path": "Photon_Power_Zero_PCB_r1_01-B_Silkscreen.gbr", 63 | "FileFunction": "Legend,Bot", 64 | "FilePolarity": "Positive" 65 | }, 66 | { 67 | "Path": "Photon_Power_Zero_PCB_r1_01-F_Mask.gbr", 68 | "FileFunction": "SolderMask,Top", 69 | "FilePolarity": "Negative" 70 | }, 71 | { 72 | "Path": "Photon_Power_Zero_PCB_r1_01-B_Mask.gbr", 73 | "FileFunction": "SolderMask,Bot", 74 | "FilePolarity": "Negative" 75 | }, 76 | { 77 | "Path": "Photon_Power_Zero_PCB_r1_01-Edge_Cuts.gbr", 78 | "FileFunction": "Profile", 79 | "FilePolarity": "Positive" 80 | } 81 | ], 82 | "MaterialStackup": [ 83 | { 84 | "Type": "Legend", 85 | "Name": "Top Silk Screen" 86 | }, 87 | { 88 | "Type": "SolderPaste", 89 | "Name": "Top Solder Paste" 90 | }, 91 | { 92 | "Type": "SolderMask", 93 | "Thickness": 0.01, 94 | "Name": "Top Solder Mask" 95 | }, 96 | { 97 | "Type": "Copper", 98 | "Thickness": 0.035, 99 | "Name": "F.Cu" 100 | }, 101 | { 102 | "Type": "Dielectric", 103 | "Thickness": 1.51, 104 | "Material": "FR4", 105 | "Name": "F.Cu/B.Cu", 106 | "Notes": "Type: dielectric layer 1 (from F.Cu to B.Cu)" 107 | }, 108 | { 109 | "Type": "Copper", 110 | "Thickness": 0.035, 111 | "Name": "B.Cu" 112 | }, 113 | { 114 | "Type": "SolderMask", 115 | "Thickness": 0.01, 116 | "Name": "Bottom Solder Mask" 117 | }, 118 | { 119 | "Type": "SolderPaste", 120 | "Name": "Bottom Solder Paste" 121 | }, 122 | { 123 | "Type": "Legend", 124 | "Name": "Bottom Silk Screen" 125 | } 126 | ] 127 | } 128 | -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r11.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-36,-2,1.7])cube([34,79,7.1], center=true); 5 | translate([-13,-2,19.5])cube([80,79,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-35,0,21])cube([19,68,37], center=true); 13 | translate([-35,0,7.5]) rotate([90,0,0]) cylinder(h=68, r1=9.5, r2=9.5, center=true,$fn=128); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-46.6,0,-1.2]) rotate([0,-60,0]) cube([3.7,24,9], center=true); 25 | translate([-21,0,-0.5]) rotate([0,-22,0]) cube([30,16.3,3], center=true); 26 | 27 | //Camera cable routing 28 | translate([-31,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 29 | 30 | ///camera holes 31 | translate([-51,10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 32 | translate([-51,-10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 33 | translate([-51,10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 34 | translate([-51,-10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 35 | 36 | //camera cutout 37 | translate([-52,0,16])cube([8,13,20], center=true); 38 | 39 | //Camera installation 40 | translate([-41,0,15])cube([20,32,30], center=true); 41 | 42 | //Holes for battery terminals and solar plug 43 | translate([30,-30,16])cube([98,40.5,40], center=true); 44 | translate([30,30,16])cube([98,40.5,40], center=true); 45 | 46 | //battery cable routing 47 | translate([-34,-37,27]) cube([15,10,20], center=true); 48 | translate([-51.5,-38.7,9]) rotate([0,0,0]) cylinder(h=20, r1=2, r2=2, center=true,$fn=24); 49 | translate([-36,-38.5,0]) cube([35,1.7,5], center=true); 50 | 51 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 52 | 53 | translate([-35.3,-38.5,0.7])rotate([0,90,0]) cylinder(h=35, r1=2, r2=2, center=true,$fn=24); 54 | 55 | 56 | 57 | //Pi Zero holes 58 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 59 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 60 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 61 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 62 | 63 | 64 | //Pi 4 cutout 85.6mm × 56.5mm 65 | //translate([52,0.8,25])cube([58,87,30], center=true); 66 | //Pi Zero cut out 65mm x 30mm 67 | //translate([6,-9,22])cube([42,120,33], center=true); 68 | 69 | //Pi PCB cutout 70 | translate([16,-6.5,20])cube([70,70.5,36], center=true); 71 | translate([7,-6.5,35])cube([57,52,15], center=true); 72 | 73 | //Ventilation 74 | 75 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 76 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 77 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 78 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 79 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | 82 | } 83 | //Camera cable routing 84 | translate([-31,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 85 | } 86 | 87 | -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/case_mount_r10.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-4,0,1.7])cube([98,98,7.1], center=true); 5 | translate([-13,-2,19.5])cube([80,79,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-35,0,21])cube([19,68,37], center=true); 13 | translate([-35,0,7.5]) rotate([90,0,0]) cylinder(h=68, r1=9.5, r2=9.5, center=true,$fn=128); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-46.6,0,-1.2]) rotate([0,-60,0]) cube([3.7,24,9], center=true); 25 | translate([-21,0,-0.5]) rotate([0,-22,0]) cube([30,16.3,3], center=true); 26 | 27 | //Camera cable routing 28 | translate([-31,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 29 | 30 | ///camera holes 31 | translate([-51,10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 32 | translate([-51,-10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 33 | translate([-51,10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 34 | translate([-51,-10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 35 | 36 | //camera cutout 37 | translate([-52,0,16])cube([8,13,20], center=true); 38 | 39 | //Camera installation 40 | translate([-41,0,15])cube([20,32,30], center=true); 41 | 42 | //Holes for battery terminals and solar plug 43 | translate([30,-30,16])cube([98,40.5,40], center=true); 44 | translate([30,30,16])cube([98,40.5,40], center=true); 45 | 46 | //battery cable routing 47 | translate([-34,-37,27]) cube([15,10,20], center=true); 48 | translate([-51.5,-38.7,9]) rotate([0,0,0]) cylinder(h=20, r1=2, r2=2, center=true,$fn=24); 49 | translate([-36,-38.5,0]) cube([35,1.7,5], center=true); 50 | 51 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 52 | 53 | translate([-35.3,-38.5,0.7])rotate([0,90,0]) cylinder(h=35, r1=2, r2=2, center=true,$fn=24); 54 | 55 | 56 | 57 | //Pi Zero holes 58 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 59 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 60 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 61 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 62 | 63 | 64 | //Pi 4 cutout 85.6mm × 56.5mm 65 | //translate([52,0.8,25])cube([58,87,30], center=true); 66 | //Pi Zero cut out 65mm x 30mm 67 | //translate([6,-9,22])cube([42,120,33], center=true); 68 | 69 | //Pi PCB cutout 70 | translate([16,-6.5,20])cube([70,70.5,36], center=true); 71 | translate([7,-6.5,35])cube([57,52,15], center=true); 72 | 73 | //Ventilation 74 | 75 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 76 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 77 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 78 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 79 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | 82 | } 83 | //Camera cable routing 84 | translate([-31,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 85 | } 86 | 87 | -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r12.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-36,-2,1.7])cube([34,79,7.1], center=true); 5 | translate([-13,-2,19.5])cube([80,79,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-35,0,21])cube([19,68,37], center=true); 13 | translate([-35,0,7.5]) rotate([90,0,0]) cylinder(h=68, r1=9.5, r2=9.5, center=true,$fn=128); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.6]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-46.6,0,-1.2]) rotate([0,-60,0]) cube([3.7,24,9], center=true); 25 | translate([-21,0,-0.5]) rotate([0,-22,0]) cube([30,16.3,3], center=true); 26 | 27 | //Camera cable routing 28 | translate([-31,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 29 | 30 | ///camera holes 31 | translate([-51,10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 32 | translate([-51,-10.5,24.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 33 | translate([-51,10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 34 | translate([-51,-10.5,12])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 35 | 36 | //camera cutouttest.html 37 | translate([-52,0,16])cube([8,13,20], center=true); 38 | 39 | //Camera installation 40 | translate([-41,0,15])cube([20,32,30], center=true); 41 | 42 | //Holes for battery terminals and solar plug 43 | translate([30,-30,16])cube([98,40.5,40], center=true); 44 | translate([30,30,16])cube([98,40.5,40], center=true); 45 | 46 | //battery cable routing 47 | translate([-34,-37,27]) cube([15,10,20], center=true); 48 | translate([-51.5,-38.7,9]) rotate([0,0,0]) cylinder(h=20, r1=2, r2=2, center=true,$fn=24); 49 | translate([-36,-38.5,0]) cube([35,1.7,5], center=true); 50 | 51 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 52 | 53 | translate([-35.3,-38.5,0.7])rotate([0,90,0]) cylinder(h=35, r1=2, r2=2, center=true,$fn=24); 54 | 55 | 56 | 57 | //Pi Zero holes 58 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 59 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 60 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 61 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 62 | 63 | 64 | //Pi 4 cutout 85.6mm × 56.5mm 65 | //translate([52,0.8,25])cube([58,87,30], center=true); 66 | //Pi Zero cut out 65mm x 30mm 67 | //translate([6,-9,22])cube([42,120,33], center=true); 68 | 69 | //Pi PCB cutout 70 | translate([16,-6.5,20])cube([70,70.5,36], center=true); 71 | translate([7,-6.5,35])cube([57,52,15], center=true); 72 | 73 | //Ventilation 74 | 75 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 76 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 77 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 78 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 79 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | 82 | } 83 | //Camera cable routing 84 | difference() { 85 | translate([-31,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 86 | #translate([-40,40,15])cube([40,5,60], center=true); 87 | } 88 | } 89 | 90 | -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/case_mount_r9.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-4,0,1.9])cube([98,98,7], center=true); 5 | translate([-13,-2,19.5])cube([80,79,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-36,0,17.2])cube([19,68,37], center=true); 13 | translate([-36,0,16])cube([12,68,37], center=true); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-38,0,1])cube([23,16.3,4.6], center=true); 25 | translate([-33,0,0.2])cube([20,16.3,3], center=true); 26 | translate([-11,0,2.4]) rotate([0,-11.5,0]) cube([25,16.3,2.5], center=true); 27 | 28 | //Camera cable routing 29 | translate([-33,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 30 | 31 | //Holes for battery terminals and solar plug 32 | translate([30,-30,16])cube([98,40.5,40], center=true); 33 | translate([30,30,16])cube([98,40.5,40], center=true); 34 | 35 | //Camera installation 36 | translate([-41,0,20])cube([20,32,35], center=true); 37 | 38 | //battery cable routing 39 | translate([-34,-37,27]) cube([15,10,20], center=true); 40 | translate([-51.5,-38.7,9]) rotate([0,0,0]) cylinder(h=20, r1=2.1, r2=2.1, center=true,$fn=24); 41 | 42 | translate([-36,-39,0]) cube([35,1.6,4], center=true); 43 | 44 | 45 | //translate([-46.5,-37.5,20.7])rotate([0,90,0]) cylinder(h=12.05, r1=3.75, r2=3.75, center=true,$fn=24); 46 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 47 | 48 | translate([-35,-39,0.7])rotate([0,90,0]) cylinder(h=35, r1=2, r2=2, center=true,$fn=24); 49 | 50 | 51 | ///camera holes 52 | translate([-51,10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 53 | translate([-51,-10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 54 | translate([-51,10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 55 | translate([-51,-10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 56 | 57 | //camera cutout 58 | translate([-52,0,23])cube([8,13,20], center=true); 59 | 60 | //Pi Zero holes 61 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 62 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 63 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 64 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 65 | 66 | 67 | //Pi 4 cutout 85.6mm × 56.5mm 68 | //translate([52,0.8,25])cube([58,87,30], center=true); 69 | //Pi Zero cut out 65mm x 30mm 70 | //translate([6,-9,22])cube([42,120,33], center=true); 71 | 72 | //Pi PCB cutout 73 | translate([16,-6.5,20])cube([70,70.5,36], center=true); 74 | translate([7,-6.5,35])cube([57,52,15], center=true); 75 | 76 | //Ventilation 77 | 78 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 79 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 82 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 83 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 84 | 85 | } 86 | //Camera cable routing 87 | translate([-33,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 88 | } 89 | 90 | -------------------------------------------------------------------------------- /DESIGN_AND_DECISIONS.md: -------------------------------------------------------------------------------- 1 | # Design and Decisions 2 | 3 | This document describes the fundamental design decisions of the Photon Power Zero. This project started in late 2022 because I wanted to solar power a Raspberry Pi. The Raspberry Pi is not class-leading in terms of efficiency or power management, but it is still the best supported Single Board Computer (SBC) with the widest availability of compatible sensors. The Photon Power Zero is a Raspberry Pi Zero HAT that slides over the top of the Raspberry Pi, manages power, and makes solar charging possible, and addresses, in my opinion, one of the Raspberry Pi's biggest deficiencies; power management. 4 | 5 | ## Design 6 | 7 | You can review the schematic and the board layout, but this section will provide a mile-high overview of this project. The Photon Power Zero is designed around the [BQ2407](https://www.ti.com/lit/ds/symlink/bq24074.pdf) chip and handles the 5-9v input from a USB or a solar panel. It will prioritise powering the ATtiny84 microcontroller, which is the brains of the board. The ATtiny84 is clocked down to 1MHz and consumes little power. This ATtiny84 monitors the LiPo battery voltage through a voltage divider on an ADC pin. When the power level of the battery is high enough, it will pull the enable pin on the AP2161-WG, a high side switch, low. When this switch is pulled low, it will power a 5V DC Boost circuit TPS613222A to power the Raspberry Pi at 5V. 8 | 9 | The ATtiny84 is connected to pins on the Raspberry Pi Zero that are rarely used on other Pi HATs. One pin is used to flag that the Raspberry Pi should gracefully shut down. Other pins are used to bit-bang a battery voltage number to the Raspberry Pi. You can read the C code used on the ATtiny to get a better understanding of when the Raspberry Pi will switch on and off. 10 | 11 | ## Does it work for the Raspberry Pi 3/4/5 or Jetson 12 | 13 | These platforms use a lot more power and would require a bigger battery, solar panel and likely a board redesign. Even good quality 2-pin LiPo Batteries often come with wires that only support 1 Amp. This will be a limiting factor on both the charge rate and the current draw when being used. A completely different design would be required to support the 2-5 Amps needed for these more powerful boards. 14 | 15 | There is also the problem of heat. Both electronics and batteries perform much better when cool. Subjecting them to outdoor temperatures is challenging. If your panels are going to work, they need to be in the sun. The approach I have taken is to use the solar panel as the shade and to try to maintain an air gap between the panels and the enclosure for the weatherproof container; the solar panel will be very, very hot on a 40-degree Celsius day. Adding a Raspberry Pi 3/4/5 or Jetson Nano project and keeping them in a sealed container with a LiPo battery is likely to see dramatic thermal throttling and a heavily reduced lifespan. This board doesn't support this, and I wouldn't recommend this approach. 16 | 17 | ## Does this measure LiPo Battery temperature 18 | 19 | Yes and no. So, an NTC thermistor can be added. There is a recommendation in the [BQ2407](https://www.ti.com/lit/ds/symlink/bq24074.pdf) documentation. To use this, you must purchase a thermistor that fits into the JST connector. You would also need to desolder the nearby 10k resistor. 20 | 21 | By intentional design, the charge current for the battery is always limited to under 1 amp. Given the limited 1 amp charging speed over a 4400mAh battery, we have not found the use of a thermistor necessary, and we have months of testing over at 44C ambient temperature days. Any additional heat generated through charging is negligible compared to the ambient temperature. 22 | 23 | ## Can I solder my own solar pannel leads to this board 24 | 25 | A revision 2 is underway to potentially allow this, however, I think that a lower risk approach is to use the cable provided with your board or to make use of an existing barrel jack cable and to join the leads on your solar pannel to an existing barrel jack cable. I think this is more likely to be successful for most people. Twist the wires, add a little solder to the joint and use some good quality heat shrink tubing. 26 | 27 | ## Pins in use 28 | 29 | The diagram below shows which of the Raspberry Pi Pins are used by the Photon Power Zero. 30 | 31 | ![Alt text](img/Pins_in_use_by_PPZ.png?raw=true "Title")

These are the pins in use by the Photon Power Zero 32 | -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/case_mount_r9.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-4,0,1.9])cube([98,98,7.2], center=true); 5 | translate([-13,-2,19.5])cube([80,79,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-36,0,17.2])cube([19,68,37], center=true); 13 | translate([-36,0,16])cube([12,68,37], center=true); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-38,0,1])cube([23,16.3,4.6], center=true); 25 | translate([-33,0,0.2])cube([20,16.3,3], center=true); 26 | translate([-11,0,2.4]) rotate([0,-11.5,0]) cube([25,16.3,2.5], center=true); 27 | 28 | //Camera cable routing 29 | translate([-33,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 30 | 31 | //Holes for battery terminals and solar plug 32 | translate([30,-30,16])cube([98,40.5,40], center=true); 33 | translate([30,30,16])cube([98,40.5,40], center=true); 34 | 35 | //Camera installation 36 | translate([-41,0,20])cube([20,32,35], center=true); 37 | 38 | //battery cable routing 39 | translate([-34,-37,27]) cube([15,10,20], center=true); 40 | translate([-51.5,-38.7,9]) rotate([0,0,0]) cylinder(h=20, r1=2.1, r2=2.1, center=true,$fn=24); 41 | 42 | translate([-36,-39,0]) cube([35,1.6,4], center=true); 43 | 44 | 45 | //translate([-46.5,-37.5,20.7])rotate([0,90,0]) cylinder(h=12.05, r1=3.75, r2=3.75, center=true,$fn=24); 46 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 47 | 48 | translate([-35,-39,0.7])rotate([0,90,0]) cylinder(h=35, r1=2, r2=2, center=true,$fn=24); 49 | 50 | 51 | ///camera holes 52 | translate([-51,10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 53 | translate([-51,-10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 54 | translate([-51,10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 55 | translate([-51,-10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 56 | 57 | //camera cutout 58 | translate([-52,0,23])cube([8,13,20], center=true); 59 | 60 | //Pi Zero holes 61 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 62 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 63 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 64 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 65 | 66 | 67 | //Pi 4 cutout 85.6mm × 56.5mm 68 | //translate([52,0.8,25])cube([58,87,30], center=true); 69 | //Pi Zero cut out 65mm x 30mm 70 | //translate([6,-9,22])cube([42,120,33], center=true); 71 | 72 | //Pi PCB cutout 73 | translate([16,-6.5,20])cube([70,70.5,36], center=true); 74 | translate([7,-6.5,35])cube([57,52,15], center=true); 75 | 76 | //Ventilation 77 | 78 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 79 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 82 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 83 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 84 | 85 | } 86 | //Camera cable routing 87 | translate([-33,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 88 | } 89 | 90 | -------------------------------------------------------------------------------- /FDM/UPS_mount/UPS_mount_r10.scad: -------------------------------------------------------------------------------- 1 | union () { 2 | difference(){ 3 | union(){ 4 | translate([-4,-2,1.9])cube([98,79.5,7], center=true); 5 | translate([-13,-2,19.5])cube([80,79.5,31], center=true); 6 | translate([-23.5,-6.5,19.5])cube([8,69,31], center=true); 7 | } 8 | //Cube LiPo Battery Core Electronics style 9 | translate([-34,-6.5,20])cube([26,50,35], center=true); 10 | 11 | //Dual cylinder lipo Adafruit style 12 | translate([-36,0,17.2])cube([19,68,37], center=true); 13 | translate([-36,0,16])cube([12,68,37], center=true); 14 | 15 | //Outside rail mounts 16 | translate([0,50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 17 | translate([0,-50.8,-3.7]) rotate([0,90,0]) cylinder(h=115, r1=9, r2=9, center=true,$fn=128); 18 | 19 | //Hole clearance 20 | //translate([0,29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 21 | //translate([0,-29.5,-17]) rotate([0,90,0]) cylinder(h=115, r1=17, r2=17, center=true,$fn=128); 22 | 23 | //Cavity for camera cable 24 | translate([-38,0,1])cube([23,16.3,4.6], center=true); 25 | translate([-33,0,0.2])cube([20,16.3,3], center=true); 26 | translate([-11,0,2.4]) rotate([0,-11.5,0]) cube([25,16.3,2.5], center=true); 27 | 28 | //Camera cable routing 29 | translate([-33,38,20]) rotate([0,0,0]) cylinder(27, r1=5, r2=5, center=true,$fn=128); 30 | 31 | //Holes for battery terminals and solar plug 32 | translate([30,-30,16])cube([98,40.5,40], center=true); 33 | translate([30,30,16])cube([98,40.5,40], center=true); 34 | 35 | //Camera installation 36 | translate([-41,0,20])cube([20,32,35], center=true); 37 | 38 | //battery cable routing 39 | translate([-34,-37,27]) cube([15,10,20], center=true); 40 | #translate([-51,-38.7,10]) rotate([0,0,0]) cylinder(h=20, r1=1.9, r2=1.9, center=true,$fn=24); 41 | #translate([-52,-38.7,0]) cube([4,1.6,35], center=true); 42 | 43 | translate([-36,-38.7,0]) cube([35,1.6,4], center=true); 44 | 45 | 46 | //translate([-46.5,-37.5,20.7])rotate([0,90,0]) cylinder(h=12.05, r1=3.75, r2=3.75, center=true,$fn=24); 47 | translate([-46,-39.5,29]) cube([20,11.1,24], center=true); 48 | 49 | translate([-35,-39,0.7])rotate([0,90,0]) cylinder(h=35, r1=1.9, r2=1.9, center=true,$fn=24); 50 | 51 | 52 | ///camera holes 53 | translate([-51,10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 54 | translate([-51,-10.5,31.5])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 55 | translate([-51,10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 56 | translate([-51,-10.5,19])rotate([0,90,0]) cylinder(h=5, r1=1.2, r2=1.2, center=true,$fn=24); 57 | 58 | //camera cutout 59 | translate([-52,0,23])cube([8,13,20], center=true); 60 | 61 | //Pi Zero holes 62 | translate([-17,-35.7,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 63 | translate([-17,22.3,31])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 64 | translate([-17,-35.7,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 65 | translate([-17,22.3,8])rotate([0,90,0]) cylinder(h=17.5, r1=1.6, r2=1.6, center=true,$fn=24); 66 | 67 | 68 | //Pi 4 cutout 85.6mm × 56.5mm 69 | //translate([52,0.8,25])cube([58,87,30], center=true); 70 | //Pi Zero cut out 65mm x 30mm 71 | //translate([6,-9,22])cube([42,120,33], center=true); 72 | 73 | //Pi PCB cutout 74 | translate([16,-6.5,20])cube([70,70.5,46], center=true); 75 | translate([7,-6.5,35])cube([57,52,15], center=true); 76 | 77 | //Ventilation 78 | 79 | //#translate([-44,0,20])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 80 | //translate([-30,0,20])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 81 | //translate([-44,-6.5,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 82 | //translate([-30,0,10])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 83 | //#translate([-44,0,30])rotate([90,0,0]) cylinder(h=60, r1=2, r2=2, center=true,$fn=24); 84 | //translate([-30,0,30])rotate([90,0,0]) cylinder(h=88, r1=2, r2=2, center=true,$fn=24); 85 | 86 | } 87 | //Camera cable routing 88 | difference() { 89 | 90 | 91 | translate([-33,37,14]) rotate([0,0,0]) cylinder(30, r1=2.3, r2=2.3, center=true,$fn=128); 92 | translate([-36.8,45.9,20]) cube([50,16.3,50], center=true); 93 | } 94 | } 95 | 96 | -------------------------------------------------------------------------------- /REDUCING_ENERGY_CONSUMPTION.md: -------------------------------------------------------------------------------- 1 | # Reducing Energy Consumption on the Pi Zero and Pi Zero 2W 2 | 3 | The followingy are my observations and notes from testing the Raspberry Pi Zero's power consumption. See below for different methods to reduce power consumption. 4 | 5 | Summary 6 | Out of the box, the consumption numbers are: 7 | 8 | | **Device** | **State** | **Current (A)** | **Voltage (V)** | **Power (W)** | 9 | |----------------------------|-------------------|-----------------|-----------------|---------------| 10 | | Raspberry Pi Zero W | 0% CPU load | 0.09 | 5.1 | 0.459 | 11 | | Raspberry Pi Zero W | 100% CPU load | 0.16 | 5.1 | 0.816 | 12 | | Raspberry Pi Zero W | Shutdown | 0.0378 | 5.1 | 0.192 | 13 | | Raspberry Pi Zero 2 W | 0% CPU load | 0.12 | 5.1 | 0.612 | 14 | | Raspberry Pi Zero 2 W | 100% CPU load | 0.26 | 5.1 | 1.32 | 15 | | Raspberry Pi Zero 2 W | Shutdown | 0.06 | 5.1 | 0.3 | 16 | 17 | 18 | ## Adding things 19 | Adding the following will increase power consumption: 20 | 21 | | **Device/Action** | **State/Action** | **Current Increase (A)** | 22 | |-----------------------------------------------|---------------------------------------------------------|--------------------------| 23 | | Apple 100 Mbit USB2 adaptor | Increase | 0.09 to 0.27 | 24 | | Vantec 1000 Mbit USB3 Gigabit adaptor | Increase | 0.08 to 0.21 | 25 | | RAK2245 LoRaWAN Concentrator | Increase | 0.08 to 0.44 | 26 | | SSH'd in over WiFi on the terminal | Increase | 0.08 to 0.1 | 27 | | Pi Supply LoRa Hat | Idle | Undetectable increase | 28 | | Pi Supply LoRa Hat | Transmitting | 0.08 to 0.1 | 29 | 30 | ## Reducing Power Consumption 31 | 32 | | **Action** | **Current Saving (A)** | 33 | |---------------------------------------------|----------------------------------| 34 | | Disabling HDMI | 0.017 | 35 | | Disabling WiFi | 0.006 | 36 | | Disabling Bluetooth | 0.004 | 37 | | Disabling the On and activity LEDs | 0.002 | 38 | 39 | ### Disable HDMI 40 | If you don't need the screen, you can save 25mA by disabling HDMI. Put the following in /boot/firmwar/config.txt: 41 | ``` 42 | dtoverlay=vc4-kms-v3d,nohdmi 43 | max_framebuffers=1 44 | disable_fw_kms_setup=1 45 | disable_overscan=1 46 | 47 | enable_tvout=0 48 | ``` 49 | 50 | ### Disable WiFi 51 | 52 | To do this, add the following to /boot/config.txt: 53 | 54 | ``` 55 | dtoverlay=disable-wifi 56 | ``` 57 | 58 | Then reboot 59 | 60 | ### Disable Bluetooth 61 | 62 | To do this, add the following to /boot/config.txt: 63 | 64 | ``` 65 | dtoverlay=disable-bt 66 | ``` 67 | 68 | Disable the Bluetooth and WiFi 69 | 70 | ### Disable Activity LEDs 71 | To disable the activity LEDs permanently, add the following to /boot/config.txt: 72 | 73 | ``` 74 | dtparam=act_led_trigger=none 75 | dtparam=act_led_activelow=off 76 | ``` 77 | 78 | ## Pi Zero 2W Disabling cores 79 | 80 | Although Jeff shows that you can decrease peak current by disabling cores, the idle power draw is the same for 1 and 4 cores on the Raspberry Pi. Even when under 100% load the total power consumption between 1 and 4 cores will be very similar because although a single core will have a lower power draw but will draw power for a longer period of time. It's an interesting experiment but I would not reccomend: https://www.jeffgeerling.com/blog/2021/disabling-cores-reduce-pi-zero-2-ws-power-consumption-half 81 | 82 | ## Sources 83 | 84 | Raspberry Pi 85 | https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/computers/raspberry-pi/power-supplies.adoc 86 | 87 | https://kittenlabs.de/blog/2024/09/01/extreme-pi-boot-optimization/ 88 | 89 | Jeff Geerling also does a great job at on this page here: https://www.jeffgeerling.com/blogs/jeff-geerling/raspberry-pi-zero-power. 90 | -------------------------------------------------------------------------------- /USERDOCS.md: -------------------------------------------------------------------------------- 1 | # User Documentation of the Photon Power Zero 2 | 3 | ## Before installing the Photon Power Zero on the Pi ### 4 | 5 | If you have a Raspberry Pi Zero without soldered headers, you are going to need to solder headers on. You can do this yourself and there is a my [Soldering a header on a Raspberry Pi Zero 2](https://youtu.be/pwCCnsn2Mug) video. 6 | 7 | Start by writing a headles PiOS lite image onto your SD card. The following video steps you through this, as well as getting the settings right to be able to SSH into your Raspberry Pi without ever plugging a screen in. 8 | 9 | [![Video Thumbnail](img/SD_card_install.png)]( https://youtu.be/duxeGzRcJmE "Physically Installing the Photon Powre Zero on the Raspberry Pi Zero") 10 | 11 | After flashing your Rasberry Pi using the instructions above, insert the SD card into your Raspberry Pi, then power the Raspberry Pi Zero through the micro USB connector as shown in the image below. Note that the first time the Pi Zero boots after flashing the SD card, it takes a while before you can see the device on your LAN. Go get yourself a coffee, be paitent and wait for it to appear; it often takes 5-10 minutes to appear during the first boot of a newly imaged SD card. 12 | 13 | ![Alt text](img/RPi.jpg?raw=true "Title")

Start by Powering the Raspberry Pi through USB 14 | 15 | In the image above, the Pi is being powered via a regular USB cable while we set it up for the Photon Power Zero. Make sure you NEVER power it through the Photon Power Zero and the USB port simultaneously. Now: 16 | 17 | SSH into your Rasberry Pi with 18 | 19 | `ssh [username]@[IP_address_of_Raspberry_Pi]` 20 | 21 | Update the package repositories with: 22 | 23 | `sudo apt update` 24 | 25 | Then run the following three commands to install the required software and libraries: 26 | 27 | `sudo apt install python3 tmux libcamera-apps python3-pip` 28 | 29 | `sudo apt remove python3-rpi.gpio` 30 | 31 | `sudo apt install python3-rpi-lgpio` 32 | 33 | Now, we are going to allow a graceful shutdown if GPIO Pin 20 is pulled low; the Raspberry Pi will shut down. This is how a shutdown is initiated from the Photon Power Zero to the Raspberry Pi. 34 | 35 | `sudo nano /boot/config.txt` 36 | 37 | If you are using the latest 64 bit image you may need to: 38 | 39 | `sudo nano /boot/firmware/config.txt` 40 | 41 | Then, we insert the following line at the end of the file: 42 | 43 | `dtoverlay=gpio-shutdown,gpio_pin=21,active_low=1,gpio_pull=up` 44 | 45 | Download the Raspberry Pi code onto your Raspberry Pi. The easiest way to do this is from the command line of your Raspberry Pi you can: 46 | 47 | `wget https://raw.githubusercontent.com/DavidMurrayP2P/PhotonPowerZero/main/Code/PPZ_RPi_code.py` 48 | 49 | You can then provide the file with execute permissions with 50 | 51 | `chmod 777 PPZ_RPi_code.py` 52 | 53 | You can then move the file to /usr/bin 54 | 55 | `sudo mv PPZ_RPi_code.py /usr/bin/PPZ_RPi_code.py` 56 | 57 | Now you can edit: 58 | 59 | `sudo nano /etc/rc.local` 60 | 61 | Add the following before exit 0 62 | 63 | ``` 64 | sleep 10 65 | su -l pi -c "tmux new -s monitor -d" 66 | su -l pi -c "tmux send-keys -t monitor '/usr/bin/PPZ_RPi_code.py' C-m" 67 | ``` 68 | 69 | Change the username pi to whatever your userlevel user is, save and exit. As an example, I called my raspberry pi user david and therefore my /etc/rc.local file looked similar to below: 70 | 71 | ![Alt text](img/rclocal.png?raw=true "Title")

The /etc/rc.local file 72 | 73 | Now test by running: 74 | 75 | `sudo /etc/rc.local` 76 | 77 | The command line will appear to hang for 10 seconds before returning you to the terminal. When it does, run: 78 | 79 | `tmux attach` 80 | 81 | You should have a message saying: 82 | 83 | Internet connection working 84 | 85 | Note that if you have never used tmux before, you can exit this terminal by hitting 86 | 87 | `ctrl b then d` 88 | 89 | Turn off your Pi by removing the USB Power. Now remove the USB cable from your desk; I want to prevent you from powering your Pi through this again. You must NEVER power your Raspberry Pi through that USB port while the Photon Power Zero board is attached. 90 | 91 | ## Physically Install the Photon Power Zero on the Rasberry Pi Zero 92 | 93 | The image below will take you to a YouTube video showing you how to carefully install the Photon Power Zero. 94 | 95 | [![Video Thumbnail](img/Installing_PPZ_thumb.png)]( https://youtu.be/dVccMCOYDCo "Physically Installing the Photon Powre Zero on the Raspberry Pi Zero") 96 | 97 | Note: Never power the Raspberry Pi via the LiPo Battery and the USB port on the Raspberry Pi. **You cannot charge the battery from the 5v USB port on the Raspberry Pi.** 98 | 99 | Please also ensure that your battery has the correct polarity. 100 | 101 | ![Production Kit](img/lipo_jst.jpg?raw=true "Title") 102 |

Make sure the polarity on the JST connector is correct.

103 | 104 | Please also ensure that you have read our [LIPO_PURCHASING](LIPO_PURCHASING.md) guide. 105 | 106 | Now you can plug in your battery first, then your cable that will charge the battery over USB. If your battery is well charged, your Pi should start booting. Note that if your battery is not well charged and the voltage of your LiPo battery is below 3.75V, then your Raspberry Pi will not turn on. If you are charging from USB, then likely you will need to be very paitent as USB will limit the charge rate to 0.1 Amps. 107 | 108 | SSH in and then, as a user, run: 109 | 110 | `tmux attach` 111 | 112 | You should see the output of the Python program that you have run. You should be seeing your Photon Power Zero reporting a sensible voltage to your Raspberry Pi. 113 | 114 | 115 | ## Troubleshooting ## 116 | 117 | If you cannot set up the Wifi and enable SSH from the image creation stage, you can choose to plug in a HDMI connector, connect to your Wifi, and install the open SSH server via the command line with: 118 | 119 | ``` 120 | sudo apt update 121 | sudo apt install openssh-server 122 | ``` 123 | 124 | Note if you are not running the latest version of PiOS, Bookworm or later then you may need to 125 | 126 | ``` 127 | sudo apt remove python3-rpi.lgpio 128 | sudo apt install python3-rpi-gpio 129 | ``` 130 | 131 | After running this, make sure you reboot. 132 | -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/README.md: -------------------------------------------------------------------------------- 1 | # 10W Voltaic Solar Panel to MULTICOMP PRO MC002194 enclosure 2 | 3 | This guide shows you how to build a 10W outdoor solar mount for your Raspberry Pi Zero and Photon Power Zero. 4 | 5 | ![Alt text](../../img/Hero_shot.png?raw=true "Title")

Finished construction

6 | 7 | This is a panel mount for Voltaic's 10W solar panel. These have been printed and tested using ABS, but other materials may work well too. ASA will almost certainly be as good. I also think that PETG will likely work, but this is untested. There is a [Bill of Materials (BOM)](#bill-of-materials-bom) which links to multiple sources, at the bottom of the page. All the files required for printing can be found here [10W Voltaic Panel to Multicomp enclosure](https://github.com/DavidMurrayP2P/PhotonPowerZero/tree/main/FDM/10W_Voltaic_Panel_to_Multicomp_enclosure). 8 | 9 | The image below shows the entire stet of printed parts but they must be printed in multiple parts. How many parts will depend on your printer size. 10 | 11 | ![Alt text](../../img/10W_voltaic_to_Multicomp_MC002194.png?raw=true "Title")

Connect the 10W volatic Panel to the Mutlicomp MC002194 Enclosure and 25mm OD PVC Pipe. This is obviously printed in two parts. 12 | 13 | The image above shows what the mount looks like 14 | ![Alt text](../../img/Hero_shot.png?raw=true "Title")

Finished construction 15 | but you can print it in two parts. This should be divided up for you already in the files pole_mount.stl and Panel_Mount_10W.stl 16 | 17 | Most people will need to print the Panel_Mount_10W.stl in two parts: Panel_Mount_10W_1st_half.stl and Panel_Mount_10W_2nd_half.stl 18 | 19 | When you print these parts, you will need to sink the brass heat set inserts: 20 | 21 | ![Alt text](../../img/heat_set_inserts.jpg?raw=true "Title")

You will need to put 6 heat set inserts in the bottom side of the panel mount 22 | 23 | After you do this you will most likely need to clean out the holes. I like to put the m3 screws in on the opposite side to force any plastic out and clear the path. 24 | 25 | ![Alt text](../../img/clearing_hole_after_heat_set_inserts.jpg?raw=true "Title")

Make sure you clear the holes by putting m3 screws in the wrong way around. 26 | 27 | You have likely printed the panel mount in two parts. They screw together with M3 heat set inserts and M3 screws. 28 | 29 | ![Alt text](../../img/heat_set_inserts_two_parts.jpg?raw=true "Title")

Heat set inserts for the two parts 30 | 31 | You can then srcew the two parts together: 32 | 33 | ![Alt text](../../img/two_parts_joined_together.jpg?raw=true "Title")

Screw the two parts together 34 | 35 | ![Alt text](../../img/Mount_Pi_PPZ_inside_Multicomp_MC002194.png?raw=true "Title")

Mount inside the Multicomp MC002194 Enclosure 36 | 37 | ![Alt text](../../img/15mm_drill.png?raw=true "Title")

You need to drill a 15mm hole in the aluminium and use a Waterproof cable gland PG-9. Obviously you don't drill this hole on top of the solar pannel. 38 | 39 | 40 | ![Alt text](../../img/case_mount_inside_Multicomp_MC002194.jpg?raw=true "Title")

The case mount goes inside the multicomp 41 | 42 | ![Alt text](../../img/Solar_wiring_1.png?raw=true "Title")

Wiring the solar 43 | 44 | ![Alt text](../../img/Solar_wiring_2.png?raw=true "Title")

Provide support for the connector while you plug it in 45 | 46 | ![Alt text](../../img/Solar_wiring_3.png?raw=true "Title")

Tighten the PG-9 Gland 47 | 48 | ![Alt text](../../img/Solar_wiring_4.png?raw=true "Title")

In the next step we will screw the plastic end on 49 | 50 | ![Alt text](../../img/panel_multicomp_mount.jpg?raw=true "Title")

Physically Fitting it together, put a 25mm PVC pipe to connect the structure to the soil or a Ubolt clamp 51 | panel_multicomp_mount.jpg 52 | 53 | Use 50mm M3 screws to put screw pole_mount.stl into the panel mount. 54 | 55 | ![Alt text](../../img/Put_together_1.jpg?raw=true "Title")

Use 50mm M3 screws to put screw pole_mount.stl into the panel mount. 56 | 57 | ![Alt text](../../img/Put_together_2.jpg?raw=true "Title")

Screwed together 58 | 59 | 60 | ## Bill of Materials (BOM) 61 | 62 | #### MULTICOMP PRO MC002194 63 | Metal Enclosure, Small, Extruded Aluminium, 51.6 mm, 119 mm, 115.1 mm Links: 64 | - https://www.jaycar.com.au/aluminium-enclosure-with-clear-ends/p/HB6294 65 | - https://il.farnell.com/multicomp/mc002194/multipurpose-enclosure-alum-silver/dp/2830527 66 | - https://www.newark.com/multicomp-pro/mc002194/enclosure-4-53-x-4-69-x-2-03/dp/57AC8361 67 | - https://www.devicemart.co.kr/goods/view?no=12072777 68 | - https://dk.farnell.com/en-DK/multicomp/mc002194/multipurpose-enclosure-alum-silver/dp/2830527 69 | 70 | #### Fixing hardware 71 | 72 | These are for mounting the Raspberry Pi Zero to the case inside the enclosure 73 | - 4x M2.5 heat set inserts like https://www.aliexpress.com/item/1005004535859664.html 74 | - M2.5 Mounting hardware https://www.aliexpress.com/item/1005004275784627.html 75 | - Waterproof Cable Gland https://core-electronics.com.au/cable-gland-pg-9-size-0-158-to-0-252-cable-diameter-pg-9.html OR https://www.adafruit.com/product/761 76 | 77 | These are for bolting pole_mount.stl and Panel_Mount_10W.stl together. 78 | - 6 x M3 heat set inserts OD 5mm Length ~8mm https://www.aliexpress.com/item/1005004535859664.html - These go on the underside of the panel fitting 79 | - 6 x M3 50mm Staintelss steel hex bolt https://www.thefastenerfactory.com.au/stainless-steel-hex-socket-head-cap-screw-m3-x-50mm-100pc 80 | 81 | #### 10W Voltaic Panel 82 | 83 | - Solar Panel https://voltaicsystems.com/10-watt-panel-etfe/ OR https://www.adafruit.com/product/5369 OR https://core-electronics.com.au/5v-10w-solar-panel-etfe-voltaic-p110.html 84 | - Right angled Female 3.5x1.1mm - 5.5x2.1mm: https://voltaicsystems.com/A106 or https://www.adafruit.com/product/4287 85 | - If you get an EFTE panel you need to get ETFE Panel Screw & Washer Set https://voltaicsystems.com/mount-set-etfe/ these are 4-40 but an M3 should work 86 | 87 | ## Finished Construction 88 | 89 | The 25mm PVC pipe can go in the ground or you could use a UBolt. You can modify the scad to support any size round post that you like. 90 | 91 | ![Alt text](../../img/Hero_shot.png?raw=true "Title")

Finished construction 92 | -------------------------------------------------------------------------------- /FDM/6W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_6W.scad: -------------------------------------------------------------------------------- 1 | //Mount to the solar pannel 2 | difference(){ 3 | union(){ 4 | translate([0,0,2])cube([176,220.5,3.5],center=true,$fn=24); 5 | translate([0,0,3.8])cube([102,128,6],center=true,$fn=24); 6 | translate([46.5, -59.5, 27])cube([9,9,50.5], center=true,$fn=24); 7 | translate([-46.5, -59.5, 27])cube([9,9,50.5], center=true,$fn=24); 8 | translate([46.5, 59.5, 27])cube([9,9,50.5], center=true,$fn=24); 9 | translate([-46.5, 59.5, 27])cube([9,9,50.5], center=true,$fn=24); 10 | 11 | translate([0,59.5, 27])cube([9,9,50.5], center=true,$fn=24); 12 | translate([0, -59.5, 27])cube([9,9,50.5], center=true,$fn=24); 13 | } 14 | 15 | //subtracting from the bottom plate 16 | translate([0,0,2])cube([80,105,10],center=true,$fn=24); 17 | 18 | translate([-67.5,0,2])cube([33,190,10],center=true,$fn=24); 19 | translate([67,0,2])cube([32,122,10],center=true,$fn=24); 20 | 21 | translate([66,82,2])cube([33,27,10],center=true,$fn=24); 22 | translate([66,-82,2])cube([33,27,10],center=true,$fn=24); 23 | 24 | translate([22.5,84,2])cube([35,40,10],center=true,$fn=24); 25 | translate([-22.5,-84,2])cube([35,40,10],center=true,$fn=24); 26 | translate([22.5,-84,2])cube([35,40,10],center=true,$fn=24); 27 | translate([-22.5,84,2])cube([35,40,10],center=true,$fn=24); 28 | 29 | //Cutouts for pannel screws 30 | translate([-80.7, -103.7, 1])cylinder(h=5, r=3.2, center=true,$fn=24); 31 | translate([80.7, -103.7, 1])cylinder(h=5, r=3.2, center=true,$fn=24); 32 | translate([-80.7, -103.7, 4])cylinder(h=5, r=5.7, center=true,$fn=24); 33 | translate([80.7, -103.7, 4])cylinder(h=5, r=5.7, center=true,$fn=24); 34 | 35 | //Cutouts for pannel screws 36 | translate([-80.7, 103.7, 1])cylinder(h=5, r=3.2, center=true,$fn=24); 37 | translate([80.7, 103.7, 1])cylinder(h=5, r=3.2, center=true,$fn=24); 38 | translate([-80.7, 103.7, 4])cylinder(h=5, r=5.7, center=true,$fn=24); 39 | translate([80.7, 103.7, 4])cylinder(h=5, r=5.7, center=true,$fn=24); 40 | 41 | translate([46.5, 59.5, 0])cylinder(h=7, r=2.7, center=true,$fn=24); 42 | translate([-46.5, -59.5, 0])cylinder(h=7, r=2.7, center=true,$fn=24); 43 | translate([-46.5, 59.5,0])cylinder(h=7, r=2.7, center=true,$fn=24); 44 | translate([46.5, -59.5, 0])cylinder(h=7, r=2.7, center=true,$fn=24); 45 | translate([0, 59.5,0])cylinder(h=7, r=2.7, center=true,$fn=24); 46 | translate([0, -59.5, 0])cylinder(h=7, r=2.7, center=true,$fn=24); 47 | 48 | translate([46.5, 59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 49 | translate([-46.5, 59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 50 | translate([46.5, -59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 51 | translate([-46.5, -59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 52 | translate([0, -59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 53 | translate([-0, 59.5, 15])cylinder(h=100, r=1.8, center=true,$fn=24); 54 | 55 | //Air flow 56 | translate([-33,0,9]) rotate([90,0,0]) cylinder(h=140, r=7, center=true,$fn=128); 57 | translate([33,0,9]) rotate([90,0,0]) cylinder(h=140, r=7, center=true,$fn=128); 58 | 59 | translate([-13,0,9]) rotate([90,0,0]) cylinder(h=140, r=7, center=true,$fn=128); 60 | translate([13,0,9]) rotate([90,0,0]) cylinder(h=140, r=7, center=true,$fn=128); 61 | 62 | translate([0,48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 63 | translate([0,-48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 64 | 65 | translate([0,12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 66 | translate([0,-12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 67 | 68 | translate([0,30,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 69 | translate([0,-30 ,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | } 78 | 79 | //Pole mount 80 | translate([0,0,52])difference(){ 81 | 82 | 83 | difference(){ 84 | union(){ 85 | cube([102,128,4],center=true); 86 | translate([0,0,20])cylinder(h=40, r1=50, r2=27, center=true,$fn=128); 87 | } 88 | translate([46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 89 | translate([-46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 90 | translate([-46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 91 | translate([46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 92 | translate([0, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 93 | translate([0, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 94 | 95 | translate([46.5, 59.5, 1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 96 | translate([-46.5, -59.5, 1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 97 | translate([-46.5, 59.5,1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 98 | translate([46.5, -59.5, 1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 99 | translate([0, 59.5,1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 100 | translate([0, -59.5, 1])cylinder(h=3.2, r=3.2, center=true,$fn=24); 101 | 102 | //pole mount holes 103 | translate([0,0,25])cylinder(h=60, r=22.5, center=true,$fn=128); //Adjust this for different pole sizes 104 | 105 | 106 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 107 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 108 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 109 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 110 | 111 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 112 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 113 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 114 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 115 | 116 | translate([14.5,-31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 117 | translate([-18.5,-38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 118 | translate([18,-38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 119 | translate([-14.5,-31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 120 | 121 | translate([-14.5,31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 122 | translate([18.5,38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 123 | translate([-18,38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 124 | translate([14.5,31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 125 | 126 | 127 | translate([-60, 0, 10])cube([65,110,70],center=true); 128 | translate([60, 0, 10])cube([65,110,70],center=true); 129 | 130 | 131 | } 132 | } 133 | 134 | 135 | -------------------------------------------------------------------------------- /Code/PPZ_RPi_code.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | import RPi.GPIO as GPIO 4 | import os 5 | import datetime 6 | import sys 7 | import time 8 | import subprocess 9 | 10 | # Configure the GPIO pins for data transfer 11 | ALIVE_PIN1 = 16 12 | ALIVE_PIN2 = 20 13 | 14 | START_PIN = 13 15 | CLOCK_PIN = 19 16 | DATA_PIN = 26 17 | 18 | shutdown_start_hour = 18 19 | shutdown_end_hour = 6 20 | 21 | GPIO.setwarnings(False) 22 | 23 | def get_unix_time_as_string(): 24 | unix_time = int(time.time()) 25 | return str(unix_time) 26 | 27 | def current_system_time(): 28 | now = datetime.datetime.now() 29 | return now 30 | 31 | def get_uptime(): 32 | with open('/proc/uptime', 'r') as f: 33 | uptime_seconds = float(f.readline().split()[0]) 34 | uptime_hours = (uptime_seconds/3600) 35 | uptime_hours = str(round(uptime_hours, 2)) 36 | return uptime_hours 37 | 38 | def get_temp(): 39 | temp = os.popen('vcgencmd measure_temp').readline() 40 | temp= temp.replace("temp=","").replace("'C\n","") 41 | print("Pi Temp: " + str(temp) + " C") 42 | return temp 43 | 44 | def send_data(event): 45 | message = (str(dev_id) + " " + str(event) + "\n" + "Uptime: " + str(uptime) + " hours\n" + "Batt: " + str(battery_voltage) + "V \n" + "Temp: " + str(temp) + " degrees" + "\nTime: " + str(now)) 46 | print(message) 47 | 48 | print("This is where a user can implement interesting stuff.") 49 | print("You can write Python code or you can uncomment the example executing a binary below.") 50 | os.system("ls") 51 | #Please check out the github repo for more examples 52 | 53 | def set_pin_state(): 54 | GPIO.setmode(GPIO.BCM) 55 | 56 | GPIO.setup(START_PIN, GPIO.IN) 57 | GPIO.setup(DATA_PIN, GPIO.IN) 58 | GPIO.setup(CLOCK_PIN, GPIO.IN) 59 | 60 | GPIO.setup(ALIVE_PIN1, GPIO.OUT) 61 | GPIO.output(ALIVE_PIN1, 1) 62 | GPIO.setup(ALIVE_PIN2, GPIO.OUT) 63 | GPIO.output(ALIVE_PIN2, 0) 64 | 65 | def shutdown_pin_state(): 66 | GPIO.output(ALIVE_PIN1, 0) 67 | GPIO.output(ALIVE_PIN2, 1) 68 | 69 | def check_internet_connection(hosts=["8.8.8.8", "1.1.1.1", "192.0.43.10"]): 70 | for host in hosts: 71 | try: 72 | result = subprocess.run(["ping", "-c", "1", "-W", "1", host], stdout=subprocess.DEVNULL, 73 | stderr=subprocess.DEVNULL) 74 | if result.returncode == 0: 75 | return True 76 | except Exception as e: 77 | print(e) 78 | 79 | return False 80 | 81 | 82 | def get_battery_voltage(): 83 | # Receive and assemble the 16-bit value (MSB first) 84 | received_value = 0 85 | GPIO.wait_for_edge(START_PIN, GPIO.FALLING) 86 | for i in range(8): 87 | GPIO.wait_for_edge(CLOCK_PIN, GPIO.RISING) 88 | # Read the data bit from the DATA_PIN and update the received_value 89 | bit = GPIO.input(DATA_PIN) 90 | received_value = (received_value << 1) | bit# Wait for the clock to go low 91 | #print(bit, end="") 92 | return received_value 93 | 94 | def get_average_battery_voltage(): 95 | 96 | battery_voltages = [] 97 | for i in range (5): 98 | battery_voltage = get_battery_voltage() 99 | #print(" " + str(battery_voltage)) 100 | battery_voltages.append(battery_voltage) 101 | sorted_voltages = sorted(battery_voltages) 102 | #print(sorted_voltages) 103 | middle_idx = len(sorted_voltages) // 2 104 | median_value = (sorted_voltages[middle_idx - 1] + sorted_voltages[middle_idx]) / 2 105 | #print("The median value is:", median_value) 106 | median_value = round(median_value, 2) 107 | median_value = (median_value *2)/100 108 | return(median_value) 109 | 110 | def is_battery_voltage_stable(voltage_list): 111 | 112 | #print("sum of voltages in list is: " + str(sum(voltage_list))) 113 | average = sum(voltage_list) / len(voltage_list) 114 | print("Vbatt avg: " + str(average)) 115 | half = len(voltage_list) // 2 116 | first_half = voltage_list[:half] 117 | second_half = voltage_list[half:] 118 | 119 | first_half_average = sum(first_half) / len(first_half) 120 | second_half_average = sum(second_half) / len(second_half) 121 | #print("The average of the first half is: " + str(first_half_average)) 122 | #print("The average of the second half is: " + str(second_half_average)) 123 | 124 | if (first_half_average <= second_half_average): 125 | print("VBatt trending up") 126 | return True 127 | else: 128 | print("VBatt trending down") 129 | return False 130 | 131 | set_pin_state() 132 | GPIO.output(ALIVE_PIN1, 1) 133 | GPIO.output(ALIVE_PIN2, 1) 134 | first_boot = True 135 | voltage_list =[] 136 | time.sleep(10) 137 | internet = check_internet_connection() 138 | if (internet is True): 139 | print("Internet connection working") 140 | else: 141 | print("Internet connection not working") 142 | 143 | while True: 144 | 145 | try: 146 | now = datetime.datetime.now() 147 | dev_id = os.uname()[1] 148 | uptime = get_uptime() 149 | temp = get_temp() 150 | unix_time_string = get_unix_time_as_string() 151 | #print(unix_time_string) 152 | battery_voltage = get_average_battery_voltage() 153 | voltage_list.append(battery_voltage) 154 | #print(voltage_list) 155 | if ((len(voltage_list)) > 5): 156 | Vbatt_stability = is_battery_voltage_stable(voltage_list) 157 | print(str(battery_voltage) + "V") 158 | 159 | if shutdown_start_hour <= now.hour and now.hour < shutdown_end_hour: # this is legacy code, it should not shut down ever 160 | event = " Night time shutdown... " 161 | send_data(event) 162 | print("Shutdown the Raspberry Pi") 163 | shutdown_pin_state() 164 | os.system("sudo shutdown now") 165 | 166 | elif (float(temp) > 75): 167 | event = " Temperature shutdown... " 168 | send_data(event) 169 | # Shutdown the Raspberry Pi 170 | shutdown_pin_state() 171 | os.system("sudo shutdown now") 172 | 173 | elif (float(battery_voltage) < 3.5): 174 | print("Low Battery Voltage Detected, getting results in 5 seconds") 175 | time.sleep(5) 176 | battery_voltage = get_average_battery_voltage() 177 | if (float(battery_voltage) < 3.45): 178 | event = " Low Battery Voltage Shutdown... " 179 | time.sleep(2) 180 | send_data(event) 181 | shutdown_pin_state() 182 | os.system("sudo shutdown now") 183 | else: 184 | print("The low battery voltage was temporary") 185 | 186 | elif (now.minute == 27): 187 | if (float(battery_voltage) > 3.8): 188 | event = "Normal Vbatt High" 189 | send_data(event) 190 | 191 | elif ((len(voltage_list)) > 5): 192 | V_batt_trend = is_battery_voltage_stable(voltage_list) 193 | if (V_batt_trend == True): 194 | event = "Normal VBatt stable" 195 | send_data(event) 196 | else: 197 | event = "Normal VBatt falling shutting down" 198 | send_data(event) 199 | shutdown_pin_state() 200 | os.system("sudo shutdown now") 201 | 202 | else: 203 | event = "Normal, VBatt trend pending" 204 | send_data(event) 205 | voltage_list =[] 206 | 207 | elif (first_boot == True): 208 | event = " Starting up " 209 | send_data(event) 210 | first_boot = False 211 | 212 | time.sleep(57) 213 | 214 | except: 215 | print("An error... ") 216 | #slowdown error to prevent temp increase 217 | time.sleep(15) 218 | -------------------------------------------------------------------------------- /PCBs/gerbers/Photon_Power_Zero_PCB_r1_01-F_Paste.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,8.0.2*% 2 | %TF.CreationDate,2024-05-13T09:46:36+08:00*% 3 | %TF.ProjectId,Photon_Power_Zero_PCB_r1_01,50686f74-6f6e-45f5-906f-7765725f5a65,rev?*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Paste,Top*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 8.0.2) date 2024-05-13 09:46:36* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | G04 Aperture macros list* 15 | %AMRoundRect* 16 | 0 Rectangle with rounded corners* 17 | 0 $1 Rounding radius* 18 | 0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* 19 | 0 Add a 4 corners polygon primitive as box body* 20 | 4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* 21 | 0 Add four circle primitives for the rounded corners* 22 | 1,1,$1+$1,$2,$3* 23 | 1,1,$1+$1,$4,$5* 24 | 1,1,$1+$1,$6,$7* 25 | 1,1,$1+$1,$8,$9* 26 | 0 Add four rect primitives between the rounded corners* 27 | 20,1,$1+$1,$2,$3,$4,$5,0* 28 | 20,1,$1+$1,$4,$5,$6,$7,0* 29 | 20,1,$1+$1,$6,$7,$8,$9,0* 30 | 20,1,$1+$1,$8,$9,$2,$3,0*% 31 | G04 Aperture macros list end* 32 | %ADD10C,0.010000*% 33 | %ADD11RoundRect,0.237500X0.237500X-0.250000X0.237500X0.250000X-0.237500X0.250000X-0.237500X-0.250000X0*% 34 | %ADD12R,0.558800X1.981200*% 35 | %ADD13RoundRect,0.237500X-0.237500X0.287500X-0.237500X-0.287500X0.237500X-0.287500X0.237500X0.287500X0*% 36 | %ADD14RoundRect,0.237500X-0.250000X-0.237500X0.250000X-0.237500X0.250000X0.237500X-0.250000X0.237500X0*% 37 | %ADD15R,0.550000X1.000000*% 38 | %ADD16R,2.800000X2.400000*% 39 | %ADD17R,1.270000X1.680000*% 40 | %ADD18R,1.520000X3.050000*% 41 | %ADD19R,3.500000X1.000000*% 42 | %ADD20R,3.400000X1.500000*% 43 | %ADD21R,3.050000X1.520000*% 44 | %ADD22RoundRect,0.237500X0.250000X0.237500X-0.250000X0.237500X-0.250000X-0.237500X0.250000X-0.237500X0*% 45 | %ADD23R,0.950000X0.900000*% 46 | %ADD24R,1.300000X0.900000*% 47 | %ADD25R,1.475000X0.900000*% 48 | %ADD26R,3.125000X1.733000*% 49 | %ADD27RoundRect,0.007800X-0.122200X0.422200X-0.122200X-0.422200X0.122200X-0.422200X0.122200X0.422200X0*% 50 | %ADD28RoundRect,0.007800X0.422200X0.122200X-0.422200X0.122200X-0.422200X-0.122200X0.422200X-0.122200X0*% 51 | %ADD29RoundRect,0.150000X-0.150000X-0.700000X0.150000X-0.700000X0.150000X0.700000X-0.150000X0.700000X0*% 52 | %ADD30RoundRect,0.250000X-0.250000X-1.100000X0.250000X-1.100000X0.250000X1.100000X-0.250000X1.100000X0*% 53 | G04 APERTURE END LIST* 54 | D10* 55 | %TO.C,U3*% 56 | X149665000Y-90740000D02* 57 | X148605000Y-90740000D01* 58 | X148605000Y-89680000D01* 59 | X149665000Y-89680000D01* 60 | X149665000Y-90740000D01* 61 | G36* 62 | X149665000Y-90740000D02* 63 | G01* 64 | X148605000Y-90740000D01* 65 | X148605000Y-89680000D01* 66 | X149665000Y-89680000D01* 67 | X149665000Y-90740000D01* 68 | G37* 69 | %TD*% 70 | D11* 71 | %TO.C,R1*% 72 | X140770000Y-90952500D03* 73 | X140770000Y-89127500D03* 74 | %TD*% 75 | D12* 76 | %TO.C,U1*% 77 | X171475000Y-93140000D03* 78 | X172745000Y-93140000D03* 79 | X174015000Y-93140000D03* 80 | X175285000Y-93140000D03* 81 | X176555000Y-93140000D03* 82 | X177825000Y-93140000D03* 83 | X179095000Y-93140000D03* 84 | X179095000Y-98067600D03* 85 | X177825000Y-98067600D03* 86 | X172745000Y-98067600D03* 87 | X174015000Y-98067600D03* 88 | X176555000Y-98067600D03* 89 | X175285000Y-98067600D03* 90 | X171475000Y-98067600D03* 91 | %TD*% 92 | D13* 93 | %TO.C,D1*% 94 | X185910000Y-102780000D03* 95 | X185910000Y-104530000D03* 96 | %TD*% 97 | D11* 98 | %TO.C,C1*% 99 | X149040000Y-94932500D03* 100 | X149040000Y-93107500D03* 101 | %TD*% 102 | D14* 103 | %TO.C,R4*% 104 | X152037500Y-88280000D03* 105 | X153862500Y-88280000D03* 106 | %TD*% 107 | D11* 108 | %TO.C,R1*% 109 | X149340000Y-86752500D03* 110 | X149340000Y-84927500D03* 111 | %TD*% 112 | D15* 113 | %TO.C,U4*% 114 | X142700000Y-92740000D03* 115 | X142700000Y-90040000D03* 116 | X143650000Y-90040000D03* 117 | X144600000Y-92740000D03* 118 | X144600000Y-90040000D03* 119 | %TD*% 120 | D16* 121 | %TO.C,J3*% 122 | X185100000Y-97470000D03* 123 | X191200000Y-97470000D03* 124 | X191200000Y-86070000D03* 125 | X185100000Y-86070000D03* 126 | %TD*% 127 | D11* 128 | %TO.C,R1*% 129 | X150850000Y-86752500D03* 130 | X150850000Y-84927500D03* 131 | %TD*% 132 | D17* 133 | %TO.C,REF\u002A\u002A*% 134 | X139610000Y-77400000D03* 135 | X139610000Y-82840000D03* 136 | X142150000Y-77400000D03* 137 | X142150000Y-82840000D03* 138 | X144690000Y-82840000D03* 139 | X147230000Y-77400000D03* 140 | X147230000Y-82840000D03* 141 | X149770000Y-77400000D03* 142 | X152310000Y-77400000D03* 143 | X152310000Y-82840000D03* 144 | X154850000Y-82840000D03* 145 | X157390000Y-77400000D03* 146 | X157390000Y-82840000D03* 147 | X159930000Y-77400000D03* 148 | X159930000Y-82840000D03* 149 | X162470000Y-82840000D03* 150 | X165010000Y-77400000D03* 151 | X165010000Y-82840000D03* 152 | X167550000Y-77400000D03* 153 | X167550000Y-82840000D03* 154 | X170090000Y-77400000D03* 155 | X172630000Y-77400000D03* 156 | X172630000Y-82840000D03* 157 | X175170000Y-82840000D03* 158 | X177710000Y-77400000D03* 159 | X177710000Y-82840000D03* 160 | X180250000Y-82840000D03* 161 | X182790000Y-77400000D03* 162 | X182790000Y-82840000D03* 163 | X185330000Y-77400000D03* 164 | X185330000Y-82840000D03* 165 | X187870000Y-77400000D03* 166 | X149770000Y-82840000D03* 167 | X170090000Y-82840000D03* 168 | X187870000Y-82840000D03* 169 | X144690000Y-77400000D03* 170 | X154850000Y-77400000D03* 171 | X162470000Y-77400000D03* 172 | X175170000Y-77400000D03* 173 | X180250000Y-77400000D03* 174 | %TD*% 175 | D11* 176 | %TO.C,C1*% 177 | X146240000Y-94612500D03* 178 | X146240000Y-92787500D03* 179 | %TD*% 180 | D18* 181 | %TO.C,L1*% 182 | X141070000Y-86520000D03* 183 | X138780000Y-86520000D03* 184 | %TD*% 185 | D19* 186 | %TO.C,J1*% 187 | X139190000Y-92590000D03* 188 | X139190000Y-94590000D03* 189 | D20* 190 | X133440000Y-90240000D03* 191 | X133440000Y-96940000D03* 192 | %TD*% 193 | D13* 194 | %TO.C,D1*% 195 | X177190000Y-102762500D03* 196 | X177190000Y-104512500D03* 197 | %TD*% 198 | D21* 199 | %TO.C,C3*% 200 | X143980000Y-88060000D03* 201 | X143980000Y-85770000D03* 202 | %TD*% 203 | D18* 204 | %TO.C,C3*% 205 | X136770000Y-78820000D03* 206 | X134480000Y-78820000D03* 207 | %TD*% 208 | D22* 209 | %TO.C,R4*% 210 | X155525000Y-95980000D03* 211 | X153700000Y-95980000D03* 212 | %TD*% 213 | D13* 214 | %TO.C,D1*% 215 | X183180000Y-102750000D03* 216 | X183180000Y-104500000D03* 217 | %TD*% 218 | D23* 219 | %TO.C,D2*% 220 | X136550000Y-86260000D03* 221 | X136550000Y-83110000D03* 222 | %TD*% 223 | D11* 224 | %TO.C,C1*% 225 | X170070000Y-100352500D03* 226 | X170070000Y-98527500D03* 227 | %TD*% 228 | D24* 229 | %TO.C,U2*% 230 | X167887500Y-101270000D03* 231 | D25* 232 | X167800000Y-99770000D03* 233 | D26* 234 | X165500000Y-99770000D03* 235 | D24* 236 | X167887500Y-98270000D03* 237 | %TD*% 238 | D11* 239 | %TO.C,C1*% 240 | X162440000Y-101712500D03* 241 | X162440000Y-99887500D03* 242 | %TD*% 243 | D14* 244 | %TO.C,R2*% 245 | X176175000Y-101170000D03* 246 | X178000000Y-101170000D03* 247 | %TD*% 248 | %TO.C,R2*% 249 | X183170000Y-101140000D03* 250 | X184995000Y-101140000D03* 251 | %TD*% 252 | D22* 253 | %TO.C,R2*% 254 | X188325000Y-101140000D03* 255 | X186500000Y-101140000D03* 256 | %TD*% 257 | D11* 258 | %TO.C,C1*% 259 | X152020000Y-93132500D03* 260 | X152020000Y-91307500D03* 261 | %TD*% 262 | D27* 263 | %TO.C,U3*% 264 | X149385000Y-88775000D03* 265 | X148885000Y-88775000D03* 266 | X148385000Y-88775000D03* 267 | X148385000Y-91645000D03* 268 | D28* 269 | X147700000Y-89960000D03* 270 | X147700000Y-89460000D03* 271 | X147700000Y-90960000D03* 272 | D27* 273 | X149885000Y-91645000D03* 274 | D28* 275 | X150570000Y-90960000D03* 276 | X150570000Y-89460000D03* 277 | D27* 278 | X149385000Y-91645000D03* 279 | X148885000Y-91645000D03* 280 | D28* 281 | X147700000Y-90460000D03* 282 | X150570000Y-89960000D03* 283 | X150570000Y-90460000D03* 284 | D27* 285 | X149885000Y-88775000D03* 286 | %TD*% 287 | D14* 288 | %TO.C,R1*% 289 | X152040000Y-89790000D03* 290 | X153865000Y-89790000D03* 291 | %TD*% 292 | D13* 293 | %TO.C,D1*% 294 | X180140000Y-102727500D03* 295 | X180140000Y-104477500D03* 296 | %TD*% 297 | D15* 298 | %TO.C,U5*% 299 | X133490000Y-85310000D03* 300 | X132540000Y-82610000D03* 301 | X134440000Y-85310000D03* 302 | X132540000Y-85310000D03* 303 | X134440000Y-82610000D03* 304 | %TD*% 305 | D22* 306 | %TO.C,R1*% 307 | X146042500Y-98360000D03* 308 | X144217500Y-98360000D03* 309 | %TD*% 310 | D14* 311 | %TO.C,R2*% 312 | X179525000Y-101150000D03* 313 | X181350000Y-101150000D03* 314 | %TD*% 315 | D29* 316 | %TO.C,J2*% 317 | X144189000Y-100944000D03* 318 | X145439000Y-100944000D03* 319 | D30* 320 | X142339000Y-104144000D03* 321 | X147289000Y-104144000D03* 322 | %TD*% 323 | M02* 324 | -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W_r2.scad: -------------------------------------------------------------------------------- 1 | //Mount to the solar pannel 2 | 3 | //Notes: This is the total object but can be printed in multiple parts. 4 | 5 | difference(){ 6 | union(){ 7 | translate([15,0,2])cube([274.5,225,2.8],center=true,$fn=24); 8 | translate([-25,0,3.8])cube([102,128,6],center=true,$fn=24); 9 | 10 | translate([21.5, -59.5, 26])cube([9,9,50], center=true,$fn=24); 11 | translate([-71.5, -59.5, 26])cube([9,9,50], center=true,$fn=24); 12 | translate([21.5, 59.5, 26])cube([9,9,50], center=true,$fn=24); 13 | translate([-71.5, 59.5, 26])cube([9,9,50], center=true,$fn=24); 14 | translate([-25,59.5, 26])cube([9,9,50], center=true,$fn=24); 15 | translate([-25, -59.5, 26])cube([9,9,50], center=true,$fn=24); 16 | 17 | //You can comment the 4 lines below if you print in one piece 18 | translate([16,75.5, 7])cube([22,41,12], center=true,$fn=128); 19 | translate([15, -75.5, 7])cube([22,41,12], center=true,$fn=128); 20 | 21 | } 22 | //Uncomment these to half the plate 23 | //translate([115,0,0])cube([200,250,110],center=true,$fn=24); 24 | //translate([-85,0,0])cube([200,250,110],center=true,$fn=24); 25 | 26 | //Screws for the two parts to put together 27 | translate([15, -70, 8])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 28 | translate([26, -70, 8])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 29 | translate([2, -70, 8])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 30 | 31 | translate([15, -90, 8])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 32 | translate([26, -90, 8])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 33 | translate([2, -90, 8])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 34 | 35 | translate([15, 70, 8])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 36 | translate([26, 70, 8])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 37 | translate([2, 70, 8])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 38 | 39 | translate([15, 90, 8])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 40 | translate([26, 90, 8])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 41 | translate([2, 90, 8])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 42 | 43 | 44 | //subtracting from the bottom plate 45 | translate([-25,0,28])cube([104,110,45.5],center=true,$fn=24); 46 | 47 | translate([-48,0,2])cube([33,105,100],center=true,$fn=24); 48 | translate([-1,0,2])cube([34,105,100],center=true,$fn=24); 49 | 50 | translate([-94,80,2])cube([36,30,100],center=true,$fn=24); 51 | translate([-94,-80,2])cube([36,30,100],center=true,$fn=24); 52 | translate([80,0,2])cube([108,110,100],center=true,$fn=24); 53 | 54 | translate([80,80,2])cube([108,30,100],center=true,$fn=24); 55 | translate([80,-80,2])cube([108,30,100],center=true,$fn=24); 56 | translate([-90,0,2])cube([30,110,100],center=true,$fn=24); 57 | 58 | translate([-48,-80,2])cube([37,32,100],center=true,$fn=24); 59 | translate([-48,80,2])cube([37,32,100],center=true,$fn=24); 60 | 61 | translate([-8.5,-80,2])cube([24,32,100],center=true,$fn=24); 62 | translate([-8.5,80,2])cube([24,32,100],center=true,$fn=24); 63 | 64 | //Cutouts for pannel screws 65 | translate([-115.4,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 66 | translate([-115.4, 105.5 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 67 | translate([-115.4,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 68 | translate([-115.4,105.5, 4])cylinder(h=4, r=5., center=true,$fn=24); 69 | 70 | translate([15,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 71 | translate([15, 105.5 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 72 | translate([15,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 73 | translate([15,105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 74 | 75 | translate([145.4,0, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 76 | translate([-115.4, 0 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 77 | translate([145.4,0, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 78 | translate([-115.4,0, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 79 | 80 | translate([145.4,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 81 | translate([145.4,105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 82 | translate([145.4,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 83 | translate([145.4,105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 84 | 85 | //Heat set inserts 86 | translate([21.5, 59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 87 | translate([-71.5, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 88 | translate([-71.5, 59.5,0])cylinder(h=8, r=2.3, center=true,$fn=24); 89 | translate([21.5, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 90 | translate([-25, 59.5,0])cylinder(h=8, r=2.3, center=true,$fn=24); 91 | translate([-25, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 92 | 93 | translate([21.5, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 94 | translate([-71.5, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 95 | translate([21.5, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 96 | translate([-71.5, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 97 | translate([-25, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 98 | translate([-25, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 99 | 100 | //Air flow 101 | 102 | translate([-30,48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 103 | translate([-30,-48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 104 | 105 | translate([-30,12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 106 | translate([-30,-12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 107 | 108 | translate([-30,30,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 109 | translate([-30,-30 ,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 110 | } 111 | 112 | //Pole mount 113 | translate([-25,0,53])difference(){ 114 | 115 | 116 | difference(){ 117 | union(){ 118 | cube([102,128,4],center=true); 119 | translate([0,0,20])cylinder(h=37, r1=45, r2=27, center=true,$fn=128); 120 | } 121 | translate([46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 122 | translate([-46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 123 | translate([-46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 124 | translate([46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 125 | translate([0, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 126 | translate([0, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 127 | 128 | translate([46.5, 59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 129 | translate([-46.5, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 130 | translate([-46.5, 59.5,2])cylinder(h=2, r=3.2, center=true,$fn=24); 131 | translate([46.5, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 132 | translate([0, 59.5,2])cylinder(h=2, r=3.2, center=true,$fn=24); 133 | translate([0, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 134 | 135 | //pole mount holes 136 | translate([0,0,25])cylinder(h=60, r=22.5, center=true,$fn=128); //Adjust this for different pole sizes 137 | 138 | 139 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 140 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 141 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 142 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 143 | 144 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 145 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 146 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 147 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 148 | 149 | translate([14.5,-31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 150 | translate([-18.5,-38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 151 | translate([18,-38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 152 | translate([-14.5,-31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 153 | 154 | translate([-14.5,31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 155 | translate([18.5,38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 156 | translate([-18,38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 157 | translate([14.5,31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 158 | 159 | 160 | translate([-60, 0, 10])cube([65,110,70],center=true); 161 | translate([60, 0, 10])cube([65,110,70],center=true); 162 | 163 | 164 | } 165 | } 166 | 167 | -------------------------------------------------------------------------------- /FDM/10W_Voltaic_Panel_to_Multicomp_enclosure/Panel_Mount_10W.scad: -------------------------------------------------------------------------------- 1 | //Mount to the solar pannel 2 | 3 | //Notes: This is the total object but is printed in multiple parts. 4 | 5 | difference(){ 6 | union(){ 7 | translate([0,0,2])cube([274.5,225,3.5],center=true,$fn=24); 8 | translate([-10,0,3.8])cube([102,128,6],center=true,$fn=24); 9 | 10 | translate([36.5, -59.5, 26])cube([9,9,48], center=true,$fn=24); 11 | translate([-56.5, -59.5, 26])cube([9,9,48], center=true,$fn=24); 12 | translate([36.5, 59.5, 26])cube([9,9,49], center=true,$fn=24); 13 | translate([-56.5, 59.5, 26])cube([9,9,48], center=true,$fn=24); 14 | translate([-10,59.5, 26])cube([9,9,48], center=true,$fn=24); 15 | translate([-10, -59.5, 26])cube([9,9,48], center=true,$fn=24); 16 | 17 | //You can comment the 4 lines below if you print in one piece 18 | translate([-2,75.5, 10])cube([25,41,15], center=true,$fn=128); 19 | translate([-2, -75.5, 10])cube([25,41,15], center=true,$fn=128); 20 | 21 | } 22 | //Uncomment these to half the plate 23 | //translate([100,0,0])cube([200,250,110],center=true,$fn=24); 24 | //translate([-100,0,0])cube([200,250,110],center=true,$fn=24); 25 | 26 | //Screws for the two parts to put together 27 | translate([0, -70, 10])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 28 | translate([11, -70, 10])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 29 | translate([-15, -70, 10])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 30 | 31 | translate([0, -90, 10])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 32 | translate([11, -90, 10])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 33 | translate([-15, -90, 10])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 34 | 35 | translate([0, 70, 10])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 36 | translate([11, 70, 10])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 37 | translate([-15, 70, 10])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 38 | 39 | translate([0, 90, 10])rotate([0,90,0])cylinder(h=40, r=1.8, center=true,$fn=24); 40 | translate([11, 90, 10])rotate([0,90,0])cylinder(h=10, r=3.5, center=true,$fn=24); 41 | translate([-15, 90, 10])rotate([0,90,0])cylinder(h=6, r=2.25, center=true,$fn=24); 42 | 43 | 44 | //subtracting from the bottom plate 45 | translate([-10,0,27.3])cube([104,110,45],center=true,$fn=24); 46 | 47 | translate([-35,0,2])cube([30,105,100],center=true,$fn=24); 48 | translate([15,0,2])cube([30,105,100],center=true,$fn=24); 49 | 50 | translate([-92,80,2])cube([62,30,100],center=true,$fn=24); 51 | translate([-92,-80,2])cube([62,30,100],center=true,$fn=24); 52 | translate([82,0,2])cube([82,110,100],center=true,$fn=24); 53 | 54 | translate([82,80,2])cube([82,30,100],center=true,$fn=24); 55 | translate([82,-80,2])cube([82,30,100],center=true,$fn=24); 56 | translate([-92,0,2])cube([62,110,100],center=true,$fn=24); 57 | 58 | translate([21,80,2])cube([21,32,200],center=true,$fn=24); 59 | translate([-33,-80,2])cube([37,32,100],center=true,$fn=24); 60 | translate([-33,80,2])cube([37,32,100],center=true,$fn=24); 61 | translate([21,-80,2])cube([21,32,200],center=true,$fn=24); 62 | 63 | //Cutouts for pannel screws 64 | translate([-130.4,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 65 | translate([-130.4, 105.5 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 66 | translate([-130.4,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 67 | translate([-130.4,105.5, 4])cylinder(h=4, r=5., center=true,$fn=24); 68 | 69 | translate([0,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 70 | translate([0, 105.5 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 71 | translate([0,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 72 | translate([0,105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 73 | 74 | translate([130.4,0, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 75 | translate([-130.4, 0 , 1])cylinder(h=5, r=3.8, center=true,$fn=24); 76 | translate([130.4,0, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 77 | translate([-130.4,0, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 78 | 79 | translate([130.4,-105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 80 | translate([130.4,105.5, 1])cylinder(h=5, r=3.8, center=true,$fn=24); 81 | translate([130.4,-105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 82 | translate([130.4,105.5, 4])cylinder(h=4, r=5.7, center=true,$fn=24); 83 | 84 | //Heat set inserts 85 | translate([36.5, 59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 86 | translate([-56.5, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 87 | translate([-56.5, 59.5,0])cylinder(h=8, r=2.3, center=true,$fn=24); 88 | translate([36.5, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 89 | translate([-10, 59.5,0])cylinder(h=8, r=2.3, center=true,$fn=24); 90 | translate([-10, -59.5, 0])cylinder(h=8, r=2.3, center=true,$fn=24); 91 | 92 | translate([36.5, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 93 | translate([-56.5, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 94 | translate([36.5, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 95 | translate([-56.5, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 96 | translate([-10, -59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 97 | translate([-10, 59.5, 15])cylinder(h=100, r=1.85, center=true,$fn=24); 98 | 99 | //Air flow 100 | translate([-43,0,9]) rotate([90,0,0]) cylinder(h=100, r=7, center=true,$fn=128); 101 | translate([23,0,9]) rotate([90,0,0]) cylinder(h=100, r=7, center=true,$fn=128); 102 | 103 | translate([-23,0,9]) rotate([90,0,0]) cylinder(h=100, r=7, center=true,$fn=128); 104 | translate([3,0,9]) rotate([90,0,0]) cylinder(h=100, r=7, center=true,$fn=128); 105 | 106 | translate([0,48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 107 | translate([0,-48,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 108 | 109 | translate([0,12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 110 | translate([0,-12,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 111 | 112 | translate([0,30,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 113 | translate([0,-30 ,9]) rotate([0,90,0]) cylinder(h=140, r=7, center=true,$fn=128); 114 | } 115 | 116 | //Pole mount 117 | translate([-10,0,52])difference(){ 118 | 119 | 120 | difference(){ 121 | union(){ 122 | cube([102,128,4],center=true); 123 | translate([0,0,20])cylinder(h=37, r1=45, r2=27, center=true,$fn=128); 124 | } 125 | translate([46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 126 | translate([-46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 127 | translate([-46.5, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 128 | translate([46.5, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 129 | translate([0, 59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 130 | translate([0, -59.5, -25])cylinder(h=100, r=1.8, center=true,$fn=24); 131 | 132 | translate([46.5, 59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 133 | translate([-46.5, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 134 | translate([-46.5, 59.5,2])cylinder(h=2, r=3.2, center=true,$fn=24); 135 | translate([46.5, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 136 | translate([0, 59.5,2])cylinder(h=2, r=3.2, center=true,$fn=24); 137 | translate([0, -59.5, 2])cylinder(h=2, r=3.2, center=true,$fn=24); 138 | 139 | //pole mount holes 140 | translate([0,0,25])cylinder(h=60, r=22.5, center=true,$fn=128); //Adjust this for different pole sizes 141 | 142 | 143 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 144 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 145 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 146 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 147 | 148 | translate([0,0,25])rotate([90,0,25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 149 | translate([0,0,10])rotate([90,0,-25]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 150 | translate([0,0,10])rotate([0,90,115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 151 | translate([0,0,25])rotate([0,90,-115]) cylinder(h=100, r1=2, r2=2, center=true,$fn=124); 152 | 153 | translate([14.5,-31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 154 | translate([-18.5,-38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 155 | translate([18,-38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 156 | translate([-14.5,-31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 157 | 158 | translate([-14.5,31,25])rotate([90,0,25]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 159 | translate([18.5,38.3,10])rotate([90,0,-25]) cylinder(h=10, r=4.5, center=true,$fn=124); 160 | translate([-18,38.3,10])rotate([0,90,115]) cylinder(h=10, r=4.5, center=true,$fn=124); 161 | translate([14.5,31,25])rotate([0,90,-115]) cylinder(h=7.9, r=4.5, center=true,$fn=124); 162 | 163 | 164 | translate([-60, 0, 10])cube([65,110,70],center=true); 165 | translate([60, 0, 10])cube([65,110,70],center=true); 166 | 167 | 168 | } 169 | } 170 | 171 | -------------------------------------------------------------------------------- /Code/ATtiny_2025_06_24.c/ATtiny_2025_06_24.c.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | #define ADC_BATT_INPUT PB0 // Pin for the ADC input 9 | 10 | #define PWR PA7 // Pin for the LED 11 | #define ACTIVE PA6 // Pin for the LED 12 | #define AP2161 PB0 // Pin when set low will trigger the Pi on 13 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 14 | 15 | #define ALIVE_PIN_1 PA2 16 | #define ALIVE_PIN_2 PA4 17 | 18 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 19 | 20 | #define START_PIN PA1 21 | #define CLOCK_PIN PA3 22 | #define DATA_PIN PA5 23 | 24 | // Global variable using extern 25 | uint8_t CLOCK_PIN_STATE; 26 | 27 | void initADC() 28 | { 29 | 30 | ADMUX = 31 | (0 << REFS1) | // Sets ref. voltage to Vcc, bit 1 32 | (0 << REFS0) | // Sets ref. voltage to Vcc, bit 0 33 | (0 << MUX5) | // use ADC1 for input (PA1), MUX bit 5 34 | (0 << MUX4) | // use ADC1 for input (PA1), MUX bit 4 35 | (0 << MUX3) | // use ADC1 for input (PA1), MUX bit 3 36 | (0 << MUX2) | // use ADC1 for input (PA1), MUX bit 2 37 | (0 << MUX1) | // use ADC1 for input (PA1), MUX bit 1 38 | (0 << MUX0); // use ADC1 for input (PA1), MUX bit 0 39 | 40 | ADCSRA = 41 | (1 << ADEN) | // Enable ADC 42 | (1 << ADPS2) | // set prescaler to 16, bit 2 43 | (0 << ADPS1) | // set prescaler to 16, bit 1 44 | (0 << ADPS0); // set prescaler to 16, bit 0 45 | 46 | ADCSRB = 47 | // (1 << ADLAR); // left shift result (for 8-bit values) 48 | (0 << ADLAR); // right shift result (for 10-bit values) 49 | } 50 | 51 | void Blink_LEDs() { 52 | for (int i=0;i<20;i++) { 53 | PORTA |= (1 << PWR); 54 | PORTA |= (1 << ACTIVE); 55 | _delay_ms(250); 56 | PORTA &= ~(1 << ACTIVE); 57 | PORTA &= ~(1 << PWR); 58 | _delay_ms(250); 59 | } 60 | } 61 | 62 | bool start_pin_high() { 63 | if (PINA & (1 << START_PIN )) { //Has it been pulled high? 64 | return true; // PA2 is high 65 | } 66 | else { 67 | return false; // PA2 is low 68 | } 69 | } 70 | 71 | bool has_CLOCK_PIN_Changed() { 72 | // Read the current status of CLOCK_PIN 73 | uint8_t currentPinStatus = PINA & (1 << CLOCK_PIN); 74 | 75 | // Check if the pin status has changed from high to low or low to high 76 | if (currentPinStatus != CLOCK_PIN_STATE) { 77 | CLOCK_PIN_STATE = currentPinStatus; 78 | return true; // Pin status has changed 79 | } 80 | else { 81 | return false; // Pin status is the same 82 | } 83 | } 84 | 85 | void turn_on_pi() { 86 | PORTB &= ~(1 << AP2161); 87 | PORTA |= (1 << PWR); 88 | _delay_ms(100000); //100 seconds 89 | } 90 | 91 | bool is_Pi_Power_On() { 92 | // Check if PA7 is set high and PB0 is set low 93 | if ((PINA & (1 << PWR)) && !(PINB & (1 << AP2161))) { 94 | return true; // Conditions are met 95 | } 96 | else { 97 | return false; // Conditions are not met 98 | } 99 | } 100 | 101 | bool is_Pi_Booted() { 102 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 103 | return true; // PA2 is high 104 | } 105 | else { 106 | return false; // PA2 is low 107 | } 108 | } 109 | 110 | bool has_Pi_ever_entered_expert_mode() { 111 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 112 | return true; // PA2 is high 113 | } 114 | } 115 | 116 | bool is_Pi_ready_for_data() { 117 | if (PINA & (1 << ALIVE_PIN_2 )) { //Has it been pulled high? 118 | return true; //PA4 is high 119 | } 120 | else { 121 | return false; //PA4 is low 122 | } 123 | 124 | } 125 | 126 | void graceful_shutdown() { 127 | PORTB |= (1 << SHUTDOWN_PIN); // set high 128 | PORTA |= (1 << PWR); 129 | _delay_ms(500); 130 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 131 | PORTA &= ~(1 << PWR); 132 | _delay_ms(500); 133 | PORTB |= (1 << SHUTDOWN_PIN); // set high 134 | PORTA |= (1 << PWR); 135 | _delay_ms(500); 136 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 137 | PORTA &= ~(1 << PWR); 138 | _delay_ms(500); 139 | PORTB |= (1 << SHUTDOWN_PIN); // set high 140 | PORTA |= (1 << PWR); 141 | _delay_ms(500); 142 | _delay_ms(10000); 143 | } 144 | 145 | 146 | void turn_off_pi() { 147 | PORTB |= (1 << AP2161); // set high to switch off 148 | PORTA &= ~(1 << PWR); // set the LED to low 149 | PORTA &= ~(1 << ACTIVE); //set the state low 150 | // Calculate the number of sleep cycles for 1 hour (3600 seconds) 151 | for (int i=2; i>0; i--) { // So sleep for 2 hours 152 | _delay_ms(3500000); // 1 hour 153 | } 154 | } 155 | 156 | void set_pins() { 157 | initADC(); 158 | //Note DDRA or DDRB sets the pin status as an output and |= sets the default status as high 159 | DDRA |= (1 << PWR); //Set as an ouput Pin 160 | PORTA &= ~(1 << PWR); //set the state low 161 | DDRA |= (1 << ACTIVE); 162 | PORTA &= ~(1 << ACTIVE); //set the state low 163 | DDRB |= (1 << AP2161); 164 | PORTB |= (1 << AP2161); //set the state high 165 | DDRB |= (1 << SHUTDOWN_PIN); 166 | PORTB &= ~(1 << SHUTDOWN_PIN); //set the state low 167 | 168 | DDRA |= (1 << DATA_PIN); //Set as an ouput Pin 169 | DDRA |= (1 << CLOCK_PIN); //Set as an ouput Pin 170 | DDRA |= (1 << START_PIN); //Set as an ouput Pin 171 | 172 | 173 | DDRA &= ~(1 << ALIVE_PIN_1); //Set as an input Pin 174 | PORTA &= ~(1 << ALIVE_PIN_1); //Disable the internal pull-up resistor 175 | DDRA &= ~(1 << ALIVE_PIN_2); //Set as an input Pin 176 | PORTA &= ~(1 << ALIVE_PIN_2); //Disable the internal pull-up resistor 177 | 178 | 179 | CLOCK_PIN_STATE = (PINB & (1 << CLOCK_PIN)) >> CLOCK_PIN; 180 | } 181 | 182 | int get_voltage_from_adc() { 183 | uint16_t battery_voltage; 184 | ADCSRA |= (1 << ADSC); // start ADC measurement 185 | 186 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 187 | 188 | // Read ADC value 189 | uint16_t adcValue = ADC; 190 | 191 | // Apply suggested changes for better accuracy 192 | 193 | uint16_t sum = 0; 194 | uint8_t numReadings = 5; // Number of readings to average 195 | 196 | for (uint8_t i = 0; i < numReadings; i++) { 197 | ADCSRA |= (1 << ADSC); // start ADC measurement 198 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 199 | sum += ADC; 200 | } 201 | 202 | uint16_t average = sum / numReadings; 203 | 204 | // Scaling factor to scale 1024 into a no decimal place voltage and account for the voltage divider 205 | battery_voltage = average *0.586; 206 | return(battery_voltage); 207 | } 208 | 209 | // Function to transmit a single bit to Raspberry Pi 210 | void transmitBit(uint8_t bit) { 211 | // Set DATA_PIN according to the bit value 212 | if (bit) { 213 | PORTA |= (1 << DATA_PIN); 214 | } else { 215 | PORTA &= ~(1 << DATA_PIN); 216 | } 217 | 218 | // Toggle CLOCK_PIN to transmit the bit 219 | PORTA |= (1 << CLOCK_PIN); 220 | _delay_ms(50); 221 | PORTA &= ~(1 << CLOCK_PIN); 222 | _delay_ms(50); 223 | } 224 | 225 | // Function to transmit a 8-bit value to Raspberry Pi 226 | void BitBang(uint8_t value) { 227 | // Transmit each bit (MSB first) 228 | // Toggle START_PIN to transmit the bytes 229 | PORTA |= (1 << CLOCK_PIN); 230 | _delay_ms(50); 231 | PORTA |= (1 << START_PIN); 232 | _delay_ms(50); 233 | PORTA &= ~(1 << START_PIN); 234 | _delay_ms(50); 235 | 236 | 237 | for (uint8_t i = 8; i > 0; i--) { 238 | uint8_t bit = (value >> i) & 0x01; 239 | transmitBit(bit); 240 | } 241 | } 242 | 243 | uint8_t fit_8_bits(uint16_t battery_voltage) { 244 | 245 | // Ensure the result value fits into a uint8_t 246 | uint8_t result; 247 | if (battery_voltage > UINT8_MAX) { 248 | result = UINT8_MAX; // If overflow, set to the maximum value of uint8_t 249 | } else { 250 | result = (uint8_t)battery_voltage; 251 | } 252 | 253 | return result; 254 | } 255 | 256 | int main( void ) { 257 | 258 | set_pins(); 259 | uint16_t battery_voltage; 260 | uint8_t shifted_voltage; 261 | Blink_LEDs(); 262 | bool expert_mode = false; 263 | 264 | while(1) { 265 | 266 | battery_voltage = get_voltage_from_adc(); 267 | if (is_Pi_Power_On()) { 268 | expert_mode = has_Pi_ever_entered_expert_mode(); 269 | if (expert_mode == true) { 270 | if (is_Pi_Booted()) { 271 | if (is_Pi_ready_for_data()) { 272 | PORTA |= (1 << ACTIVE); 273 | shifted_voltage = fit_8_bits(battery_voltage); 274 | BitBang(shifted_voltage); 275 | _delay_ms(100); 276 | } 277 | else { 278 | PORTA &= ~(1 << ACTIVE); // set the LED to low 279 | } 280 | } 281 | else { 282 | graceful_shutdown(); 283 | turn_off_pi(); 284 | Blink_LEDs(); 285 | } 286 | 287 | } 288 | else { 289 | // We are not in expert mode 290 | } 291 | } 292 | else { // The Pi must be off 293 | if ((battery_voltage*2) > 375) { 294 | turn_on_pi(); 295 | } 296 | else if ((battery_voltage*2) < 345) { 297 | graceful_shutdown(); 298 | turn_off_pi(); 299 | } 300 | else { 301 | //Do nothing 302 | } 303 | } 304 | } 305 | } 306 | -------------------------------------------------------------------------------- /Code/ATtiny_2023_11_03.c/ATtiny_2023_11_03.c.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | #define ADC_BATT_INPUT PB0 // Pin for the ADC input 9 | 10 | #define PWR PA7 // Pin for the LED 11 | #define ACTIVE PA6 // Pin for the LED 12 | #define AP2161 PB0 // Pin when set low will trigger the Pi on 13 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 14 | 15 | #define ALIVE_PIN_1 PA2 16 | #define ALIVE_PIN_2 PA4 17 | 18 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 19 | 20 | #define START_PIN PA1 21 | #define CLOCK_PIN PA3 22 | #define DATA_PIN PA5 23 | 24 | // Global variable using extern 25 | uint8_t CLOCK_PIN_STATE; 26 | 27 | void initADC() 28 | { 29 | 30 | ADMUX = 31 | (0 << REFS1) | // Sets ref. voltage to Vcc, bit 1 32 | (0 << REFS0) | // Sets ref. voltage to Vcc, bit 0 33 | (0 << MUX5) | // use ADC1 for input (PA1), MUX bit 5 34 | (0 << MUX4) | // use ADC1 for input (PA1), MUX bit 4 35 | (0 << MUX3) | // use ADC1 for input (PA1), MUX bit 3 36 | (0 << MUX2) | // use ADC1 for input (PA1), MUX bit 2 37 | (0 << MUX1) | // use ADC1 for input (PA1), MUX bit 1 38 | (0 << MUX0); // use ADC1 for input (PA1), MUX bit 0 39 | 40 | ADCSRA = 41 | (1 << ADEN) | // Enable ADC 42 | (1 << ADPS2) | // set prescaler to 16, bit 2 43 | (0 << ADPS1) | // set prescaler to 16, bit 1 44 | (0 << ADPS0); // set prescaler to 16, bit 0 45 | 46 | ADCSRB = 47 | // (1 << ADLAR); // left shift result (for 8-bit values) 48 | (0 << ADLAR); // right shift result (for 10-bit values) 49 | } 50 | 51 | void Blink_LEDs() { 52 | for (int i=0;i<20;i++) { 53 | PORTA |= (1 << PWR); 54 | PORTA |= (1 << ACTIVE); 55 | _delay_ms(250); 56 | PORTA &= ~(1 << ACTIVE); 57 | PORTA &= ~(1 << PWR); 58 | _delay_ms(250); 59 | } 60 | } 61 | 62 | bool start_pin_high() { 63 | if (PINA & (1 << START_PIN )) { //Has it been pulled high? 64 | return true; // PA2 is high 65 | } 66 | else { 67 | return false; // PA2 is low 68 | } 69 | } 70 | 71 | bool has_CLOCK_PIN_Changed() { 72 | // Read the current status of CLOCK_PIN 73 | uint8_t currentPinStatus = PINA & (1 << CLOCK_PIN); 74 | 75 | // Check if the pin status has changed from high to low or low to high 76 | if (currentPinStatus != CLOCK_PIN_STATE) { 77 | CLOCK_PIN_STATE = currentPinStatus; 78 | return true; // Pin status has changed 79 | } 80 | else { 81 | return false; // Pin status is the same 82 | } 83 | } 84 | 85 | void turn_on_pi() { 86 | PORTB &= ~(1 << AP2161); 87 | PORTA |= (1 << PWR); 88 | _delay_ms(100000); //100 seconds 89 | } 90 | 91 | bool is_Pi_Power_On() { 92 | // Check if PA7 is set high and PB0 is set low 93 | if ((PINA & (1 << PWR)) && !(PINB & (1 << AP2161))) { 94 | return true; // Conditions are met 95 | } 96 | else { 97 | return false; // Conditions are not met 98 | } 99 | } 100 | 101 | bool is_Pi_Booted() { 102 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 103 | return true; // PA2 is high 104 | } 105 | else { 106 | return false; // PA2 is low 107 | } 108 | } 109 | 110 | bool has_Pi_ever_entered_expert_mode() { 111 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 112 | return true; // PA2 is high 113 | } 114 | } 115 | 116 | bool is_Pi_ready_for_data() { 117 | if (PINA & (1 << ALIVE_PIN_2 )) { //Has it been pulled high? 118 | return true; //PA4 is high 119 | } 120 | else { 121 | return false; //PA4 is low 122 | } 123 | 124 | } 125 | 126 | void graceful_shutdown() { 127 | PORTB |= (1 << SHUTDOWN_PIN); // set high 128 | PORTA |= (1 << PWR); 129 | _delay_ms(500); 130 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 131 | PORTA &= ~(1 << PWR); 132 | _delay_ms(500); 133 | PORTB |= (1 << SHUTDOWN_PIN); // set high 134 | PORTA |= (1 << PWR); 135 | _delay_ms(500); 136 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 137 | PORTA &= ~(1 << PWR); 138 | _delay_ms(500); 139 | PORTB |= (1 << SHUTDOWN_PIN); // set high 140 | PORTA |= (1 << PWR); 141 | _delay_ms(500); 142 | _delay_ms(10000); 143 | } 144 | 145 | 146 | void turn_off_pi() { 147 | PORTB |= (1 << AP2161); // set high to switch off 148 | PORTA &= ~(1 << PWR); // set the LED to low 149 | PORTA &= ~(1 << ACTIVE); //set the state low 150 | // Calculate the number of sleep cycles for 1 hour (3600 seconds) 151 | for (int i=2; i>0; i--) { // So sleep for 2 hours 152 | _delay_ms(3500000); // 1 hour 153 | } 154 | } 155 | 156 | void set_pins() { 157 | initADC(); 158 | //Note DDRA or DDRB sets the pin status as an output and |= sets the default status as high 159 | DDRA |= (1 << PWR); //Set as an ouput Pin 160 | PORTA &= ~(1 << PWR); //set the state low 161 | DDRA |= (1 << ACTIVE); 162 | PORTA &= ~(1 << ACTIVE); //set the state low 163 | DDRB |= (1 << AP2161); 164 | PORTB |= (1 << AP2161); //set the state high 165 | DDRB |= (1 << SHUTDOWN_PIN); 166 | PORTB &= ~(1 << SHUTDOWN_PIN); //set the state low 167 | 168 | DDRA |= (1 << DATA_PIN); //Set as an ouput Pin 169 | DDRA |= (1 << CLOCK_PIN); //Set as an ouput Pin 170 | DDRA |= (1 << START_PIN); //Set as an ouput Pin 171 | 172 | 173 | DDRA &= ~(1 << ALIVE_PIN_1); //Set as an input Pin 174 | PORTA &= ~(1 << ALIVE_PIN_1); //Disable the internal pull-up resistor 175 | DDRA &= ~(1 << ALIVE_PIN_2); //Set as an input Pin 176 | PORTA &= ~(1 << ALIVE_PIN_2); //Disable the internal pull-up resistor 177 | 178 | 179 | CLOCK_PIN_STATE = (PINB & (1 << CLOCK_PIN)) >> CLOCK_PIN; 180 | } 181 | 182 | int get_voltage_from_adc() { 183 | uint16_t battery_voltage; 184 | ADCSRA |= (1 << ADSC); // start ADC measurement 185 | 186 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 187 | 188 | // Read ADC value 189 | uint16_t adcValue = ADC; 190 | 191 | // Apply suggested changes for better accuracy 192 | 193 | uint16_t sum = 0; 194 | uint8_t numReadings = 5; // Number of readings to average 195 | 196 | for (uint8_t i = 0; i < numReadings; i++) { 197 | ADCSRA |= (1 << ADSC); // start ADC measurement 198 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 199 | sum += ADC; 200 | } 201 | 202 | uint16_t average = sum / numReadings; 203 | 204 | // Scaling factor to scale 1024 into a no decimal place voltage and account for the voltage divider 205 | battery_voltage = average *0.586; 206 | return(battery_voltage); 207 | } 208 | 209 | // Function to transmit a single bit to Raspberry Pi 210 | void transmitBit(uint8_t bit) { 211 | // Set DATA_PIN according to the bit value 212 | if (bit) { 213 | PORTA |= (1 << DATA_PIN); 214 | } else { 215 | PORTA &= ~(1 << DATA_PIN); 216 | } 217 | 218 | // Toggle CLOCK_PIN to transmit the bit 219 | PORTA |= (1 << CLOCK_PIN); 220 | _delay_ms(50); 221 | PORTA &= ~(1 << CLOCK_PIN); 222 | _delay_ms(50); 223 | } 224 | 225 | // Function to transmit a 8-bit value to Raspberry Pi 226 | void BitBang(uint8_t value) { 227 | // Transmit each bit (MSB first) 228 | // Toggle START_PIN to transmit the bytes 229 | PORTA |= (1 << CLOCK_PIN); 230 | _delay_ms(50); 231 | PORTA |= (1 << START_PIN); 232 | _delay_ms(50); 233 | PORTA &= ~(1 << START_PIN); 234 | _delay_ms(50); 235 | 236 | 237 | for (uint8_t i = 8; i > 0; i--) { 238 | uint8_t bit = (value >> i) & 0x01; 239 | transmitBit(bit); 240 | } 241 | } 242 | 243 | uint8_t BitShiftVoltage(uint16_t battery_voltage) { 244 | // Shift the voltage down by one place (divide by 2) 245 | uint16_t shifted_voltage = battery_voltage >> 1; 246 | 247 | // Ensure the value fits into a uint8_t 248 | uint8_t result; 249 | if (shifted_voltage > UINT8_MAX) { 250 | result = UINT8_MAX; // If overflow, set to the maximum value of uint8_t 251 | } else { 252 | result = (uint8_t)shifted_voltage; 253 | } 254 | 255 | return result; 256 | } 257 | 258 | int main( void ) { 259 | 260 | set_pins(); 261 | uint16_t battery_voltage; 262 | uint8_t shifted_voltage; 263 | Blink_LEDs(); 264 | bool expert_mode = false; 265 | 266 | while(1) { 267 | 268 | battery_voltage = get_voltage_from_adc(); 269 | if (is_Pi_Power_On()) { 270 | expert_mode = has_Pi_ever_entered_expert_mode(); 271 | if (expert_mode == true) { 272 | if (is_Pi_Booted()) { 273 | if (is_Pi_ready_for_data()) { 274 | PORTA |= (1 << ACTIVE); 275 | shifted_voltage = BitShiftVoltage(battery_voltage); 276 | BitBang(shifted_voltage); 277 | _delay_ms(100); 278 | } 279 | else { 280 | PORTA &= ~(1 << ACTIVE); // set the LED to low 281 | } 282 | } 283 | else { 284 | graceful_shutdown(); 285 | turn_off_pi(); 286 | Blink_LEDs(); 287 | } 288 | 289 | } 290 | else { 291 | // We are not in expert mode 292 | } 293 | } 294 | else { // The Pi must be off 295 | if (battery_voltage > 375) { 296 | turn_on_pi(); 297 | } 298 | else if (battery_voltage < 345) { 299 | graceful_shutdown(); 300 | turn_off_pi(); 301 | } 302 | else { 303 | //Do nothing 304 | } 305 | } 306 | } 307 | } 308 | -------------------------------------------------------------------------------- /Code/ATtiny_2024_01_18.c/ATtiny_2024_01_18.c.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | #define ADC_BATT_INPUT PB0 // Pin for the ADC input 9 | 10 | #define PWR PA7 // Pin for the LED 11 | #define ACTIVE PA6 // Pin for the LED 12 | #define AP2161 PB0 // Pin when set low will trigger the Pi on 13 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 14 | 15 | #define ALIVE_PIN_1 PA2 16 | #define ALIVE_PIN_2 PA4 17 | 18 | #define SHUTDOWN_PIN PB2 // Trigger this pin to enable the Pi to gracefully shutdown 19 | 20 | #define START_PIN PA1 21 | #define CLOCK_PIN PA3 22 | #define DATA_PIN PA5 23 | 24 | // Global variable using extern 25 | uint8_t CLOCK_PIN_STATE; 26 | 27 | void initADC() 28 | { 29 | 30 | ADMUX = 31 | (0 << REFS1) | // Sets ref. voltage to Vcc, bit 1 32 | (0 << REFS0) | // Sets ref. voltage to Vcc, bit 0 33 | (0 << MUX5) | // use ADC1 for input (PA1), MUX bit 5 34 | (0 << MUX4) | // use ADC1 for input (PA1), MUX bit 4 35 | (0 << MUX3) | // use ADC1 for input (PA1), MUX bit 3 36 | (0 << MUX2) | // use ADC1 for input (PA1), MUX bit 2 37 | (0 << MUX1) | // use ADC1 for input (PA1), MUX bit 1 38 | (0 << MUX0); // use ADC1 for input (PA1), MUX bit 0 39 | 40 | ADCSRA = 41 | (1 << ADEN) | // Enable ADC 42 | (1 << ADPS2) | // set prescaler to 16, bit 2 43 | (0 << ADPS1) | // set prescaler to 16, bit 1 44 | (0 << ADPS0); // set prescaler to 16, bit 0 45 | 46 | ADCSRB = 47 | // (1 << ADLAR); // left shift result (for 8-bit values) 48 | (0 << ADLAR); // right shift result (for 10-bit values) 49 | } 50 | 51 | void Blink_LEDs() { 52 | for (int i=0;i<20;i++) { 53 | PORTA |= (1 << PWR); 54 | PORTA |= (1 << ACTIVE); 55 | _delay_ms(250); 56 | PORTA &= ~(1 << ACTIVE); 57 | PORTA &= ~(1 << PWR); 58 | _delay_ms(250); 59 | } 60 | } 61 | 62 | bool start_pin_high() { 63 | if (PINA & (1 << START_PIN )) { //Has it been pulled high? 64 | return true; // PA2 is high 65 | } 66 | else { 67 | return false; // PA2 is low 68 | } 69 | } 70 | 71 | bool has_CLOCK_PIN_Changed() { 72 | // Read the current status of CLOCK_PIN 73 | uint8_t currentPinStatus = PINA & (1 << CLOCK_PIN); 74 | 75 | // Check if the pin status has changed from high to low or low to high 76 | if (currentPinStatus != CLOCK_PIN_STATE) { 77 | CLOCK_PIN_STATE = currentPinStatus; 78 | return true; // Pin status has changed 79 | } 80 | else { 81 | return false; // Pin status is the same 82 | } 83 | } 84 | 85 | void turn_on_pi() { 86 | PORTB &= ~(1 << AP2161); 87 | PORTA |= (1 << PWR); 88 | _delay_ms(100000); //100 seconds 89 | } 90 | 91 | bool is_Pi_Power_On() { 92 | // Check if PA7 is set high and PB0 is set low 93 | if ((PINA & (1 << PWR)) && !(PINB & (1 << AP2161))) { 94 | return true; // Conditions are met 95 | } 96 | else { 97 | return false; // Conditions are not met 98 | } 99 | } 100 | 101 | bool is_Pi_Booted() { 102 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 103 | return true; // PA2 is high 104 | } 105 | else { 106 | return false; // PA2 is low 107 | } 108 | } 109 | 110 | bool has_Pi_ever_entered_expert_mode() { 111 | if (PINA & (1 << ALIVE_PIN_1 )) { //Has it been pulled high? 112 | return true; // PA2 is high 113 | } 114 | } 115 | 116 | bool is_Pi_ready_for_data() { 117 | if (PINA & (1 << ALIVE_PIN_2 )) { //Has it been pulled high? 118 | return true; //PA4 is high 119 | } 120 | else { 121 | return false; //PA4 is low 122 | } 123 | 124 | } 125 | 126 | void graceful_shutdown() { 127 | PORTB |= (1 << SHUTDOWN_PIN); // set high 128 | PORTA |= (1 << PWR); 129 | _delay_ms(500); 130 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 131 | PORTA &= ~(1 << PWR); 132 | _delay_ms(500); 133 | PORTB |= (1 << SHUTDOWN_PIN); // set high 134 | PORTA |= (1 << PWR); 135 | _delay_ms(500); 136 | PORTB &= ~(1 << SHUTDOWN_PIN); // set low 137 | PORTA &= ~(1 << PWR); 138 | _delay_ms(500); 139 | PORTB |= (1 << SHUTDOWN_PIN); // set high 140 | PORTA |= (1 << PWR); 141 | _delay_ms(500); 142 | _delay_ms(10000); 143 | } 144 | 145 | 146 | void turn_off_pi() { 147 | PORTB |= (1 << AP2161); // set high to switch off 148 | PORTA &= ~(1 << PWR); // set the LED to low 149 | PORTA &= ~(1 << ACTIVE); //set the state low 150 | // Calculate the number of sleep cycles for 1 hour (3600 seconds) 151 | for (int i=2; i>0; i--) { // So sleep for 2 hours 152 | _delay_ms(3500000); // 1 hour 153 | } 154 | } 155 | 156 | void set_pins() { 157 | initADC(); 158 | //Note DDRA or DDRB sets the pin status as an output and |= sets the default status as high 159 | DDRA |= (1 << PWR); //Set as an ouput Pin 160 | PORTA &= ~(1 << PWR); //set the state low 161 | DDRA |= (1 << ACTIVE); 162 | PORTA &= ~(1 << ACTIVE); //set the state low 163 | DDRB |= (1 << AP2161); 164 | PORTB |= (1 << AP2161); //set the state high 165 | DDRB |= (1 << SHUTDOWN_PIN); 166 | PORTB &= ~(1 << SHUTDOWN_PIN); //set the state low 167 | 168 | DDRA |= (1 << DATA_PIN); //Set as an ouput Pin 169 | DDRA |= (1 << CLOCK_PIN); //Set as an ouput Pin 170 | DDRA |= (1 << START_PIN); //Set as an ouput Pin 171 | 172 | 173 | DDRA &= ~(1 << ALIVE_PIN_1); //Set as an input Pin 174 | PORTA &= ~(1 << ALIVE_PIN_1); //Disable the internal pull-up resistor 175 | DDRA &= ~(1 << ALIVE_PIN_2); //Set as an input Pin 176 | PORTA &= ~(1 << ALIVE_PIN_2); //Disable the internal pull-up resistor 177 | 178 | 179 | CLOCK_PIN_STATE = (PINB & (1 << CLOCK_PIN)) >> CLOCK_PIN; 180 | } 181 | 182 | int get_voltage_from_adc() { 183 | uint16_t battery_voltage; 184 | ADCSRA |= (1 << ADSC); // start ADC measurement 185 | 186 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 187 | 188 | // Read ADC value 189 | uint16_t adcValue = ADC; 190 | 191 | // Apply suggested changes for better accuracy 192 | 193 | uint16_t sum = 0; 194 | uint8_t numReadings = 5; // Number of readings to average 195 | 196 | for (uint8_t i = 0; i < numReadings; i++) { 197 | ADCSRA |= (1 << ADSC); // start ADC measurement 198 | while (ADCSRA & (1 << ADSC)); // wait till conversion complete 199 | sum += ADC; 200 | } 201 | 202 | uint16_t average = sum / numReadings; 203 | 204 | // Scaling factor to scale 1024 into a no decimal place voltage and account for the voltage divider 205 | battery_voltage = average *0.586; 206 | return(battery_voltage); 207 | } 208 | 209 | // Function to transmit a single bit to Raspberry Pi 210 | void transmitBit(uint8_t bit) { 211 | // Set DATA_PIN according to the bit value 212 | if (bit) { 213 | PORTA |= (1 << DATA_PIN); 214 | } else { 215 | PORTA &= ~(1 << DATA_PIN); 216 | } 217 | 218 | // Toggle CLOCK_PIN to transmit the bit 219 | PORTA |= (1 << CLOCK_PIN); 220 | _delay_ms(50); 221 | PORTA &= ~(1 << CLOCK_PIN); 222 | _delay_ms(50); 223 | } 224 | 225 | // Function to transmit a 8-bit value to Raspberry Pi 226 | void BitBang(uint8_t value) { 227 | // Transmit each bit (MSB first) 228 | // Toggle START_PIN to transmit the bytes 229 | PORTA |= (1 << CLOCK_PIN); 230 | _delay_ms(50); 231 | PORTA |= (1 << START_PIN); 232 | _delay_ms(50); 233 | PORTA &= ~(1 << START_PIN); 234 | _delay_ms(50); 235 | 236 | 237 | for (uint8_t i = 8; i > 0; i--) { 238 | uint8_t bit = (value >> i) & 0x01; 239 | transmitBit(bit); 240 | } 241 | } 242 | 243 | uint8_t BitShiftVoltage(uint16_t battery_voltage) { 244 | // Shift the voltage down by one place (divide by 2) 245 | uint16_t shifted_voltage = battery_voltage >> 1; 246 | 247 | // Ensure the value fits into a uint8_t 248 | uint8_t result; 249 | if (shifted_voltage > UINT8_MAX) { 250 | result = UINT8_MAX; // If overflow, set to the maximum value of uint8_t 251 | } else { 252 | result = (uint8_t)shifted_voltage; 253 | } 254 | 255 | return result; 256 | } 257 | 258 | int main( void ) { 259 | 260 | set_pins(); 261 | uint16_t battery_voltage; 262 | uint8_t shifted_voltage; 263 | Blink_LEDs(); 264 | bool expert_mode = false; 265 | 266 | while(1) { 267 | 268 | battery_voltage = get_voltage_from_adc(); 269 | if (is_Pi_Power_On()) { 270 | expert_mode = has_Pi_ever_entered_expert_mode(); 271 | if (expert_mode == true) { 272 | if (is_Pi_Booted()) { 273 | if (is_Pi_ready_for_data()) { 274 | PORTA |= (1 << ACTIVE); 275 | shifted_voltage = BitShiftVoltage(battery_voltage); 276 | BitBang(shifted_voltage); 277 | _delay_ms(100); 278 | } 279 | else { 280 | PORTA &= ~(1 << ACTIVE); // set the LED to low 281 | } 282 | } 283 | else { 284 | graceful_shutdown(); 285 | turn_off_pi(); 286 | Blink_LEDs(); 287 | } 288 | 289 | } 290 | else { 291 | // We are not in expert mode 292 | } 293 | } 294 | else { // The Pi must be off 295 | if (battery_voltage > 375) { 296 | turn_on_pi(); 297 | } 298 | else if (battery_voltage < 345) { 299 | graceful_shutdown(); 300 | turn_off_pi(); 301 | } 302 | else { 303 | //Do nothing 304 | } 305 | } 306 | } 307 | } 308 | -------------------------------------------------------------------------------- /PCBs/PhotonPowerZeroSchematic_Informational_Only.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "board_outline_line_width": 0.1, 7 | "copper_line_width": 0.2, 8 | "copper_text_size_h": 1.5, 9 | "copper_text_size_v": 1.5, 10 | "copper_text_thickness": 0.3, 11 | "other_line_width": 0.15, 12 | "silk_line_width": 0.15, 13 | "silk_text_size_h": 1.0, 14 | "silk_text_size_v": 1.0, 15 | "silk_text_thickness": 0.15 16 | }, 17 | "diff_pair_dimensions": [], 18 | "drc_exclusions": [], 19 | "rules": { 20 | "min_copper_edge_clearance": 0.0, 21 | "solder_mask_clearance": 0.0, 22 | "solder_mask_min_width": 0.0 23 | }, 24 | "track_widths": [], 25 | "via_dimensions": [] 26 | }, 27 | "ipc2581": { 28 | "dist": "", 29 | "distpn": "", 30 | "internal_id": "", 31 | "mfg": "", 32 | "mpn": "" 33 | }, 34 | "layer_presets": [], 35 | "viewports": [] 36 | }, 37 | "boards": [], 38 | "cvpcb": { 39 | "equivalence_files": [] 40 | }, 41 | "erc": { 42 | "erc_exclusions": [], 43 | "meta": { 44 | "version": 0 45 | }, 46 | "pin_map": [ 47 | [ 48 | 0, 49 | 0, 50 | 0, 51 | 0, 52 | 0, 53 | 0, 54 | 1, 55 | 0, 56 | 0, 57 | 0, 58 | 0, 59 | 2 60 | ], 61 | [ 62 | 0, 63 | 2, 64 | 0, 65 | 1, 66 | 0, 67 | 0, 68 | 1, 69 | 0, 70 | 2, 71 | 2, 72 | 2, 73 | 2 74 | ], 75 | [ 76 | 0, 77 | 0, 78 | 0, 79 | 0, 80 | 0, 81 | 0, 82 | 1, 83 | 0, 84 | 1, 85 | 0, 86 | 1, 87 | 2 88 | ], 89 | [ 90 | 0, 91 | 1, 92 | 0, 93 | 0, 94 | 0, 95 | 0, 96 | 1, 97 | 1, 98 | 2, 99 | 1, 100 | 1, 101 | 2 102 | ], 103 | [ 104 | 0, 105 | 0, 106 | 0, 107 | 0, 108 | 0, 109 | 0, 110 | 1, 111 | 0, 112 | 0, 113 | 0, 114 | 0, 115 | 2 116 | ], 117 | [ 118 | 0, 119 | 0, 120 | 0, 121 | 0, 122 | 0, 123 | 0, 124 | 0, 125 | 0, 126 | 0, 127 | 0, 128 | 0, 129 | 2 130 | ], 131 | [ 132 | 1, 133 | 1, 134 | 1, 135 | 1, 136 | 1, 137 | 0, 138 | 1, 139 | 1, 140 | 1, 141 | 1, 142 | 1, 143 | 2 144 | ], 145 | [ 146 | 0, 147 | 0, 148 | 0, 149 | 1, 150 | 0, 151 | 0, 152 | 1, 153 | 0, 154 | 0, 155 | 0, 156 | 0, 157 | 2 158 | ], 159 | [ 160 | 0, 161 | 2, 162 | 1, 163 | 2, 164 | 0, 165 | 0, 166 | 1, 167 | 0, 168 | 2, 169 | 2, 170 | 2, 171 | 2 172 | ], 173 | [ 174 | 0, 175 | 2, 176 | 0, 177 | 1, 178 | 0, 179 | 0, 180 | 1, 181 | 0, 182 | 2, 183 | 0, 184 | 0, 185 | 2 186 | ], 187 | [ 188 | 0, 189 | 2, 190 | 1, 191 | 1, 192 | 0, 193 | 0, 194 | 1, 195 | 0, 196 | 2, 197 | 0, 198 | 0, 199 | 2 200 | ], 201 | [ 202 | 2, 203 | 2, 204 | 2, 205 | 2, 206 | 2, 207 | 2, 208 | 2, 209 | 2, 210 | 2, 211 | 2, 212 | 2, 213 | 2 214 | ] 215 | ], 216 | "rule_severities": { 217 | "bus_definition_conflict": "error", 218 | "bus_entry_needed": "error", 219 | "bus_to_bus_conflict": "error", 220 | "bus_to_net_conflict": "error", 221 | "conflicting_netclasses": "error", 222 | "different_unit_footprint": "error", 223 | "different_unit_net": "error", 224 | "duplicate_reference": "error", 225 | "duplicate_sheet_names": "error", 226 | "endpoint_off_grid": "warning", 227 | "extra_units": "error", 228 | "global_label_dangling": "warning", 229 | "hier_label_mismatch": "error", 230 | "label_dangling": "error", 231 | "lib_symbol_issues": "warning", 232 | "missing_bidi_pin": "warning", 233 | "missing_input_pin": "warning", 234 | "missing_power_pin": "error", 235 | "missing_unit": "warning", 236 | "multiple_net_names": "warning", 237 | "net_not_bus_member": "warning", 238 | "no_connect_connected": "warning", 239 | "no_connect_dangling": "warning", 240 | "pin_not_connected": "error", 241 | "pin_not_driven": "error", 242 | "pin_to_pin": "error", 243 | "power_pin_not_driven": "error", 244 | "similar_labels": "warning", 245 | "simulation_model_issue": "ignore", 246 | "unannotated": "error", 247 | "unit_value_mismatch": "error", 248 | "unresolved_variable": "error", 249 | "wire_dangling": "error" 250 | } 251 | }, 252 | "libraries": { 253 | "pinned_footprint_libs": [], 254 | "pinned_symbol_libs": [] 255 | }, 256 | "meta": { 257 | "filename": "PhotonPowerZeroSchematic_Informational_Only.kicad_pro", 258 | "version": 1 259 | }, 260 | "net_settings": { 261 | "classes": [ 262 | { 263 | "bus_width": 12, 264 | "clearance": 0.2, 265 | "diff_pair_gap": 0.25, 266 | "diff_pair_via_gap": 0.25, 267 | "diff_pair_width": 0.2, 268 | "line_style": 0, 269 | "microvia_diameter": 0.3, 270 | "microvia_drill": 0.1, 271 | "name": "Default", 272 | "pcb_color": "rgba(0, 0, 0, 0.000)", 273 | "schematic_color": "rgba(0, 0, 0, 0.000)", 274 | "track_width": 0.25, 275 | "via_diameter": 0.8, 276 | "via_drill": 0.4, 277 | "wire_width": 6 278 | } 279 | ], 280 | "meta": { 281 | "version": 3 282 | }, 283 | "net_colors": null, 284 | "netclass_assignments": null, 285 | "netclass_patterns": [] 286 | }, 287 | "pcbnew": { 288 | "last_paths": { 289 | "gencad": "", 290 | "idf": "", 291 | "netlist": "", 292 | "plot": "", 293 | "pos_files": "", 294 | "specctra_dsn": "", 295 | "step": "", 296 | "svg": "", 297 | "vrml": "" 298 | }, 299 | "page_layout_descr_file": "" 300 | }, 301 | "schematic": { 302 | "annotate_start_num": 0, 303 | "bom_fmt_presets": [], 304 | "bom_fmt_settings": { 305 | "field_delimiter": ",", 306 | "keep_line_breaks": false, 307 | "keep_tabs": false, 308 | "name": "CSV", 309 | "ref_delimiter": ",", 310 | "ref_range_delimiter": "", 311 | "string_delimiter": "\"" 312 | }, 313 | "bom_presets": [], 314 | "bom_settings": { 315 | "exclude_dnp": false, 316 | "fields_ordered": [ 317 | { 318 | "group_by": false, 319 | "label": "Reference", 320 | "name": "Reference", 321 | "show": true 322 | }, 323 | { 324 | "group_by": true, 325 | "label": "Value", 326 | "name": "Value", 327 | "show": true 328 | }, 329 | { 330 | "group_by": false, 331 | "label": "Datasheet", 332 | "name": "Datasheet", 333 | "show": true 334 | }, 335 | { 336 | "group_by": false, 337 | "label": "Footprint", 338 | "name": "Footprint", 339 | "show": true 340 | }, 341 | { 342 | "group_by": false, 343 | "label": "Qty", 344 | "name": "${QUANTITY}", 345 | "show": true 346 | }, 347 | { 348 | "group_by": true, 349 | "label": "DNP", 350 | "name": "${DNP}", 351 | "show": true 352 | } 353 | ], 354 | "filter_string": "", 355 | "group_symbols": true, 356 | "name": "Grouped By Value", 357 | "sort_asc": true, 358 | "sort_field": "Reference" 359 | }, 360 | "connection_grid_size": 50.0, 361 | "drawing": { 362 | "dashed_lines_dash_length_ratio": 12.0, 363 | "dashed_lines_gap_length_ratio": 3.0, 364 | "default_line_thickness": 6.0, 365 | "default_text_size": 50.0, 366 | "field_names": [], 367 | "intersheets_ref_own_page": false, 368 | "intersheets_ref_prefix": "", 369 | "intersheets_ref_short": false, 370 | "intersheets_ref_show": false, 371 | "intersheets_ref_suffix": "", 372 | "junction_size_choice": 3, 373 | "label_size_ratio": 0.375, 374 | "operating_point_overlay_i_precision": 3, 375 | "operating_point_overlay_i_range": "~A", 376 | "operating_point_overlay_v_precision": 3, 377 | "operating_point_overlay_v_range": "~V", 378 | "overbar_offset_ratio": 1.23, 379 | "pin_symbol_size": 25.0, 380 | "text_offset_ratio": 0.15 381 | }, 382 | "legacy_lib_dir": "", 383 | "legacy_lib_list": [], 384 | "meta": { 385 | "version": 1 386 | }, 387 | "net_format_name": "", 388 | "ngspice": { 389 | "fix_include_paths": true, 390 | "meta": { 391 | "version": 0 392 | }, 393 | "model_mode": 0, 394 | "workbook_filename": "" 395 | }, 396 | "page_layout_descr_file": "", 397 | "plot_directory": "", 398 | "spice_current_sheet_as_root": false, 399 | "spice_external_command": "spice \"%I\"", 400 | "spice_model_current_sheet_as_root": true, 401 | "spice_save_all_currents": false, 402 | "spice_save_all_dissipations": false, 403 | "spice_save_all_voltages": false, 404 | "subpart_first_id": 65, 405 | "subpart_id_separator": 0 406 | }, 407 | "sheets": [ 408 | [ 409 | "f78535eb-67d8-4c38-99b2-01c1a75a3756", 410 | "Root" 411 | ] 412 | ], 413 | "text_variables": {} 414 | } 415 | -------------------------------------------------------------------------------- /PCBs/Photon_Power_Zero_PCB_r1_02.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.05, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.1, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 1.0, 41 | "height": 1.7, 42 | "width": 1.7 43 | }, 44 | "silk_line_width": 0.1, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.1, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "45_degree_only": false, 52 | "min_clearance": 0.5 53 | } 54 | }, 55 | "diff_pair_dimensions": [ 56 | { 57 | "gap": 0.0, 58 | "via_gap": 0.0, 59 | "width": 0.0 60 | } 61 | ], 62 | "drc_exclusions": [], 63 | "meta": { 64 | "version": 2 65 | }, 66 | "rule_severities": { 67 | "annular_width": "error", 68 | "clearance": "error", 69 | "connection_width": "warning", 70 | "copper_edge_clearance": "error", 71 | "copper_sliver": "warning", 72 | "courtyards_overlap": "error", 73 | "creepage": "error", 74 | "diff_pair_gap_out_of_range": "error", 75 | "diff_pair_uncoupled_length_too_long": "error", 76 | "drill_out_of_range": "error", 77 | "duplicate_footprints": "warning", 78 | "extra_footprint": "warning", 79 | "footprint": "error", 80 | "footprint_filters_mismatch": "ignore", 81 | "footprint_symbol_mismatch": "warning", 82 | "footprint_type_mismatch": "ignore", 83 | "hole_clearance": "error", 84 | "hole_near_hole": "error", 85 | "hole_to_hole": "error", 86 | "holes_co_located": "warning", 87 | "invalid_outline": "error", 88 | "isolated_copper": "warning", 89 | "item_on_disabled_layer": "error", 90 | "items_not_allowed": "error", 91 | "length_out_of_range": "error", 92 | "lib_footprint_issues": "ignore", 93 | "lib_footprint_mismatch": "warning", 94 | "malformed_courtyard": "error", 95 | "microvia_drill_out_of_range": "error", 96 | "mirrored_text_on_front_layer": "warning", 97 | "missing_courtyard": "ignore", 98 | "missing_footprint": "warning", 99 | "net_conflict": "warning", 100 | "nonmirrored_text_on_back_layer": "warning", 101 | "npth_inside_courtyard": "ignore", 102 | "padstack": "warning", 103 | "pth_inside_courtyard": "ignore", 104 | "shorting_items": "error", 105 | "silk_edge_clearance": "warning", 106 | "silk_over_copper": "warning", 107 | "silk_overlap": "warning", 108 | "skew_out_of_range": "error", 109 | "solder_mask_bridge": "ignore", 110 | "starved_thermal": "error", 111 | "text_height": "warning", 112 | "text_on_edge_cuts": "error", 113 | "text_thickness": "warning", 114 | "through_hole_pad_without_hole": "error", 115 | "too_many_vias": "error", 116 | "track_angle": "error", 117 | "track_dangling": "warning", 118 | "track_segment_length": "error", 119 | "track_width": "error", 120 | "tracks_crossing": "error", 121 | "unconnected_items": "error", 122 | "unresolved_variable": "error", 123 | "via_dangling": "warning", 124 | "zone_has_empty_net": "error", 125 | "zones_intersect": "error" 126 | }, 127 | "rules": { 128 | "allow_blind_buried_vias": false, 129 | "allow_microvias": false, 130 | "max_error": 0.005, 131 | "min_clearance": 0.0, 132 | "min_connection": 0.0, 133 | "min_copper_edge_clearance": 0.1, 134 | "min_groove_width": 0.0, 135 | "min_hole_clearance": 0.1, 136 | "min_hole_to_hole": 0.15, 137 | "min_microvia_diameter": 0.2, 138 | "min_microvia_drill": 0.1, 139 | "min_resolved_spokes": 2, 140 | "min_silk_clearance": 0.0, 141 | "min_text_height": 0.5, 142 | "min_text_thickness": 0.08, 143 | "min_through_hole_diameter": 0.15, 144 | "min_track_width": 0.2, 145 | "min_via_annular_width": 0.1, 146 | "min_via_diameter": 0.5, 147 | "solder_mask_to_copper_clearance": 0.0, 148 | "use_height_for_length_calcs": true 149 | }, 150 | "teardrop_options": [ 151 | { 152 | "td_onpthpad": true, 153 | "td_onroundshapesonly": false, 154 | "td_onsmdpad": true, 155 | "td_ontrackend": false, 156 | "td_onvia": true 157 | } 158 | ], 159 | "teardrop_parameters": [ 160 | { 161 | "td_allow_use_two_tracks": true, 162 | "td_curve_segcount": 0, 163 | "td_height_ratio": 1.0, 164 | "td_length_ratio": 0.5, 165 | "td_maxheight": 2.0, 166 | "td_maxlen": 1.0, 167 | "td_on_pad_in_zone": false, 168 | "td_target_name": "td_round_shape", 169 | "td_width_to_size_filter_ratio": 0.9 170 | }, 171 | { 172 | "td_allow_use_two_tracks": true, 173 | "td_curve_segcount": 0, 174 | "td_height_ratio": 1.0, 175 | "td_length_ratio": 0.5, 176 | "td_maxheight": 2.0, 177 | "td_maxlen": 1.0, 178 | "td_on_pad_in_zone": false, 179 | "td_target_name": "td_rect_shape", 180 | "td_width_to_size_filter_ratio": 0.9 181 | }, 182 | { 183 | "td_allow_use_two_tracks": true, 184 | "td_curve_segcount": 0, 185 | "td_height_ratio": 1.0, 186 | "td_length_ratio": 0.5, 187 | "td_maxheight": 2.0, 188 | "td_maxlen": 1.0, 189 | "td_on_pad_in_zone": false, 190 | "td_target_name": "td_track_end", 191 | "td_width_to_size_filter_ratio": 0.9 192 | } 193 | ], 194 | "track_widths": [ 195 | 0.0 196 | ], 197 | "tuning_pattern_settings": { 198 | "diff_pair_defaults": { 199 | "corner_radius_percentage": 80, 200 | "corner_style": 1, 201 | "max_amplitude": 1.0, 202 | "min_amplitude": 0.2, 203 | "single_sided": false, 204 | "spacing": 1.0 205 | }, 206 | "diff_pair_skew_defaults": { 207 | "corner_radius_percentage": 80, 208 | "corner_style": 1, 209 | "max_amplitude": 1.0, 210 | "min_amplitude": 0.2, 211 | "single_sided": false, 212 | "spacing": 0.6 213 | }, 214 | "single_track_defaults": { 215 | "corner_radius_percentage": 80, 216 | "corner_style": 1, 217 | "max_amplitude": 1.0, 218 | "min_amplitude": 0.2, 219 | "single_sided": false, 220 | "spacing": 0.6 221 | } 222 | }, 223 | "via_dimensions": [ 224 | { 225 | "diameter": 0.0, 226 | "drill": 0.0 227 | } 228 | ], 229 | "zones_allow_external_fillets": false, 230 | "zones_use_no_outline": true 231 | }, 232 | "ipc2581": { 233 | "dist": "", 234 | "distpn": "", 235 | "internal_id": "", 236 | "mfg": "", 237 | "mpn": "" 238 | }, 239 | "layer_pairs": [], 240 | "layer_presets": [], 241 | "viewports": [] 242 | }, 243 | "boards": [], 244 | "cvpcb": { 245 | "equivalence_files": [] 246 | }, 247 | "libraries": { 248 | "pinned_footprint_libs": [], 249 | "pinned_symbol_libs": [] 250 | }, 251 | "meta": { 252 | "filename": "Photon_Power_Zero_PCB_r1_02.kicad_pro", 253 | "version": 3 254 | }, 255 | "net_settings": { 256 | "classes": [ 257 | { 258 | "bus_width": 12, 259 | "clearance": 0.1, 260 | "diff_pair_gap": 0.25, 261 | "diff_pair_via_gap": 0.25, 262 | "diff_pair_width": 0.2, 263 | "line_style": 0, 264 | "microvia_diameter": 0.3, 265 | "microvia_drill": 0.1, 266 | "name": "Default", 267 | "pcb_color": "rgba(0, 0, 0, 0.000)", 268 | "priority": 2147483647, 269 | "schematic_color": "rgba(0, 0, 0, 0.000)", 270 | "track_width": 0.2, 271 | "via_diameter": 0.6, 272 | "via_drill": 0.3, 273 | "wire_width": 6 274 | } 275 | ], 276 | "meta": { 277 | "version": 4 278 | }, 279 | "net_colors": null, 280 | "netclass_assignments": null, 281 | "netclass_patterns": [] 282 | }, 283 | "pcbnew": { 284 | "last_paths": { 285 | "gencad": "", 286 | "idf": "", 287 | "netlist": "", 288 | "plot": "/home/david/PhotonPowerZero/PCBs/gerbers/", 289 | "pos_files": "", 290 | "specctra_dsn": "", 291 | "step": "", 292 | "svg": "", 293 | "vrml": "" 294 | }, 295 | "page_layout_descr_file": "" 296 | }, 297 | "schematic": { 298 | "legacy_lib_dir": "", 299 | "legacy_lib_list": [] 300 | }, 301 | "sheets": [], 302 | "text_variables": {} 303 | } 304 | -------------------------------------------------------------------------------- /PCBs/Photon_Power_Zero_PCB_r1_01.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.05, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.1, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 0.762, 41 | "height": 1.524, 42 | "width": 1.524 43 | }, 44 | "silk_line_width": 0.1, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.1, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "45_degree_only": false, 52 | "min_clearance": 0.5 53 | } 54 | }, 55 | "diff_pair_dimensions": [ 56 | { 57 | "gap": 0.0, 58 | "via_gap": 0.0, 59 | "width": 0.0 60 | } 61 | ], 62 | "drc_exclusions": [], 63 | "meta": { 64 | "version": 2 65 | }, 66 | "rule_severities": { 67 | "annular_width": "error", 68 | "clearance": "error", 69 | "connection_width": "warning", 70 | "copper_edge_clearance": "error", 71 | "copper_sliver": "warning", 72 | "courtyards_overlap": "error", 73 | "creepage": "error", 74 | "diff_pair_gap_out_of_range": "error", 75 | "diff_pair_uncoupled_length_too_long": "error", 76 | "drill_out_of_range": "error", 77 | "duplicate_footprints": "warning", 78 | "extra_footprint": "warning", 79 | "footprint": "error", 80 | "footprint_filters_mismatch": "ignore", 81 | "footprint_symbol_mismatch": "warning", 82 | "footprint_type_mismatch": "ignore", 83 | "hole_clearance": "error", 84 | "hole_near_hole": "error", 85 | "hole_to_hole": "error", 86 | "holes_co_located": "warning", 87 | "invalid_outline": "error", 88 | "isolated_copper": "warning", 89 | "item_on_disabled_layer": "error", 90 | "items_not_allowed": "error", 91 | "length_out_of_range": "error", 92 | "lib_footprint_issues": "ignore", 93 | "lib_footprint_mismatch": "warning", 94 | "malformed_courtyard": "error", 95 | "microvia_drill_out_of_range": "error", 96 | "mirrored_text_on_front_layer": "warning", 97 | "missing_courtyard": "ignore", 98 | "missing_footprint": "warning", 99 | "net_conflict": "warning", 100 | "nonmirrored_text_on_back_layer": "warning", 101 | "npth_inside_courtyard": "ignore", 102 | "padstack": "warning", 103 | "pth_inside_courtyard": "ignore", 104 | "shorting_items": "error", 105 | "silk_edge_clearance": "warning", 106 | "silk_over_copper": "warning", 107 | "silk_overlap": "warning", 108 | "skew_out_of_range": "error", 109 | "solder_mask_bridge": "ignore", 110 | "starved_thermal": "error", 111 | "text_height": "warning", 112 | "text_on_edge_cuts": "error", 113 | "text_thickness": "warning", 114 | "through_hole_pad_without_hole": "error", 115 | "too_many_vias": "error", 116 | "track_angle": "error", 117 | "track_dangling": "warning", 118 | "track_segment_length": "error", 119 | "track_width": "error", 120 | "tracks_crossing": "error", 121 | "unconnected_items": "error", 122 | "unresolved_variable": "error", 123 | "via_dangling": "warning", 124 | "zone_has_empty_net": "error", 125 | "zones_intersect": "error" 126 | }, 127 | "rules": { 128 | "allow_blind_buried_vias": false, 129 | "allow_microvias": false, 130 | "max_error": 0.005, 131 | "min_clearance": 0.0, 132 | "min_connection": 0.0, 133 | "min_copper_edge_clearance": 0.1, 134 | "min_groove_width": 0.0, 135 | "min_hole_clearance": 0.1, 136 | "min_hole_to_hole": 0.15, 137 | "min_microvia_diameter": 0.2, 138 | "min_microvia_drill": 0.1, 139 | "min_resolved_spokes": 2, 140 | "min_silk_clearance": 0.0, 141 | "min_text_height": 0.5, 142 | "min_text_thickness": 0.08, 143 | "min_through_hole_diameter": 0.15, 144 | "min_track_width": 0.2, 145 | "min_via_annular_width": 0.1, 146 | "min_via_diameter": 0.5, 147 | "solder_mask_to_copper_clearance": 0.0, 148 | "use_height_for_length_calcs": true 149 | }, 150 | "teardrop_options": [ 151 | { 152 | "td_onpthpad": true, 153 | "td_onroundshapesonly": false, 154 | "td_onsmdpad": true, 155 | "td_ontrackend": false, 156 | "td_onvia": true 157 | } 158 | ], 159 | "teardrop_parameters": [ 160 | { 161 | "td_allow_use_two_tracks": true, 162 | "td_curve_segcount": 0, 163 | "td_height_ratio": 1.0, 164 | "td_length_ratio": 0.5, 165 | "td_maxheight": 2.0, 166 | "td_maxlen": 1.0, 167 | "td_on_pad_in_zone": false, 168 | "td_target_name": "td_round_shape", 169 | "td_width_to_size_filter_ratio": 0.9 170 | }, 171 | { 172 | "td_allow_use_two_tracks": true, 173 | "td_curve_segcount": 0, 174 | "td_height_ratio": 1.0, 175 | "td_length_ratio": 0.5, 176 | "td_maxheight": 2.0, 177 | "td_maxlen": 1.0, 178 | "td_on_pad_in_zone": false, 179 | "td_target_name": "td_rect_shape", 180 | "td_width_to_size_filter_ratio": 0.9 181 | }, 182 | { 183 | "td_allow_use_two_tracks": true, 184 | "td_curve_segcount": 0, 185 | "td_height_ratio": 1.0, 186 | "td_length_ratio": 0.5, 187 | "td_maxheight": 2.0, 188 | "td_maxlen": 1.0, 189 | "td_on_pad_in_zone": false, 190 | "td_target_name": "td_track_end", 191 | "td_width_to_size_filter_ratio": 0.9 192 | } 193 | ], 194 | "track_widths": [ 195 | 0.0 196 | ], 197 | "tuning_pattern_settings": { 198 | "diff_pair_defaults": { 199 | "corner_radius_percentage": 80, 200 | "corner_style": 1, 201 | "max_amplitude": 1.0, 202 | "min_amplitude": 0.2, 203 | "single_sided": false, 204 | "spacing": 1.0 205 | }, 206 | "diff_pair_skew_defaults": { 207 | "corner_radius_percentage": 80, 208 | "corner_style": 1, 209 | "max_amplitude": 1.0, 210 | "min_amplitude": 0.2, 211 | "single_sided": false, 212 | "spacing": 0.6 213 | }, 214 | "single_track_defaults": { 215 | "corner_radius_percentage": 80, 216 | "corner_style": 1, 217 | "max_amplitude": 1.0, 218 | "min_amplitude": 0.2, 219 | "single_sided": false, 220 | "spacing": 0.6 221 | } 222 | }, 223 | "via_dimensions": [ 224 | { 225 | "diameter": 0.0, 226 | "drill": 0.0 227 | } 228 | ], 229 | "zones_allow_external_fillets": false, 230 | "zones_use_no_outline": true 231 | }, 232 | "ipc2581": { 233 | "dist": "", 234 | "distpn": "", 235 | "internal_id": "", 236 | "mfg": "", 237 | "mpn": "" 238 | }, 239 | "layer_pairs": [], 240 | "layer_presets": [], 241 | "viewports": [] 242 | }, 243 | "boards": [], 244 | "cvpcb": { 245 | "equivalence_files": [] 246 | }, 247 | "libraries": { 248 | "pinned_footprint_libs": [], 249 | "pinned_symbol_libs": [] 250 | }, 251 | "meta": { 252 | "filename": "Photon_Power_Zero_PCB_r1_01.kicad_pro", 253 | "version": 3 254 | }, 255 | "net_settings": { 256 | "classes": [ 257 | { 258 | "bus_width": 12, 259 | "clearance": 0.1, 260 | "diff_pair_gap": 0.25, 261 | "diff_pair_via_gap": 0.25, 262 | "diff_pair_width": 0.2, 263 | "line_style": 0, 264 | "microvia_diameter": 0.3, 265 | "microvia_drill": 0.1, 266 | "name": "Default", 267 | "pcb_color": "rgba(0, 0, 0, 0.000)", 268 | "priority": 2147483647, 269 | "schematic_color": "rgba(0, 0, 0, 0.000)", 270 | "track_width": 0.2, 271 | "via_diameter": 0.6, 272 | "via_drill": 0.3, 273 | "wire_width": 6 274 | } 275 | ], 276 | "meta": { 277 | "version": 4 278 | }, 279 | "net_colors": null, 280 | "netclass_assignments": null, 281 | "netclass_patterns": [] 282 | }, 283 | "pcbnew": { 284 | "last_paths": { 285 | "gencad": "", 286 | "idf": "", 287 | "netlist": "", 288 | "plot": "/home/david/PhotonPowerZero/PCBs/gerbers/", 289 | "pos_files": "", 290 | "specctra_dsn": "", 291 | "step": "", 292 | "svg": "", 293 | "vrml": "" 294 | }, 295 | "page_layout_descr_file": "" 296 | }, 297 | "schematic": { 298 | "legacy_lib_dir": "", 299 | "legacy_lib_list": [] 300 | }, 301 | "sheets": [], 302 | "text_variables": {} 303 | } 304 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | Preamble 4 | 5 | CERN has developed this licence to promote collaboration among 6 | hardware designers and to provide a legal tool which supports the 7 | freedom to use, study, modify, share and distribute hardware designs 8 | and products based on those designs. Version 2 of the CERN Open 9 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 10 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 11 | licence, CERN-OHL-S (strongly reciprocal). 12 | 13 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 14 | unmodified form only. 15 | 16 | Use of this Licence does not imply any endorsement by CERN of any 17 | Licensor or their designs nor does it imply any involvement by CERN in 18 | their development. 19 | 20 | 1 Definitions 21 | 22 | 1.1 'Licence' means this CERN-OHL-S. 23 | 24 | 1.2 'Compatible Licence' means 25 | 26 | a) any earlier version of the CERN Open Hardware licence, or 27 | 28 | b) any version of the CERN-OHL-S, or 29 | 30 | c) any licence which permits You to treat the Source to which 31 | it applies as licensed under CERN-OHL-S provided that on 32 | Conveyance of any such Source, or any associated Product You 33 | treat the Source in question as being licensed under 34 | CERN-OHL-S. 35 | 36 | 1.3 'Source' means information such as design materials or digital 37 | code which can be applied to Make or test a Product or to 38 | prepare a Product for use, Conveyance or sale, regardless of its 39 | medium or how it is expressed. It may include Notices. 40 | 41 | 1.4 'Covered Source' means Source that is explicitly made available 42 | under this Licence. 43 | 44 | 1.5 'Product' means any device, component, work or physical object, 45 | whether in finished or intermediate form, arising from the use, 46 | application or processing of Covered Source. 47 | 48 | 1.6 'Make' means to create or configure something, whether by 49 | manufacture, assembly, compiling, loading or applying Covered 50 | Source or another Product or otherwise. 51 | 52 | 1.7 'Available Component' means any part, sub-assembly, library or 53 | code which: 54 | 55 | a) is licensed to You as Complete Source under a Compatible 56 | Licence; or 57 | 58 | b) is available, at the time a Product or the Source containing 59 | it is first Conveyed, to You and any other prospective 60 | licensees 61 | 62 | i) as a physical part with sufficient rights and 63 | information (including any configuration and 64 | programming files and information about its 65 | characteristics and interfaces) to enable it either to 66 | be Made itself, or to be sourced and used to Make the 67 | Product; or 68 | ii) as part of the normal distribution of a tool used to 69 | design or Make the Product. 70 | 71 | 1.8 'Complete Source' means the set of all Source necessary to Make 72 | a Product, in the preferred form for making modifications, 73 | including necessary installation and interfacing information 74 | both for the Product, and for any included Available Components. 75 | If the format is proprietary, it must also be made available in 76 | a format (if the proprietary tool can create it) which is 77 | viewable with a tool available to potential licensees and 78 | licensed under a licence approved by the Free Software 79 | Foundation or the Open Source Initiative. Complete Source need 80 | not include the Source of any Available Component, provided that 81 | You include in the Complete Source sufficient information to 82 | enable a recipient to Make or source and use the Available 83 | Component to Make the Product. 84 | 85 | 1.9 'Source Location' means a location where a Licensor has placed 86 | Covered Source, and which that Licensor reasonably believes will 87 | remain easily accessible for at least three years for anyone to 88 | obtain a digital copy. 89 | 90 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 91 | Source Location references, modification notices (subsection 92 | 3.3(b)) and all notices that refer to this Licence and to the 93 | disclaimer of warranties that are included in the Covered 94 | Source. 95 | 96 | 1.11 'Licensee' or 'You' means any person exercising rights under 97 | this Licence. 98 | 99 | 1.12 'Licensor' means a natural or legal person who creates or 100 | modifies Covered Source. A person may be a Licensee and a 101 | Licensor at the same time. 102 | 103 | 1.13 'Convey' means to communicate to the public or distribute. 104 | 105 | 106 | 2 Applicability 107 | 108 | 2.1 This Licence governs the use, copying, modification, Conveying 109 | of Covered Source and Products, and the Making of Products. By 110 | exercising any right granted under this Licence, You irrevocably 111 | accept these terms and conditions. 112 | 113 | 2.2 This Licence is granted by the Licensor directly to You, and 114 | shall apply worldwide and without limitation in time. 115 | 116 | 2.3 You shall not attempt to restrict by contract or otherwise the 117 | rights granted under this Licence to other Licensees. 118 | 119 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 120 | or any other similar right. 121 | 122 | 123 | 3 Copying, Modifying and Conveying Covered Source 124 | 125 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 126 | any medium, provided You retain all Notices. 127 | 128 | 3.2 You may modify Covered Source, other than Notices, provided that 129 | You irrevocably undertake to make that modified Covered Source 130 | available from a Source Location should You Convey a Product in 131 | circumstances where the recipient does not otherwise receive a 132 | copy of the modified Covered Source. In each case subsection 3.3 133 | shall apply. 134 | 135 | You may only delete Notices if they are no longer applicable to 136 | the corresponding Covered Source as modified by You and You may 137 | add additional Notices applicable to Your modifications. 138 | Including Covered Source in a larger work is modifying the 139 | Covered Source, and the larger work becomes modified Covered 140 | Source. 141 | 142 | 3.3 You may Convey modified Covered Source (with the effect that You 143 | shall also become a Licensor) provided that You: 144 | 145 | a) retain Notices as required in subsection 3.2; 146 | 147 | b) add a Notice to the modified Covered Source stating that You 148 | have modified it, with the date and brief description of how 149 | You have modified it; 150 | 151 | c) add a Source Location Notice for the modified Covered Source 152 | if You Convey in circumstances where the recipient does not 153 | otherwise receive a copy of the modified Covered Source; and 154 | 155 | d) license the modified Covered Source under the terms and 156 | conditions of this Licence (or, as set out in subsection 157 | 8.3, a later version, if permitted by the licence of the 158 | original Covered Source). Such modified Covered Source must 159 | be licensed as a whole, but excluding Available Components 160 | contained in it, which remain licensed under their own 161 | applicable licences. 162 | 163 | 164 | 4 Making and Conveying Products 165 | 166 | You may Make Products, and/or Convey them, provided that You either 167 | provide each recipient with a copy of the Complete Source or ensure 168 | that each recipient is notified of the Source Location of the Complete 169 | Source. That Complete Source is Covered Source, and You must 170 | accordingly satisfy Your obligations set out in subsection 3.3. If 171 | specified in a Notice, the Product must visibly and securely display 172 | the Source Location on it or its packaging or documentation in the 173 | manner specified in that Notice. 174 | 175 | 176 | 5 Research and Development 177 | 178 | You may Convey Covered Source, modified Covered Source or Products to 179 | a legal entity carrying out development, testing or quality assurance 180 | work on Your behalf provided that the work is performed on terms which 181 | prevent the entity from both using the Source or Products for its own 182 | internal purposes and Conveying the Source or Products or any 183 | modifications to them to any person other than You. Any modifications 184 | made by the entity shall be deemed to be made by You pursuant to 185 | subsection 3.2. 186 | 187 | 188 | 6 DISCLAIMER AND LIABILITY 189 | 190 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 191 | are provided 'as is' and any express or implied warranties, 192 | including, but not limited to, implied warranties of 193 | merchantability, of satisfactory quality, non-infringement of 194 | third party rights, and fitness for a particular purpose or use 195 | are disclaimed in respect of any Source or Product to the 196 | maximum extent permitted by law. The Licensor makes no 197 | representation that any Source or Product does not or will not 198 | infringe any patent, copyright, trade secret or other 199 | proprietary right. The entire risk as to the use, quality, and 200 | performance of any Source or Product shall be with You and not 201 | the Licensor. This disclaimer of warranty is an essential part 202 | of this Licence and a condition for the grant of any rights 203 | granted under this Licence. 204 | 205 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 206 | the maximum extent permitted by law, have no liability for 207 | direct, indirect, special, incidental, consequential, exemplary, 208 | punitive or other damages of any character including, without 209 | limitation, procurement of substitute goods or services, loss of 210 | use, data or profits, or business interruption, however caused 211 | and on any theory of contract, warranty, tort (including 212 | negligence), product liability or otherwise, arising in any way 213 | in relation to the Covered Source, modified Covered Source 214 | and/or the Making or Conveyance of a Product, even if advised of 215 | the possibility of such damages, and You shall hold the 216 | Licensor(s) free and harmless from any liability, costs, 217 | damages, fees and expenses, including claims by third parties, 218 | in relation to such use. 219 | 220 | 221 | 7 Patents 222 | 223 | 7.1 Subject to the terms and conditions of this Licence, each 224 | Licensor hereby grants to You a perpetual, worldwide, 225 | non-exclusive, no-charge, royalty-free, irrevocable (except as 226 | stated in subsections 7.2 and 8.4) patent licence to Make, have 227 | Made, use, offer to sell, sell, import, and otherwise transfer 228 | the Covered Source and Products, where such licence applies only 229 | to those patent claims licensable by such Licensor that are 230 | necessarily infringed by exercising rights under the Covered 231 | Source as Conveyed by that Licensor. 232 | 233 | 7.2 If You institute patent litigation against any entity (including 234 | a cross-claim or counterclaim in a lawsuit) alleging that the 235 | Covered Source or a Product constitutes direct or contributory 236 | patent infringement, or You seek any declaration that a patent 237 | licensed to You under this Licence is invalid or unenforceable 238 | then any rights granted to You under this Licence shall 239 | terminate as of the date such process is initiated. 240 | 241 | 242 | 8 General 243 | 244 | 8.1 If any provisions of this Licence are or subsequently become 245 | invalid or unenforceable for any reason, the remaining 246 | provisions shall remain effective. 247 | 248 | 8.2 You shall not use any of the name (including acronyms and 249 | abbreviations), image, or logo by which the Licensor or CERN is 250 | known, except where needed to comply with section 3, or where 251 | the use is otherwise allowed by law. Any such permitted use 252 | shall be factual and shall not be made so as to suggest any kind 253 | of endorsement or implication of involvement by the Licensor or 254 | its personnel. 255 | 256 | 8.3 CERN may publish updated versions and variants of this Licence 257 | which it considers to be in the spirit of this version, but may 258 | differ in detail to address new problems or concerns. New 259 | versions will be published with a unique version number and a 260 | variant identifier specifying the variant. If the Licensor has 261 | specified that a given variant applies to the Covered Source 262 | without specifying a version, You may treat that Covered Source 263 | as being released under any version of the CERN-OHL with that 264 | variant. If no variant is specified, the Covered Source shall be 265 | treated as being released under CERN-OHL-S. The Licensor may 266 | also specify that the Covered Source is subject to a specific 267 | version of the CERN-OHL or any later version in which case You 268 | may apply this or any later version of CERN-OHL with the same 269 | variant identifier published by CERN. 270 | 271 | 8.4 This Licence shall terminate with immediate effect if You fail 272 | to comply with any of its terms and conditions. 273 | 274 | 8.5 However, if You cease all breaches of this Licence, then Your 275 | Licence from any Licensor is reinstated unless such Licensor has 276 | terminated this Licence by giving You, while You remain in 277 | breach, a notice specifying the breach and requiring You to cure 278 | it within 30 days, and You have failed to come into compliance 279 | in all material respects by the end of the 30 day period. Should 280 | You repeat the breach after receipt of a cure notice and 281 | subsequent reinstatement, this Licence will terminate 282 | immediately and permanently. Section 6 shall continue to apply 283 | after any termination. 284 | 285 | 8.6 This Licence shall not be enforceable except by a Licensor 286 | acting as such, and third party beneficiary rights are 287 | specifically excluded. 288 | 289 | -------------------------------------------------------------------------------- /FDM/LICENSE: -------------------------------------------------------------------------------- 1 | CERN Open Hardware Licence Version 2 - Strongly Reciprocal 2 | 3 | 4 | Preamble 5 | 6 | CERN has developed this licence to promote collaboration among 7 | hardware designers and to provide a legal tool which supports the 8 | freedom to use, study, modify, share and distribute hardware designs 9 | and products based on those designs. Version 2 of the CERN Open 10 | Hardware Licence comes in three variants: CERN-OHL-P (permissive); and 11 | two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this 12 | licence, CERN-OHL-S (strongly reciprocal). 13 | 14 | The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in 15 | unmodified form only. 16 | 17 | Use of this Licence does not imply any endorsement by CERN of any 18 | Licensor or their designs nor does it imply any involvement by CERN in 19 | their development. 20 | 21 | 22 | 1 Definitions 23 | 24 | 1.1 'Licence' means this CERN-OHL-S. 25 | 26 | 1.2 'Compatible Licence' means 27 | 28 | a) any earlier version of the CERN Open Hardware licence, or 29 | 30 | b) any version of the CERN-OHL-S, or 31 | 32 | c) any licence which permits You to treat the Source to which 33 | it applies as licensed under CERN-OHL-S provided that on 34 | Conveyance of any such Source, or any associated Product You 35 | treat the Source in question as being licensed under 36 | CERN-OHL-S. 37 | 38 | 1.3 'Source' means information such as design materials or digital 39 | code which can be applied to Make or test a Product or to 40 | prepare a Product for use, Conveyance or sale, regardless of its 41 | medium or how it is expressed. It may include Notices. 42 | 43 | 1.4 'Covered Source' means Source that is explicitly made available 44 | under this Licence. 45 | 46 | 1.5 'Product' means any device, component, work or physical object, 47 | whether in finished or intermediate form, arising from the use, 48 | application or processing of Covered Source. 49 | 50 | 1.6 'Make' means to create or configure something, whether by 51 | manufacture, assembly, compiling, loading or applying Covered 52 | Source or another Product or otherwise. 53 | 54 | 1.7 'Available Component' means any part, sub-assembly, library or 55 | code which: 56 | 57 | a) is licensed to You as Complete Source under a Compatible 58 | Licence; or 59 | 60 | b) is available, at the time a Product or the Source containing 61 | it is first Conveyed, to You and any other prospective 62 | licensees 63 | 64 | i) as a physical part with sufficient rights and 65 | information (including any configuration and 66 | programming files and information about its 67 | characteristics and interfaces) to enable it either to 68 | be Made itself, or to be sourced and used to Make the 69 | Product; or 70 | ii) as part of the normal distribution of a tool used to 71 | design or Make the Product. 72 | 73 | 1.8 'Complete Source' means the set of all Source necessary to Make 74 | a Product, in the preferred form for making modifications, 75 | including necessary installation and interfacing information 76 | both for the Product, and for any included Available Components. 77 | If the format is proprietary, it must also be made available in 78 | a format (if the proprietary tool can create it) which is 79 | viewable with a tool available to potential licensees and 80 | licensed under a licence approved by the Free Software 81 | Foundation or the Open Source Initiative. Complete Source need 82 | not include the Source of any Available Component, provided that 83 | You include in the Complete Source sufficient information to 84 | enable a recipient to Make or source and use the Available 85 | Component to Make the Product. 86 | 87 | 1.9 'Source Location' means a location where a Licensor has placed 88 | Covered Source, and which that Licensor reasonably believes will 89 | remain easily accessible for at least three years for anyone to 90 | obtain a digital copy. 91 | 92 | 1.10 'Notice' means copyright, acknowledgement and trademark notices, 93 | Source Location references, modification notices (subsection 94 | 3.3(b)) and all notices that refer to this Licence and to the 95 | disclaimer of warranties that are included in the Covered 96 | Source. 97 | 98 | 1.11 'Licensee' or 'You' means any person exercising rights under 99 | this Licence. 100 | 101 | 1.12 'Licensor' means a natural or legal person who creates or 102 | modifies Covered Source. A person may be a Licensee and a 103 | Licensor at the same time. 104 | 105 | 1.13 'Convey' means to communicate to the public or distribute. 106 | 107 | 108 | 2 Applicability 109 | 110 | 2.1 This Licence governs the use, copying, modification, Conveying 111 | of Covered Source and Products, and the Making of Products. By 112 | exercising any right granted under this Licence, You irrevocably 113 | accept these terms and conditions. 114 | 115 | 2.2 This Licence is granted by the Licensor directly to You, and 116 | shall apply worldwide and without limitation in time. 117 | 118 | 2.3 You shall not attempt to restrict by contract or otherwise the 119 | rights granted under this Licence to other Licensees. 120 | 121 | 2.4 This Licence is not intended to restrict fair use, fair dealing, 122 | or any other similar right. 123 | 124 | 125 | 3 Copying, Modifying and Conveying Covered Source 126 | 127 | 3.1 You may copy and Convey verbatim copies of Covered Source, in 128 | any medium, provided You retain all Notices. 129 | 130 | 3.2 You may modify Covered Source, other than Notices, provided that 131 | You irrevocably undertake to make that modified Covered Source 132 | available from a Source Location should You Convey a Product in 133 | circumstances where the recipient does not otherwise receive a 134 | copy of the modified Covered Source. In each case subsection 3.3 135 | shall apply. 136 | 137 | You may only delete Notices if they are no longer applicable to 138 | the corresponding Covered Source as modified by You and You may 139 | add additional Notices applicable to Your modifications. 140 | Including Covered Source in a larger work is modifying the 141 | Covered Source, and the larger work becomes modified Covered 142 | Source. 143 | 144 | 3.3 You may Convey modified Covered Source (with the effect that You 145 | shall also become a Licensor) provided that You: 146 | 147 | a) retain Notices as required in subsection 3.2; 148 | 149 | b) add a Notice to the modified Covered Source stating that You 150 | have modified it, with the date and brief description of how 151 | You have modified it; 152 | 153 | c) add a Source Location Notice for the modified Covered Source 154 | if You Convey in circumstances where the recipient does not 155 | otherwise receive a copy of the modified Covered Source; and 156 | 157 | d) license the modified Covered Source under the terms and 158 | conditions of this Licence (or, as set out in subsection 159 | 8.3, a later version, if permitted by the licence of the 160 | original Covered Source). Such modified Covered Source must 161 | be licensed as a whole, but excluding Available Components 162 | contained in it, which remain licensed under their own 163 | applicable licences. 164 | 165 | 166 | 4 Making and Conveying Products 167 | 168 | You may Make Products, and/or Convey them, provided that You either 169 | provide each recipient with a copy of the Complete Source or ensure 170 | that each recipient is notified of the Source Location of the Complete 171 | Source. That Complete Source is Covered Source, and You must 172 | accordingly satisfy Your obligations set out in subsection 3.3. If 173 | specified in a Notice, the Product must visibly and securely display 174 | the Source Location on it or its packaging or documentation in the 175 | manner specified in that Notice. 176 | 177 | 178 | 5 Research and Development 179 | 180 | You may Convey Covered Source, modified Covered Source or Products to 181 | a legal entity carrying out development, testing or quality assurance 182 | work on Your behalf provided that the work is performed on terms which 183 | prevent the entity from both using the Source or Products for its own 184 | internal purposes and Conveying the Source or Products or any 185 | modifications to them to any person other than You. Any modifications 186 | made by the entity shall be deemed to be made by You pursuant to 187 | subsection 3.2. 188 | 189 | 190 | 6 DISCLAIMER AND LIABILITY 191 | 192 | 6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products 193 | are provided 'as is' and any express or implied warranties, 194 | including, but not limited to, implied warranties of 195 | merchantability, of satisfactory quality, non-infringement of 196 | third party rights, and fitness for a particular purpose or use 197 | are disclaimed in respect of any Source or Product to the 198 | maximum extent permitted by law. The Licensor makes no 199 | representation that any Source or Product does not or will not 200 | infringe any patent, copyright, trade secret or other 201 | proprietary right. The entire risk as to the use, quality, and 202 | performance of any Source or Product shall be with You and not 203 | the Licensor. This disclaimer of warranty is an essential part 204 | of this Licence and a condition for the grant of any rights 205 | granted under this Licence. 206 | 207 | 6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to 208 | the maximum extent permitted by law, have no liability for 209 | direct, indirect, special, incidental, consequential, exemplary, 210 | punitive or other damages of any character including, without 211 | limitation, procurement of substitute goods or services, loss of 212 | use, data or profits, or business interruption, however caused 213 | and on any theory of contract, warranty, tort (including 214 | negligence), product liability or otherwise, arising in any way 215 | in relation to the Covered Source, modified Covered Source 216 | and/or the Making or Conveyance of a Product, even if advised of 217 | the possibility of such damages, and You shall hold the 218 | Licensor(s) free and harmless from any liability, costs, 219 | damages, fees and expenses, including claims by third parties, 220 | in relation to such use. 221 | 222 | 223 | 7 Patents 224 | 225 | 7.1 Subject to the terms and conditions of this Licence, each 226 | Licensor hereby grants to You a perpetual, worldwide, 227 | non-exclusive, no-charge, royalty-free, irrevocable (except as 228 | stated in subsections 7.2 and 8.4) patent licence to Make, have 229 | Made, use, offer to sell, sell, import, and otherwise transfer 230 | the Covered Source and Products, where such licence applies only 231 | to those patent claims licensable by such Licensor that are 232 | necessarily infringed by exercising rights under the Covered 233 | Source as Conveyed by that Licensor. 234 | 235 | 7.2 If You institute patent litigation against any entity (including 236 | a cross-claim or counterclaim in a lawsuit) alleging that the 237 | Covered Source or a Product constitutes direct or contributory 238 | patent infringement, or You seek any declaration that a patent 239 | licensed to You under this Licence is invalid or unenforceable 240 | then any rights granted to You under this Licence shall 241 | terminate as of the date such process is initiated. 242 | 243 | 244 | 8 General 245 | 246 | 8.1 If any provisions of this Licence are or subsequently become 247 | invalid or unenforceable for any reason, the remaining 248 | provisions shall remain effective. 249 | 250 | 8.2 You shall not use any of the name (including acronyms and 251 | abbreviations), image, or logo by which the Licensor or CERN is 252 | known, except where needed to comply with section 3, or where 253 | the use is otherwise allowed by law. Any such permitted use 254 | shall be factual and shall not be made so as to suggest any kind 255 | of endorsement or implication of involvement by the Licensor or 256 | its personnel. 257 | 258 | 8.3 CERN may publish updated versions and variants of this Licence 259 | which it considers to be in the spirit of this version, but may 260 | differ in detail to address new problems or concerns. New 261 | versions will be published with a unique version number and a 262 | variant identifier specifying the variant. If the Licensor has 263 | specified that a given variant applies to the Covered Source 264 | without specifying a version, You may treat that Covered Source 265 | as being released under any version of the CERN-OHL with that 266 | variant. If no variant is specified, the Covered Source shall be 267 | treated as being released under CERN-OHL-S. The Licensor may 268 | also specify that the Covered Source is subject to a specific 269 | version of the CERN-OHL or any later version in which case You 270 | may apply this or any later version of CERN-OHL with the same 271 | variant identifier published by CERN. 272 | 273 | 8.4 This Licence shall terminate with immediate effect if You fail 274 | to comply with any of its terms and conditions. 275 | 276 | 8.5 However, if You cease all breaches of this Licence, then Your 277 | Licence from any Licensor is reinstated unless such Licensor has 278 | terminated this Licence by giving You, while You remain in 279 | breach, a notice specifying the breach and requiring You to cure 280 | it within 30 days, and You have failed to come into compliance 281 | in all material respects by the end of the 30 day period. Should 282 | You repeat the breach after receipt of a cure notice and 283 | subsequent reinstatement, this Licence will terminate 284 | immediately and permanently. Section 6 shall continue to apply 285 | after any termination. 286 | 287 | 8.6 This Licence shall not be enforceable except by a Licensor 288 | acting as such, and third party beneficiary rights are 289 | specifically excluded. 290 | --------------------------------------------------------------------------------