четверг, 7 сентября 2017 г.

Светофор на ATtiny 2313

Разработку будем вести в Arduino IDE. По умолчанию Arduino IDE не поддерживает микроконтроллеры семейства ATtiny, но есть способ их подружить между собой. Зачем это делать? Для того чтобы вести разработку в знакомой среде, не выходить из зоны комфорта. Качаем библиотеки ATtiny тут. Затем распаковываем архив и кладем в папку C:\Program Files\arduino-1.8.2\hardware\. Должно получиться примерно как на картинке.


Как прошивать микроконтроллеры Attiny через Arduino описано здесь, поэтому не буду на этом заострять внимание.
Собираем на макетной плате схему. Светодиоды подключаем к разъему J1 по два параллельно:
12 - красный
11 - желтый
10 - зеленый
9 - красный
8 - желтый
7 - зеленый


Светофор работает в двух режимах, ручном и автоматическом. В ручной режим он переходит по нажатию кнопки. При повторном нажатии кнопки происходит переключение сигналов светофора. Если в течение одной минуты кнопку не нажимать светофор переходит в автоматический режим. В автоматическом режиме переключение сигналов происходит каждые 7 секунд.
Код программы с описанием представлен ниже

////////////////////////
// --== Светофор ==-- //
////////////////////////
int m_control = 0;  // флаг сработки прерывания
int auto_control = 1; // флаг автоматического управления
int man_out = 0; // обратный отсчет до выхода из авто режима

int red = 13;
int yellow = 12;
int green = 11;

int red2 = 10;
int yellow2 = 9;
int green2 = 8;

void setup() {
 pinMode(red, OUTPUT);
 pinMode(yellow, OUTPUT);
 pinMode(green, OUTPUT);

 pinMode(red2, OUTPUT);
 pinMode(yellow2, OUTPUT);
 pinMode(green2, OUTPUT);

 attachInterrupt(0, manual_control, RISING); // инициализация прерывания
}

void loop() {
 
 red_led();
 man_delay();
                       
 yellow_led();
 man_delay();

 red2_led();
 man_delay();
                       
 yellow_led();
 man_delay();
}

void red_led() { // красный горит
 digitalWrite(red, HIGH);
 digitalWrite(red2, LOW);
 digitalWrite(yellow, LOW);
 digitalWrite(yellow2, LOW);
 digitalWrite(green, LOW);
 digitalWrite(green2, HIGH);
}

void yellow_led() { // желтый горит
 digitalWrite(red, LOW);
 digitalWrite(red2, LOW);
 digitalWrite(yellow, HIGH);
 digitalWrite(yellow2, HIGH);
 digitalWrite(green, LOW);
 digitalWrite(green2, LOW);
}

void red2_led() { //красный 2 горит
 digitalWrite(red, LOW);
 digitalWrite(red2, HIGH);
 digitalWrite(yellow, LOW);
 digitalWrite(yellow2, LOW);
 digitalWrite(green, HIGH);
 digitalWrite(green2, LOW);
}

void man_delay() { // умная задержка с проверкой флага прерывания
 for (int i=0; i <= 14; i++) {
   delay(500);
   if (m_control == 1) {
     auto_control = 0;
     man_contr();
   }  
 }
}

void auto_dellay() { // задержка с обратным отсчетом до перехода в авторежим
 if (man_out == 0) {
   auto_control = 1;
   m_control = 1;
 }
 else {
   --man_out;
   delay(500);
 }
}

void man_contr() { // ручное управление
   m_control = 0;
   
   digitalWrite(red, LOW); // гасим все светодтоды на полсекунды, знак того что светофор
   digitalWrite(red2, LOW); // перешел в ручной режим
   digitalWrite(yellow, LOW);
   digitalWrite(yellow2, LOW);
   digitalWrite(green, LOW);
   digitalWrite(green2, LOW);
   delay(500);

   while (auto_control == 0) { // если флаг авторежима = 1 то выходим из ручного режима
     
     while (m_control == 0) {  // red & green2
       red_led();
       auto_dellay();     
     }
       m_control = 0;
    
     while (m_control == 0) {  // yellow & yellow2
       yellow_led();
       auto_dellay();
     }  
       m_control = 0;
    
     while (m_control == 0) {  // red2 & green
       red2_led();
       auto_dellay();
     }   
       m_control = 0;
    
     while (m_control == 0) {  // yellow & yellow2
       yellow_led();
       auto_dellay();
     }  
       m_control = 0;
   }
}  

////////////////////////////////////
// Функции обработчики прерывания //
////////////////////////////////////
void manual_control() {
 m_control = 1;
 man_out = 120;
}

Разработку печатной платы произвел в привычной САПР DipTrace.
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\3D_1.jpg
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\3D_2.jpg
Изготавливал печатную плату методом ЛУТ.
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_4975.JPG

D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_4978.JPG

D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_4980.JPG

Корпус изготовил из мягкого пластика. Такой пластик используют для изготовления табличек на дверях. Столб – шариковая ручка.
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_5028.JPG
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_5034.JPG
D:\Download\Светофор-20170907T052433Z-001\Светофор\Foto\IMG_5031.JPG

Юный бета тестер остался доволен.