Поворот сервопривода ч/з кнопку
- Войдите на сайт для отправки комментариев
Добрый день.
Просьба помочь в решении поставленной задачи. Сам не в зуб ногой, пытаюсь разобраться с помощью аналогичного проекта и читая форумы.
Необходимо: заставить повернуться сервопривод на Х градусов и обратно (подобие заслонки) по нажатию кнопки.
первая часть выглядит так:
#include <Servo.h>
Servo myservo;
const int servoPin = 9;
const int buttonPin = 12;
const int ledPin = 13;
int pos = 1;
void setup() {
myservo.attach(servoPin);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
myservo.write(90);
delay(1000);
myservo.detach();
}
void loop() {
int buttonVal = digitalRead(buttonPin);
if(buttonVal == LOW) {
myservo.attach(servoPin);
myservo.write(60);
delay(10);
}
delay(10);
}
Т.е. это поворот в одну сторону. Столкнулся со следющей проблемой: при повороте на угол 120 градусов - все хорошо, а вот при повороте на 60 (как мне надо), сервопривод как бы проворачивается на больший угол, затем возвращается на заданное значение (60).
Подскажите, в чем моя ошибка?
Заранее спасибо!
Подскажите, в чем моя ошибка?
А которая из Ваших многочисленных ошибок Вас интересует.
Первая Ваша ошибка - Вы неправильно вставили код. (только не спрашивайте, как надо, - любой программист не может себе позволить пренебрегать поиском и чтением документации. Если не хотите этого делать - подыщите для себыя другое поприще)
Но, думаю, что основная Ваша ошибка в том, что Вы не понимаете того, что написали в скетче (иначе бы такого не написали). Напишите комментарий к каждой строке: что, по Вашему мнению, эта строка должна делать.
andriano, спасибо за Ваш ответ. Повторюсь, что я действительно далек от этого, но есть желание разобраться и доделать.
Итак, как я понимаю написанное:
#include <Servo.h> // включение библтотеки servo.h
Servo myservo;
const int servoPin = 9; // константы
const int buttonPin = 12;
const int ledPin = 13;
int pos = 1;
void setup() {
myservo.attach(servoPin); // подключаем серво к выходу 9
pinMode(buttonPin, INPUT); // назначаем 12 как ввод
digitalWrite(buttonPin, HIGH); // как я понимаю, назначаем значение 1
pinMode(ledPin, OUTPUT); // 13 как вывод
digitalWrite(ledPin, LOW); // при output+low, как я понимаю, напряжение на выходе будет 0
myservo.write(90); / /разворачиваем серву на угол 90
delay(1000); // ждем секунду
myservo.detach(); // отключаем
}
void loop() {
int buttonVal = digitalRead(buttonPin);
if(buttonVal == LOW) {
myservo.attach(servoPin); // а дальше, как я понимаю, при условии нажатия кнопки (значение 0) следует поворот сервы на угол 60
myservo.write(60);
delay(10);
}
delay(10);
}
любая критика приветствуется.
строка myservo.attach(servoPin); в loop() лишняя. Вот и причина лишних дерганий при нажатии кнопки.
строка myservo.attach(servoPin); в loop() лишняя. Вот и причина лишних дерганий при нажатии кнопки.
Спасибо, но проблема не сколько в дерганиях, а сколько в команде myservo.write(60);
т.е. например ставлю значение 70, заслонка поворачивается на 20 градусов (от начальных 90), а ставлю 30 - сразу поворачивается на +90, т.е. итоговое значение 180 градусов....
Тогда у вас с сервой проблема. Кривая или "другой системы". Обычно сервы работают независимо. На них по команде подается импульс нужной величины. Они меряют эту величину, запоминают и поворачиваются. Угол поворота контролируется потенциометром на серво и все. Может проблема с питанием сервы. Мощности питания не хватает для сохранения величины и вылазят ошибки при вычислении длительности импульса.
как-то это можно проверить в домашних условиях?
почитайте и проверьте http://wiki.amperka.ru/%D1%80%D0%BE%D0%B1%D0%BE%D1%82%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:%D1%81%D0%B5%D1%80%D0%B2%D0%BE%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D1%8B
Спасибо, обязательно изучу.
еще уточнение, если вращать серву в обратном направлении (зеркально) с 90 на 120, то все корректно.....
может, и в правду сама машинка чудит...
скорее всего. Может мощности маловато, или контакты чудят в ней.
в итоге решил вопрос такой извращенной формой: