Електронний «куля долі» на ATtiny13

image

Привіт. Нещодавно переглядав один з моїх улюблених фільмів, а саме «Траса 60» з Емі Смарт в головній ролі. Там у головного героя була така штучка, під назвою «куля долі», який відповідав йому на різні питання. Ну і після перегляду у мене з'явилася думка, а чому б не зробити щось подібне на мікроконтролері, тим більше нещодавно розблокував 4 штуки, ATtiny13 які, коли-то заблокував за незнання, що таке фьюзы і з чим його їдять.

Розміри пристрою можете оцінити на тлі моєї долоні, вийшов такий собі високотехнологічний брелок для ключів.



В кінці обов'язково додам не тільки схему, файли для Proteus 7, исходники але і фьюзы, hex-файл, щоб кожен, хто вміє користуватися програматором, міг повторити цей пристрій.

Код для ATtiny13 написаний в Arduino IDE, але в силу великого споживання ресурсів цієї IDE, які до речі отже сильно обмежені у ATtiny13(а саме 1024 байти під код), пам'яті мені не вистачило, і тут мені в пригоді стали мої початкові знання регістрів мікроконтролера і мізерний досвід роботи з ними, ось що в результаті вийшло:

Подивитися код
#define F_CPU 1200000UL // Частота МК в герцах

#include <avr/io.h>
#include <avr/sleep.h> // тут описані режими сну
#include <util/delay.h>

#define led_Yes 0 // grn
#define led_No 1 // red 
#define rand_gen 3 
#define wait 5000 // тайм аут переходу в сплячий режим

void setup() {
//pinMode(led_Yes, OUTPUT); 
DDRB |= (1<<led_Yes);
//pinMode(led_No, OUTPUT); 
DDRB |= (1<<led_No);
}

void loop() {
randomSeed(analogRead(rand_gen)); // не псевдо радном
byte randomValue;
randomValue = random(0,2); // діапазон генератора випадкових чисел від 0 до 1
if(randomValue > 0){ 
//digitalWrite(led_Yes, HIGH);
PORTB |= (1<<led_Yes); 
}
else{
//digitalWrite(led_No, HIGH); 
PORTB |= (1<<led_No); 
}

_delay_ms(wait); 
system_sleep();
}

void system_sleep(){ 
//digitalWrite(led_No, LOW); 
PORTB &= ~(1<<led_No);
//digitalWrite(led_Yes, LOW); 
PORTB &= ~(1<<led_Yes);

ADCSRA &= ~(1 << ADEN); // перед сном відключимо АЦП
// для зменшення енергоспоживання у сні
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // якщо спати - то на повну
while(1) {
sleep_enable(); // дозволяємо сон
sleep_cpu(); // спати!
}
}

//Розмір скетчу у двійковому коді: 906 байт (з 1 024 байт максимум)



Якщо мікроконтроллер буде виводити не дуже очікуваний відповідь, то можна перепризначити піни, тобто поміняти місцями, порти які задані за допомогою директиви #define led_Yes 0 #define led_No 1 або ж ще простий спосіб — банально поміняти місцями світлодіоди.
У рядку #define wait 5000 задається тайм аут переходу в сплячий режим, тобто, скільки буде світити світлодіод.
В даному коді використовується не псевдо генератор випадкових чисел(постійно одна і та ж послідовність чисел), цього вдалося добитися за допомогою функції randomSeed().

Схема дуже проста:

image

Всього 6 компонентів не рахуючи літієвої батарейки CR2025. Резистори R1 і R3 додав чисто для пристойності як кажуть, без них схема буде працювати не гірше ніж з ними, правда резистор R1 трохи зменшує струм світлодіодів, але потрібен, якщо напруга живлення схеми перевищувало б 3 вольта.

Цікаво, на скільки натискань вистачить батареї CR2025, ємність якої до речі приблизно 150 мА/ч?

При одиничному натисканні на кнопку світлодіод горить 5 сек, тобто 60 сек / 5 = 12 натискань на хвилину * 60 хвилин = 720 безперервних натискань на годину, за годину схема буде споживати струм 1.5 мА(виміряв мультиметром споживання коли горить червоний світлодіод), при ємності в 150 мА/ч 150/1 .5 мА/ч схема пропрацює 100 годин, так як за годину можна зробити максимум 720 натискань то 720 * 100 = 72 000.
З грубого підрахунку виходить, що до повного виснаження літієвої батарейки CR2025 потрібно зробити 72 тисячі натискань і якщо натискати кнопку безперервно, на це піде 100 годин, трохи більше 4-х діб.

Посилання:

Траса 60(вікіпедія);
Даташит на ATtiny13;
Прошивка і програмування ATtiny13 за допомогою Arduino;
Arduino IDE;
Функція randomSeed();
Як економити місце на мікроконтролері?;
Усі файли з цього проекту.

P.S. схема Proteus працювати відмовиться, буде постійно горіти один і той же світлодіод, так як дана програма не вміє емулювати ті наведення на порту АЦП, що будуть в реальній схемі.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.