Добрый день. Приобрел контроллер Pololu Mini Maestro на 24-канала с подключением по USB. Для управления использую Debian (Linux). Установил ПО со страницы http://www.pololu.com/docs/0J40/3.b Прочитал и сделал как в файле readme. --- Подскажите, где можно почитать про управление этим контроллером? Интересует управление из командной строки с возможностью передачи и приёма данных, что бы читать состояние каждого привода. Так же должна быть возможность запуска уже готовых скриптов. Всё это мне нужно для разработки внешней программы для управления приводами через интернет.
После этого начинаю экспериментировать Сначала запустил ./UscCmd ез параметров
Скрытый текст
root@raspberrypi:~/maestro_linux# ./UscCmd UscCmd, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null Select one of the following actions: --list list available devices --configure FILE load configuration file into device --getconf FILE read device settings and write configuration file --restoredefaults restore factory settings --program FILE compile and load bytecode program --status display complete device status --bootloader put device into bootloader (firmware upgrade) mode --stop stops the script running on the device --start starts the script running on the device --restart restarts the script at the beginning --step runs a single instruction of the script --sub NUM calls subroutine n (can be hex or decimal) --sub NUM,PARAMETER calls subroutine n with a parameter (hex or decimal) placed on the stack --servo NUM,TARGET sets the target of servo NUM in units of 1/4 microsecond --speed NUM,SPEED sets the speed limit of servo NUM --accel NUM,ACCEL sets the acceleration of servo NUM to a value 0-255 Select which device to perform the action on (optional): --device 00001430 (optional) select device #00001430
Затем с параметром ./UscCmd --servo 0,1
Скрытый текст
На экране: Setting target of servo 0 to 1...
В реале: Серва сделала полные 120 градусов и стала удерживать положение (при повороте вручную - включается серва в обратную сторону). Для отключения использую команду ./UscCmd --servo 0,0
А теперь не могу понять, почему серва сделала полный оборот?
Ещё пробовал управлять через bash
Скрытый текст
#!/bin/bash # Sends a Set Target command to a Pololu Maestro servo controller # 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 byte() { printf "\\x$(printf "%x" $1)" } { byte 0x84 byte $CHANNEL byte $((TARGET & 0x7F)) byte $((TARGET >> 7 & 0x7F)) } > $DEVICE
Здесь вообще никаких действий с сервой не происходило ...
Прошу помощи! Что делаю не так?
Мне надо регулировать номером порта, углом поворота и скоростью.
И ещё. Если брать протокол Polulu, то где прочитать про значения каждого поля? 0хАА - это стартовый байт выбора протокола 0x0D - это выбор номера устройства или номер порта с сервой (в данном случае 13)? а вот что означают другие?
Что означают и какие бывают команды вроде немного разобрался на http://www.pololu.com/docs/0J44/6.2.1 Но, осталась одна проблема, с которой не могу справиться - каким образом произвести отправку в порт требуемую строку байт на Linux.
В общем вопрос постепенно отпадает .... Если вдруг кому-то понадобится 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. Управляются командой:
Вроде бы всё нормально работает, но появилась небольшая проблема, которую решить не получается. Использую контроллер на 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 - пока не знаю. Не поделитесь примером?
Сергей Скляров пишет: Что то я не понял вы их руками что ли записываете?
Ну как руками? Подключен контроллер по usb к ПК под линуксом (/dev/ttyACM0). Прога на С++. Сначала идёт установка в среднее положение всех приводов, а затем через пересчёт углов подаются команды пока сразу на все приводы и там, где угол изменился - производится поворот привода. Временная оценка - по снятым видео кадрам (надо было начальству показать). У приводов 0,16 сек / 60 гр.
Максим Фиронов пишет: Подключен контроллер по usb к ПК под линуксом (/dev/ttyACM0). Прога на С++.
Так кто считает по 6-8 секунд?
В смысле? Я не считаю по 6-8 секунд. Время привел для примера. Я говорю что скорость одного привода 0,16с/60гр. Исходя из этого, при одновременной работе трёх приводов, все приводы на ту же операцию будут тратить 0,16 сек (примерно). Так и получается, но задача ставилась на мультиуправлении не одной линией приводов (порты 0,1,2,3,4,5), а несколькими линиями с промежутком между ними (порты 0,1 и 4,5). Если бы такое было возможным, то повысилась бы скорость обработки конечных автоматов (приводов).