roboforum.ru

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

 

Управление сервой

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Управление сервой

Сообщение EasyTech » 09 дек 2011, 19:03

Привет всем! :D
На днях решил научиться рулить сервой, поигрался чуть чуть, потом решил построить руку-манипулятор из аналоговых серв (4 штуки) на 3 таймера ШИМ. (Просто так, ради интереса). Построил софт, и всё такое. Потом задумался решил кнопочками поуправлять сервой. Теория простая: изменяем задержку и получаем поворот сервы. Теорию взял от сюда : http://cdxp.zx6.ru/archives/355 .начал работу.
Суть проги такая, есть изначальный массив a[2] = {1500, 1500} (у меня так по середине сервы становятся), при нажатии на кнопку значение массива или увелич. или уменьшается. При достижение предела (т.е. если >2000) мы ставим максимальную задержку, т.е. 2000мс. и наоборот.
при нажатии кнопкии мы увеличиваем или уменьшаем задержку на 10мс <= вот тут то у меня проблема, при нажатии на кнопку задержка становится или 2000мс или 1000мс. Я даже не хнаю что делатЬ:(
Я хотел бы что бы при нажатии на кнопку задержка увеличивал ИМЕННО на 10мс или уменьшалась на 10мс.
вот код, он предельно ясен.
Код: Выделить всёРазвернуть
#include <avr/io.h> //Библиотека ввода/вывода
#define TOP 20000
int a[2] = {1500,1500};
/*void servo1_position(int pos)
{
OCR1A = pos;
}

void servo2_position(int pos)
{
OCR1B = pos;
}
*/
void main(void)
{

//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=TOP>>8;
ICR1L=TOP; //максимальное значение таймера
OCR1B=0x00;
OCR1A=0x00;
DDRA=0x00;
DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход
PORTA=0xff;
/*servo1_position(zos); //на PD5 появится ШИМ с частотой 50 гц и длительностью имлуьса 1000 мксек
servo2_position(zos); //на PD4 аналогично, но длительность импульса уже 1300 мксек*/
while(1){
if (!(PINA & (1<<PINA0))) {a[1]+=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA1))) {a[1]-=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA2))) {a[2]+=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA3))) {a[2]-=10;}// проверить "0" на линии 1 порта D
if (a[1] > 2000) {a[1] = 2000;}
if (a[2] > 2000) {a[2] = 2000;}
if (a[1] <1000) { a[1] =1000;}
if (a[2] < 1000) {a[2] =1000;}
OCR1A = a[1];
OCR1B = a[2];
}
}

спасибо!
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

Re: Управление сервой

Сообщение =DeaD= » 09 дек 2011, 19:26

Дык надо вот это:
Код: Выделить всёРазвернуть
OCR1A = a[1];
OCR1B = a[2];
}
}


превратить во что-то типа:
Код: Выделить всёРазвернуть
OCR1A = a[1];
OCR1B = a[2];
delay(100);
}
}


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

Re: Управление сервой

Сообщение EasyTech » 10 дек 2011, 15:11

=DeaD= писал(а):Дык надо вот это:
Код: Выделить всёРазвернуть
OCR1A = a[1];
OCR1B = a[2];
}
}


превратить во что-то типа:
Код: Выделить всёРазвернуть
OCR1A = a[1];
OCR1B = a[2];
delay(100);
}
}


Синтаксис конкретной delay проверьте сами. Задержку сделать можно где-нибудь 50-100мс

Это всё понятно, просто странно, я при нажатии кнопки говорю МК, чтобы он увеливал переменную на 10, или уменьшал её на 10, а он сразу доводит её до максимума или минимума.
вроде запись a[1]+=10 означает, типо увеличить значение первой ячейки массива на 10 а не довести до максимума.
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

Re: Управление сервой

Сообщение =DeaD= » 10 дек 2011, 15:32

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

Re: Управление сервой

Сообщение EasyTech » 10 дек 2011, 17:18

Пасибо ) поставил задержку в 10мс и стало всё отлично работать, жалко только то что использую я дорогие мне таймеры, а так всё отлично :)
EasyTech
 
Сообщения: 239
Зарегистрирован: 15 май 2011, 19:19
Откуда: Ростов-на-Дону
Skype: levanchik322
прог. языки: WinAVR C, C#, HTML+СSS.
ФИО: Лёва

Re: Управление сервой

Сообщение Hito » 19 янв 2012, 12:39

