автор Guido Socher (homepage)
Об авторе:
Гвидо любит Linux не только за удовольствие исследовать огромные
возможности этой системы, но и из-за людей, вовлеченных в ее создание.
Перевод на Русский:
Алексей Отвагин <forlelik(at)yahoo.com>
Содержание:
|
ЖК-панель управления для Вашего сервера на Linux
Резюме:
В этой статье мы создадим ЖК-панель управления, построенную на ЖК-дисплее
Hitachi HD44780 и AT90S4433 AVR 8-Bit RISC микроконтроллере фирмы Atmel. Оба
этих компонента являются очень распространенными и недорогими. Панель
управления включает в себя сторожевой таймер для администрирования
компьютера и две кнопки для осуществления диалога с пользователем. Вы можете
установить IP-адрес, маску подсети, адрес шлюза, остановить систему,
прочитать статистику, сделать практически все, что угодно, поскольку почти
вся логика реализована скриптом perl и может быть легко изменена. Панель
соединяется с Вашим компьютером последовательной связью через RS232.
Для работы Вам необходима как минимум частичная установка среды разработки Linux
AVR. О том, как ее установить, описано в статье: Программирование
микроконтроллера AVR с помощью GCC.
Введение
Это устройство в основном комбинирует функциональность аппаратуры, уже
использованной в предыдущих статьях:
Наша новая конструкция, однако, идет несколько далее предыдущих. Она имеет
дополнительные кнопки для взаимодействия с пользователем и содержит
аппаратный сторожевой таймер для администрирования сервера. К тому же аппаратура
предоставляет ему аналоговый канал ввода. Здесь мы его не используем, но Вы
можете присоединить к нему, например, датчик температуры.
Чтобы
создать устройство, у Вас должны быть некоторые навыки радиолюбителя.
Используемые детали недороги и вместе стоят не более 40 Euro.
Идея
этой панели заключается в возможности позволить Вам управлять сервером без
монитора и клавиатуры. Linux является очень надежной ОС для сервера, которой
можно легко управлять удаленно. Однако, когда Вы подключаете ее в сеть
в первый раз, Вам нужно установить IP-адрес, адрес шлюза и маску подсети.
Панель позволяет Вам установить эти адреса. Она также позволяет Вам остановить
сервер, даже не находясь в серверной комнате.
Конструкция панели - классическая. Все "специфичные для сервера" части
реализованы в скрипте на perl. Вся аппаратура, состояние кнопок, текст на
дисплее, светодиоды... управляются посредством команд ASCII. Вы можете
использовать эту конструкцию для создания mp3-плейера или управления тостером,
как Вам заблагорассудится.
Что Вам понадобится
Для создания панели Вам понадобятся следующие детали:
1 x микроконтроллер Atmel At90S4433
1 x 28pin 7.25 mm гнездо для ИС
1 x 16pin гнездо для ИС
1 x MAX232
1 x небольшое реле 5V
1 x кварц 4MHz
2 x светодиоды (зеленый и красный)
1 x BC547 NPN-транзистор
1 x BC557 PNP-транзистор
4 x конденсатор 1uF
2 x керамический конденсатор 27pF
1 x конденсатор 10nF
1 x конденсатор 100nF
3 x резистор 4k7
2 x резистор 2k2
1 x резистор 10K
1 x резистор 3k3
2 x резистор 100 Ohm
3 x резистор 470 Ohm
3 x резистор 1k
1 x резистор 220 Ohm
1 x потенциометр 4K7 (как можно меньший)
1 x Z-диод 4.3V
2 x маленькие кнопки
1 x малый обычный диод (типа 1N4148, любой дешевый)
1 x 2-хстрочный 20-символьный ЖК-дисплей с интерфейсом, совместимым с
HD44780.
Все ЖК-дисплеи с 14 или 16 контактами, которые мне приходилось видеть, были
совместимы с HD44780. Вы можете также использовать 3-х или 4-х строчный дисплей,
но тогда Вам нужно слегка изменить программу.
В дополнение к этому Вам
понадобится несколько проводов и соединителей для питания и RS232. Если у Вас
2-х строчный дисплей, Вы можете закрепить его на тонком алюминиевом листе,
подогнав его к гнезду 5.25" на Вашем сервере.
Схема и плата
Я использовал eagle for Linux для разработки схемы и платы. Это
прекрасная программа, но Вам понадобится некоторое время, чтобы научиться ею
пользоваться. Вы можете получить бесплатную версию для частного пользования по
адресу cadsoftusa.com.
Схема (нажмите на нее для увеличения):
Плата (нажмите на нее для увеличения):
Рисунок платы на белом фоне для лучшей печати:
плата с белым фоном (Внимание: Это не файл для создания
печатной платы.)
Файлы eagle (сжатые gzip, отметьте, что некоторые умные броузеры
распакуют их во время скачивания):
Схема
Я кратко поясню приведенную выше схему. У AT90S4433 есть 3 порта: PB,
PC и PD. PC может использоваться в качестве аналогового или цифрового порта
ввода. Все порты могут использоваться как цифровые входы и выходы. Этим
управляет программа через DDR (Data direction register)(Регистр направления
данных). Мы используем в качестве цифровых все контакты, кроме 23 (0 или 5 V).
Max232 - это преобразователь уровня напряжения. Интерфейс RS232 использует
+-10V, а Max232 преобразует их в 0-5V. На контакте 1 (контакт сброса) AT90S4433
Вы обнаружите нечто, называемое Brownout circuit (монитор питания). Эта схема
поддерживает низкий
уровень на сбросе (активный), когда питания недостаточно, чтобы защитить
процессор от выполнения неверных операций или выхода из строя. Это может
произойти за несколько миллисекунд во время включения или выключения. Схема
обеспечивает корректный запуск программы на микроконтроллере.
Некоторые из вас могут удивиться, для чего нужен диод, включенный
параллельно катушке реле в такой полярности, что кажется, что он ничего не
делает. Этот диод очень важен! Когда Вы переключаете реле, катушка
генерирует очень высокое напряжение. Оно может разрушить микроконтроллер.
Это напряжение имеет полярность, противоположную к питающему напряжению
катушки. Диод может быть очень дешевым, ничего особенного, но важно, чтобы он
присутствовал.
Две кнопки, которые нужно присоединить через
коннектор, обозначены схематично как "DIGITAL IN PUSH BUTTON". При нажатии
они замыкают PD3 или PD6 на землю.
Как сделать печатную плату
Чтобы протравить печатную плату, вначале Вам нужно напечатать этот файл postscript
(linuxlcdpanel.ps.gz) на прозрачной пленке. В строительном магазине Вы
можете взять немного полупрозрачной пленки Sinolit. Ее выпускает Regulus, и
она используется для офсетной печати. Еще одной альтернативой является
60-граммовая бумага + прозрачный лак (pausklar 21 от Kontakt Chemie).
Преимущества бумаги и Sinolit в том, что тонер лазерных принтеров
действительно прилипает к бумаге/пленке и обеспечивает хороший контраст.
Я
преобразовал файл postscript в PDF, если у Вас нет
системы для печати postscript. Однако, качество вышло несколько хуже.
Время экспозиции для фотоплат на медной основе зависит от источника света. В
нормальном домашнем солярии оно составляет около 1-2 минут. Вы можете также
использовать дневной свет, но избегайте прямых солнечных лучей (они слишком
сильные). Вы можете немного поэкспериментировать с небольшими кусочками
фотоплат, чтобы определить наилучшее время экспозиции, прежде чем
использовать реальную плату.
|
Экспонированная и разработанная плата перед травлением |
Экспонированные платы должны быть обработаны в течение нескольких минут в
NaOH (едкий натр). После этого Вы должны внимательно проверить результат и
внести исправления черным маркером Edding 780 (это не перманентный маркер,
это маркер с действительно тонким стержнем). Обычно я делаю подложки немного
больше, поскольку я обнаружил, что подложки из Eagle слишком малы для
любительского использования.
|
Готовая плата перед просверливанием отверстий |
Замечание: Иногда производители не могут согласовать общую раскладку
контактов и систему обозначения для реле. Я использую маленькое реле 5V
производства Matsushita. Ваше реле может иметь другую раскладку контактов,
поэтому могут понадобиться изменения в плате (с помощью маркера, устойчивого
к травлению).
Если Вы удовлетворены, Вы можете травить плату в FeCl3 (хлорид железа).
FeCl3 обеспечивает хорошую скорость травления при комнатной температуре. Его
легко использовать, поэтому он наиболее подходит для домашнего использования.
Вы получите наилучшие результаты, если плата будет расположена вертикально в
высоком контейнере. Ионы меди тяжелее ионов железа, и поэтому, если Вы заполните
маленький плоский тюбик FeCl3, то ионы меди будут собираться у низа платы.
Когда плата будет готова, уберите маркер Edding с помощью скипидара. Вы
можете оставить "чернила" фоторезиста. Он испарится, когда Вы будете паять и
защитит медь.
Программы для микроконтроллера
Программы для микроконтроллера содержатся в следующих файлах:
- lcd.c, lcd.h,
lcd_hw.h: Это общая библиотека avr LCD. Она базируется на работе Peter
Fleury (http://jump.to/fleury). Эта версия слегка модифицирована и является
более гибкой. Она позволяет Вам присоединить ЖК-дисплей к любому контакту
микроконтроллера. Вам нужно лишь сменить определения в файле lcd_hw.h.
- avr-util.c,
avr-util.h: функции для получения различных задержек по времени.
- uart.c, uart.h:
Это библиотека для интерфейса RS232. Она использует аппаратные
прерывания. Как только от компьютера приходит символ, выполняется функция
SIGNAL(SIG_UART_RECV), и данные копируются из приемного буфера в буфер строк.
Командный язык для нашей ЖК-панели построен так, что каждая команда
заканчивается символом новой строки. Когда будет найден символ новой строки,
устанавливается флаг (uart_rx_linecomplete), а данные становятся доступными.
Это также означает, что Вы не должны посылать команды дисплею как можно
быстрее, а ждать некоторое время (миллисекунду) после каждой строки. Каждая
команда подтверждается результатом, ok, или err (при ошибке). Управляющая
программа perl может использовать результат в качестве селектора для посыла
следующей команды.
- analog.c,
analog.h: Код аналого-цифрового преобразователя. Он также
управляется прерываниями. Когда запускается отдельное преобразование
аналог-код, программа ждет прерывания SIG_ADC, чтобы считать результат из
регистра ADC.
- hardwarewd.c,
hardwarewd.h: Это сторожевой таймер. Мы используем внутренний делитель
(делим на 1024), чтобы управлять таймером. Таймер - это 16-битный регистр, от
которого мы отнимаем 8-битную переменную до переполнения. Для кварца 4MHz мы
будем отсчитывать нашу переменную около 16 секунд. Программа на perl
определяет, что компьютер работает, периодически устанавливая переменную
обратно в максимальное значение. Если она не может этого сделать
(например, компьютер завис), то переменная постоянно уменьшает свое значение, а
когда она достигнет 0, реле переключится и вызовет аппаратную перезагрузку
нашего сервера.
- linuxlcdpanel.c:
Это основная программа. Она непрерывно проверяет наличие команд от
интерфейса RS232 и нажатие кнопок.
Чтобы детально разобраться с программой, я рекомендую Вам прочесть
справочную информацию для микроконтроллера. Она находится в справочном
разделе в конце статьи (или на www.atmel.com)
Однако, для
использования панели Вам не нужно разбираться с программой, Вам
достаточно просто распаковать архив с исходным кодом (возьмите
linuxlcdpanel-0.7.tar.gz с страницы) и введите:
make
make load
либо используйте уже скомпилированную программу, загрузив ее командой
make loadprebuild
Очень легко. Вы найдете описание программирования микроконтроллера в
первой статье: Программирование
микроконтроллера AVR с помощью GCC.
Тестирование ЖК-панели
ЖК-панель создана для работы от внутреннего источника питания 5V
Вашего сервера (красный провод=5V, черный провод=ground). Однако, Вы
никогда не должны соединять ее в первый раз с компьютерным источником
питания. Вы можете сделать небольшую ошибку во время пайки и сборки. Источник
питания компьютера очень мощный, поэтому Ваш компьютер и плата могут скрыться
в облаках дыма, если Вы допустите ошибку. Сначала протестируйте ее с внешним
стабилизированным и ограниченным по току источником питания! Теперь запишите
программу в ПЗУ, как описано выше. После этого Вы должны увидеть бегущую
строку "linuxfocus.org" на ЖК-дисплее. Теперь присоедините интерфейс RS232:
MAX232 контакт 14 к CTS (DB-9 контакт 8)
MAX232 контакт 7 к RXD (DB-9 контакт 2)
MAX232 контакт 13 к TXD (DB-9 контакт 3)
Вам нужно также присоединить DTR, DSR и CD (DB-9 контакты 4, 6 и 1)
Это хорошо видно на схеме выше.
Чтобы использовать последовательный порт, Вам нужно
инициализировать его. Архив исходных кодов linuxlcdpanel-0.7.tar.gz содержит
программу ttydevinit, которая производит инициализацию. Пусть Вы
присоединили панель к порту COM2(ttyS1), тогда Вам нужно запустить команду:
./ttydevinit /dev/ttyS1
Теперь драйвер последовательного порта инициализирован для использования
скорости 9600 Бод и Вы можете начать "общение" с Вашей ЖК-панелью. Откройте 2
окна xterm. В одном Вы вводите "cat /dev/ttyS1", а в другом - "cat >
/dev/ttyS1". Теперь Вы можете ввести команду, например l=11 (включить светодиод
1) или l=10 (выключить светодиод 1). Вы увидите в первом xterm, что Ваша
ЖК-панель подтверждает Вашу команду "ok".
Все доступные команды
объяснены в файле README.commands.
Архив исходных кодов содержит скрипт ttytest.pl, который ничего не делает, а
периодически переключает красный светодиод. Он может использоваться, как
простой пример программы, показывающей, как управлять ЖК-панелью.
Вы можете использовать его как основу для собственных программ. Взгляните на
исходный код. Это требует некоторых знаний perl, но это короткая программа.
Присоединение сторожевого таймера
По умолчанию сторожевой таймер отключен. Вы можете включить его командой w=1 и
установить тайм-аут командой s=x, где x - это величина между 1 и 255.
Например, s=10 установит тайм-аут сторожевого таймера на 10*16sec=160sec.
Программа-драйвер должна периодически устанавливать тайм-аут, чтобы избежать
срабатывания сторожевого таймера. Если Ваш сервер вдруг должен заблокироваться,
то драйвер не должен больше устанавливать тайм-аут, тогда сработает сторожевой
таймер. Я знаю, что серверы на Linux практически никогда не зависают.
Однако, если сервер все же завис и стал недоступен, то обычно на месте нет
никого, кто мог бы нажать сброс или никто не знает, где находится сервер,
поскольку за последние два года с ним не было проблем.
Сторожевой
таймер сконструирован так, что он срабатывает лишь однажды. Это сделано,
чтобы избежать повторного срабатывания во время проверки файловой системы,
которая может последовать за перезагрузкой. Когда сервер вновь поднимется,
драйвер снова разрешит таймеру работать.
Чтобы физически
присоединить сторожевой таймер, Вам нужно найти два провода, которые идут к
кнопке сброса Вашего сервера. Параллельно с кнопкой сброса Вы должны включить
реле от сторожевого таймера.
Как использовать сторожевой таймер
Сторожевой таймер гарантирует, что система всегда будет выполнять программу.
Он не может гарантировать, что веб-сервер или приложение базы данных будут
всегда запущены и активны. Чтобы проверять это, Вам необходимо использовать
задание crontab или другую программу. Вы можете быть уверены, что crontab
наверняка работает, поскольку сторожевой таймер обеспечивает, что в
общем программы продолжают выполняться.
К примеру, Вы можете создать
скрипт, который срабатывает как задача cron и скачивает каждые 15 минут
страницу с Вашего сервера, но Вы должны быть аккуратны в следующем: Веб-сервер
может быть сильно загружен запросами и поэтому будет нормальным, если он не
сможет ответить на все. Поэтому Вы должны учитывать, насколько часто
сервер не отвечает и если он не ответит в течение последних 10 запросов, Вам
нужно перезапустить сервер или вызвать обычную перезагрузку( но не аппаратный
сброс через сторожевой таймер).
Кроме приложений Вы также должны
контролировать использование дискового пространства. Приведенная команда shell
сообщит что-либо, если один из разделов диска заполнен более чем на 80%: df | egrep ' (8.%|9.%|100%) '
Это также можно внести в
crontab для регулярной проверки использования дисков.
Скрипты на сервере
Почти вся логика нашей ЖК-панели реализована скриптом llp.pl, который надо
скопировать в /usr/sbin/. Посшле этого скопируйте программу ttydevinit в
/usr/bin, а файл ifconfig_llp.txt (из каталога etc архива исходных кодов) в
/etc. Теперь отредактируйте ifconfig_llp.txt и смените адреса на нужные:
NETMASK=255.255.255.0
IPADDR=10.0.0.4
GATEWAY=10.0.0.2
Сделайте копию Вашего оригинального скрипта /etc/rc.d/init.d/network и
перенесите etc/network script из архива исходных кодов
в /etc/rc.d/init.d/network. Этот скрипт и имена каталогов подходят только
для Redhat и Mandrake. Скрипт etc/network_all_distributions более общий и
будет работать с любым дистрибутивом Linux, но Вы должны представлять себе, где
Ваш Linux содержит каталоги init-rc. Их расположение отличается в разных
дистрибутивах.
Измените в файле /etc/rc.d/init.d/network строку
/usr/sbin/llp.pl /dev/ttyS1&
если Вы используете не COM2.
Теперь Вы можете запустить
/etc/rc.d/init.d/network start
и оценить свою ЖК-панель в действии. Замечание: Сейчас можно потренироваться
и изменить IP-адрес. Изменения вступят в силу только после следующей
перезагрузки. Поэтому попробуйте, а затем смените его обратно перед
остановом сервера(Вы можете также отредактировать /etc/ifconfig_llp.txt, чтобы
отменить изменения).
Логи
Скрипт llp.pl пишет лог-файл /var/log/llp.log. Этот лог растет очень
медленно. Обычно его не нужно прокручивать автоматически. Вы можете
прокрутить его программой типа logrotate, если Вам это нужно. После
прокрутки ничего делать не надо. Конфигурационная строка для logrotate
может быть такой: /var/log/llp.log {
nocompress
monthly
}
Лог будет содержать события, когда система была остановлена вручную, сменялся
IP-адрес (IP, шлюз, маска подсети), либо сторожевой таймер вызвал перезагрузку.
Естественно, Вы не можете записать тайм-аут таймера, когда он
наступит (вследствие зависания системы), но вместо этого он будет
записан при следующей загрузке.
Панель в действии
Здесь представлены несколько "снимков с экрана" работы ЖК-панели. Это не
все функции, предлагаемые этой панелью. Их гораздо больше и Вы можете
добавить свои собственные.
Главный экран. Показывает какое-то название (в нашем случае linuxfocus),
время работы и загрузку. Обновляется периодически.
Меню конфигурации IP
Пример IP-адреса, который был только что сменен
Как сменить адрес шлюза(способ по умолчанию)
Заключение
Чтобы создать эту ЖК-панель, требуются некоторые навыки радиолюбителя, но
это не очень сложная схема. Наша ЖК-панель для Linux предлагает большую
функциональность, чем все другие панели управления, которые я видел, и
является более дешевой и простой.
Удачной пайки :-)
Ссылки
Страница отзывов
У каждой заметки есть страница отзывов. На этой странице вы можете оставить
свой комментарий или просмотреть комментарии других читателей.
2002-05-03, generated by lfparser version 2.19