Архив номеров > N20 > Брейн-ринг в стиле Downgrade

 

 

Брейн-ринг в стиле Downgrade

 

Однажды одной учительнице понадобилось провести открытый урок, на котором должны были демонстрироваться слайды. Благо проектор в школе нашёлся – какой-то BenQ 500-й серии.

Но вот ноутбука не нашлось. Учительница обратилась за помощью ко мне. Сначала планировалось подключить к проектору ТВ-тюнер T2 с входом USB – он мог воспроизводить картинки с флешки. Но картинки выводились медленно, качество через композитный вход оставляло желать лучшего, да и какая-то полоска с элементами меню висела несколько секунд после открытия каждого слайда…

После этого был извлечён мой «ветеран» – купленный когда-то скорее в коллекционных целях ноутбук Dual ERA-1000. Made in Taiwan. Характеристики следующие: Pentium MMX 233 MHz/48 MB RAM/6 ГБ HDD/C&T 65555 2 MB VRAM.

Год выпуска точно установить не удалось, но гарантия на нём до 99-го – можно предположить, что выпущен он был не позже 98-го.

Есть вполне рабочие CD-ROM и флоппи.

В качестве БП используется какое-то noname китайское универсальное зарядное с кучей насадок. Единственный его недостаток – с ним глючит тачпад. Но положение спасёт USB-мышка.

Да, забыл сказать, на ноутбуке есть два USB-порта, что сильно упрощает работу с ним – флешки, даже современные (хоть на ноуте и USB 1.1), видятся нормально.

Аккумулятор, кстати, ещё не совсем дохлый – минут 15 держит, хотя саморазряд у него высокий.

Вот ноут собственной персоной:

Кто-то очень умный нарисовал на клавиатуре краской корявые русские буквы. Я всё думал их как-то стереть, но боюсь растворителем испортить клавиши.

Изначально, судя по надписям на клавиатуре вроде Bild, Druck и др., ноутбук продавался где-то в Германии.

Имеется интересная функция – если нажать Fn+F1, то на экране показывается заряд батареи. Причём независимо от видеорежима – что в DOS, что в Windows. Очень удобно, жаль, что в современных ноутбуках такого почти не бывает.

Стоит на нём Windows 2000 Pro SP4, причём тормозит жутко – всё-таки памяти маловато. Грузится где-то 3-4 минуты – причём даже когда почти все службы отключены. Хотел поменять её на 98-ю, да всё недосуг.

Вот задняя панель с портами. Есть и аудиоразъёмы, и что-то вроде S-Video (но тут я не уверен), и VGA.

В общем, на ноутбук был водружён ACDSee v2.41, скопированы картинки. Проектор был подключён к VGA-выходу ноутбука, который работает в режиме «клона».

Презентация в целом прошла успешно. Конечно, картинки выводятся довольно медленно – где-то 1-2 секунды. Да и цвет только 16-битный (для True Color нужно уменьшать разрешение). Но выглядело всё вполне прилично.

Дальше – больше.

Упомянутая учительница решила провести ещё одно открытое занятие. На этот раз планировалась игра «Брейн-ринг» по английскому языку.

Соответственно, опять ноут должен был показывать слайды.

Если кто помнит, суть «Брейн-ринга» в том, что первой отвечает команда, первой нажавшей на кнопку после вопроса ведущего.

Здесь сначала планировалось использовать сигнальные карточки, т.е. команда, которая уже готова отвечать, поднимает карточку, сигнализирую об этом. Кто первый поднял – тот и отвечает.

Но на «репетиции» выяснилось, что карточки очень часто поднимают одновременно, что вносило некоторый сумбур в игру.

Решил я сделать какую-нибудь электронную систему для фиксации того, кто первый нажал кнопку.

В интернете для этого есть много схем на реле и т.п., но я решил использовать ноутбук. А конкретно – его COM-порт.

Идея проста – в COM-порту, помимо линий приёма-передачи, есть дополнительные входящие и исходящие сигналы, которые позволяют компьютеру и подключённому к нему устройству узнать статус друг друга. Вот к ним я и решил подключить кнопки.

Сказано – сделано.

Был раздербанен шнур для подключения по COM-порту какого-то давно нерабочего ИБП. Были куплены кнопки – изначально они предназначались, как я понял, для дверных звонков. Кстати, кнопки на вид ничем не отличались, только цветом, тем не менее, оказалось, что одна из них нажимается значительно туже. Пришлось вручную переделывать контакты из подручных материалов, чтобы выровнять «люфт» и т.п.

Использовалась следующая схема:

Т.е. вначале мы включаем DTR, логическая единица (+) с неё идёт на кнопки, если какая-то из трёх кнопок замыкается, логическая единица попадает на соответствующий вывод порта – если жмём красную, высокий уровень получается на CTS (Clear to Send), если зелёную – на CD (Carrier Detect, он же DCD, он же RLSD), если сброс – на RI (Ring Indicator).

