roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 май 2025, 23:20

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 16 апр 2008, 23:07 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Вообщем написал программку для работы сервы, но только так, что серва двигается только в одну сторону, а когда нажимаю сброс, то резко в другую.
Вот сама прога подскажите, что нужно сделать:
Код:
#include <avr/io.h>
#include <avr/delay.h>
#define OUT PORTC
#define servo PC1
#define K_DELAY_ms   F_CPU/600
void Delay_ms(unsigned char t) {
  if (t==0) return;
  unsigned int i;
  while (t--) for(i=0;i<K_DELAY_ms; i++);
}
int main(void)
{
PORTC=0x02;
DDRC=0xFD;
while (1){
{
cbi(PORTC, servo);
Delay_ms(100); 
sbi(PORTC, servo);
Delay_ms(100);
}
}
}

Вот видео того, что получилось:
http://ru.youtube.com/watch?v=VMf0dhCwEAw


Вложения:
Комментарий к файлу: Нужно сделать вот так как у этого робота. Ссылка на видео http://www.instructables.com/id/How-to-build-your-first-robot/
FJ2FVLUFDO29C6M.MEDIUM.jpg
FJ2FVLUFDO29C6M.MEDIUM.jpg [ 25.08 КиБ | Просмотров: 7395 ]

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Последний раз редактировалось space 16 апр 2008, 23:17, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разоьраться с програмной частью для сервопривода
СообщениеДобавлено: 16 апр 2008, 23:16 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
space писал(а):
Вот сама прога подскажите, что нужно сделать:


А чего нужно добится ? Тех задание сформулируйте ЧЁТКО ! и однозначно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 16 апр 2008, 23:20 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
AVR взгляни пожалуйста вот на это видео, которое тут http://www.instructables.com/id/How-to- ... rst-robot/ . Вот то что робот вытворяет этой сервой, то и нужно мне. То есть чтобы серва крутилась сначало в одну сторону потом в другую :)

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 16 апр 2008, 23:47 
Не в сети

Зарегистрирован: 22 мар 2008, 21:01
Сообщения: 23
Откуда: Белгород
Skype: dackinevitch_yan
прог. языки: C/C++
space писал(а):
Вообщем написал программку для работы сервы, но только так, что серва двигается только в одну сторону, а когда нажимаю сброс, то резко в другую.
Вот сама прога подскажите, что нужно сделать:

Разобраться в том, как управлять сервами и переписать прогу. Если Вы подадите на управляющий контакт сервы меандр с полупериодом 100мс, то она совершенно не обязана на это реагировать. Опять-таки - разберитесь с таймерами и делайте это на них, не используя задержек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 17 апр 2008, 09:44 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
space писал(а):
чтобы серва крутилась сначало в одну сторону потом в другую :)


Тогда нужно каждые 20 мС подавать на серву сигнал управления меняющийся,
например, от 900 до 2100 мкС и обратно .

Таймеры - это задача 6 курса по AVR - http://avr123.nm.ru/z6.htm

ШИМ - это задача 8 курса по AVR - http://avr123.nm.ru/z8.htm

