% ======================================================================
% Síntese de cames
% Baseado no Capítulo 4 do Doughty
% Criado em 28/01/2013
% Última modificação em 28/03/2014
% 
% AINDA EXISTEM ALGUNS ERROS
%
% ======================================================================

%/////////////////////////////////////////////////
% verificar erro no perfil para comando de válvula
%/////////////////////////////////////////////////


clearvars
close all
clc

NP=361;

%-----------------------------------------------------------------------
%% CODIGO DAS ENTRADAS
% seguidor
% 11-translação de face plana
% 12-translação com rolete
% 13-oscilante de face plana
% 14-oscilante com rolete
% intervalos da função deslocamento
% 21-A1=90; A2=180; A3=270
% 22-A1=90; A2=90; A3=180
% 23-A1=180; A2=180; A3=360
% intervalo de avanço
% 31-parabolico
% 32-cubico
% 33-senoidal
% 34-cicloidal
% intervalo de retorno
% 41-parabolico
% 42-cubico
% 43-senoidal
% 44-cicloidal

%-----------------------------------------------------------------------
%% DADOS DO SEGUIDOR
seguidor = input('Tipo de seguidor:\n 1 - translação face plana\n 2 - translação rolete\n 3 - oscilante face plana\n 4 - oscilante rolete\nEscolha [1]: ');
if isempty(seguidor)
    seguidor = 1;
end
switch seguidor
    case 1      % seguidor de translação de face plana
        nome_seguidor = 'Seguidor de translação de face plana';
        disp(nome_seguidor)
        L = input('   Deslocamento total do seguidor (L = 10 mm): L = ');
        if isempty(L)
          L = 10;
        end
        R0 = input('   Raio de base (R0 = 40 mm): R0 = ');
        if isempty(R0)
          R0 = 40;
        end
    case 2      % seguidor de translação com rolete
        nome_seguidor = 'Seguidor de translação com rolete';
        disp(nome_seguidor)
        L = input('   Deslocamento total do seguidor (L = 10 mm): L = ');
        if isempty(L)
          L = 10;
        end
        R0 = input('   Raio de base (R0 = 40 mm): R0 = ');
        if isempty(R0)
          R0 = 40;
        end
        Rf = input('   Raio do rolete (Rf = 20 mm): Rf = ');
        if isempty(Rf)
          Rf = 20;
        end
        E = input('   Excentricidade do seguidor (E = 20 mm): E = ');
        if isempty(E)
          E = 20;
        end
    case 3      % seguidor oscilante de face plana
        nome_seguidor = 'Seguidor oscilante de face plana';
        disp(nome_seguidor)
        L = input('   Deslocamento total do seguidor (L = 10 graus): L = ');
        if isempty(L)
          L = 10;
        end
        L = L*pi/180;
        R0 = input('   Raio de base (R0 = 40 mm): R0 = ');
        if isempty(R0)
          R0 = 40;
        end
        C1 = input('   C1 [110 mm] = ');
        if isempty(C1)
          C1 = 110;
        end
        C2 = input('   C2 [85 mm] = ');
        if isempty(C2)
          C2 = 85;
        end
        C3 = input('   C3 [45 mm] = ');
        if isempty(C3)
          C3 = 45;
        end
        B0 = input('   B0 [0 grau] = ');
        if isempty(B0)
          B0 = 0;
        end
        B0=B0*pi/180;    % rad
    case 4      % seguidor oscilante com rolete
        nome_seguidor = 'Seguidor oscilante com rolete';
        disp(nome_seguidor)
        L = input('   Deslocamento total do seguidor (L = 10 grau): L = ');
        if isempty(L)
          L = 10;
        end
        L = L*pi/180;
        R0 = input('   Raio de base (R0 = 40 mm): R0 = ');
        if isempty(R0)
          R0 = 40;
        end
        Rf = input('   Raio do rolete (Rf = 13 mm): Rf = ');
        if isempty(Rf)
          Rf = 13;
        end
        C1 = input('   C1 [115 mm] = ');
        if isempty(C1)
          C1 = 115;
        end
        C2 = input('   C2 [40 mm] = ');
        if isempty(C2)
          C2 = 40;
        end
        C3 = input('   C3 [110 mm] = ');
        if isempty(C3)
          C3 = 110;
        end
        B0 = input('   B0 [15 grau] = ');
        if isempty(B0)
          B0 = 15;
        end
        B0=B0*pi/180;    % rad
end


%-----------------------------------------------------------------------
%% DADOS DA FUNÇÃO DESLOCAMENTO
%-----------------------------------------------------------------------
% intervalos
A0 = 0;
A4 = 2*pi;
A1 = input('\nIntervalos:\nA1 [90 grau] = ');
if isempty(A1)
    A1 = 90;
end
A1 = A1*pi/180;
A2 = input('A2 [180 grau] = ');
if isempty(A2)
    A2 = 180;
end
A2 = A2*pi/180;
A3 = input('A3 [270 grau] = ');
if isempty(A3)
    A3 = 270;
end
A3 = A3*pi/180;
%-----------------------------------------------------------------------
% função deslocamento
avanco = input('\nFunção deslocamento\nAvanço\n 1 - parabólico\n 2 - cúbico\n 3 - senoidal\n 4 - cicloidal\nEscolha [1]: ');
if isempty(avanco)
    avanco = 1;
end
retorno = input('\nRetorno\n 1 - parabólico\n 2 - cúbico\n 3 - senoidal\n 4 - cicloidal\nEscolha [1]: ');
if isempty(retorno)
    retorno = 1;
end
%-----------------------------------------------------------------------
%% FUNCAO DESLOCAMENTO
for i=1:NP
    A(i)=360*pi/180*(i-1)/(NP-1);
    if A(i) <= A1
        switch avanco
            case 1
                % avanço parabólico
                nome_avanco = 'Parabólico';
                if A(i) < A1/2
                    f(i)=2*L*(A(i)/A1)^2;
                    fL(i)=4*L*A(i)/A1^2;
                    fLL(i)=4*L/A1^2;
                else
                    f(i)=L*(1-2*((A1-A(i))/A1)^2);
                    fL(i)=-4*L*(A(i)-A1)/A1^2;
                    fLL(i)=-4*L/A1^2;
                end
            case 2
                % avanço cúbico
                nome_avanco = 'Cúbico';
                if A(i) < A1/2
                    f(i)=4*L*(A(i)/A1)^3;
                    fL(i)=12*L*(A(i)^2)/(A1^3);
                    fLL(i)=24*L*A(i)/(A1^3);
                else
                    f(i)=L*(1-4*(((A1-A(i))/A1)^3));
                    fL(i)=12*L*((A(i)-A1)^2)/(A1^3);
                    fLL(i)=24*L*(A(i)-A1)/(A1^3);
                end
            case 3
                % avanço senoidal
                nome_avanco = 'Senoidal';
                f(i)=L/2*(1-cos(pi*A(i)/A1));
                fL(i)=pi*L/(2*A1)*sin(pi*A(i)/A1);
                fLL(i)=pi^2*L/(2*A1^2)*cos(pi*A(i)/A1);
            case 4
                % avanço cicloidal
                nome_avanco = 'Cicloidal';
                f(i)=L/pi*(pi*A(i)/A1-1/2*sin(2*pi*A(i)/A1));
                fL(i)=L/A1*(1-cos(2*pi*A(i)/A1));
                fLL(i)=2*pi*L/(A1^2)*sin(2*pi*A(i)/A1);
        end
    elseif A(i) <= A2
        % plano avançado
        f(i)=L;
        fL(i)=0;
        fLL(i)=0;
    elseif A(i) <= A3
        switch retorno
            case 1
                % retorno parabólico
                nome_retorno = 'Parabólico';
                if A(i) < (A2+A3)/2
                    f(i)=L*(1-2*((A2-A(i))/(A2-A3))^2);
                    fL(i)=-4*L*(A(i)-A2)/(A2-A3)^2;
                    fLL(i)=-4*L/(A2-A3)^2;
                else
                    f(i)=2*L*((A(i)-A3)/(A2-A3))^2;
                    fL(i)=4*L*(A(i)-A3)/(A2-A3)^2;
                    fLL(i)=4*L/(A2-A3)^2;
                end
            case 2
                % retorno cúbico
                nome_retorno = 'Cúbico';
                if A(i) < (A2+A3)/2
                    f(i)=L*(1-4*((A2-A(i))/(A2-A3))^3);
                    fL(i)=12*L*((A(i)-A2)^2)/(A2-A3)^3;
                    fLL(i)=12*L*(2*A(i)-2*A2)/(A2-A3)^3;
                else
                    f(i)=4*L*((A(i)-A3)/(A2-A3))^3;
                    fL(i)=12*L*((A(i)-A3)^2)/(A2-A3)^3;
                    fLL(i)=24*L*(A(i)-A3)/(A2-A3)^3;
                end
            case 3
                % retorno senoidal
                nome_retorno = 'Senoidal';
                f(i)=L/2*(1-cos(pi*(A(i)-A3)/(A2-A3)));
                fL(i)=pi*L/(2*(A2-A3))*sin(pi*(A(i)-A3)/(A2-A3));
                fLL(i)=pi^2*L/(2*(A2-A3)^2)*cos(pi*(A(i)-A3)/(A2-A3));
            case 4
                % retorno cicloidal
                nome_retorno = 'Cicloidal';
                f(i)=L/pi*(pi*(A(i)-A3)/(A2-A3)-1/2*sin(2*pi*(A(i)-A3)/(A2-A3)));
                fL(i)=L/(A2-A3)*(1-cos(2*pi*(A(i)-A3)/(A2-A3)));
                fLL(i)=2*pi*L/((A2-A3)^2)*sin(2*pi*(A(i)-A3)/(A2-A3));
        end
    else
        f(i)=0;
        fL(i)=0;
        fLL(i)=0;
    end
