Управление через СОМ порт компьютера внешними устройствами программой на VB.
2. Расширяем число линий вывода
3. Вывод даты-времени на 4-разрядный LED-индикатор
Часто в конференциях от радиолюбителей можно услышать вопрос:"Я сделал (хочу сделать) какое-то внешнее устройство и имею желание подключить его к компьютеру по СОМ порту, чтобы им как-то управлять, но не знаю как". СОМ порт более предпочтителен для таких экспериментов, так как у него выше, чем у LPT нагрузочная способность, и поэтому меньше шансов спалить порт.
Если у вас установлен Visual Basic и есть какие-то навыки программирования на нём, то наиболее простой, по-моему, путь- использовать компонент управления (контрол) MSComm Control, который вызывается Project->Components->и поставить галочку на MSComm Control. Далее необходимо поместить этот контрол на форме и написать код программы для него.
Сложность заключается в том, что приём-передача через СОМ порт требуют строгого соблюдения протокола RS-232, и не всем радиолюбителям под силу разработка контроллера, который бы этот протокол поддерживал. Между тем этот контрол MSComm позволяет считывать и управлять отдельными выводами СОМ порта и тем самым напрямую управлять какими-то внешними устройствами без формирования временных последовательностей RS-232 протокола.
В качестве примера такого внешнего устройства можно привести популярный программатор PonyProg (правда он написан не на VB, но принцип одинаковый). Если внимательно посмотреть на его схему, то видно, что в некоторых случаях (например, при программировании микросхем 24хх), главные информационные сигналы СОМ порта Rx (2) и Tx (3) не используются вообще. Весь обмен идет через вспомогательные выводы CTS(8), DSR (6), DTR (4), RTS (7) (хотя кое-где используется 3-й вывод Tx, об этом мы тоже поговорим).
Для того чтобы считать состояние вывода, достаточно на вход порта компьютера подать однополярные положительные сигналы и обойтись без преобразователей уровня TTL-RS232. Вообще-то это не соответствует стандарту RS-232, однако большинство портов с такими уровнями замечательно работают.
Итак, три вывода СОМ порта - CD, CTS, DSR можно опросить. Команда, которая позволяет считать состояние например вывода CTS (8), выглядит примерно так:
If MSComm1.CTSHolding = False Then (1)
или
If MSComm1.CTSHolding = True Then (2).
То есть этой командой мы опрашиваем 0 или 1 присутствует на выводе CTS.
На
два вывода СОМ порта - DTR и RTS можно
вывести (+12В) или (-12В), и тем самым зажечь
светодиод, включить реле или какой-то
другой исполнительный механизм. Например,
для вывода RTS, это команды:
MSComm1.RTSEnable = False (3) выводит на 7 ножку +12Вольт.
MSComm1.RTSEnable = True (4) выводит на 7 ножку -12Вольт.
На основе этих команд (1)-(4) можно организовать как простой обмен данными с компьютером, так и довольно сложные протоколы, например I2C, SPI, MiсroWire и т.д. В качестве примера можете посмотреть DS1621 pc thermometer, и как, используя эти команды, Альберто Риччи организовал I2C протокол обмена с микросхемой термометра DS1621.
Рис.1. Схема для проверки
Если в качестве практики вы не поленитесь за 10 мин собрать схему рис.1 (можно прямо навесным монтажом на разъёме DB9), и запустить программу Com_device, то сможете увидеть как реагирует программка на замыкание кнопки и включает-выключает светодиод (кнопкой LED) с помощью именно тех команд, о которых я говорил выше (на кнопку ''Ввод" пока не обращайте внимания).
Если же вашему устройству требуется импульсный сигнал, то и его несложно получить. Правда для этого всё же придётся познакомится с временной диаграммой протокола RS-232 (рис.2).
Рис.2. Временная диаграмма RS-232
Как видно, первым идёт старт-бит, затем биты данных, затем стоп-бит (обратите внимание, что 0- это +12В, 1- это -12В) . Предположим, мы посылаем старт-бит, затем сразу же за ним какое-то число нулей, например, в битах 0-1-2-3. Получим такой импульс
Рис.3. Формирование импульса
Меняя число импульсов вслед за стартовым, мы сможем менять длительность импульса (правда с шагом в длительность бита). Для этого на порт необходимо посылать одно из следующих чисел: FF, FE, FC, F8, F0, E0, C0, 80, 00. Причём при FF длительность импульса будет минимальная, при 00- максимальная. На рис.3 код импульса - F0.
Чтобы компьютер выдал на COM порт такой сигнал нужно всего-то выполнить команду
MSComm1.Output = "какой-символ или строка" (5)
Этой командой на порт выдается ASCII код символа. А как нам послать на порт, например, число F0 (240 в десятичном виде)? Вот таким нехитрым способом:
MSComm1.Output = Chr(240) (6)
То есть мы сперва преобразуем число 240 в какой-то символ (я даже не знаю какой, можете посмотреть по таблице ASCII кодов) и этот символ отправляем на выход порта.
Таким образом мы можем из компьютера сделать 8-уровневый формирователь ШИМ сигнала и управлять, например, скоростью вращения какого-нибудь моторчика постоянного тока, вентилятора и т.д. Только сигнал этот придется усилить по току и без внешнего питания вы вряд ли обойдётесь, так как макс. ток, который может выдать СОМ порт- что-то около 25мА. Можете это питание взять с блока питания компьютера. Возможно, придётся ещё и усреднить этот ШИМ сигнал RC-цепочкой или интегрирующим усилителем, это зависит от вашего устройства.
Теперь пришло время нажать кнопку "Ввод" в программе Com_device. Вы увидите окно ввода чисел. Если вы введёте одно из десятичных числел 255, 254, 252, 248, 240, 224, 192, 128, 0 , то вы получите гладкий импульс на 3(Tx) выводе DB9. Если же у вас нет осциллографа, подключите вольтметр постоянного тока между 5(GND) и 3(Tx) выводами и посмотрите, как меняется напряжение. У меня получилась такая зависимость:
FF | FE | FC | F8 | F0 | E0 | C0 | 80 | 0 |
255 | 254 | 252 | 248 | 240 | 224 | 192 | 128 | 0 |
-9.2B | -8.1B | -7.0B | -5.9B | -4.8B | -3.6B | -2.5B | -1.4B | -0.4B |
Как видно, довольно линейная картинка.
Посмотрите, как изменится сигнал при изменении свойства Interval таймера Timer2, а также попробуйте в строке MSComm1.Settings = "1200,N,8,1" изменять скорость обмена (параметр baud rate- в этой строке= 1200).
Если 8 уровней вам не хватает, можете посылать подряд 2 байта:
MSComm1.Output = Chr(240) & Chr(255) (7)
Получится уже 16 уровневый формирователь. С помощью его уже можно организовать 4-разрядный ЦАП, а если его дополнить внешним компаратором, выход которого опрашивать с помощью команд (1),(2) одним из выводов CD, CTS, DSR; то можно и получить 4-разрядный АЦП, например последовательного приближения.
Com_device.rar(5,2 Kb) - архив с исходным текстом программы на VB.
Схема ниже показывает как можно управлять скоростью вращения вентилятора с помощью ШИМ сигнала, сформированного из Тх-сигнала СОМ-порта. Вентилятор можно использовать от блока питания компьютера.
Рис.4. Схема управления скоростью вращения вентилятора
Заметьте, что выводы 2 и 3 разъёма DB9 в ней объединены.
Запустив программу FunControl (рис.5) и щёлкая по радиокнопкам, можно дискретно изменять скорость вращения вентилятора.
Рис.5. Окно программы управления скоростью вращения вентилятора FunControl.
Ехе-файл программы FunControl находится в архиве Exe.rar.
_____________________________________________________________________________________________________________________
2. Расширяем число линий вывода
Всё бы хорошо, но в большинстве случаев два вывода СОМ порта - DTR и RTS - это катострофически мало. Выход из этой ситуации давно известен и очень прост. Он очень часто используется разработчиками устройств на микроконтроллерах при дефиците выводов (ну например, даже в моём проекте Цифровой термометр :)). Суть его заключается в использовании регистров сдвига. На схеме (рис.6) IC1- широко распространённый регистр сдвига 74НС595. Транзисторы- ну например КТ3102, R1..R3-10kOm, R20...R22-1kOm, R12...R19 -100 Om.
Сигналы с СОМ-порта компьютера через разъём DB9 подаются на схемы сопряжения (транзисторы Q1...Q3). Вместо них можно использовать какой-нибудь МАХ232.
RTC выступает в качестве входа последовательных данных (serial data input), Тх- в качестве сигнала сдвига (shift register clock input), DTR - в качестве сигнала записи (защёлки) (storage register clock input) - в скобках обозначения по даташиту, который я советую скачать.
Рис.6. Увеличение числа линий вывода с помощью регистра сдвига 74HC595
На рис.7 показано окно программы. Скачайте исходник на VB6 ехе-файл (52кБ) .
Рис.7. Окно программы
Нажимая на кнопки 0...7 выберете комбинацию и нажмите кнопку "Ввод". Должны загореться соответствующие светодиоды. Кнопка "Очистить " гасит все светодиоды. Вместо светодиодов можно использовать реле или другие исполнительные механизмы (конечно, с учётом их нагрузочной способности).
Число линий вывода можно увеличивать наращиванием числа сдвиговых регистров, при этом вывод 9 надо соединить со входом 14 последующего (как, например на схеме ниже).
_____________________________________________________________________________________________________________________
3. Вывод даты-времени на 4-разрядный LED-индикатор
Конечно СОМ порт проигрывает LPT по скорости обмена, но часто больших скоростей и не требуется. Но чтобы у вас не сложилось впечатление, что это уж слишком "тормознутый" порт, предлагаю посмотреть, как можно вывести системные дату-время на 4-разрядный LED-индикатор. Причём с динамической индикацией- и без всяких микроконтроллеров! При этом частота регенерации составила около 70Гц и мерцания вообще не видно.
Рис.8. Схема вывода даты-времени на 4-разрядный LED-индикатор
IC1,IC3 - регистры сдвига 74HC595, индикаторы- от старых AT-корпусов компьютеров.
На регистр IC1 выводится код цифры, на IC3- позиция включаемого знака.
Рис.9. Окно программы VB_clock и макетная плата
При нажатии кнопкок "Время" и "Дата" выводится соответственно системное время и дата.
VBclock.rar - ехе-файл программы VBclock.
Рис10.
Нажав кнопку «Символ», можно вывести одиночный символ, кнопка «Строка» выводит бегущую строку произвольной длины, которую вы можете ввести в окне ввода строки. Все буквы любого набранного вами текста будут переведены в верхний регистр. В окне программы RunString (рис.11) есть поле 7х7 мнемонических индикаторов, которые дублируют вывод на светодиодную матрицу.
Рис.11.
Ехе-файл программы RunString находится в архиве Exe.rar
Следующая программа Film выводит на светодиодную матрицу (схема осталась прежней, рис.10) запрограммированные вами анимированные картинки размером 7х7 элементов изображения..
Нажимая на кружки нарисуйте картинку- это будет кадром. Сохраните его, нажав на одну из кнопок «>» или «|>» (рис.12). Иногда картинку удобнее рисовать «с чистого листа», а иногда следующая картинка - лишь незначительное изменение предыдущей. Кнопка «>» сохраняет предыдущий кадр и переходит к чистому следующему (все светодиоды погашены), кнопка «|>» также сохраняет предыдущий кадр, но следующий кадр будет повторением предыдущего, который вы сможете изменять по своему желанию. Кнопка «<» возвращает предыдущий кадр.
Рис.12.
После того, как все кадры созданы, нажмите кнопку «Пуск» - все ваши кадры будут последовательно воспроизведены как в окне программы, так и на светодиодном поле. Причём фильм будет прокручиваться до кадра, отображённого в окне «№ кадра». В окне «Ткадра,мс» выберите время показа одного кадра, в миллисекундах. Максимальное число кадров ограничено программой до1000.
Ехе-файл программы Film находится в архиве Exe.rar.
Гирлин
Андрей, г.Сургут, E-mail: giran@mail15.com