Работы Льва на основе набора «Матрешка Z». Проект 4

19 сентября 2016
Светофор

Недавно у меня возникла идея: сделать что-нибудь со светодиодами. В учебных проектах нужны только красные и парочка зелёных. Но есть и жёлтые! Я решил сделать модель светофора. В ней кроме светодиодов нужна ещё микросхема 74HC595. Я использую её для уменьшения рабочих контактов у Arduino.

Это моя схема.

Светофор состоит из пяти светодиодов: красного, жёлтого и зелёного (модель светофора для автомобилей); красного и зелёного (модель светофора для пешеходов). Сначала горят два красных. Затем у машин красный и жёлтый, у пешеходов красный. Зелёный у машин, красный у пешеходов. Ж – К, К – К, К – З. Далее в бесконечность.

О чипе

Это распиновка чипа (с сайта Амперки).

Vcc – стандартное питание. Подключите его к 5V.
GND – стандартная земля.
Q0 – Q7 – управляемые выходы.
Q7’ – пин для соединения нескольких чипов в одну цепь (с тех же трёх пинов управление 16, 24, 36 и т.д. выходами).
Ds – пин данных. Выход на него с платы лучше объявить глобальной переменной и использовать в функции название.
OE – линия вкл.-выкл. выходов Q. Чтобы они были включены нужно соединить пин с землёй.
SHcp – пин такта, переносит один бит с платы в память. Его также для функции лучше объявить переменной.
STcp – пин строба. Пока память чипа заполняется, нужно подавать на него 0. Потом подать 1, и биты из памяти разойдутся по пинам Q. Лучше объявить его переменной.
MR – линия вкл.-выкл. памяти чипа. Для постоянного включения соедините с землёй.

Теперь о работе с чипом.

В самом начале я объявляю три глобальные переменные – данные, строб, такт.

#define DATA_PIN13 //пин данных
#define LATCH_PIN 12 //пин строба
#define CLOCK_PIN 11 //пин такта
Все настраиваю на OUTPUT.

Затем создаю массив с байтами – это комбинации, отправляемые на Q. Первая цифра – Q0, вторая – Q1, и так далее. У меня все начинаются с трёх нулей, так как я использую пины Q3 – Q7. Расположение соответствует светодиодам.

Для более лёгкой работы с чипом я использую функцию ShiftOut. Пример запуска одной комбинации.

digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[0]);
digitalWrite(LATCH_PIN, HIGH);

Сначала на пин строба подаём 0. Теперь мы можем заполнить память чипа.

Затем используем функцию. Передаём ей пин данных и пин такта, LSBFIRST означает передачу битов по одному, а затем указываем комбинацию – номер элемента в массиве (нумерация всегда с нуля, поэтому номера элементов с 0 до 5 (всего 6)). Функция заполняет память чипа сама.

Затем нам нужно только открыть пин строба (подать HIGH), и комбинация уйдёт на пины.

Вот фотографии

Привожу свой скетч.
  #define DATA_PIN13 //пин данных
#define LATCH_PIN 12 //пин строба
#define CLOCK_PIN 11 //пин такта
byte leds[6]={
0b00010010, 0b00011010, 0b00000110, 0b00001010, 0b00010010, 0b00010001
};
void setup()
{
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
} void loop()
{
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[0]);
digitalWrite(LATCH_PIN, HIGH);
delay(1000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[1]);
digitalWrite(LATCH_PIN, HIGH);
delay(1000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[2]);
digitalWrite(LATCH_PIN, HIGH);
delay(10000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[3]);
digitalWrite(LATCH_PIN, HIGH);
delay(1000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[4]);
digitalWrite(LATCH_PIN, HIGH);
delay(1000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[5]);
digitalWrite(LATCH_PIN, HIGH);
delay(10000);
}

Продолжение следует.

Комментарии

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