Найти тему
Паяльник

Модель светофора

Предлагается подробное описание изготовления действующей модели светофора для четырёхстороннего перекрёстка на микроконтроллере.

Есть немало подобных конструкций, но думаю, представленная конструкция является наиболее оптимальной и простой.

Порядок работы настоящего светофора следующий: Для одного направления горит «зелёный» свет, при этом для другого горит «красный». По истечении примерно 30 секунд, «зелёный» начинает моргать (обычно 3 раза), при этом «красный» продолжает гореть. Далее, вместо зелёного зажигается «жёлтый», а вместе с продолжающим гореть «красным», дополнительно зажигается «жёлтый». Через 2-4 секунды, на первом направлении зажигается «красный», а на другом «зелёный». Далее цикл повторяется. Кроме того, существует «ночной» режим, когда для обоих направлений мигает «жёлтый» свет. Для наглядности, можно нарисовать таблицу:

В таблице чёрный кружок соответствует включённому сигналу, а белый кружок обозначает мигающий сигнал. Буквы обозначают цвет, а цифры порядковый номер. Слева одно направление, справа другое. Нижняя, 7 строка, обозначает «ночной» режим работы светофора.

Анализируя работу устройства, мы видим, что «жёлтый» свет включается одновременно на обоих направлениях, то есть может управляться одним общим выводом. Поэтому для работы устройства нам будет достаточно 5 управляющих цепей. Для этого подойдёт самый простой микроконтроллер с одним неполным портом, например ATTINI13.

-2

У этого МК, кроме выводов питания и ножки “RESET”, как раз имеются 5 необходимых нам выводов.

Для начала начертим принципиальную схему светофора. В качестве ламп будем использовать яркие светодиоды соответствующих цветов. Так как светодиоды нельзя напрямую подключать к микроконтроллеру, понадобятся гасящие резисторы с номиналом 470 ом, по числу светодиодов.

Так как светофор должен висеть над перекрёстком, и должен быть виден с четырёх направлений, количество светодиодов удвоится, т. е. понадобятся  12 светодиодов и 12 резисторов.

-3

Для питания будет использоваться литиевый элемент (например, 18650), включённый последовательно с любым подходящим выключателем. Для стабильной работы, параллельно питанию МК, подключен электролитический конденсатор С1.

Теперь, когда схема составлена, нужно написать программу для микроконтроллера. Программу будем создавать на языке С в среде Atmel Studio 6.2 Это бесплатная и весьма удобная программа для работы с МК семейства avr, к которому и относится, выбранный нами микроконтроллер Attini13 .

Итак, программа скачена и установлена. Нужный микроконтроллер выбран. Создадим функцию предварительной настройки, и назовём её «preset». В теле этой функции будет две строки:

Настраиваем порт B (кроме 5 бита) на выход: DDRB=0b011111;

На  выводах порта (кроме 5 бита) установим логический 0 : PORTB=0b100000;

Далее сделаем так: При включении питания, светофор, пускай отработает, например, 5 циклов. После окончания 5  цикла, пускай включится «ночной режим» который будет мигать, например, 10 раз. После этого опять включится нормальный режим, отработает 5  циклов, затем «ночной режим», и т. д.  пока включено питание.

Запишем первую строку основного цикла: PORTB=0b001001; Как видно, значение «1», присвоено нулевому и третьему биту порта. Это значит, что будут гореть красные светодиоды слева (нулевой бит, 5 нога), и зелёные светодиоды справа (3 бит 2 нога). В следующей строке зададим время, в течение которого будут гореть данные сигналы светофора: _delay_ms(5000);

Теперь нужно, не меняя состояния остальных сигналов, трижды мигнуть правыми зелёными светодиодами. Сделать это можно по-разному, но мы создадим функцию для мигания правыми зелёными светодиодами: Дадим имя этой функции migz1.

Для того, чтобы мигал только лишь правый зелёный, а состояние остальных битов не менялось, используем побитовые операции: Сначала выключим правые зелёные светодиоды: PORTB&=~(1<<3); Выдерживаем паузу, _delay_ms(300); Включаем правые зелёные светодиоды: PORTB|=(1<<3); Выдерживаем паузу, _delay_ms(300); выключим правые зелёные светодиоды: PORTB&=~(1<<3); Так как данную операцию нужно повторить трижды, создадим цикл: int i;

for (i=1; i<=3;i++) команды, привязанные к этому циклу, будут трижды выполняться.

Далее нужно зажечь жёлтые сигналы и красные слева. Запишем строку: PORTB=0b000011; Выдерживаем паузу, _delay_ms(1000); Затем включаем справа красный, а слева зелёный: PORTB=0b010100; Выдерживаем нужную паузу, _delay_ms(5000);

Теперь нужно трижды помигать левыми зелёными светодиодами. Для этого создадим функцию, и назовём её migz2. Функция аналогична предыдущей, с той лишь разницей, что будем управлять не третьим, а вторым битом (вместо 3 пишем 2). Далее зажигаем жёлтые светодиоды и красные справа: PORTB=0b010010; Выдерживаем паузу, _delay_ms(1000);

Теперь, согласно первоначальному плану, создадим цикл, который будет выполнять написанную нами программу 5 раз: int i;

for (i=1; i<=5;i++).

Осталось написать функцию «ночного режима». Назовём её migj

Запишем PORTB=0b000010; Это означает, что будут гореть жёлтые светодиоды, подключенные к 1 биту (6 нога микроконтроллера). Выдерживаем паузу, _delay_ms(300); Выключаем светодиоды: PORTB=0b000000; Кстати, можно написать эту команду в шестнадцатеричной форме: PORTB=0x00; Выдерживаем паузу, _delay_ms(300); Создаём цикл для десятитикратного повторения: int i;

for (i=1; i<=10;i++).

Для того, что бы программа работала, пока включено питание, создадим бесконечный цикл while(1).

Полный вид программы:

-4
-5
-6

Очень удобно посмотреть работу программы в симуляторе «Proteus», чтобы выбрать наиболее наглядные интервалы работы модели светофора.

-7

Для прошивки использован USB программатор и программа avrdudeprog33. Фьюзы микроконтроллера не меняются и остаются по умолчанию.

Файлы с проектом и файл Proteus (версия 8.10), а так же видео, работы светофора прилагаются.

Конструктивно светофор сделан из четырёх прямоугольных пластин фольгированного стеклотекстолита, размером 15х45 мм. В пластинах просверлены отверстия диаметром 0,8 мм для установки светодиодов. С внешней стороны отверстия, в которые вставляются аноды светодиодов, раззенкованы, что бы исключить их замыкание на корпус. На каждой из пластин, смонтированы  светодиоды. Катоды всех светодиодов соединены с корпусом, а к аноду каждого светодиода припаян провод, идущий к плате микроконтроллера. Все 13 проводов продеты в терм усадочную трубку.

-8
-9
-10

В плату впаяна панелька, для установки микроконтроллера в DIP корпусе и электролитический конденсатор. Все резисторы в плату впаяны вертикально только одним концом. К второму концу резисторов припаяны провода идущие к светодиодам. Размеры платы 25х25 мм. Все отверстия просверлены сверлом 0,8 мм, а дорожки прорезаны резаком, сделанным из сломанного ножовочного полотна

После припайки проводов, пластины с помощью отрезков ножек светодиодов, соединяются пайкой. На каждый светодиод надевается отрезок чёрной терм усадки.

Прикрепленные файлы:

Автор: avtohirurg