Изменение положения Серво по нажатию кнопки.

naks
Offline
Зарегистрирован: 13.01.2015

Всем доброго времени суток. 
Знакомлюсь с Arduino. Пробую сделать двежение серовпривода по нажатию кнопки. 

Использую для этого Arduino nano (ATmega328), Micro Servo (9g) и обычную аналоговую тактовую кнопку.

Подключил серов к 5V, GND и D10
Кнопку к GND и A2

Удалось как то сдвигать серво, но по какой то причние при запуске Ардуино он поднимается в исходное положение и постепенно опускается сам по себе.

В чем может быть причина, подскажите пожалуйста, только знакомлюсь с такого рода девайсами)
Вот мой код:

int sensorPin = A2;    
int ServoPin = 10;     
int sensorValue = 0;  

void setup() {
  
  pinMode(ServoPin, OUTPUT);  
}

void loop() {
  
  sensorValue = analogRead(sensorPin);    
  
  digitalWrite(ServoPin, HIGH);  
  
  delay(sensorValue);          
         
  digitalWrite(ServoPin, LOW);   
  
  delay(sensorValue);                  
}

 

naks
Offline
Зарегистрирован: 13.01.2015

Извиняюсь, не то скопировал.

 

#include <Servo.h> 

int sensorPin = A2;    // select the input pin for the potentiometer
Servo myservo;      // select the pin for the LED
int flag = 0;  // variable to store the value coming from the sensor
int pos = 0;

void setup() {
  // declare the ledPin as an OUTPUT:
  myservo.attach(10); 
}

void loop() {
  // read the value from the sensor:

  if (analogRead(sensorPin)==HIGH&&flag==0)
  {  
  // turn the ledPin on
  for(pos = 30; pos <= 90; pos += 1) // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
  } 
  flag=1;
 
  }  
  
  
  if(analogRead(sensorPin)==LOW&&flag==1)

     {     
        flag=0;

     }

  delay(50);                  
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Вы как то переделали код из примера knob, и он естественно не работает.

Сначала надо разобраться с кнопками .

Почитайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

Переделаете код - будем помогать.

 

Sanchogus
Offline
Зарегистрирован: 02.01.2015

Что в итоге надо получить, с подробностями? 

naks
Offline
Зарегистрирован: 13.01.2015

По нажатию кнопки серво должно двигатся. Планирую сделать две кнопки, на одну опускается, на другую поднимается.

Sanchogus
Offline
Зарегистрирован: 02.01.2015

naks пишет:

По нажатию конпку серво должно двигатся. Планирую сделать две кнопки, на одну опускается, на другую поднимается.

Хм, под рукой нету ардуины, примерно накину.

Теоретически должно заработать. :)

 




#include <Servo.h>
 
#define ServoPin 9 	//пин сервы
#define BUT_1 4    	//BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
#define BUT_2 5	//BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
#define SHAG 1           //шаг поворота сервы, в градусах

Servo myServo;

int angle = 0;  //начальный угол
 
void setup()
{
  myServo.attach(ServoPin);
  myServo.write(angle); 	//состояние после включения
  pinMode(BUT_1, INPUT); 	//для считывания состояний кнопок
  pinMode(BUT_2, INPUT);	//для считывания состояний кнопок
// кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)
}
 
void loop()
{
  if (digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол
  if (digitalRead(BUT_2)) angle = angle - SHAG;//если вторая уменьшим

  if (angle > 180) angle = 180;    //ограничим угол сервы 0..180
  if (angle < 0) angle = 0;

  myServo.write(angle); //задаем получившийся угол
  delay(300); // подождем перед следующим опросом
}

 

"Стягивающий резистор":

 

naks
Offline
Зарегистрирован: 13.01.2015

Спасибо, вечером попробую. )

Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4  и GND

Sanchogus
Offline
Зарегистрирован: 02.01.2015

naks пишет:

Спасибо, вечером попробую. )

Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4 и 5-му. 

Можете к любому, который умеет делать digitalRead, но в #define BUT_№ смените цифру пина.

Аналогично и шаг в градусах.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

можно использовать внутренние подтягивающие резисторы - экономия будет, пин просто на землю через кнопку....



#include <Servo.h>
 
#define ServoPin 9 	//пин сервы
#define BUT_1 4    	//BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
#define BUT_2 5    	//BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
#define SHAG 1          //шаг поворота сервы, в градусах

Servo myServo;

int angle = 0;          //начальный угол
 
void setup()
{
  myServo.attach(ServoPin);
  myServo.write(angle); 	//состояние после включения
  pinMode(BUT_1, INPUT); 	//для считывания состояний кнопок
  digitalWrite( BUT_1 , HIGH );
  pinMode(BUT_2, INPUT);	//для считывания состояний кнопок
digitalWrite( BUT_2 , HIGH );

// кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)
}

void loop()
{
if ( ! digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол // инверсия !!!!!!!!
if ( ! digitalRead(BUT_2)) angle = angle - SHAG;//если вторая уменьшим // инверсия !!!!!!!!

if (angle > 180) angle = 180; //ограничим угол сервы 0..180
if (angle < 0) angle = 0;

myServo.write(angle); //задаем получившийся угол
delay(300); // подождем перед следующим опросом
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не правильно скопировал :( ..... вот так....

 

#include <Servo.h>
#define ServoPin 9 	// пин сервы
#define BUT_1 4    	// BUT_1 и BUT_2 - кнопки управления сервой (тут пин 4)
#define BUT_2 5	        // BUT_1 и BUT_2 - кнопки управления сервой (тут пин 5)
#define SHAG 1          // шаг поворота сервы, в градусах
Servo myServo;
int angle = 0;          //начальный угол
void setup()
{
  myServo.attach(ServoPin);
  myServo.write(angle); 	  //состояние после включения
  pinMode(BUT_1, INPUT); 	  //для считывания состояний кнопок
  digitalWrite( BUT_1 , HIGH );   // подтяжка
  pinMode(BUT_2, INPUT);	  //для считывания состояний кнопок
  digitalWrite( BUT_2 , HIGH );   // подтяжка
// кнопки соединены с ардуиной стягивающим резистором! (т.е. когда не нажато 0 В)  изменить !!!!!
// кнопки соединены с ардуиной ПОДТЯГИВАЮЩИМ резистором! (т.е. когда не нажато 5 В) !!!!!!!!!!!!!!!!
}
void loop()
{
  if ( ! digitalRead(BUT_1)) angle = angle + SHAG; //если первая кнопка увеличим угол
  if ( ! digitalRead(BUT_2)) angle = angle - SHAG; //если вторая уменьшим

  if (angle > 180) angle = 180;    //ограничим угол сервы 0..180
  if (angle < 0) angle = 0;

  myServo.write(angle); //задаем получившийся угол
  delay(300);           // подождем перед следующим опросом
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"... Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4  и GND. ..."

.....подключить кнопку к цифровому ВХОДУ !!!!

naks
Offline
Зарегистрирован: 13.01.2015

Извеняюсь, имел ввиду к входу) Спасибо большое за помощь, вечером попробую на своем ардуино

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"вывод" ножки из МК может быть и входом и выходом.... как определили его в сетапе - так дальше и называйте :) , чобы не было ошибок....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

в коде нет защиты от "дребезга контактов" кнопки.... хотя - строка 28 в этом варианте и спасёт от этой напасти....

Sanchogus
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

в коде нет защиты от "дребезга контактов" кнопки.... хотя - строка 28 в этом варианте и спасёт от этой напасти....

Задержка в 0.3 сек, да еще и малый шаг сводят негативный эффект дребезга к нулю.

Malik
Offline
Зарегистрирован: 20.02.2015

Добрый вечер.

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

#include <VarSpeedServo.h>
VarSpeedServo myServo;           
int buttonPin = 12;
void setup()
{
 myServo.attach (9);
pinMode(buttonPin, INPUT);
}

void loop()
{
  if(digitalRead(buttonPin) == HIGH) 
  myServo.slowmove (15, 20);  // положение, скорость
  if(digitalRead(buttonPin) == LOW) 
myServo.slowmove (90, 20);  // положение, скорость

}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Malik
Offline
Зарегистрирован: 20.02.2015

Я проверил ,если снимать питание, то действительно проблемма уходит, но у меня этот вариант не подходит. нужно отключать начальные движения программно.

vvadim
Offline
Зарегистрирован: 23.05.2012

програмно не получится.

при подаче питания на серву до формирования управляющего сигнал она по любому бежит в нулевую позицию.

только задержка подачи питания на серву.

сам долго мучился с этой темой, задолбал гугль, ничего не нашёл.

через релюху всё гуд.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а как ты отключишь программно? бутлоадер не дает основной программе запустится сразу

ну или затереть бутлоадер и программировать через icsp. тогда возможно решится

Malik
Offline
Зарегистрирован: 20.02.2015

Загрузчик трогать-себе дороже. У меня на Меге загрузчик соскочил, теперь программы заливаю только через USB tinyISP. Буду огород городить с релюшками. Всем спасибо.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

загрузчик залить вообще не проблема, нужен только программатор или вторая ардуина

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Затирать не кошерно, лучше отключить фьюзом.

Sanchogus
Offline
Зарегистрирован: 02.01.2015

Еще один пин+транзистор потратить на управление питанием сервы.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

он не хочет. программно хочет исправить

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Залил скетч от SU-27-16  замечательно заработало ! Как раз я такое искал . Но возникла проблема как подключить 2 сервы с таким управлением. Не могу понять как указать ,что кнопки 1,2 управляют сервой 1, а 3,4- второй. И вот эту строчку победить не могу (int angle = 0;) Надо же 2 угла и соответственно дальше по тексту.Топикстартера прошу извинить если влез не туда. Ардуиной первый месяц занимаюсь сильно не пинайте

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ded_60_let пишет:

Залил скетч от SU-27-16  замечательно заработало ! Как раз я такое искал . Но возникла проблема как подключить 2 сервы с таким управлением. Не могу понять как указать ,что кнопки 1,2 управляют сервой 1, а 3,4- второй. И вот эту строчку победить не могу (int angle = 0;) Надо же 2 угла и соответственно дальше по тексту.Топикстартера прошу извинить если влез не туда. Ардуиной первый месяц занимаюсь сильно не пинайте

дык, создай новую тему ! со ссылкой в этой теме на новую и типа, всем тут спасибо - ушёл туда-то :)

а в новой теме ссылку - откуда ноги растут :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Залил скетч от SU-27-16  замечательно заработало ! Как раз я такое искал 

.....нано писать свой код ! а не баловство от SU-27-16

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Свой код писать мне еще рано - не все же сразу, а пользовать ардуинки хочется .Создал свою тему вопросы те же- кто может помогите деду

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ded_60_let пишет:

Свой код писать мне еще рано - не все же сразу, а пользовать ардуинки хочется .Создал свою тему вопросы те же- кто может помогите деду

а ссылку на новую тему ?

ded_60_let
Offline
Зарегистрирован: 01.03.2015

Да новая тема "Изменение положения двух сервоприводов по нажатию кнопок"

http://arduino.ru/forum/programmirovanie/izmenenie-polozheniya-dvukh-servoprivodov-po-nazhatiyu-knopok