Подвес для фотоаппарата

Тема в разделе "Глядите, что я сделал", создана пользователем BossTon, 1 апр 2013.

  1. BossTon

    BossTon Нерд

    [​IMG]
    Друзья здравствуйте!
    Давно хотел собрать подвес для фотоаппарата для авто-съемки.
    Механику всю собрал, там все просто.
    2 сервомашинки постоянного вращения вращают фото в 2 плоскостях.
    Я сначала хотел делать все на шаговых двигателях, но поздно нашел амперку, пришлось заказывать 2 сервы SM-S4315r постоянного вращения. (Меня подкупил высокий момент до 15 кгс)Лишь когда они приехали, я понял что лоханулся, что такие сервы нельзя позиционировать в пространстве.
    Пришлось покупать 2 потенциометра и начинать изучать программирование на ардуино.
    Пытаюсь делать сам, принципы понимаю но спотыкаюсь на мелочах.
    и так проблема №1:
    МНе нужно чтобы серва1 крутила подвес и останавливалась каждые 45 градусов(всего 9 раз) после каждой остановки происходил бы спуск затвора, ну это позже.
    Я поковырялся и написал скетч который просто ставил серву в определенный угол, дабы проверить потенциометр.
    Код (Text):
    #include <Servo.h>
    Servo servo1;
    int servopin1=10;
    int potensiometr = A9;
    int val;
    void setup()
    {
    servo1.attach(servopin1);
     
    }
    void loop(){
      val = analogRead(potensiometr);
    int pos = map(val,0,1023,0,200);
    if(pos<30)
    {
      servo1.write(80); //гоним серву вперед до заданного положения
    }
    else if(pos>30)
    {
      servo1.write(100); //гоним серву назад до заданного положения
    }
    else{
      servo1.write(90); //иначе останавливаемся, т.е то что нужно.
      delay(1000);
    }
    }
    }
     
    И он даже работает, что вызывает у меня дикую радость, так как это первый мой скетч и он заработал, но дальше я начал спотыкаться.
    Я понимаю что нужно запускать FOR. но как я не пытался исхитриться у меня ничего не получается. серва начинает дергаться или просто тупо кружиться.
    Помогите, пожалуйста, если кто может)))
    Если кому интересно выложу фото подвеса.
    Прилагаю последний код на котором я встал.
    Код (Text):
    #include <Servo.h>
    Servo servo1;
    int servopin1=10;
    int potensiometr = A9;
    int val;
    void setup()
    {
    servo1.attach(servopin1);
     
    }
    void loop(){
      val = analogRead(potensiometr);
    int pos = map(val,0,1023,0,200);
    for(int i=1;i<=101;i=i+20)
    {
    if(pos<i)
    {
      servo1.write(80);
    }
    else if(pos>i)
    {
      servo1.write(100);
    }
    else{
      servo1.write(90);
      delay(1000);
    }
    }
    }
     
     
  2. nailxx

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

    Я бы сделал как-то так:

    Код (Text):

     
     
    #define ANGLE_LIMIT 180
    #define ANGLE_STEP  45
     
    #define STOP_SPEED  90
    #define CW_SPEED    (STOP_SPEED - 10)
    #define CCW_SPEED   (STOP_SPEED + 10)
     
    int currentAngle()
    {
        return map(analogRead(POT_PIN), 0, 1023, 0, 200);
    }
     
    void loop()
    {
        for (int targetAngle = 0; targetAngle < ANGLE_LIMIT; targetAngle += ANGLE_STEP) {
     
            servo.write(CW_SPEED); // запускаем движение вперёд
            while (currentAngle() < targetAngle)
                ; // ждём пока докрутимся до нужного угла
     
            servo.write(STOP_SPEED); // стоп машина!
            delay(50); // ждём полной остановки
     
            shot(); // делаем фотку
            delay(500); // ждём время выдержки фотика
        }
     
        servo.write(CCW_SPEED); // запускаем движение назад
        while (currentAngle() > 0)
            ; // ждём пока докрутимся до старта
    }
     
     
     
  3. BossTon

    BossTon Нерд

    nailxx

    Спасибо большое, жду не дождусь проб... ну а пока разберусь в написанном.
    Как разгребусь обязательно отпишусь о результатах.
    Класс, попробовал.
    Вроде работает. Вот вроде бы смысл один и тот же, а у меня не работало, не объясните мне что в моем коде было не верно?
     
  4. BossTon

    BossTon Нерд

    Как и обещал, выкладываю фото панорамной головки.
    [​IMG]
    1. Сервомашинка №1 SM-S4315r
    2. Многооборотный потенциометрE-ROT
    3. Платформа для крепления к штативу
    4. Сервомашинка №2 SM-S4315r
    5. Червячный редуктор (колок от гитары за 75р, отличная вещь)
    6. Модуль -Потенциометр 300 градусовE-ROT1
    7. Тут будет крепиться (не знаю пока как)рычаг для фотоаппарата.
    8. Еще будет светодиод управляющий фотоаппаратом.
    Благодаря помощи nailxx я теперь могу управлять сервой №1. немного откалибрую, скопирую код для управления сервой №2. и останется самое сложное, это научить ардуину управлять через светодиод фотиком (но вроде как есть в сети решения готовые).
    Потом если все заработает, добавлю 8мипозиционный выключатель, чтобы можно было бы выполнять отдельные команды, а в идеале блютуз модуль и управление с Андроида удаленно.
     
  5. Chanov

    Chanov Нерд

    А с чем связан выбор серв, а не шаговиков? Я для 1 оси под айфончик делал на шаговичке ...
     
  6. BossTon

    BossTon Нерд

    Тут несколько факторов. обычно все из-за того что я спешу всегда))))
    Ну вообще я искал изначально шаговики, и заказал китайские мелкие шаговики с встроенным редуктором за 5 баксов. но они оказались оч слабыми. валяются теперь без дела
    [​IMG]

    Не мог найти нигде в продаже Шаговые двигатели и сюда заглянул слишком поздно.
    Да и есть в них недостатки: высокий вес, маленький крутящий момент 3кгс- нужны редукторы, что усложняет конструкцию. Я доэтого уже пытался собирать Панорамную головку как раз под шаговики и конструкция получилась хлипкая.
    А покупая сервы я не знал что их нельзя позиционировать в пространстве((( Зато у них крутящий момент 15кгс. Но потенциометр спас.
    В итоге меньше деталей, меньше вес. большой крутящий момент,компактность. У меня беззеркалка с блинчиком весит 450 грамм. + рычаги и перекосы. сервы справятся слихвой.
     
  7. Chanov

    Chanov Нерд

    О ... я на таком и делал ... А почему сервы нельзя позиционировать? Высчитываем скорость угловую и танцуем по времени .... немного не точно но для таких целей хватит - всё одно клеить куски и перекрытие есть ...
     
  8. BossTon

    BossTon Нерд

    Я впринципе сначала так и решил делать. Но больно уж хочется все поуму сделать. Слишком много времени я об этом думал))
    Да и сервы от разных источников питания крутятся по разному. за одно и тоже время поворачиваются на разные углы, а если чет помешает или не ровно будет стоять штатив то беда. Если бы не нашел потенциометры так бы и делал конечно, но они не так много стоят, а помогают достичь нужного результата.
    Ну и в перспективе я бы хотел управлять системой кнопками: Ну типа- вернуться в исходное положение, либо сделать шаг назад. итд. а там нужна точность.
     
  9. Chanov

    Chanov Нерд

    Ясно ) только сервы ну никто не использует для такого ) Я пересмотрел кучу проектов по тайм лапс (примерно та же задача, так везде шаговики). Яб конечно тогда под что то тяжёлое точно шаговики как на 3д принтер ставят взял ... и от 12 вольт это хозяйство тянул. Ну ждём финальную версию этого "колхоза" ;) тут.
     
  10. pasha08

    pasha08 Нерд

    Могу немного помочь. У меня такая же серва. Методом экспериментов мой друг выяснил:
    Длительность импульсов в микросекундах:
    Рабочий дапазон: 1250 - 1750 мкс. Определено опытным путем.
    1250-1470 - против часовой, от максимальной скорости до 0.
    1500 - стоп, нейтральная точка регулирулируется встроенным потенциометром
    1520-1750 - по часовой, от 0 до максимальной
    1751 и больше возможно неправильное вращение
    Это при запитывании сервы от ардуино (питание подключать от vin), а ардуины от USB.
     
  11. BossTon

    BossTon Нерд

    Так если я правильно понимаю, то эти команды можно заменить servo1.write(90) - это стоим. от 0 до 89 крутимся в одну сторону, от 91 до 180 в другую.???
     
  12. BossTon

    BossTon Нерд

    Ну я надеюсь получится, обязательно буду отчитываться тут. а в чем проблема серв в данном случае? Шаговики конечно понадежнее и поточнее. но массивные медленные и слабые... А тут вроде шестерни металлические, подшипники и если качалку алюминевые поставить так вообще все из железа. Буду первооткрывателем.
     
  13. pasha08

    pasha08 Нерд

    Да, но для более точной регулировки скорости используйте команду servoName.writeMicroseconds(кол-во микросек) Цифры не совсем идельны, +- 50 мкс.
     
  14. pasha08

    pasha08 Нерд

    И еще кое что - возможно вы не заметили, но сбоку есть потенциометр для сдвига нулевой точки.
     
  15. BossTon

    BossTon Нерд

    Заметил, это для более точной настройки. тут она даже не нулевая точка а для настройки положения в котором он будет стоять. Ну т.е. я подал ему команду стоять servo1.write(90) и крутя данный регулятор добился чтоб серва стояла.
    Одна и так стояла, а другая немного шевелилась.
     
  16. BossTon

    BossTon Нерд

    Появился еще один вопрос:
    в данном примере
    Код (Text):

    #define ANGLE_LIMIT 180
    #define ANGLE_STEP  45
     
    #define STOP_SPEED  90
    #define CW_SPEED    (STOP_SPEED - 10)
    #define CCW_SPEED  (STOP_SPEED + 10)
     
    int currentAngle()
    {
        return map(analogRead(POT_PIN), 0, 1023, 0, 200);
    }
     
    void loop()
    {
        for (int targetAngle = 0; targetAngle < ANGLE_LIMIT; targetAngle += ANGLE_STEP) {
     
            servo.write(CW_SPEED); // запускаем движение вперёд
            while (currentAngle() < targetAngle)
                ; // ждём пока докрутимся до нужного угла
     
            servo.write(STOP_SPEED); // стоп машина!
            delay(50); // ждём полной остановки
     
            shot(); // делаем фотку
            delay(500); // ждём время выдержки фотика
        }
     
        servo.write(CCW_SPEED); // запускаем движение назад
        while (currentAngle() > 0)
            ; // ждём пока докрутимся до старта
    }
     
    основной код написан в рамках функции Loop() Что означает что код будет выполняться постоянно.
    Как его вывести вне функции, чтоб все делалось один раз.
    Я попытался весь код уложить в рамках Void Setup() а Void Loop() оставить пустым.
    Но программа ругается на
    int currentAngle() { return map(analogRead(A9), 0, 1023, 0, 500); }
    Эту переменную нельзя запихивать в Setup? Или я просто чет неправильно делаю?
    В общем как избавиться от цикличности, и по завершению маневров просто остановиться???
     
  17. pasha08

    pasha08 Нерд

    Добавить переменную. После цикла добавить к ней 1, а все это засунуть в if(cycle ==0){}
    Код (Text):
    #define ANGLE_LIMIT 180
    #define ANGLE_STEP  45
    int cycle = 0;
    #define STOP_SPEED  90
    #define CW_SPEED    (STOP_SPEED - 10)
    #define CCW_SPEED  (STOP_SPEED + 10)
     
    int currentAngle()
    {
        return map(analogRead(POT_PIN), 0, 1023, 0, 200);
    }
     
    void loop()
    {
      if(cycle == 0)
      {
      for (int targetAngle = 0; targetAngle < ANGLE_LIMIT; targetAngle += ANGLE_STEP) {
     
            servo.write(CW_SPEED); // запускаем движение вперёд
            while (currentAngle() < targetAngle)
                ; // ждём пока докрутимся до нужного угла
     
            servo.write(STOP_SPEED); // стоп машина!
            delay(50); // ждём полной остановки
     
            shot(); // делаем фотку
            delay(500); // ждём время выдержки фотика
        }
     
        servo.write(CCW_SPEED); // запускаем движение назад
        while (currentAngle() > 0)
            ; // ждём пока докрутимся до старта
           ++cycle;
      }
    }
     
  18. nailxx

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

    А мне вот крайне интересно откуда вы свистнули металлические детальки и шестерёнки: всё как-будто для вашей конструкции и задуманно.
     
  19. BossTon

    BossTon Нерд

    Ну саму головку изначально делал из алюминиевого уголка 2на2 путем отпила половины и загиба. Но он был очень тонкий и его болтало на ветру. После ремонта обратил внимание на уголки которые держали карниз старый. Они алюминиевые и идеальной длины и формы и я просто прикрутил как усилитель. Нижняя часть это детский металлический конструктор.считаю вообще незаменимая вещь.все стандартизировано и всегда можно до купить болты и гайки в строительном,они копеечные.в поисках шагового двигателя я разобрал стройный принтер(я им все равно не пользовался)но там были обычные движки(((зато была уйма шестеренок, которые пошли в дело. Ну и червячный редуктор из гитарного колка, покупал несколько. Этот разбирается и в нем все держится на болтах, что удобно. В общем както так.
     
  20. nailxx

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

    Класс! Всегда завидовал тем людям, у которых в плане конструирования механики из подручных средств руки из правильного места растут.