Глючит прога

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем pasha08, 16 апр 2013.

  1. pasha08

    pasha08 Нерд

    Написал программу для своего робота, управляемого с тв пульта. В целом норм, но когда я решил сделать функцию включения/выключения заметил глюк. Если выключить и понажимать кнопки движения на пульте, то включается не с первого раза, а с первой попытки просто дергается.
    Вот, собственно, код:
    Код (Text):
    #include <Servo.h>
    #include <IRremote.h>
    Servo myservo1;
    Servo myservo2;
    int cycle = 2;
    int ugol = 90;
    boolean servo = myservo1.attached();
    int RECV_PIN = 11;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
     
    void setup()
    {
      myservo1.attach(9);
      myservo2.attach(6);
     
      irrecv.enableIRIn(); // Start the receiver
    }
     
    void loop() {
      if (irrecv.decode(&results)) {
        unsigned long value = results.value;
        switch(value)
        {
        case 2223303699:
          if(servo = true)
          {
            ugol = 170;
            myservo1.write(170);
          }
          break;
        case 2223271059:
          if(servo = true)
          {
            ugol = 0;
            myservo1.write(0);
          }
          break;
        case 2223250659:
          if(servo = true)
          {
            ugol = 90;
            myservo1.write(90);
          }
          break;
        case 2223290439:
          myservo2.writeMicroseconds(1750);
          delay(600);
          myservo2.writeMicroseconds(1500);
          delay(500);
          break;
        case 2223252699:
          if(cycle == 2)
          {
            myservo1.detach();
            myservo2.detach();
            --cycle;
          }
          else
          {
            myservo1.attach(9);
            myservo2.attach(6);
            myservo1.write(ugol);
            ++cycle;
          }
          break;
     
        }
     
     
        irrecv.resume(); // Receive the next value
      }
    }
     
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Подозреваю, что сервы питаются прямо от ардуины. При включении они просаживают питание и плата перезагружается. Об этом можно судить по помигиванию светодиода L13.

    В этом дело?
     
  3. pasha08

    pasha08 Нерд

    Мимо, товарищ) Сервы отдельно
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Не вызывайте функцию при объявлении переменной, делайте это в setup().
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Эх :)

    2223252699 — это вкл/выкл я так понимаю?! Так вот, при выключении вы делаете `myservo.detach`. Затем при нажатии кнопок направления вы вызываете `myservo.writeMicroseconds` по сути на детачнутую серву. Я, если честно на вскидку вообще не понимаю почему возникает какая-то реакция. Вы проверяете значение булевой переменной `servo`, но при этом его никак не изменяете: выставляете единожды в начале программы. Я не пойму что вы этим хотели добиться. Быть может вы имели в виду:

    Код (Text):

    case 2223252699:
     if(cycle == 2)
     {
    myservo1.detach();
    myservo2.detach();
    servo = false; // вот...
    --cycle;
     }
     else
     {
    myservo1.attach(9);
    myservo2.attach(6);
    myservo1.write(ugol);
    servo = true; // ...и вот
    ++cycle;
     }
     break;
     
    ?
     
  6. pasha08

    pasha08 Нерд

    Да, спасибо, это и имел ввиду, сегодня проверю. Я раньше с функцией attached не работал, вот и сделал ошибку)
     
  7. pasha08

    pasha08 Нерд

    Спасибо, заработало! Только мне пришлось еще в самой программе кое что подправить, я оператор сравнения неправильно написал)