Удаленное управление для видеокамеры 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. Управление с помощью беспроводного геймпада

Комментарии (3)

RSS свернуть / развернуть
+
+1
не забывайте про cut'ы!
avatar

capitan_blood

  • 27 мая 2014, 14:33
+
0
а EasyCAP с Raspberry Pi уже попробовали подружить?
avatar

admin

  • 28 мая 2014, 09:14
+
0
easy cap еще не пришла из Китая (отправка 08.05)
но кое-какую информацию накопал — поэтому его и заказал
avatar

victoruni

  • 28 мая 2014, 12:15

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.