Удаленное управление для видеокамеры Sony, находящейся на мобильной платформе irobot_create. Часть 1. Подготовка к реализации.


Удаленное управление для видеокамеры Sony, находящейся на мобильной платформе irobot_create

Задача:
Для съемок создать удаленное управление кинокамерой Sony (имеется в наличии Sony HDR-SR10E)
а конкретно
1) перемещение камеры в трех осях XYZ
2) управление zoom-ом, включением и выключением, создание фото.
3) для большей мобильности кинокамеру водрузить на удаленно управляемую мобильную платформу.

В качестве мобильной платформы будем использовать платформу на базе iRobot Create. У меня имеется Turtlebot.

Для реализации пункта 2 есть 2 пути
— отправка на видеокамеру IR- команд;
— использование протокол LANC.
У видеокамеры Sony HDR SR10E есть пульт

Чтобы получить коды, собираем на плате Arduino простую схему, заливаем скетч и получаем нужные нам коды

#include <IRremote.h>

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
  {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  }

void loop()
 {
 if (irrecv.decode(&results))
  {
  Serial.println(results.value, HEX);
  irrecv.resume(); // Receive the next value
  }
 }

Вот полученные коды
0x8CBC0 — сделать фотоснимок
0xCBC0 — включение/выключение записи кинокамеры
0x2C9B — +zoom
0x6C9B — -zoom

И второй путь — использование протокола LANC. LANC (Logic Application Control Bus System or Local Application Control Bus System) -представляет собой протокол, используемый для синхронизации видеокамер и камер Sony.
Подключение к камере с помощью 10 pin разъема LANC. Распиновка следующая

Через разъем можно отправлять команды управления видеокамерой, получать информацию о состоянии камеры,
а также получать аналоговое видео . В местных магазинах разъем отсутствует, заказан на ebay и уже пришел

Протокол двусторонний последовательный.
Поток данных составляет 8 байт, далее пауза 5 миллисекунд. Затем еще ​​8 байт и новая пауза и так далее.

Чтобы отправить команду на камеру команда должна быть синхронизирована с сигналом LANC от камеры. Камера слушает первые 4 байта и передает информацию о состоянии в последние 4 байта. Но только первые два байта нужны для управления видеокамерой. Остальные 2 могут быть проигнорированы.

Схема для отправки команд с Arduino в видеокамеру по протоколу lanc

И тестовый скетч передачи байт при нажатии 1 кнопки (0x11 0x33) Запись Вкл/Выкл

#define cmdPin 7
#define lancPin 11
#define recButton 2
int cmdRepeatCount;
int bitDuration = 104; //Duration of one LANC bit in microseconds.

void setup() {

pinMode(lancPin, INPUT); //listens to the LANC line
pinMode(cmdPin, OUTPUT); //writes to the LANC line
pinMode(recButton, INPUT); //start-stop recording button
digitalWrite(recButton, HIGH); //turn on an internal pull up resistor
digitalWrite(cmdPin, LOW); //set LANC line to +5V
delay(5000); //Wait for camera to power up completly
bitDuration = bitDuration - 8; //Writing to the digital port takes about 8 microseconds so only 96 microseconds are left till the end of each bit
}

void loop() {
if (!digitalRead(recButton)) {
REC(); //send REC command to camera
delay(1000); //debounce button
}
}



