Контроллер видеокамеры
- Войдите на сайт для отправки комментариев
Ср, 22/10/2014 - 15:13
Добрый день! Прошу помощи специалистов. Делаю контроллер видеокамеры, нашел готовое решение, но нужно внести некоторые коррективы, не соображу как. Итак
#define cmdPin 7 #define lancPin 11 #define monitorPin 12 #define recButton 6 #define zoomOutButton 5 #define zoomInButton 4 #define focusAutoButton 8 #define powerOffButton 9 #define focusNearButton 3 #define focusFarButton 2 #define monitorOnButton 10 int cmdRepeatCount; int bitDuration = 104; //Duration of one LANC bit in microseconds. //LANC commands byte 0 + byte 1 //Start-stop video recording boolean REC[] = {LOW,LOW,LOW,HIGH,HIGH,LOW,LOW,LOW, LOW,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH}; //18 33 //Zoom in from slowest to fastest speed boolean ZOOM_IN_4[] = {LOW,LOW,HIGH,LOW,HIGH,LOW,LOW,LOW, LOW,LOW,LOW,LOW,HIGH,LOW,LOW,LOW}; //28 08 //Zoom out from slowest to fastest speed boolean ZOOM_OUT_4[] = {LOW,LOW,HIGH,LOW,HIGH,LOW,LOW,LOW, LOW,LOW,LOW,HIGH,HIGH,LOW,LOW,LOW}; //28 18 //Focus control. Camera must be switched to manual focus boolean FOCUS_NEAR[] = {LOW,LOW,HIGH,LOW,HIGH,LOW,LOW,LOW, LOW,HIGH,LOW,LOW,LOW,HIGH,HIGH,HIGH}; //28 47 boolean FOCUS_FAR[] = {LOW,LOW,HIGH,LOW,HIGH,LOW,LOW,LOW, LOW,HIGH,LOW,LOW,LOW,HIGH,LOW,HIGH}; //28 45 //Focus Auto/Manual boolean FOCUS_AUTO[] = {LOW,LOW,HIGH,LOW,HIGH,LOW,LOW,LOW, LOW,HIGH,LOW,LOW,LOW,LOW,LOW,HIGH}; //28 41 boolean POWER_OFF[] = {LOW,LOW,LOW,HIGH,HIGH,LOW,LOW,LOW, LOW,HIGH,LOW,HIGH,HIGH,HIGH,HIGH,LOW}; //18 5E void setup() { pinMode(lancPin, INPUT); //listens to the LANC line pinMode(cmdPin, OUTPUT); //writes to the LANC line pinMode(monitorPin, OUTPUT);// on-off monitor pinMode(recButton, INPUT); //start-stop recording button digitalWrite(recButton, HIGH); //turn on an internal pull up resistor pinMode(zoomOutButton, INPUT); digitalWrite(zoomOutButton, HIGH); pinMode(zoomInButton, INPUT); digitalWrite(zoomInButton, HIGH); pinMode(focusNearButton, INPUT); digitalWrite(focusNearButton, HIGH); pinMode(focusFarButton, INPUT); digitalWrite(focusFarButton, HIGH); pinMode(focusAutoButton, INPUT); digitalWrite(focusAutoButton, HIGH); pinMode(powerOffButton, INPUT); digitalWrite(powerOffButton, HIGH); pinMode(monitorOnButton, INPUT); digitalWrite(monitorOnButton, HIGH); 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 for each bit } void loop() { if (!digitalRead(recButton)) { lancCommand(REC); } if (!digitalRead(zoomOutButton)) { lancCommand(ZOOM_OUT_4); } if (!digitalRead(zoomInButton)) { lancCommand(ZOOM_IN_4); } if (!digitalRead(focusNearButton)) { lancCommand(FOCUS_NEAR); } if (!digitalRead(focusFarButton)) { lancCommand(FOCUS_FAR); } if (!digitalRead(focusAutoButton)) { lancCommand(FOCUS_AUTO); delay(300); digitalWrite(monitorPin, LOW); } if (!digitalRead(powerOffButton)) { lancCommand(POWER_OFF); } if (!digitalRead(monitorOnButton)) { digitalWrite(monitorPin, HIGH); } } void lancCommand(boolean lancBit[]) { 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 //Note that the command bits have to be put out in reverse order with the least significant, right-most bit (bit 0) first for (int i=7; i>-1; i--) { digitalWrite(cmdPin, lancBit[i]); //Write bits. 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 //Note that the command bits have to be put out in reverse order with the least significant, right-most bit (bit 0) first for (int i=15; i>7; i--) { digitalWrite(cmdPin,lancBit[i]); //Write bits 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 }
Все работает как надо, но нужно сделать, чтобы при нажатии кнопки POWER_OFF(строка 96) выполнялась не только команда lancCommand(POWER_OFF)
, но и на выходе monitorPin появлялся низкий уровень, а при нажатии monitorOn (строка 99) - высокий. Помогите пожалуйста! Заранее спасибо.
Ошибка вкралась, строки 93 и 94 лишние.
Ну и напиши digitalWrite(monitorPin, LOW), а во втором случае HIGH.
Пробовал, если не писать lancComand(POWER_OFF), то все так и работает, а с ней нет. LOW становится а на
monitorOnButton
уже не реагирует...Больше ни у кого нет мыслей по поводу?