Фоторобот

Установка для съемки панорам на базе контроллера Freeduino, часть 2: контроллер и программирование в среде Arduino.exe


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 от компьютера или кнопкой на плате

freeduino
Freeduino Through-Hole. Верхний ряд разъемов — цифровые входы/выходы, нижний — аналоговые входы, питание и «сброс»

Для управления шаговым двигателем в установке используется плата расширения 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), которую следует распаковать в папку \hardware\libraries\ с ПО Arduino

freeduino
Плата расширения Motor Shield v3. В верхнем левом углу разъем подключения сервоприводов. Слева и справа разъемы синего цвета для двигателей постоянного тока. Нижний разъем синего цвета — внешнее питание. Разъемы черного цвета для штыревого монтажа обеспечивают доступ к соответствующим выводам основного модуля Freeduino

freeduino
Плата Motor Shield v3 устанавливается непосредственно в плату Freeduino Through-Hole

Плата 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-0017\drivers\FTDI USB Drivers. После этого через Диспетчер устройств Windows нужно определить, какой из COM-портов приписан Freeduino, подключенному по USB:

Система

Можно приступать к программированию. В папке arduino-0017 (или более поздних версий) имеется программа Arduino.exe — интегрированная среда разработки и загрузки, написанная на Java. В нее входят редактор кода, компилятор, модуль передачи программы в плату Freeduino/Arduino, справочная система и набор программ-примеров. В программе после подключения устройства Freeduino/Arduino нужно выбрать его тип и COM-порт подключения:

ПО Arduino

Для желающих программировать «визуально», а не в текстовом формате, есть программа Scratch for Arduino S4A.

Scratch for Arduino
Scratch for Arduino (S4A), программа для визуального программирования Arduino-совместимых платформ и обучения программированию

Программа управления панорамной съемкой, Arduino.exe

Программа для управления панорамной съемкой должна выполнить следующие действия:

  • подать сигнал 5 В на USB-порт камеры для съемки (устойчиво срабатывает, если сигнал подается в течение 1-2 секунд),
  • выдержать паузу (3 секунды), необходимую на съемку,
  • подать сигнал на шаговый двигатель — повернуть камеру на заданный угол,
  • остановиться и подождать, пока конструкция стабилизируется (3 секунды),
  • повторить цикл нужное число раз.

Цикл должен повторяться до тех пор, пока не будет обеспечен требуемый угол охвата пространства (я выбрал полуоборот). Кроме того, перед выполнением циклов съемки-поворота нужно выставить камеру в нужном направлении съемки, для этого шаговый двигатель должен свободно вращаться — с него нужно снять напряжение на время прицеливания.

Камера Canon PowerShot G9 оснащена зум-объективом с эквивалентным фокусным расстоянием 35—210 мм. На весь диапазон приходится 12 шагов привода зума, для панорамной съемки стоит использовать первые 5-6 шагов. С помощью поворотной головки со шкалой панорамирования было определено, что угол поворота камеры при панорамировании с минимальным фокусным расстоянием — ≈45°. При фокусном расстоянии, соответствующем шестому шагу зума, этот угол — ≈25° Если выбрать угол поворота для каждого цикла панорамирования 22°, можно снимать панораму и для шестой позиции зума, и для нулевой, выбросив в последнем случае из серии каждый второй кадр. Для промежуточных положений зума панорамная серия просто будет избыточной, что лишь увеличит время на обработку. Чтобы снять панораму с охватом в полуоборот при единичном повороте на 22°, понадобится 9 циклов «съемка-поворот».

Для управления шаговым двигателем (имя объекта motor) используются инструкции и функции из библиотеки AFMotor.h:

  1. AF_Stepper motor(«число шагов на полный оборот», «порт управления»),
  2. motor.setSpeed(«скорость в оборотах в минуту»),
  3. motor.release(),
  4. 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) выглядит так:

arduino sketch
Окно программы после компиляции. Код программы в виде текстового файла — pano_usb_shot_m.txt

Программа загружается в контроллер Freeduino и хранится там, даже если питание отключить. Чтобы запустить программу из памяти контроллера, нужно просто включить питание на блоке питания или нажать кнопку Reset.


Видеоролик о работе установки, файл 1 МБ, MP4.



Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.