ШД и фоторезистор

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

  1. kanibekasset

    kanibekasset Нуб

    Всем привет. Новенький, прошу помочь с ШД и фоторезистором.

    Задача такая: при условии меньше 50 у фоторезистора, ШД должен сделать 5 оборотов один раз. Если значение больше у фоторезистора чем 50, ШД должен сделать 5 оборотов в обратном направлении (тоже один раз).

    Все работает, но не корректно. ШД делает N * 5 оборотов в любом направлении, без остановки он все время крутит. Что не правильно в цикле?

    Перепробовал разные не варианты, но увы ((

    Код (Text):
    /* Фоторезистор

    */

    #include <Stepper.h> // include library

    #define STEPS_PER_MOTOR_REVOLUTION 40

    //---( Steps per OUTPUT SHAFT of gear reduction )---
    #define STEPS_PER_OUTPUT_REVOLUTION 32 * 64  //2048

    Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);


    int Steps2Take;
    byte Pin2 = 0;
    int SensorPin = A0; //
    unsigned int SensorValue = 0;
    boolean flag = false;
    byte way = 0;

    void setup() {
      pinMode(13,OUTPUT);
      Serial.begin(9600); // start serial output data;
    }

    void loop() {
      SensorValue = analogRead(SensorPin); // Schityvaem znachenie s fotoresistora
      Serial.print(SensorValue, DEC);
      Serial.println("");
     
      if (SensorValue<50) {
          way = 1;
          flag = true;
          } else {
                way = 2;
                flag = false;
      }
     
      if ((way == 1) && (flag == true))
      {
          Steps2Take  =  STEPS_PER_OUTPUT_REVOLUTION ;  // Rotate CW 1 turn
          small_stepper.setSpeed(500);
          small_stepper.step(Steps2Take);
          delay(2000);
          flag = false;
      }
     
      if ((way == 2) && (flag == false))
      {
          Steps2Take  =  - STEPS_PER_OUTPUT_REVOLUTION;  // Rotate CCW 1 turn
          small_stepper.setSpeed(500);  // 700 a good max speed??
          small_stepper.step( Steps2Take);
          delay(2000);
          flag = true;
      }
    }
     
  2. geher

    geher Гуру

    Так оно и должно работать описанным образом. На каждом вызове loop происходит следующее: проверяется сенсор, по значению сенсора осуществляется пять оборотов в соответствующую сторону. И так без конца.
    И непонятно зачем flag и way дублируют свои функции. Устанавливаются одновременно и проверяются после этого одновременно.
    Изменение flag в ветках if вообще не имеет смысла. Это значение просто не будет нигде использовано.

    Чтобы работало только один раз, надо, во-первых, завести переменную для старого значения сенсора (по особому начальному значению этой переменной (например, отрицательному) можно в частности проверить, что это первый запуск loop и обработать особым образом).
    В начале цикла считать сенсор и сравнить со старым значением.
    Если положение значения относительно границы 50 не изменилось (было меньше и осталось меньше, или было больше и осталось больше), не делать ничего.
    Если изменилось, выполнить вращение ШД в нужную сторону и сохранить новое значение сенсора в переменной для сохранения старого значения, чтобы уже с ним сравнивать показания на следующем запуске loop.
    И неплохо бы использовать какой-никакой гистерезис (например, крутить в одну сторону по >55, а в другую по <45, точные значения надо подобрать по уровню шума в показаниях сенсора и требованиям к порогу страбатывания).
    А то установится значение сенсора около 50 и будет немного плясать вокруг то чуть больше, то чуть меньше. А ШД будет в результате крутиться туда-сюда, пока значение не отойдет от пограничного достаточно, чтобы шумы не перебрасывали через границу.
     
    Последнее редактирование: 21 апр 2014
  3. rav_75

    rav_75 Гик

    Код (Text):
     if (SensorValue<50) {
          way = 1;
        } else {
                way = 2;
           }
    так должно заработать + вышесказанное
     
  4. kanibekasset

    kanibekasset Нуб

    Все получилось, спасибо Вам)

    Но появилась одна проблемка. ШД перегревается, к чему это? Даже когда он просто стоит, он греется. Как быть?
     
  5. geher

    geher Гуру

    Если греется, значит, через обмотки течет слишком большой ток. По-моему так.
    Причем про ШД пишут, что эта зараза потребляет даже если стоит на месте (удерживает позицию?). Т.е. если греется от большого тока, то будет греться и при простое.
    Как быть, не знаю. Возможно, поможет снижение напряжения питания двигателя.