Управление сервами и моторами джойстиком Playstation

Calllok
Offline
Зарегистрирован: 19.07.2016

Появилась идея механизировать lego technics, но стандартные наборы жутко дорогие, а пульты ни о чем. Если взять ардуино и подключить джойстик от ps2 то можно ли будет подключить два простых моторчика 9v для управления гусеницами экскаватора и 6-8 сервоприводов для открытия/закрытия клапанов пневмосистемы? Либо придётся докупать ещё какие-то платы или контроллеры? Насколько сложно будет написать программу?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Выход Ардуино моторчик, даже самый маленький, не потянет.

Сложно ли написать программу?

Смотря какая программа и кто будет писать...

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Помимо ардуино еще потребуется драйвер двигателей (подбирается в зависимости от используемых двигателей). Сервы запитывайте отдельно от ардуино. Совет: сначала поэкспериментируйте с джойстиком, в библиотеке ps2x есть пример использования с выводом в монитор порта.

Calllok
Offline
Зарегистрирован: 19.07.2016

Сервоприводы отдельно это понятно, драйвер мотора есть компактный на 2 мотора? И вопрос именно в том хватит ли пинов ардуино нано чтоб подключить джойстик два движка и 6 сервоприводов?
Двигатели простые 9в

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Подключение серв - 6 выходов (ШИМ), джойстика - еще 6, драйвера типа L298N - еще 6 (2 из них ШИМ), итого 18. Выводов ШИМ вам не хватит. Как вариант, обратите на такую платку для серв. По двигателям: при выборе драйвера учитывают не только вольтаж, но и  ампераж.

Calllok
Offline
Зарегистрирован: 19.07.2016

Большое спасибо, щас более-менее понятно всё по железкам, как придёт посылок буду разбираться с программкой

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для серв ШИМ не нужен. Драйверу двигателя достаточно 4-х контактов. И вообще, я бы поостерегся слушать советы человека, который напряжение называет вольтажом, а силу тока - амперажом.

Calllok
Offline
Зарегистрирован: 19.07.2016

А если взять бесколлекторный двигатель с регулятором оборотов, то им можно управлять просто шим сигналом?

Calllok
Offline
Зарегистрирован: 19.07.2016

А как сервами можно управлять без шим?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Встречный вопрос: а как сервами можно управлять с ШИМ?

kasper007
Offline
Зарегистрирован: 23.05.2016

andriano пишет:

Для серв ШИМ не нужен.

Вот это новость, т.е. все что у меня работает - работать не должно, а библиотеку servo.h написали чтобы всех ввести в заблуждение.

А пост:

http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-...

вообще непонятно зачем опубликован

kasper007
Offline
Зарегистрирован: 23.05.2016

Calllok пишет:
Сервоприводы отдельно это понятно, драйвер мотора есть компактный на 2 мотора? И вопрос именно в том хватит ли пинов ардуино нано чтоб подключить джойстик два движка и 6 сервоприводов? Двигатели простые 9в

давно для ардуины изобрели I2C - PWM контроллеры. на ардуине используешь I2C (выводы SDL, SCA) и нагружаешь до 16 сервоприводов на один контроллер.

kasper007
Offline
Зарегистрирован: 23.05.2016

Calllok пишет:
А если взять бесколлекторный двигатель с регулятором оборотов, то им можно управлять просто шим сигналом?

выйдет чуть дороже, чем обычный двигатель, но зато действительно управляться будет просто ШИМ и его можно также повесить на I2C-PWM контроллер, т.е. на ардуине задействуется только два вывода, а в нагрузке будет 16 устройств

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kasper007 пишет:

andriano пишет:

Для серв ШИМ не нужен.

Вот это новость, т.е. все что у меня работает - работать не должно, а библиотеку servo.h написали чтобы всех ввести в заблуждение.

А пост:

http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-servo-posmotri-tut

вообще непонятно зачем опубликован

И где в этом посте упоминается ШИМ?

Я его внимательно прочитал. Второй раз перечитывать не стал - поручл поиск Файерфоксу, результат, первое упоминание ШИМ лишь в 17 посте темы. В 0-м посте темы о ШИМ нет ни слова.

