First release.

Dependencies:   TextLCD mbed

Sample code of section 4 in Oct 2014 issue of the Interface Magazine, published by CQ publishing in Japan. CQ出版社インターフェース誌 2014年10月号4章に掲載のサンプルコードです.

LPC1768にトラ技OV7670モジュールを接続し,撮影した画像をBMPファイルとしてフラッシュメモリに保存します(PCから見ることができます).このコードのうちカメラ制御部には,Sadaei Osakabe氏のコードを流用させていただいています.

Committer:
smorioka
Date:
Tue Aug 26 16:47:47 2014 +0000
Revision:
0:33db72b46e9b
Sample code of section 4 in Oct 2014 issue of the Interface Magazine, published by CQ publishing in Japan.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
smorioka 0:33db72b46e9b 1 /*
smorioka 0:33db72b46e9b 2 * Copyright (c) 2014, Sumio Morioka
smorioka 0:33db72b46e9b 3 * All rights reserved.
smorioka 0:33db72b46e9b 4 *
smorioka 0:33db72b46e9b 5 * This source code was originally written by Dr.Sumio Morioka for use in the Oct 2014 issue of
smorioka 0:33db72b46e9b 6 * "the Interface magazine", published by CQ publishing Co.Ltd in Japan (http://www.cqpub.co.jp).
smorioka 0:33db72b46e9b 7 * The author has no responsibility on any results caused by using this code.
smorioka 0:33db72b46e9b 8 *
smorioka 0:33db72b46e9b 9 * - Distribution date of this code: Aug 26, 2014
smorioka 0:33db72b46e9b 10 * - Author: Dr.Sumio Morioka (http://www002.upp.so-net.ne.jp/morioka)
smorioka 0:33db72b46e9b 11 *
smorioka 0:33db72b46e9b 12 *
smorioka 0:33db72b46e9b 13 * IMPORTANT NOTICE:
smorioka 0:33db72b46e9b 14 * Redistribution and use in source and binary forms, with or without
smorioka 0:33db72b46e9b 15 * modification, are permitted provided that the following conditions are met:
smorioka 0:33db72b46e9b 16 * * Redistributions of source code must retain the above copyright
smorioka 0:33db72b46e9b 17 * notice, this list of conditions and the following disclaimer.
smorioka 0:33db72b46e9b 18 * * Redistributions in binary form must reproduce the above copyright
smorioka 0:33db72b46e9b 19 * notice, this list of conditions and the following disclaimer in the
smorioka 0:33db72b46e9b 20 * documentation and/or other materials provided with the distribution.
smorioka 0:33db72b46e9b 21 * * Neither the name of the copyright holder nor the
smorioka 0:33db72b46e9b 22 * names of its contributors may be used to endorse or promote products
smorioka 0:33db72b46e9b 23 * derived from this software without specific prior written permission.
smorioka 0:33db72b46e9b 24 *
smorioka 0:33db72b46e9b 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
smorioka 0:33db72b46e9b 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
smorioka 0:33db72b46e9b 27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
smorioka 0:33db72b46e9b 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
smorioka 0:33db72b46e9b 29 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
smorioka 0:33db72b46e9b 30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
smorioka 0:33db72b46e9b 31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
smorioka 0:33db72b46e9b 32 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
smorioka 0:33db72b46e9b 33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
smorioka 0:33db72b46e9b 34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
smorioka 0:33db72b46e9b 35 */
smorioka 0:33db72b46e9b 36
smorioka 0:33db72b46e9b 37 #include "mbed.h"
smorioka 0:33db72b46e9b 38 #include "TextLCD.h"
smorioka 0:33db72b46e9b 39 #include "LocalFileSystem.h"
smorioka 0:33db72b46e9b 40
smorioka 0:33db72b46e9b 41 #include "ov7670.h"
smorioka 0:33db72b46e9b 42
smorioka 0:33db72b46e9b 43 TextLCD lcd(p24, p26, p27, p28, p29, p30);
smorioka 0:33db72b46e9b 44 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
smorioka 0:33db72b46e9b 45 PwmOut sv0(p21), sv1(p22), sv2(p23);
smorioka 0:33db72b46e9b 46
smorioka 0:33db72b46e9b 47 LocalFileSystem local("webfs");
smorioka 0:33db72b46e9b 48
smorioka 0:33db72b46e9b 49 OV7670 camera(
smorioka 0:33db72b46e9b 50 p9,p10, // SDA,SCL(I2C / SCCB)
smorioka 0:33db72b46e9b 51 p5,p6,p7, // VSYNC,HREF,WEN(FIFO)
smorioka 0:33db72b46e9b 52 p20,p19,p18,p17,p16,p15,p14,p13, // D7-D0
smorioka 0:33db72b46e9b 53 p8,p11,p12); // RRST,OE,RCLK
smorioka 0:33db72b46e9b 54
smorioka 0:33db72b46e9b 55 Timer tmr;
smorioka 0:33db72b46e9b 56
smorioka 0:33db72b46e9b 57 //#define QQVGA
smorioka 0:33db72b46e9b 58 #define QVGA
smorioka 0:33db72b46e9b 59 //#define VGA34
smorioka 0:33db72b46e9b 60
smorioka 0:33db72b46e9b 61 #ifdef QQVGA
smorioka 0:33db72b46e9b 62 #define SIZEX 160
smorioka 0:33db72b46e9b 63 #define SIZEY 120
smorioka 0:33db72b46e9b 64 #endif
smorioka 0:33db72b46e9b 65
smorioka 0:33db72b46e9b 66 #ifdef QVGA
smorioka 0:33db72b46e9b 67 #define SIZEX 320
smorioka 0:33db72b46e9b 68 #define SIZEY 240
smorioka 0:33db72b46e9b 69 #endif
smorioka 0:33db72b46e9b 70
smorioka 0:33db72b46e9b 71 #ifdef VGA34
smorioka 0:33db72b46e9b 72 #define SIZEX 480
smorioka 0:33db72b46e9b 73 #define SIZEY 360
smorioka 0:33db72b46e9b 74 #endif
smorioka 0:33db72b46e9b 75
smorioka 0:33db72b46e9b 76
smorioka 0:33db72b46e9b 77 void cam_cap(void);
smorioka 0:33db72b46e9b 78
smorioka 0:33db72b46e9b 79 int main()
smorioka 0:33db72b46e9b 80 {
smorioka 0:33db72b46e9b 81 led1 = 0;
smorioka 0:33db72b46e9b 82 led2 = 0;
smorioka 0:33db72b46e9b 83 led3 = 0;
smorioka 0:33db72b46e9b 84 led4 = 0;
smorioka 0:33db72b46e9b 85
smorioka 0:33db72b46e9b 86 sv0.period_us(20000); // 20ms
smorioka 0:33db72b46e9b 87 sv0.pulsewidth_us(5000); // 5ms
smorioka 0:33db72b46e9b 88
smorioka 0:33db72b46e9b 89 sv1.period_us(20000); // 20ms
smorioka 0:33db72b46e9b 90 sv1.pulsewidth_us(10000); // 10ms
smorioka 0:33db72b46e9b 91
smorioka 0:33db72b46e9b 92 sv2.period_us(20000); // 20ms
smorioka 0:33db72b46e9b 93 sv2.pulsewidth_us(15000); // 15ms
smorioka 0:33db72b46e9b 94
smorioka 0:33db72b46e9b 95 ////////////////////////////////////////////////////////////////////////////
smorioka 0:33db72b46e9b 96 camera.WriteReg(0x12, 0x80); // com7; reset
smorioka 0:33db72b46e9b 97 wait_ms(200);
smorioka 0:33db72b46e9b 98
smorioka 0:33db72b46e9b 99 camera.InitDefaultReg();
smorioka 0:33db72b46e9b 100
smorioka 0:33db72b46e9b 101 // negate vsync
smorioka 0:33db72b46e9b 102 camera.WriteReg(0x15, 0x02); // com10; negative vsync
smorioka 0:33db72b46e9b 103
smorioka 0:33db72b46e9b 104 #ifdef QQVGA
smorioka 0:33db72b46e9b 105 camera.InitQQVGA();
smorioka 0:33db72b46e9b 106 #endif
smorioka 0:33db72b46e9b 107 #ifdef QVGA
smorioka 0:33db72b46e9b 108 camera.InitQVGA();
smorioka 0:33db72b46e9b 109 #endif
smorioka 0:33db72b46e9b 110 #ifdef VGA34
smorioka 0:33db72b46e9b 111 camera.InitVGA_3_4();
smorioka 0:33db72b46e9b 112 #endif
smorioka 0:33db72b46e9b 113
smorioka 0:33db72b46e9b 114 // data format
smorioka 0:33db72b46e9b 115 camera.WriteReg(0x12, 0x04 + 0); // com7 RGB (bit1...test pattern)
smorioka 0:33db72b46e9b 116 camera.WriteReg(0x40, 0xD0); // com15 RGB565
smorioka 0:33db72b46e9b 117 camera.WriteReg(0x8c, 0x00); // RGB444
smorioka 0:33db72b46e9b 118
smorioka 0:33db72b46e9b 119 wait_ms(300);
smorioka 0:33db72b46e9b 120
smorioka 0:33db72b46e9b 121 lcd.locate(0, 0);
smorioka 0:33db72b46e9b 122 lcd.printf("Capture");
smorioka 0:33db72b46e9b 123 tmr.start(); // timer
smorioka 0:33db72b46e9b 124
smorioka 0:33db72b46e9b 125 cam_cap();
smorioka 0:33db72b46e9b 126
smorioka 0:33db72b46e9b 127 tmr.stop(); // timer
smorioka 0:33db72b46e9b 128 lcd.locate(0, 1);
smorioka 0:33db72b46e9b 129 lcd.printf("%dms", tmr.read_ms());
smorioka 0:33db72b46e9b 130
smorioka 0:33db72b46e9b 131 //////////////////////////////////////////////////
smorioka 0:33db72b46e9b 132 while (1) {
smorioka 0:33db72b46e9b 133 led1 = 1;
smorioka 0:33db72b46e9b 134 // wait_ms(100);
smorioka 0:33db72b46e9b 135 }
smorioka 0:33db72b46e9b 136
smorioka 0:33db72b46e9b 137 }
smorioka 0:33db72b46e9b 138
smorioka 0:33db72b46e9b 139
smorioka 0:33db72b46e9b 140 //void cam_capture(char *input, char *output) // compile error
smorioka 0:33db72b46e9b 141 //void cam_cap(Arguments* input, Reply* output)
smorioka 0:33db72b46e9b 142 void cam_cap(void)
smorioka 0:33db72b46e9b 143 {
smorioka 0:33db72b46e9b 144 FILE *fp_bmp;
smorioka 0:33db72b46e9b 145 unsigned int d1, d2;
smorioka 0:33db72b46e9b 146 unsigned char sort[3];
smorioka 0:33db72b46e9b 147
smorioka 0:33db72b46e9b 148 led2 = 1;
smorioka 0:33db72b46e9b 149
smorioka 0:33db72b46e9b 150 fp_bmp = fopen("/webfs/cam.bmp", "wb");
smorioka 0:33db72b46e9b 151
smorioka 0:33db72b46e9b 152 /////////////////////////
smorioka 0:33db72b46e9b 153 // file header
smorioka 0:33db72b46e9b 154 /////////////////////////
smorioka 0:33db72b46e9b 155 fprintf(fp_bmp, "BM");
smorioka 0:33db72b46e9b 156 int val = 14 + 40 + SIZEX * SIZEY * 3; // file size
smorioka 0:33db72b46e9b 157 fprintf(fp_bmp, "%c%c%c%c", val % 0x100, val / 0x100, val / 0x10000, val / 0x1000000);
smorioka 0:33db72b46e9b 158 fprintf(fp_bmp, "%c%c%c%c%c%c%c%c", 0, 0, 0, 0, 0x36, 0, 0, 0);
smorioka 0:33db72b46e9b 159
smorioka 0:33db72b46e9b 160 /////////////////////////
smorioka 0:33db72b46e9b 161 // information header
smorioka 0:33db72b46e9b 162 /////////////////////////
smorioka 0:33db72b46e9b 163 fprintf(fp_bmp, "%c%c%c%c", 0x28, 0, 0, 0); // header size
smorioka 0:33db72b46e9b 164 fprintf(fp_bmp, "%c%c%c%c", SIZEX % 0x100, SIZEX / 0x100, SIZEX / 0x10000, SIZEX / 0x1000000);
smorioka 0:33db72b46e9b 165 fprintf(fp_bmp, "%c%c%c%c", SIZEY % 0x100, SIZEY / 0x100, SIZEY / 0x10000, SIZEY / 0x1000000);
smorioka 0:33db72b46e9b 166 fprintf(fp_bmp, "%c%c", 1, 0); // # of plane
smorioka 0:33db72b46e9b 167 fprintf(fp_bmp, "%c%c", 24, 0); // bit count
smorioka 0:33db72b46e9b 168 fprintf(fp_bmp, "%c%c%c%c", 0, 0, 0, 0); // compression
smorioka 0:33db72b46e9b 169 val = SIZEX * SIZEY * 3; // data size
smorioka 0:33db72b46e9b 170 fprintf(fp_bmp, "%c%c%c%c", val % 0x100, val / 0x100, val / 0x10000, val / 0x1000000);
smorioka 0:33db72b46e9b 171 fprintf(fp_bmp, "%c%c%c%c", 0, 0, 0, 0);
smorioka 0:33db72b46e9b 172 fprintf(fp_bmp, "%c%c%c%c", 0, 0, 0, 0);
smorioka 0:33db72b46e9b 173 fprintf(fp_bmp, "%c%c%c%c", 0, 0, 0, 0);
smorioka 0:33db72b46e9b 174 fprintf(fp_bmp, "%c%c%c%c", 0, 0, 0, 0);
smorioka 0:33db72b46e9b 175
smorioka 0:33db72b46e9b 176 camera.CaptureNext(); // sample start!
smorioka 0:33db72b46e9b 177
smorioka 0:33db72b46e9b 178 while(camera.CaptureDone() == false)
smorioka 0:33db72b46e9b 179 ;
smorioka 0:33db72b46e9b 180
smorioka 0:33db72b46e9b 181 camera.ReadStart(); // reset pointer
smorioka 0:33db72b46e9b 182
smorioka 0:33db72b46e9b 183 led3 = 1;
smorioka 0:33db72b46e9b 184
smorioka 0:33db72b46e9b 185 for (int y = 0;y < SIZEY;y++) {
smorioka 0:33db72b46e9b 186 for (int x = 0;x < SIZEX;x++) {
smorioka 0:33db72b46e9b 187 d1 = camera.ReadOneByte() ; // upper nibble is XXX , lower nibble is B
smorioka 0:33db72b46e9b 188 d2 = camera.ReadOneByte() ; // upper nibble is G , lower nibble is R
smorioka 0:33db72b46e9b 189
smorioka 0:33db72b46e9b 190 // RGB565
smorioka 0:33db72b46e9b 191 sort[0] = ((d1 & 0xF8) >> 3) << 3; // R
smorioka 0:33db72b46e9b 192 sort[1] = ( ((d1 & 0x07) << 3) + ((d2 & 0xE0) >> 5) ) << 2; // G
smorioka 0:33db72b46e9b 193 sort[2] = (d2 & 0x1F) << 3; // B
smorioka 0:33db72b46e9b 194
smorioka 0:33db72b46e9b 195 fprintf(fp_bmp, "%c%c%c", sort[2], sort[1], sort[0]); // B,G,R
smorioka 0:33db72b46e9b 196 }
smorioka 0:33db72b46e9b 197 }
smorioka 0:33db72b46e9b 198
smorioka 0:33db72b46e9b 199 camera.ReadStop();
smorioka 0:33db72b46e9b 200 fclose(fp_bmp);
smorioka 0:33db72b46e9b 201
smorioka 0:33db72b46e9b 202 led2 = 0;
smorioka 0:33db72b46e9b 203 led3 = 0;
smorioka 0:33db72b46e9b 204 // led4 = 0;
smorioka 0:33db72b46e9b 205 }
smorioka 0:33db72b46e9b 206
smorioka 0:33db72b46e9b 207 // end of file