Добрый день! Мы продолжаем знакомиться с возможностями Arduino. Сегодня мы приготовили для детей нашего клуба, а, заодно, и для любезных наших читателей интересную задачу — программирование семисегментных индикаторов. Это приборы, состоящие из семи элементов индикации, включающихся и выключающихся по-отдельности. С помощью разных комбинаций такого включения-выключения можно составить изображения цифр.
Из старого устройства нами была извлечена цифровая панель, содержащая 8 подобных индикаторов.
От этой панели отходит 13 выводов, каждый из которых пронумерован цифрами.
Первое, что нужно было — это разобраться, какой из них за что отвечает.
Выяснив что к чему, мы нарисовали такую схему.
За включение каждого из сегментов индикатора отвечают следующие провода: 1, 2, 3, 4, 10, 11, 12, 13, так, как на рисунке.
5й провод — заземление, 7й провод — питание (+5V).
И у нас остались три провода 6, 8 и 9, которые кодируют номер одного из 8ми индикаторов в двоичной системе.
Подключив прибор к Arduino и поэкспериментировав, мы выяснили, что последовательность должна быть такой: 8, 6, 9. То есть провод 9 кодирует 0й бит двоичного номера, 6й провод - 1й бит, а 8й провод — 2й бит.
Далее, для наглядности и простоты мы припаяли к панели с индикаторами разноцветные провода, отдельно вывели провод питания, а остальные припаяли к блокам с металлическими штырьками.
Два блока по 6 штырьков. Чтобы подключать их в разъёмы Arduino можно было разом, а не каждый провод по-отдельности.
Еще в схеме понадобится кнопка. Мы припаяли к кнопке два провода — минус и плюс.\
Осталось только сделать каркас, на который все элементы схемы будут крепиться. Его мы разработали и напечатали на 3D принтере.
Это пластина из пластика ABS с заготовленными пазиками, чтобы прикрутить на свои места плату Arduino UNO, панель с 8ю семисегментными индикаторами и кнопку.
Прикручиваем все вместе и собираем схему.
Дальше подключаем Arduino к компьютеру, запускаем среду разработки программ под Arduino и пишем программу.
Наша программа будет зажигать по-очереди 8 индикаторов слева-направо.
Что именно загорится на каждом из них можно будет задать в специальном массиве - prog.
int prog[3][8] = { {0, 1, 2, 3, 4, 5, 6, 7}, {8, 9, 10, 11, 8, 9, 10, 11}, {7, 6, 5, 4, 3, 2, 1, 0} }; |
Подаём 0 - на очередном загоревшемся индикаторе высветится 0, так до 9, а индексы 10 и 11 отвечают за запятую и тире.
Каждый ряд цифр в массиве — это отдельная зацикленная программа. Когда загорается последняя в ряду цифра мы перейдём к первой. Переключение между рядами, или между программами поведения индикаторов происходят при нажатии на кнопку.
Настала пора поработать детям. Каждый из детей, которые участвовали в наших экспериментах задал свою последовательность цифр.
Осталось загрузить программу в схему и радоваться результату.
Код программы с подробными пояснениями мы приводим ниже.
До новых встреч!
/*Программа для 8ми 7мисегментных индикаторов и кнопки. По очереди слева-направо выводятся заданные числа на индикаторах.*/ /*LEDS - это массив, хранящий номера контактов ардуино. К ним присоединяются провода, зажигающие сегменты индикатора. 13й контакт ардуино - нижний сегмент, 12й - левый нижний, 11й - левый верхний, 10й - средний, 5й - верхний, 4й - правый верхний, 2й - правый нижний, 3й - запятая*/ int LEDS[8] = {13, 12, 11, 10, 5, 4, 2, 3}; /*LEDCODE - это массив, хранящий номера контактов ардуино. К ним присоединяются провода, кодирующие в двоичной системе порядковый номер индикатора, который высветит заданый номер. */ /*ORDERS - это массив, хранящий порядковые номера всех 8ми индикаторов. Кажды из трёх битов одного индикатора соответствует элементу массива LEDCODE, то есть посылается на определённый контакт ардуино команда зажечь или погасить*/ /*NUMBERS - это массив, хранящий коды цифр от 0 до 9 (0 - сегмент не горит, 1 - сегмент горит), плюс элемент 10 - запятая, 11 - тире. //переменные, хранящие размеры всех заданных массивов /*задержка в милисекундах, через которую происходит опрашивание состояния кнопки*/ /*задержка в милисекундах, через которую меняется поведение схемы (переход программы на следующий шаг)*/ /*контакт ардуино, к которому подключён провод, опрашивающий состояние кнопки*/ /*состояние кнопки true - нажата, false - отжата (по умолчанию выключена)*/ // индекс текущей программы //индекс текущего шага в текущей программе // максимальное число программ /*prog - это массив, хранящий программы поведения индикаторов. Цифры, стоящие в одном ряду - загораются на индикаторах по-очереди и зацикленно, то есть по достижению восьмого элемента программа переходит к 0му. Индекс шага хранит переменная current_index_step int prog[4][8] = { /*функция, в которой происходит инициация всех переменный и задание начальных значений*/ void setup() { /*задаём значение всем контактам ардуино значение выходного (то есть выдающего напряжение), кроме контакта BUTTON, который должен быть входным и регистрировать наличие или отсутствие напряжения*/ for(int i = 0; i < sizeof_LEDCODE; i++) pinMode(BUTTON, INPUT); /*циклическая функция, выполняющая по-кругу заданые действия*/ /*вспомогательная переменная, которая будет отсчитывать время и указывать когда пора выходить из цикла*/ /*функция, устанавливающая порядковый номер индикатора, который будет загораться*/ //увеличиваем шаг на единицу, проверив в функции CheckCurrentIndexStep, не вышел ли этот шаг за пределы размера массива /*функция, устанавливающая порядковый номер индикатора, который будет загораться. */ digitalWrite( LEDCODE[0], ORDERS[ordernum][0] ); /*функция, устанавливающая цифру, которая загорится на этом индикаторе*/ //функция, опрашивающая состояние кнопки /*сравниваем его с предыдущим. Если кнопка раньше не была нажата, а теперь нажали, то переходим к следующей программе, увеличивая /*функция, проверяющая, не вышло ли значение current_prog_step за пределы массива prog. Если вышло - возвращаем 0й элемент массива - то есть начинаем цикл сначала*/ /*функция, проверяющая, не вышло ли значение current_index_step за пределы одного ряда в массиве prog. Если вышло - возвращаем 0й элемент массива - то есть начинаем цикл сначала*/ |