Skip to content

Instantly share code, notes, and snippets.

@ednisley
Last active June 11, 2025 23:13
Show Gist options
  • Save ednisley/2dcf380c5f57f0c88e69d33d77cc2c0a to your computer and use it in GitHub Desktop.
Save ednisley/2dcf380c5f57f0c88e69d33d77cc2c0a to your computer and use it in GitHub Desktop.
OpenSCAD source code: Ring to hold bird spikes for Ambient Weather WS-5000 anemometer
// Ambient Weather - Ambient Weather WS-5000 anemometer bird spike ring
// Ed Nisley - KE4ZNU
// 2025-06-09
include <BOSL2/std.scad>
Layout = "Show"; // [Show,Build,Slice]
/* [Hidden] */
HoleWindage = 0.2;
Protrusion = 0.1;
ID = 0;
OD = 1;
LENGTH = 2;
SpikeOC = 30.0; // straight-line distance between spikes, OEM = 35
WallThick = 4.0;
BandID = 3.5*INCH - 0.5; // = OD of weather station
BandOD = BandID + 2*WallThick;
BandHeight = 8.0;
SpikeOD = 1.7 + HoleWindage; // wire diameter
SpikeWall = 2.0; // around wires
SpikeBCD = BandOD;
MountOD = SpikeOD + 2*SpikeWall;
NumSpikes = ceil(PI*BandOD/SpikeOC); // need integral number of spikes
SpikeAngle = 360/NumSpikes;
NumSides = 3*NumSpikes;
echo(SpikeAngle=SpikeAngle);
echo(NumSpikes=NumSpikes);
//----------
// Define Shapes
module Slice() {
difference() {
hull() {
pie_slice(h=BandHeight,d=BandOD,$fn=NumSides,ang=SpikeAngle,spin=-SpikeAngle/2,anchor=BOTTOM);
right(SpikeBCD/2 - MountOD/2)
cyl(h=BandHeight,d=MountOD,realign=true,anchor=LEFT+BOTTOM,$fn=2*6);
}
down(Protrusion) {
cyl(h=BandHeight + 2*Protrusion,d=BandID,$fn=NumSides,circum=true,realign=true,anchor=BOTTOM);
right(SpikeBCD/2)
cyl(h=BandHeight + 2*Protrusion,d=SpikeOD,$fn=6,circum=true,realign=true,anchor=BOTTOM);
}
}
}
module SpikeRing() {
for (i=[0:NumSpikes-1])
zrot(i*SpikeAngle)
Slice();
}
//----------
// Build things
if (Layout == "Slice") {
Slice();
}
if (Layout == "Show") {
left(SpikeBCD/2)
Slice();
SpikeRing();
}
if (Layout == "Build") {
SpikeRing();
}
@ednisley
Copy link
Author

ednisley commented Jun 11, 2025

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment