Aqui explicaremos como hacer que se muevan 3 servos a travez de una aplicación en Visual Basic de donde mandaremos los datos por puerto serial a un pic16f628a el cual generara los 3 PWM necesarios para el control de los servomotores. Componentes:
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
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.
Bueno amigos aquí les dejo el primer tutoríal de solidworks este describe como generar un tornillo mediante el uso de varias herramientas que componen al programa espero les sea de ayuda. Comenten sobre los tutoriales , cuales les gustaría que se realizaran sobre que tema o programa.
Simulación en proteus de un circuito con microcontrolador de microchip donde se lee un canal de adc y se despliega en un lcd de 16x2 caracteres tanto el valor del adc como del voltaje que representa.
Diagrama de conexión El video donde se muestra el programa, conexion y funcionamiento del circuito
Nota: los servos tienen 3 pines uno de alimitacion uno de tierra y uno de control dependiendo la marca es el color de cada pin hay que checar cuales son y hacer la conexion directa del de control con el pin de salida del micro.
Aquí les dejo un vídeo de introducción a la interfaz gráfica de usuario con matlab donde se realiza un ejemplo de un programa que calcula el factorial de un numero introducido y lo despliega disfrutenlo.
En esta practica se comprendera el uso de la interrupcion externa por medio del encendido de un led durante 1 segundo cada vez que se presione el push button conectado al pin de la interrupcion externa. La interrupcion se hara cada vez que el pin cambie de estado alto a bajo.
Para la simulación necesitaremos añadir los siguientes componentes en el programa proteus: *Pic16f628a *Resistencia 330 ohms *led *push button *resistencia 10K
Imagen donde se muestra la conexion.
Pin de interrupcion externa=Pin B0 Pin de salida al led= Pin B1 Video con la descripcion y programa.