Переключение режимов сервоприводов по кнопке.
- Войдите на сайт для отправки комментариев
Как и многие начал изучать Ардуино, и все шло хорошо пока не встал момент сделать переключение режимов сервопривода по кнопке.
Задача: 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;
Отжали кнопку - сняли флаг.
А Гайверовские библиотеки надо святой водой кропить и сжигать - очень много глюков.