Надеюсь, топикстартер не будет против, если я немного поэксплуатирую его тему (:

И сразу с сути вопроса - требуется возможность по нажатию кнопки посылать одновременно в два сервопривода сигнал на поворот в 90 градусов. Повторное нажатие кнопки должно возвращать их в начальное положение. Если получится к этому ещё и привязать питание диодов (положение "верх-выкл", положение "низ-вкл"), то вообще шикарно.

С электроникой, схемами и программированием (а тут без Arduino не обойтись, наверное) не работал, поэтому искренне надеюсь на помощь. Также я понимаю, что никто за меня ничего делать не будет, поэтому прошу просто советов, консультаций. Какой контроллер мне нужен, может быть полезные куски кода, примеры подобных сборок.

Заранее огромное спасибо всем сочувствующим.
Аватара пользователя
Hito
 
Сообщения: 12
Зарегистрирован: 19 янв 2012, 12:31

Re: Управление сервой

Сообщение Vovan » 20 янв 2012, 12:02

Судя по ТЗ, можно применить самый маленький МК, ведь потребуется всего 4порта : 1.кнопка 2.две сервы 3.светодиод вкл 4.светодиод выкл. Ну максимум 5, если сервы на разные порты повесить, хотя смысла в этом не вижу исходя из задачи.
Кроме того, при такой постановке задачи можно обойтись без МК, программирования и прошивки, правда схема будет немного увесистей.
Дуина для такого ТЗ ИМХО то же что из пушки в муху :roll:
ЗЫ: <питание диодов> я понял как <подключить светодиоды>.
ЗЫЫ: куски кода для сервы могу предоставить, но только на ассемблере. Хотя по сервам не найти код на баскоме или си - просто нереал...
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: Управление сервой

Сообщение Hito » 20 янв 2012, 16:06

Т.е всё, что мне требуется - это непосредственно сервы, МК, диоды и программное обеспечение для того, чтобы залить программу? Потом это дело собирается, ищется/пишется программа и готово?
Аватара пользователя
Hito
 
Сообщения: 12
Зарегистрирован: 19 янв 2012, 12:31

Re: Управление сервой

Сообщение elmot » 20 янв 2012, 16:10

Да. А я как фанат дискавери для похожей задачи взял дискавери и сервы. Диоды с кнопкой есть на борту мк :) Хотя это даже не из пушки:))))
Аватара пользователя
elmot
 
Сообщения: 5674
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Управление сервой

Сообщение Hito » 20 янв 2012, 17:03

Ох, голова кругом от всего (впервые сталкиваюсь).
Обязательно куплю и всё это дело соберу. Надеюсь, что всё получится. :D
Всем большое спасибо за советы!
Аватара пользователя
Hito
 
Сообщения: 12
Зарегистрирован: 19 янв 2012, 12:31

Re: Управление сервой

Сообщение Vovan » 20 янв 2012, 17:10

2Hito: верно, а как альтернатива ИМХО можно и сервотестер (гугль сразу схему выдает) на таймере, например применить... Схема немногим больше, зато без мороки с программированием и программатором...
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

Re: Управление сервой

Сообщение Hito » 20 янв 2012, 18:15

Вроде бы всё понятно, единственное - смогу ли я заставить обе сервы действовать одновременно по нажатию кнопки?
Аватара пользователя
Hito
 
Сообщения: 12
Зарегистрирован: 19 янв 2012, 12:31

Re: Управление сервой

Сообщение elmot » 20 янв 2012, 18:21

??? Почему нет? Что, собственно помешает? Для начала их можно вообще запараллелить.
Аватара пользователя
elmot
 
Сообщения: 5674
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Управление сервой

Сообщение Hito » 20 янв 2012, 19:41

Повторюсь, я вообще впервые электронику в руках держать буду. Поэтому чем подробнее - тем лучше! (:

Кстати, паять много придётся?
Аватара пользователя
Hito
 
Сообщения: 12
Зарегистрирован: 19 янв 2012, 12:31

Re: Управление сервой

Сообщение Vovan » 20 янв 2012, 20:03

Параллельно (я уже писал <на один порт> потому что проверял, а иначе не писал бы) ничто не мешает, как и сказал elmot.
Hito писал(а):я вообще впервые электронику в руках держать буду
мы все когда-то первый раз паяльник в руки брали :wink: ИМХО лучше поздно чем некогда :roll:
Выбирайте схему, обсудим.
Много или мало паять - понятие относительное :wink:
_________
Sincerely,
Vovan
Аватара пользователя
Vovan
 
Сообщения: 3340
Зарегистрирован: 05 окт 2005, 12:03
Откуда: Литва
прог. языки: asm

След.

Вернуться в Новичкам или основы основ роботостроения.

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

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 4

Mail.ru counter