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..
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):
Schemoje 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.
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.
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.