Восстанавливаем старые часы «Электроника-7»

в 11:03, , рубрики: avr, diy или сделай сам, Raspberry Pi, месье знает толк, программирование микроконтроллеров, часы для гиков, электроника-7

Доброго времени суток, уважаемые читатели!
Началась эта история так. Во время работы на объекте, разместившимся в здании бывшего завода (кажется, металлоконструкций) с длинным названием (и, конечно же, имени очередного великого лидера партии) я увидел в куче хлама, предназначавшейся на выброс, одну вещь. Каковая вещь ударила по мне страшным приступом ностальгии, ибо точно такая же висела в холле СКБ (с не менее длинным и многосложным названием, чем вышеупомянутый завод), где работала когда-то моя мама, и где прошло немало времени из моего детства. Встречайте — часы «Электроника 7-06».

Восстанавливаем старые часы «Электроника 7»
Конечно же, я не мог устоять от соблазна восстановить (а может быть, и доработать?) их. Кому интересен процесс, а равно и конечный результат — прошу под кат (осторожно, некоторое количество схем и фото!).

1. Немного теории

Схема часов свободно доступна в интернете. Элементной базой является 176 серия микросхем. Индикаторы — газоразрядные типа ИВ-26. Ниже представлен оригинал схемы.
Восстанавливаем старые часы «Электроника 7»
Рис. 1. Оригинальная схема, часть 1
Восстанавливаем старые часы «Электроника 7»
Рис. 2. Оригинальная схема, часть 2

2. Начнем-с

Часы были извлечены из кучи мусора, отвезены домой и препарированы. После очистки от мусора, накопившегося внутри, моим глазам предстало вот что.
Восстанавливаем старые часы «Электроника 7»

Восстанавливаем старые часы «Электроника 7»

Восстанавливаем старые часы «Электроника 7»

Восстанавливаем старые часы «Электроника 7»

Восстанавливаем старые часы «Электроника 7»

Включаем. В принципе, всё работает. Но: индикаторы выгорели. Достать такие же ИВ-26 уже негде. Гугл дает множество ссылок, повествующих нам, как заменить эти ИВ-26 на светодиоды, а то и на готовые семисегментные сборки. Да только вот же незадача — это выглядит уже совсем не так… осовремененно и оттого попсово выглядит, я бы сказал. Поэтому моя задача номер один: восстановить индикаторы на светодиодах, максимально сохранив при этом внешний вид.

3. Табло

При взгляде на расчески из проводов, ведущие к табло, а также на схемы этих табло с сумматорами на диодах, мне становится несколько неуютно. Сложновато в наладке, запросто можно провода перепутать. Да и слабоваты выходы 176-й серии, чтобы напрямую светодиодами управлять. Плюс хотелось бы иметь возможность регулировки яркости индикации, желательно по сценарию тоже — ночью высокая яркость не совсем уместна дома. Стабильность опорного генератора на 25-тилетней давности компонентах мне тоже никто не гарантирует. Прикинув так и этак, я решил видоизменить схему полностью.
Каждый индикатор — светодиодная матрица 7 х 11, так выходит по количеству точек на оригинальных ИВ-26. Управляет ей хорошо всем известная ATtiny2313. Она же хранит в себе образы символов для отображения, таблицу знакогенератора, говоря иначе. Даже без всяких оптимизаций по 11 байт на символ в нее сотня символов точно влезет — значит, потенциально можно не только цифры писать на табло. И таких матриц у меня будет 4. А что отображать, они пусть получают по UART. Ну а собственно что будет считать время и отправлять по этому интерфейсу данные для табло — это позже. Я подумаю об этом позже (с). Зато к каждой матрице подходит всего 3 провода — GND, +5V и Data. Я посчитал, что однонаправленной линии передачи для данной задачи вполне достаточно.
Индикация динамическая, для выбора строк используется узел на регистрах 74HC595, а для выбора столбца — дешифратор 74HC238. Конструкция AVR + 74HC595 хорошо описана и интереса не представляет. К сожалению, SPI у tiny2313 какой-то порезанный, поэтому загрузка данных в регистры выполняется программно. Плюс к тому при попытке использовать SPI возникли проблемы с разводкой платы, поэтому я отказался от этой идеи. Дешифратор подключен через транзисторную сборку ULN2003 для увеличения мощности.
Изначально я планировал использовать для регулировки яркости светодиодов дополнительный транзистор, управляемый посредством аппаратного ШИМа на таймере T0, но возникла проблема: ШИМ, накладываясь на динамическую индикацию (их частоты, конечно, не совпадали), порождал неприятное мерцание светодиодов. Поэтому ШИМ программный, а реализован он с помощью дешифратора выбора столбца. Как видно, индикатор-то имеет 7 столбцов, а выходов у дешифратора 8, и последний выход не подключен. Выбирая его, мы гасим всю матрицу.
Ток светодиодов ограничен сопротивлениями. Исходя из документации на примененные LED-5213-PGC-6cd, на них падает 3 — 3,5В при токе 20 мА, примем в среднем 3,2В. Плюс еще 1В падения на ULN2003. Итого (5 — 3,2 — 1) / 0,02 = 40 Ом. Я взял на 39 Ом.
Переключателями SA1 задается адрес платы. Такой подход позволяет сделать все 4 платы одинаковыми.
К сожалению, металлизацию отверстий в домашних условиях я пока не осилил. Поэтому плата однослойная и количество перемычек на ней может ужаснуть, хоть и сводилось к минимуму всему усилиями.
Принципиальная схема приведена ниже.
Восстанавливаем старые часы «Электроника 7»
Рис. 3. Принципиальная схема индикатора

