Упоминания об этих модулях в интернете мне не попадалось.
Вместе с тем они выглядят явно серийными изделиями, и такое кому-то может и встретиться.
Под катом — разборка и немного реверсинга.
Итак, спереди они выглядят обычными семисегментными индикаторами:
Ну да, немаленькие.
А вот сзади уже всё не так однозначно.
Покрупнее:
Берём в руки паяльник, моток оплётки и снимаем плату с индикатора:
Плата односторонняя.
На ней распаяны микросхемы 74AC164(поменьше) и ULN2003А. Ещё тут есть пачка 100-омных резисторов и единственный керамический конденсатор, висящий на линии питания одной из микросхем.
Восстановленная принципиальная схема модуля:
74AC164 — это 8-битный сдвиговый регистр, позволяющий управлять 8 светодиодами всего по двум проводам(сигнал сброса не обязателен — без него вполне можно обойтись, и в этих модулях он даже не выведен на внешний контакт):
Микросхемы можно складывать стопкой, в смысле — соединять последовательно, при этом не занимая на контроллере дополнительные выводы, что очень полезно при использовании контроллеров типа ATtiny и прочей мелочёвки. При использовании RC-цепочки можно вообще обойтись одним выводом МК на всю индикаторную линейку.
ULN2003A — это набор сравнительно высоковольтных ключей для управления внешними нагрузками. Отдельно взятый ключ имеет следующую схему:
Для управления индуктивными нагрузками(например, реле) её вывод 9 должен быть соединен с плюсом питания, при управлении светодиодами это не нужно, и поэтому он оставлен болтаться в воздухе.
Зачем тут вообще дополнительные ключи, если 74AC164 способна управлять светодиодами напрямую?
В больших индикаторах каждый сегмент подсвечивается не одним светодиодом, а целой гирляндой:
Из-за этого в модуле пришлось использовать две линии питания: LVCC(5 вольт) для питания сдвигового регистра и HVCC(8 вольт) для питания самого индикатора. Кстати, рабочий ток одного сегмента — 15 мА(см.
даташит на индикатор).
Расположение внешних контактов модуля:
Управление 7-сегментными индикаторами через 74AC164
Пример схемы:
Программа:
// Управление семисегментными индикаторами через регистр сдвига 74HC164(ОА)
#include <avr/io.h>
#include <util/delay.h>
// Массив комбинаций сегментов
unsigned char SEGMENTE[] =
{
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
unsigned int volt;
// Функция сдвига
void write_byte(unsigned char data)
{
for(unsigned char i = 0; i < 8 ; i++)
{
if((data & 0x80) != 0) // Сравниваем 8-й бит с нулем
PORTB |= (1 << PB0); // DATA 1
else
PORTB &= ~(1 << PB0); // DATA 0
data = data << 1; // Сдвигаем биты
PORTB |= (1 << PB1); // CLK 1
PORTB &= ~(1 << PB1); // CLK 0
}
}
int main(void)
{
DDRB |= (1 << PB3)|(1 << PB1)|(1 << PB0);
PORTB = 0x00;
ACSR |= (1 << ACD); // Выключаем аналаговый компаратор
DIDR0 |= (1 << ADC1D); // Отключаем неиспользуемые цифровые входы
ADMUX |= (1 << MUX0); // Вход ADC1
ADCSRA |= (1 << ADEN) // Разрешение АЦП
|(1 << ADPS2)|(1 << ADPS1); // Предделитель на 64
while(1)
{
// Расчитаем максимальное входное напряжение на делителе
// Umax = Uin*(R1+R2)/R2
// Umax = 5*(100k+10k)/10k = 55V
// Расчитаем коэффициент делителя напряжения
// K = (R1+R2)/R2
// K = (100k + 10k)/10k = 11
// Расчитаем результат преобразования в мВ
// U = (ADC*Uref*K*100)/1024
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while (ADCSRA & (1 << ADSC)){} // Ждем завершения преобразования
volt = ((unsigned long)ADC*5*11*100)/1024;
PORTB |= (1 << PB3); // Выключаем индикатор
write_byte(~SEGMENTE[volt%100/10]); // Выводим 1 разряд
write_byte(~((SEGMENTE[volt%1000/100])|0x80)); // Выводим 2 разряд
write_byte(~SEGMENTE[volt%10000/1000]); // Выводим 3 разряд
PORTB &= ~(1 << PB3); // Включаем индикатор
_delay_ms(100);
}
}
Не знаю, почему в модуле применили 74HC164 вместо 74HC595, но железка довольно забавная. Где-то валяется пачка блоков фискальной памяти от кассовых аппаратов на мелких контроллерах вроде ATMega48 — можно как раз собрать на них часы:)
ЗЫ: Плюсанул авансом
Или вы с паяльником в одной руке и отвёрткой в другой родились?
Полно курсов робототехники, есть мейкер спейсы, подросток лучше пойдет работать с интересными готовыми модулями и на них уже учится а не собирать мусор с помоек что бы собрать очередное радиао которое никому не нужно.
ну и стоит понимать что это не «поколение» потерянное, а то что людей кому это интересно в целом мало, просто при совках у тебя выбора небыло, ты либо знаешь как прикрутить батарею от машины к магнитофону, либо сидишь без музыки, сейчас же эти знания чуть более чем бесполезны.
Кроме того уровень, в советского старика залить знания о прошивке контроллеров уже тяжело, а молодой человек что собирает роботов, уж очень быстро и просто воспринимает логику работы аналоговых схем.
Кроме того оно и не нужно особо, суть текущего мира в скоростных итерациях продукта, надо быть полным дураком что бы тратить время на то что можно купить в магазине за 3 копейки. Это не глупо, это рационально.
На то они технологии что бы делать все быстро, а не учиться десятками лет узкой ерунде которая устаревает спустя год без активностей.
ps.
Программисты в железо вкатываются как по маслу и такие базовые вещи как собрать что то аналоговое, отрисовать плату, заказать и собрать, зачастую вообще не вызывает проблем, странно преподносить это как какой то дар или опыт зарабатываемый десятилетиями.
С ULN2003 вроде понятно. Тут им надо было 8 вольт для индикатора, а 74AC вроде как не больше 5-6 может. Да и более универсально если вдруг индикатор будет другим с бОльшим количеством светодиодов в серии с более высоким порогом открытия.
TPIC6B595 вроде как почти аналог 74xx595, но с более высоким напряжением и током. То есть, как раз классно подходит для замены связки 74xx595+ULN2003. Но вроде как TPIC будет слабее когда все каналы нагружены.
Да что там нагрузки? Мелкосхема до 150мА на каждый вывод. А у меня еще и питание на аноды ШИМом.
А так да, ULN помощнее.
китайскийрадиолюбитель. Помотрел, у этой 74AC164 — по каждому выходу 50 мА, можно все 8 диодов сегмента просто в параллель было запитать, тогда и ключи не нужны. Правда на весь корпус тоже ограничение 50 мА, но кого это может остановить… :-)))немецкиекитайские часы с приемником — там большие сегменты были отдельными светодиодами на гетинкасе сделаны и рамочка из пластика с перегородками— Верно ли, что Рабинович выиграл «Волгу» в лотерею? — Все верно. Только не Рабинович, а Иванов. И не «Волгу», а сто рублей. И не в лотерею, а в карты. И не выиграл, а проиграл. ©
А, вообще, не проще ли MAX7219 прикрутить?
Собственно, отсюда и тривиальный способ «рулить яркостью»: банальный ШИМ, чередуем отправку нужной картинки и «все нули», выбрав требуемые задержки между. Как вариант: отправка через аппаратный SPI, обновление по прерыванию от таймера.
При определенной сноровке метод позволяет рулить яркостью каждого сегмента каждого индикатора независимо.
Вот именно — при сноровке. При сноровке что угодно можно, но лучше был бы самодостаточный компонент, на который можно хоть руками код набить, хоть на 30 МГц. Тут просто на 595 регистр заменить и всё.
Например, в attiny25/45/85 PLL умножителя периферии позволяет тактировать оную аж на 85 МГц. Устанете вглядываться в мерцание. :)
А применение 595 требует дополнительного провода… ну, удачи вам найти лишнюю ногу в вашей 8-ногой тиньке.
Конечно, при сноровке. Вы предлагаете взять устройство, которое позволяет гибко управлять собой — и ухудшить, ограничить его функции… да еще и ценой лишнего контакта на контроллере. Ради чего? Чтобы тем, кому лениво учиться, было комфортнее? :) Сон разума разработчика неизбежно порождает чудовищ.
Будет тупо засветка сегментов. Или ->
-> нога так же будет для гашения задействована.
Вы сейчас что доказываете? Что невозможность применить нормальную статическую индикацию и без стабилизации тока индикаторов есть благо? Искать проблемы и героически их преодолевать? Ну вперёд.
Данные модули были сделаны от безысходности, какие были компоненты, такие и засунули. А не потому, что так круто/хорошо.
А тот самый SPI (который в тиньках USI) тактировать можно извне, программно или от Timer0. При этом, судя по всему, максимально возможная частота передачи составляет менее 8 Mbit.
Итого, обновление 4 цифр — 4-6 мкс. Не так, чтобы и много, но если задача обновлять, например, 100 раз в секунду, неприятное слабое «моргание» выключенных сегментов может быть заметно.
Вопрос с легкостью решается RCD-фильтром сигнала CLK — можно сделать, чтобы сигнал загрузки активировался спустя, например, примерно 100 мкс после последнего импульса сдвига.
Или совсем другой сценарий — выделяем под LOAD отдельный пин, зато на пины DATA и CLK можем еще повесить какие-то функции. Так что тут еще вопрос, что лучше.
Судя по всему изделие из разряда «работает — не трогай».
Судя по AT89 этой «разработке» как раз лет 20. С тех пор уже куча копеечных многоканальных LED драйверов со встроенной стабилизацией тока сегмента разработано.
TLC5916/5917
MAX6970
16 каналов
TB62747
TLC59025
Что-то еще было — лень искать. Ну и вроде китайцы какие-то выпускали для своих светодиодных панелей, но это надо искать.
Ну и куча без стабилизации тока — просто ключи на выходе:
BD8378FV-M
BD8388FV-M
NLSF595
зы: висят под телевизором
То же самое от TI: TLC5928
Но гораздо проще в бытовом применении — драйвер матрицы 8х8 светодиодов: MAX7219/MAX7221.
На основе последних продается куча готовых плат на али, среди которых как реально квадратная матрица 8х8, так и 8-разрядный 7-сегментный индикатор. Управляется всё это дело по SPI (3 проводка), легко каскадируется и все сложности динамической индикации и регулировки яркости берет на себя. У себя часто в проектах применяю, ибо очень удобно.
Не 20, больше 30 точно.
У меня в древнем радиометре РГБ07 стоят советские КЛЦ402, там цепочка из двух последовательных СД на сегмент. В отличие от однодиодных АЛС, эти долго не живут, хотя допустимый ток через них не превышен. А поскольку собрано все на дискретных (!) элементах, проще иногда менять сами индикаторы. И аналогов не нашел — раритет, однако. Пробовал уменьшить ток на 30% — все равно дохнут. А больше уже яркость страдает, и так они тускловаты.