Технический форум по робототехнике.
d00m » 27 фев 2013, 11:10
всем привет.
уже долго не могу разрешить эту задачу..
у меня есть небольшой самодельный pan-tilt из двух сервов для вебкамеры. все это управляется arduino+opnewrt
но я хочу поменять сервоприводы на шаговые двигатели, так как они работают гораздо тише.
это мне и нужно - сделать максимально тихий поворотный механизм.
для этого купил два 28BYJ-48 + ULN2003
правда уже вижу, что они врядли подходят под мои задачи - они очень медленные.
в то время как сервопривод крутит камеру быстро и резко, этот шаговик прокручивается неторопливо.
правда может быть я не умею его "кодировать" ?
я уже успел понять, что там есть редуктор.. видимо он "мешает" разогнаться.
но я пока буду использовать эти шаговики, до тех пор пока не пойму какие более быстрые лучше купить вместо них.
но мой первый вопрос такой - как заставить этот мотор крутится на максимально доступной для него скорости ?
если есть у когото опыт работы с ними - прошу подсказать код или библиотеку с которой стоит работать.
я попробовал много разных вариантов, но пока никак не могу понять как же оно все работает.
какито углы, шаги и прочие обороты, все так просто с ними ведут рассчеты, а для меня это темный лес..
еще у меня возникла новая проблема: из-за того, что шаговики принципиально отличаются от сервов, я не могу программно ограничить диапазон вращения вала и по получается что возможна ситуация когда кабель камеры может намотаться на вал..
я полагаю в этом случае мне нужно сделать какието физические упоры на корпусе... иначе даже не знаю как.
Прошу совета, а то я уже не знаю что и придумать..
Myp » 27 фев 2013, 11:14
ты ими просто медленно управляешь =)
они достаточно шустрые
https://www.youtube.com/watch?v=asv5-kYzSsE
d00m » 27 фев 2013, 11:29
спасибо, посмотрел. Мне хотябы так его крутить как в начале видео..
Load the Arduino Example File/Examples/Stepper/stepper_speedControl
Than change the follow lines:
const int stepsPerRevolution = 2050;
Stepper myStepper(stepsPerRevolution ,8,10,11,9);
Max speed is 14 RPM At 5V
у меня не крутится.. а если не менять stepsPerRevolution и оставить его как было (200) то чуть-чуть прокручивается, еще медленнее чем было )
подключено также - 8,9,10,11
правда питание внешнее, так как у меня arduino nano..
RootAdmin » 27 фев 2013, 12:01
Быстрее чем 8-10 оборотов в минуту - начинают пропускать шаги. Не говоря о том, что мощность падает на порядок.
d00m » 27 фев 2013, 13:06
ну полные обороты мне и не нужны. максимум это 270 градусов обзор..
вот как упоры приделать и что делать с кодом чтобы оно так быстро крутилось ?
RootAdmin » 28 фев 2013, 01:27
С кодом - написать самостоятельно, порядок переключерия фаз - как в даташите. Вызывать шаои - из прерывания таймера для точности.
Гляну, был у меня скетчик.
d00m » 28 фев 2013, 20:06
жду с нетерпением, спасибо !
RootAdmin » 04 мар 2013, 12:21
Шаги переключать как-то так:
- Код: Выделить всё • Развернуть
void stepMotor(int Step)
{
int thisStep = Step % 8;
switch (thisStep) {
case 0: // 1000
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 1100
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
break;
case 2: // 0100
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
break;
case 3: // 0110
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 4: // 0010
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 5: // 0011
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
break;
case 6: // 0001
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
case 7: // 1001
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
}
}
Вызывать этот код - из прерывания по таймеру, вот так:
- Код: Выделить всё • Развернуть
//Timer2 указатель вектора прерывания по переполнению
ISR(TIMER2_OVF_vect) {
//Проверим направление, если больше границ - поменяем на противоположное
if (curstep> 400 || curstep<0){dir=-dir;}
curstep+=dir;
//Переключение IO-вывода в другое состояние.
digitalWrite(TOGGLE_IO,!digitalRead(TOGGLE_IO));
stepMotor(curstep);
}
Тут двигатель делает 400 шагов туда-сюда.