Поворот сервопривода ч/з кнопку

vpbcb
Offline
Зарегистрирован: 08.12.2017

Добрый день.

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

Необходимо: заставить повернуться сервопривод на Х градусов и обратно (подобие заслонки) по нажатию кнопки.

первая часть выглядит так:

#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
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vpbcb пишет:

Подскажите, в чем моя ошибка?

А которая из Ваших многочисленных ошибок Вас интересует.

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

Но, думаю, что основная Ваша ошибка в том, что Вы не понимаете того, что написали в скетче (иначе бы такого не написали). Напишите комментарий к каждой строке: что, по Вашему мнению, эта строка должна делать.

 

vpbcb
Offline
Зарегистрирован: 08.12.2017

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);
  }

 

любая критика приветствуется.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

строка 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 байт.
*/

 

vpbcb
Offline
Зарегистрирован: 08.12.2017

qwone пишет:

строка 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 градусов....

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Тогда у вас с сервой проблема. Кривая или "другой системы". Обычно сервы работают независимо. На них по команде подается импульс нужной величины. Они меряют эту величину, запоминают и поворачиваются. Угол поворота контролируется потенциометром на серво и все. Может проблема с питанием сервы. Мощности питания не хватает для сохранения величины и вылазят ошибки при вычислении длительности импульса.

vpbcb
Offline
Зарегистрирован: 08.12.2017

как-то это можно проверить в домашних условиях?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
vpbcb
Offline
Зарегистрирован: 08.12.2017

Спасибо, обязательно изучу.

еще уточнение, если вращать серву в обратном направлении (зеркально) с 90 на 120, то все корректно.....

может, и в правду сама машинка чудит...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

скорее всего. Может мощности маловато, или контакты чудят в ней.

vpbcb
Offline
Зарегистрирован: 08.12.2017

в итоге решил вопрос такой извращенной формой:

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();