roboforum.ru

Технический форум по робототехнике.

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

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

Master » 24 апр 2008, 09:26

Скачал :o
А где main.hex и чем компилить? И че так много файлов? А сервами рулить с ПК?

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

Myp » 24 апр 2008, 09:45

если там есть мэйк файл
то можно сделать однозначный вывод в чём это компилить :)

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

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/

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

blindman » 23 май 2008, 15:04

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

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

Сергей » 24 май 2008, 13:44

Вызываеца после обработки серв в период 20мс. Я не наблюдал тормоза. У меня обработка занимала несколько мс. И причина не вызывать в main() - снизица эффективность управления сервами, тк здесь все управляеца одним таймером. Вообще странно что тормоза, где и как ты их заметил?

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 КиБ) Просмотров: 37449
proteus2.png
Второй
proteus2.png (4.04 КиБ) Просмотров: 37413

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

Сергей » 24 май 2008, 23:52

А, понял, спасибо. Код поправлю

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

geonix » 14 июл 2008, 23:33

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

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

Сергей » 15 июл 2008, 00:29

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

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

geonix » 19 июл 2008, 11:47

Насколько я знаю, в слейве не должно быть настройки скорости - это дело мастера.

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

Сергей » 20 июл 2008, 20:20

Если модуль переключаеца в режим мастера то ему нужна эта настройка. Но ничего страшного не будет если в слейве это будет настроено.

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

Gfer » 26 апр 2009, 14:05

А сами сервы I2C есть у кого? Там на проекте плата выложена, та она 4-х слойная! ЛУТ не пройдет. Пытаюсь вот на заводе сделать хотя бы платы.

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

=DeaD= » 26 апр 2009, 14:25

OpenServo вроде на 2-слойке? Если вообще не на 1 стороне...


Rambler\'s Top100 Mail.ru counter