+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
нам уже 10 лет!

Форум

Страницы: 1 2 След.
Подключение Pololu Mini Maestro
 
Добрый день.
Приобрел контроллер Pololu Mini Maestro на 24-канала с подключением по USB.
Для управления использую Debian (Linux).
Установил ПО со страницы http://www.pololu.com/docs/0J40/3.b
Прочитал и сделал как в файле readme.
---
Подскажите, где можно почитать про управление этим контроллером?
Интересует управление из командной строки с возможностью передачи и приёма данных, что бы читать состояние каждого привода.
Так же должна быть возможность запуска уже готовых скриптов.
Всё это мне нужно для разработки внешней программы для управления приводами через интернет.
 
Цитата
Максим Фиронов пишет:
Подскажите, где можно почитать про управление этим контроллером?
ТУТ
Цитата
Максим Фиронов пишет:
что бы читать состояние каждого привода
Обратные связи здесь не поддерживаются.
Цитата
Максим Фиронов пишет:
нужно для разработки внешней программы для управления приводами через интернет.
Можно по-другому - подключить к Pololu Mini Maestro ЭТО и сделать пару настроек.
Главное читайте мануалы.
 
Мануал почитал, но при попытке воспроизведения любых скриптов - тишина.
 
Что я делаю:
Сначала установил
Скрытый текст
Затем скопировал 99-pololu.rules в /etc/udev/rules.d/

Далее, все файлы из архива скопировал в папку /root/maestro_linux

Скрытый текст
После этого начинаю экспериментировать
Сначала запустил ./UscCmd ез параметров
Скрытый текст

Затем с параметром ./UscCmd --servo 0,1
Скрытый текст
А теперь не могу понять, почему серва сделала полный оборот?

Ещё пробовал управлять через bash
Скрытый текст
Здесь вообще никаких действий с сервой не происходило ...

Прошу помощи!
Что делаю не так?

Мне надо регулировать номером порта, углом поворота и скоростью.
 
Цитата
Максим Фиронов пишет:
Ещё пробовал управлять через bash
Не используйте Compact protocol. Делайте через Pololu protocol, например: 0xAA, 0x0C, 0x04, 0x02, 0x70, 0x2E. Скважность ШИМ канала умножаем на 4 и отдаем маэстре, примерные рамки 2048 - 10000.
 
Прочитал ветку: http://www.pololu.com/docs/0J44/6.2
Но немного не понял как именно отправлять данные?

Использовать такую структуру?

Код
DEVICE=$1 
CHANNEL=$2 
TARGET=$3 
byte() { 
printf \\\x$(printf \%x\ $1)\ 
} 
{ 
byte $(0xAA & 0x0D & 0x05 & 0x00 & 0x64)
} > $DEVICE
И ещё. Если брать протокол Polulu, то где прочитать про значения каждого поля?
0хАА - это стартовый байт выбора протокола
0x0D - это выбор номера устройства или номер порта с сервой (в данном случае 13)?
а вот что означают другие?

Hex notation: 0xAA, 0x0D, 0x05,0x00,0x64
Decimal notation:170,13,5,0,100
Изменено: Максим Фиронов - 04.06.2013 11:05:45
 
Что означают и какие бывают команды вроде немного разобрался на http://www.pololu.com/docs/0J44/6.2.1
Но, осталась одна проблема, с которой не могу справиться - каким образом произвести отправку в порт требуемую строку байт на Linux.
 
Вся информация есть в том мануале, а вот с линуксом помочь не могу, не знаток :oops: .
 
В общем вопрос постепенно отпадает ....
Если вдруг кому-то понадобится bash-скрипт подключения, то вот он:

Код
# via its virtual serial port.
# Usage: maestro-set-target.sh DEVICE CHANNEL TARGET
# Linux example: bash maestro-set-target.sh /dev/ttyACM0 0 6000
# Mac OS X example: bash maestro-set-target.sh /dev/cu.usbmodem00234567 0 6000
# Windows example: bash maestro-set-target.sh '\\.\USBSER000' 0 6000
# Windows example: bash maestro-set-target.sh '\\.\COM6' 0 6000
# CHANNEL is the channel number
# TARGET is the target in units of quarter microseconds.
# The Maestro must be configured to be in USB Dual Port mode.
DEVICE=$1
CHANNEL=$2
TARGET=$3

printf ""

byte() {
printf "\\x$(printf "%x" $1)"
}

# Поворот на нужный угол
{
byte 0xAA     #Start Byte
byte 0x0C     #Device ID = 12
byte 0x84     #Command = Set Target
byte $CHANNEL #Channel = 0
byte $((TARGET & 0x7F))
byte $((TARGET >> 7 & 0x7F))
} > $DEVICE
 
Запускать так:
Код
bash maestro-set-target.sh /dev/ttyACM0 0 6000 
А вот третий параметр 6000 зависит от прошивки самого контроллера. Это значение и диапазон поворотов (от ... и до ...) корректируются в программе Pololu Maesro Control Ctnter и там же прошивается в память контроллера.
Я так себе расширил диапазон до 180 градусов с малым отпуском на концах, а то серва упирается в ограничитель и начинают потихоньку стираться шестеренки.
 
Теперь у меня другой вопрос.
Как можно синхронизировать несколько портов в один?
Допустим, две сервы подключены к 0 и 1 каналу на Pololu.
Управляются командой:
Код
{
byte 0xAA     #Start Byte
byte 0x0C     #Device ID = 12
byte 0x84     #Command = Set Target
byte 0x00     #Channel = 0
byte $((TARGET & 0x7F))
byte $((TARGET >> 7 & 0x7F))

sleep 0.3

byte 0xAA     #Start Byte
byte 0x0C     #Device ID = 12
byte 0x84     #Command = Set Target
byte 0x01     #Channel = 1
byte $((TARGET & 0x7F))
byte $((TARGET >> 7 & 0x7F))
 } > $DEVICE 
Как мне эти действия превратить в одно?
Что бы было что-то вроде этого:
Код
{
byte 0xAA     #Start Byte
byte 0x0C     #Device ID = 12
byte 0x84     #Command = Set Target
byte 0x00     #Channel = 0      <--- Как здесь выставить и 0 и 1 канал одновременно?
byte $((TARGET & 0x7F))
byte $((TARGET >> 7 & 0x7F))
 } > $DEVICE  
 
Цитата
Максим Фиронов пишет:
Как мне эти действия превратить в одно?
Set Multiple Targets подробности в мануале.

0xAA #Start Byte
0x0C #Device ID = 12
0x1F #Command = Set Multiple Targets
0x02 #Number of targets = 2
0x00 #First channel number = 0
0x00 #First target low bits
0x00 #First target high bits
0x70 #Second target low bits
0x2E #Second target high bits
........
 
Но ведь в Set Multiple Targets указано. что использовать на одном канале ( 0x00 #First channel number = 0 ), а мне надо на нескольких.
 
Цитата
Максим Фиронов пишет:
Но ведь в Set Multiple Targets указано. что использовать на одном канале
First channel number указывает на первый канал, а Number of targets на их количество после указанного.

Предыдущий пример выставлял значения для сервоприводов 0 и 1. Это позволяет запускать сервоприводы синхронно.
 
Делаю вот так:

# В одну сторону
{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x02 #Number of targets = 2
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits
byte 0x00 #First target high bits
byte 0x70 #Second target low bits
byte 0x4E #Second target high bits
} > $DEVICE

sleep 2

# В другую сторону
{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x02 #Number of targets = 2
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits
byte 0x00 #First target high bits
byte 0x00 #Second target low bits
byte 0x04 #Second target high bits
} > $DEVICE

Всё работает, но, отработка происходит только на одном канале, в данном случае - на первом (0x01)
Второй канал молчит и не пытается что-либо сделать.
 
Вы задали позицию только для одного канала.
Попробуйте так:

# В одну сторону
{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x02 #Number of targets = 2
byte 0x00 #First channel number = 0
byte 0x70 #First target low bits <- First SERVO
byte 0x4E #First target high bits
byte 0x70 #Second target low bits <- Second SERVO
byte 0x4E #Second target high bits
} > $DEVICE

sleep 2

# В другую сторону
{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x02 #Number of targets = 2
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits <- First SERVO
byte 0x04 #First target high bits
byte 0x00 #Second target low bits <- Second SERVO
byte 0x04 #Second target high bits
} > $DEVICE

Должны крутиться одинаково.
 
Спасибо, получилось.
А для трёх делать так?

{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x03 #Number of targets = 3
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits <- First SERVO
byte 0x04 #First target high bits
byte 0x00 #Second target low bits <- Second SERVO
byte 0x04 #Second target high bits
byte 0x00 #Thread target low bits <- Thread SERVO
byte 0x04 #Thread target high bits
} > $DEVICE

И далее в такой же последовательности?
Изменено: Максим Фиронов - 11.06.2013 00:12:54
 
Да!
 
Вроде бы всё нормально работает, но появилась небольшая проблема, которую решить не получается.
Использую контроллер на 24 порта.
Приводы подключены по такой схеме:
- первая конечность - приводы A, B и C. Подключены к портам контроллера 00, 01 и 02.
- вторая конечность - приводы A, B и C. Подключены к портам контроллера 03, 04 и 05.
и т.п.
При обращении к любому приводу, используется аббревиатура 01A (первая конечность - первый привод), 02С (вторая конечность - третий привод) и так далее.
======
Одновременным управлением одной любой конечностью у меня получилось по схеме выше этого поста.
А теперь вопрос.
Каким образом можно выставить одновременное управление, допустим, двумя приводами, расположенными не на одной прямой?
Например, мне нужно одновременно включить приводы 01B и 02A (порты контроллера 01 и 03).
Или так не получится в принципе из-за конструкции самого контроллера?
=====
А может проще пойти немного другим путём (программным?).
Соорудить скрипт одновременного управления всеми приводами (а их 24 штуки) с их переменными, в которых хранятся данные об угле поворота каждого привода, и меняя угол на нужных приводах, запускать этот скрипт? Получится что-то в виде программно-математической модели управления положением робота в пространстве.
 
Цитата
Максим Фиронов пишет:
Например, мне нужно одновременно включить приводы 01B и 02A (порты контроллера 01 и 03).
Или так не получится в принципе из-за конструкции самого контроллера?
Не получится. Не понимаю что вам мешает подавать команды по очереди? Скорость реакции совсем не страдает.
Цитата
Максим Фиронов пишет:
Соорудить скрипт одновременного управления всеми приводами
Первая программа у меня так и работала, но пришел к выводу что подавать на UART проще, скрипт маэстры очень неудобный.
 
Цитата
Сергей Скляров пишет:
Не получится. Не понимаю что вам мешает подавать команды по очереди? Скорость реакции совсем не страдает.
По очереди - как раз страдает скорость. Последовательный перебор всех восьми частей по три привода в каждой части, по времени уходит от 6 до 8 секунд. А если будет одновременно, тогда перебор длится от 1,5 до 3 секунд. И ещё, если передавать по очереди, то в движении появятся пробелы, т.е. движение станет менее плавным.
Цитата
Сергей Скляров пишет:
Первая программа у меня так и работала, но пришел к выводу что подавать на UART проще, скрипт маэстры очень неудобный.
Подаю команды прямо по USB примерно так:

{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x03 #Number of targets = 3
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits <- First SERVO
byte 0x04 #First target high bits
byte 0x00 #Second target low bits <- Second SERVO
byte 0x04 #Second target high bits
byte 0x00 #Thread target low bits <- Thread SERVO
byte 0x04 #Thread target high bits
} > $DEVICE

Но здесь три привода, а я переделал под 24 привода и вынес весь скрипт в отдельный bash, который вызывается с нужными параметрами (углами поворота) для каждого из приводов через изменяемые переменные. Строка получилась немного длинной. Как использовать UART - пока не знаю. Не поделитесь примером?
 
Цитата
Максим Фиронов пишет:
Последовательный перебор всех восьми частей по три привода в каждой части, по времени уходит от 6 до 8 секунд.
Что то я не понял вы их руками что ли записываете?
Цитата
Максим Фиронов пишет:
Как использовать UART - пока не знаю. Не поделитесь примером?
Я же не знаю к чему вы его подключите, если с компа под виндой то как стандартный COM порт. Если через контроллер то там два проводка TX RX.
 
Цитата
Сергей Скляров пишет:
Что то я не понял вы их руками что ли записываете?
Ну как руками? Подключен контроллер по usb к ПК под линуксом (/dev/ttyACM0). Прога на С++. Сначала идёт установка в среднее положение всех приводов, а затем через пересчёт углов подаются команды пока сразу на все приводы и там, где угол изменился - производится поворот привода. Временная оценка - по снятым видео кадрам (надо было начальству показать). У приводов 0,16 сек / 60 гр.
Изменено: Максим Фиронов - 12.09.2013 06:41:42
 
Цитата
Максим Фиронов пишет:
Подключен контроллер по usb к ПК под линуксом (/dev/ttyACM0). Прога на С++.
Так кто считает по 6-8 секунд?
 
Цитата
Сергей Скляров пишет:
Цитата
Максим Фиронов пишет:
Подключен контроллер по usb к ПК под линуксом (/dev/ttyACM0). Прога на С++.
Так кто считает по 6-8 секунд?
В смысле?
Я не считаю по 6-8 секунд. Время привел для примера. Я говорю что скорость одного привода 0,16с/60гр. Исходя из этого, при одновременной работе трёх приводов, все приводы на ту же операцию будут тратить 0,16 сек (примерно). Так и получается, но задача ставилась на мультиуправлении не одной линией приводов (порты 0,1,2,3,4,5), а несколькими линиями с промежутком между ними (порты 0,1 и 4,5). Если бы такое было возможным, то повысилась бы скорость обработки конечных автоматов (приводов).
 
Цитата
Максим Фиронов пишет:
Если бы такое было возможным, то повысилась бы скорость обработки конечных автоматов (приводов).
Вы об этом что ли:

{
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x03 #Number of targets = 2
byte 0x00 #First channel number = 0
byte 0x00 #First target low bits <- SERVO №0
byte 0x04 #First target high bits
byte 0x00 #Second target low bits <- SERVO №1
byte 0x04 #Second target high bits
byte 0xAA #Start Byte
byte 0x0C #Device ID = 12
byte 0x1F #Command = Set Multiple Targets
byte 0x03 #Number of targets = 2
byte 0x00 #First channel number = 4
byte 0x00 #First target low bits <- SERVO №4
byte 0x04 #First target high bits
byte 0x00 #Second target low bits <- SERVO №5
byte 0x04 #Second target high bits
} > $DEVICE
Страницы: 1 2 След.
Читают тему (гостей: 1)