├── 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 |  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 | 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 | 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 | []( 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 |  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 | Connect the 6W volatic Panel to the Mutlicomp MC002194 Enclosure and 25mm OD PVC Pipe. This is obviously printed in two parts. 6 | 7 | 
Mount inside the Multicomp MC002194 Enclosure 8 | 9 | 
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 | 
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 | 
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 | 
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 | []( 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 | 
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 | 
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 | []( 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 |  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 | 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 | 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 | 
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 | 
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 | 
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 | 
Heat set inserts for the two parts 30 | 31 | You can then srcew the two parts together: 32 | 33 | 
Screw the two parts together 34 | 35 | 
Mount inside the Multicomp MC002194 Enclosure 36 | 37 | 
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 | 
The case mount goes inside the multicomp 41 | 42 | 
Wiring the solar 43 | 44 | 
Provide support for the connector while you plug it in 45 | 46 | 
Tighten the PG-9 Gland 47 | 48 | 
In the next step we will screw the plastic end on 49 | 50 | 
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 | 
Use 50mm M3 screws to put screw pole_mount.stl into the panel mount. 56 | 57 | 
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 | 
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