Контроллер видеокамеры

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Добрый день! Прошу помощи специалистов. Делаю контроллер видеокамеры, нашел готовое решение, но нужно внести некоторые коррективы, не соображу как. Итак

#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) - высокий.  Помогите пожалуйста! Заранее спасибо.

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Ошибка вкралась, строки 93 и 94 лишние.

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну и напиши digitalWrite(monitorPin, LOW), а во втором случае HIGH.

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Пробовал, если не писать lancComand(POWER_OFF), то все так и работает, а с ней нет. LOW становится а на monitorOnButton  уже не реагирует...

vvg10
vvg10 аватар
Offline
Зарегистрирован: 18.04.2013

Больше ни у кого нет мыслей по поводу?