- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

2. Начнем-с

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

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

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

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

Восстанавливаем старые часы «Электроника 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» [8]
Рис. 3. Принципиальная схема индикатора

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

Протокол обмена очень простой:
Первый байт всегда 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А, которая даже нашлась в местном магазине радиодеталей.
Поиск, где бы мне спереть безвозмездно позаимствовать схему зарядного устройства с целью уменьшения количества созданных велосипедов, привел меня сюда [10] (вообще, сайт посвящен именно велосипедам, что в контексте фразы несколько улыбает). Однако, схемка-то на линейных стабилизаторах… впрочем, существует версия вышеупомянутой LM2576 с перестраиваемым выходным напряжением. Фактически, нужно сваять источник с ограничением вида «выходное напряжение примерно 6 — 14В (с подстройкой, чтобы можно было и на 12В аккумулятор подцепить), выходной ток не выше 0,5А (тоже с подстройкой)». После некоторых раздумий получилось нечто такое.

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

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

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

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

Итак, поэтапно все действия с «малинкой»:
Вот тут [12] читаем, как подружить ее с Wi-Fi-адаптером TP-Link TL-WN725N.
А вот тут [13] — как установить VNC-сервер, может пригодиться.
Здесь [14] доходчиво расписано, как поднять Samba.
А вот тут [15], как работать со встроенным 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» [16]
Крепление плат индикации на шасси. Рядом лежит плата блока питания.

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

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

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

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

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

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

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

Автор: Potok

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/raspberry-pi/73494

Ссылки в тексте:

[1] Image: http://habrastorage.org/files/4b2/505/a48/4b2505a4808140919f09fcc590b3a912.png

[2] Image: http://habrastorage.org/files/280/1e6/06e/2801e606e7374f3395747e37dec08c32.png

[3] Image: http://habrastorage.org/files/1f4/441/d9a/1f4441d9a2d147aca8163571e52e046c.JPG

[4] Image: http://habrastorage.org/files/55b/98e/12f/55b98e12ffcb4aceb3eaa4eaae550b05.JPG

[5] Image: http://habrastorage.org/files/86e/109/c8b/86e109c8bcfd43839162bc634bb7258a.JPG

[6] Image: http://habrastorage.org/files/465/faf/240/465faf240b424281a06fc2ae11286fe2.JPG

[7] Image: http://habrastorage.org/files/ca5/513/6e3/ca55136e3fe540b7a760f314aa6b79b4.JPG

[8] Image: http://habrastorage.org/files/a1e/6bf/bd0/a1e6bfbd05c348e1b0bf58b0732be7b1.GIF

[9] Image: http://habrastorage.org/files/07d/e81/554/07de81554b37438dbd8a04dacfcb7e5c.jpg

[10] сюда: http://www.simbike.ru/view_post.php?id=10

[11] Image: http://habrastorage.org/files/c63/fb4/eba/c63fb4ebad3c43f5a5e9d6dd7be119ad.GIF

[12] тут: http://www.raspberrypi.org/forums/viewtopic.php?p=462982#p462982

[13] тут: http://www.armlinux.ru/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-vnc/

[14] Здесь: http://habrahabr.ru/post/149890/

[15] тут: http://www.raspberry-projects.com/pi/programming-in-c/uart-serial-port/using-the-uart

[16] Image: http://habrastorage.org/files/30a/7e9/f66/30a7e9f66497477fa446b2184e58e81e.JPG

[17] Image: http://habrastorage.org/files/936/15c/f49/93615cf4990b42b1ad064f3933a668de.JPG

[18] Image: http://habrastorage.org/files/24a/d3e/730/24ad3e73060f4153a26369184d471f70.JPG

[19] Image: http://habrastorage.org/files/9e8/9bc/909/9e89bc9098f140669b5b8eae604f4092.JPG

[20] Image: http://habrastorage.org/files/cf1/412/ab8/cf1412ab86e44298bf5c79b955cb0243.JPG

[21] Image: http://habrastorage.org/files/30b/5dc/a88/30b5dca881154b399dfdec0af10e2c6b.JPG

[22] Image: http://habrastorage.org/files/3cd/41e/89e/3cd41e89e3314dbd9d23b6e79c139732.JPG

[23] Источник: http://habrahabr.ru/post/242263/