Восстанавливаем старые часы «Электроника 7»
А вот фото платы на одном из этапов изготовления (только что нанесен и проявлен фоторезист).

Протокол обмена очень простой:
Первый байт всегда FF, это заголовок пакета.
Второй байт — адрес платы.
Третий байт — данные для отображения, код символа согласно ASCII.
Четвертый — желаемая яркость в диапазоне 00 — FE.
В конце — младшие 8 бит от суммы всех байт пакета, проверка целостности. Если сумма равна FF, заменяем на FE. Пример пакета:

FF 01 32 80 B2 — вывести символ «2» на плате с адресом 1, яркость — половина от максимума.

В процессе написания кода мне также пришла идея сделать так, что плата индикации в момент старта до получения первых данных отображает свой адрес. Оказалось удобно при отладке.

4. Блок питания

Родной блок содержит в себе трансформатор с двумя обмотками: одна выдает 22В, которые применялись для питания анодов индикаторов, и 3,8В для питания их накалов. Конденсаторы, конечно, свою емкость потеряли, к тому же нам потребуются +5В. Значит, схему придется пересмотреть. Кроме того, предусматривается возможность питать логику от 6 батареек по 1,5В, чтобы не сбивалось время при обесточивании. Батарейки — это как-то несерьезно, требуют регулярной замены, так что я переделал этот узел на работу со стандартным аккумулятором 6В, 4.5 А*ч.
Однако ж, 22 * 1,41 = 31В. Нда, обычной 7805 тут не обойдешься, разве что мы хотим прикрутить сюда еще и функцию комнатного обогревателя. Непродолжительный гуглинг, и на помощь приходит LM2576-5.0 — интегральный импульсный стабилизатор с выходным током до 3А, которая даже нашлась в местном магазине радиодеталей.
Поиск, где бы мне спереть безвозмездно позаимствовать схему зарядного устройства с целью уменьшения количества созданных велосипедов, привел меня сюда (вообще, сайт посвящен именно велосипедам, что в контексте фразы несколько улыбает). Однако, схемка-то на линейных стабилизаторах… впрочем, существует версия вышеупомянутой LM2576 с перестраиваемым выходным напряжением. Фактически, нужно сваять источник с ограничением вида «выходное напряжение примерно 6 — 14В (с подстройкой, чтобы можно было и на 12В аккумулятор подцепить), выходной ток не выше 0,5А (тоже с подстройкой)». После некоторых раздумий получилось нечто такое.

Восстанавливаем старые часы «Электроника 7»
Рис. 4. Схема источника питания

Переключение режима «зарядка / работа от аккумулятора» производится обычным механическим реле с обмоткой на 220В, подключенной параллельно первичной обмотке силового трансформатора. Несколько наивно, но, как ни парадоксально, вполне работает.

