viernes, 22 de noviembre de 2013

Dado electrónico

En este post os vamos a exponer como construir y desarrollar un dado electrónico (ver Ilustración I).

I. Ilustración: Dado eléctronico

Se pretende diseñar un dado electrónico que al pulsar un botón pulsador va a hacer una secuenciación de luces en los 6 diodos leds que constituyen el dado, y que al soltar el botón nos sacará un número aleatorio del uno al seis. Después de 3 segundos, los diodos leds se apagaran.

Para construir este prototipo es necesario hacer el siguiente acopio de material:

  • 7 Diodos led  
  • 1 Array de resistencias de 330 Ohm 
  • 1 Regulador  7805 
  • 1 Condensador  220 Kpf , K5m 
  • 1 Resistencia Pull up, 10kOhm 
  • 1 Pulsador 
  • 2 Interruptores
  • 1 Conectores molex 9pin   
  • 2 Conectores molex 2 pin
  • 1 PIC  16F886 
  • 1 PCB a doble cara
  • 1 Caja diseñada e imprimida en una impresora 3D



Las Ilustraciones II, III y IV muestran los esquemas en Proteus y Ares que se han utilizado en las diferentes fases de desarrollo del dado:

Ilustracion II: Esquema ISIS para la simulación
Ilustracion III: Esquema ISIS para la PCB

Ilustracion IV: Esquema ARES de la PCB

Este es el código fuente que se ha generado para programar el PIC16F886:

 #include <16f886 data-blogger-escaped-.h="">
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
//#FUSES IESO                     //Internal External Switch Over mode enabled
//#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V
#FUSES INTRC_IO
//#FUSES INTRC

#use delay(clock=4000000)

int numale=0;   //Creamos una variable donde guardaremos el numero aleatorio
int x=0x01;  //Inicializamos una variable que luego utilizaremos en la secuenciacion de los leds

#int_RTCC //Inicio del tratamiento de la interrupción del TMR0
void rtcc_secuenciacion(void)     //Funcion del TMR0 Secuenciacion de los LEDS
{
   rotate_left(&x,1);  //Funcion rotate para desplazar un bit hacia la izquierda
   output_b(x);  // Mostramos el valor de la variable X
   delay_ms(300); // Esperamos 300ms
}

void main(void) //Programa principal
{
    setup_adc_ports(NO_ANALOGS);
    set_tris_a(0b11111111);  //Declaramos el Puerto “A” como entrada
    set_tris_b(0b00000000);  // Declaramos el Puerto “B” como salida
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);    //TMR0 interno con preescaler de 1
    set_timer0 (0); // Cargar el TMR0 al maximo valor
    setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 ); //Timer1 interno
    set_timer1(0); // Cargar el Timer1 al maximo valor
    enable_interrupts(global); //Habilita interrupciones
    disable_interrupts(int_timer0); // desabilitar interrupcion del TMR0
    disable_interrupts(int_timer1); // deshabilitar interrupcion del TMR1
    output_b(0); // Inicializacion de los LED a apagados
    
    while(1) //Bucle infinito
    {
        while(input(PIN_A0)==0)  // Esperamos a que se pulse el boton, mientras no se pulse no pasa de este bucle
            ;
        delay_ms(20);  // un delay para evitar el efecto rebote de los pulsadores
        enable_interrupts(int_timer0);    //habilitamos interrupcion del TMR0
        while(input(PIN_A0)==1)  //Un bucle que parara en cuanto se deje de pulsar el boton
            ;
        delay_ms(20);
        disable_interrupts(int_timer0);  // desabilitar interrupcion del TMR0
        numale=(get_timer1()%6)+1; //Obtencion del numero aleatorio que guardaremos en una variable, con la function get_timer1 conseguimos un numero practicamente aleatorio con la formula aplicada
        if (numale==1){ // Nos mostrara el numero 1 en los LEDs en caso de que el numero aleatorio sea 1
            output_b(0b10000000);
            
        }
        else if (numale==2){
            output_b(0b00011000);
            
        }
        else if (numale==3){
            output_b(0b10011000);
            
        }
        else if (numale==4){
            output_b(0b01011010);
            
        }
        else if (numale==5){
            output_b(0b11011010);
            ;
        }
        else if (numale==6){
            output_b(0b01111110);
        
        }
        delay_ms(3000); // Esperamos 3 seg
        output_b(0);
     }
}


La caja o envolvente del dado (ver ilustracion V) ha sido bajada de thingiverse en esta dirección:

http://www.thingiverse.com/thing:26278/#files


Ilustracion V: Diseño 3D de la caja

Trás ensamblar todos los elementos que constituyen el proyecto este es el producto final (ver Ilustración VI y VII):

Ilustración VI: Vista interna del proyecto

Ilustración VII: Dos dados diferentes

                                                                  Video demostración

En este enlace se pueden descargar los archivos necesarios para construir este dado electrónico.

No hay comentarios:

Publicar un comentario