Freeduino
В этой части статьи будет описано использование контроллера Freeduino для управления панорамной съемкой с помощью установки, описанной в первой части. Так как это первая из статей, в которой затрагивается вопрос взаимодействия Freeduino и Windows, этому вопросу (установка драйверов, ПО для программирования) также будет уделено внимание.
В установке используется модель Freeduino Through-Hole (аналог Arduino Diecimila) с микроконтроллером ATmega328. Память программ — 32 К (2 К заняты загрузчиком), ОЗУ — 2 Кбайт, EEPROM — 1 Кбайт, тактовая частота — 16 МГц. Подробное описание устройства можно найти на сайте проекта Freeduino. Для практических нужд достаточно знать следующее:
- устройство имеет 14 контактов цифрового ввода/вывода (выводы работают с сигналами уровня 0/5 В, ток до 20 мА), 6 из них (№№3, 5, 6, 9, 10, 11) могут работать в режиме широтно-импульсной модуляции (ШИМ)
- выводы 1 и 2 совмещены с цепями обмена по USB и при подключении к компьютеру использоваться не могут
- устройство имеет 6 аналоговых входов АЦП, дискретность — 1024 уровня
- есть интерфейс USB
- питание осуществляется от USB либо от внешнего источника (оптимальное напряжение 7—12 В, имеется встроенный стабилизатор), переключение питания — перемычкой на плате
- встроенный предохранитель защищает компьютер при перегрузке при токе более 500 мА
- сброс микроконтроллера — аппаратный по USB от компьютера или кнопкой на плате
Для управления шаговым двигателем в установке используется плата расширения Motor Shield v3 на двух микросхемах L293D. С ее помощью можно независимо управлять двигателями постоянного тока (до 4), двигателями шаговыми (до 2), сервоприводами (до 2). Поддерживается ШИМ-режим. Сервоприводы управляются по отдельным каналам, двигатели постоянного тока и шаговые — по общим, поэтому одновременно можно подключать 2 шаговых двигателя, либо 1 шаговый и 2 двигателя постоянного тока, либо 4 двигателя постоянного тока.
Что нужно знать о Motor Shield v3:
- напряжение питания 5 В (слаботочная цепь и сервоприводы, питание поступает от стабилизированной цепи основного модуля Freeduino), 7—24 В (силовая цепь двигателей, питание от внешнего источника либо от внешней цепи питания основного модуля Freeduino; переключатель — перемычка на плате)
- максимально-продолжительный ток каждого канала 0,6 А
- для управления платой расширения используется библиотека Adafruit Motor shield library (AFMotor), которую следует распаковать в папку hardwarelibraries с ПО Arduino
Плата Motor Shield v3 устанавливается непосредственно в плату Freeduino Through-Hole, при этом доступ к портам Freeduino обеспечивается через сквозные разъемы Motor Shield v3. Так как обмен данными осуществляется по общим цифровым каналам, не все из них можно использовать для задач, не связанных с управлением двигателями. Подробнее информацию о свободных портах можно найти на сайте ladyada.net в разделе вопросов и ответов по Motor Shield. Кратко же, свободными портами при подключении и объявлении в управляющей программе подключения двигателей к портам M1-M4 (синие клеммы), остаются все аналоговые входы, порты для сервомашинок 9 и 10, порт 2 и 13 (с ограничениями, связанными с подключением по USB и работой встроенного в плату индикатора загрузки контроллера на 13-м порте). Для управления камерой (дистанционное управление по USB) в описываемой в статье установке используется порт 9. В установке питание Motor Shield v3 осуществляется от цепи питания модуля Freeduino Through-Hole, к которой подключается внешний блок питания 7—8 В (6 аккумуляторов типа АА). Напряжение на клеммах двигателя в процессе работы 6—7 В, при сопротивлении обмоток в 10 Ом продолжительный ток лишь немного превышает допустимый 0,6 А.
Freeduino и Windows
Подключение Freeduino к компьютерам с ОС Windows (XP и 7) — простой процесс, требующий лишь выполнения последовательности действий, описанных в инструкции к устройству Freeduino. В комплект платы Freeduino Through-Hole входит диск с ПО и инструкциями (его также можно скачать с сайтов Arduino, Freeduino и прочих совместимых проектов). Имеющийся на диске архив arduino-0017.zip нужно распаковать в папку arduino-0017 в корень системного диска (C:). На плате Freeduino Through-Hole перемычкой устанавливаем питание по USB и после этого подключаем Freeduino Through-Hole к компьютеру. Система обнаружит новое устройство и предложит выбрать для него драйвер, указываем путь к нему: C:arduino-0017driversFTDI USB Drivers. После этого через Диспетчер устройств Windows нужно определить, какой из COM-портов приписан Freeduino, подключенному по USB:
Можно приступать к программированию. В папке arduino-0017 (или более поздних версий) имеется программа Arduino.exe — интегрированная среда разработки и загрузки, написанная на Java. В нее входят редактор кода, компилятор, модуль передачи программы в плату Freeduino/Arduino, справочная система и набор программ-примеров. В программе после подключения устройства Freeduino/Arduino нужно выбрать его тип и COM-порт подключения:
Для желающих программировать «визуально», а не в текстовом формате, есть программа Scratch for Arduino S4A.
Программа управления панорамной съемкой, Arduino.exe
Программа для управления панорамной съемкой должна выполнить следующие действия:
- подать сигнал 5 В на USB-порт камеры для съемки (устойчиво срабатывает, если сигнал подается в течение 1-2 секунд),
- выдержать паузу (3 секунды), необходимую на съемку,
- подать сигнал на шаговый двигатель — повернуть камеру на заданный угол,
- остановиться и подождать, пока конструкция стабилизируется (3 секунды),
- повторить цикл нужное число раз.
Цикл должен повторяться до тех пор, пока не будет обеспечен требуемый угол охвата пространства (я выбрал полуоборот). Кроме того, перед выполнением циклов съемки-поворота нужно выставить камеру в нужном направлении съемки, для этого шаговый двигатель должен свободно вращаться — с него нужно снять напряжение на время прицеливания.
Камера Canon PowerShot G9 оснащена зум-объективом с эквивалентным фокусным расстоянием 35—210 мм. На весь диапазон приходится 12 шагов привода зума, для панорамной съемки стоит использовать первые 5-6 шагов. С помощью поворотной головки со шкалой панорамирования было определено, что угол поворота камеры при панорамировании с минимальным фокусным расстоянием — ≈45°. При фокусном расстоянии, соответствующем шестому шагу зума, этот угол — ≈25° Если выбрать угол поворота для каждого цикла панорамирования 22°, можно снимать панораму и для шестой позиции зума, и для нулевой, выбросив в последнем случае из серии каждый второй кадр. Для промежуточных положений зума панорамная серия просто будет избыточной, что лишь увеличит время на обработку. Чтобы снять панораму с охватом в полуоборот при единичном повороте на 22°, понадобится 9 циклов «съемка-поворот».
Для управления шаговым двигателем (имя объекта motor) используются инструкции и функции из библиотеки AFMotor.h:
- AF_Stepper motor(«число шагов на полный оборот», «порт управления»),
- motor.setSpeed(«скорость в оборотах в минуту»),
- motor.release(),
- motor.step(«угол поворота», «направление», «режим вращения»).
Первая описывает шаговый двигатель. В нашем случае двигателя с 200 шагами на оборот, подключенного к первому и второму портам Motor Shield, инициализация выглядит так:
AF_Stepper motor(200, 1)
Вторая задает скорость вращения — на практике все нормально работает при скорости 4 оборота в минуту:
motor.setSpeed(4)
Третья инструкция «освобождает» двигатель, чтобы его можно было вращать:
motor.release()
Отмечу, что так как редуктор в установке не используется, в процессе съемки для фиксации неподвижной камеры питание с обмоток двигателя не снимается — команда motor.release() не подается внутри цикла, только лишь на этапе прицеливания. Чтобы установка не раскачивалась шаговым двигатель, выбран режим поворота Interleave — двойной точности и половинной скорости, при этом аргумент «угол поворота», задаваемый в шагах двигателя, нужно удвоить. Четвертая инструкция:
motor.step(angle*2, FORWARD, INTERLEAVE)
Язык программирования, применяемый в среде Arduino.exe, близок к C++. Программа имеет две обязательные функции: void setup() и void loop(). В первой выполняется инициализация, объявление переменных и объектов. Вторая — цикл выполнения инструкций, повторяющийся раз за разом, пока контроллер не будет отключен от цепи питания. Чтобы программа съемки панорамы не выполнялась более одного раза, цикл съемки нужно поместить не в void loop(), а в void setup(). Время в программе задается в миллисекундах. Код программы («скетч» в среде Arduino.exe) выглядит так:
Программа загружается в контроллер Freeduino и хранится там, даже если питание отключить. Чтобы запустить программу из памяти контроллера, нужно просто включить питание на блоке питания или нажать кнопку Reset.