Технический форум по робототехнике.
KiCom » 22 окт 2005, 11:24
Здравствуйте уважаемые !!! Как я рад что нашел этот форум !!!
А теперь к делу.
Собственно меня интересует как это можно сделать, что такое серва знаю

ибо занамиюсь rc моделирование (авто). Програмировани тоже знаю, C++ под дос, управление как я понимаю осушествляеться через COM порт, собственно что нужно писать чтобы все заработало, какие нужны микросхемы, контролеры, между компом и сервой. Если напишете как в кулинарной книге

, тоесть по шагам, буду очень рад.
Заранее извините если задаю тупые вопросы

-= Александр =- » 22 окт 2005, 13:30
Есть два способа:
1)воткнуть серву в LPT и слать туда искуственно сделанный сигнал
2)сделать преобразователь на контроллере (COM-порт -> ШИМ)
В первом случае сильно завязываешься на комп, чтоб создать такой сигнал придется использовать системмный таймер и все время его генерить. к ЛПТ можно подключить до 8 серв. Если извратиться - около 16, но это геморно и сигнал нагенерить трудно будет.
Во втором - надо знать контроллеры. И комп тут не нагружен - шлешь в порт номер сервы и значение на которое ее выставить и не паришься, контролер все сделает сам. Количество серв в этом случае зависит от крутизны контроллера. На АВР, например Мега какая-нить хоть 32 штуки потянет!
KiCom » 22 окт 2005, 14:04
Начнем пожалуй с простого, интересует способ с LPT, как с ним работать, может код накидаете?
-= Александр =- » 22 окт 2005, 19:21
А где думаешь писать?
Под ДОС все просто:
outp(888,a);
888 это адрес LPT1 в десятичной системе (378 в 16ричной)
а - байт. Каждый разряд отвечает за одну серву.
Цикл.
Вначале отправляем туда 255 (стартовый импульс всем)
Затем гасим разряды по-очереди, когда какой серве надо, зависит от ее положения.
Ждем сколько надо
Повторяем.
Значения выдержек смотри в файле.
Под ХР/NT/2000 ищи DLPORTIO.dll и как с ней работать, я уже не помню. Смысл тот-же.
- Вложения
-
ServoStandart.pdf
- (121.62 КиБ) Скачиваний: 278
KiCom » 23 окт 2005, 08:47
Да писать буду под дос на с++ , такая просьба может вы накидаете весь код программы, как я понимаю он небольшой? С портами до этого вообще не работал и поэтому немножко страшно вдруг что спалю, вообще спалить чтонибудь можно или нет.
И вопрос как все это подключаеться к порту? От сервы отходит три провода: плюс, земля и сигнал. Как я понимаю плюс и землю на 5 вольт, а сигнал какуда, ведь по одному проводу сиглан не передать.
-= Александр =- » 23 окт 2005, 10:19
Найди распайку ЛПТ. Там тоже есть земля. Эту землю соединяешь с землей питания сервы. (не советую втыкать серву в компьютерное питание, винтам плохо станет от помех) Потом видишь на распайки 8 контактов данных. Туда и подключаются 8 серв своими сигнальными проводами.
Писанием в порты можно разве-что комп подвесить, спалить ничего нельзя.
По поводу кода - не знаю когда, щас досовское си еще найти надо... :roll:
В общем задача простая: генерить импульсы заднной длины и повторять через заданное время. Тоесть ставим бит, ждем, сбрасываем, снова ждем. А вот сколько ждать - смотри в том файле. Помню только что повторяться должно с частотой 50 Гц. И так для каждого бита порта. Для удобства можно поднимать все биты одновременно, а сбрасывать уже как получится... Проще всего это сделать кручением счетчика. Скажем работает таймер, счетчик прибавляется. Для серв есть переменные с их значениями (положениями серв) если счетчик больше этого значения - сбрасываем бит. Счетчик заполнен - обнуляем. Второй счетчик считает общий период. Досчитал - обнуляем и запускаем оба, выставляем все байты снова.
KiCom » 23 окт 2005, 10:47
Ага, будем пробовать, распайку уже нашел, с сервой тоже разобрался там от 0.9мс до 2.1 мс , частота 50 гц ,что кодирует полный поворот в лево и поворот в право.
AlphA » 23 окт 2005, 11:16
А я вот так и не понял: что получится если на серву вообще ни каких имульсов не подавать?
Она воспримит это как импульс минимальной длины и уйдёт в нулевое положение ИЛИ останется в текущем положении вала???
Т.е. можно ли рулить сервой не постоянно, а по мере необходимости, так сказать, в "пакетном режиме"?
-= Александр =- » 23 окт 2005, 11:36
А черт ее знает... Мне попадались и такие что держат положение, а были и такие которые взглючивали по-всякому... Пробовать надо... :roll:
Kanoka » 23 окт 2005, 14:20
А я вот так и не понял: что получится если на серву вообще ни каких имульсов не подавать?
Останется в том месте где была.
KiCom » 23 окт 2005, 14:27
Но вот сохраняет ли она усилие, тоесть если ее положение измениться она наверно не вернется в исходное положение.
И еще, кто пишет на С++ под дос, может накидает простейшую програмку для управления одной сервой, без всякого интерфейса и прочего (см. выше), я тоже попробую сам разобраться, но так на всякий случай.
=DeaD= » 23 окт 2005, 15:02
При отсутствии импульсов серва не пытается сохранять положение, потому как незнает какое положение сохранять ввиду отсутствия памяти как таковой

Во!
KiCom » 23 окт 2005, 19:33
Александр кажеться я допер как управлять LPT поравте если не прав.
Нужно послать значение 255 чтобы включить все канал в адресс оперативки с адресом 378 так ?
-= Александр =- » 23 окт 2005, 23:32
Да. Тебе только одни этот адрес и нужен. 255 - это единицы во всех каналах, начало импульса для всех серв. Если серва одна - отправляй единицу в тот разряд, к которому она подключена.
KiCom » 24 окт 2005, 11:04
Прогу я буду писать под дос но в Win XP , блуждая по просторам интернета я обнаружил что XP не пускает в ту область оперативки так ли это , сам еще не пробовал. Что скажете по этому поводу?