lunes, 10 de octubre de 2011

Fuente de alimentacion de 5V

Fuente de alimentacion de 5V



Modulo adaptador rs232


Modulo adaptador rs232
Todos hemos visto que las computadoras tienen puertos de comunicación, que inclusive ocupamos muchas veces sin siquiera saber cómo trabajan, tal es el caso del puerto serie, al cual en la antigüedad de las computadoras le conectábamos el ratón, o un fax MODEM externo, o inclusive una impresora.

Convertidor de analogico a digita

Convertidor de analogico a digital esta configuración produce una señal cuya tensióndepende del número de pulsos aplicadosa la entrada. Podemos obtener niveles escalonados de 0 a 7, en función de los pulsos de entrada.



lunes, 3 de octubre de 2011

Multimetro digital de 0 a 5v

Es un circuito que mide la tensión de 0 a 5v por medio de un microcontrolador 16f876 y la muestra en una LCD en este ejemplo estoy utilizando un potencimetro para demostrar que funciona y ademas muestra el convertidor de analógico a digital.



#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <LCD.C>

void main() {
   int16 q;
   float p;

   setup_adc_ports(AN0);                                   //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   for (;;) {
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
      p = 5.0 * q / 1024.0;           //Conversión a tensión 

      printf(lcd_putc, "\fADC = %4ld", q);
      printf(lcd_putc, "\nVoltage = %01.2fV", p);

      delay_ms(100);
      }

Barómetro y altímetro

Mediante el uso de el sensor mpx4115 y el microcontrolador 16f876 recuerden que también funciona con el 16f870 la altitud y la presión y el promedio de la temperatura en la que se encuentra en algún cierto punto de la tierra. recuerde que este circuito funciona solamente con este tipo de sensor. al final de la pagina tienen el link para descargar el circuito y el programa.



#include <16F876.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <math.h>
#include <LCD.C>
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05

void main() {
   int16 q;
   float tv,tr,temp,y,tf,error;                          //Variables ecuaciones
   float p,presion,pres_atm,pres_psi,alt;       //Variables cálculo presión y altura
   int cnt=0;
   bit_set (TRISA , 2);
   setup_adc_ports(RA0_RA1_RA3_ANALOG);  //RA0 y RA1 analógica, RA2 digital
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   
   for (;;) {
      set_adc_channel(0);                       //Lectura presión en voltios
      delay_us(20);
      q = read_adc();
      p = 5.0 * q / 1024.0;
      presion= (0.475+p)/0.045;           //Lectura presión en Kpa

      set_adc_channel(1);                     //Lectura temperatura
      delay_us(20);
      q = read_adc();
      tv = 5.0 * q / 1024.0;
      tr = tv * 10000.0 / (5.0 - tv);
      y = log(tr/20000.0);
      y = (1.0/298.15) + (y *(1.0/4050.0));
      temp=1.0/y;
      temp = temp -273.15;
         if (temp>=0 && temp<=85) TF=1.0;
         else TF=3.0;
      ERROR = TF * 1.5;                   //Cálculo del error de presión con la temperatura
                                                            //el error puede ser ± pero aquí usamos - o + 
      presion=presion-ERROR;              //Presión en Kpa 
      pres_atm = presion * 0.0098692;   //Presión en Atm
      pres_psi = presion * 0.1450377;    //Presión en Psi
      alt = -7990.652789*log(presion/101.304);   //Altura 
     if (BIT_TEST(PORTA,2)==0) cnt++;    //Calcular número veces pulsa botón
     if (cnt>=4) cnt=0;           
      Switch (cnt) {                       //Según número veces pulsa botón se elige menú
        case 0:
        lcd_gotoxy(1,1);
        printf(lcd_putc, "\P= %5.2f Kpa   ", PRESION);
        printf(lcd_putc,"\nT = %04.2f C", temp);
        break;
        case 1:
        lcd_gotoxy(1,1);
        printf(lcd_putc, "\P= %4.2f atm   ", PRES_atm);
        printf(lcd_putc,"\nT = %04.2f C", temp);
        break;
        case 2:
        lcd_gotoxy(1,1);
        printf(lcd_putc, "\P= %3.2f psi   ", PRES_psi);
        printf(lcd_putc,"\nT = %04.2f C", temp);
        break;
        case 3:
        lcd_gotoxy(1,1);
        printf(lcd_putc, "\Alt= %7.2f m   ", alt);
        printf(lcd_putc,"\nT = %04.2f C", temp);
        break;
         }
     delay_ms(100);
      }}



