Удаленное управление для видеокамеры 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)
но кое-какую информацию накопал — поэтому его и заказал