Каждый из вас наверняка (раз вы читаете этот текст) сталкивался в своей жизни с флоппи, CD и т.д. дисководами, принтерами, сканерами, в общем, устройствами, в состав которых входит шаговый двигатель. Вот сейчас будем его включать. На рисунке ниже схема, которую я нашел в интернете. Пусть простит меня автор, я не даю ссылку на него (просто не помню, где я ее нашел), но если он увидит эту статью, то узнает свою схему.
На самом деле все честно, все работает. Можно выложить ещё кучу всяких схем, но нам сейчас важно понять не принцип работы схемы, а принцип подачи управляющих сигналов на двигатель. На диаграмме ниже – это видно.
На каждую из обмоток двигателя поочередно подаются импульсы, иногда на 2-х обмотках сразу присутствует высокий уровень сигнала. Если вы посмотрите на левую часть диаграммы и заметите D0-D3, то сразу поймете куда я клоню.
Вот что мы имеем в конечном итоге, ну и, конечно же, компьютер с LPT портом. Питание для двигателя придется делать самому, причем для каждого типа двигателя — свое. В соответствии с диаграммой на входы A, B, C, D мы подаем последовательно 3, 2, 6, 4, 12, 8, 9, 1 через &H378. Причем откуда начинать не критично, вопрос в сохранении последовательности и повторении ее по «кругу» или слишь, сколько нужно. Если же изменить направление последовательности (задом-наперед), вращение двигателя будет в противоположную сторону. Данная последовательность дает команду двигателю делать полушаги (это зависит от конструкции двигателя), для управления полным шагом последовательность будет такой 3, 6, 12, 9.
И тут мне на глаза попался семисегментный индикатор на светодиодах от калькулятора. Решение пришло моментально.
Вот как устроен такой индикатор.
Для простоты я нарисовал 4-х разрядный (в моем индикаторе их 12) семисегментный индикатор на светодиодах. На разряды 1-4 подаем 0, а на сегменты подаем + питание (для каждого типа индикатора свои параметры питания). Все сегменты объединены, поэтому зажигать такой индикатор нужно динамической индикацией. Кто хоть раз сам собирал электронные часы, тот знает, что это такое, но на всякий случай рассмотрим это по подробнее.
Шаг 1. На первый разряд подается низкий уровень сигнала, а на сегментах (высоким уровнем) выставляется код цифры, которую мы хотим увидеть.
Шаг 2. На второй разряд подается низкий уровень сигнала, а на сегментах (высоким уровнем) выставляется код цифры, которую мы хотим увидеть.
Шаг 3. На третий разряд подается низкий уровень сигнала, а на сегментах (высоким уровнем) выставляется код цифры, которую мы хотим увидеть.
Шаг 4. На четвертый разряд подается низкий уровень сигнала, а на сегментах (высоким уровнем) выставляется код цифры, которую мы хотим увидеть.
И опять по новой шаг 1, 2 и т.д. Все это происходит очень быстро, поэтому наши глаза не успевают увидеть мерцание цифр.
Берем наш индикатор и разряды 1, 2, 3, 4 сажаем на STROBE(1), AUTO(14), INIT(16), SELECT IN(17). Это будет управление разрядами, а сегменты A, B, C, D, E, F, G сажаем на D0, D1, D2, D3, D4, D5, D6. Чтобы зажечь в первом разряде, например 1 (сегменты B,C) надо подать на адрес &H378 число 6, а на адрес &H37A – 197.
А вот и готовая программа – электронные часы.
На форме 2 кнопки. Первая запускает часы, вторая останавливает. Параметр Z = 0.004 подбирал опытным путем. Если задержку не ставить, то цифры сливаются, слишком быстро все происходит, и светодиод не успевает погаснуть.
Option Explicit
‘объявление библиотеки для работы с адресами LPT порта
Private Declare Function DlPortReadPortUchar Lib “dlportio.dll” (ByVal Port As Long) As Byte
Private Declare Sub DlPortWritePortUchar Lib «dlportio.dll» (ByVal Port As Long, ByVal Value As Byte)
Dim I, J As Integer
Dim Z As Single
Dim A As String
Private Sub Command1_Click()
J = 1 ‘разрешение цикла
Z = 0.004 ‘задержка
Do While J <> 0
DoEvents
A = Mid$(Time$, 5, 1) ‘считываем единицы минут
DlPortWritePortUchar &H37A, 197 ‘разрешаем засветиться первому разряду
writetime ‘отображаем единицы минут
A = Mid$(Time$, 4, 1) ‘считываем десятки минут
DlPortWritePortUchar &H37A, 198 ‘разрешаем засветиться второму разряду
writetime ‘отображаем десятки минут
A = Mid$(Time$, 2, 1) ‘считываем единицы часов
DlPortWritePortUchar &H37A, 192 ‘разрешаем засветиться третьему разряду
writetime ‘отображаем единицы часов
A = Mid$(Time$, 1, 1) ‘считываем десятки часов
DlPortWritePortUchar &H37A, 204 ‘разрешаем засветиться четвертому разряду
writetime ‘отображаем десятки часов
If J = 0 Then Exit Do
Loop
DlPortWritePortUchar &H378, 0
End Sub
Public Sub writetime()
Select Case Val(A)
Case Is = 0
I = 63 ‘код 0 для семисегментного индикатора
Case Is = 1
I = 6 ‘код 1 для семисегментного индикатора
Case Is = 2
I = 91 ‘код 2 для семисегментного индикатора
Case Is = 3
I = 79 ‘код 3 для семисегментного индикатора
Case Is = 4
I = 102 ‘код 4 для семисегментного индикатора
Case Is = 5
I = 109 ‘код 5 для семисегментного индикатора
Case Is = 6
I = 125 ‘код 6 для семисегментного индикатора
Case Is = 7
I = 7 ‘код 7 для семисегментного индикатора
Case Is = 8
I = 255 ‘код 8 для семисегментного индикатора
Case Is = 9
I = 239 ‘код 9 для семисегментного индикатора
End Select
DlPortWritePortUchar &H378, I ‘пишем код для семисегментного индикатора
Pause (Z) ‘задержка
End Sub
Private Sub Command2_Click()
J = 0
DlPortWritePortUchar &H378, 0
End Sub
‘Процедура задержки. Формат вызова: Pause(число секунд)
Public Sub Pause(Value As Single)
Dim Start, Finish
Start = Timer
Do While Timer < Start + Value
DoEvents
Loop
Finish = Timer
End Sub
Вот так это в жизни работает.
Я не буду описывать подключение люминесцентных индикаторов, но скажу честно пробовал – работает. На сетки разрядов подавал положительный потенциал, нить накала заземлил, а на сегменты подавал 1 через D0-D6. Все светится. ЖКИ индикаторы не пробовал, надо придумать, где взять 64 Гц. Если кто подключит — буду рад получить от вас схему. Кстати интересная мысль – можно сделать бегущую строку на светодиодах для отображения буквенно-цифровой информации. В общем, лишний раз убеждаюсь, что этот порт – прекрасный инструмент для творчества.
Вот ещё небольшая тема насчет электродвигателей. Не у всех есть шаговые двигатели, да и не всегда это удобно и нужно. Давайте попробуем обойтись простым двигателем с редуктором, например для точного перемещения некоторого устройства в горизонтальной плоскости. Пусть это будет карандаш или фломастер. Двигатель связан с понижающим редуктором, который в свою очередь связан с осью имеющей резьбу. На оси с резьбой жестко закреплен диск с металлическими секторами (контактными площадками или прорезями для оптики), например, такой
или
Это уже не принципиально, важно то, что, зная шаг резьбы, например, шаг 1 мм, секторов у нас 4, значит, за полный оборот диска каретка продвинется вперед на 1 мм, а за четверть оборота – на 0,25 мм. Количество секторов может быть любым – кому сколько захочется. Но что мы теперь получаем.
Идем дальше. Программа управления двигателем работает, например, по такому алгоритму.
Управление идет через шины D0-D7 и/или через порт &H37A, команды от исполнительных устройств (датчиков) приходят на &H379 и/или &H378. В общем, дальше ваша фантазия и возможности. Тот же принцип логично использовать для перемещения каретки в перпендикулярной плоскости. И вот вам станок с перемещением в 2-х направлениях. Т.е. построить дома станок с ЧПУ (числовым программным управлением) вполне РЕАЛЬНО.
Статью прислал Клюшников Алексей, г.Иваново.