Светофор на транзисторах

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

Для начала создадим простой светофор с 4 состояниями:
1. Долгое время горит зелёный сигнал.
2. Недолго горит жёлтый сигнал вместе с зелёным.
3. Долгое время горит красный сигнал.
4. Недолго горит жёлтый сигнал вместе с красным.

Шаг 1: Счётный триггер.

Для 4-ёх состояний светофора нам понадобится счётный триггер с двумя триггерами:
01 – горит зелёный сигнал.
10 – горит жёлтый сигнал вместе с зелёным.
11 – горит красный сигнал.
00 – горит жёлтый сигнал.

—————
О счётных триггерах писал в свой предыдущей записи – Счётчик на транзисторах (на счётных триггерах)
—————

Шаг 2: Мультивибратор с двумя разными состояниями коротким и длинным (асинхронный).

Чтобы регулировать долгое и недолгое состояния – нам понадобится асинхронный мультивибратор.
Мультивибратор возьму из моей предыдущей записи – Мультивибратор и счётный триггер на транзисторах

Если у вас ассиметричный мультивибратор, то можно передавать сразу два сигнала с обоих выходов мультивибратора – длинный и короткий (короткий будет использоваться для переходного режима – горит жёлтый):

Только для простого светофора – с 4 состояниями нам понадобится убрать один из триггеров в счётном триггере – сократив их до двух (в более сложных светофорах – например с миганиями зелёных сигналов до переключения на жёлтый свет и отдельное горение жёлтого сигнала – состояний понадобится больше – соответственно и счётный триггер нужно будет увеличивать до 3 триггеров):

Шаг 3: Осталось добавить логические элементы.

Вот схема, где логика реализована на транзисторах (набросал, пока не собирал):

Далее решил собрать чуть другую схему – о ней читайте ниже, к вышеуказанной схеме вернуть позже – как будет время…

—————————-
О логических элементах на транзисторах писал в одной из своей предыдущей записи – Логические элементы на транзисторах
А их взаимодействие – логические элементы и счётные триггеры – как пример можете посмотреть здесь – Часы на транзисторах (мультивибратор, счётный триггер и логика)
—————————

Заменил логические элементы микросхемой Atmega88 (можно любой другой, не важно, так как работу микросхема будет выполнять минимальную – заменять логику).

