- PVSM.RU - https://www.pvsm.ru -
Привет. Недавно пересматривал один из моих любимых фильмов, а именно «Трасса 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() [1].
Схема очень простая:
Всего 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(википедия) [2];
Даташит на ATtiny13 [3];
Прошивка и программирование ATtiny13 при помощи Arduino [4];
Arduino IDE [5];
Функция randomSeed() [1];
Как экономить место на микроконтроллере? [6];
Все файлы по этому проекту [7].
P.S. схема в Proteus работать откажется, будет постоянно гореть один и тот же светодиод, так как данная программа не умеет эмулировать те наводки на порту АЦП, что будут в реальной схеме.
Автор: HWman
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/arduino/72939
Ссылки в тексте:
[1] randomSeed(): http://arduino.ru/Reference/RandomSeed
[2] Трасса 60(википедия): https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D1%81%D1%81%D0%B0_60
[3] Даташит на ATtiny13: http://www.atmel.com/images/doc2535.pdf
[4] Прошивка и программирование ATtiny13 при помощи Arduino: http://habrahabr.ru/post/234477/
[5] Arduino IDE: http://arduino.ru/Arduino_environment
[6] Как экономить место на микроконтроллере?: http://nuzhen-sovet.ru/content/optimiziruem-kod-v-arduino
[7] Все файлы по этому проекту: https://vk.com/doc256435878_337383150
[8] Источник: http://habrahabr.ru/post/241728/
Нажмите здесь для печати.