IR приёмник, контролирование двигателя.

Тема в разделе "Закажу проект", создана пользователем komalov, 7 дек 2014.

  1. komalov

    komalov Нуб

    Здравствуйте . Я подключил IR приёмник к ардуино и всё было хорошо,пока я не захотел сделать программу, в которой ,если кнопка на пульте зажата то двигатель крутится,когда она не зажата он останавливается.Ведь пуль при передачи сигнала если кнопка зажата сначала один раз передаёт код кнопки а потом стандартный код о её залипании.Помогите пожалуйста реализовать такую программу.
    Вот всё что смог сделать я ,но в данном случае двигатель работает небольшими рывками ,они не заметны но на движение повлиять могут.Двигатель включаю через транзистор.


    #include <IRremote.h>

    int RECV_PIN = 3;//Контакт IR приёмника
    int motor = 5;
    unsigned long n; // переменная запоминающая предыдущий сигнал с пульта
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
    pinMode(motor,OUTPUT);
    irrecv.enableIRIn(); // Включаем ресивер

    }
    void loop()
    {
    if (irrecv.decode(&results))
    { if (results.value != 4294967295)//1641415931 - сигнал кнопки;4294967295-сигнал о залипании кнопки;
    {n =results.value; if (results.value == 1641415931)
    {digitalWrite(motor,HIGH);}
    else {digitalWrite(motor,LOW);}
    }
    else {if (n == 1641415931){digitalWrite(motor,HIGH);}}

    delay(50);
    irrecv.resume();
    delay(50); }
    else{digitalWrite(motor,LOW); }//Если сигнала небыло выключаю мотор;
    }
     
  2. Salk

    Salk Гик

    Ну начнем с того, что код лучше отформатировать, в самом скетче нажмите кнопки ctr+T. Так код будет более читабельным и понятным.
    Во вторых вы не везде прописали переменную n, в которой хранится правильный код кнопки пульта при зажатии.
    В третьих зачем столько else? И зачем нужна задержка, которая два раза повторяется?
    В целом правильно. Должно получится, что-то вроде такого:
    Код (Text):
    #include <IRremote.h>

    int RECV_PIN = 3; // Контакт IR приёмника
    #define MOTOR 5 // motor

    IRrecv irrecv(RECV_PIN);

    uint32_t n;

    void setup()
    {
      pinMode(MOTOR, OUTPUT);
      digitalWrite(MOTOR, LOW); // начальное состояние мотора
      irrecv.enableIRIn(); // Включаем ресивер
    }

    void loop()
    {
      decode_results results;
      if (irrecv.decode(&results))
      {
        // 1641415931 - сигнал кнопки; 4294967295-сигнал о залипании кнопки
        if (results.value != 4294967295) // если код не "залипания"
        {
          {
            n = results.value; // то сохраняем его в переменную n
          }
          if (n == 1641415931) // если кнопка зажата
          {
            digitalWrite(MOTOR, HIGH); // крутим мотор
          }
          else
          {
            digitalWrite(MOTOR, LOW); // иначе, выключаем
          }
        }
      }
    irrecv.resume();
      // delay(50); // зачем задержка?
    }
    Проверьте.
     
    Последнее редактирование: 8 дек 2014
  3. komalov

    komalov Нуб

    В вашем коде ,если кнопка не зажата и на неё не поступает сигнал мотор продолжает работать.Если же мы поставим в последней строчке
    else {
    digitalWrite(MOTOR, LOW);
    } то когда кнопка не зажата мотор должен останавливаться,но вот загвоздка он вообще не реагирует,не включается и не выключается.Если же мы поставим задержку,как в моём коде, мотор будет работать ,но небольшие погрешности в рывках будут.Я думаю это связано с тем что сигналы с пульта идут не мгновенно, а через короткий промежуток времени.Я хотел спросить можно ли принципиально по иному реализовать это?
     
  4. Salk

    Salk Гик

    Возможны вы правы. Попробуйте поставить конденсатор на базу транзистора, он сгладит эти скачки и мотор должен крутится равномерно. Как в этой схеме, например:
    http://digitrode.ru/computing-devices/mcu_cpu/139-upravlyaem-ventilyatorom-s-pomoschyu-arduino.html
    В любом случае одного else должно быть достаточно :)
    Код (Text):
    #include <IRremote.h>

    int RECV_PIN = 3; // Контакт IR приёмника
    #define MOTOR 5 // motor

    IRrecv irrecv(RECV_PIN);

    uint32_t n;

    void setup()
    {
      pinMode(MOTOR, OUTPUT);
      digitalWrite(MOTOR, LOW); // начальное состояние мотора
      irrecv.enableIRIn(); // Включаем ресивер
    }

    void loop()
    {
      decode_results results;
      if (irrecv.decode(&results))
      {
        // 1641415931 - сигнал кнопки; 4294967295-сигнал о залипании кнопки
        if (results.value != 4294967295) // если код не "залипания"
        {
          {
            n = results.value; // то сохраняем его в переменную n
          }
          if (n == 1641415931) // если кнопка зажата
          {
            digitalWrite(MOTOR, HIGH); // крутим мотор
          }
        }
        else
        {
          digitalWrite(MOTOR, LOW);
        }
      }
      irrecv.resume();
      delay(50);
    }
     
  5. komalov

    komalov Нуб

    Спасибо за помощь.:)