Cam Synthesis via Conjugate Geometry
This wiki will review the process of cam synthesis via conjugate geometry. The method demonstrated will be directly applicable to planar cams and will consider traditional followers and wrapping cams
Table of Contents
|
Overview
Two primary aspects exist in the kinematic design process for cams; 1) synthesis of the cam function, 2) synthesis of the cam profile.
In the former aspect, the cam function describes the desired follower motion that satisfies the variety of constrations on position, velocity and acceleration. In the latter, the cam profile or surface is defined in conjunction with the follower surface geometry.
Method: Cam Function Synthesis:
A good reference for this task is provided,
Cam Design Handbook - Google books
on chap 5, pg. 7.
Method: Cam Profile Synthesis:
A number of synthesis methods for cam mechanisms exist (Mabie and Reinholtz, 1987). The anlaytical techniques for synthesizing cams using conjugate geometry was developed by Chakraborty and Dhande (1977) and will be the basis of the method demonstrated here. This method will be developed using complex vector notation and will be applicable to planar (2D) problems. In general, the method consists of describing the synthesis problem as the combination of a loop closure equation and the condition of contact. This yields three scalar equations that can be used to solve for the unknowns in the system: the cam profile and one positional variable associated with the moving contact point of the cam. Higher derivatives of the moving contact are inconsistent with the condition of contact.
The method consists of the following steps:
- Invert the system, holding the cam fixed
- Attach an XY coordinate system to the cam
- Create a vector loop that includes A vector describing the cam surface (center of cam to contact point) and vectors along the follower to the contact point
- Write the loop closure equation
- Write condition of contact
- Solve the system for the cam profile.
Examples
Example #1: Disc cam with flat-faced in-line translating follower
System diagram:
THIS FIGURE IS WRONG (SC)
Loop equation:
Condition of contact:
(2)with:
(3)and
(4)yields:
(5)or
(6)and the cam profile:
(7)Example #2: Disc cam with flat-faced offset translating follower
System diagram:
Loop equation:
(8)Condition of contact:
(9)with:
(10)and
(11)yields:
(12)or
(13)and the cam profile:
(14)Example #3: Disc cam with oscillating roller follower
System diagram:
Loop equation:
(15)Condition of contact:
(16)with:
(17)and
(18)yields:
(19)or
(20)and the cam profile:
(21)Example #4: Disc cam with oscillating flat-faced follower
System diagram:
Loop equation:
(22)Condition of contact:
(23)with:
(24)and
(25)yields:
(26)or
(27)and the cam profile:
(28)Sample Code (Matlab)
This example provides synthesis of an offset, translating roller follower on a general RDFD motion program
% General cam synthesis program
clear all
dtr=pi/180;
% First, define cam function
% Input parameters for cam function
%This example has 4 cycles: rise, dwell, fall, dwell
L1=2;
L3=2;
beta1=90*dtr;
beta2=60*dtr;
beta3=90*dtr;
beta4=120*dtr;
%*
%* CAM Function *
%cycle 1: rise, c-5, theta=0:beta1
%s=L1*(theta/beta1-(1/2*pi)*sin(2*pi*(theta/beta1)));
%s_prime=2/beta1*(1-cos(2*pi*(theta/beta1)));
%cycle 2: dwell, theta=beta1 : beta1+beta2
%s=L1;
%s_prime=0;
%cycle 3: fall, c-6, theta=beta1+beta2: beta1+beta2+beta3
%s=L3*(1-(theta-beta2)/beta3+1/(2*pi)*sin(2*pi*(theta-beta2)/beta3));
%s_prime=-L3/beta3*(1-cos(2*pi*(theta-beta2)/beta3));
%cycle 4: dwell, theta=beta3:2*pi
%s=0;
%s_prime=0;
%*
%initial conditions for the cam:
r=1; %follower radius
r_base=3; %base circle radius
d=-.750; %offset
%*
%** Caculations *
%cycle 1 rise
idx=1;
for theta=0:1*dtr:beta1
s(idx)=L1*(theta/beta1-1/(2*pi)*sin(2*pi*theta/beta1))+r_base;
s_prime(idx)=L1/beta1*(1-cos(2*pi*theta/beta1));
psi(idx)=atan((d+s_prime(idx))/s(idx));
P(idx)=d*exp(i*(theta))+s(idx)*exp(i*(theta+pi/2))+r*exp(i*(theta+psi(idx)+pi/2));
% P(idx)=-d*exp(i*(theta+pi/2))+s(idx)*exp(i*theta)+r*exp(i*(theta+psi(idx)));
base_circle(idx)=r_base*exp(i*theta);
theta_store(idx)=theta;
idx=idx+1;
end
% cylce 2: dwell
for theta=beta1:1*dtr:beta1+beta2
s(idx)=L1+r_base;
s_prime(idx)=0;
psi(idx)=atan((d+s_prime(idx))/s(idx));
P(idx)=d*exp(i*(theta))+s(idx)*exp(i*(theta+pi/2))+r*exp(i*(theta+psi(idx)+pi/2));
% P(idx)=-d*exp(i*(theta+pi/2))+s(idx)*exp(i*theta)+r*exp(i*(theta+psi(idx)));
base_circle(idx)=r_base*exp(i*theta);
theta_store(idx)=theta;
idx=idx+1;
end
for theta=beta1+beta2:1*dtr:beta1+beta2+beta3
s(idx)=L3*(1-(theta-beta1-beta2)/beta3+1/(2*pi)*sin(2*pi*(theta-beta1-beta2)/beta3))+r_base;
s_prime(idx)=-L3/beta3*(1-cos(2*pi*(theta-beta1-beta2)/beta3));
psi(idx)=atan((d+s_prime(idx))/s(idx));
% P(idx)=-d*exp(i*(theta+pi/2))+s(idx)*exp(i*theta)+r*exp(i*(theta+psi(idx)));
P(idx)=d*exp(i*(theta))+s(idx)*exp(i*(theta+pi/2))+r*exp(i*(theta+psi(idx)+pi/2));
base_circle(idx)=r_base*exp(i*theta);
theta_store(idx)=theta;
idx=idx+1;
end
for theta=beta1+beta2+beta3:1*dtr:2*pi
s(idx)=0+r_base;
s_prime(idx)=0;
psi(idx)=atan((d+s_prime(idx))/s(idx));
% P(idx)=-d*exp(i*(theta+pi/2))+s(idx)*exp(i*theta)+r*exp(i*(theta+psi(idx)));
P(idx)=d*exp(i*(theta))+s(idx)*exp(i*(theta+pi/2))+r*exp(i*(theta+psi(idx)+pi/2));
base_circle(idx)=r_base*exp(i*theta);
theta_store(idx)=theta;
idx=idx+1;
end
%*
%* Plot Cam *
figure(1)
plot(theta_store,s,theta_store,s_prime)
figure(2)
plot(P)
hold on
plot(base_circle,'r')
hold off
scale=10;
axis([-scale,scale,-scale,scale])
figure(3)
plot(theta_store,psi/dtr)
%*
%* Animate Cam *
input('hit any key to continue')
l_stem=3;
t_stem=.3;
stem=[r+r_base+j*(-t_stem+d),r+r_base+l_stem+j*(-t_stem+d),r+r_base+l_stem+j*(t_stem+d),r+r_base+j*(t_stem+d),r+r_base+j*(-t_stem+d)];
idx=1;
for theta=0:10*dtr:380*dtr;
follower(idx)=r*(cos(theta)+j*sin(theta));
idx=idx+1;
end
idx=1;
figure(4)
offset=0;
for theta=360:-1*dtr:0*dtr;
R=[cos(theta+offset),-sin(theta+offset);sin(theta+offset),cos(theta+offset)];
for i=1:length(P)
P_rot(i)=(real(P(i))*R(1,1)+imag(P(i))*R(1,2))+j*(real(P(i))*R(2,1)+imag(P(i))*R(2,2));
end
for i=1:length(stem)
stem_plot(i)=stem(i)+s(idx)-r_base+r;
end
for i=1:length(follower)
follower_plot(i)=follower(i)+(s(idx)+r)*j+d;
end
plot(P_rot)
hold on
% plot(stem_plot)
plot(follower_plot)
axis([-scale,scale,-scale,scale])
hold off
pause(.001)
idx=idx+1;
end