Cams

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

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:

  1. Invert the system, holding the cam fixed
  2. Attach an XY coordinate system to the cam
  3. 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
  4. Write the loop closure equation
  5. Write condition of contact
  6. Solve the system for the cam profile.

Examples

Example #1: Disc cam with flat-faced in-line translating follower

System diagram:

flickr:4990257344

THIS FIGURE IS WRONG (SC)
Loop equation:

(1)
\begin{align} P=se^{i\theta}+le^{i(\theta+\frac{\pi}{2})} \end{align}

Condition of contact:

(2)
\begin{align} N\cdot\frac{dP}{d\theta} = 0 \end{align}

with:

(3)
\begin{align} N=1e^{i\theta} \end{align}

and

(4)
\begin{align} \frac{dP}{d\theta}=s'e^{i\theta}+sie^{i\theta}+l'ie^{i(\theta}+li^2e^{i(\theta} \end{align}

yields:

(5)
\begin{align} N\cdot\frac{dP}{d\theta} = (s'-l)\cos(0)+(s+l')\cos(-\frac{\pi}{2}) = (s'-l) = 0 \end{align}

or

(6)
\begin{equation} l=s' \end{equation}

and the cam profile:

(7)
\begin{align} P=se^{i\theta}+s'e^{i(\theta+\frac{\pi}{2})} \end{align}

Example #2: Disc cam with flat-faced offset translating follower

System diagram:

flickr:4989750055

Loop equation:

(8)
\begin{align} P=de^{i\theta}+sie^{i(\theta)}-le^{i(\theta)} \end{align}

Condition of contact:

(9)
\begin{align} N\cdot\frac{dP}{d\theta} = 0 \end{align}

with:

(10)
\begin{align} N=1e^{i(\theta+\frac{\pi}{2})} \end{align}

and

(11)
\begin{align} \frac{dP}{d\theta}=die^{i\theta}+s'ie^{i\theta}-se^{i\theta}-l'e^{i\theta}-lie^{i\theta} \end{align}

yields:

(12)
\begin{align} N\cdot\frac{dP}{d\theta} = (d+s'-l)\cos(0)+(s+l')\cos(-\frac{\pi}{2}) = (d+s'-l) = 0 \end{align}

or

(13)
\begin{equation} l=d+s' \end{equation}

and the cam profile:

(14)
\begin{align} P=se^{i\theta}+s'e^{i(\theta+\frac{\pi}{2})} \end{align}

Example #3: Disc cam with oscillating roller follower

System diagram:

flickr:4989651295

Loop equation:

(15)
\begin{align} P=Ce^{i\theta}+le^{i(\theta+\phi)}+re^{i(\theta+\phi+\psi)} \end{align}

Condition of contact:

(16)
\begin{align} N\cdot\frac{dP}{d\theta} = 0 \end{align}

with:

(17)
\begin{align} N=1e^{i(\theta+\phi+\psi)} \end{align}

and

(18)
\begin{align} \frac{dP}{d\theta}=Cie^{i\theta}+li(1+\phi')e^{i(\theta+\phi)}+ri(1+\phi'+\psi')e^{i(\theta+\phi+\psi)} \end{align}

yields:

(19)
\begin{align} N\cdot\frac{dP}{d\theta} = C\cos(\frac{\pi}{2}-\phi-\psi)+l(1+\phi')cos(\frac{\pi}{2}-\psi)+r(1+\phi'+\psi')\cos(-\frac{\pi}{2}) =0 \end{align}

or

(20)
\begin{align} \tan(\psi)=\frac{-C\sin(\phi)}{C\cos(\phi)+l(1+\phi')} \end{align}

and the cam profile:

(21)
\begin{align} P=Ce^{i\theta}+le^{i(\theta+\phi)}+re^{i(\theta+\phi+\psi)} \end{align}

Example #4: Disc cam with oscillating flat-faced follower

System diagram:

flickr:4989651275

Loop equation:

(22)
\begin{align} P=Ce^{i\theta}+le^{i(\theta+\phi)} \end{align}

Condition of contact:

(23)
\begin{align} N\cdot\frac{dP}{d\theta} = 0 \end{align}

with:

(24)
\begin{align} N=1e^{i(\theta+\phi+\frac{\pi}{2})} \end{align}

and

(25)
\begin{align} \frac{dP}{d\theta}=Cie^{i\theta}+l'e^{i(\theta+\phi)}+li(1+\phi')e^{i(\theta+\phi)} \end{align}

yields:

(26)
\begin{align} N\cdot\frac{dP}{d\theta} = C\cos(-\phi)+l'cos(-\frac{\pi}{2})+l(1+\phi')\cos(0) = 0 \end{align}

or

(27)
\begin{align} l=\frac{-C\cos(\phi)}{(1+\phi')} \end{align}

and the cam profile:

(28)
\begin{align} P=Ce^{i\theta}+\frac{-C\cos(\phi)}{(1+\phi')}e^{i(\theta+\phi)} \end{align}
flickr:5062104259
flickr:5062700310
flickr:5062089637
flickr:5062723100
flickr:5062134589
flickr:5062744960

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