Buscar este blog

viernes, 23 de diciembre de 2016

Caracterización de sensor de Humedad

Caracterización de sensor de humedad utilizando LabVIEW y Arduino, se debe cargar el código en c al Arduino para que este se comunique con LabVIEW.

https://www.dropbox.com/s/b03y196e0izn4l0/Sensor%20de%20Humedad.rar?dl=0





jueves, 22 de diciembre de 2016

Circuitos Hidráulicos

Conjunto de ejemplos de circuitos hidráulicos, es necesario instalar el programa "FluidSim" para poder correr las simulaciones.

https://www.dropbox.com/s/1vu1e1u6xzwlbr3/Circuitos%20Hidr%C3%A1ulicos.rar?dl=0

Apuntes de Utilidad

Notas de clase.

https://www.dropbox.com/s/ex5sed1v441hc7r/Apuntes.rar?dl=0

Programa para comprobar el funcionamiento de una compuerta lógica

Programa de LabVIEW para comprobar el correcto funcionamiento de una compuerta lógica.

https://www.dropbox.com/s/ljc64pz7uttr9sj/Funcionamiento%20Compuerta.rar?dl=0







viernes, 3 de junio de 2016

Modelado de brazo robotico SCARA en MATLAB

- No correr todo el programa al mismo tiempo, hacerlo por partes.
- El tamaño de paso para este modelo es de 22.5°, si se desea otro valor modificar todos los cálculos en donde aparezca este valor.

% MODELADO DE BRAZO ROBOTICO SCARA
close all;
clear all;
clc;
%% Variables y constantes del brazo
syms x y z w
a1=101; % elemento uno
a2=59; % elemento dos
a3=60; % elemento tres
a4=102; % elemento cuatro, con actuador final
d1=15; % offset uno
d2=x; % offset dos variable
o1=y; % angulo uno
o2=z; % angulo dos
o3=w; % angulo tres, se dejo encero ya que no había actuador final, pero si hay debe tomarse en cuenta

%% Matriz de referencia
% S0=[cos(o1) -sin(o1) 0 0; sin(o1) cos(o1) 0 0; 0 0 1 a1; 0 0 0 1];
% S1=[1 0 0 a2; 0 1 0 0; 0 0 1 0; 0 0 0 1];
% S2=[cos(o2) -sin(o2) 0 0; sin(o2) cos(o2) 0 0; 0 0 1 d1; 0 0 0 1];
% S3=[cos(o3) -sin(o3) 0 a3; sin(o3) cos(o3) 0 0; 0 0 1 0; 0 0 0 1];
% S4=[0 1 0 0; 1 0 0 0; 0 0 -1 -d2; 0 0 0 1];
% S5=S0*S1*S2*S3*S4

%% Modelo del brazo en pose cero
% figure
% s0=[0,0,0];s1=[0,0,a1];s2=[a2,0,a1];s3=[a2,0,a1+d1];s4=[a2+a3,0,a1];s5=[a2+a3,0,a1+d1-(a4/2)];
% x0=[0,0];y0=[0,0];z0=[0,0];
% x1=[0,0];y1=[0,0];z1=[0,a1];
% x2=[0,a2];y2=[0,0];z2=[a1,a1];
% x3=[a2,a2];y3=[0,0];z3=[a1,a1+d1];
% x4=[a2,a2+a3];y4=[0,0];z4=[a1+d1,a1+d1];
% x5=[a2+a3,a2+a3];y5=[0,0];z5=[a1+d1,a1+d1-a4];
% plot3(x0,y0,z0,'b','linewidth',3),grid on,hold on;
% plot3(x1,y1,z1,'b','linewidth',3),grid on,hold on;
% plot3(x2,y2,z2,'b','linewidth',3),grid on,hold on;
% plot3(x3,y3,z3,'b','linewidth',3),grid on,hold on;
% plot3(x4,y4,z4,'b','linewidth',3),grid on,hold on;
% plot3(x5,y5,z5,'b','linewidth',3),grid on,hold on;
% xlabel('X0'),ylabel('Y0'),zlabel('Z0');
% title('BRAZO SCARA POSE CERO');

%% Mapeo de poses Establecidas
% N=1;
% n1=0;n2=0;
% for i=1 : 4
% Op1=i*(pi/4);
% m1=0;m2=0;
% for l=0 : 3
% fac2=m1+m2;
% m1=m1+1;
% if m1==3
%     m2=2;
% else m2=0;
% end
% Op2=fac2*(pi/4);
% for m=0 : 2 : 6
% d2=2.5*m;
% Ap1=((180*(Op1))/pi)
% Ap2=((180*(Op2))/pi)
% S1=round(Ap1/22.5)*22.5; S2=round(Ap2/22.5)*22.5;
% o1=S1
% o2=S2
% o3=0;
% S0=[cosd(o1) -sind(o1) 0 0; sind(o1) cosd(o1) 0 0; 0 0 1 a1; 0 0 0 1];
% S1=[1 0 0 a2; 0 1 0 0; 0 0 1 0; 0 0 0 1];
% S2=[cosd(o2) -sind(o2) 0 0; sind(o2) cosd(o2) 0 0; 0 0 1 d1; 0 0 0 1];
% S3=[cosd(o3) -sind(o3) 0 a3; sind(o3) cosd(o3) 0 0; 0 0 1 0; 0 0 0 1];
% S4=[0 1 0 0; 1 0 0 0; 0 0 -1 -d2; 0 0 0 1];
% S5=S0*S1*S2*S3*S4
% x0=[0,0,0];y0=[0,0,0];z0=[0,0,0];
% x1=[0,0];y1=[0,0];z1=[0,a1];
% x2=[0,cosd(o1)*a2];y2=[0,sind(o1)*a2];z2=[a1,a1];
% x3=[cosd(o1)*a2,cosd(o1)*a2];y3=[sind(o1)*a2,sind(o1)*a2];z3=[a1,a1+d1];
% x4=[cosd(o1)*a2,(cosd(o1)*a2)+(cosd(o1+o2)*a3)];y4=[sind(o1)*a2,(sind(o1)*a2)+(sind(o1+o2)*a3)];z4=[a1+d1,a1+d1];
% x5=[(cosd(o1)*a2)+(cosd(o1+o2)*a3),(cosd(o1)*a2)+(cosd(o1+o2)*a3),(cosd(o1)*a2)+(cosd(o1+o2)*a3)];y5=[(sind(o1)*a2)+(sind(o1+o2)*a3),(sind(o1)*a2)+(sind(o1+o2)*a3),(sind(o1)*a2)+(sind(o1+o2)*a3)];z5=[a1+d1,a1+d1-d2,(a1+d1)+(a4-d2)];
% figure
% plot3(x0,y0,z0,'b','linewidth',3),grid on,hold on;
% plot3(x1,y1,z1,'b','linewidth',3),grid on,hold on;
% plot3(x2,y2,z2,'b','linewidth',3),grid on,hold on;
% plot3(x3,y3,z3,'b','linewidth',3),grid on,hold on;
% plot3(x4,y4,z4,'b','linewidth',3),grid on,hold on;
% plot3(x5,y5,z5,'b','linewidth',3),grid on,hold on;
% xlabel('X0'),ylabel('Y0'),zlabel('Z0');
% title(['BRAZO SCARA POSE ',num2str(N)]);
% Dyx=sqrt((((cosd(o1)*a2)+(cosd(o1+o2)*a3))^2)+(((sind(o1)*a2)+(sind(o1+o2)*a3))^2))
% Dxz=sqrt(((Dyx)^2)+((a1+d1-d2)^2))
% N=N+1
% end
% end
% end

%% Calculo de pose con vector final
% Xf=69; Yf=28; Zf=a1+d1-58; % cambiar estos valores para un vector final distinto
% N=0;
% for i=0 : 1 : 15
% Op1=i*22.5;
% for l=-7 : 1 : 7
% Op2=l*22.5;
% for m=a4 : -1 : 0
% d2=m;
% o1=(Op1);o2=(Op2);o3=0;
% S0=[cosd(o1) -sind(o1) 0 0; sind(o1) cosd(o1) 0 0; 0 0 1 a1; 0 0 0 1];
% S1=[1 0 0 a2; 0 1 0 0; 0 0 1 0; 0 0 0 1];
% S2=[cosd(o2) -sind(o2) 0 0; sind(o2) cosd(o2) 0 0; 0 0 1 d1; 0 0 0 1];
% S3=[cosd(o3) -sind(o3) 0 a3; sind(o3) cosd(o3) 0 0; 0 0 1 0; 0 0 0 1];
% S4=[0 1 0 0; 1 0 0 0; 0 0 -1 -d2; 0 0 0 1];
% S5=S0*S1*S2*S3*S4;
% Ex=abs(S5(1,4)-Xf); % Error en x
% Ey=abs(S5(2,4)-Yf); % Error en y
% Ez=abs(S5(3,4)-Zf); % Error en z
% Ep=abs((Ex+Ey+Ez)/3); % Error promedio
% fprintf('Ex= %5.3f,   Ey= %5.3f,   Ez= %5.3f,   Eprom= %5.3f\n',Ex,Ey,Ez,Ep)
% N=N+1;
% if (Ex<3.5) && (Ey<3.5) && (Ez<=0) || (Ep<7) && (Ez<=0)
%     Matriz=S5
%     Angulo1=Op1
%     Angulo2=Op2
% x0=[0,0,0];y0=[0,0,0];z0=[0,0,0];
% x1=[0,0];y1=[0,0];z1=[0,a1];
% x2=[0,cosd(o1)*a2];y2=[0,sind(o1)*a2];z2=[a1,a1];
% x3=[cosd(o1)*a2,cosd(o1)*a2];y3=[sind(o1)*a2,sind(o1)*a2];z3=[a1,a1+d1];
% x4=[cosd(o1)*a2,(cosd(o1)*a2)+(cosd(o1+o2)*a3)];y4=[sind(o1)*a2,(sind(o1)*a2)+(sind(o1+o2)*a3)];z4=[a1+d1,a1+d1];
% x5=[(cosd(o1)*a2)+(cosd(o1+o2)*a3),(cosd(o1)*a2)+(cosd(o1+o2)*a3),(cosd(o1)*a2)+(cosd(o1+o2)*a3)];y5=[(sind(o1)*a2)+(sind(o1+o2)*a3),(sind(o1)*a2)+(sind(o1+o2)*a3),(sind(o1)*a2)+(sind(o1+o2)*a3)];z5=[a1+d1,a1+d1-d2,(a1+d1)+(a4-d2)];
% figure
% plot3(x0,y0,z0,'b','linewidth',3),grid on,hold on;
% plot3(x1,y1,z1,'b','linewidth',3),grid on,hold on;
% plot3(x2,y2,z2,'b','linewidth',3),grid on,hold on;
% plot3(x3,y3,z3,'b','linewidth',3),grid on,hold on;
% plot3(x4,y4,z4,'b','linewidth',3),grid on,hold on;
% plot3(x5,y5,z5,'b','linewidth',3),grid on,hold on;
% xlabel('X0'),ylabel('Y0'),zlabel('Z0');
% title(['BRAZO SCARA POSE ',num2str(N)]);
% Dyx=sqrt((((cosd(o1)*a2)+(cosd(o1+o2)*a3))^2)+(((sind(o1)*a2)+(sind(o1+o2)*a3))^2))
% Dxz=sqrt(((Dyx)^2)+((a1+d1-d2)^2))
% q=1;
% break;
% end
% q=0;
% end
% if q==1
%     break;
% end
% end
% if q==1
%     break;
% end
% end

viernes, 13 de mayo de 2016

Control de apertura de pinzas con sensor de Fuerza

-- Control de apertura de pinzas montadas en servo motor HS322 para sostener objetos utilizando un sensor de fuerza FSR400.

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#DEVICE adc=10 // CONFIGURACION DE LA ESCALA DEL ADC
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER

VOID LONG_DELAY_US(LONG C); // FUNCIÓN DE DELAY EXACTO PARA EL MOTOR
INT BUTTON; // BOTON DE OPERACIÓN
INT16 T=0; // VQARIABLE DE TIEMPO
INT I, I2; // VARIABLES DE CICLOS
INT16 VAL; // VARIABLE DE LECTURA ACTUAL