Или, может, мы живем на разных плангетах и Интернеты у нас разные?

PS. По хорошему, ссылки надо давать не на форум, а на дэйташит сервы, т.к. на форуме (как и в среднем по Интернету) найти можно все что угодно.

PPS. А что именно у Вас работает, я, честно говоря, не знаю - хрустальный шар на профилактике.

PPPS. Не поленился и заглянул в исходноки библиотеки servo для avr. Так вот, ШИМ там не используется. Чудес не бывает.

kasper007
Offline
Зарегистрирован: 23.05.2016

Ладно, давайте зайдем с другой стороны. Расскажите мне пожалуйста, как происходит управление углом поворота однооборотного сервопривода. По моему глубокому убеждению угол поворота прямо-пропорционально связан с длительностью импульса подаваемого по каналу управления. Как правило длительность импульса находится в диапазоне от 800 до 1800 мкс. Т.е. передаваемое значение "кодируется" в ширине передаваемого импульса, при этом период следования импульсов постоянен. Поэтому этот метод передачи называется широтно-импульсной модуляцией. Вот именно так это уложено в моей голове и я был честно говоря обескуражен, когда увидел Ваш пост, что для управления сервой ШИМ не нужен (пост 6)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

kasper007, я бы назвал диапразон длительностей чуть пошире, но это не важно. Важно то, что для установки сервы в некоторое положение, ей нужен ОДИН импульс, ни о каком периоде следования речи нет.

Другое дело, что установленная в определенное положение серва далее предоставлена самой себе, и если мы захотим руками (или грузом) повернуть ее на какой-то другой угол, нам удастся это без каких либо проблем. Т.е. серва получила сигнал, повернулась и обо всем забыла.

Вот если мы хотим, чтобы серва "помнила" заданное положение (отслеживала его - при отклонениях возвращала обратно), нам надо время от времени напоминать ей. Например, периодически подавать на нее "напоминающие" импульсы. Собственно, именно это и сделано в библиотеке servo.

Ничего общего с ШИМ указанный алгоритм не имеет. Более того, сама идея существенно противоречит основной идее ШИМ - обеспечивать _фиксированную_ скважность, пропорциональную модулируемому сигналу. В случае управления сервой скважность нас вообще не интересует. И поддерживать ее не нужно. Нужно лишь выдерживать длительность управляющего импульса, период же следования импульсов может быть любым. В частности, "напоминающее" воздействие вообще может быть непериодическим.

Это первое соображение, почему не следует называть управляющий сигнал для сервы ШИМом - теоретическое.

Теперь рассмотрим практический аспект. Применительно конкретно к Ардуине.

Вспомним, с чего все началось. А началось с 4-го поста в этой теме, на который я, собственно, и отвечал.

Цитата:
Подключение серв - 6 выходов (ШИМ), джойстика - еще 6, драйвера типа L298N - еще 6 (2 из них ШИМ), итого 18. Выводов ШИМ вам не хватит.

Так вот, повторяю еще раз: ШИМ для серв не нужен. Соответственно, сервы можно подключать к любым ногам, в том числе и не поддерживающим ШИМ. Т.е. количество ног Ардуины, поддерживающих ШИМ, не является ограничением для данного проекта. Ну и заодно уж конкретный факт: Ардуиновский ШИМ в библиотеке servo не используется. Хотя, честно говоря, даже если бы и использовался в конкретной библиотеке, это бы не говорило о том, что ШИМ как-то связан с сервами (а не с конкретной реализацией конкретной библиотеки).

Calllok
Offline
Зарегистрирован: 19.07.2016

kasper007 пишет:

Calllok пишет:
А если взять бесколлекторный двигатель с регулятором оборотов, то им можно управлять просто шим сигналом?

выйдет чуть дороже, чем обычный двигатель, но зато действительно управляться будет просто ШИМ и его можно также повесить на I2C-PWM контроллер, т.е. на ардуине задействуется только два вывода, а в нагрузке будет 16 устройств


Тоесть регулятором оборотов можно управлять с того же контроллера что и сервоприводами?