domingo, 2 de octubre de 2011

control de velocidad de motor cc

Es un circuito mediante un teclado se puede controlar la velocidad del motor tiene 10 velocidades distintas en las cueles pude girar le dejo el circuito y el programa para descargarlo



#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY (CLOCK=4000000)
#INCLUDE <MI_kbd.C>
#include <MI_lcd.c>
#USE STANDARD_IO (a)
int16 counter=0;

//*************** INT TIMER1*********************
#int_TIMER1
void TIMER1_isr(void) {
counter=get_timer0();         //Lectura contador TMR0
counter=counter*2*120;     //Conversión a rpm
  printf(lcd_putc,"%6lu rpm",counter);
  lcd_gotoxy(1,1);
set_timer0(0);                      //Reinicia cuenta
set_timer1(3036);                // Recarga a 0.5s
 }
//**********************************************
VOID MAIN()
{        
   CHAR K,kant='0';
   char PWMH=0,PWML=0;
   lcd_init();
   kbd_init();
   PORT_B_PULLUPS(TRUE);
 
   setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2);   //Configuración TMR0
     setup_timer_1(T1_internal|T1_DIV_BY_8);     //Configuración TMR1
   set_timer0(0);                               //Borrado contador
   set_timer1(3036);                         //Carga a 0.5s
   enable_interrupts(int_timer1);
   enable_interrupts(global);           //Habilitación interrupciones
 
WHILE (1) {
      k=kbd_getc();
      if (k=='\0') k=kant;
      if ((k=='*') || (k=='#')) k='0';
      kant=k;
       k=k-48;
       PWMH=k*28;
       PWML=255-PWMH;
      for(PWMH;PWMH>0;PWMH--){
       OUTPUT_HIGH(PIN_A0);}
      for(PWML;PWML>0;PWML--){
      OUTPUT_LOW(PIN_A0);}
  }}

Cerradura electrónica

Mediante un teclado matricial se puede enviar caracteres al microcontrolador la contraseña se guarda en la memoria Eeprom del microcontrolador mediante un relevador  puedes activar cualquier cosa para que funcione con un código es 723 les dejo el circuito y el programa par descargarlo al final de la pagina








#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a)

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'}  //Posición 0,1 y 2 de la Eeprom con los datos…
                           //7,2, y 3 respectivamente
void main() {
   char k;
   int i;
   char data[3], clave[3];  //Matrices para guardar clave y datos

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);

   while (TRUE) {
   i=0;            //posición de la matriz

   printf(lcd_putc,"\fpulsar tecla 1\n");  //Para primer dato

   while(i<=2){                //Para tres datos
      k=kbd_getc();            //Lee el teclado
      if (k!=0)                //Si se ha pulsado alguna tecla
         {data[i]=k;           //se guarda en la posición correspondiente
          i++;                //de la matriz
          printf(lcd_putc,"\fpulsar tecla %u\n",i+1);  //Siguiente dato
         }
    }

   for (i=0;i<=2;i++) {             //Pasa datos de eeprom a la matriz clave
     clave[i]=read_eeprom(i);}

   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
      { printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
        output_high(PIN_A0);                //Si es igual da pulso al relé
        delay_ms(500);
        output_low(PIN_A0);}
   else printf(lcd_putc,"\fPuerta Cerrada");  //Clave erronea
   delay_ms(1000);
   }}

