Поворот сервопривода в зависимости от нажатия двух кнопок
- Войдите на сайт для отправки комментариев
Втр, 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);
Виноват, извиняюсь, что внес смуту. ! Не заметил.