kasper007
Offline
Зарегистрирован: 23.05.2016

[/quote] Тоесть регулятором оборотов можно управлять с того же контроллера что и сервоприводами?[/quote]

Совершенно верно. У меня получается управлять одновременно 3 бк моторами и одним сервоприводом. использую 4 порта на контроллере I2C-PWM, покупал на али:

http://ru.aliexpress.com/item/1pc-PCA9685-16-Channel-12-bit-PWM-Servo-motor-Driver-I2C-Module-For-Arduino-Robot-Worldwide/32614764717.html?detailNewVersion=

использует библиотеку: <Adafruit_PWMServoDriver.h>, очень хорошое есть описание в интернете, погуглите найдете.

Причем моторы у меня достаточно мощные, поэтому с контроллера I2C-PWM я беру лишь землю и управляющий сигнал, а + питания заведен непосредственно с АКБ.

Calllok
Offline
Зарегистрирован: 19.07.2016

Ну я как раз заказал её, нано, и сервоприводы, как придёт буду разбираться. Спасибо всем за помощь, думаю в следующий раз буду писать уже в програмировании если не разберусь.

kasper007
Offline
Зарегистрирован: 23.05.2016
#include <Wire.h>    //подключение библиотеки I2C
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define HZ 60  // частота следования импульсов управления 
#define ESCMIN 800  //нижний диапазон в мкс
#define ESCMAX 2300  //верхний диапазон в мкс
#define ESCZERO 1500 //калибровка нуля в мкс

unsigned int BITMIN, BITMAX, BITZERO // сюда рассчитаем границы диапазона управления

void setup()
{
BITMIN =  int(ESCMIN*HZ/244.14);
BITMAX =  int(ESCMAX*HZ/244.14);
BITZERO =  int(ESCZERO*HZ/244.14)
pwm.begin();
pwm.setPWMFreq(HZ);
pwm.setPWM(0, 0, BITZERO);
delay(2000);
}

void loop()
{
	for (uint16_t pulselen = BITZERO; pulselen < BITMAX; pulselen++) {
	pwm.setPWM(0, 0, pulselen);
	delay(50);
	}
	for (uint16_t pulselen = BITMAX; pulselen > BITZERO; pulselen--) {
	pwm.setPWM(0, 0, pulselen);
	delay(50);
	}
	delay(2000);
	for (uint16_t pulselen = BITZERO; pulselen > BITMIN; pulselen--) {
	pwm.setPWM(0, 0, pulselen);
	delay(50);
	}
	for (uint16_t pulselen = BITMIN; pulselen < BITZERO; pulselen++) {
	pwm.setPWM(0, 0, pulselen);
	delay(50);
	}
	delay(2000);
}

Вот пример для бк мотора посредством этой платы. Плавно увеличивает скорость вращения в одну сторону, затем в другую.

Для серво будет тоже самое, только убрать калибровку нуля, для сервы она не нужна  и точно выставить пределы.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Если Вы считаете джойстиком это http://www.parkflyer.ru/ru/blogs/view_entry/3131/ то я такой использую. Некоторые просто весь пульт ps2 джойстиком называют. Управляю сервой по одной оси и движком линейного привода по другой. Джойстик не понравился, по центру большая "мертвая" зона, зона регулировки маленькая. Ввод положения через analogRead(), среднее положение немножко корректирую, введеное значение линейно преобразую в величину от 0 до 10. Если вопросы  есть - пишите.

Calllok
Offline
Зарегистрирован: 19.07.2016

Нет, я как раз хочу именно весь пульт. Было бы интересно посмотреть пример скетча где показано что при поступлении сигнала от приёмника пульта сервами такая то поворачиваешься на столько то градусов, а при поступлении другого сигнала мотор начинает вращаться с такой то скоростью. А сигналы с приёмника если я правильно понял можно посмотреть через монитор порта и к ним уже привязать действия. И ещё хотелось бы чтоб серва поворачивалась медленно и потом уже по месту подбирать насколько медленно чтоб было удобно управлять потому что игрушкой рулить будет сын.

Logik
Offline
Зарегистрирован: 05.08.2014