VOID MAIN(){
// CONFIGURACIÓN DEL PUERTO A COMO ANALOGICO
SETUP_PORT_A(ALL_ANALOG); // TODO EL PUERTO A COMO ANALOGICO
SETUP_ADC(ADC_CLOCK_INTERNAL); // RELOG INTERNO DEL CONV. A/D
SET_ADC_CHANNEL(0); // SELECCIONA EL CANAL 0

FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA CONFIGURACION INICIAL
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(300); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR INICIAL

WHILE(1){
BUTTON=INPUT_B(); // BOTON DE STOP PUERTO E
IF(BUTTON==0X00){ // REVISA EL BOTÓN
ABRE: // SECCIÓN PARA ABRIR PINZAS
FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA BRIR LAS PINZAS
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(1050); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR OPEN
T=1050; // COLOCA LA VARIABLE T EN EL ULTIMO ANCHO DE PULSO
DELAY_MS(2000); // ESPERA DOS SEGUNDOS
} // CONDICION DE ABRIR PINZAS

ELSE IF(BUTTON==0X01 && T==1050){ // CONDICIÓN PARA CERRAR PINZAS
FOR(I=0;I<30;I++){ // CONTADOR DE CICLOS PARA CERRAR LAS PINZAS
VAL=READ_ADC(); // SE ASIGNA A VAR LA LECTURA DEL CANAL 0
T=T-30; // DISMUNUYE EL VALOR DE T
IF(VAL<=740){ // CONDICIÓN DEL SENSOR
T=T-10; // AJUSTA LA VARIABLE DEL ANCHO DE PULSO
FOR(I2=0;I2<200;I2++){ // CICLOS DE AJUSTE
BUTTON=INPUT_B(); // BOTON DE STOP PUERTO E
IF(BUTTON==0X00){ // REVISA EL BOTÓN
GOTO ABRE; // VE A LA SECCIÓN DE ABRIR PINZAS
} // CONDICIÓN DE ABRIR LAS PINZAS
FOR(I=0;I<10;I++){ // CICLOS DE AJUSTE
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(T); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
}}} // CICLOS DE AJUSTE
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(200); // DELAY DE PULSO POSITIVO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(20000); // DELAY DE APAGADO
} // FOR CLOSE
} // CONDICIÓN DE CERRA PINZAS
} // WHILE
} //MAIN


// FUNCION DE DELAY EN US
VOID LONG_DELAY_US(LONG C){
CHAR i; // VARIABLE DE CONDICION
i=(CHAR)(C>>8); // IGUALA I A C EN 8 BITS
WHILE(I >= 1) { // CONDICION DE TIEMPO MINIMO
I--; // LA VARIABLE VA DISMINUYENDO
DELAY_US(253); // DELAY DE 253 US
RESTART_WDT(); // RESETEA EL CONTADOR DEL WATCHDOG
} // WHILE
DELAY_US((CHAR)C);
} //FUNCION DELAY US

Fución de contador con visualización en LCD

VOID DELAY(INT T); // ENCABEZADO DE LA FUNCIÓN

DELAY(10); // USO DELA FUNCIÓN PARA CONTAR 10 SEGUNDOS

// FUNCION DELAY EN S
VOID DELAY(INT T){ // T SON LOS SEGUNDOS QUE SE DESEA CONTAR
INT C=0;
FOR(C;C<(T+1);C++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",C);
LCD_PUTC("s    ");
DELAY_MS(1000);
} // FOR
} // FUNCION DELAY

Secuencia de Movimiento para un servo HS322 con visualización en LCD y pulsación de un laser

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4   PIN_B4
#DEFINE LCD_DB5   PIN_B5
#DEFINE LCD_DB6   PIN_B6
#DEFINE LCD_DB7   PIN_B7
#DEFINE LCD_RS    PIN_B2
#DEFINE LCD_E     PIN_B3
#INCLUDE <lcd1.c>

INT N; // CONTADOR DEL CICLO DE 3
INT D; // CONTADOR DE REPETICIONES
INT L; // CONTADOR DEL LASER
INT I; // CONTADOR DE LOS PULSOS
INT ENC; // ENTRADA DEL ENCODER

VOID MAIN(){
LCD_INIT();

FOR(I=0;I<30;I++){
OUTPUT_C(0X00); // APAGA EL LASER
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN NEUTRO
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_PUTC("\fSERVO NEUTRO");
} // FOR

WHILE(1){

FOR(N=1;N<4;N++){
OUTPUT_E(0X00); // APAGA EL LASER
LCD_PUTC("\fCICLO: "); // NUMERO DEL CICLO DE 3
PRINTF(LCD_PUTC,"%u",N);
DELAY_MS(1000);

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
LCD_PUTC("\fSECUENCIA P1"); // INICIA LA SECUENCIA DE LA PRACTICA 1
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SERVO: 0");
LCD_PUTC(", ENC: 0");
} // FOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(D=1;D<6;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR


FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:0, ");
LCD_PUTC("ED:0");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR

} // FOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
FOR(D=1;D<11;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR

FOR(D=1;D<4;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\fREPETICIONES: ");
PRINTF(LCD_PUTC,"%u",D);
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:180, ");
LCD_PUTC("ED:202.5");
} // FOR
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1500); // COLOCA EL SERVO EN 90°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("SV:90, ");
LCD_PUTC("ED:67.5");
} // FOR
} // FOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2250); // COLOCA EL SERVO EN 15°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:15, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2100); // COLOCA EL SERVO EN 30°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:30, ");
LCD_PUTC("ED:0");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1950); // COLOCA EL SERVO EN 45°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:45, ");
LCD_PUTC("ED:22.5");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1800); // COLOCA EL SERVO EN 60°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:60, ");
LCD_PUTC("ED:45");
} // FOR
FOR(D=1;D<4;D++){
LCD_GOTOXY(1,2);
LCD_PUTC("ESPERA: ");
PRINTF(LCD_PUTC,"%u",D);
LCD_PUTC("s");
DELAY_MS(1000);
} // CONTADOR
} // FOR DE CILO DE 3

FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(1050); // COLOCA EL SERVO EN 135°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(20000); // DELAY DE APAGADO
LCD_GOTOXY(1,1);
// DESPLIEGA EL ANGULO DEL SERVO Y DEL ENCODER EN LA LCD
LCD_PUTC("\fSV:135, ");
LCD_PUTC("ED:157.5");
} // FOR
FOR(L=0;L<5;L++){
OUTPUT_E(0X01); // ENCIENDE EL LASER
LCD_GOTOXY(1,2);
LCD_PUTC("LASER PULSANDO"); // ESPLIEGA MENSAJE DE SALER PULANDO
DELAY_MS(500);
OUTPUT_E(0X00); // APAGA EL LASER
DELAY_MS(500);
} // FOR LASER

} // WHILE
} //MAIN

Control de LCD con PIC 16F877A

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7
#define LCD_RS    PIN_B2
#define LCD_E     PIN_B3
#include <lcd1.c>


VOID MAIN(){
lcd_init();

FOR(;;){
lcd_putc("\f ICH HABE WASSER");
delay_ms(200);
} // FOR


} //MAIN



lnk para descargar la librería de la LDC, lcd1.c: http://microstronic.blogspot.mx/2015/04/modulos-lcd.html

Lectura de un encoder rotativo acoplado a servo HS322

El tamaño de paso para este encoder en especifico es de 22.5 grados.

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
// DEFINICION DE LAS CONEXIONES DE LA LCD AL PIC
#DEFINE LCD_DB4   PIN_B4
#DEFINE LCD_DB5   PIN_B5
#DEFINE LCD_DB6   PIN_B6
#DEFINE LCD_DB7   PIN_B7
#DEFINE LCD_RS    PIN_B2
#DEFINE LCD_E     PIN_B3
#INCLUDE <lcd1.c>


INT D; // CONTADOR DE REPETICIONES
INT I; // CONTADOR DE LOS PULSOS
INT ENC;

VOID MAIN(){

LCD_INIT();

while(1){

FOR(D=1;D<6;D++){
LCD_GOTOXY(1,1);
LCD_PUTC("\f");
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(2400); // COLOCA EL SERVO EN 0°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
FOR(I=0;I<20;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
DELAY_US(600); // COLOCA EL SERVO EN 180°
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
DELAY_US(200000); // DELAY DE APAGADO
LCD_GOTOXY(1,2);
ENC=INPUT_A(); // VALOR DE ENCODER IGUAL AL PUERTO A
// COMPARA EL VALOR DE ENC PARA DETERMINAR EL ANGULO
IF(ENC==0X00){ // COMPARA CON CERO
LCD_PUTC("\fENC:0");
} // IF
ELSE IF(ENC==0X01){ // COMPARA CON UNO
LCD_PUTC("\fED:22.5");
} // ELSE IF
ELSE IF(ENC==0X02){ // COMPARA CON DOS
LCD_PUTC("\fED:45");
} // ELSE IF
ELSE IF(ENC==0X03){ // COMPARA CON TRES
LCD_PUTC("\fED:67.5");
} // ELSE IF
ELSE IF(ENC==0X04){ // COMPARA CON CUATRO
LCD_PUTC("\fED:90");
} // ELSE IF
ELSE IF(ENC==0X05){ // COMPARA CON CINCO
LCD_PUTC("\fED:112.5");
} // ELSE IF
ELSE IF(ENC==0X06){ // COMPARA CON SEIS
LCD_PUTC("\fED:135");
} // ELSE IF
ELSE IF(ENC==0X07){ // COMPARA CON SIETE
LCD_PUTC("\fED:157.5");
} // ELSE IF
ELSE IF(ENC==0X08){ // COMPARA CON OCHO
LCD_PUTC("\fED:180");
} // ELSE IF
ELSE IF(ENC==0X09){ // COMPARA CON NUEVE
LCD_PUTC("\fED:202.5");
} // ELSE IF
ELSE IF(ENC==0X10){ // COMPARA CON DIES
LCD_PUTC("\fED:225");
} // ELSE IF
} // FOR
} // FOR

} // WHILE
} //MAIN