Добавлено спустя 31 минуту 47 секунд:
С паузами алгоритм В ПСВЕВДОКОДЕ ( http://avr123.nm.ru/z1.htm ) такой:

Код:
Импульс 1500   (серва по центру)

while (1) {            // Цикл  бесконечный 

проверка - если импульс больше 2100 то добавка (шаг сервы в мкС) отрицательная  -20 например.

проверка - если импульс меньше 900 то добавка положительная  20 например.

добавить добавку к текушеу значению импульса.

дать на среву "1"

выждать паузу длиной в импульс

дать на серву "0"

выждать 18 мСек

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 17 апр 2008, 14:30 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Пока вроде получилось, чтобы в две стороны крутилась серва, но только резко, а мне надо чтобы серва крутилась плавно. Для компилятора WinAVR
Код:
#include <avr/io.h>
#define OUT PORTC
#define servo PC1
#define K_DELAY_ms   F_CPU/600
void Delay_ms(unsigned char t) {
  if (t==0) return;
  unsigned int i;
  while (t--) for(i=0;i<K_DELAY_ms; i++);
}
int main(void)
{
PORTC=0x02;
DDRC=0xFD;
while (1){
{
cbi(PORTC, servo);
Delay_ms(250); 
sbi(PORTC, servo);
Delay_ms(0);
cbi(PORTC, servo);
Delay_ms(250); 
sbi(PORTC, servo);
Delay_ms(250);
}
}
}


Добавлено спустя 14 минут 8 секунд:
а с мС не получается:
Код:
#include <avr/io.h>
#define OUT PORTC
#define S_UL2 PC1 
int main(void)

char i;
PORTC=0x02;
DDRC=0xFD;
i = 0;
while(1)
{
if (i == 0)
{
S_UL2 = 0; 
delay_us(400);
i = 1;}

}

Пишет, что
servo.c:17: error: invalid lvalue in assignment
servo.c:18: warning: implicit declaration of function `delay_us'

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 17 апр 2008, 15:49 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
space писал(а):
а мне надо чтобы серва крутилась плавно.


Алгоритм выше !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 17 апр 2008, 21:42 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Только подскажи начало программы, а дальше сам попытаюсь разобраться
Код:
#include <avr/io.h> <- правильное ли начало?
#define OUT PORTC
#define servo PC1
Импульс 1500   (серва по центру) <- вот это, что должно быть

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 01:06 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
space писал(а):
Только подскажи начало программы, а дальше сам попытаюсь разобраться

Импульс 1500 (серва по центру) <- вот это, что должно быть


просто запись числа 1500 в переменную определяющую сколько времени (в микроСек)
на серву будет подаваться лог. "1"

Можно кончечно и с числами от 0 до 255 работать.

====================

1) возьмите ВОЛШЕБНЫЙ шаблон для быстрого создания приложения AVR в CVAVR с симуляцией в VMLAB.

2) Установите CVAVR и VMLAB в папки C:CVAVR и C:VMLAB - эти ДВЕ супер проги - качать 7 Мб всего !

3) шаблон распакуйте и полученую папку переименуйте в "SERVO" и поместите ее в корень диска С: вот так C:SERVO
инструкции есть в файле "_ReadMe For code testing and USART.txt" и в файлах проектов .prj

4) запустите VMLAB и откройте проект - vmlab.prj - сделайте в меню "Проджект" - "РеБилд Олл" - зеленый сфетофор должен

загореться. Разместите на экране удобно окна: "Контрол панел", "Скоп", "Код. тагет"

5) нажмите 3 раза сфетовор - начнется продолжительная симуляция. Порадуйтесь. Теперь вы уверены что симулятор пашет.

6) остановите симуляцию и откройте файл vmlab.prj для редактирования и строку

.plot V(PC0) V(PC1) V(PC2) V(PC3) V(PC4) V(PC5) V(PC6) V(PC7) V(PD1)

замените на:

.plot V(PC1)

теперь на осциллограф будет выводится тольконога PC1 - сигнал на серву.

7) в CVAVR откройте проект - cv.prj - будем править исходник под задачу управления серво по алгоритму


Импульс 1500 (серва по центру)

while (1) { // Цикл бесконечный

проверка - если импульс больше 2100 то добавка (шаг сервы в мкС) отрицательная -20 например.

проверка - если импульс меньше 900 то добавка положительная 20 например.

добавить добавку к текушеу значению импульса.

дать на среву "1"

выждать паузу длиной в импульс

дать на серву "0"

выждать 18 мСек

}


8) после строки #include <delay.h> объявим глобальные переменные

Код:
char servo_pulse = 150;   // длина импульса для среднего положения SERVO - (150 * 10) мкС

char servo_cw = 1;       
// "1" servo крутится по часовой, если "0" то импульс убавляется - крутится против часовой
char ctr; // просто - счетчик.


9) приветствие putsf("Hello world"); заменил на такое putsf("Servo ramping");


10) бесконечный цикл переписал так:

Код:
while(1){
           
// изменение направления движения SERVO

if (servo_pulse > 210) { // если импульс 2100 мкС
    servo_cw = 0;        // убавлять длину импульса
                       }
                       
if (servo_pulse < 90) { // если импульс 900 мкС
    servo_cw = 1;       // прибавлять длину импульса
                       }                     

// изменение ширины импульса

if (servo_cw == 0) { // если нужно убавить
    servo_pulse --;  // убавить длину импульса на 10 мкС
                   }

if (servo_cw == 1) { // если нужно прибавить
    servo_pulse ++;  // увеличить длину импульса на 10 мкС
                   }

// вывод импульса на серву

ctr = servo_pulse;

putchar(ctr); // вывести длину импульса на серво в десятках микросекунд

PORTC.1 = 1;  // подать на серву лог. "1"

while (ctr) { // отсчет паузы
   ctr --;
   delay_us(10); // пауза 10 мкС
             }
PORTC.1 = 0;  // подать на серву лог. "0"

// delay_ms(17); // пауза между импульсами на серву 17 милиСек
delay_ms(1); // пауза ДЛЯ УСКОРЕНИЯ симуляции 1 мС

         }

11) компилируем "мэйк зе проджект" - ошибок нет.

12) запустите VMLAB и откройте проект - vmlab.prj - сделайте в меню "Проджект" - "РеБилд Олл" - зеленый сфетофор должен

загореться. Вертикальное разрешение в SCOPE я сделал 1 вольт а горизонтальное 2 mS.

13) 3 раза нажмите на светофор - пойдет симуляция и появится надпись "Servo ramping" затем цифры длины импульса в SCOPE

будут видны импульсы на серву - остановите симуляцию. В окне TTY в "сет параметрс" установите "Numeric (decimel)".

14) Продолжайте симуляцию и смотрите за изменением длины импулса.


В PROTEUS вы можете подключить модель сервы и посмотреть как она будет двигаться.
Как это сделать - http://oProteus.narod.ru

Для PROTEUS и для реального устройства нужно паузу между импульсами сделать 17 мС !!!

=========

Всё, пошел спать ...

Добавлено спустя 35 минут 45 секунд:
=========

не спалось - сделал проект для PROTEUS - серва там прикольно движется ...


Вложения:
PROTEUS.rar [9.24 КиБ]
Скачиваний: 105
servo_proteus.png
servo_proteus.png [ 20.98 КиБ | Просмотров: 7223 ]
servo.rar [15.13 КиБ]
Скачиваний: 88
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 09:39 
Не в сети
скрытый хозяин вселенной :)
Аватара пользователя

Зарегистрирован: 18 сен 2006, 12:26
Сообщения: 18018
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич
это будет ещё один урок для курса ? :oops:

_________________
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 09:58 
Не в сети
Аватара пользователя

Зарегистрирован: 03 авг 2007, 19:43
Сообщения: 1437
Откуда: Екатеринбург
прог. языки: Си, асм со словарем
авр ведь можешь когда захочешь нормальнь ответить.
скачал, поглядел: наглядно, просто и просто красиво.
:good:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 10:31 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
AVR, спасибо огромное. Теперь буду разбираться и переделывать код под компилятор WinAVR

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 11:29 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
space писал(а):
AVR, спасибо огромное.

Не за что.
space писал(а):
Теперь буду разбираться и переделывать код под компилятор WinAVR

Советую переделать и сделать на таймерах по задачам 6 и 8курса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 14:16 
Не в сети
Аватара пользователя

Зарегистрирован: 21 дек 2006, 19:56
Сообщения: 4468
Откуда: Украина, г.Одесса
прог. языки: Delphi и С
А я вот чего замутил :)
+ таблица значений в Екселе какую задержку на какой угол.
И вообще зачем делать на таймерах если например паучек всегда использует одни и те же углы ног когда идет?


Вложения:
.JPG
.JPG [ 77.84 КиБ | Просмотров: 7334 ]
углов.zip [4.93 КиБ]
Скачиваний: 77
Servo_my.zip [50.5 КиБ]
Скачиваний: 82
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите разобраться с программной частью для сервопривода
СообщениеДобавлено: 18 апр 2008, 14:48 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Master писал(а):
А я вот чего замутил :)

Прикольно ! :Bravo:
Master писал(а):
зачем делать на таймерах если например паучек всегда использует одни и те же углы ног когда идет?

1. Для обучения 2. Чтоб у МК было свободное от счета пауз время - вдруг захочется чем то дополнить прогу.

Добавлено спустя 17 минут 54 секунды:
Master писал(а):
А я вот чего замутил :)


жаль что сервы КОЛОМ стоят ... Вот так ИМХО поприкольней будет ...

Изображение


Вложения:
SERVO 8 шт в PROTEUS ATmega16.rar [17.93 КиБ]
Скачиваний: 102
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO