ИК управление мотор шилдом L293D на 4 двигателя.

Тема в разделе "Arduino & Shields", создана пользователем Torresok, 17 июл 2015.

  1. Torresok

    Torresok Нуб

    Мужики, выручайте! Имеется моторшилд на 4 двигателя на L293D. Есть скетч для управления всем этим делом, но с ним что-то не так. При заливке скетча работает корректно только одна кнопка, остальные только выводятся в монитор порта. Если вместо операторов else вставляю delay, то все работает. Помогите, пожалуйста, разобраться. (требуется, чтобы при нажатии кнопки двигатель крутился, при повторном нажатии останавливался).

    #include <AFMotor.h>
    #include <IRremote.h>

    int RECV_PIN = 14;

    AF_DCMotor motor_a(1, MOTOR12_64KHZ);
    AF_DCMotor motor_b(2, MOTOR12_64KHZ);
    AF_DCMotor motor_c(3, MOTOR12_64KHZ);
    AF_DCMotor motor_d(4, MOTOR12_64KHZ);

    IRrecv irrecv(RECV_PIN);


    decode_results results;

    void setup()
    {
    Serial.begin(9600);
    irrecv.enableIRIn();
    motor_a.setSpeed(255);
    motor_b.setSpeed(255);
    motor_c.setSpeed(255);
    motor_d.setSpeed(255);
    // motor_a.run(RELEASE);
    // motor_b.run(RELEASE);
    // motor_c.run(RELEASE);
    // motor_d.run(RELEASE);
    }
    void loop()
    {
    if (irrecv.decode(&results))
    {

    Serial.println(results.value);
    Serial.println(results.value,HEX);
    Serial.println("====");

    if (results.value == 16771605) //мотор(а) вперед
    {
    Serial.println("vverhlev");
    motor_a.run(FORWARD);
    }
    else
    {
    motor_a.run(RELEASE);
    }
    if (results.value == 16755285) //мотор(б) вперед
    {

    Serial.println("sgiblev");
    motor_b.run(FORWARD);
    }
    else
    {
    motor_b.run(RELEASE);
    }
    if (results.value == 16767525)//мотор(с) вперед
    {
    Serial.println("vverhprav");
    motor_c.run(FORWARD);
    }
    else
    {
    motor_c.run(RELEASE);
    }
    if (results.value == 16751205)//мотор(д) вперед
    {
    Serial.println("sgibprav");
    motor_d.run(FORWARD);
    }
    else
    {
    motor_d.run(RELEASE);
    }

    if (results.value == 16738965) //мотор(а) назад
    {
    Serial.println("vnizlev");
    motor_a.run(BACKWARD);
    }
    else
    {
    motor_a.run(RELEASE);
    }
    if (results.value == 16722645) //мотор(б) назад
    {
    Serial.println("razgiblev");
    motor_b.run(BACKWARD);
    }
    else
    {
    motor_b.run(RELEASE);
    }
    if (results.value == 16734885) //мотор(с) назад
    {
    Serial.println("vnizprav");
    motor_c.run(BACKWARD);
    }
    else
    {
    motor_c.run(RELEASE);
    }
    if (results.value == 16718565)
    {
    Serial.println("razgibprav");//мотор(д) назад
    motor_d.run(BACKWARD);
    }
    else
    {
    motor_d.run(RELEASE);
    }

    irrecv.resume();
    }
    }
     
  2. Limoney

    Limoney Гик

    Вместо if пользуйтесь case
    Код (Text):

    if (irrecv.decode(&results)) {
        switch (results.value) {
          case 16771605: { //мотор(а) вперед
              Serial.println("vverhlev");
              motor_a.run(FORWARD);
              break;
          }
          case code IR ???: {  // вместо else
              motor_a.run(RELEASE);  
              break;
          }
          case 16755285: {  //мотор(б) вперед
              Serial.println("sgiblev");
              motor_b.run(FORWARD);
              break;
          }
            case code IR ???: {  //  вместо else  
                motor_b.run(RELEASE);
        }
    }
     
     
  3. Torresok

    Torresok Нуб

    спасибо! сейчас попробую!
     
  4. Torresok

    Torresok Нуб

    Переписал код, но компилятор начал ругаться. Подскажите, пожалуйста, что не так?
    #include <AFMotor.h>
    #include <IRremote.h>

    int RECV_PIN = 14;

    AF_DCMotor motor_a(1, MOTOR12_64KHZ);
    AF_DCMotor motor_b(2, MOTOR12_64KHZ);
    AF_DCMotor motor_c(3, MOTOR12_64KHZ);
    AF_DCMotor motor_d(4, MOTOR12_64KHZ);

    IRrecv irrecv(RECV_PIN);


    decode_results results;

    void setup()
    {
    Serial.begin(9600);
    irrecv.enableIRIn();
    motor_a.setSpeed(255);
    motor_b.setSpeed(255);
    motor_c.setSpeed(255);
    motor_d.setSpeed(255);
    motor_a.run(RELEASE);
    motor_b.run(RELEASE);
    motor_c.run(RELEASE);
    motor_d.run(RELEASE);
    }
    void loop()
    {
    if (irrecv.decode(&results))
    {
    switch (results.value)
    Serial.println(results.value);
    Serial.println(results.value,HEX);
    Serial.println("====");
    {
    case 0x20DF8877:
    {
    Serial.println("vverhlev");
    motor_a.run(FORWARD);
    break;
    }
    case 20DF8877:
    {
    motor_a.run(RELEASE);
    break;
    }
    case 20DF48B7: //мотор(б) вперед
    {

    Serial.println("sgiblev");
    motor_b.run(FORWARD);
    break;
    }
    case 20DF48B7:
    {
    motor_b.run(RELEASE);
    break;
    }
    case 20DFC837: //мотор(с) вперед
    {
    Serial.println("vverhprav");
    motor_c.run(FORWARD);
    break;
    }
    case 20DFC837:
    {
    motor_c.run(RELEASE);
    break;
    }
    case 20DF28D7: //мотор(д) вперед
    {
    Serial.println("sgibprav");
    motor_d.run(FORWARD);
    break;
    }
    case 20DF28D7:
    {
    motor_d.run(RELEASE);
    break;
    }

    case 20DFA857: //мотор(а) назад
    {
    Serial.println("vnizlev");
    motor_a.run(BACKWARD);
    break;
    }
    case 20DFA857:
    {
    motor_a.run(RELEASE);
    break;
    }
    case 20DF6897: //мотор(б) назад
    {
    Serial.println("razgiblev");
    motor_b.run(BACKWARD);
    break;
    }
    case 20DF6897;
    {
    motor_b.run(RELEASE);
    break;
    }
    case 20DFE817: //мотор(с) назад
    {
    Serial.println("vnizprav");
    motor_c.run(BACKWARD);
    break;
    }
    case 20DFE817:
    {
    motor_c.run(RELEASE);
    break;
    }
    case 20DF18E7:
    {
    Serial.println("razgibprav");//мотор(д) назад
    motor_d.run(BACKWARD);
    break;
    }
    case 20DF18E7:
    {
    motor_d.run(RELEASE);
    break;
    }

    irrecv.resume();
    }
    }