Изменение положения Серво по нажатию кнопки.
- Войдите на сайт для отправки комментариев
Втр, 13/01/2015 - 23:11
Всем доброго времени суток.
Знакомлюсь с 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);
}
Извиняюсь, не то скопировал.
#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); }Вы как то переделали код из примера knob, и он естественно не работает.
Сначала надо разобраться с кнопками .
Почитайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Переделаете код - будем помогать.
Что в итоге надо получить, с подробностями?
По нажатию кнопки серво должно двигатся. Планирую сделать две кнопки, на одну опускается, на другую поднимается.
По нажатию конпку серво должно двигатся. Планирую сделать две кнопки, на одну опускается, на другую поднимается.
Хм, под рукой нету ардуины, примерно накину.
Теоретически должно заработать. :)
#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); // подождем перед следующим опросом }"Стягивающий резистор":
Спасибо, вечером попробую. )
Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4 и GND.
Спасибо, вечером попробую. )
Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4 и 5-му.
Можете к любому, который умеет делать digitalRead, но в #define BUT_№ смените цифру пина.
Аналогично и шаг в градусах.
можно использовать внутренние подтягивающие резисторы - экономия будет, пин просто на землю через кнопку....
#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); // подождем перед следующим опросом
}
не правильно скопировал :( ..... вот так....
#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); // подождем перед следующим опросом }"... Хочу сразу уточнить, в коде используется digitalRead, значет надо будет подключить кнопку к цифровому выходу? В данном случае к 4 и GND. ..."
.....подключить кнопку к цифровому ВХОДУ !!!!
Извеняюсь, имел ввиду к входу) Спасибо большое за помощь, вечером попробую на своем ардуино
"вывод" ножки из МК может быть и входом и выходом.... как определили его в сетапе - так дальше и называйте :) , чобы не было ошибок....
в коде нет защиты от "дребезга контактов" кнопки.... хотя - строка 28 в этом варианте и спасёт от этой напасти....
в коде нет защиты от "дребезга контактов" кнопки.... хотя - строка 28 в этом варианте и спасёт от этой напасти....
Задержка в 0.3 сек, да еще и малый шаг сводят негативный эффект дребезга к нулю.
Добрый вечер.
В продолжение управления сервоприводом кнопкой (фиксированной), образовалась проблема устаканивания начального положения сервопривода после включения МК. При подачи питания сервопривод делает резкие движения и только потом останавливается взаданном положении, а для меня это кретично. Есть ли решение, чтобы сервопривод оставался в томже положении при котором его выключели?
#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); // положение, скорость }писал в другой теме. возможно если не включать питание сервы до формирования сигнала управления, то теоретически должен остаться на месте. надо проверять
Я проверил ,если снимать питание, то действительно проблемма уходит, но у меня этот вариант не подходит. нужно отключать начальные движения программно.
програмно не получится.
при подаче питания на серву до формирования управляющего сигнал она по любому бежит в нулевую позицию.
только задержка подачи питания на серву.
сам долго мучился с этой темой, задолбал гугль, ничего не нашёл.
через релюху всё гуд.
а как ты отключишь программно? бутлоадер не дает основной программе запустится сразу
ну или затереть бутлоадер и программировать через icsp. тогда возможно решится
Загрузчик трогать-себе дороже. У меня на Меге загрузчик соскочил, теперь программы заливаю только через USB tinyISP. Буду огород городить с релюшками. Всем спасибо.
загрузчик залить вообще не проблема, нужен только программатор или вторая ардуина
Затирать не кошерно, лучше отключить фьюзом.
Еще один пин+транзистор потратить на управление питанием сервы.
он не хочет. программно хочет исправить
Залил скетч от SU-27-16 замечательно заработало ! Как раз я такое искал . Но возникла проблема как подключить 2 сервы с таким управлением. Не могу понять как указать ,что кнопки 1,2 управляют сервой 1, а 3,4- второй. И вот эту строчку победить не могу (
intangle = 0;) Надо же 2 угла и соответственно дальше по тексту.Топикстартера прошу извинить если влез не туда. Ардуиной первый месяц занимаюсь сильно не пинайтеЗалил скетч от SU-27-16 замечательно заработало ! Как раз я такое искал . Но возникла проблема как подключить 2 сервы с таким управлением. Не могу понять как указать ,что кнопки 1,2 управляют сервой 1, а 3,4- второй. И вот эту строчку победить не могу (
intangle = 0;) Надо же 2 угла и соответственно дальше по тексту.Топикстартера прошу извинить если влез не туда. Ардуиной первый месяц занимаюсь сильно не пинайтедык, создай новую тему ! со ссылкой в этой теме на новую и типа, всем тут спасибо - ушёл туда-то :)
а в новой теме ссылку - откуда ноги растут :)
Залил скетч от SU-27-16 замечательно заработало ! Как раз я такое искал
.....нано писать свой код ! а не баловство от SU-27-16
Свой код писать мне еще рано - не все же сразу, а пользовать ардуинки хочется .Создал свою тему вопросы те же- кто может помогите деду
Свой код писать мне еще рано - не все же сразу, а пользовать ардуинки хочется .Создал свою тему вопросы те же- кто может помогите деду
а ссылку на новую тему ?
Да новая тема "Изменение положения двух сервоприводов по нажатию кнопок"
http://arduino.ru/forum/programmirovanie/izmenenie-polozheniya-dvukh-servoprivodov-po-nazhatiyu-knopok