Для светофора нужна 2 входа – это 0 и 1 – и 4 выхода, то есть для 4-ёх состояний светофора нам понадобится счётный триггер с двумя триггерами:
01 – горит зелёный сигнал.
10 – горит жёлтый сигнал вместе с зелёным (или можно заменить мигающим зелёным.
11 – горит красный сигнал.
00 – горит жёлтый сигнал.

Код программировал на языке С в программе MPLAB X IDE 5.35 (как установить на Linux Rosa Fresh 12 или 13 читайте здесь: “gameforstreet.ru/mplab-na-linux-rosa-fresh/” и “gameforstreet.ru/mplab-na-linux-rosa-fresh-12-plasma/”).

Код на С получился следующий:

#include <xc.h>
 
#define F_CPU 16000000UL // 1 MHz clock speed
  
int main(void)
{
DDRC = 0xFF; //PORTC выходы 
DDRB = 0b0000110;  // PB1 и PB2 - входы
//PORTB |= ( 1 << 1 ); // не использовал, но можно включить подтягивающий резистор на PB1, тогда вход будет регулироваться минусом, в примере ниже регулируется плюсом.
//PORTB |= ( 1 << 2 ); // не использовал, но можно включить подтягивающий резистор на PB2, тогда вход будет регулироваться минусом, в примере ниже регулируется плюсом.
  
while(1) 
{
  
if ((PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) )    //когда на входах PB1 и PB2 значение 1, то есть "+" напряжение
         {
PORTC = 0b0000000;   
          }

if (!(PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) )    //когда на входе PB1 "-", а на PB2 находится "+" напряжение
         {
PORTC = 0b0000010;   
          }
if ((PINB & (1<<PINB1)) && !(PINB & (1<<PINB2)) )    //когда на входе PB1 "+", а на PB2 находится "-" напряжение
         {
PORTC = 0b000100;
          }
if (!(PINB & (1<<PINB1)) && !(PINB & (1<<PINB2)) )    //когда на входах PB1 и PB2 значение 0, то есть "-" напряжение
         {
PORTC = 0b001000;
          }
 
}
}

Скачать hex файл и файл на С можно – здесь – скачать:
– в формате tar.gz
– в формате zip

Схема подключения получилась следующая:
Для подачи сигнала от счётного триггера к микросхеме пришлось использовать реле на 5 В:

Здесь пришлось использовать два источника питания (И1 и И2) на схеме. И1 – это пауербанк, а И2 – блок аккумуляторных батареек. Из-за того, что схема потребляет много силы тока (скорее всего из-за двух реле).

На схеме мультивибратор питается от блока батареек на 5 В, а вся остальная схема от пауербанка на 5 В – между собой они объединены общим минусовым проводом (если хотите использовать в схемах несколько источников питания – объединяйте их минуса).

Паувербанк можно также заменить на блок батареек.

Видео промежуточного варианта:

“rutube.ru/video/8bf711c223d08a4bf035b72e0d7388c6/”

———————————————————–
Готовый светофор.

===========================================================

Доработал код светофора – вот окончательный вариант.

1. Горит долго зелёный сигнал (значение счётного триггера 01).
2. Горит короткий промежуток времени одновременно зелёный и жёлтый сигнал светофора (значение счётного триггера 10).
3. Горит долго красный сигнал (значение счётного триггера 11)
4. Горит короткий промежуток времени жёлтый сигнал светофора (значение счётного триггера 00).

Мультивибратор асинхронный, поэтому 01 и 11 длинные, а 10 и 00 – короткие значения.

Код светофора на Atmega88 (заменяет собой логические элементы на транзисторах, чтобы не собирать) получился следующий:

#include <xc.h>
  
#define F_CPU 16000000UL // 1 MHz clock speed
   
int main(void)
{
DDRC = 0xFF; //PORTC выходы 
DDRB = 0b0000110;  // PB1 и PB2 - входы
//PORTB |= ( 1 << 1 ); // не использовал, но можно включить подтягивающий резистор на PB1, тогда вход будет регулироваться минусом, в примере ниже регулируется плюсом.
//PORTB |= ( 1 << 2 ); // не использовал, но можно включить подтягивающий резистор на PB2, тогда вход будет регулироваться минусом, в примере ниже регулируется плюсом.
   
while(1) 
{
   
if ((PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) )    //11, когда на входах PB1 и PB2 значение 1, то есть "+" напряжение
         {
PORTC = 0b0000001;   // долго горит красный цвет (светодиод на PC0) 
          }
 
if (!(PINB & (1<<PINB1)) && (PINB & (1<<PINB2)) )    //01, когда на входе PB1 "-", а на PB2 находится "+" напряжение
         {
PORTC = 0b0000010;   // долго горит зелёный цвет (светодиод на PC1) 
          }
if ((PINB & (1<<PINB1)) && !(PINB & (1<<PINB2)) )    //10, когда на входе PB1 "+", а на PB2 находится "-" напряжение
         {
PORTC = 0b000110;   // коротко горит зелёный и жёлтый цвет (светодиод на PC1 и PC2) 
          }
if (!(PINB & (1<<PINB1)) && !(PINB & (1<<PINB2)) )    //00, когда на входах PB1 и PB2 значение 0, то есть "-" напряжение 
         {
PORTC = 0b000100;   // коротко горит только жёлтый цвет (светодиод на PC2) 
          }
  
}
}

Как собрать логику на транзисторах и не использовать Atmega88 читайте здесь – логические элементы и счётные триггеры – как пример можете посмотреть здесь – Часы на транзисторах (мультивибратор, счётный триггер и логика)

Скачать hex файл и файл на С можно – здесь – скачать:
– в формате tar.gz
– в формате zip

Схема подключения получилась следующая:
Для подачи сигнала от счётного триггера к микросхеме пришлось использовать реле на 5 В:

Здесь пришлось использовать два источника питания (И1 и И2) на схеме. И1 – это пауербанк, а И2 – блок аккумуляторных батареек. Из-за того, что схема потребляет много силы тока (скорее всего из-за двух реле).

На схеме мультивибратор питается от блока батареек на 5 В, а вся остальная схема от пауербанка на 5 В – между собой они объединены общим минусовым проводом (если хотите использовать в схемах несколько источников питания – объединяйте их минуса).

Паувербанк можно также заменить на блок батареек.

Видео работы светофора:

Более качественное видео:

“rutube.ru/shorts/31a57b98daa933e5bce85af5a5c39846/”

“rutube.ru/video/af5a027bfb9e07bbdeb067b5440a2114/”

Добавить комментарий