end
%-----------------------------------------------------------------------
%% COORDENADAS DO PERFIL
for i=1:NP
    switch seguidor
        case 1      % translação de face plana
            ATAN(i)=ATAN2(fL(i),-(R0+f(i)));
            G(i) = -A(i)+ATAN2(fL(i),-(R0+f(i)));
            R(i) = sqrt(fL(i)^2+(R0+f(i))^2);
        case 2      % translação com rolete
            Rp0=R0+Rf;
            H(i)=sqrt(Rp0^2-E^2)+f(i);
            Ap(i) = atan((fL(i)-E)/(sqrt(Rp0^2-E^2)+f(i)));
            G(i) = pi-A(i)-atan((E+Rf*sin(Ap(i)))/(H(i)-Rf*cos(Ap(i))));
            R(i) = sqrt((H(i)-Rf*cos(Ap(i)))^2+(E+Rf*sin(Ap(i)))^2);
        case 3      % oscilante de face plana
            B(i) = B0+f(i);
            D(i) = (C1*cos(B(i))-C2*sin(B(i)))/(1+fL(i));
            X(i) = C1-C3*sin(B(i))-D(i)*cos(B(i));
            Y(i) = C2-C3*cos(B(i))+D(i)*sin(B(i));
            G(i) = pi/2-A(i)+ATAN2(Y(i),X(i));
            R(i) = sqrt(X(i)^2+Y(i)^2);
        case 4      % oscilante com rolete
            B(i) = B0+f(i);
            D(i) = atan((C3*(1+fL(i))*cos(B(i))-C1)/(C3*(1+fL(i))*sin(B(i))+C2));
            X(i) = C1-C3*cos(B(i))+Rf*sin(D(i));
            Y(i) = C2+C3*sin(B(i))-Rf*cos(D(i));
            G(i) = pi/2-A(i)+ATAN2(Y(i),X(i));
            R(i) = sqrt(X(i)^2+Y(i)^2);
    end
end

%-----------------------------------------------------------------------
%% GRÁFICO DA FUNÇÃO DESLOCAMENTO
funcao_desloc=strcat('Avanço:  ',nome_avanco,'  Retorno:  ',nome_retorno);
figure('Name',funcao_desloc)
if seguidor == 3 || seguidor == 4
    fpr=f*180/pi;
    Lpr=L*180/pi;
else
    fpr=f;
    Lpr=L;
end
subplot(3,4,1)
plot(A*180/pi,fpr,'LineWidth',2)
xlabel('A (^o)');
ylabel('f(A)')
xlim([0 360])
set(gca,'XTick',0:45:360)
grid on
hold on
plot(0,0,'rx',A1*180/pi,Lpr,'rx',A2*180/pi,Lpr,'rx',A3*180/pi,0,'rx',360,0,'rx','LineWidth',2)
title('Função deslocamento - f(A)')

subplot(3,4,5)
plot(A*180/pi,fL,'LineWidth',2)
xlabel('A (^o)');
ylabel('f''(A)')
xlim([0 360])
set(gca,'XTick',0:45:360)
grid on
title('Derivada da função deslocamento - f''(A)')

subplot(3,4,9)
plot(A*180/pi,fLL,'LineWidth',2)
xlabel('A (^o)');
ylabel('f''''(A)')
xlim([0 360])
grid on
title('2^a Derivada da função deslocamento - f''''(A)')

subplot(3,4,[2 3 4 6 7 8 10 11 12])
polar(G,R,'-b')
set(gca,'XTick',0:45:360)
title('Perfil da came')
%% ÂNGULO DE PRESSÃO

if seguidor == 2
    figure('name','ÂNGULO DE PRESSÃO')
    plot(A*180/pi,Ap*180/pi,'LineWidth',2)
    xlabel('A (^o)');
    ylabel('Ap(A)')
    xlim([0 360])
    set(gca,'XTick',0:45:360)
    grid on
    title('Ângulo de pressão')
end
%-----------------------------------------------------------------------
%% IMPRESSAO NA TELA
clc
fprintf('========================================================\n')
fprintf('Seguidor: %s\n',nome_seguidor)
fprintf('Raio de base: %6.2f mm\n',R0)
fprintf('Deslocamento total do seguidor: %6.2f mm\n',L)
fprintf('Intervalos\n')
fprintf('Avanço:  %10s    %6.2f  <  A  <=  %6.2f graus\n',nome_avanco,A0,A1*180/pi)
fprintf('Plano:        Plano    %6.2f  <  A  <=  %6.2f graus\n',A1*180/pi,A2*180/pi)
fprintf('Retorno: %10s    %6.2f  <  A  <=  %6.2f graus\n',nome_retorno,A2*180/pi,A3*180/pi)
fprintf('Plano:        Plano    %6.2f  <  A  <=  %6.2f graus\n',A3*180/pi,A4*180/pi)
fprintf('========================================================\n')
%%

fprintf('\t\tG\t\tR\t\tA\n')
for i=1:NP
    fprintf('\t%6.2f\t%6.2f\t%6.2f\n',G(i)*180/pi,R(i),A(i)*180/pi)
end
%% exportar para Excel
matriz = [G.' R.' A.'];
xlswrite('came.xls',matriz)