Función para el control de un servomotor HS322

Para el uso de la función solo restaría hacer la declaración de la misma en los encabezados del código, seria de la siguiente forma:

VOID SERVO(INT16 U, INT16 D);
VOID LONG_DELAY_US(LONG C);

La variable U es el ángulo de apertura t la variable D es el tiempo del pulso en cero se puede usar 20000, pero depende de la velocidad que se desee para el servo.

// FUNCION DE CONTROL DE SERVO
VOID SERVO(INT16 U, INT16 D){
INT I; // REPETICIONES DE LOS PULSOS
INT16 T; // VQARIABLE DE TIEMPO
T=2400-(U*10); // CALCULA EL TIEMPO DEL PULSO
FOR(I=0;I<30;I++){
OUTPUT_D(0X01); // ACTIVA LA SALIDA D
LONG_DELAY_US(T);
OUTPUT_D(0X00); // DESACTIVA LA SALIDA D
LONG_DELAY_US(D); // DELAY DE APAGADO
} // FOR
} // FUNCION SERVO

-- JUNTAR CON DELAY US

// FUNCION DE DELAY EN US
VOID LONG_DELAY_US(LONG C){
CHAR i; // VARIABLE DE CONDICION
i=(CHAR)(C>>8); // IGUALA I A C EN 8 BITS
WHILE(I >= 1) { // CONDICION DE TIEMPO MINIMO
I--; // LA VARIABLE VA DISMINUYENDO
DELAY_US(253); // DELAY DE 253 US
RESTART_WDT(); // RESETEA EL CONTADOR DEL WATCHDOG
} // WHILE
DELAY_US((CHAR)C);
} //FUNCION DELAY US

viernes, 11 de marzo de 2016

lunes, 18 de enero de 2016

Control de voz con aplicaicon

La aplicación se creo en App inventor, se basa en programación por bloques, en you tube existen muchos vídeos tutoriales de como se utiliza, en este post solo se mostraran lo bloques utilizados y la apariencia de la aplicaron.

Bloques


Apariencia de la aplicación


Código de comunicaron con el PIC en C

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT, // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER

CHAR COMANDO; // COMANDO DE CONTROL
VOID MAIN(){
WHILE(TRUE){
COMANDO=GETC(); // LEE EL DATO DEL BLUETOOTH
IF(COMANDO=='0'){ // MOTOR APAGADO
OUTPUT_LOW(PIN_D0); // PON D0 EN BAJO
OUTPUT_LOW(PIN_D1); // PON D1 EN BAJO
}// IF
ELSE IF(COMANDO=='1'){ // GIRA MOTOR PARA ABRIR LA VENTANA
OUTPUT_HIGH(PIN_D0); // PON D0 EN ALTO
OUTPUT_LOW(PIN_D1); // PON D1 EN BAJO
}// ELSE IF
ELSE IF(COMANDO=='2'){ // GIRA MOTOR PARA CERRAR VENTANA
OUTPUT_LOW(PIN_D0); // PON D0 EN BAJO
OUTPUT_HIGH(PIN_D1); // PON D1 EN ALTO
}// ELSE IF
ELSE IF(COMANDO=='a'){ // ENCIENDE FOCO DE LA SALA
OUTPUT_LOW(PIN_D2); // ON D2 EN BAJO
}// ELSE IF
ELSE IF(COMANDO=='b'){ // APAGA FOCO DE LA SALA
OUTPUT_HIGH(PIN_D2); // PON D2 EN ALTO
}// ELSE IF
ELSE IF(COMANDO=='c'){ // ENCIENDE FOCO DE LA COCINA
OUTPUT_LOW(PIN_D3); // PON D3 EN BAJO
}// ELSE IF
ELSE IF(COMANDO=='d'){ // APAGA FOCO DE LA COCINA
OUTPUT_HIGH(PIN_D3); // PON D3 EN ALTO
}// ELSE IF
ELSE IF(COMANDO=='e'){ // ENCIENDE FOCO DEL BAÑO
OUTPUT_LOW(PIN_C4); // PON D4 EN BAJO
}// ELSE IF
ELSE IF(COMANDO=='f'){ // APAGA FOCO DEL BAÑO
OUTPUT_HIGH(PIN_C4); // PON D4 EN ALTO
}// ELSE IF
}// WHILE

}// MAIN