TARDIS modeliuko modifikacija

IMG_8793

Esu didelis Doctor Who gerbėjas. Nesu toks pamišęs, kaip „tikrieji” Whovian‘ai, kurie mintinai moka visus dialogus, atsimena senąsias serialo serijas, žino aktorių biografijas ir pan., bet net ir man ilgą laiką norėjosi turėti nors kokios Doctor Who atributikos. Iš ebay pirkti buvo brangu, o Lietuvoje  serialų atributikos net su žiburiu nesurasi, todėl ilgą laiką taip ir gyvenau svajodamas apie kokį nors menkniekį. 2014 m. pabaigoje svečiavausi Stoholme, kur visai netikėtai ir tuo labiau visai neplanuotai vienoje komiksų parduotuvėje užtikau Doctor Who kampelį. Tą kart spjoviau į visus suvalkietiško kraujo nuogąstavimus ir įsigijau TARDIS ir Dalek’o modeliukus. Dalek’u likau labai patenkintas, o vat TARDIS mano įgeidžių šiek tiek netenkino. Nors modelio kosmetinė išvaizda ir pagaminimo kokybė yra tiesiog ideali, tačiau TARDIS lemputę galima tik įjungti/išjungti, t. y. arba ji šviečia, arba ne, o ne pulsuoja, kaip turėtų. Na bet tai lengvai pataisoma.. 

IMG_8791
IMG_8797

Kaip matyti iš nuotraukų viršuje, TARDIS modeliuko viduje nieko neįprasto: baltas šviesos diodas, CR1632 baterija ir jungiklis. Savaime supranta, norint kad šviesos diodas pulsuotų, reikia kažką papildomai prikonstruoti. Paprasčiausias variantas butų surinkti schemą su 555, kaip yra aprašyta čia, tačiau man norėjosi kažko įmantresnio. Nenorėjau, kad TARDIS lemputė pulsuotų visą laiką. Norėjau, kad įjungus maitinimą, TARDIS lemputė „papulsuotų” kelis kartus ir išsijungtų, o  stuktelėjus TARDIS, lemputė vėl pradėtų pulsuoti. Taip gimė elementari schema su ATTiny85 (tokį turėjau):

tardisSchemoje panaudotas vibracijos jutiklis „SW-18020P”, kurių tuziną už 1 eurą pirkau iš AliExpress. Jutiklio sandara yra pavaizduota nuotraukose apačioje. Jutiklis yra prijungtas prie mikrovaldiklio pertraukties INT0 išvado PB2.

IMG_8802
IMG_8804

Schemą surinkau ant „oro” ir ant karštų klijų.  Dėl viso pikto nusprendžiau palikti prilituotą ISP jungtį. Šis sprendimas išties pasiteisino, nes viską surinkus, teko mikrovaldiklio kodą dar šiek tiek patobulinti.

IMG_8808
IMG_8811

Mikrovaldiklio programa gavosi irgi gan paprasta. Mikrovaldiklis, vos tik gavęs maitinimą, tardis_count = 3 kartus sužybsi šviesos diodu ir nueina į Power-down energijos taupymo režimą, kurio metu valgo tik ~0,1 μA srovės. Suveikus vibracijos jutikliui, mikrovaldiklis pabunda ir vėl nurodytą skaičių kartų sužybsi šviesos diodu. Po to ima vėl užmiega. Kodas gavosi štai toks:

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h> 

#define F_CPU 8000000UL    

static char tardis[]={0,0,2,5,10,16,24,33,43,54,67,80,94,109,124,139,154,168,182,195,208,219,229,237,244,250,253,255};
static char tardis_count = 3;

void fade_in(){
    for (char i=0;i<(sizeof(tardis)/sizeof(tardis[0]));i++){
    _delay_ms(30);
    OCR0B = tardis[i];
    }
}

void fade_out(){
    for (char i=(sizeof(tardis)/sizeof(tardis[0]))-1;i>0;i--){
    OCR0B = tardis[i];
    _delay_ms(30);
    }
}

void tardis_light(){
    for(char i=0; i<tardis_count;i++){
        fade_in();
        _delay_ms(250);
        fade_out();
    
        _delay_ms(250);
    }
}

void go_to_sleep(){
      cli();
     set_sleep_mode(SLEEP_MODE_PWR_DOWN);
     sleep_enable();
     sei();
     sleep_cpu();
     sleep_disable();
     //sei();    
}

ISR(INT0_vect){
    
    cli();
    tardis_light();
    sei();
    _delay_ms(100);
    go_to_sleep();
}

int main(){

    //Status LED
    DDRB |= (1<<PB4);
    PORTB &= ~_BV(PB4); 

    //Main LED
    DDRB |= (1<<PB1);  // make OC0B PWM output pin

    //PWM
    TCCR0A = (1<<COM0B1)|(1<<WGM00);  // mode #1
    TCCR0B = (1<<CS00);  // clkI/O/(No prescaling)

    //INT0 enable:
    MCUCR&=~(_BV(ISC01)) | ~(_BV(ISC00));
    GIMSK|=_BV(INT0);

    //PB2 as input for INT0
    DDRB &=~_BV(PB2);
    PORTB |= (1<<PB2);
    
    sei();

    //Disable ADC, saves ~230uA
    ADCSRA &= ~(1<<ADEN);
    
    
    tardis_light();    
    go_to_sleep();       
    while(5){         
    }
}

Viso šito reikalo rezultatas gavosi štai toks:

Elektrinę principinę schemą eagle formatu bei AVR Studio 4 projekto failus rasite čia: Tardis.rar arba mano GitHub’e.