5. Сердце системы

Вот и настало то самое «позже», в котором я обещал себе подумать о том, что же будет собственно время считать, и управлять индикаторами. А еще лучше, если оно еще и синхронизировать его будет с мировым. По NTP, например. Или DAYTIME. Благо, что Wi-Fi в доме имеется. И самое главное, да. Чуть не забыл. В этих часах таки остался один родной элемент индикации, который такой трогательный, что я счел кощунственным его менять. Ибо воссоздать такое же не смогу, да и рабочий он вполне. Мигающая секундная точка на индикаторе ИВ-4! Вот еще ей надо мигать.
Я долго ковырял форумы на предмет сопряжения AVR и Wi-Fi, смотрел, как это делали на Arduino… но цена меня удручает. И тут мой взгляд упал на купленную с целью изучения с последующим созданием торрентокачалки «малинку», лежащую на полке…
Нет, ну это даже не пушкой по воробьям. Это просто удар главного калибра Звезды Смерти с целью уничтожения злых бактерий под ободком унитаза. А с другой стороны — не всё ли равно, где эта торрентокачалка будет стоять? Места под USB-HDD в корпусе часов более чем достаточно. Кроме того, мой опыт работы с *nix-системами пока не очень значителен — отличный повод расширить кругозор. Примерно эти мысли пролетели у меня в голове, и судьба малинки была решена. Ну пусть тогда еще уличную температуру показывает, что-ли… раз уж такими мощностями разжился. Да и знакогенератор табло теперь позволяет плюсы-минусы рисовать.
Как прикрутить к rPi часы реального времени, а также как ее вообще включить, провести начальную настройку, установить туда торрент-клиент — сказано много раз до меня. Впрочем, некоторое количество ссылок, показавшихся мне полезными, я все же приведу ниже.
Уличную температуру я беру с Рамблера. Выбор обусловлен предпочтениями моей второй половинки.

Итак, поэтапно все действия с «малинкой»:
Вот тут читаем, как подружить ее с Wi-Fi-адаптером TP-Link TL-WN725N.
А вот тут — как установить VNC-сервер, может пригодиться.
Здесь доходчиво расписано, как поднять Samba.
А вот тут, как работать со встроенным UART.

Вот такой скрипт синхронизирует время с мировым с помощью NTP.

timesync.sh

#!/bin/bash
sudo service ntp stop
sleep 5
sudo ntpdate time.nist.gov time.windows.com
sleep 5
sudo service ntp start

Этот скрипт читает с Рамблера погоду, складывая принятые данные в файл

getweather.sh

##!/bin/bash

URL="http://api.rambler.ru/weather/informer?content_type=xml"
FILENAME=/home/pi/clock/weather.dat

WEATHER=$(curl ${URL} | grep -o -E "(<now><temp>)[+-]?[0-9]{1,2}(</temp>)" | grep -o -E "[+-]?[0-9]{1,2}")
if [ -z ${WEATHER} ]
then
	echo "Get weather failed!"
else
	echo -ne " " > ${FILENAME}
	echo -ne $(printf "%+03d" ${WEATHER}) >> ${FILENAME}
fi

Основной скрипт, передает данные через UART для отображения:

send.sh

#!/bin/bash
DATAPATH=/home/pi/clock/weather.dat
declare -i LOW_BRIGHT=5
declare -i HIGH_BRIGHT=100

