Назад  

 Управление через СОМ порт компьютера  внешними  устройствами программой на VB.  

1. Суть метода

2. Расширяем число линий вывода

3. Вывод даты-времени на 4-разрядный LED-индикатор

4. Вывод бегущей строки

5. Создание "мультфильма"

1. Суть метода

Часто в конференциях от радиолюбителей можно услышать вопрос:"Я сделал (хочу сделать) какое-то внешнее устройство и имею желание подключить его к компьютеру по СОМ порту, чтобы им как-то управлять, но не знаю как". СОМ порт более предпочтителен для таких экспериментов, так как у него выше, чем у 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.

4. Вывод бегущей строки

    На следующем примере показана возможность  вывода символов на светодиодную матрицу 7х7 программой RunString. Входные цепи идентичны предыдущей схеме.

Рис10.

            Нажав кнопку «Символ», можно вывести одиночный символ, кнопка «Строка» выводит бегущую строку произвольной длины, которую вы можете ввести в окне ввода строки. Все буквы любого набранного вами текста будут переведены в верхний регистр. В окне программы RunString (рис.11) есть поле 7х7 мнемонических индикаторов, которые дублируют вывод на светодиодную матрицу.

  

 Рис.11.

  Ехе-файл программы  RunString находится в архиве Exe.rar

5. Создание "мультфильма"

Следующая программа Film выводит на светодиодную матрицу (схема осталась прежней, рис.10)  запрограммированные вами анимированные картинки размером 7х7 элементов изображения..

Нажимая на кружки нарисуйте картинку- это будет кадром. Сохраните его, нажав на одну из кнопок «>» или «|>» (рис.12). Иногда картинку удобнее рисовать «с чистого листа», а иногда следующая картинка - лишь незначительное изменение предыдущей.  Кнопка «>» сохраняет предыдущий кадр и переходит к чистому следующему (все светодиоды погашены), кнопка  «|>» также сохраняет предыдущий кадр, но следующий кадр будет повторением предыдущего, который вы сможете изменять по своему желанию. Кнопка  «<» возвращает предыдущий кадр.

 Рис.12.

После того, как все кадры созданы, нажмите кнопку «Пуск» - все ваши кадры будут последовательно воспроизведены как в окне программы, так и на светодиодном поле. Причём фильм будет прокручиваться до кадра, отображённого в окне «№ кадра». В окне «Ткадрас» выберите время показа одного кадра, в миллисекундах.  Максимальное число кадров ограничено программой до1000.

  Ехе-файл программы  Film находится в архиве Exe.rar.

Гирлин Андрей, г.Сургут, E-mail: giran@mail15.com  

Назад  

Hosted by uCoz