Проект tinyAVR 21. Валентинка с датчиком близости

November 27, 2014 by admin Комментировать »

В этом проекте мы продолжаем демонстрировать возможности применения светодиода в качестве датчика. Устройство состоит из нескольких светодиодов, расположенных в виде сердца, которое пульсирует с обычной (характерной для сердца) частотой. Однако если к нему поднести руку, то датчик улавливает уменьшение освещенности и микроконтроллер повышает частоту пульсации. Если руку поднести еще ближе, то датчик обнаруживает это и микроконтроллер начинает зажигать светодиоды необычным образом (чтобы продемонстрировать состояние счастья). Если руку убрать, то "сердце’’ снова пульсирует нормально. На рис. 5.13 показана блок-схема устройства.

Рис. 5.13. Блок-схема устройства

Спецификация проекта

Цель— создать интерактивный проект, имеющий вид матрицы светодиодов в форме сердца. Функционирование устройства состоит в реакции на приближение руки (или любого другого объекта), при этом изменяется частота мигания светодиодов. Устройство питается от батарей, чтобы обеспечить портативность.

Описание устройства

Принципиальная схема устройства показана на рис. 5.14. Цепь состоит из 27 светодиодов, расположенных тремя концентрическими рядами. Внешний ряд состоит из 14 светодиодов. Средний ряд состоит из десяти светодиодов, а внутренний — из трех. В центре внутреннего ряда находится еще один светодиод (LED28), который не излучает, а воспринимает свет. Схема питается от батарей и снабжена стабилизатором напряжения на 3,3 В. Последовательно с каждым светодиодом включен резистор сопротивлением 560 Ом, поэтому ток в цепи составляет примерно 3 мА. Дня включения/выключения рядов предусмотрены три и-р-и-транзистора (BD139). Такой транзистор может управлять коллекторным током 1 А. Однако в данной схеме максимальный ток (через внешний ряд светодиодов) составляет примерно 45 мА, в принципе здесь сможет работать любой л-р-и-транзистор с током коллектора 100 мА.

Рис. 5.14. Принципиальная схема светодиодного сердца

Интенсивность внешнего света измеряет светодиод LED28, подключенный к контактам микроконтроллера (РВЗ и РВ4). Микроконтроллер подает на светодиод обратное смещение и замеряет время, за которое состояние логической единицы превращается в состояние логического нуля. Схема может питаться от любого внешнего источника с напряжением от 5 до 10 В.

Конструкция

Компоновку платы в программе EAGLE (а также ее принципиальную схему) можно скачать по ссылке: www.avrgenius.com/tinyavrl.

Рис. 5.15. Печатная плата светодиодного сердца (сторона компонентов)

Рис. 5.16. Печатная плата светодиодного сердца (сторона печатных проводников)

Устройство было изготовлено на односторонней печатной плате. Фотографии собранного устройства показаны на рис. 5.15 и 5.16.

Сначала припаивались все компоненты в корпусах SMD (резисторы и т. п.), потом перемычки, затем все светодиоды, транзисторы, гнездо для микроконтроллера и остальные компоненты.

Программирование

Откомпилированный исходный код (вместе с файлом MAKEFILE) можно скачать по ссылке: www.avrgemus.com/tinyavrl.

Тактовая частота равна 9,6 МГц. Контроллер запрограммирован при помощи STK500 в режиме программирования ISP. Устройство работает в одном из трех режимов: NONE, NORMAL или HAPPY, которые отличаются способом мигания светодиодов. В листинге 5.2 показан главный бесконечный цикл программы. При инициализации значение переменной а устанавливается равным 20.

Листинг 5.2

while(1)

{

if (mode==NORMAL)

{

PORTB &=0blllll000;

//выключение mydelay(a+a+a+a);

PORTBI=0b00000111;

//включение mydelay(a+a);

PORTB &=0Ы11110б0;

//выключение mydelay(a+a);

PORTB |=0Ь00000111;

//включение mydelay(a+a); time=0;

}

else if (mode==HAPPY)

{

if(state==l)

PORTB I =1«2; else if(state==5) PORTB &= ~ (1«2 ) ; if(state==5)

PORTB &=~(1«1);

//Средний выключен else if(state==2) PORTB |=1«1;

//Средний включен if (state==4)

PORTB (1«0) ;

//Внешний выключен else if(state==3) PORTB |=1«0;

//Внешний включен mydelay(5*state); state++; if(state==6) state=l; time++; if(time==100)

{

mode = NORMAL; previous_mode = NONE time=0 ; a=20;

}

}

check ();

}

Если установлен режим NORMAL, то система начинает включать и выключать светодиоды с некоторой задержкой, зависящей от значения а. Сердце состоит из трех частей: внешней, средней и внутренней. В режиме HAPPY включаются/ выключаются светодиоды одной из этих частей сердца (в зависимости от состояния переменной state).

Сначала значение переменной mode устанавливается в none. Для обнаружения близости система вызывает функцию check () (листинг 5.3), которая изменяет значение mode. Значение count из timero сохраняется в переменной i до того момента, пока в третьем бите PINB (который подключен к датчику) не появится логическая 1 (при обнаружении близости любого непрозрачного объекта, который препятствует падающему на светодиод свету). В зависимости от расстояния до этого объекта (которое можно определить по значению count) и от предыдущего режима (в котором работала система), режим меняется либо на NORMAL, либо на HAPPY.

Листинг 5.3

void check (void)

{

TCCROB = 0;//остановить таймер TCNT0 = 0;//сбросить таймер i=0;

DDRB = 0Ь0 0010000;

PORTS &= ~(1«3) ; i=0;

TCCROB = 1«CS02 11«CS00 ;

//Предварительное деление на 1024 while ( (PINB& (1«3) ) && (i<80) )

{

i=TCNT0;

}

if(i>50)

{

if ( (previous_mode==NORMAL) )

{

mode = HAPPY;

}

else a=20;

}

else if(i<50)

{

if(i<40)

previous_mode = NORMAL;

}

else previous_mode = NONE; mode = NORMAL; a=i/3;

}

PORTB I =1«3 ;

DDRB = ObOOOlllll;

}

В остальных фрагментах кода выполняется обычная инициализация различных параметров. В листинге 5.4 приведено определение функции mydelay; если система работает на частоте 9,6 МГц, то она обеспечивает задержку в 10 мс (когда ее аргумент равен» 1).

void mydelay(int var)

//задержка в 10 мс для var=l при 9,6 МГц {

unsigned char il, jl, kl;

for (i1=0; il<var; il++) for (j1=0; jl<251;jl++) for (kl=0; kl<50; kl++) asm ("NOP") ;

}

Работа устройства

Для демонстрации чувствительного пульсирующего сердца расположите схему возле своей груди (спрячьте батареи в карман) и включите ее. Светодиоды начнут переключаться с обычной частотой. Теперь приблизьте руку к мигающим светодиодам, частота пульсаций начнет увеличиваться. Поднесите руку еще ближе к схеме и коснитесь ее, а потом уберите руку. Когда вы уберете руку, светодиоды начнут мигать в режиме "счастье" (HAPPY), а через несколько секунд снова вернутся в нормальный режим.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты