Фоторобот

Установка для съемки панорам на базе контроллера 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), которую следует распаковать в папку hardwarelibraries с ПО 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-0017driversFTDI 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.



11 июля 2011 Г.

���������, ��������� ��� ������ ������� �� ���� ����������� Freeduino, ����� 2

���������

��������� ��� ������ ������� �� ���� ����������� 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.