Поворот сервы

Тема в разделе "Arduino & Shields", создана пользователем stepan977, 24 янв 2014.

  1. stepan977

    stepan977 Нуб

    Помоги пожалуйста справиться с проблемой . Как должна выглядеть программа для того чтобы при нажатии(удержание) кнопки ,серва поворачивалась , а когда кнопку отпускали серва останавливалась . и так же в обраную сторону ,но уже с использованием другой кнопки . У меня в программе получаеться , что при нажати на кнопку серва поворачиваеться на определенный градус и все .
    Код (Text):
    #include <Servo.h>

    #include <IRremote.h>

    unsigned long Value1 = 0xECE16110;

    unsigned long Value2 = 0xB8FBED4A;

    unsigned long Value3 = 0x32D390AC;

    unsigned long Value4 = 0x13D1970;

    unsigned long Value5 = 0x7EBDC4EA;

    unsigned long Value6 = 0x37E8B354;


    int RECV_PIN = 11; //вход ИК приемника

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    Servo sg90;
    Servo mg995_1;
    Servo mg995_2;
    int pos = 0;
    int var = 0;

    void setup() {

    irrecv.enableIRIn(); // включить приемник

    sg90.attach(3); // серво подключён на цифровой вход pin 10
    mg995_1.attach(4);
    mg995_2.attach(5);

    }


       
    void loop() {

       
    if (irrecv.decode(&results)) {

    irrecv.resume();

    }

    //для 1 сервы
    if(results.value == Value1){
     
    sg90.attach(5);

    }
    else if(results.value == Value4){
     
    sg90.write(5);
                                                    //for(pos =180; pos>=1; pos-=1)  
    }                                            // {                              
                                              // sg90.write(pos);            
                                                // delay(15);                                                                  // }
    //для сервы 2
    else if(results.value == Value2){

    mg995_1.attach(10);
    }

    else if(results.value == Value5){

    mg995_1.write(80);
    }

    //для сервы 3

    else if(results.value == Value3){

    mg995_2.attach(70);
    }
    else if(results.value == Value6){

    mg995_2.write(160);
    }
    }while (var < 100);
    }
     
     
  2. Unixon

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

    Код (Text):

    #include <Servo.h>
    #include <IRremote.h>

    typedef long int ir_cmd_t;

    const ir_cmd_t CMD_TURN_S1_LEFT  = 0xECE16110;
    const ir_cmd_t CMD_TURN_S1_RIGHT = 0xB8FBED4A;
    const ir_cmd_t CMD_TURN_S2_LEFT  = 0x32D390AC;
    const ir_cmd_t CMD_TURN_S2_RIGHT = 0x013D1970;
    const ir_cmd_t CMD_TURN_S3_LEFT  = 0x7EBDC4EA;
    const ir_cmd_t CMD_TURN_S3_RIGHT = 0x37E8B354;

    const int PIN_IR_RECV = 11; //вход ИК приемника

    const int MIN_ANGLE = 0;
    const int MAX_ANGLE = 180;
    const int DEFAULT_ANGLE = 90;

    const int CTL_POLL_DELAY = 100;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    Servo sg90;
    Servo mg995_1;
    Servo mg995_2;

    int srv_pos_1 = 90;
    int srv_pos_1 = 90;
    int srv_pos_1 = 90;

    bool state_changed = false;

    void setup()
    {
     irrecv.enableIRIn(); // включить приемник
     sg90.attach(3); // серво подключён на цифровой вход pin 10
     mg995_1.attach(4);
     mg995_2.attach(5);
    }


    void loop()
    {
     if (irrecv.decode(&results)) irrecv.resume();
     else { delay(CTL_POLL_DELAY); return; }

     switch (results.value)
     {
      case CMD_TURN_S1_LEFT:
      {
       if (srv_pos_1 > MIN_ANGLE) srv_pos_1--;
       state_changed = true;
       break;
      }
      case CMD_TURN_S1_RIGHT:
      {
       if (srv_pos_1 < MAX_ANGLE) srv_pos_1++;
       state_changed = true;
       break;
      }
      case CMD_TURN_S2_LEFT:
      {
       if (srv_pos_2 > MIN_ANGLE) srv_pos_2--;
       state_changed = true;
       break;
      }
      case CMD_TURN_S2_RIGHT:
      {
       if (srv_pos_2 < MAX_ANGLE) srv_pos_2++;
       state_changed = true;
       break;
      }
      case CMD_TURN_S3_LEFT:
      {
       if (srv_pos_3 > MIN_ANGLE) srv_pos_3--;
       state_changed = true;
       break;
      }
      case CMD_TURN_S3_RIGHT:
      {
       if (srv_pos_3 < MAX_ANGLE) srv_pos_3++;
       state_changed = true;
       break;
      }
     }

     if (state_changed)
     {
      sg90.write(srv_pos_1);
      mg995_1.write(srv_pos_2);
      mg995_2.write(srv_pos_3)
     }

     delay(CTL_POLL_DELAY);
    }