SERVO - управление по i2c через ATmega8

Обсуждение и примеры готовых и самосборных компонент для построения роботов.

SERVO - управление по i2c через ATmega8

Сообщение Сергей » 24 апр 2008, 02:11

http://OpenServo.org - как переделать серву для индивидуального управления с обратной связью по i2c

Было создано много тем и много вопросов по поводу "А как управлять сервой?" или "А как сделать управление сервой на прерываниях?". Ну всё, положим этому конец! Написал программу на скорую руку, управление 7-ю сервами по TWI( i2c ) на прерываниях с использованием ATmega8. Сразу скажу, что можно сделать и больше серв, но эта программа для обучения. Кто захочет - сделает больше. Также приведен проект в Протеусе.

Пакет для управления сервами по i2c такой:
[ S | addr | A | num | A | angle | A | speed | A | P ], где
S - start состояние,
A - ACK(подтверждение),
num - номер сервы от 0 до 6,
angle - угол в который нужно поставить серву ( от 0 до 90 град , а центральное положение 45 град),
speed - скорость с которой следует повернуть серву ( от 1 до 255 ),
{ Внимание, скорость НЕ выражена в чем либо. Чтобы выставлять скорость в, к примеру, рад/сек, нужно производить расчеты. }
P - Стоп.

Пример пакета для протеуса( с помощью i2c-debugger):
S 04 A 0x05 A 0x10 A 0x0A A P, где выставляем серву под номером 5 на 16 градусов, со скоростью 10. (см. приложенную картинку)
Еще пример:
S 04 A 0x01 A 0x10 A 0x0A A 0x02 A 0x10 A 0x0A A 0x03 A 0x10 A 0x0A A 0x04 A 0x10 A 0x0A A P, где на выставили такиеже значения как и в предыдущем примере, только на сервы 1, 2, 3, 4. Таким образом, можно слать пакеты по 3 байта либо кратные трем..

Также можно отлаживать программу с помощью графика, см. рисунок.
Внимание, чтобы отсимулировать график - вам необходимо выставить галочки "Exclude from simulation" на каждой серве, иначе выдаст ошибку. Для обычного симулирования - галки нужно убрать.

ЗЫ:
Программу не успел еще откомментировать, потом сделаю.
Все вопросы по программе задавайте, отвечу.
Вложения
avr_servo_i2c_build_005.rar
(40.75 КиБ) Скачиваний: 453
servo_2.JPG
servo_1.JPG
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO как управлять по i2c - пример на ATmega8

Сообщение Master » 24 апр 2008, 09:26

Скачал :o
А где main.hex и чем компилить? И че так много файлов? А сервами рулить с ПК?
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: SERVO группа - управление по i2c через ATmega8

Сообщение Myp » 24 апр 2008, 09:45

если там есть мэйк файл
то можно сделать однозначный вывод в чём это компилить :)
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: SERVO группа - управление по i2c через ATmega8

Сообщение avr123.nm.ru » 24 апр 2008, 10:14

Вот откомпилил ( архив в прицепе ниже ) в WinAVR - viewtopic.php?f=2&t=3928

Включил в PROTEUS симуляцию по .COF - работает, но исходник Си не показывает при паузе симуляции. Симуляция по .HEX - тоже работает. В архиве оригинальный Мэйкфайл и новый.

Как настройть мэйкфайл WinAVR - http://avr123.nm.ru/04.htm

Master писал(а):А сервами рулить с ПК ?


C любого устройства которое выдает сигналы i2c - микроконтролер и ПК тоже подойдут.

Пример програмного i2c (может быть выведен на разные ножки чипа) для AVR в папке C:CVAVRexamplesTHERM75
Аппаратный i2c (только на определенных ногах МК) называется в AVR TWI и настраивается тоже мастером кода и библиотеки есть в хелпе CVAVR.

Сергей писал(а):angle - угол на который нужно повернуть серву ( от 0 до 90 )


Это точно угол НА который повернуть ? Или это угол в который поставить серву ?
Тогда 45 градусов середина - 1500 мкС ?

=======
и рисуночек симуляции перекомпановал
Изображение
Вложения
servo_7_i2c.rar
(73.89 КиБ) Скачиваний: 228
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: SERVO группа - управление по i2c через ATmega8

Сообщение Сергей » 24 апр 2008, 13:08

avr123.nm.ru писал(а):Это точно угол НА который повернуть ? Или это угол в который поставить серву ?
Тогда 45 градусов середина - 1500 мкС ?

Извиняюсь. Это угол В который поставить серву. К примеру: севра находилась в 45 град. Переслали ей пакет, и она, с принятой скоростью будет двигатся до заданного угла. :oops:

Управление Сервоприводом от PIC18F2455
http://www.instructables.com/id/Use-a-P ... bby-Servo/
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO - управление по i2c через ATmega8

Сообщение blindman » 23 май 2008, 15:04

Почему _twi_module_switch()вызывается только после отработки всех серв? Программа очень долго удерживает линию SCL -- отработка команды для одной сервы займет до 100 мс, жуткие тормоза на шине. Есть какие-то причины не вызывать _twi_module_switch()в цикле внутри main() ? Время отработки одной команды снизится до ~400 мкс
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: SERVO - управление по i2c через ATmega8

Сообщение Сергей » 24 май 2008, 13:44

Вызываеца после обработки серв в период 20мс. Я не наблюдал тормоза. У меня обработка занимала несколько мс. И причина не вызывать в main() - снизица эффективность управления сервами, тк здесь все управляеца одним таймером. Вообще странно что тормоза, где и как ты их заметил?
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO - управление по i2c через ATmega8

Сообщение blindman » 24 май 2008, 19:50

С чего она снизится? Обработчику прерываний таймера без разницы, что прерывать -- главный цикл или обработчик TWI. Если бы обработка TWI была сделана на прерываниях -- тогда да, прерывания от TWI вызывали бы джиттер.

На графиках прекрасно все видно. Первый -- оригинальный код, второй -- вызов _twi_module_switch() перенесен в главный цикл. Конечно, если этот контроллер -- единственное устройство на шине, и положение серв изменяется нечасто, тормоза могут быть и незаметны. А представь, что на шине висят еще несколько датчиков, плюс сервы должны одновременно выполнять какие-то сложные манипуляции -- тут тормоза и вылезут. Интересно, как ты померял эти несколько миллисекунд? "Несколько" просто не может быть, потому что слэйв хавает 1 байт с шины раз в 20 миллисекунд, а одна команда -- минимум 4 байта.

PS. Форум переставил картинки в обратном порядке
PPS. Сделал картинки поменьше

<V>: есть же кнопка [вставить в текст сообщения] - ставишь в нужном порядке, вот и все.
Вложения
proteus1.png
Первый
proteus1.png (5.67 КиБ) Просмотров: 37497
proteus2.png
Второй
proteus2.png (4.04 КиБ) Просмотров: 37461
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: SERVO - управление по i2c через ATmega8

Сообщение Сергей » 24 май 2008, 23:52

А, понял, спасибо. Код поправлю
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO - управление по i2c через ATmega8

Сообщение geonix » 14 июл 2008, 23:33

а в железе кто-нибудь пробовал это сделать? Что-то i2c не фурычит... Как я понял mega8 - slave reciever. Почему тогда в коде идет настройка скорости TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2 ?
geonix
 
Сообщения: 2
Зарегистрирован: 14 июл 2008, 21:27

Re: SERVO - управление по i2c через ATmega8

Сообщение Сергей » 15 июл 2008, 00:29

Я смотрел работу в протеусе, до железа не дошло пока, тк задача поменялась
А насчет скорости, а что должно быть вместо?
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO - управление по i2c через ATmega8

Сообщение geonix » 19 июл 2008, 11:47

Насколько я знаю, в слейве не должно быть настройки скорости - это дело мастера.
geonix
 
Сообщения: 2
Зарегистрирован: 14 июл 2008, 21:27

Re: SERVO - управление по i2c через ATmega8

Сообщение Сергей » 20 июл 2008, 20:20

Если модуль переключаеца в режим мастера то ему нужна эта настройка. Но ничего страшного не будет если в слейве это будет настроено.
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: SERVO - управление по i2c через ATmega8

Сообщение Gfer » 26 апр 2009, 14:05

А сами сервы I2C есть у кого? Там на проекте плата выложена, та она 4-х слойная! ЛУТ не пройдет. Пытаюсь вот на заводе сделать хотя бы платы.
Сон разума рождает чудовищ...
Аватара пользователя
Gfer
 
Сообщения: 169
Зарегистрирован: 25 апр 2009, 12:03
Откуда: Москва
прог. языки: С
ФИО: Клесник Станислав Владимирович

Re: SERVO - управление по i2c через ATmega8

Сообщение =DeaD= » 26 апр 2009, 14:25

OpenServo вроде на 2-слойке? Если вообще не на 1 стороне...
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

След.

Вернуться в Готовые модули

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

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