Однажды я решил сделать Remote Follow Focus для своей камеры. Это система которая позволяет фокусировать объектив с некоторого расстояния. Таким образом камера может находится на кране, стедикаме или на плече у оператора и при этом оператор фокуса (focus puller) имеет возможность крутить фокусировочное кольцо на объективе удаленно. Идея родилась сама собой когда я смотрел что можно сделать при помощи Arduino.
Когда все компоненты приехали я приступил к сборке прототипа. Для этого проекта я использовал:
Передатчик (блок управления)
Приемник (исполняющий блок)
Задача предполагает два блока — передатчик и приемник. Передатчик считывает показания переменного резистора, сглаживает их и отправляет по радиоканалу на приемник. Приемник принимает пакет с положением ручки резистора и поворачивает сервомашинку пропорционально этому значению.
Мне повезло и nRF24L01+ умеют общаться в двухстороннем режиме. Так что я на «приемнике» также установил ультразвуковой дальномер MaxSonar EZ0. Он измеряет расстояние до объекта перед камерой и эту цифру «приемник» отправляет «передатчику» — на блок управления. Там эта цифра отображается на 7-сегментном дисплее. Она по идее должна помогать человеку управлять фокусом. Например, можно нанести шкалу вокруг ручки что бы можно было фокусироваться по цифрам.
Макетная плата и модуль с nRF24L01+
MaxSonar EZ0
Обратная сторона одной из макетных плат
В процессе работы над этим проектом я столкнулся со множеством различных проблем. Но почти все из них удалось героически побороть.
Вот некоторые из них:
Когда все компоненты приехали я приступил к сборке прототипа. Для этого проекта я использовал:
- Arduino Duemilanove и Arduino Uno (разные только потому что покупались с интервалом в несколько лет)
- 2 приемо-передатчика nRF24L01+
- Сервомашинка
- Шестеренка (0.8 pitch)
- MaxSonar EZ0
- 7-Segment Serial Display
- Переменный резистор 10k
- 2 регулятора напряжения 3.3В
- Несколько конденсаторов и резисторов для стабилизации питания согласно спецификациям на регулятор напряжения и сонар
- Макетные платы, шлейфы, разъемы, термоусадка, провода, разное
Передатчик (блок управления)
Приемник (исполняющий блок)
Задача предполагает два блока — передатчик и приемник. Передатчик считывает показания переменного резистора, сглаживает их и отправляет по радиоканалу на приемник. Приемник принимает пакет с положением ручки резистора и поворачивает сервомашинку пропорционально этому значению.
Мне повезло и nRF24L01+ умеют общаться в двухстороннем режиме. Так что я на «приемнике» также установил ультразвуковой дальномер MaxSonar EZ0. Он измеряет расстояние до объекта перед камерой и эту цифру «приемник» отправляет «передатчику» — на блок управления. Там эта цифра отображается на 7-сегментном дисплее. Она по идее должна помогать человеку управлять фокусом. Например, можно нанести шкалу вокруг ручки что бы можно было фокусироваться по цифрам.
Макетная плата и модуль с nRF24L01+
MaxSonar EZ0
Обратная сторона одной из макетных плат
В процессе работы над этим проектом я столкнулся со множеством различных проблем. Но почти все из них удалось героически побороть.
Вот некоторые из них:
- Плавающие значение аналогового входа. Почему-то на входе с резистора я получаю очень большой разброс значений в тот момент когда ручка не крутится. Решил проблему программно — усредняю значения и делаю еще несколько трюков. В целом проблема почти решена. Еще попробую другой резистор. Текущий, похоже, старше меня.
- Малая точность позиционирования сервомашинки. Документация по умолчанию предлагает позиционировать сервомашинку с точностью до 1 градуса. Для меня этого было мало. Улучшил ситуацию функцией writeMicroseconds. Она позволяет более точно поворачивать шестеренку.
- Приемо-передатчики не заработали сразу. Проблема оказалась в распиновке на странице с документацией. В сети нашел другую страницу с рабочей распиновкой и радио заработало.
- Сервомашинка работает рывками при использовании последовательного порта в программе. Видимо, прерывания мешают ее таймингу. А удобнее всего данные из MaxSonarа было вынимать именно по последовательному порту. Пришлось полностью переписать программу на прерывания и использовать ШИМ выход. С аналогового выхода считать расстояние получалось плохо.
- ШИМ выход у MaxSonar работает не стабильно. Есть разброс значений. Но пока что мне это не критично. Планирую в дальнейшем все-таки решить эту проблему более радикально. Еще не знаю как.
- 7-сегментный дисплей умудрился сам перепрошиться на другой baud rate. Я два дня думал что он просто сгорел. Но потом додумался перепроверить на всех baud rate и увидел что он все-таки рабочий. В целом он работает не очень стабильно. Возможно, из-за того что я использую SoftwareSerial. Или же из-за того что генераторы частоты у него и у Arduino разные.