- pic16f628a
- 3 servomotores
- compim
- max232
- capacitores .1uf para max232
- capacitores 22pF para el oscilador
- cristal 20MHz
Para la simulacion en proteus omitiremos la parte del max232, en el circuito real es necesario poner el max232 para que ponga los niveles a ttl.
Aqui el diagrama de conexion del max232 al pic

Aqui el diagrama de conexion del max232 al pic

El programa del pic.
#include <16f628a.h>//usaremos el pic16f628a
#fuses HS,NOWDT,NOmclr//usaremos cristal high speed. desactivmos
//watch dog y el master clear
#use delay(clock=20000000)//delay con clock a 20MHz
//configuracion transmision serie
#use rs232(baud=9600, xmit=PIN_b2, rcv=PIN_b1,bits=8,parity=n)
#use fast_io(A)//uso de puerto a
#use fast_io(B)//uso rapido puerto b
//output_low() esta instruccion pone en bajo el estado del pin que se ponga
//entre parentesis
#priority rda,timer1//damos mayor prioridad a recibir datos que el timer1
//definimos 3 pines donde sacaremos pwm para el control de los servos
#define SERVO1 PIN_b5
#define SERVO2 PIN_B3
#define SERVO3 PIN_b4
//nuestras variables
int carga=0;
//el valor inicial de s1, s2 y s3 determina la posicion inicial de los servos
int s1=82,s2=81,s3=80,counter=0,periodo=750;
//funcion de interrupcion por rs-232
#int_rda
void serial_isr(void){
//Dependiendo como lleguen los datos seran cargados a su variable
switch(carga){
case 0:{
s1=getc();
carga++;
break;}
case 1:{
s2=getc();
carga++;
break;}
case 2:{
s3=getc();
carga++;
break;}
case 3:{
carga=0;
break;}
}}
//funcion de interrupcion por timer1
#int_timer1
void timer1_isr(void){
//se vuelve a cargar el valor del timer
set_timer1(65470);
//si el contadr es 0 indica el inicio de ciclo por lo cual pone en alto
//todos los pines
if(counter==0){
output_high(SERVO1);
output_high(SERVO2);
output_high(SERVO3);
}
//si el valor del contador es igual al que recivimos por rs-232
//ponemos en bajo el valor de ese pin
if(counter==s1)output_low(servo1);
if(counter==s2)output_low(servo2);
if(counter==s3)output_low(servo3);
counter++;//aumentamos el contador
if(counter==periodo)//si el contador es igual al periodo entonces reiniciamos
//el contador quiere decir iniciamos otro ciclo
counter=0;
}
void main(void) {
set_tris_b(0b00000010);//ponemos pin b1 como entrada y las demas como salida
set_tris_a(0b00000000);//puerto a como salidas
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);//configuramos timer 1
//usamos timer con clock externo
setup_timer_1(T1_internal | T1_DIV_BY_1);
output_low(SERVO1);
output_low(SERVO2);
output_low(SERVO3);
delay_ms(1000);
//habilitamos interrupcion por recepcion de datoss rs-232
enable_interrupts(int_rda);
//cargamos el timer
set_timer1(65470);
//habilitamos interrupcion por timer1
enable_interrupts(int_timer1);
//habilitamos interrupciones
enable_interrupts(global);
while(1){}
}
Este es el formulario creado en Visual Basic 2008 express
Ahora pongo el codigo necesario para que funcione.Public Class Form1
Dim servo1(20) As Byte
Dim servo2(20) As Byte
Dim servo3(20) As Byte
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
servo1(0) = CByte(Val(TextBox1.Text))
servo2(0) = CByte(Val(TextBox2.Text))
servo3(0) = CByte(Val(TextBox3.Text))
SerialPort1.Open()
SerialPort1.Write(servo1, 0, 1)
SerialPort1.Write(servo2, 0, 1)
SerialPort1.Write(servo3, 0, 1)
SerialPort1.Close()
End Sub
End Class
Aparte de los componentes mostrados debemos añadir otro que es el serialport este nos permite la transmision de datos y al ponerlo en las propiedades debemos poner el COM con el cual cuenta nustra computadora en este caso usare el 2 que esta conectado con el 1 que esta en el proteus para la simulacion.

Aqui la simulacion, hay que ver que los valores que se tienen que mandar dependen de cada servo ya que no es exacto el control de cada uno por lo cual hay que probar valores desde mandar un 40 hasta un 90 por ejemplo solo probando sabremos el tope de cada servo, en la simulacion los valores van de 45 a 91 con una resolucion de 3º aproximadamente.
NOTA: Tenemos que conectar el max232 como viene en su hoja de datos es necesario para poner los niveles a TTL.
camarada no habra chanse de ke me lomandes todo el programa y una k otra instruccion gracias
ResponderEliminaratt estudiante de 7mo sem ing electromecanica ezekiel carrillo
te dejo mi emilio sheke_319@hotmail.com
ResponderEliminarhola, quisiera saber si me podrias mandar los archivos del proyecto a mi correo: italog86@hotmail.com ya que apesar que intente hacerlo, no me sale tal como esta en el video, espero no sea mucha molestia, saludos.
ResponderEliminarse ve bueno,, voy a intentar a ver que sale,,,
ResponderEliminarMuy buen proyecto ya lo hice y funciona de maravillas gracias por proporcionar los códigos del pic y de visual basic
ResponderEliminar