Переключение режимов сервоприводов по кнопке.
- Войдите на сайт для отправки комментариев
Как и многие начал изучать Ардуино, и все шло хорошо пока не встал момент сделать переключение режимов сервопривода по кнопке.
Задача: 2 сервопривода - работают постоянно (left,right), 1 - сервопривод (up) меняет угол отталкиваясь от значения джойстика n1.По переключению кнопки автоматическая работа 2 сервоприводов переходит в ручное управление, работают согласованно по джойстику n2.
Проблема: Использовал оператора Switch, но при переключении сценарий для (left, right) срабатывает только один раз, (видимо из-за значения break), добавления условий While и If внутри "void task_1()" никаких результатов не дали.
Для кнопки нашел библиотеку у Gyver.
Прошу помочь с разрешением задачи, потому что при решении написать свою кнопку без библиотеки Gyver все становится только хуже и сложнее((
#include <Servo.h>
#define PIN A2 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define MODE_AM 1 // количество режимов (от 0 до указанного)
#include "GyverButton.h" // библиотека для более удобной работы с кнопкой
const int servo1 = 9; // первая серва
const int servo2 = 8; // вторая серва
const int servo3 = 6;
const int joyH = 0; // выход L/R джойстика Parallax
const int joyV = 5; // выход U/D джойстика Parallax
int rs=5; // хранение данных с порта 5
int servoVal; // переменная для хранения данных с аналогового пина
GButton butt1(PIN); // создаём нашу "кнопку"
byte mode = 0; // переменная режима
Servo left; // создаем объект Servo для управления первой сервой
Servo right; // создаем объект Servo для управления второй сервой
Servo up;
void setup() {
Serial.begin(9600); // Инициализация серийного протокола связи
// Servo
left.attach(servo1); // подключаем серву
right.attach(servo2); // подключаем серву
up.attach(servo3);
}
void loop() {
rs=analogRead(joyV); // считывает переменные с джойстика
Serial.println(rs); //вывод данных с джойстика в COM порт
outputJoystick(); // отображаем значения с джойстика с использованием серийного монитора
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
if (butt1.isPress()) { // правильная отработка нажатия с защитой от дребезга
if (++mode >= MODE_AM) mode = 0; // увеличиваем переменную номера режма. Если вышла за количество режимов - обнуляем
// всё переключение в итоге сводится к оператору switch
// переключение и вызов происходит только при нажатии!!!
switch (mode) {
case 0: task_0();
break;
case 1: task_1();
break;
}
}
}
// наши задачи, внутри функций понятное дело может быть всё что угодно
void task_0() {
Serial.println("Task 0");
servoVal = analogRead(joyH);// считываем значение с джойстика по горизонтали (значение между 0 и 1023)
servoVal = map(servoVal, 0, 1023, -360, 360); // масштабируем полученное значение для использования с серводвигателем (результат возвращается в диапазоне от 0 до 180)
up.write(servoVal); // выводим ротор сервы в положение в соответствии с полученным масштабированным значением
servoVal = analogRead(joyV);// считываем значение джойстика вдоль вертикальной оси (значение от 0 до 1023)
servoVal = map(servoVal, 0, 1023, -360, 360); //масштабируем полученное значение для использования с сервой (диапазон: от 70 до 180)
left.write(servoVal); // выводим ротор второй сервы в соответствии с полученным масштабированным значением
servoVal = analogRead(joyV);
servoVal = map(servoVal, 0, 1023, -360, 360); //масштабируем полученное значение для использования с сервой (диапазон: от 70 до 180)
right.write(servoVal); // выводим ротор второй сервы в соответствии с полученным масштабированным значением
delay(15); // ждем, пока серва обеспечит заданное положение
}
е {
Serial.println("Task 1");
left.write(0);
right.write (0);
delay(500);
left.write(180);
right.write(180);
delay(500);
}
/**
отображаем значения джойстика
*/
void outputJoystick() {
Serial.print(analogRead(joyH));
Serial.print ("---");
Serial.print(analogRead(joyV));
Serial.println ("----------------");
}
А ++mode это зачем в 66 строке. Т.е. Вы постоянно меняете mode? И еще - а где Вы эту mode устанавливаете?
Бред - пройдитесь глазами по программе и попытайтесь ее выполнить - увидите.
Для кнопки нашел библиотеку у Gyver.
Тогда Вам на http://community.alexgyver.ru/. У нас тут своя библиотека для кнопки :-)
И вообще - а чего с кнопкой сложно? Нажата кнопка - поставил флаг, что нажата. mode делаем логической и соответственно, как кнопку нажали mode= !mode;
Отжали кнопку - сняли флаг.
А Гайверовские библиотеки надо святой водой кропить и сжигать - очень много глюков.