Autor Tema: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY  (Leído 3110 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« en: 18 de Enero de 2015, 01:55:54 »
Ya hace tiempo tengo este proyecto y hoy lo pongo en el foro.

Aquí explico todo.

Código: ActionScript
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //                                                                            //
  3. //                                                                            //
  4. //       ESTE PROGRAMA DECODIFICA LAS SEÑALES DE UN CONTROL REMOTO SONY       //
  5. //    ____________________________________________________________________    //
  6. //                                                                            //
  7. //                                                                            //
  8. //    Sus funciones son:                                                      //
  9. //                                                                            //
  10. //    *  Apagado y encendido de una lampara en modo on/off                    //                                                
  11. //    *  Regular gradualmente la intensidad de la lampara.                    //
  12. //                                                                            //
  13. //                                                                            //
  14. //    Se aprende los botones, regula la intensidad en forma automatica, tiene //
  15. //    modo sleep y modo de encendido por dia.                                 //
  16. //                                                                            //
  17. //    La entrada del sensor es el pin A0, el sincronismo es A1  y la lampara  //
  18. //    es conectada al pin ccp1(GP2).                                          //
  19. //                                                                            //
  20. //    En pin a3 es para seleccionar entre foco normal o ahorrador, el pin A5  //
  21. //    es conectado un led indicador.                                          //
  22. //                                                                            //
  23. //    El pin a4 es la entrada de la fotoresistencia para controlar automati-  //
  24. //    -camente la intensidad.                                                 //
  25. //                                                                            //
  26. //    Conectar la fotoresistencia con el divisor de voltaje de tal modo que   //
  27. //    a mas luz menos voltaje.                                                //
  28. //                                                                            //
  29. //    se corrigieron problemas con foco ahorrador                             //
  30. //                                                                            //
  31. ////////////////////////////////////////////////////////////////////////////////
  32.  
  33.       #include <12f683.h>                 // Declaramos pic (se ocupa este por ser el unico de 8 pines con pwm).
  34.       #fuses NOWDT, NOPROTECT, BROWNOUT, PUT, NOCPD, NOMCLR, INTRC_IO, NOIESO, NOFCMEN
  35.       #device ADC=10
  36.       #use delay(clock=1000000) //frecuencia de trabajo de 1Mhz
  37.       #use fast_io (A)
  38.  
  39.       byte  codigo[2]={0,0},code_up[2]={0,0},code_down[2]={0,0},code_onoff[2]={0,0};
  40.      
  41. ////////////////////////////////////////////////////////////////////////////////
  42. /////////  variables de codigo leido del control y codigos de función  /////////
  43. ////////////////////////////////////////////////////////////////////////////////
  44.  
  45.       int16 tstart=440,ton=250,adc;       // Tiempo de bit de start 3T=1800 uS y tiempo de bit 1 2T=1200 uS
  46.       int cont1=0,cont2=0;                // Contadores de bits leidos
  47.       unsigned int disparo=128;           // Angulo de disparo por default esta entre 28 y 129 (rango dependiendo de config timer2)
  48.       short sincro1=0,on_off=0;           // Banderas de ciclo completo, apagar (para antirrebote)
  49.       unsigned int aprender=0,ciclos=0,ciclos1=0,hold=0;
  50.      
  51.       // Aprender codigo segun alguna condicion(solo para compatibilidad), ya se han leido los 3 codigos y cargalos a la ram
  52.       // Banderas: ciclo completo, ciclos transcurridos(usados para retardos),
  53.       // Cuenta cuando se deja presionado la tecla encender apagar,
  54.      
  55.       short modo_auto=0,auto_ini=1;       // Bandera para indicar si se activo el modo automatico,bandera que inicializa el modo automatico-*-*-*-*
  56.       short modo_time1=0,modo_time2=0;    // Banderas para activar modo sleep o encendido por tiempo
  57.       int16 base_tiempo=0;                // Se usa para llevar la cuenta del tiempo en modo sleep y modo ciclico
  58.       short ahorrador=0,edo_ahorrador=0;  // Bandera que indica si esta usando foco ahorrador,foco ahorrador prendido o apagado
  59.      
  60.      
  61. ////////////////////////////////////////////////////////////////////////////////      
  62. ///////////////////// Rutina de sincronismo con la AC //////////////////////////
  63. ////////////////////////////////////////////////////////////////////////////////
  64.  
  65.       void sincroniza(void)
  66.    {
  67.       if(!input(PIN_A1)) sincro1=1;       // Ha pasado ciclo positivo? si = activa bandera
  68.       if(sincro1 & input(pin_A1))         // Es un ciclo completo? y esta como bombilla
  69.       {
  70.       if(!ahorrador)                      // Si no esta como foco ahorrador sincroniza
  71.       {
  72.       if(disparo!=28)                     // Si el angulo no es minimo, <<=== aumentar el valor de angulo minimo cambiado a 28 en lugar de 15
  73.       {
  74.       set_timer2(disparo);                // Actualiza el valor del angulo de disparo
  75.       setup_ccp1(CCP_PWM);                // Ajusta el sincronismo
  76.       }
  77.       else
  78.       setup_ccp1(CCP_OFF);                // Si el angulo de disparo es muy pequeño mejor apaga pwm para que no haya fugas de corriente
  79.       }
  80.       sincro1=0;                          // Reiniciar otro ciclo
  81.       ciclos++;                           // Cuenta los ciclos que van (para ser usado en retardo o antirrebotes)
  82.                                           // como el programa esta atendiendo mas de una variable a la vez no se pueden usar retardos o ciclos repetitivos
  83.       ciclos1++;                          // Retardo para la correccion de error en modo automatico y cuenta los ciclos para formar segundo
  84.       }
  85.    }                                      // Termina la función sincroniza
  86.  
  87.  
  88. ////////////////////////////////////////////////////////////////////////////////      
  89. ////////////////////////////// escribir eeprom /////////////////////////////////
  90. ////////////////////////////////////////////////////////////////////////////////
  91.  
  92.       void wr_eeprom(byte address,byte data)    // los datos a ser leidos o escritos en eeprom son convertidos
  93.    {                                            // a variables tipo byte para evitar conflictos y como es lento hay que sincronizar
  94.       write_eeprom(address,data);
  95.       sincroniza();
  96.    }
  97.    
  98.    
  99. ////////////////////////////////////////////////////////////////////////////////      
  100. //////////////////////////////// leer eeprom ///////////////////////////////////
  101. ////////////////////////////////////////////////////////////////////////////////  
  102.    
  103.       byte rd_eeprom(byte address)
  104.    {
  105.       return(read_eeprom(address));
  106.       sincroniza();
  107.    }
  108.    
  109.    
  110. //------------------------------------------------------------------
  111.  
  112.       void carga_code(void)                                             // Carga en ram los codigos una vez
  113.    {                                                                    // que se tienen listos los 3 codigos
  114.       code_up[1]=rd_eeprom(0x12); code_up[0]=rd_eeprom (0x11);
  115.       code_down[1]=rd_eeprom(0x14); code_down[0]=rd_eeprom (0x13);
  116.       code_onoff[1]=rd_eeprom(0x16); code_onoff[0]=rd_eeprom (0x15);
  117.    }                                                                    //Cierra carga_code
  118.  
  119. //----------------------------------------------------------------
  120.       void guarda_code(void)              //guarda en eeprom los 3 codigos de funcion y solo los acepta si son diferentes
  121.    {
  122.       if(aprender!=0)                     //si se activo la bandera aprender guarda los codigos
  123.    {
  124.       if(aprender==1)                     //guarda codigo para aumentar intensidad
  125.       {wr_eeprom(0x11,codigo[0]);  wr_eeprom(0x12,codigo[1]);}
  126.       if(aprender==2)                     //guarda codigo para disminuir intensidad y comrara que sea diferente al primero
  127.    {
  128.       if((codigo[0]!=rd_eeprom (0x11)) | (codigo[1]!=rd_eeprom (0x12)))
  129.    {  wr_eeprom(0x13,codigo[0]); wr_eeprom(0x14,codigo[1]); }
  130.       else
  131.       aprender=1;
  132.    }
  133.       if(aprender==3)                     //guarda codigo para on-off y compara que sea diferente al primero y segundo y si ya se leyeron los 3 actualizalos en ram
  134.    {
  135.       if(((codigo[0]!=rd_eeprom (0x11)) | (codigo[1]!=rd_eeprom (0x12))) & ((codigo[0]!=rd_eeprom (0x13)) | (codigo[1]!=rd_eeprom (0x14))))
  136.    {  wr_eeprom(0x15,codigo[0]); wr_eeprom(0x16,codigo[1]); carga_code();}
  137.       else
  138.       aprender=2;
  139.    }
  140.       if(aprender>=3)                     // si ya se han leido 3 diferentes sale y ya no vuelve a entrar a la subrutina
  141.       aprender=0;
  142.       else
  143.       aprender++;
  144.    }
  145.    }                                      // Cierra guarda_code
  146.  
  147.  
  148.  
  149. void readcodigo(void)
  150. {
  151. //----------------------lee codigo------------------------------- <<-- posible version todas marcas
  152.                                            //muestreando a cada cierto tiempo y guarda en un arreglo grande rotando bits
  153.                                            //aplicando reglas generales posibles problemas de memoria
  154. SET_TIMER1(0);//start =3t t=600uS    //inicia a contar timer 1
  155. while(!input(PIN_A0)){sincroniza();}  //se espera en lo que dura el bit de start y esta sincronizando
  156. if( GET_TIMER1() < tstart )          //checa si el tiempo corresponde al bit de start y si no se sale
  157. goto salir;
  158. codigo[0]=0;  //inicializar codigo proveniente del control
  159. codigo[1]=0;
  160. for(cont1=1;cont1<=12;cont1++) //lee los 12 bit de codigo (norma RECS80 de sony)
  161.  {
  162.  while(input(PIN_A0)){sincroniza();} //se mide el tiempo de cada transicion y verifica si es 1 o 0 segun su duracion
  163.  SET_TIMER1(0);
  164.  while(!input(PIN_A0)){sincroniza();}//el tiempo que interesa el el tiempo en bajo (si dura t o 2t)
  165.  if(GET_TIMER1()>ton)
  166.  shift_left(codigo,2,1);//rota 1 posicion e inserta 1 si bit=1 trabaja con 2 bytes
  167.  else
  168.  shift_left(codigo,2,0);//rota 1 posicion e inserta 0 si bit=0 trabaja con 2 bytes
  169.  }
  170.  
  171. //-------------------compara codigo--------------------------------//ejecuta la accion segun el codigo recibido
  172.  
  173.   if((code_up[0]==codigo[0]) & (code_up[1]==codigo[1])) {if(disparo<129 & input(PIN_A3)) {ahorrador=0; disparo++;}//aumentar intensidad solo si esta en modo lamp incandescente
  174.  if(auto_ini==0){modo_auto=0; auto_ini=1; modo_time1=1; output_low(pin_a2); delay_ms(500); if(input(PIN_A3))disparo=128; else{ setup_ccp1(CCP_OFF); ahorrador=1; output_high(PIN_A2); }  }
  175.  }
  176.  //ademas si se estaba en modo auto o modo time se sale y toma en cuenta el tipo de foco para encenderlo (inicia cuenta de tiempo)
  177.  
  178.  if((code_down[0]==codigo[0]) & (code_down[1]==codigo[1])) {if(disparo>28 & input(PIN_A3)) {disparo--; ahorrador=0;}//disminuir intensidad solo si esta en modo lamp incandescente
  179.  if(auto_ini==0){modo_auto=0; auto_ini=1; modo_time2=1; output_low(pin_a2); delay_ms(500); if(input(PIN_A3))disparo=128; else{ setup_ccp1(CCP_OFF); ahorrador=1; output_high(PIN_A2); }  }
  180.  }
  181.  //ademas si se estaba en modo auto se sale y entra a modo sleep y toma en cuenta el tipo de foco para encenderlo (inicia cuenta de tiempo)
  182.  
  183.  if((code_onoff[0]==codigo[0]) & (code_onoff[1]==codigo[1])) {on_off=1; ciclos=0;//apagar-encender
  184.  if(auto_ini==0){modo_auto=0; auto_ini=1; } modo_time1=0; modo_time2=0; base_tiempo=0; output_high(PIN_A5); }
  185.  //ademas si se estaba en modo auto, sleep o ciclico se sale y apaga led
  186.  guarda_code();// si no se han grabado en eeprom los codigos se ejecuta la subrutina
  187. //-------------------------borra codigo-----------------------------
  188. salir:
  189. set_timer1(0);
  190. codigo[0]=0;
  191. codigo[1]=0;
  192. }//read codigo
  193.  
  194. //-------------interrupcion para activar el control automatico---------
  195. #INT_TIMER0
  196. control_auto(void)          //  <<===  aumentar tiempo (no es posible con timer0 ya tiene maximo prescaler)
  197. {
  198. if(on_off) //si se mantiene presionada la tecla on-off cuenta
  199. {
  200. hold++;
  201. if(hold>12) //si se mantuvo presionada la tecla on-off aprox 3 seg o mas se activa el modo automatico
  202. {modo_auto=1; auto_ini=1;}
  203. }
  204. else
  205. {
  206. hold=0;  //al soltar la tecla on-off se limpia la variable hold
  207. }
  208. }
  209.  
  210. //--------------------------------inicio----------------------------------
  211. main(void)
  212. {
  213. setup_oscillator( OSC_1MHZ | OSC_INTRC);//se configura oscilador rc interno sin salida de señal al exterior a 1Mhz
  214. set_tris_a(0x1B); //gp4 in gp1 in gp0 in gp3 in
  215. output_low(PIN_A5); //encendemos led de espera de encendido(logica invertida)
  216. output_low(PIN_A2); //primeros segundos foco apagado
  217. delay_ms(800);
  218. output_high(PIN_A5);
  219. //-------------inicializaciones--------------------------------------------
  220. setup_adc(ADC_CLOCK_INTERNAL); // usamos  adc
  221. setup_adc_ports(sAN3); //a4 al adc para leer la fotoresistencia(pin a4 pero canal analogo 3)
  222. set_adc_channel(3); //a4 seleccionado
  223. setup_timer_0 (RTCC_DIV_256|RTCC_INTERNAL);  //timer 0 se desborda aprox cada .2 seg para usarlo en hold (interrupcion)
  224. setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1);  //timer 1 se incrementa cada 4 uS
  225. set_rtcc(0);
  226. disable_interrupts(INT_EXT);    //     \
  227. disable_interrupts(INT_TIMER1); //     |
  228. disable_interrupts(INT_TIMER2); //     |
  229. disable_interrupts(INT_RA);     //      > no utilizamos estas interrupciones-*-*-
  230. disable_interrupts(INT_CCP1);   //     |
  231. disable_interrupts(INT_COMP);   //     /
  232. enable_interrupts(INT_TIMER0);// usamos estas interrupciones
  233. enable_interrupts(GLOBAL);// habilitamos en general las interrupciones
  234. setup_comparator(NC_NC_NC_NC); //comparador analogico apagado
  235. setup_timer_2(T2_DIV_BY_16, 130, 1); //timer 2 configurado para pwm a una frecuencia de 120 Hz
  236.  
  237. //-------------------comprobacion para ver si se queren cambiar los codigos de funcion-----------------
  238. if(rd_eeprom(0x17)==0x01) //si apago y encendio dos veces el modulo aprende codigos y enciende a media intensidad
  239.  {
  240.  aprender=1; //activamos bandera de guardar codigos de funcion
  241.  if(input(PIN_A3)) //si esta como bombilla
  242.  disparo=65; //angulo de disparo por default (variable que se carga a timer 2 al sincronizar y es el
  243.             //numero desde que empieza a contar timer2 y de acuerdo a la configuracion de setup_timer2 se
  244.             //incrementa cada cierto tiempo y a desbordarse es cuando pwm genera un pulso en alto o sea duty(1) )
  245.  else //si esta como foco ahorrador
  246.  {
  247.  output_high(PIN_A2);  //enciende y apaga 2 veces
  248.  delay_ms(200);
  249.  output_low(PIN_A2);
  250.  delay_ms(200);
  251.  output_high(PIN_A2);
  252.  delay_ms(200);
  253.  output_low(PIN_A2);
  254.  }
  255.  }
  256. else   //si no aprendes codigos entonces prende a maxima intensidad segun tipo de foco
  257.  disparo=128;
  258.  
  259.  
  260. wr_eeprom(0x17,0x01);//activamos bandera en eeprom de encendido del modulo
  261. delay_ms(1200);  //si pasa 1 segundo y no apagamos el modulo quiere decir que no queremos que se aprenda codigos nuevos
  262. wr_eeprom(0x17,0x00);//desactivamos bandera en eeprom de encendido del modulo
  263. set_pwm1_duty(1); //ancho del pulso en alto para disparo, solo un pequeño pulso en alto
  264.  
  265. if(!input(PIN_A3))
  266. {
  267. setup_ccp1(CCP_OFF);
  268. output_high(PIN_A2);
  269. ahorrador=1;
  270. }
  271.  
  272. carga_code(); //cargamos codigos de funcion de eeprom
  273. //----------------------------------------------------------------------------------
  274.  
  275.       while(TRUE) //ciclo principal
  276.    {
  277.       sincroniza(); //la mayor parte de tiempo esta sincronizando
  278.  
  279.       if(modo_time1)//si fue activado el modo sleep permanece activado 1 o 5 min y se apaga
  280.       if(ciclos>=60)
  281.    {
  282.       ciclos=0; base_tiempo++; output_toggle(PIN_A5); if(base_tiempo==60){disparo=28; base_tiempo=0; modo_time1=0; if(input(PIN_A3)) ahorrador=0; else{ ahorrador=1; setup_ccp1(CCP_OFF); output_low(PIN_A2); }  }
  283.    }
  284.    
  285.       //verifica que se ha cumplido la base de tiempo (1 seg) y al cumplirse 60 seg se apaga y ya no entra a la rutina ya sea como foco ahorrador o normal
  286.  
  287.       if(modo_time2)//si fue activado el modo de encendido temporal permanece activado 3 hrs y se apaga y al dia sig otras 3 horas etc
  288.       if(ciclos>=120)
  289.    {
  290.       ciclos=0; base_tiempo++; output_toggle(PIN_A5); if(base_tiempo<5){ if(input(PIN_A3)){disparo=128; ahorrador=0;}else{ahorrador=1; setup_ccp1(CCP_OFF); output_high(PIN_A2); ahorrador=1;} } else{ if(input(PIN_A3)){disparo=28;ahorrador=0;}else{setup_ccp1(CCP_OFF);output_low(PIN_A2);ahorrador=1;} }if(base_tiempo==60) base_tiempo=0;
  291.    }
  292.       //verifica que se ha cumplido la base de tiempo (2 seg) y al cmplirse 3 hrs se apaga y al cumplirse 24 vuelve a iniciar ya sea como foco ahorrador o normal
  293.  
  294.       if(!input(PIN_A0)) readcodigo(); //si hay señal de mando ir, decodificalo
  295.  
  296.       if(on_off) //retardo para evitar rebotes en la funcion on off (la comparacion on_off fue cambiada en esta posicion para ocupar menos ciclos maquina)
  297.       if(ciclos==45)
  298.    {
  299.       if(input(PIN_A3))
  300.    {
  301.       ahorrador=0; if(disparo==28) disparo=128; else disparo=28;
  302.    }
  303.       else
  304.    {
  305.       ahorrador=1; setup_ccp1(CCP_OFF); if(edo_ahorrador){output_low(PIN_A2); edo_ahorrador=0;} else{output_high(PIN_A2); edo_ahorrador=1;}//<<--problemas al usar output_toggle();
  306.    }
  307.       codigo[0]=0; codigo[1]=0; on_off=0; ciclos=0; hold=0;
  308.    }
  309.       //si bandera on_off fue activada apaga o prende respetando el tipo de foco
  310.       //on_off
  311.       sincroniza();//se agrega otro sincroniza para aumentar la prioridad de la tarea
  312.       if(modo_auto) //si fue activado el modo control automatico de iluminacion-*-*-*-**
  313.    {
  314.       if(auto_ini)// si es apenas activado el modo automatico-*-*-*-*
  315.    {
  316.  
  317.       setup_ccp1(CCP_OFF);//apagamos temporalmente el pwm
  318.       output_high(PIN_A2);  //enciende y apaga
  319.       delay_ms(300);
  320.       output_low(PIN_A2);
  321.       delay_ms(300);
  322.       output_high(PIN_A2);
  323.       delay_ms(300);
  324.       output_low(PIN_A2);
  325.       delay_ms(300);
  326.       output_high(PIN_A2);
  327.       delay_ms(300);
  328.       output_low(PIN_A2);
  329.       delay_ms(300);
  330.       on_off=0;
  331.       auto_ini=0;//ya no entres a esta condicion hasta que se vuelva a activar modo auto--*-*-*-*-*
  332.       disparo=28;
  333.    }
  334.       if(input(PIN_A3)) //si esta como foco normal
  335.    {
  336.       if(ciclos1>10)//esperamos hasta que se cumpla un tiempo  <<=== aumentar tiempo (fue cambiado de 8 a 10)
  337.    {
  338.       ahorrador=0;
  339.       adc=read_adc();//leemos la intensidad luminosa por medio de fotorresistencia
  340.       sincroniza();
  341.       if(adc<600 & disparo>28) disparo--; //si hay mucha luz disminuyela y espera cierto tiempo  <====simplificar (ya se simplifico)
  342.       if(adc>610 & disparo<128) disparo++; //si hay poca luz aumentala y espera cierto tiempo   (se usa histeresis para evitar inestabilidad)
  343.       //en estas dos condiciones anteriores se limita el valor al mismo tiempo y el set point esta en ese rango
  344.       ciclos1=0;
  345.    }
  346.  
  347.    }
  348.       else //si esta como foco ahorrador
  349.    {
  350.       adc=read_adc();//leemos la intensidad luminosa
  351.       sincroniza();
  352.       if(read_adc()>980) {setup_ccp1(CCP_OFF); output_high(PIN_A2); ahorrador=1; }
  353.       if(read_adc()<200) {setup_ccp1(CCP_OFF); output_low(PIN_A2); ahorrador=1; }      // Prende la lampara al 100% cuando obscurece
  354.    }                                                                                   // a cierto nivel (on-off con histeresis).
  355.    }                                                                                   // Modo auto.
  356.    }                                                                                   // Cierra while true.
  357.    }                                                                                   // Cierra main.


Suerte en todo.
El señor es mi pastor,  nada me faltará.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« Respuesta #1 en: 18 de Enero de 2015, 02:29:42 »
Se me pasaba, aquí esta el diagrama.

No se como pegar la imagen, pero lo adjunto para su descarga.
El señor es mi pastor,  nada me faltará.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« Respuesta #2 en: 18 de Enero de 2015, 03:01:11 »
Hola Abner_emanuel, muy interesante tu dimmer. Me ha gustado mucho el detalle de la fotorresistencia.
A ver si nos pones un vídeo.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« Respuesta #3 en: 18 de Enero de 2015, 11:40:16 »
Hola nocturno

Te comento que el que tenia en mi cuarto se me daño después de un largo periodo, a decir verdad permaneció 2 años, pero lo armo uno para el foro y subo el vídeo en unos días.

Gracias por tu interés...
El señor es mi pastor,  nada me faltará.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« Respuesta #4 en: 18 de Enero de 2015, 17:19:18 »
Muy bueno e interesante!! ((:-))

Gracias por compartir! :-/

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re: DIMMER DECODIFICADOR DE UN CONTROL REMOTO SONY
« Respuesta #5 en: 22 de Enero de 2015, 18:48:47 »
Que tal no eh tenido tiempo para armarlo físicamente pero les anexo el PCB en ARES, el codigo .C y la simulación en PROTEUS para que lo complementen.

Saludos.

« Última modificación: 22 de Enero de 2015, 18:51:49 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.


 

anything