void REC() {

cmdRepeatCount = 0;

while (cmdRepeatCount < 5) {  //repeat 5 times to make sure the camera accepts the command

while (pulseIn(lancPin, HIGH) < 5000) {
//"pulseIn, HIGH" catches any 0V TO +5V TRANSITION and waits until the LANC line goes back to 0V
//"pulseIn" also returns the pulse duration so we can check if the previous +5V duration was long enough (>5ms) to be the pause before a new 8 byte data packet
//Loop till pulse duration is >5ms
}

//LOW after long pause means the START bit of Byte 0 is here
delayMicroseconds(bitDuration);  //wait START bit duration

//Write the 8 bits of byte 0
//"18hex" or “00011000”  tells the camera that there will be a normal command to camera in the next byte
//Note that the command bits have to be put out in reverse order with the least significant, right-most bit (bit 0) first
digitalWrite(cmdPin, LOW);  //Write bit 0.
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 1
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 2
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, HIGH);  //Write bit 3
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, HIGH);  //Write bit 4
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 5
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 6
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 7
delayMicroseconds(bitDuration);
//Byte 0 is written now put LANC line back to +5V
digitalWrite(cmdPin, LOW);
delayMicroseconds(10); //make sure to be in the stop bit before byte 1

while (digitalRead(lancPin)) {
//Loop as long as the LANC line is +5V during the stop bit
}

//0V after the previous stop bit means the START bit of Byte 1 is here
delayMicroseconds(bitDuration);  //wait START bit duration

//Write the 8 bits of Byte 1
//"33hex" or “00110011” sends the  Record Start/Stop command
//Note that the command bits have to be put out in reverse order with the least significant, right-most bit (bit 0) first
digitalWrite(cmdPin, HIGH);  //Write bit 0
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, HIGH);  //Write bit 1
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 2
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 3
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, HIGH);  //Write bit 4
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, HIGH);  //Write bit 5
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 6
delayMicroseconds(bitDuration);
digitalWrite(cmdPin, LOW);  //Write bit 7
delayMicroseconds(bitDuration);
//Byte 1 is written now put LANC line back to +5V
digitalWrite(cmdPin, LOW);

cmdRepeatCount++;  //increase repeat count by 1

/*Control bytes 0 and 1 are written, now don’t care what happens in Bytes 2 to 7
and just wait for the next start bit after a long pause to send the first two command bytes again.*/


}//While cmdRepeatCount < 5
}

Еще коды
//LANC(0x18, 0x33); //send REC command to camera
//LANC(0x28, 0x45); //FOCUS FAR
//LANC(0x28, 0x47); //FOCUS NEAR
//LANC(0x28, 0x53); //send IRIS+ command to camera Close
//LANC(0x28, 0x55); //send IRIS- command to camera Open
//LANC(0x28, 0x43); // Auto Focus (Focus button)
//LANC(0x28, 0xAF); // Iris Auto Adjust (Iris button)

С получением видео не все так просто. Необходимо организовать трансляцию видео в сеть. Решил использовать Raspberry pi. Видеокамера отдает аналоговое видео, которое необходимо преобразовать в цифровое. Подходящим вариантом по результам поиска в интернете является EasyCAP USB 2.0.

Это небольшое устройство, позволяющее захватывать видео- и аудиосигнал напрямую через USB-порт, без применения каких-либо дополнительных устройств. Адаптер не требует наличия внешнего питания и позволяет легко и просто оцифровать аналоговое видео. Есть положительные результаты использования на Linux. Заказал на aliexpress EasyCAP на чипе UTV007.

Перемещение камеры по осям XYZ

Для перемещения камеры по оси Z собрана конструкция на линейных направляющих


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

Для перемещения камеры по X и Y - видеокамера нелегкая и конструкции на простых сервоприводах не вызывают доверия. Остановился пока на роботизированых платформах для управления камерой, найденными на сайте http://www.pantiltcam.com/TCamWeb/productlist.htm
Хотел заказать с управлением по IR, но потом выбрал с управлением по USB (можно будет если что управлять с компа, если не смогу проникнуть в тайны управления по USB, описания протокола нет)

В общем, пора приступать к реализации.

Далее - Часть 2. Управление с помощью беспроводного геймпада


0 комментариев на «“Удаленное управление для видеокамеры Sony, находящейся на мобильной платформе irobot_create. Часть 1. Подготовка к реализации.”»

    • easy cap еще не пришла из Китая (отправка 08.05)
      но кое-какую информацию накопал — поэтому его и заказал

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение