Raspberry Pi: Все вопросы по программированию на BASH и Cpp

214 views
Skip to first unread message

Максим Фиронов

unread,
Aug 26, 2013, 6:05:52 AM8/26/13
to robotc...@googlegroups.com
Подключил к Raspberry Pi драйвер для управления сервоприводами Pololu Mini Maestro на 24 порта.
Долго пришлось колдовать с инструкциями по управлению драйвером, но я его победил.
В качестве альтернативы при проверках работоспособности решил использовать простые скрипты BASH.
В итоге образовался вот такой список команд для одновременного управления тремя  сервоприводами:
#!/bin/bash

DEVICE
="/dev/ttyACM0"

N_TARGET
=$1 # Количество одновременно управляемых каналов. По умолчанию = 3 (21, 22, 23).
N_CHANNEL
=$2 # Номер первого канала в цепочке. По умолчанию = 21.
TARGET1
=$3 # Угол поворота плеча
TARGET2
=$4 # Угол поворота локтя
TARGET3
=$5 # Угол поворота кисти

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

# Пауза перед началом операций

sleep
2.0

# Поворот на нужный угол трех серв на разные углы

{
byte 0xAA                    #Start Byte
byte 0x0C                    #Device ID = 12
byte 0x1F                    #Command = Set Multiple Targets # Команда управления несколькими сервами
byte $N_TARGET               #0x02 #Number of targets = 2 # Количество управляемых каналов одновременно
byte $N_CHANNEL              #0x00 #First channel number = 0 # Номер первого канала в цепочке
byte $((TARGET1 & 0x7F))      #0x70 #First target low bits <- First SERVO
byte $((TARGET1 >> 7 & 0x7F)) #0x4E #First target high bits
byte $((TARGET2 & 0x7F))      #Second target low bits <- Second SERVO
byte $((TARGET2 >> 7 & 0x7F)) #Second target high bits
byte $((TARGET3 & 0x7F))      #Thread target low bits <- Second SERVO
byte $((TARGET3 >> 7 & 0x7F)) #Thread target high bits
} > $DEVICE

# Пауза перед завершением операций

sleep
2.0

Так как я постепенно начинаю осваивать язык Cpp под Linux Debian, то возник вопрос.
Как переделать этот пример кода под язык Cpp?

Олег Евсегнеев

unread,
Aug 26, 2013, 6:17:55 AM8/26/13
to robotc...@googlegroups.com
Максим, приветствую!

Про CPP не скажу, пробовал работать на разбери только с питоном. У меня есть небольшой python-модуль для управления 6-канальным maestro, прикладываю во вложение.

Простейший python-скрипт для поворота серв будет выглядеть так:

sctrl = Servo( com='/dev/ttyACM0' )
sctrl.setpos(0,45)
sctrl.setpos(1,45)

Думаю класс, описанный в модуле можно легко портировать на CPP.

Маестру я использовал для вот такого проекта:



26 августа 2013 г., 16:05 пользователь Максим Фиронов <sltso...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу robotclassru.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес robotclassru...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.



--
С уважением,
Евсегнеев Олег Анатольевич
servo.py

Максим Фиронов

unread,
Aug 26, 2013, 10:48:56 AM8/26/13
to robotc...@googlegroups.com
Спасибо за ответ и модуль.
Пытаюсь разобраться с СPP, т.к. основная работа будет в нём.
Ваш пример кода посмотрел, в нём используется простое управление одним приводом.
В обшем, открывать, закрывать и отправлять данные в порт на CPP постараюсь сегодня проверить. Результаты сообщу.
Мне пока требуется одновременное управление сразу одной ноги (три привода) с разными углами поворота каждого из приводов.
Это - математика с элементами геометрии (инверсная кинематика). Все формулы и методы их получения уже собрал в единую конструкцию на CPP.
Теперь осталось тупо вычислить углы поворота, открыть порт, отправить в него комбинацию полярных координат по каждому из углов и закрыть порт.

Дополнительно пишу отчёт по всем проводимым операциям, от макета до программы.
Если всё пройдёт гладко, то скорее всего буду размещать ролики на youtube и кидать сюда сылки )))

Заодно хочу узнать, какой вес сможет мой агрегат поднимать и передвигать.
Использую приводы MG995. На каждую ногу - 3 штуки. Всего 8 ног (типа паука). Вес собранной платформы (ноги с сервами, верх и низ корпуса, пара динамиков) составляет 2600 грамм. Дополнительно Raspberry Pi + USB-hub + web-cam = 200 грамм. Аккумулятор на 6V 12A почти 900 грамм. Сколько ещё смогу поднять и перенести на этих сервах?
Все соединения в ноге (вертикаль - локоть и кисть) сделаны из дюралюминия.

понедельник, 26 августа 2013 г., 14:05:52 UTC+4 пользователь Максим Фиронов написал:

Олег Евсегнеев

unread,
Aug 26, 2013, 2:24:35 PM8/26/13
to robotc...@googlegroups.com
Максим, в методе setpos, первым аргументом идет номер сервы. В примере две сервы устанавливаются в +45 градусов. То есть ты легко можешь давать команды всем 24-м сервам. 

Про подробный мануал это правильно! Мы на своих ресурсах кинем ссылку на тебя обязательно.

Насчет веса. Будет сильно зависеть от алгоритма движения, от того, сколько опор будет в один момент времени. Но явно твой робот не будет бодрым. Я бы на твоем месте подумал как немного облегчить животное. Даже если оно будет нормально ходить, батарея будет жраться, будь здоров. Может быть как раз батарею поменьше? Это у тебя LiPo на 12000mAh? Какой запас хода планируешь, в минутах?

 


26 августа 2013 г., 20:48 пользователь Максим Фиронов <sltso...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу robotclassru.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес robotclassru...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

Максим Фиронов

unread,
Aug 26, 2013, 10:43:08 PM8/26/13
to robotc...@googlegroups.com
Батарея у меня кислотно-свинцовая, от того и такой её вес. Литиевые - пока дорогое удовольствие, хотя и гораздо легче, но и немного сложнее в использовании, т.к. нужно постоянно следить за ёмкостью и напряжением. Литиевые батареи бояться глубокого разряда. Может подскажите, есть какие-нибудь микросхемы для отслеживания ёмкости и напряжения батареи с подключением по протоколу i2c? Установка такой микросхемы - это у меня в планах.
Про запас хода даже ещё не думал (планирую 30 минут, а там как получится), но когда моё животное просто стоит на 4-х ногах, то потребление переменное и в пике составляет 2,5А, и это с дополнительной нагрузкой в 1,2 кг (аккум 900 гр + платформа 2600 гр). На всех ногах пока не стоит, т.к. мне ещё надо механику подправлять. Но
В Вашем примере единовременно можно работать только с одним приводом.

sctrl.setpos(0,45) - нулевая серва
sctrl.setpos(1,45) - первая серва

а у Pololu есть ещё мультиканальный режим и можно за один такт выполнить движение сразу несколькими приводами. В моем примере это реализовано.

Если использовать движение 4х4 и если учитывать задержку по перемещению одного привода в 0,3 сек на 60 град и мультиканал, то движение каждой ноги на 60 градусов, то выходит такой расчёт скорости (пока приблизительный):

В ноге три привода. Примем за нужный поворот всей ноги за 60 градусов. Требуется выполнить три команды - поднять ногу, переместить, опустить и сдвинуть платформу. Если судить по Вашему коду, то получится три команды или 0,9 секунд на перемещение всей ноги. В мультиканальном режиме мы можем все эти три команды уложить в те же 0,3 секунды (если судить по самому максимальному углу поворота из трёх приводов или если 1-й поворачивает на 30 гр, второй на 20 гр, третий на 60 гр, то берём в расчёт именно 60 гр) используя простую инверсную кинематику для нахождения угла поворота каждого привода для достижения заданных координат нужной точки. Примем длину пути, совершаемого одной ногой за 15 см. Тогда одной командой мультиканала сразу перемещаем все 4 ноги на расстояние 15 см. Следующая команда будет поднимать, перемещать и опускать другие 4 ноги и одновременно двигать платформу в нужном направлении. Может понадобиться третья команда, но это уже надо экспериментировать.

Итого у нас должно получиться так. Продвижение на 15 см за два-три такта или за 0,6-0,9 секунд. Конечная скорость будет 1000 - 1500 см в минуту.

PS: Из-за начала основной работы и завершения отпуска, в будни пишу управление, а по выходным - мастерю.

понедельник, 26 августа 2013 г., 22:24:35 UTC+4 пользователь Олег Евсегнеев написал:
Максим, в методе setpos, первым аргументом идет номер сервы. В примере две сервы устанавливаются в +45 градусов. То есть ты легко можешь давать команды всем 24-м сервам. 

Про подробный мануал это правильно! Мы на своих ресурсах кинем ссылку на тебя обязательно.

Насчет веса. Будет сильно зависеть от алгоритма движения, от того, сколько опор будет в один момент времени. Но явно твой робот не будет бодрым. Я бы на твоем месте подумал как немного облегчить животное. Даже если оно будет нормально ходить, батарея будет жраться, будь здоров. Может быть как раз батарею поменьше? Это у тебя LiPo на 12000mAh? Какой запас хода планируешь, в минутах?

 
26 августа 2013 г., 20:48 пользователь Максим Фиронов <sltso...@gmail.com> написал:
Спасибо за ответ и модуль.
Пытаюсь разобраться с СPP, т.к. основная работа будет в нём.
Ваш пример кода посмотрел, в нём используется простое управление одним приводом.
В обшем, открывать, закрывать и отправлять данные в порт на CPP постараюсь сегодня проверить. Результаты сообщу.
Мне пока требуется одновременное управление сразу одной ноги (три привода) с разными углами поворота каждого из приводов.
Это - математика с элементами геометрии (инверсная кинематика). Все формулы и методы их получения уже собрал в единую конструкцию на CPP.
Теперь осталось тупо вычислить углы поворота, открыть порт, отправить в него комбинацию полярных координат по каждому из углов и закрыть порт.

Дополнительно пишу отчёт по всем проводимым операциям, от макета до программы.
Если всё пройдёт гладко, то скорее всего буду размещать ролики на youtube и кидать сюда ссылки )))

Максим Фиронов

unread,
Aug 26, 2013, 11:35:54 PM8/26/13
to robotc...@googlegroups.com
Подскажите, где можно почитать про организацию движения октоподов?
Интересует порядок перебора ног для устойчивого перемещения тела в пространстве.

И ещё, собираю кронштейн для поворота web-камеры в трёх проекциях координат на двух приводах. Вес будет около 500 грамм, но скорее всего гораздо меньше. Планирую поставить на два Tower Pro SG90.

Ilya Nemihin

unread,
Aug 27, 2013, 3:06:53 AM8/27/13
to robotc...@googlegroups.com
Вот здесь можно посмотреть набор открытого материала:

94 статей по слову "hexapod"

Кстати, есть кикстарт проект большого ходячего робота, способного перевозить двух человек:

набрали $97k в том году.

Вот статус их апдейтов:

Нога:


2013/8/27 Максим Фиронов <slt-...@narod.ru>
Подскажите, где можно почитать про организацию движения октоподов?
Интересует порядок перебора ног для устойчивого перемещения тела в пространстве.

И ещё, собираю кронштейн для поворота web-камеры в трёх проекциях координат на двух приводах. Вес будет около 500 грамм, но скорее всего гораздо меньше. Планирую поставить на два Tower Pro SG90.

--

Ilya Nemihin

unread,
Aug 27, 2013, 3:21:15 AM8/27/13
to robotc...@googlegroups.com
Вот кстати уже есть и большие ходячие:



2013/8/27 Максим Фиронов <slt-...@narod.ru>
Подскажите, где можно почитать про организацию движения октоподов?
Интересует порядок перебора ног для устойчивого перемещения тела в пространстве.

И ещё, собираю кронштейн для поворота web-камеры в трёх проекциях координат на двух приводах. Вес будет около 500 грамм, но скорее всего гораздо меньше. Планирую поставить на два Tower Pro SG90.

--

Олег Евсегнеев

unread,
Aug 27, 2013, 4:19:13 AM8/27/13
to robotc...@googlegroups.com
Понял насчет одной сервы, я действительно не то имел ввиду :) Надо будет мне тоже модуль дописать для передачи команд сразу нескольким сервам.

На самом деле, я сейчас больше склоняюсь к тому, чтобы сделать драйверы серв на базе обычной ардуины (Shrimp). Это выйдет дешевле. Примерно рублей 200 для 6 аппаратных ШИМ. А в случае софтверного, вообще штук 15.
Соединить её с разбери можно хоть по UART хоть по i2c. Pololu цены гнут :(

Насчет аккума, погляди hobbyking.com, я там беру LiPo. Напряжение можно через обычный делитель подать на аналоговый вход и следить за ним из управляющей программы. Конечно у разбери нет АЦП, но можно легко использовать MCP3008 или опять же ардуину. 


27 августа 2013 г., 13:21 пользователь Ilya Nemihin <nem...@gmail.com> написал:

Максим Фиронов

unread,
Aug 27, 2013, 4:55:40 AM8/27/13
to robotc...@googlegroups.com

А подскажите, есть принципиальные схемы для слежения за напряжением по i2c?
Пока нашел только одну микросхему, но у неё макс напряжение 6,5 вольт (ADC121C021CIMK) в корпусе TSOT-6.
Хотелось бы проводить измерения при напряжении до 25 вольт, так сказать - более универсальный вариант.




вторник, 27 августа 2013 г., 12:19:13 UTC+4 пользователь Олег Евсегнеев написал:
battery.jpg

Олег Евсегнеев

unread,
Aug 27, 2013, 5:03:47 AM8/27/13
to robotc...@googlegroups.com
Ничего не приходит в голову пока :( задал вопрос знакомому электронщику.


27 августа 2013 г., 14:55 пользователь Максим Фиронов <sltso...@gmail.com> написал:

Олег Евсегнеев

unread,
Aug 27, 2013, 5:34:04 AM8/27/13
to robotc...@googlegroups.com
В общем, знающие люди говорят ровно то же что и я. Используй АЦП и делитель:) Это проще всего. И дешевле.


27 августа 2013 г., 15:03 пользователь Олег Евсегнеев <oleg.ev...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages