Ребят вот код! только он работает не так как нужно! А именно так! Две кнопки и серво, нажимаю на кнопку и серво крутит в одну сторону, нажимаю на другую кнопку, в обратную....вот только приходится держать кнопку постоянно до определённого угла!!! Что тут дописать или что тут убрать нужно, что бы серво крутилась от простого нажатия на кнопку на уже заданный заранее угол и не держать кнопку постоянно нажатой! P.S. новичок, и пока теряюсь в коде!!( Код (C++): #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); // подождем перед следующим опросом }
Код (C++): #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 // шаг поворота сервы, в градусах #define BUTTON_PRESSED(pin) (!digitalRead(pin)) // макрос для удобства чтения кода Servo myServo; int minAngle = 0; //предельный угол int maxAngle = 180; //предельный угол int angle; //угол поворота void setup() { myServo.attach(ServoPin); myServo.write(angle); //состояние после включения pinMode(BUT_1, INPUT_PULLUP); //для считывания состояний кнопок + внутренняя подтяжка pinMode(BUT_2, INPUT_PULLUP); //для считывания состояний кнопок + внутренняя подтяжка } void loop() { angle = 222; if (BUTTON_PRESSED(BUT_1)) angle = minAngle; //если первая кнопка увеличим угол if (BUTTON_PRESSED(BUT_2)) angle = maxAngle; //если вторая уменьшим if (angle != 222) // крутим серву только если была нажата кнопка { if (angle > 180) angle = 180; //ограничим угол сервы 0..180 if (angle < 0) angle = 0; myServo.write(angle); // задаем получившийся угол delay(800); // подождем перед следующим опросом } }
Так это получается..я нажал она повернулась, отпустил вернулась на место? Так то нужно что бы нажал отпустил она повернулась на угол ,примерно 45град. ... и там осталась до тех пор пока я не нажму на другую кнопку
А както так не получится? Код (C++): if ( ! digitalRead(BUT_1)) { wail (angle == minAngle){//ждем пока не дойдем до minAngle angle=+step; (angle<0)? angle=0: (angle>180)? angle=180: angle=angle;//проверка выхода за диапазон myServo.write(angle); //задаем получившийся угол delay(300); // подождем перед следующим опросом } //если первая кнопка увеличим угол } А вообще нужно функцию написать в которую передавать угол и шаг, а она сама серву будет устанавливать и избавится от delay. Сырой пример Код (C++): void servo (int angle, int step){ byte state; wail (state == angle){//ждем пока не дойдем до 45 state=+step; myServo.write(state); //задаем получившийся угол delay(300); // подождем перед следующим опросом } }
Не ну круто круто....вот только я ещё сам "сыроват" в коде...и как это скрестить с моим примером ?..я не знаю..честно(
Я сам с сервами не работал, не приходилось. Вот код напишите рабочий, а потом можно будет посмотреть как его упростить и какие функции написать.