roboforum.ru

Технический форум по робототехнике.

Управление сервопривода от компьютера

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Управление сервопривода от компьютера

Сообщение KiCom » 22 окт 2005, 11:24

Здравствуйте уважаемые !!! Как я рад что нашел этот форум !!!
А теперь к делу.
Собственно меня интересует как это можно сделать, что такое серва знаю :) ибо занамиюсь rc моделирование (авто). Програмировани тоже знаю,  C++ под дос, управление как я понимаю осушествляеться через COM порт, собственно что нужно писать чтобы все заработало, какие нужны микросхемы, контролеры, между компом и сервой. Если напишете как в кулинарной книге :),  тоесть по шагам, буду очень рад.
Заранее извините если задаю тупые вопросы :)
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 22 окт 2005, 13:30

Есть два способа:
1)воткнуть серву в LPT и слать туда искуственно сделанный сигнал
2)сделать преобразователь на контроллере (COM-порт -> ШИМ)

В первом случае сильно завязываешься на комп, чтоб создать такой сигнал придется использовать системмный таймер и все время его генерить. к ЛПТ можно подключить до 8 серв. Если извратиться - около 16, но это геморно и сигнал нагенерить трудно будет.
Во втором - надо знать контроллеры. И комп тут не нагружен - шлешь в порт номер сервы и значение на которое ее выставить и не паришься, контролер все сделает сам. Количество серв в этом случае зависит от крутизны контроллера. На АВР, например Мега какая-нить хоть 32 штуки потянет!
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 22 окт 2005, 14:04

Начнем пожалуй с простого, интересует способ с LPT, как с ним работать, может код накидаете?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 22 окт 2005, 19:21

А где думаешь писать?
Под ДОС все просто:

outp(888,a);
888 это адрес LPT1 в десятичной системе (378 в 16ричной)
а - байт. Каждый разряд отвечает за одну серву.

Цикл.
Вначале отправляем туда 255 (стартовый импульс всем)
Затем гасим разряды по-очереди, когда какой серве надо, зависит от ее положения.
Ждем сколько надо
Повторяем.

Значения выдержек смотри в файле.

Под ХР/NT/2000 ищи DLPORTIO.dll и как с ней работать, я уже не помню. Смысл тот-же.
Вложения
ServoStandart.pdf
(121.62 КиБ) Скачиваний: 278
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 23 окт 2005, 08:47

Да писать буду под дос на с++ ,  такая просьба может вы накидаете весь код программы, как я понимаю он небольшой? С портами до этого вообще не работал и поэтому немножко страшно вдруг что спалю, вообще спалить чтонибудь можно или нет.
И вопрос как все это подключаеться к порту? От сервы отходит три провода: плюс, земля и сигнал. Как я понимаю плюс и землю на 5 вольт, а сигнал какуда, ведь по одному проводу сиглан не передать.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 23 окт 2005, 10:19

Найди распайку ЛПТ. Там тоже есть земля. Эту землю соединяешь с землей питания сервы. (не советую втыкать серву в компьютерное питание, винтам плохо станет от помех) Потом видишь на распайки 8 контактов данных. Туда и подключаются 8 серв своими сигнальными проводами.

Писанием в порты можно разве-что комп подвесить, спалить ничего нельзя.

По поводу кода - не знаю когда, щас досовское си еще найти надо...  :roll:

В общем задача простая: генерить импульсы заднной длины и повторять через заданное время. Тоесть ставим бит, ждем, сбрасываем, снова ждем. А вот сколько ждать - смотри в том файле. Помню только что повторяться должно с частотой 50 Гц. И так для каждого бита порта. Для удобства можно поднимать все биты одновременно, а сбрасывать уже как получится... Проще всего это сделать кручением счетчика. Скажем работает таймер, счетчик прибавляется. Для серв есть переменные с их значениями (положениями серв) если счетчик больше этого значения - сбрасываем бит. Счетчик заполнен - обнуляем. Второй счетчик считает общий период. Досчитал - обнуляем и запускаем оба, выставляем все байты снова.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 23 окт 2005, 10:47

Ага, будем пробовать, распайку уже нашел, с сервой тоже разобрался там от 0.9мс до 2.1 мс , частота 50 гц ,что кодирует полный поворот в лево и поворот в право.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение AlphA » 23 окт 2005, 11:16

А я вот так и не понял: что получится если на серву вообще ни каких имульсов не подавать?
Она воспримит это как импульс минимальной длины и уйдёт в нулевое положение ИЛИ останется в текущем положении вала???
Т.е. можно ли рулить сервой не постоянно, а по мере необходимости, так сказать, в "пакетном режиме"?
AlphA
 
Сообщения: 111
Зарегистрирован: 21 апр 2005, 01:19
Откуда: Екб

Сообщение -= Александр =- » 23 окт 2005, 11:36

А черт ее знает... Мне попадались и такие что держат положение, а были и такие которые взглючивали по-всякому... Пробовать надо...  :roll:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение Kanoka » 23 окт 2005, 14:20

А я вот так и не понял: что получится если на серву вообще ни каких имульсов не подавать?

Останется в том месте где была.
Kanoka
Модератор
 
Сообщения: 1274
Зарегистрирован: 11 ноя 2004, 03:18
Откуда: Москва

Сообщение KiCom » 23 окт 2005, 14:27

Но вот сохраняет ли она усилие, тоесть если ее положение измениться она наверно не вернется в исходное положение.
И еще, кто пишет на С++ под дос, может накидает простейшую програмку для управления одной сервой, без всякого интерфейса и прочего (см. выше), я  тоже попробую сам разобраться, но так на всякий случай.
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение =DeaD= » 23 окт 2005, 15:02

При отсутствии импульсов серва не пытается сохранять положение, потому как незнает какое положение сохранять ввиду отсутствия памяти как таковой :)

Во!
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Сообщение KiCom » 23 окт 2005, 19:33

Александр кажеться я допер как управлять LPT поравте если не прав.
Нужно послать значение 255 чтобы включить все канал в адресс оперативки с адресом 378 так ?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

Сообщение -= Александр =- » 23 окт 2005, 23:32

Да. Тебе только одни этот адрес и нужен. 255 - это единицы во всех каналах, начало импульса для всех серв. Если серва одна - отправляй единицу в тот разряд, к которому она подключена.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение KiCom » 24 окт 2005, 11:04

Прогу я буду писать под дос но в Win XP , блуждая по просторам интернета я обнаружил что XP не пускает в ту область оперативки так ли это , сам еще не пробовал. Что скажете по этому поводу?
KiCom
 
Сообщения: 345
Зарегистрирован: 22 окт 2005, 11:15
Откуда: Красноярск

След.

Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23