I made Digital Camera using Arducam & WIZwiki-W7500
Dependencies: Arduino Arducam_OV5642 SDFileSystem Arducam_UTFT_SPI WIZnetInterface_Ricky mbed
main.cpp
- Committer:
- justinkim
- Date:
- 2015-10-29
- Revision:
- 0:e01f64037748
- Child:
- 1:3a14a4c84db2
File content as of revision 0:e01f64037748:
#include "mbed.h" #include "UTFT_SPI.h" #include "OV5642.h" #include "OV5642_regs.h" #include "SDFileSystem.h" #include "Arduino.h" void setup(); void loop(); void GrabImage(char* str); void dispBitmap(); void Playback(); void dispBitmap(FILE* fname); /* itoa: convert n to characters in s */ void itoa( unsigned long long int value, char *str) { int i,j; char temp[30]; for(i=0; value > 0; i++){ str[i] = value%10+'0'; value=value/10; } for(j=0;i>=0;j++,i--){ temp[j]=str[i-1]; } for(i=0;i<j;i++){ str[i]=temp[i]; } } #define BMPIMAGEOFFSET 66 static FILE *outFile; static FILE *inFile; const char bmp_header[BMPIMAGEOFFSET] = { 0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00 }; ArduCAM myCAM(D11, D12, D13, D10, D14, D15); //ArduLCD myGLCD(D11, D12, D13, D10); SDFileSystem SD(PB_3, PB_2, PB_1, PB_0, "sd"); Serial pc(USBTX, USBRX); bool isShowFlag = true; int main() { //*(volatile uint32_t *)(0x41001014) = 0x0060100; //clock 48MHz setup(); while(1) { loop(); } } void setup() { uint8_t vid,pid; uint8_t temp; pc.baud(115200); pc.printf("ArduCAM Start!\r\n"); //Check if the ArduCAM SPI bus is OK myCAM.write_reg(ARDUCHIP_TEST1, 0x55); temp = myCAM.read_reg(ARDUCHIP_TEST1); if(temp != 0x55) { pc.printf("SPI interface Error!\r\n"); while(1); } //Change MCU mode myCAM.set_mode(MCU2LCD_MODE); //Initialize the LCD Module //myGLCD.InitLCD(); //Check if the camera module type is OV5642 myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid); myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid); if((vid != 0x56) || (pid != 0x42)) pc.printf("Can't find OV5642 module!\r\n"); else pc.printf("OV5642 detected\r\n"); myCAM.set_format(BMP); myCAM.InitCAM(); } void loop() { char str[8]; unsigned long previous_time = 0; static int k = 0; myCAM.set_mode(CAM2LCD_MODE); //Switch to CAM while(1) { if(!myCAM.get_bit(ARDUCHIP_TRIG,VSYNC_MASK)) //New Frame is coming { myCAM.set_mode(MCU2LCD_MODE); //Switch to MCU //myGLCD.resetXY(); myCAM.set_mode(CAM2LCD_MODE); //Switch to CAM while(!myCAM.get_bit(ARDUCHIP_TRIG,VSYNC_MASK)); //Wait for VSYNC is gone } else if(myCAM.get_bit(ARDUCHIP_TRIG,SHUTTER_MASK)) { previous_time = millis(); while(myCAM.get_bit(ARDUCHIP_TRIG,SHUTTER_MASK)) { if((millis() - previous_time) > 1500) { Playback(); } } if((millis() - previous_time) < 1500) { k = k + 1; itoa(k, str); strcat(str,".bmp"); //Generate file name myCAM.set_mode(MCU2LCD_MODE); //Switch to MCU, freeze the screen GrabImage(str); } } } } void GrabImage(char* str) { char VH,VL; uint8_t buf[256]; static int k = 0; int i,j = 0; outFile = fopen("preview.jpg", "w"); if (!outFile) { pc.printf("Open File Error\r\n"); return; } //Switch to FIFO Mode myCAM.write_reg(ARDUCHIP_TIM, MODE_MASK); //Flush the FIFO myCAM.flush_fifo(); //Start capture myCAM.start_capture(); pc.printf("Start Capture\r\n"); //Polling the capture done flag while(!myCAM.get_bit(ARDUCHIP_TRIG,CAP_DONE_MASK)); pc.printf("Capture Done!\r\n"); k = 0; //Write the BMP header for( i = 0; i < BMPIMAGEOFFSET; i++) { char ch = pgm_read_byte(&bmp_header[i]); buf[k++] = ch; } fwrite(buf,256,1,outFile); //Read the first dummy byte //myCAM.read_fifo(); k = 0; //Read 320x240x2 byte from FIFO //Save as RGB565 bmp format for(i = 0; i < 240; i++) for(j = 0; j < 320; j++) { VH = myCAM.read_fifo(); VL = myCAM.read_fifo(); buf[k++] = VL; buf[k++] = VH; //Write image data to bufer if not full if(k >= 256) { //Write 256 bytes image data to file from buffer fwrite(buf,256,1,outFile); k = 0; } } //Close the file fclose(outFile); //Clear the capture done flag myCAM.clear_fifo_flag(); //Switch to LCD Mode myCAM.write_reg(ARDUCHIP_TIM, 0); return; } void Playback() { char str[8]; int k = 0; myCAM.set_mode(MCU2LCD_MODE); //Switch to MCU //myGLCD.InitLCD(PORTRAIT); while(1) { k = k + 1; itoa(k, str); strcat(str,".bmp"); inFile = fopen("preview","r"); if (! inFile) return; //myGLCD.clrScr(); //myGLCD.resetXY(); dispBitmap(inFile); fclose(inFile); wait_ms(2000); } } //Only support RGB565 bmp format void dispBitmap(FILE* fname) { uint8_t buf[256]; char VH,VL; int i,j = 0; for(i = 0 ;i < BMPIMAGEOFFSET; i++) fread(buf,256,1,fname); for(i = 0; i < 320; i++) for(j = 0; j < 240; j++) { VL = fread(buf,256,1,fname); //Serial.write(VL); VH = fread(buf,256,1,fname); //Serial.write(VH); //myGLCD.LCD_Write_DATA(VH,VL); } //myGLCD.clrXY(); }