Contador de 0 al 99

Este circuito muestra el conteo de 0 al 99 mediante los display de 7 segmentos es realmente sencillo y fácil de programar con el microcontrolador 16f876.




#include <16F876.h>
#USE DELAY( CLOCK=4000000)
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#USE fast_IO (B)
#USE fast_IO (A)
byte CONST DISPLAY[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

main(){
byte ud=0,dec=0;
SET_TRIS_B(0x00);
SET_TRIS_A(0x00);
OUTPUT_B(0);
 for( ;; ){
   for (dec=0;dec<10;dec++){       //Cuenta digito decenas
      for (ud=0;ud<10;ud++){
         OUTPUT_A(0x02);           //cat_D=apagado,cat_U=encendido
         OUTPUT_B(DISPLAY[ud]);   //Digito unidades
         delay_ms(50);            //Para evitar parpadeos
         
         if (dec==0) output_a(0x03);     //Si decenas=0, cat_D=apagado
         else output_a(0x01);           //Si decenas>0, cat_D=encendido
                  
         OUTPUT_B(DISPLAY[dec]);      //Digito decenas
         delay_ms(50);               //Para evitar parpadeos
     }}}}



Contador del 0 al 255

Este es un contador con el microcontrolador 16f84a cuenta del 0 al 255 mediante un botón se puede contar los pulsos de entrada y se muestran el la LCD, el botón se puede reemplazar por cualquier sensor que trabaje de 0 a 5 V se puede cambiar el programa para que pueda contar mas 255 cambiando la variable que se usa en el programa en ccs. Y como ya saben les dejo la simulación y el circuito en proteus.





       # include <16f84a.h>
      # fuses XT,NOWDT
      # use delay (clock= 4000000)
      
      # include <LCD.C>
     
      void main (){
      char valor = 0;
      char n_valor = 255;
      lcd_init();
     
      for (;;){
      if (input (PIN_A4) == 0){
      valor++;
      delay_ms(100);}
     
     if (valor > (n_valor-1)){
      valor = 255;}
      printf (lcd_putc,"\f    CONTADOR",);
      printf (lcd_putc,"\n       %1u" ,valor ,);
      delay_ms(300);
      }}

Comunicación rs232 del pic a pc

A continuación se muestra el programa como pueden ver es realmente sencillo hacer este tipo de programas sola la variable prende es suficiente para enviar la información de todo el puerto a la pc. como ya lo saben les dejo el archivo simulado en proteus y el programa en ccs a final de esta pagina,es un archivo Wirar lo tienen que descomprimir suerte.



     


# include <16f873a.h>
     # fuses XT,NOWDT
     # use delay (clock= 4000000)
     # use rs232(baud=9600, xmit = pin_c6, rcv=pin_c7, bits=8, parity=n)
     
     void main () {
     int prende;
     while (1){
     
     prende = input_b ();
    
    printf("  PUERTO_B = %LX",prende);  
    delay_ms(500);} }

¿Qué es Mecatrónia?

MECATRÓNICA: Mecatrónica es la integración cinegética de la ingeniería mecánica con la electronica y con el control de computadores inteligentes para el diseño y la manufactura de productos y procesos. un ingeniero en mecatrónica es capaz de resolver problemas dentro y fuera de las industrias es capaz de realizar nuevos prototipos tecnologicos, 

El termino "mecatrónica" fue acuñado en Japón a principios de los 80’s y comenzó a ser usado en Europa y USA un poco después.

D'vinci como un hombre que utilizaba su ingenio y sus conocimientos para crear los mas diversos inventos y aparatos a un Arquímedes que proponía ya sistemas de propulsión y control a maxwell que proponía la integración de las ciencias; todos estos hombres tenían algo en común contaban con un equipo interdisciplinario y se comprendían con el {sabían el lenguaje de todos.} A esto se refiere la mecatrónica que queremos hacer en la universidad y es el termino que define mejor el perfil del ingeniero que este tiempo necesita.

Sistema de riego

A continuación les demostrare como hacer un sistema de riego con el microcontrolador 16f873a  controlando la hora de riego y el tiempo de riego por medio de un reloj digital y además tendrá un termómetro digital. Demostrando las variables en una lcd .
Bueno a continuación demostrare el programa en ccs le recomendaría que simularan este circuito en proteus 7 profesional. Para que se den una idea del funcionamiento del programa.
Programa en ccs   y además les dejare el archivo .hex  para cargarlo al microcontrolador  solo que no tengo un espacio donde subir mis archivos para descargar pero les dejo el código maquina solo tienen que copiarlo en el bloc de notas y guardarlo con la extensión .hex y listo tienen su programa para cargarlo al microcontrolador suerte.


#include <16F873a.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading


#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
int segundos,minutos,horas,temperatura;
int seg=0;
int n_horas=24;
int n_minutos =60;


int prende= 0;
int ehoras,eminutos;
int ahoras,aminutos;

     //INTERRUPCION//
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
   seg++;
   if(seg==59){                //Condición de cambio
      segundos++;              // cuenta 1 segundo
      seg=0;
       delay_ms(300);
   }}