send_data ()
{
	DATA=$1
	LEN=${#DATA}

	stty -F /dev/ttyAMA0 cs8 -cstopb raw speed 19200 > /dev/null
	
	for((i=0; i<$LEN; i++)); 
	do 
		ADDRESS=$(printf "%d" $(($i+1)))
		CHAR=$(printf "%d" ${DATA:$i:1})
		if [ "$CHAR" = "0" ]
		then
			CHAR=32
		fi
		HOUR=$(date | cut -c 12-13)
		if (("$HOUR" > "20")) ||  (("$HOUR" < "7"))
		then
			BRIGHTNESS=$(printf "%d" $LOW_BRIGHT)
		else
			BRIGHTNESS=$(printf "%d" $HIGH_BRIGHT)
		fi
		CHECKSUM=$((($ADDRESS+$CHAR+$BRIGHTNESS-1)%256))
		if [ "$CHECKSUM" = "255" ]
		then
			CHECKSUM=254
		fi
		
		ADDRESS=$(printf "%o" $ADDRESS)
		CHAR=$(printf "%o" $CHAR)
		BRIGHTNESS=$(printf "%o" $BRIGHTNESS)
		CHECKSUM=$(printf "%o" $CHECKSUM)	
		MESSAGE="377$ADDRESS$CHAR$BRIGHTNESS$CHECKSUM"
		echo -ne "$MESSAGE$MESSAGE" > /dev/ttyAMA0
	done
}

if [ "$1" = "time" ]
then
	HOUR=$(date | cut -c 12-13)
	MINUTE=$(date | cut -c 15-16)
	TIME="${HOUR}${MINUTE}"
	send_data $TIME
	exit 0
fi

if [ "$1" = "weather" ]
then
	WEATHER=$(cat ${DATAPATH})
	if [ -z ${WEATHER} ]
	then
	  echo "No weather info found"
	  exit 0
	fi
	send_data "$WEATHER"
	exit 0
fi

if [ "$1" = "startup" ]
then
	send_data "HELO"
	sleep 5
	send_data "HABR"
	sleep 5
	send_data "    "
	exit 0
fi

echo "Usage: send.sh time | weather | startup"
exit 0

И — да. Точкой секундной мигаем.

blink.sh

#!/bin/bash
sudo echo "25" > /sys/class/gpio/export
sudo echo "out" > /sys/class/gpio/gpio25/direction

while true
do
	echo "1" > /sys/class/gpio/gpio25/value
	sleep 0.5
	echo "0" > /sys/class/gpio/gpio25/value
	sleep 0.5
done

Теперь добавим все это хозяйство в cron:

# m h  dom mon dow   command
0/15 * * * * /home/pi/clock/timesync.sh
0/15 * * * * /home/pi/clock/getweather.sh
* * * * * sleep 00; /home/pi/clock/send.sh time
* * * * * sleep 10; /home/pi/clock/send.sh weather
* * * * * sleep 15; /home/pi/clock/send.sh time
* * * * * sleep 25; /home/pi/clock/send.sh weather
* * * * * sleep 30; /home/pi/clock/send.sh time
* * * * * sleep 40; /home/pi/clock/send.sh weather
* * * * * sleep 45; /home/pi/clock/send.sh time
* * * * * sleep 55; /home/pi/clock/send.sh weather

И… и всё. Вешаем на стену, наслаждаемся, ностальгируем. Фото процесса (кликабельно), а также традиционное приветствие жителям Хабра можно увидеть ниже.

Внимание! Автору статьи при рождении вырезали художественное чувство, как будущему инженеру не нужное. Ценителям незаваленных горизонтов, композиции кадра и всякого прочего баланса белого просьба на этом месте прекратить чтение и перейти сразу к комментариям, во избежание получения серьезных душевных травм.

Восстанавливаем старые часы «Электроника 7»
Крепление плат индикации на шасси. Рядом лежит плата блока питания.

Восстанавливаем старые часы «Электроника 7»
Красим проржавевшие задние крышки.

Восстанавливаем старые часы «Электроника 7»
Первое включение в собранном виде. Платы отображают свои адреса.

Восстанавливаем старые часы «Электроника 7»
Все элементы установлены на шасси.

Восстанавливаем старые часы «Электроника 7»
Покрупнее, та же стадия.

Восстанавливаем старые часы «Электроника 7»
Упаковываем в корпус.

И — логическое завершение!

Восстанавливаем старые часы «Электроника 7»
Время.

Автор: Potok

Источник

  1. Дмитрий:

    Порнография.
    Весь шар этих часов был в древних индикаторах. Переделка на светодиоды сама по себе ущербна и не несёт нечего интересного в плане реставрации часов. Не было смысла ломать старые и так можно в другом корпусе собрать новые.
    Например амеры скупают такие часы и педантично реставрируют их. Вплоть до мелочей, надписи и покраска.
    А индикаторы достать не проблема, мне только недавно предлогали ИВ-26 (обоих типов) по 25р.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js