Данный пост описывает как за один вечер из говна и палок был сделан следящий фокус для зеркали. Видео того что получилось:


Предисловие


Малина здесь избыточна, бесспорно. Но если речь идет о более сложном устройстве у которого следящий фокус является лишь одной из функций, то почему нет.

Я не придумал ничего нового, просто взял и сделал за один вечер. Результат мне понравился, поэтому хочу поделиться с сообществом.

Механика, крепление


Для меня всегда камнем преткновения является механика. Найти говно и палки под руками, которые совместимы друг с другом, при этом позволят добиться поставленной цели — бывает сложно. Но в этот раз мне повезло.

Выглядит прототип примерно так:



В качестве шестерни на оси сервака я использовал крышку от коробки молока на которую приклеил остаток хомута-шестерни для объектива зеркалки. Крышка от молока в моем случае оказалась оптимального диаметра для регулировки у 50мм объектива. «Шестерню» приклеил с помощью цианоакрилата с содой к одному из коромысел идущих в комплекте к серво и прикрутил винтом. Для крепления конструкции к зеркалке надо винт с дюймовой резьбой, такой у меня нашелся от штатива-осьминога.

В общем, конструкция как-то сама собой воплотилась в реальность:



Без стяжек нынче сложно. Синяя изолента закончилась и пришлось крепить датчик на бумажный скотч.

Электроника


В качестве мозгов у меня выступает Raspberry Pi 3. Серво запитываю отдельным блоком питания на 24VDC с DC-DC Step Down преобразователем на LM2596 микросхеме на выходе которого 7.2В.
Алгоритм работы прост до безобразия. Есть обратная связь по расстоянию до объекта от ультразвукового дальномера HC-SR04, которая преобразуется в угол поворота сервы SG-90. На оси сервы закреплена «шестеренка» которая вращает объектив через хомут-шестерню устанавливая фокусное расстояние.

Код


Подключение ультразвукового датчика описано здесь. Управление сервой сделано с помощью аппаратного ШИМа, настройку брал здесь.

Код получился весьма скромный, но это лишь начало и нет предела совершенству.

#Libraries
import RPi.GPIO as GPIO
import time
from subprocess import call

from RPIO import PWM
servo = PWM.Servo()

#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
 
#set GPIO Pins
GPIO_TRIGGER = 18
GPIO_ECHO = 24
 
#set GPIO direction (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
 
def distance():
    # set Trigger to HIGH
    GPIO.output(GPIO_TRIGGER, True)
 
    # set Trigger after 0.01ms to LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
 
    StartTime = time.time()
    StopTime = time.time()
 
    # save StartTime
    while GPIO.input(GPIO_ECHO) == 0:
        StartTime = time.time()
 
    # save time of arrival
    while GPIO.input(GPIO_ECHO) == 1:
        StopTime = time.time()
 
    # time difference between start and arrival
    TimeElapsed = StopTime - StartTime
    # multiply with the sonic speed (34300 cm/s)
    # and divide by 2, because there and back
    distance = (TimeElapsed * 34300) / 2
 
    return distance
 
if __name__ == '__main__':
    try:
        while True:
            dist = distance()
            if dist <=40:
                focus = 900
            elif dist <= 70:
                focus = 900+int(dist-40)*20
            else:
                focus = 2000
            servo.set_servo(23, focus) 
            print ("Measured Distance = %.1f cm, focus = %3i" % (dist, focus))
            time.sleep(0.1)
 
        # Reset by pressing CTRL + C
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        servo.stop_servo(23)
        GPIO.cleanup()


Для определения соответствия угла поворота серво фокусному расстоянию я сделал несколько калибровочных измерений, в результате получил линейную зависимость на интересующем участке (40-70см), остальное принял за фокус в бесконечность.

Заключение


На мой взгляд, даже самые дешевые серваки SG-90 на многое способны, 1.2кг/см штока для такой малютки, да еще и с такой скоростью — это круто, тем более за цену в 1.5 бакса. То же самое касается и ультразвукового дальномера.

