Удаленное управление для видеокамеры 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. Подготовка к реализации.”»
не забывайте про cut’ы!
а EasyCAP с Raspberry Pi уже попробовали подружить?
easy cap еще не пришла из Китая (отправка 08.05)
но кое-какую информацию накопал — поэтому его и заказал