/////////////////////////////////////////////////////////////////////////// // // VIDEO SAMPLER, GVS1 by gijs gieskes 2011, http://gieskes.nl // MADE POSSIBLE BY: // - the video lib: http://code.google.com/p/arduino-tvout/ // - image capture: http://nootropicdesign.com/ve/ // - image storage: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1290379685 // /////////////////////////////////////////////////////////////////////////// #include #include "TVout.h" #include "fontALL.h" #define W 128 #define H 96 #define TBYTES W*H/8 #define ACTIV bitRead(PIND, 5) #define EFFER bitRead(PIND, 4) #define SPEER bitRead(PIND, 3) #define HOLDR bitRead(PINC, 0) #define PLAYR bitRead(PINC, 1) #define RECOR bitRead(PINC, 3) #define BACKR bitRead(PINC, 4) #define FORWR bitRead(PINC, 5) boolean effer; boolean speer; boolean holdr; boolean playr; boolean recor; boolean backr; boolean forwr; byte linetostart = 0; boolean intflip; boolean resetbank = 0; byte resetcount = 0; boolean plays = true; char pbspeed = 3; byte playdir = 0; boolean negative = 0; int scroll = 0; char scrollrest = 0; boolean holdstate = true; char bank = 0; TVout tv; unsigned char x,y; char s[32]; #include void setup() { //controls pinMode(14, INPUT); pinMode(15, INPUT); pinMode(17, INPUT); pinMode(18, INPUT); pinMode(19, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, INPUT); digitalWrite(14, HIGH); digitalWrite(15, HIGH); digitalWrite(17, HIGH); digitalWrite(18, HIGH); digitalWrite(19, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); delay(100); //if change was made store it boolean videoformat = 0; //NTSC if(!digitalRead(3)){ //save so it knows something has been saved. EEPROM.write(0, 1); //change mode videoformat = !EEPROM.read(1); EEPROM.write(1, videoformat); } //if something has been stored load it. if(EEPROM.read(0) == 1){ //load sequencer delay time videoformat = EEPROM.read(1); } tv.begin(videoformat, W, H); initOverlay(); initInputProcessing(); tv.fill(0); //23k256 pins pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, INPUT); pinMode(13, OUTPUT); //frame start led pinMode(1, OUTPUT); } void initOverlay() { TCCR1A = 0; // Enable timer1. ICES0 is set to 0 for falling edge detection on input capture pin. TCCR1B = _BV(CS10); // Enable input capture interrupt TIMSK1 |= _BV(ICIE1); // Enable external interrupt INT0 on pin 2 with falling edge. EIMSK = _BV(INT0); EICRA = _BV(ISC11); } void initInputProcessing() { // Analog Comparator setup ADCSRA &= ~_BV(ADEN); // disable ADC ADCSRB |= _BV(ACME); // enable ADC multiplexer ADMUX &= ~_BV(MUX0); // select A2 for use as AIN1 (negative voltage of comparator) ADMUX |= _BV(MUX1); ADMUX &= ~_BV(MUX2); ACSR &= ~_BV(ACIE); // disable analog comparator interrupts ACSR &= ~_BV(ACIC); // disable analog comparator input capture } ISR(INT0_vect) { display.scanLine = 0; } void loop() { if(!recor){ //RECORD if(!effer){ //negative recording tv.capture(); tv.invert(); SRAM.writestream(TBYTES*(bank)); //select start point for(unsigned int i=0; i 20){ bank = 0; } }else{ if(!forwr){//if pause, do stop motion recording bank++; if(bank > 20){bank = 0;} while(!FORWR){} }else if(!backr){ bank--; if(bank < 0){bank = 20;} while(!BACKR){} } } frameLed(); tv.resume(); playbackdelay(pbspeed); }else if(!speer){ tv.capture(); SRAM.writestream(TBYTES*(bank)); //select start point for(unsigned int i=0; i 20){bank = 0;} while(!FORWR){} }else if(!backr){ bank--; if(bank < 0){bank = 20;} while(!BACKR){} } } frameLed(); tv.resume(); playbackdelay(pbspeed); }else if(!holdr){ resetbank = true; bank = 0; while(resetbank){ tv.capture(); SRAM.writestream(TBYTES*(bank)); //select start point for(unsigned int i=0; i 20){ bank = 0; resetbank = false; } }else{ if(!forwr){//if pause, do stop motion recording bank++; if(bank > 20){bank = 0;} while(!FORWR){} }else if(!backr){ bank--; if(bank < 0){bank = 20;} while(!BACKR){} } } frameLed(); tv.resume(); playbackdelay(pbspeed); } }else{ tv.capture(); SRAM.writestream(TBYTES*(bank)); //select start point for(unsigned int i=0; i 20){bank = 0;} }else{ if(!forwr){//if pause, do stop motion recording bank++; if(bank > 20){bank = 0;} while(!FORWR){} }else if(!backr){ bank--; if(bank < 0){bank = 20;} while(!BACKR){} } } frameLed(); tv.resume(); playbackdelay(pbspeed); } }else{ //PLAYBACK SRAM.readstream((TBYTES+scroll)*(bank)); if(!negative){ //normal for(unsigned int i=0; i 20){bank = 0;} }else if(playdir == 1){ bank--; if(bank < 0){bank = 20;} }else{ static boolean playflip; if(playflip){ bank++; if(bank > 20){ bank = 19; playflip = !playflip; } }else{ bank--; if(bank < 0){ bank = 1; playflip = !playflip; } } } }else{ if(!forwr){ //step forward in animation bank++; if(bank > 20){bank = 0;} while(!FORWR){} }else if(!backr){ //step backward in animation bank--; if(bank < 0){bank = 20;} while(!BACKR){} } } frameLed(); tv.resume(); playbackdelay(pbspeed); } playbackcontrols(); } inline void playbackcontrols(){ static boolean prevPLAYR = false; static boolean sstateF = false; static boolean sstateB = false; //toggle play/pause //set speed if(!speer){ if(!backr){ if(pbspeed < 23){ pbspeed++; } }else if(!forwr){ if(pbspeed > 2){ pbspeed--; } } }else if(!effer){ if(!forwr && !backr){ //reset scroll to 0 scroll = 0; }else if(!forwr){ //scroll left scroll++; }else if(!backr){ //scroll right scroll--; } if(!playr){ negative = !negative; } }else if(!holdr){ if(!playr){ plays = false; }else{ plays = true; } if(!forwr){ bank = 0; }else if(!backr){ if(holdstate){ holdstate = false; bank = 0; } }else{ holdstate = true; } }else{ //playback dircetion if(!playr){ if(prevPLAYR){ prevPLAYR = false; plays = !plays; } }else{ prevPLAYR = true; } if(!forwr){ playdir = 0; } if(!backr){ playdir = 1; } if(!forwr && !backr){ playdir = 2; } } } inline void playbackdelay(char d){ //these are here to make sure that nothing gets stuck when to many buttons are pressed static boolean controls; static boolean extras; //reset controls = true; extras = true; playr = true; effer = true; speer = true; holdr = true; recor = true; backr = true; forwr = true; for(char i=d; i>0; i--){ //record buttons during delay so they also get recorded at low speeds tv.delay_frame(1); if(controls){ if(!FORWR && !BACKR){forwr = false; backr = false; controls = false;}else if(!FORWR){forwr = false; controls = false;}else if(!BACKR){backr = false; controls = false;}else if(!RECOR){recor = false; controls = false;}else if(!PLAYR){playr = false; controls = false;} } if(extras){ if(!HOLDR){holdr = false; extras = false;}else if(!SPEER){speer = false; extras = false;}else if(!EFFER){effer = false; extras = false;} } } } inline void frameLed(){ if(!bank){ bitWrite(PORTD, 1, 1); }else{ bitWrite(PORTD, 1, 0); } }