П.С. Серваком можно управлять и отдельно от датчика, например делать быстрые переходы от одного объекта до другого с разным фокусным расстоянием. Также для улучшения работы системы можно дописать фильтр, который будет компенсировать недостатки измерения ультразвукового датчика.

Комментарии (23)


  1. QwertyOFF
    18.03.2018 23:21

    А с родным фокусом зеркалки что? Не может фокусироваться в видео? И сколько у этого датчика максимальная дальность, пара метров?


    1. sterr
      18.03.2018 23:29

      Зеркалки в видео не фокусируются от слова вообще. Фазовый фокусер работает только с опущеным зеркалом. А контрастный настолько медленный, что можно считать его нет.
      Это на новых камерах фазовый фокус встроен в матрицу, да и то на немногих.
      Дык как раз вся проблема фокусировки в ближнем диапазоне. На открытых диафрагмах особенно и с малым фокусным.
      Но и тут возникает вопрос. А если фокус попадет не на глаза, а на нос? Это ведь не прецезионное устройство с чтением мыслей оператора…
      И на видео я не увидел. Теоретически должно Follow Focus поддерживать. Или точности датчиков не хватает?


      1. QwertyOFF
        18.03.2018 23:47

        Учитывая паспортный угол обзора датчика он будет срабатывать на довольно большую область, с поправкой на отражающую способность поверхности. Т.е. не факт, что сработает на острый нос, но на плоскость лица сработает точно. Ну и раз у автора есть малина — пусть ставит две маленькие камеры с базой побольше, ищет нейросетью там глаза и считает расстояние по двум картинкам.


        1. outofspace Автор
          19.03.2018 07:32

          спасибо за идею, направление нейросетей особенно интересно (одна из причин выбора малины)


  1. sterr
    18.03.2018 23:24

    Странно что на малине. Дорого и избыточно. Дуины вполне хватит. Ну если уж жира много, то STM32.


    1. besitzeruf
      19.03.2018 02:04

      esp8266 — вдруг еще удаленное управление понадобится (и это не шутка)


      1. OnYourLips
        19.03.2018 12:07

        Его еще и в обратной роли используют, когда управление камерой через Wi-Fi, а управляющий сигнал по UART (например, с квадракоптера).
        Его размер (с ноготь) — неоспоримый плюс.


  1. DEM_dwg
    19.03.2018 06:26

    Хмммм. Очень не приятно, когда кто то нахватавшись довольно поверхностных знаний, пытается строить из себя проффи используя какие то собственно-выдуманные словечки.
    Ну не называют, сервоприводы, СЕРВАКАМИ…
    Их обычно называют, сервами.


    1. outofspace Автор
      19.03.2018 07:30

      моих поверхностных знаний хватает чтобы запускать промышленных роботов с сервоосями…


      1. DEM_dwg
        19.03.2018 07:34

        Но не хватает, чтобы использовать STM для такой простой подделки.
        Тут блина ардуинки уно за глаза и за уши, хватило бы с избытком.


        1. hells1ng
          19.03.2018 11:57

          Почему никто не читает предисловие?


        1. defecator
          19.03.2018 11:58

          Автор же написал, что взял то, что было под рукой


          1. FiLunder7
            19.03.2018 17:58

            Он этого не писал =) Он написал, что следящий фокус это лишь одна из функций устройства.


  1. Mogwaika
    19.03.2018 08:32

    Мне кажется, тут полезнее будет выкинуть дальномер и прикрутить удалённый спуск, получится недорогой комплект для фокус-стекинга.


    1. Javian
      19.03.2018 08:45

      Автор экспериментирует с прототипом для использования фотокамеры как видеокамеры.


  1. clawham
    19.03.2018 12:41
    -1

    Постоянно натыкаюсь на подобные «поделки» и не понятно зачем это все :) вопервых протокол общения с обьективами известен и давным давно есть эмуляторы. Значить внешние моторы уродующие внешний вид и уничтожающие быструю смену обьектива будут не нужны. во вторых раз обьектив сменить нельзя то нудно использовать две камеры — купи/обменяй на старшую модель и будет фазовый в матрицу встроен — он всеравно намного точнее и быстрее этой поделки.
    Третье — дальность этих дальномеров 5-10 метров… точность — просто никакая. реагирует на профиль лица намного больше ечм на собственно расстояние до него. зачем этот колхоз? Ставиш на камеру CHDK, на экран наглазник с зумом, в chdk включаеш фокус асист и забываеш о проблеме. ну да рукой надо будет подкручивать фокус на резких изменениях но то помоему меньшее из зол.


    1. Mogwaika
      19.03.2018 12:56

      А объектив в примере автофокусный?
      Можно поставить лазерный дальномер, у китайцев полно шилдов, не намного дороже ультразвуковых…


      1. clawham
        19.03.2018 15:35

        автофокусный автофокусный… просто шлеш в обьектив команды нужные и все. или chdk.


      1. lohmatij
        19.03.2018 16:29

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


  1. Rambalac
    19.03.2018 17:48

    Ну вот подсказал бы кто ардуинку размерам с микро или меньше, чтобы с блютусом работающим с HID джойстиками типа для андроида. Хочу себе сделать удалённое управление гимбалом и заодно серву для зума. Ищу уже пол года, даже купил пару, но они все через блютус или только как клиент, или только между собой. Можно и не ардуинку, но желательно того же размера, и совместимым или несложным стеком разработки.


    1. Firelander
      19.03.2018 19:00

      ESP32 рассматривали? Хотя на тему поддержки на ней bluetooth сервера я не в курсе.


  1. mkm565
    20.03.2018 01:06
    +1

    Аналогичная дендрофекальная система
    image
    Исходные данные:

    1) Надо делать кучу измерений с камерой. Без участия человека
    2) надо фокусировать и менять относительное отверстие (апертуру)

    Первоначальное решение — прикрутили «большую» камеру, типа Canon DSLR 6D. Можно управлять от кампутера.
    Проблема:
    1) Автофокус — фокусируется не та то, что надо. Ручной фокус — только рукой, а камерой — никак
    2) Главная проблема — камера цветная, а мне надо — монохром, чтобы инетрполяция не портила измерения

    Решение 2) — куплена монохромная камера. У нее нет, фокуса, апертуры и т.д. Приличный объектив с внешним управлением стоит немерянных денег. К тому же у него небольшая апертура. А душе хочется побольше.
    Вокруг лежат куча старых ручных объективов Никон 35 mm, F#1.4. По параметрам — отличный. Выпускается до сих пор с добавлением автоматики. Но нам она и не нужна.

    Напечатали быстренько деталей. Поставили два шаговых моторчика, из валяющихся по углам. Один — для фокуса, второй — для апертуры. Прикрутили ардуину с платой управления моторами. Написал я программку, чтобы фокусироваться по контрасту — как мне надо.
    Моторы крутят ремни — а они вращают кольца фокусировки и апертуры.

    Все собирался поставить сенсор на кольца, но оказалось, что и не надо. Апертурное кольцо вращается в одну сторону до самого упора + еще немного. Ремень начинает проскальзывать с пулеметным треском. Зато мы знаем начальную позицию, от которой можно отсчитывать шаги для определенной апертуры.


  1. ProLimit
    20.03.2018 19:01

    Игрушка, практическая польза нулевая, по моему. Расстояние до ближайшей точки, которая отразит достаточно сигнала для срабатывания некоего порога, слабо связано с нужной оператору точкой фокусировки. Ближайшая поверхность вообще может быть вне поля зрения объектива, учитывая широченную диаграмму направленности сонара. Фазовый автофокус на матрице гораздо ближе к цели.