void main(void){
   setup_adc_ports(RA0_ANALOG);// configura RA0 como entrada analogica
   set_tris_a(0xff);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);  //Configura timer0 y prescaler
   set_timer0(131);                          //Inicializa timer0
   enable_interrupts(INT_RTCC);             //Habilita interrupción timer0
   enable_interrupts(GLOBAL);              //Habilita Interrupciones
   lcd_init();                            // inicializa el LCD
   set_adc_channel(0);
   delay_us(1000);
   while(true){
 
      temperatura=read_adc(); //lee valor analogico
    if (input (PIN_A1) == 0){
     horas++;
     delay_ms(100);}
    
     if (input (PIN_A2) == 0){
     minutos ++;
     delay_ms(100);}
    
     if (horas > (n_horas-1)){
      horas = 0;}
     
      if (minutos > (n_minutos-1)){
      minutos = 0;}
     if (input (PIN_A3) == 0){
     ehoras++;
     delay_ms(100);}
    
     if (input (PIN_A4) == 0){
     eminutos ++;
     delay_ms(100);}
     
     if (ehoras > (n_horas-1)){
      ehoras = 0;}
     
      if (eminutos > (n_minutos-1)){
      eminutos = 0;}
    
    if (input (PIN_A5) == 0){
     ahoras++;
     delay_ms(100);}
    
     if (input (PIN_C0) == 0){
     aminutos ++;
     delay_ms(100);}
    
     if (ahoras > (n_horas-1)){
      ahoras = 0;}
     
      if (aminutos > (n_minutos-1)){
      aminutos = 0;}
   
    if(segundos>59){
    segundos=0;
    minutos++;
    if(minutos>59)
         {
    minutos=0;
    horas++;
    if(horas>24)
    horas=0;
    }  } {
    if ((horas == ehoras)&& (minutos == eminutos))
   
    ((output_high(PIN_C2))&& (output_high(PIN_C3)));
   
     if ((horas == ahoras)&& (minutos == aminutos))
     ((output_low(PIN_C2))&& (output_low(PIN_C3)));
    }
      printf (lcd_putc,"\fH:%02u:%02u Temp:%d%cC" ,horas,minutos,temperatura*2,0xdf);
      printf (lcd_putc,"\nE:%02u:%02u A:%02u:%02u" ,ehoras,eminutos,ahoras,aminutos);
     delay_ms(500);
     
   }}}
//fin del programa ccs


Aquí tienen todos los archivos de la simulación en proteus y ademas el programa en ccs .