====== 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 =====
{{youtube>large:I_c3FB0wWwU}}
[[http://www.youtube.com/watch?v=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': 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
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 |