Ардуино , Joystick Shield V1.a , 6 серво двигателей

Тема в разделе "Arduino & Shields", создана пользователем чувачелла228, 17 янв 2018.

  1. Код (C++):
    #include<Servo.h>
    Servo myservo1;
    Servo myservo2;
    Servo myservo3;
    Servo myservo4;
    Servo myservo5;
    Servo myservo6;
    int axis_1=0;
    int axis_2=0;
    boolean axe_1_FM=0, axe_1_SM=0, axe_1_SP=0, axe_1_FP=0;
    boolean axe_2_FM=0, axe_2_SM=0, axe_2_SP=0, axe_2_FP=0;
    void setup() {
    Serial.begin(9600);
    myservo1.attach(9);
    myservo2.attach(10);
    myservo1.attach(11);
    myservo2.attach(12);
    myservo1.attach(13);
    myservo2.attach(8);
    }
    void loop() {
    axis_1=analogRead(0);
    axis_2=analogRead(1);
    if ((axis_1>=0) & (axis_1<=50)) {axe_1_FM=1; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}
    else  {if (axis_1<=412) {axe_1_FM=0; axe_1_SM=1; axe_1_SP=0; axe_1_FP=0;}
    else {if (axis_1<=612) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}
    else {if (axis_1<=980) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=1; axe_1_FP=0;}
    else {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=1;}
    }
    }
    }
    if ((axis_2>=0) & (axis_2<=50)) {axe_2_FM=1; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}
    else  {if (axis_2<=412) {axe_2_FM=0; axe_2_SM=1; axe_2_SP=0; axe_2_FP=0;}
    else {if (axis_2<=612) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}
    else {if (axis_2<=980) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=1; axe_2_FP=0;}
    else {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=1;}
    }
    }
    }
      Serial.print("Axe 1=");
      Serial.print(axe_1_FM,DEC);
      Serial.print(axe_1_SM,DEC);
      Serial.print(axe_1_SP,DEC);
      Serial.print(axe_1_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_1,DEC);
      Serial.print("  #####  ");

      Serial.print(axe_2_FM,DEC);
      Serial.print(axe_2_SM,DEC);
      Serial.print(axe_2_SP,DEC);
      Serial.print(axe_2_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_2,DEC);
      Serial.println(" ");
    delay (150);
    }
    пожалусто помогите сделать скетч чтобы когда я нажимал на 1 кнопку и двигал джостиком по оси X и Y двигались 2 серво привода по отдельности нажимаю 2 кнопку двигаются другие 2 серво привода по оси X и Y 3 кнопку нажимаю и двигается 1 серво привод нажимаю 4 кнопку 6-той серво двигатель с 0 до 180 если еще раз нажимаю опять на 0 и чтобы отодвигаю джостик по чуть чуть он двигался со скоростью
    Вот есть скетч от него отталкиваюсь:

    ЗАРАНИЕ СПАСИБО
     
    Последнее редактирование: 17 янв 2018
  2. DIYMan

    DIYMan Guest

    Вставьте код правильно, плз. Для вставки кода есть кнопочка "<>" на панели инструментов редактора кода.
     
  3. DIYMan

    DIYMan Guest

    Если я правильно понял - вам надо ввести в код опрос кнопок, и в зависимости от нажатия той или иной кнопки активировать тот или иной сервопривод? При этом - одновременно активен к управлению джойстиком только один сервопривод, так?

    Если я всё правильно понял, то в псевдокоде (т.е. демонстрация работы алгоритма) ваша задача решается так:

    Код (C++):
    enum
    {
        NoServo,
        Servo1,
        Servo2,
        ...
        ServoN
    };

    int currentServo = NoServo; // каким сервоприводом управляем
    Button button1, button2; // наши кнопки

    void detachServo(int servoNum)
    {
        if(servoNum == NoServo || servoNum == currentServo)
            return;
       
        // тут что-то делаем с нужной сервой
    }

    void loop()
    {
        if(button1.isClicked()) // если нажата кнопка 1
        {
            detachServo(currentServo); // возвращаем последнюю серву, если надо, в исходную позицию
            currentServo = Servo1; // говорим, что рулим первой сервой
        }
        else if(button2.isClicked()) // если нажата кнопка 2
        {
                detachServo(currentServo);
                currentServo = Servo2;
        }
       
        if(currentServo != NoServo)
        {
            // тут рулим нужной сервой c джойстика
            switch(currentServo)
            {
                case Servo1:
                    // двигаем первую серву
                break;
               
                case Servo2:
                    // двигаем вторую серву
                break;
            }
        }
    }
     
     
  4. вопросик а он по скорости
    мне просто нужно чтобы джостик отодвинулся и серво с определенной скоростью до крайнего положения ехала
     
  5. DIYMan

    DIYMan Guest

    В этом случае определяете, что "джостик отодвинулся" (т.е. какие-то граничные значения с него получаете, и понимаете - вот, джойстик отодвинулся), затем простой арифметикой: допустим, у вас серву надо сдвинуть с текущей позиции (0 градусов), на позицию 180 градусов за 10 секунд. Соответственно, простейшим уравнением вы вычисляете, через какие промежутки времени надо менять позицию сервы на 1 градус, чтобы за 10 секунд она проехала все 180 градусов.
     
  6. у меня есть эти значения:
    до 412 от не реагирует с 412 до 612 маленькая скорость
    от 612 до 980 быстрая скорость
     
  7. до 412 не реагирует с 412 до 612 маленькая скорость
    от 612 до 980 быстрая скорость
     
  8. Код (C++):
    int axis_1=0;
    int axis_2=0;
    boolean axe_1_FM=0, axe_1_SM=0, axe_1_SP=0, axe_1_FP=0;
    boolean axe_2_FM=0, axe_2_SM=0, axe_2_SP=0, axe_2_FP=0;

    void setup() {
      Serial.begin(9600);

      }

    void loop() {
    axis_1=analogRead(0);
    axis_2=analogRead(1);
        if ((axis_1>=0) & (axis_1<=50)) {axe_1_FM=1; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}
          else  {if (axis_1<=412) {axe_1_FM=0; axe_1_SM=1; axe_1_SP=0; axe_1_FP=0;}

            else {if (axis_1<=612) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}

               else {if (axis_1<=980) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=1; axe_1_FP=0;}
                                 
                  else {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=1;}

    }
    }
    }

    if ((axis_2>=0) & (axis_2<=50)) {axe_2_FM=1; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}
          else  {if (axis_2<=412) {axe_2_FM=0; axe_2_SM=1; axe_2_SP=0; axe_2_FP=0;}

           else {if (axis_2<=612) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}

             else {if (axis_2<=980) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=1; axe_2_FP=0;}
                                 
               else {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=1;}

    }
    }
    }
      if(digitalRead(ButPin1))
    {
        val = axis_1;


        val = (axis_2);

    }


      Serial.print("Axe 1=");
      Serial.print(axe_1_FM,DEC);
      Serial.print(axe_1_SM,DEC);
      Serial.print(axe_1_SP,DEC);
      Serial.print(axe_1_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_1,DEC);
      Serial.print("   #####   ");

      Serial.print(axe_2_FM,DEC);
      Serial.print(axe_2_SM,DEC);
      Serial.print(axe_2_SP,DEC);
      Serial.print(axe_2_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_2,DEC);
      Serial.println(" ");
    delay (150);
    }
     
  9. нужно что бы эта часть скетча была в программе
     
  10. а вы можете сделать чтобы были 6 переменных серво двигателей в этой программе
    Код (C++):
    #include<Servo.h>
    Servo myservo1;
    Servo myservo2;
    Servo myservo3;
    Servo myservo4;
    Servo myservo5;
    Servo myservo6;
    int axis_1=0;
    int axis_2=0;
    boolean axe_1_FM=0, axe_1_SM=0, axe_1_SP=0, axe_1_FP=0;
    boolean axe_2_FM=0, axe_2_SM=0, axe_2_SP=0, axe_2_FP=0;
    void setup() {
    Serial.begin(9600);
    myservo1.attach(9);
    myservo2.attach(10);
    myservo1.attach(11);
    myservo2.attach(12);
    myservo1.attach(13);
    myservo2.attach(8);
    }
    void loop() {
    axis_1=analogRead(0);
    axis_2=analogRead(1);
    if ((axis_1>=0) & (axis_1<=50)) {axe_1_FM=1; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}
    else  {if (axis_1<=412) {axe_1_FM=0; axe_1_SM=1; axe_1_SP=0; axe_1_FP=0;}
    else {if (axis_1<=612) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=0;}
    else {if (axis_1<=980) {axe_1_FM=0; axe_1_SM=0; axe_1_SP=1; axe_1_FP=0;}
    else {axe_1_FM=0; axe_1_SM=0; axe_1_SP=0; axe_1_FP=1;}
    }
    }
    }
    if ((axis_2>=0) & (axis_2<=50)) {axe_2_FM=1; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}
    else  {if (axis_2<=412) {axe_2_FM=0; axe_2_SM=1; axe_2_SP=0; axe_2_FP=0;}
    else {if (axis_2<=612) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=0;}
    else {if (axis_2<=980) {axe_2_FM=0; axe_2_SM=0; axe_2_SP=1; axe_2_FP=0;}
    else {axe_2_FM=0; axe_2_SM=0; axe_2_SP=0; axe_2_FP=1;}
    }
    }
    }
      Serial.print("Axe 1=");
      Serial.print(axe_1_FM,DEC);
      Serial.print(axe_1_SM,DEC);
      Serial.print(axe_1_SP,DEC);
      Serial.print(axe_1_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_1,DEC);
      Serial.print("  #####  ");

      Serial.print(axe_2_FM,DEC);
      Serial.print(axe_2_SM,DEC);
      Serial.print(axe_2_SP,DEC);
      Serial.print(axe_2_FP,DEC);
      Serial.print("  ");
      Serial.print(axis_2,DEC);
      Serial.println(" ");
    delay (150);
    }