Переключение режимов сервоприводов по кнопке.

7and4ev
Offline
Зарегистрирован: 14.05.2020

Как и многие начал изучать Ардуино, и все шло хорошо пока не встал момент сделать переключение режимов сервопривода по кнопке.

Задача: 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 ("----------------");

}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А ++mode это зачем в 66 строке. Т.е. Вы постоянно меняете mode? И еще - а где Вы эту mode  устанавливаете?

Бред - пройдитесь глазами по программе и попытайтесь ее выполнить - увидите.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

7and4ev пишет:

Для кнопки нашел библиотеку у Gyver.

Тогда Вам на http://community.alexgyver.ru/. У нас тут своя библиотека для кнопки :-)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

И вообще - а чего с кнопкой сложно? Нажата кнопка - поставил флаг, что нажата. mode делаем логической и соответственно, как кнопку нажали mode= !mode;

Отжали кнопку - сняли флаг.

А Гайверовские библиотеки надо святой водой кропить и сжигать - очень много глюков.