Поворот сервопривода ч/з кнопку
- Войдите на сайт для отправки комментариев
Добрый день.
Просьба помочь в решении поставленной задачи. Сам не в зуб ногой, пытаюсь разобраться с помощью аналогичного проекта и читая форумы.
Необходимо: заставить повернуться сервопривод на Х градусов и обратно (подобие заслонки) по нажатию кнопки.
первая часть выглядит так:
#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() лишняя. Вот и причина лишних дерганий при нажатии кнопки.
/**/ //--------------------------------- #include <Servo.h> // включение библтотеки servo.h Servo myServo; const int servoPin =/*пин*/9; const int buttonPin =/*пин*/12; const int ledPin = /*пин*/13; int pos = 1; //----main()-- void setup() { myServo.attach(servoPin); // подключаем серво к выходу 9 myServo.write(90); // разворачиваем серву на угол 90 pinMode(buttonPin, INPUT_PULLUP); // назначаем 12 как ввод pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { delay(10); if (!digitalRead(buttonPin)) { myServo.write(60); delay(10); } else { myServo.write(90); // разворачиваем серву на угол 90 } } /*Скетч использует 2300 байт (7%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 50 байт (2%) динамической памяти, оставляя 1998 байт для локальных переменных. Максимум: 2048 байт. */строка myservo.attach(servoPin); в loop() лишняя. Вот и причина лишних дерганий при нажатии кнопки.
/**/ //--------------------------------- #include <Servo.h> // включение библтотеки servo.h Servo myServo; const int servoPin =/*пин*/9; const int buttonPin =/*пин*/12; const int ledPin = /*пин*/13; int pos = 1; //----main()-- void setup() { myServo.attach(servoPin); // подключаем серво к выходу 9 myServo.write(90); // разворачиваем серву на угол 90 pinMode(buttonPin, INPUT_PULLUP); // назначаем 12 как ввод pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { delay(10); if (!digitalRead(buttonPin)) { myServo.write(60); delay(10); } else { myServo.write(90); // разворачиваем серву на угол 90 } } /*Скетч использует 2300 байт (7%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 50 байт (2%) динамической памяти, оставляя 1998 байт для локальных переменных. Максимум: 2048 байт. */Спасибо, но проблема не сколько в дерганиях, а сколько в команде 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, то все корректно.....
может, и в правду сама машинка чудит...
скорее всего. Может мощности маловато, или контакты чудят в ней.
в итоге решил вопрос такой извращенной формой:
void loop() { int buttonVal = digitalRead(buttonPin); if(buttonVal == LOW) { myservo.attach(servoPin); myservo.write(60); delay(150); myservo.detach(); delay(500); myservo.attach(servoPin); myservo.write(110); delay(600); myservo.detach();