Управление мотором с помощью PIR сенсора

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

  1. exposity

    exposity Нуб

    Здравствуйте,
    Я хочу сделать так, чтобы мотор запускался и работал в течении, определенного, отрезка времени (а так же в нужном направлении) в момент, когда pir-сенсор фиксирует движение. Если подробнее, то когда я провожу рукой в левую сторону - мотор крутится влево, в правую - вправо, нет движения - мотор спит.

    Посему, хотел бы проконсультироваться верны ли мои мысли по части составления скетча. Для управления мотором использую этот скетч:

    #define SPEED_LEFT 6
    #define SPEED_RIGHT 5
    #define DIR_LEFT 7
    #define DIR_RIGHT 4

    void go(int speed, bool reverseLeft, bool reverseRight, int duration)
    {
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH);
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH);
    delay(duration);
    }

    void setup()
    {
    for(int i = 5; i <= 8; i++)
    pinMode(i, OUTPUT);
    }

    void loop()
    {
    // Вращение
    go(255, false, true, 5000);

    // Пауза
    go(0, false, false, 1000);

    // Вращение
    go(255, true, false, 5000);

    // Пауза
    go(0, false, false, 1000);
    }

    Я догадываюсь, что при подключении pir-сенсора, мне нужно прописать его пины в шапке скетча, потом каким-то образом оформить его как звено управляющее мотором и задать направление движения мотора при фиксировании движения влево/вправо.
    Сейчас у меня мотор включается автоматом, но это и так понятно, потому, что скетч написан немного не по данной теме. Просто взял его за основу, потому что в нем я понимаю, что за что отвечает и с изменениями хочу его расширить. Реально ли это и правильно ли я думаю?

    Заранее спасибо.
     
  2. nailxx

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

    Это полуреально. Смотрите, обычно пироэлектрические датчики в сыром виде умеют сообщать о направлении. Но если говорить о том, что в Амперке, там эта функция зарезана и он просто выдаёт сигнал если есть движение. Поэтому нужно использовать либо 2 датчика, либо сделать свой: поставить каскад из операционных усилителей, фильтр по питанию, линзу и т.п.

    С точки зрения алгоритма всё достаточно просто:

    Код (Text):

     
     
    void setup()
    {
        pinMode(MOTOR_DIR_PIN, OUTPUT);
        pinMode(MOTOR_SPEED_PIN, OUTPUT);
    }
     
    void loop()
    {
        bool left = !digitalRead(LEFT_PIR_SENSOR);
        bool right = !digitalRead(RIGHT_PIR_SENSOR);
     
        if (!left && !right)
            return;
     
        digitalWrite(MOTOR_DIR_PIN, left ? LOW : HIGH);
     
        analogWrite(MOTOR_SPEED_PIN, 255);
        delay(TIME_TO_SPIN);
        analogWrite(MOTOR_SPEED_PIN, 0);
    }
     
     
  3. exposity

    exposity Нуб

    Хотел бы прояснить для себя некоторые моменты:

    Шапка скетча остается такая?:

    #define SPEED_LEFT 6
    #define SPEED_RIGHT 5
    #define DIR_LEFT 7
    #define DIR_RIGHT 4

    void go(int speed, bool reverseLeft, bool reverseRight, int duration)
    {
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH);
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH);
    delay(duration);
    }

    - в строке bool left=!digitalRead(LEFT_PIR_SENSOR); bool right=!digitalRead(RIGHT_PIR_SENSOR); - bool left отвечает за датчик размещенный слева, а bool right - справа, или это параметры для одного датчика?



    void setup()
    {
    pinMode(MOTOR_DIR_PIN, OUTPUT); - тут в скобках касательно моего кода (DIR_LEFT, OUTPUT) ???
    pinMode(MOTOR_SPEED_PIN, OUTPUT); - тут в скобках касательно моего кода (SPEED_LEFT, OUTPUT) ???
    }

    void loop()
    {
    bool left = !digitalRead(LEFT_PIR_SENSOR);
    bool right = !digitalRead(RIGHT_PIR_SENSOR);

    if (!left && !right)
    return;

    digitalWrite(MOTOR_DIR_PIN, left ? LOW : HIGH); - тут в скобках касательно моего кода (DIR_LEFT, left ? LOW:HIGH) ???

    analogWrite(MOTOR_SPEED_PIN, 255); - тут в скобках касательно моего кода (SPEED_LEFT, 255) ???
    delay(TIME_TO_SPIN); - в скобках ставится время задержки, насколько я понял...
    analogWrite(MOTOR_SPEED_PIN, 0); - в скобках (DIR_LEFT, 0) ???
    }
     
  4. nailxx

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

    Уф, оф. Пора организовывать ликбез по программированию. Шапка нет: тепеь вам нужно определить только MOTOR_DIR_PIN и MOTOR_SPEED_PIN. Типа:

    Код (Text):

    #define MOTOR_DIR_PIN 6 // пин для управления направлением
    #define MOTOR_SPEED_PIN 5 // пин для управления скоростью
     
    bool left и right — это да, 2 датчика.

    Писал касательно вашего кода.
     
  5. exposity

    exposity Нуб

    спасибо. попробую