Проста сигналізація на ATtiny13
Суть роботи запропонованого пристрою досить проста: контакти проводу замикаються і поміщаються в одязі або сумці так, що не розімкнувши їх, неможливо витягти цінний предмет. Поки ланцюг замкнуто, пристрій мовчить, як тільки ланцюг розмикається, динамік починає противно пищати. Для того, щоб розуміти, що пристрій дійсно працює (батарейка не сіла), ми будемо періодично мигати світлодіодом. Я опишу базову концепцію пристрою, а читач вже може самостійно модифікувати його під свої потреби, наприклад, посилити потужність сигналу в динаміку, або мигати одразу кількома, більш потужними діодами.
Ядром нашого переносного пристрою буде мікроконтролер ATTiny 13. Звичайно, реалізувати подібне рішення можна різними способами на різній елементній базі, однак мій варіант реалізації буде заснований саме на цьому МК. Прошивку для МК ми будемо писати на асемблері з подробними коментарями.
Ось необхідні деталі:
- МК ATtiny 13 – 1 шт.
- Резистор – 10Ком,0,125 Вт -1 шт.
- Резистор – 100-300 Ом,0,125 Вт – 1 шт.
- Світлодіод
- Динамік
- Тримач для елемента живлення типу CR 2024
- Елемент живлення
- Монтажна плата
Запропонований набір деталей є рекомендованим, і читач цілком може замінити, наприклад, елементи живлення на інші. Важно забезпечити напругу не менше 3 В. Також звертаю увагу на згадування монтажної плати.
Для створення цього пристрою нам знадобиться лише невеликий фрагмент, який можна відпиляти за допомогою ножівки. Думаю, що для початківців радіолюбителів такий варіант монтажу буде кращим, ніж травлення плати.
Схема пристрою досить проста:
Тепер розглянемо алгоритм роботи нашої програми. Ураховуючи, що писати прошивку ми будемо на асемблері - не найінтуїтивніше зрозумілому мові програмування, наявність діаграми допоможе зрозуміти принцип роботи алгоритму. Незважаючи на здається простоту, тут є ряд моментів, на які необхідно звернути увагу.
Як видно з діаграми, кожне включення або виключення діода і динаміка є виконанням певного циклу, в процесі виконання якого пристрій повторює одне і те ж дію.
Це стосується як миготіння світлодіода, коли ланцюг замкнуто, так і миготіння і подачі звукового сигналу при розмиканні ланцюга.
Перейдемо до розгляду програмної реалізації.
.include "tn13def.inc" ;----------------- .equ SW =3 ; вхід на PB3 .equ sekunda =4000 ; інтервал часу, приблизно відповідний 1 секунді .equ LED_ON =800 ; скільки часу горить світлодіод (0,2c) ;------------- .def loop =r17 ; лічильник циклу .def counter =r18 ; лічильник часу .def flag =r19 ; лічильник затримки .def temp =r22 ; змінна для зберігання тимчасових значень ;**************************************************************************** .cseg ; основний код програми .org 0 rjmp reset ; перехід до старту програми ;==================================================================== ; macros затримки delay ;==================================================================== .macro delay ; даному макросу передається три значення @0 – число ітерацій, рівне 1 сек., @1 – змінна для тимчасових значень @2 – число секунд inc @1 ; збільшуємо на 1 значення переданого параметра @1 mov counter,@1 ; далі йде відлік затримки pause: mov loop,counter; ініціалізуємо значення лічильника sol: rcall Interval; перехід на мітку Interval dec loop; зменшуємо значення лічильника на одиницю brne sol ; поки не нуль переходимо на мітку, якщо 0 виконуємо наступну команду ldi flag,@2 ; завантажуємо значення @2 Cycle: ldi XL,Low (@0); нижній байт @0 в XL ldi XH,high(@0); верхній байт @0 в XH delay_: sbiw XL,1 ; вичитаємо 1 з XL brne delay_ ; поки не 0 dec flag ; вичитаємо 1 brne Cycle; цикл поки не 0 dec counter ; вичитаємо 1 brne pause ; цикл поки не 0 endm ;кінець макросу reset: ;початок основної програми ;------------------ Ініціалізація портів -------------------------------- ldi temp,0b11110111; 247 в двійковому вигляді out DDRB,temp ;вивантажуємо в DDRB Com temp ; переводимо в зворотний код Out PORTB,temp ; вивантажуємо в PORTB main: ;основна процедура clr temp; обнуляємо значення temp cbi PORTB,1; скидання розряду (включення діода) delay sekunda,temp, 30 ; пауза sbi PORTB,1; установка розряду (вимкнення діода) delay sekunda,temp,30 sbis PINB,SW ; пропустити наступну команду, якщо на SW розряд встановлений (ланцюг розімкнуто) rjmp main ; переходимо до початку alarm: ; дії при розриві ланцюга cbi PORTB,2; установка розряду (включення динаміка) cbi PORTB,1; установка розряду (включення діода) delay sekunda,temp,30; пауза sbi PORTB,2; установка розряду (вимкнення динаміка) sbi PORTB,1; установка розряду (вимкнення діода) delay sekunda,temp,30; rjmp main; переходимо до початку ;---------------------------------функція Interval------------------------------------------ Interval: ldi YL,Low (LED_ON) ; ldi YH,high (LED_ON) ; on_: sbiw YL,1 brne on_ ret
В якості засобу розробки та компіляції використовувалася середа AVR Studio 4. Мікроконтролер прошивався за допомогою Avrdude.
FUSE біти не змінювалися. На малюнку наведені вихідні, використані при прошивці.
Процес складання
Ось що нам знадобиться
Після складання на макетній платі за наведеною вище схемою, отримуємо наступне:
А ось так виглядає готовий пристрій. В якості корпусу обрана капсула від шоколадного яйця Кіндер сюрприз. На фото динамік винесений окремо, для установки поруч з вухом, а плата і батарейка поміщаються всередину пластикового корпусу.
Пристрій в зібраному вигляді.
Повне опис процесу складання пристрою представлено на відео
Список радіоелементів
Обозначення | Тип | Номінал | Кількість | Примітка |
---|---|---|---|---|
МК AVR 8-біт |
ATtiny13
|
1 | ||
Резистор |
10 кОм
|
1 | ||
Резистор | 100-300 | 1 | ||
Світлодіод | 1 | |||
Динамік | 1 |
Прикреплені файли:
- article_1.rar (4 Кб)