Нашлись только белая и красная кнопки, соответственно, на белую был наклеен зелёный скотч (в классическом «Брейн-ринге» были две команды – «зелёная» и «красная»).

Кнопки для утяжеления были прикручены к деревяшкам.

Вот как выглядит система в сборе.

Та замотанная изолентой штука между кнопками – «Сброс». Кнопка сброса нужна была, когда программа, обслуживающая всё это, работала в синхронном режиме, при этом она зависала на время опроса COM-порта, вот для аварийного прерывания текущей операции и использовался «Сброс». Потом я переделал всё на работу в асинхронном режиме, необходимость в ней отпала, но я всё-таки её оставил – на всякий случай.

На низ кнопок был наклеен поролон (или нечто подобное) – чтобы не скользили по партам:

Дело осталось за софтом. В принципе, в интернете полно программ для таких целей (и для COM, и для LPT), но мне нужно было кое-что специфическое – чтобы можно было одновременно показывать слайды и работать с этой системой.

Поэтому я решил написать софт сам. Сначала хотел сделать это всё под DOS, но сроки поджимали, поэтому воспользовался Delphi 7. А конкретно – компонентом TComPort. Собственно, программа получилась несложной (unit.pas – 168 строк), скачать её с исходниками можно тут:

http://dgmag.in/N20/brain.zip

Я старался всё прокомментировать – думаю, разберётесь.

Основное окно программы выглядит так:


58 – оставшееся время на обсуждение в секундах. Нули – счёт (просто Edit’ы). Суть работы программы такая – ведущая задаёт вопрос, я жму Start, запускается таймер, звучит сирена. Если какая-то команда нажимает на кнопку, звучит звонок и загорается квадрат того цвета, который соответствует нажатой кнопке. Сейчас нажали зелёную.

Если ответ неправильный, я жму Continue, время продолжает бежать до нуля. Фальстарты не обрабатываются.

Возможно, не совсем соответствует «каноничным» правилам, но, думаю, сойдёт.

Основное окно сделано так, чтобы висеть поверх всех окон. Это сделано специально, чтобы на фоне (через ACDSee) можно было показывать слайды. Например, нужно угадать портрет:

Работа с TComPort достаточно проста.

Кидаем его на форму. Затем прописываем ему свойство Connected в True, а на обработчики ComPortCTSChange, ComPortRing, ComPortRLSDChange вешаем наши процедуры.

 

Включаем DTR:

ComPort.SetDTR(True);

 

А вот, для примера, процедура обработки нажатия красной кнопки:

 

procedure TForm1.ComPortCTSChange(Sender: TObject; OnOff: Boolean);
begin
// реагируем, только если кнопка
// не заблокирована, если раньше не нажата
// другая, если запущено время
IF OnOFF and StartFlag and not(RedBlocked) and not(Pressed) then
 begin
  Pressed:=true;//фиксируем нажатие
  RedBlocked:=true;
// блокируем эту кнопку - на случай, если
// будет неправильный ответ и будем делать
// Continue
  PlaySound('ring.wav',0,SND_ASYNC);//звонок
  RedLight;//зажигаем красные светодиоды
  Timer1.Enabled:=false;//стопорим таймер
  Red.Visible:=true;
//показываем красный квадрат на экране
  Form1.Update;//обновляем форму
 end;
end;

 

Думаю, по комментариям всё понятно. Проверка флага OnOff позволяет реагировать только на нажатие, но не на отпускание кнопки (если OnOff = True, то кнопка нажата).

Возникла ещё одна небольшая сложность – за ноутбуком сижу я, экран ноутбука и проектора передо мной, ведущая же стоит к нему спиной, соответственно, ей не видно, какая кнопка сработала.

Как временное решение, я сделал сборку из двух пар зелёных и красных светодиодов, которые повесил на LPT-порт. На 4 старших битах данных – красные, на 4 младших – зелёные.

Потом добавил в программу модуль LPTIO. Соответственно, теперь я могу зажигать и гасить светодиоды такими командами:

 


          // Зажечь красные светодиоды
          procedure TForm1.RedLight;
          begin
           Lpt.WritePort(LPT2,0,240);
          end;

 

Всё это вешается на заднюю стенку дисплея ноутбука.

Вот так это выглядит (горят обе пары):

Не очень эстетично (как и всё остальное), но нужно учесть, что делалось это всё буквально за несколько дней.

Итак, всё было готово, игра прошла успешно, техника не подвела.

В будущем планирую всё это переписать под DOS – т.е. в одну программу и показ картинок, и обработку нажатий, чтобы, так сказать, монопольно использовать ресурсы, а то в Windows в фоне вечно происходят какие-то неизвестные процессы…

Ну и хочется всё это сделать покрасивее и поаккуратнее. Возможно, добавить управление с ИК-пульта. Эх, нашлось бы время…

 

 


uav1606



Архив номеров > N20 > Брейн-ринг в стиле Downgrade