Поворот сервопривода в зависимости от нажатия двух кнопок
- Войдите на сайт для отправки комментариев
Втр, 20/09/2016 - 11:54
Всем привет! Собрался делать довольно большой проект на ардуино, но не особо пока в теме. Сервопривод должен переходить из состояния 0 градусов(первое положение) в 45(второе положение), потом в 90(третье положение). То есть у него 3 положения. Сначала он в первом. У меня 2 кнопки: при нажатии первой он должен повернуться во второе, при повторном нажатии в третье, при ещё одном во второе, то есть первая кнопка переключает 2й и 3й режим, а вторая кнопка сбрасывает из любого положения в первое положение. Я хотел использовать счётчик, но почему-то он не работает. Серво кряхтит, но то поворачивается на 90 сразу, то никуда, то в 45, а потом кряхтит... Вот мой код:
#include <Servo.h> //объявляем переменную порта int portServ = 9; int portBut1 = 2; int portBut2 =4; int portLed = 13; int firstPos = 0;//первое положение сервы int partblock=45; //второе положение int block=90; //третье положение int counter=0; //счетчик Servo myservo; boolean lastButton1=LOW; boolean currentButton1 = LOW; boolean lastButton2=LOW; boolean currentButton2 = LOW; boolean ledOn1=false; void setup() { // put your setup code here, to run once: myservo.attach(portServ); //attach our servo to the port 9 myservo.write(0); pinMode(portBut1, INPUT); pinMode(portBut2, INPUT); pinMode(portLed, OUTPUT); } boolean debounce (boolean last, int button) //функция, где мы устраняем дребезг //передаём последнее значение нажата ли кнопка. { boolean current = digitalRead(button); //считываем текущее значение кнопки if (last!=current) //если значение последнего состояния кнопки не совпадает с текущим { delay(5); //ждём 5 мс, это мало, но хватит, чтобы кнопка узбагоилась current = digitalRead(button); //текущему значению присваеваем считываемое состояние кнопки } return current;//возвращаем текущее значение, вроде как то что мы чётко считали } void loop() { counter=0; start: currentButton1=debounce(lastButton1,portBut1); currentButton2=debounce(lastButton2,portBut2); counter=counter+1; if(currentButton1==HIGH&&counter%2==0)//нечётный счетчик { { ledOn1= !ledOn1; } digitalWrite(portLed, ledOn1); //собственно взаимодействие с диодом myservo.write(partblock); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position lastButton1=currentButton1; //ну и наш настояший превратился в бывшего lastButton2=currentButton2; //ну и наш настояший превратился в бывшего goto start; } if(currentButton1==HIGH&&counter%2!=0) { { ledOn1= !ledOn1; } digitalWrite(portLed, ledOn1); //собственно взаимодействие с диодом myservo.write(block); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position lastButton1=currentButton1; //ну и наш настояший превратился в бывшего lastButton2=currentButton2; //ну и наш настояший превратился в бывшего goto start; } if(currentButton2==HIGH) { myservo.write(firstPos); counter=0; lastButton1=currentButton1; //ну и наш настояший превратился в бывшего lastButton2=currentButton2; //ну и наш настояший превратился в бывшего goto start; } else {} lastButton1=currentButton1; //ну и наш настояший превратился в бывшего lastButton2=currentButton2; //ну и наш настояший превратился в бывшего }
заведите переменную, определяющую в каком состоянии находится ваша система, например state=0;
и научитесь кнопками менять её значения с выводом в Serial
а уже потом прилепите сервы и углы их поворота
Я пробовал Serial.println, (почему-то как в джаве!), но не пойму, куда выведется?(
Я пробовал Serial.println, (почему-то как в джаве!), но не пойму, куда выведется?(
вы бы на ютубе хоть ролике по азам программирования дуни посмотрели)))
Выводит в сериал порт. В ардуино иде есть пункт в меню "монитор порта" по моему, вот туда и шлет зараза....
Я только там и сижу. А ещё сижу в универе на программиста... то есть по коду видно, что совсем всё плохо?..
строка 66
if
(currentButton1==HIGH&&counter%2!=0)
наверное правильней
if
(currentButton1==HIGH&&counter%2!==0)
вы же все таки сравниваете, а не присваиваете.
А что, разве в нашиз ВУЗАХ программистам не выжигают из мозга оператор GOTO? Согласен его можно использовать в каких-то моментах, но не в такой же программе.
строка 66
if
(currentButton1==HIGH&&counter%2!=0)
наверное правильней
if
(currentButton1==HIGH&&counter%2!==0)
Не правильнее, посмотрите оператор !=
Чтобы в сериал писал в сетапе напишите Serial.begin (9600);
Виноват, извиняюсь, что внес смуту. ! Не заметил.