Table of Contents

Makrosteuerung der QV3500ex

Vorwort

Erstmal: Achtung! Die Kamera nicht an den Computer anschließen solange irgendwelche Software auf dem Com-Port plappert - sonst landet man relativ schnell im Firmware-Update-Modus…

Video

large:I_c3FB0wWwU

Youtube direktblitzlichtgewitter

Datenkabel

Direkt von Casio kostet das Kabel viel zu viel… gut dass das Originalkabel hier einfach rumlag ^^

Für die Selbstbauer: http://scriptkiller.de/de/a30/computer_elektronik/casio_cfx_9850g/casio_datenkabel-selbstbau/

Bei eBay gibts die Kabel übrigens auch…

Steuerbefehle

Es werden direkt Buchstaben an die Kamera gesendet. Jeder Buchstabe entspricht einer Taste am Gehäuse. Ein großer Buchstabe bedeutet “Taste drücken” und ein kleiner “Taste loslassen”. Da ham sich die Leute von Casio mal richtig was gedacht =) Angesteuert wird die Kamera über ein Adapterkabel (das gleiche wie für die neuen Casio-Taschenrechner) mit einer Baudrate von 9600.

Zeichen Funktion/Taste Modus
Aa Focus lock flipflop
Bb Shutter tip
Cc Zoom out hold
Dd Zoom in hold
Ee Menu tip
Ff Focus tip
Gg Left/- tip/hold
Hh Right/+ tip/hold
Ii Set/Disp tip
Jj Flash tip
Kk Shift tip
Ll Self Timer tip
Mm ???? ????
Nn Play/Rec tip
Oo DEBUG tip
Pp off hold
Qq Up tip
Rr Down tip
Ss = Ff
Tt = Jj
Uu preview tip
Vv bestshot tip
Ww ???? ????
Xx ???? ????
Yy ???? ????
Zz ???? ????

flipflop = schaltet hin / her (ein tip ein, ein tip aus) hold = kann länger gedrückt sein tip = nur antippen (Ee z.B.)

Die Makro-Software

Die Software funktioniert soweit und kompiliert unter TurboC problemlos.

C-Quellcode

#include "time.h"
#include"stdio.h"
#include"dos.h"
 
 
#define PORT 0x3F8   /* COM1 */
 
#define _outp outportb
#define _inp inportb
 
FILE* datafile;
char lastcmd; 
char* cam_cmds[]={
"Focus Lock",
"Shutter",
"Zoom Out",
"Zoom In",
"Menu",
"Focus",
"Left / -",
"Right / +",
"Set / Disp",
"Flash",
"Shift",
"Self Timer",
"?",
"Play/Rec",
"DEBUG",
"Off",
"Up",
"Down",
"Focus",
"Flash",
"Preview",
"Best Shot",
"?","?","?","?"};
char* waitstr="|/-\\"; 
char rbuf[5]="00000";
char waitp=0;
int loops=1;
int restartpos=0;
int reendpos=0;
char dispwait_pwr;
char inloop=1;
int actual_delay=10;
int temp_delay=0;
char serial_buffer;
char tmp;
 
void initserialp()
{
  int checkBuffer;
  int c;
  _outp(PORT + 1 , 0);     /* Turn off interrupts */
  /* PORT - Communication Settings        */
  _outp(PORT + 3 , 0x80);  /* SET DLAB ON */
  _outp(PORT + 0 , 0x0C);  /* Set Baud rate - Divisor Latch Low Byte */
  /* Default 0x03 =  38,400 BPS */
  /*         0x01 = 115,200 BPS */
  /*         0x02 =  56,700 BPS */
  /*         0x06 =  19,200 BPS */
  /*         0x0C =   9,600 BPS */
  /*         0x18 =   4,800 BPS */
  /*         0x30 =   2,400 BPS */
  _outp(PORT + 1 , 0x00);  /* Set Baud rate - Divisor Latch High Byte */
  _outp(PORT + 3 , 0x03);  /* 8 Bits, No Parity, 1 Stop Bit           */
  _outp(PORT + 2 , 0xC7);  /* Configure FIFO Control Register         */
  _outp(PORT + 4 , 0x0B);  /* Turn on DTR, RTS, and OUT2              */
  return;
}
 
 
void keyboarding()
{
   if(kbhit())
   {
   getch();
      if(reendpos==0) inloop=0;
      else
      {
         if(restartpos<reendpos)
         {
            fseek(datafile,reendpos,SEEK_SET);
            temp_delay=0;
            loops=0;
         }
         else
            inloop=0;
      }
   }
}
 
void dispwait()
{
   if(!(waitp%16))printf(".");
   printf("%c\b",*(waitstr+waitp%4));
   waitp++;
}
 
 
 
void dispdelay(int delaytime)
{
   int i;
   waitp=0;
   if(delaytime<10000)
   for(i=0;i<delaytime&&inloop;i+=100)
   {
      if(dispwait_pwr) dispwait();
      delay(100);
      keyboarding();
   }
   else
   for(i=0;i<delaytime&&inloop;i+=1000)
   {
      if(dispwait_pwr) dispwait();
      sleep(1);
      keyboarding();
   }
 
}
 
 
 
void processcmd(char cmd)
{
   switch(cmd)
   {
      case '>': restartpos=ftell(datafile);
                break;
 
 
      case '<': reendpos=ftell(datafile)+1;
                if(loops>=1)loops--;
                if(loops!=0)fseek(datafile,restartpos,SEEK_SET);
                break;
 
      case '!': {fread(rbuf,5,1,datafile); temp_delay=atoi(rbuf); } break;
      case '?': {fread(rbuf,5,1,datafile); temp_delay=atoi(rbuf)*1000; } break;
      case '0': actual_delay=0; break;
      case '1': actual_delay=10; break;
      case '2': actual_delay=20; break;
      case '3': actual_delay=40; break;
      case '4': actual_delay=80; break;
      case '5': actual_delay=160; break;
      case '6': actual_delay=320; break;
      case '7': actual_delay=640; break;
      case '8': actual_delay=1280; break;
      case '9': actual_delay=2560; break;
      default: _outp(PORT, cmd); break;
   }
}
 
void printtime()
{
   time_t now;
   time(&now);
   printf("%02i:",(now/60/60)%24);
   printf("%02i:",(now/60)%60);
   printf("%02i\t",now%60);
}
 
void print2screen(char cmd)
{
   char cam_cmd_no=(cmd-65)%32;
 
   if(cmd>64)
   if(cmd<96)
   {
   printf("");
   printtime();
   printf("%s",cam_cmds[cam_cmd_no]);
   dispwait_pwr=1;
   }
   else
   {
      printf("OK\n");
      dispwait_pwr=0;
   }
 
   if(cmd=='!')
   {
      printtime();
      printf("Sleepin' for %i ms",temp_delay);
      dispwait_pwr=1;
   }
 
   if(cmd=='?')
   {
      printtime();
      printf("Sleepin' for %i s",temp_delay);
      dispwait_pwr=1;
   }
 
 
}
 
 
 
int main(int argc, char* argv[])
{
   int i=0;
   if(argc<1) return -1;
   initserialp();   
 
   datafile=fopen(argv[1],"r");
   if(datafile!=0)inloop=1;
 
   if(argc>2)
   {
      loops=atoi(argv[2]);
   }
 
 
   while (inloop)
   {
      serial_buffer = _inp(PORT + 5);
      if (serial_buffer & 1)
      {
         tmp = _inp(PORT);
      }
 
     lastcmd = fgetc(datafile);
     if(feof(datafile))
     {
        if(loops>0) loops--;
        if(loops==0) inloop=0;
        else
        {
           rewind(datafile);
        }
     }
     if(inloop)
     {
    // printf("%c",lastcmd);
     processcmd(lastcmd);
     print2screen(lastcmd);
     if(temp_delay>0)
     {
        dispdelay(temp_delay);
        printf(" \n");
        temp_delay=0;
        dispwait_pwr=0;
     }
     dispdelay(actual_delay);
     }
   }
 
   fclose(datafile);
   return 0;
}

Beispiel-Makrodatei und Erklärung

1GgGgGgGgGgGg>AaBb!00500Hh<AaBb91GgGgGgGgGgGg

Aufruf: casiocom hdr.txt 12

Befehl Wirkung
1 setze Wartezeit auf “1” (siehe case-Anweisung im Quellcode → 10ms)
GgGg… drücke mehrmals “links” (Belichtungszeit verlängern
> merke Position
AaBb feuer frei!
!00500 warte 500ms (bis Bild gespeichert)
< springe zu >, verringere Zähler von 12 auf 11
11 Bilder, jedes mit anderer Belichtungszeit
AaBb ein letztes Bild
91 2560ms warten und wartezeit wieder auf 10ms stellen
GgGg… wieder zurück auf die Anfangsbelichungszeit