Технический форум по робототехнике.
EasyTech » 09 дек 2011, 19:03
Привет всем!
На днях решил научиться рулить сервой, поигрался чуть чуть, потом решил построить руку-манипулятор из аналоговых серв (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];
}
}
спасибо!
=DeaD= » 09 дек 2011, 19:26
Дык надо вот это:
- Код: Выделить всё • Развернуть
OCR1A = a[1];
OCR1B = a[2];
}
}
превратить во что-то типа:
- Код: Выделить всё • Развернуть
OCR1A = a[1];
OCR1B = a[2];
delay(100);
}
}
Синтаксис конкретной delay проверьте сами. Задержку сделать можно где-нибудь 50-100мс
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 а не довести до максимума.
=DeaD= » 10 дек 2011, 15:32
Он просто это делает без перерыва 100500 раз в секунду
поэтому только нажал вроде - и сразу в крайнем положении всё.
EasyTech » 10 дек 2011, 17:18
Пасибо ) поставил задержку в 10мс и стало всё отлично работать, жалко только то что использую я дорогие мне таймеры, а так всё отлично
Hito » 19 янв 2012, 12:39
Надеюсь, топикстартер не будет против, если я немного поэксплуатирую его тему (:
И сразу с сути вопроса - требуется возможность по нажатию кнопки посылать одновременно в два сервопривода сигнал на поворот в 90 градусов. Повторное нажатие кнопки должно возвращать их в начальное положение. Если получится к этому ещё и привязать питание диодов (положение "верх-выкл", положение "низ-вкл"), то вообще шикарно.
С электроникой, схемами и программированием (а тут без Arduino не обойтись, наверное) не работал, поэтому искренне надеюсь на помощь. Также я понимаю, что никто за меня ничего делать не будет, поэтому прошу просто советов, консультаций. Какой контроллер мне нужен, может быть полезные куски кода, примеры подобных сборок.
Заранее огромное спасибо всем сочувствующим.
Vovan » 20 янв 2012, 12:02
Судя по ТЗ, можно применить самый маленький МК, ведь потребуется всего 4порта : 1.кнопка 2.две сервы 3.светодиод вкл 4.светодиод выкл. Ну максимум 5, если сервы на разные порты повесить, хотя смысла в этом не вижу исходя из задачи.
Кроме того, при такой постановке задачи можно обойтись без МК, программирования и прошивки, правда схема будет немного увесистей.
Дуина для такого ТЗ ИМХО то же что из пушки в муху
ЗЫ: <питание диодов> я понял как <подключить светодиоды>.
ЗЫЫ: куски кода для сервы могу предоставить, но только на ассемблере. Хотя по сервам не найти код на баскоме или си - просто нереал...
Hito » 20 янв 2012, 16:06
Т.е всё, что мне требуется - это непосредственно сервы, МК, диоды и программное обеспечение для того, чтобы залить программу? Потом это дело собирается, ищется/пишется программа и готово?
elmot » 20 янв 2012, 16:10
Да. А я как фанат дискавери для похожей задачи взял дискавери и сервы. Диоды с кнопкой есть на борту мк
Хотя это даже не из пушки:))))
Hito » 20 янв 2012, 17:03
Ох, голова кругом от всего (впервые сталкиваюсь).
Обязательно куплю и всё это дело соберу. Надеюсь, что всё получится.
Всем большое спасибо за советы!
Vovan » 20 янв 2012, 17:10
2Hito: верно, а как альтернатива ИМХО можно и сервотестер (гугль сразу схему выдает) на таймере, например применить... Схема немногим больше, зато без мороки с программированием и программатором...
Hito » 20 янв 2012, 18:15
Вроде бы всё понятно, единственное - смогу ли я заставить обе сервы действовать одновременно по нажатию кнопки?
elmot » 20 янв 2012, 18:21
??? Почему нет? Что, собственно помешает? Для начала их можно вообще запараллелить.
Hito » 20 янв 2012, 19:41
Повторюсь, я вообще впервые электронику в руках держать буду. Поэтому чем подробнее - тем лучше! (:
Кстати, паять много придётся?
Vovan » 20 янв 2012, 20:03
Параллельно (я уже писал <на один порт> потому что проверял, а иначе не писал бы) ничто не мешает, как и сказал elmot.
Hito писал(а):я вообще впервые электронику в руках держать буду
мы все когда-то первый раз паяльник в руки брали
ИМХО лучше поздно чем некогда
Выбирайте схему, обсудим.
Много или мало паять - понятие относительное