Солнечный трекер

Тема в разделе "Arduino & Shields", создана пользователем sqr93, 7 апр 2013.

  1. sqr93

    sqr93 Нерд

    Делаю трекер солнца для солнечных батарей.4 Фоторезисторa СФ3-1; 2 DC моторчика,l293d.
    Получится ли сделать с драйвером l293d на DC моторчиках?:oops:
    Код (Text):

    //  name  = analogpin;
    int ldrlt = 0; //лев верх фоторезистор
    int ldrrt = 1; //прав верх фоторезистор
    int ldrld = 2; //низ лев фоторезистор
    int ldrrd = 3; //низ прав фоторезистор
    void setup()
    {
     
    }
    void loop()
    {
      int lt = analogRead(ldrlt); // верх левый
      int rt = analogRead(ldrrt); // верх правый
      int ld = analogRead(ldrld); // низ левый
      int rd = analogRead(ldrrd); // низ правый
      int dtime = analogRead(4)/20; // Данные с потенциометра
      int tol = analogRead(5)/4;
     
      int avt = (lt + rt) / 2; // среднее зн верх
      int avd = (ld + rd) / 2; // среднее зн низ
      int avl = (lt + ld) / 2; // среднее зн лев
      int avr = (rt + rd) / 2; // среднее зн правый
     
      int dvert = avt - avd; // поиск разницы между верхом и низом
      int dhoriz = avl - avr;// поиск разницы между прав и лев
     
      if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
      {
      if (avt > avd)
      {
    //крутить вперед
      }
      else if (avt < avd)
      {
    //крутить назад
     
      }
     
      if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
      {
      if (avl > avr)
      {
    //крутить вперед
        }
      }
      else if (avl < avr)
      {
    //крутить назад
        }
      }
      else if (avl = avr)
      {
        // все ок
      }
      delay(dtime);
    }
     
    Sand нравится это.
  2. Unixon

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

    Почему бы и нет, получится. Может быть, придется сделать чуть более более интеллектуальное управление мотором, а так проблем не вижу.
     
  3. sqr93

    sqr93 Нерд

    Просто я новичок ,не до понял как мне в этом цикле сделать так чтобы, например подать ток чтоб сдвинуть на сколько то грудусов.
    Код (Text):
      if (avt > avd)
      {
    //крутить вперед
      }
      else if (avt < avd)
      {
     
  4. Unixon

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

    А это уже калибровать надо... зависимость угла поворота от длительности управляющего импульса строить. Можно, конечно, наивно поступить- просто в цикле гонять условие без задержки, но это не очень хорошее решение.
     
  5. sqr93

    sqr93 Нерд

    Как ваще написать чтоб он крутанул и остановился,пробывал он крутится и не останавливается(((
    Забыл сказать что надо будет раз в день делать поворот в начальное положение.Как думаете можно ли будет использовать сенсор от принтера.Пробовали ли вы такими сенсорами пользоваться?[​IMG]
     
  6. Unixon

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

    Для поворота в заданное положение нужен будет какой-нибудь элементарный датчик положения, например геркон+магнит или открытая оптопара (как на картинке)+метка.

    Строгое условие avl==avr из-за естественного шума может никогда на выполняться, учитывайте погрешность. Кстати, на этом месте в программе ошибка, "=" вместо "==".
     
  7. sqr93

    sqr93 Нерд

    Таких датчиков 2-5,разобрал 2 принтера.Так как его подключить и использовать?
    3 контакта.зеленый походу -,т.к идет к обoим. а черный к левому ,синий к правому(если по фотке)
    [​IMG]Вот так ?
     
  8. sqr93

    sqr93 Нерд

    Код (Text):
        }
      }
      else if (avl = avr)
      {
        // все ок
      }
    Как сделать погрешность?:(
     
  9. Unixon

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

    if (abs(avl-avr)<eps) {...}
     
  10. roggedhorse

    roggedhorse Гик

    Код (Text):
    double absD(double val) {
      if (val < 0) return -v; else return v;
    }
     
    void loop() {
      ......
      if (absD(av - threshold) > err) {
        // ошибка больше нормы
      } else {
        // ошибка в пределах нормы
      }
    }
     
     

    где
    threshold - пороговое значение
    av - текущее значение
    err - допустимое отклонение
     
  11. Unixon

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

    Для double есть fabs() если что ...
     
    Megakoteyka нравится это.
  12. sqr93

    sqr93 Нерд

    Так понаписали прям затерялся:oops:
     
  13. roggedhorse

    roggedhorse Гик

    absD здесь только для наглядности
     
  14. sanik

    sanik Гик

    Я недавно возился с датчиками от принтера чтоб узнать как подключить качал сервис мануал может пригодиться там есть подобные фотоитерапторы http://diagramas.diagramasde.com/otros/Epson R260,R265,R270,R360,R380,R390.pdf
    Думаю для HP найти несложно..
     
  15. sqr93

    sqr93 Нерд

    Работает тока одна сторона помогите что не так?Или как лучше пользоваться L293d?

    Код (Text):
    #include <robocraft.h>
    MOTOR MOTOR1 = { 13, 12, 11 };
    MOTOR MOTOR2 = { 7, 8, 9 };
    // LDR pin connections
    //  name  = analogpin;
    int ldrlt = 0; //лев верх фоторезистор
    int ldrrt = 1; //прав верх фоторезистор
    int ldrld = 2; //низ лев фоторезистор
    int ldrrd = 3; //низ прав фоторезистор
    int en1 = 5;
    int en2 = 4;
    void setup()
    {
      pinMode(en1, OUTPUT);
      pinMode(en2, OUTPUT);
      Serial.begin(9600);
    // name.attacht(pin);
    }
    RoboCraft robot(&MOTOR1, &MOTOR2);
    void loop()
    {
     
      int lt = analogRead(ldrlt); // верх левый
      int rt = analogRead(ldrrt); // верх правый
      int ld = analogRead(ldrld); // низ левый
      int rd = analogRead(ldrrd); // низ правый
      int dtime = analogRead(4)/20; // read potentiometers
      int tol = analogRead(5)/2;
     
      int avt = (lt + rt) / 2; // среднее зн верх
      int avd = (ld + rd) / 2; // среднее зн низ
      int avl = (lt + ld) / 2; // среднее зн лев
      int avr = (rt + rd) / 2; // среднее зн правый
     
      int dvert = avt - avd; // поиск разницы между верхом и низом
      int dhoriz = avl - avr;// поиск разницы между прав и лев
     
      if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
      {
      if (avt < avd)
      {
      digitalWrite(en1, HIGH);  // turn the en1 on (HIGH is the voltage level)
      delay(100);             // wait for a second
      digitalWrite(en1, LOW);   // turn the en1 off by making the voltage LOW
      delay(220);
      robot.motor_forward(1,250); // 1 вперёд :)
      delay(1000);
      }
      else if (avt < avd)
      {
      digitalWrite(en1, HIGH);  // turn the en1 on (HIGH is the voltage level)
      delay(500);             // wait for a second
      digitalWrite(en1, LOW);   // turn the en1 off by making the voltage LOW
      delay(100);
      robot.motor_forward(1,250); // 1 вперёд :)
      delay(1000);
      }
     
      }
     
      if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
      {
      if (avl > avr)
      {
        digitalWrite(en2, HIGH);  // turn the en1 on (HIGH is the voltage level)
      delay(900);             // wait for a second
      digitalWrite(en2, LOW);   // turn the en1 off by making the voltage LOW
      delay(300);
        robot.motor_forward(2,250); // 1 вперёд :)
      delay(1000);
     
        }
      }
      else if (avl < avr)
      {
    digitalWrite(en2, HIGH);  // turn the en1 on (HIGH is the voltage level)
      delay(400 );            // wait for a second
      digitalWrite(en2, LOW);   // turn the en1 off by making the voltage LOW
      delay(100);
        robot.motor_back(2,250); // 1 вперёд :)
      delay(1000);
     
        {
     
        }
      }
      else if (avl = avr)
      {
     
     
     
      }
      delay(1000);
    }
     
  16. mikle0303

    mikle0303 Нуб

    мысль такая, не надо никаких датчиков, все можно решить программно, составить массив с координатами солнца к примеру с дискретностью в 1 час, и еще нужен RCT(малюсенькая платка часов). программа просто читает данные, к примеру каждый час, и перенаправляет платформу на солнце, там где оно должно быть. Вряд ли солнца там не окажется. и никаких проблем с загрязнениями датчиков, птичка например может нагадить, детишки с зеркальцем играться. В общем, никакого обслуживания, кроме периодической очистки самой батареи.
     
  17. mikle0303

    mikle0303 Нуб

    а перемещать, думаю надо шаговиком с редуктором - и маломощный и момент после редуктора большой, например PL57H76-GB на валу 18кг на см а после редукции 1-50 вообще крутой момент получится, можно квадратов шесть батарей крутить
     
  18. roggedhorse

    roggedhorse Гик


    Тогда уж одного GPS будет достаточно.
    Хотя формулы расчета склонения Солнца достаточно непростые, но зато точность прицеливания будет высочайшая плюс исчезнет зависимость от географической позиции и высоты местност
     
  19. Megakoteyka

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

    В теле каждого условия сделайте отладочный вывод, чтобы видеть, правильно ли работает программа при разных внешних условиях.
    Для проверки моторов напишите маленький скетч, который будет крутить моторы в разные стороны по очереди - blink для моторов.

    Покажите схему (рисунок или фото).
    Нажимайте Ctrl+T в Arduino IDE, а то Ваш код читать сложно и структуры не видно.
     
  20. mikle0303

    mikle0303 Нуб

    GPS ХОРОШО, но избыточно. трекер не предполагает постоянной смены положения-если это не трекер на корабле. на суше наверно достаточно один раз прописать геоположение и ввести поправку на высоту над уровнем моря. Формулы хоть и непростые, но один раз прописанная свою работу будет делать отлично. а чтоб не изучать астрономию-надо найти наверно специалиста , который формулу и напишет. Дальше все просто. А работать должно красиво-проводили батареи солнце и склонили головы(чтоб меньше пыли садилось).