// Arbitrary servo pulse between 0 and 100 // 0 is fully in 100 is fully out // Probably should be in Ardupilot Centidegrees or something servoPulse = 0;// 0 to 100 // for stopping Openscad customiser module stopCustomiser(){} // mast rotates about [0,0] // relative position of sail servo axis to [0,0] in [mm,mm] servoAxisPos = [-238,60, 0]; // length of the winch servo arm in mm servoArmLen = 87; servoArmAngle = (servoPulse *9/10)-135; // Angle with center line. 0 is along center line facing forward // Length of the main sheet sheetLen = 213; // eyeOffset = 88; // position of the mainsheet eye sheetEyePos = [-eyeOffset,0,0]; // position of mainsheet attacmnet along boom boomSheetAttachPoint = [eyeOffset,0,0]; // arbitrary boom dims boomAftLen = 375; boomFwdLen = 95; // boom heigh is ignored thoug in prcatise will affect things boomHeight = 20; module mast(){ cylinder ( d = 10, h = 50); } module servo_arm_shape(){ hull(){ cylinder(d = 10, h = 1); translate([servoArmLen,0,0]){ cylinder(d = 10, h = 1); } } } module servoArm(){ translate( servoAxisPos - [0,0,3]){ rotate(servoArmAngle){ servo_arm_shape(); } translate([0,0,-5]){ cylinder( d = 20, h = 5); } } } module sheetEyeShape(){ translate([0,0,2]){ difference(){ cylinder ( d = 10, h = 3); translate([0,0,-1]){ cylinder (d = 5, h = 5); } } } } module sheetEye(){ translate(sheetEyePos){ sheetEyeShape(); } } function sheetEyeStartPos() = servoAxisPos + [cos(servoArmAngle), sin(servoArmAngle), 0] * servoArmLen; function sheetServoToEyeLength() = norm ( sheetEyePos - sheetEyeStartPos()); function sheetServoToEyeAngle() = let (diff =( sheetEyePos - sheetEyeStartPos())) atan2(diff.y, diff.x); module sheetServoToEye(){ assert( sheetServoToEyeLength() <= sheetLen, "sheet too tight"); translate(sheetEyeStartPos()){ // cylinder ( d = 3, h = 50); rotate(sheetServoToEyeAngle()){ rotate([0,90,0]){ cylinder ( d = 3, h = sheetServoToEyeLength()); } } } } function boomEyePos() = let( d = sheetEyePos.x) let( r1 = boomSheetAttachPoint.x) let( r2 = sheetLen - sheetServoToEyeLength()) let( x = (r1^2 - r2^2 + d^2)/ (2 * d)) let (y = sqrt(r1^2 - x^2)) [x,y]; module boom(){ pos = boomEyePos(); boomAngle = atan2(-pos.y,pos.x); echo ("servoPulse = ", servoPulse); echo("boomAngle = ", 180 + boomAngle); translate([0,0,boomHeight]){ rotate( [0,0,boomAngle]){ rotate([0,90,0]){ translate([0,0,-boomFwdLen]){ cylinder ( d = 10, h = boomAftLen + boomFwdLen); } } } } } module sheetEyeToBoom(){ diff = boomEyePos() - [sheetEyePos.x,sheetEyePos.y]; angle = atan2(-diff.y,diff.x); translate([0,0,7]){ translate(sheetEyePos){ rotate([0,0,angle]){ rotate([0,90,0]){ cylinder ( d = 3, h = sheetLen - sheetServoToEyeLength()); } } } } } mast(); servoArm(); sheetEye(); sheetServoToEye(); sheetEyeToBoom(); boom();