Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

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

Пн апр 18, 2011 15:33:35

(язык - visual basic 6.0)
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.

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

Пн апр 18, 2011 15:39:07

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 последующего (как, например на схеме ниже).

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

Пн апр 18, 2011 15:42:35

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

Конечно СОМ порт проигрывает LPT по скорости обмена, но часто больших скоростей и не требуется. Но чтобы у вас не сложилось впечатление, что это уж слишком "тормознутый" порт, предлагаю посмотреть, как можно вывести системные дату-время на 4-разрядный LED-индикатор. Причём с динамической индикацией- и без всяких микроконтроллеров! При этом частота регенерации составила около 70Гц и мерцания вообще не видно.

Изображение
Рис.8. Схема вывода даты-времени на 4-разрядный LED-индикатор

IC1,IC3 - регистры сдвига 74HC595, индикаторы- от старых AT-корпусов компьютеров.

На регистр IC1 выводится код цифры, на IC3- позиция включаемого знака.


Изображение
Рис.9. Окно программы VB_clock и макетная плата

При нажатии кнопкок "Время" и "Дата" выводится соответственно системное время и дата.

VBclock.rar - ехе-файл программы VBclock.

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

Пн апр 18, 2011 15:47:27

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

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

Пн апр 18, 2011 15:49:45

Почему не оформите статьёй?

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

Пн апр 18, 2011 15:53:21

Конец цитаты
_________________

Мои вопросы:
1.) Если администрация разрешит, то я выложу ссылки на исходники программ.
2.) Не работает схема для проверки, позднее опишу ход своих действий, надеюсь вы поможете мне.

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

Пн апр 18, 2011 15:54:59

ploop, как оформить статью?

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

Пн апр 18, 2011 18:34:19

Я, конечно, не вникал (да и не мне судить), но судя по всему у вас материал интересный.
Вот сюда: http://radiokot.ru/about/collaboration/

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

Пн апр 18, 2011 19:13:25

ploop, так-как это придумал не я, я лишь процитировал статью, и если заархивировать текст и отправить его на мейл, то получится нехорошо, плагиат.
Это же разные вещи, то я цитирую, и я несу всю ответственность за авторское право, а если поступить как описано там, куда ты выложил ссылку, то получится что за авторское право будет ещё отвечать Кот. Может быть лучше оставить просто на форуме?

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

Пн апр 18, 2011 19:21:37

Ну так я не знал, что это не твой материал :)

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

Пт июл 08, 2011 03:04:11

вот у меня возник такой вопрос по пункту 2. Можно ли сделать так, что бы вместо светодиодов я наоборот подавал напряжение и это у меня высвечивалось как-то на программе или же это как то иначе осуществляется?!
полная тема с исх. http://schemz.narod.ru/COMdevice.htm
Ответить