OV7670 + 23LC1024 + Bluetooth

Dependencies:   FastPWM MODSERIAL mbed

Committer:
sampullman
Date:
Tue Jul 23 06:36:50 2013 +0000
Revision:
2:a7f5fa80a385
Parent:
1:6e4d2cff76e8
Fixed OV7670.cpp file name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sampullman 0:f309a2b2f27b 1 #include "mbed.h"
sampullman 1:6e4d2cff76e8 2 #include "Constants.h"
sampullman 0:f309a2b2f27b 3 #include "OV7670.h"
sampullman 0:f309a2b2f27b 4 #include "FastPWM.h"
sampullman 1:6e4d2cff76e8 5 #include "spi_ram.h"
sampullman 1:6e4d2cff76e8 6 #include "MODSERIAL.h"
sampullman 0:f309a2b2f27b 7
sampullman 0:f309a2b2f27b 8 #define SIZEX (160)
sampullman 0:f309a2b2f27b 9 #define SIZEY (120)
sampullman 0:f309a2b2f27b 10 #define SIZE 19200
sampullman 0:f309a2b2f27b 11
sampullman 0:f309a2b2f27b 12 OV7670 camera(
sampullman 0:f309a2b2f27b 13 p28, p27, // SDA,SCL(I2C / SCCB)
sampullman 0:f309a2b2f27b 14 p21, p22, p23, p24, // XCLK, PCLK, VSYNC, HREF
sampullman 0:f309a2b2f27b 15 Port0, 0x07878000); // D0-D7 -> P11-p18
sampullman 0:f309a2b2f27b 16
sampullman 0:f309a2b2f27b 17 Serial host(USBTX, USBRX);
sampullman 1:6e4d2cff76e8 18 MODSERIAL bt(p9, p10, 16384, 512);
sampullman 0:f309a2b2f27b 19 DigitalOut status(p20);
sampullman 1:6e4d2cff76e8 20 int feedMode = 0;
sampullman 0:f309a2b2f27b 21
sampullman 0:f309a2b2f27b 22 int hexToInt(int i) {
sampullman 0:f309a2b2f27b 23 if(i >= '0' && i <= '9') return i - '0';
sampullman 0:f309a2b2f27b 24 else if(i >= 'A' && i <= 'F') return i - 55;
sampullman 0:f309a2b2f27b 25 else return 0;
sampullman 0:f309a2b2f27b 26 }
sampullman 0:f309a2b2f27b 27
sampullman 0:f309a2b2f27b 28 int getHexWord(Serial *ser) {
sampullman 0:f309a2b2f27b 29 int b1 = ser->getc();
sampullman 0:f309a2b2f27b 30 int b2 = ser->getc();
sampullman 0:f309a2b2f27b 31 return (hexToInt(b1) << 4) | hexToInt(b2);
sampullman 0:f309a2b2f27b 32 }
sampullman 0:f309a2b2f27b 33
sampullman 1:6e4d2cff76e8 34 void readLine(Serial *ser, char *data) {
sampullman 1:6e4d2cff76e8 35 int i=0;
sampullman 1:6e4d2cff76e8 36 char c = '0';
sampullman 1:6e4d2cff76e8 37 while(c != '\n') {
sampullman 1:6e4d2cff76e8 38 if(ser->readable()) {
sampullman 1:6e4d2cff76e8 39 c = ser->getc();
sampullman 1:6e4d2cff76e8 40 data[i++] = c;
sampullman 1:6e4d2cff76e8 41 }
sampullman 0:f309a2b2f27b 42 }
sampullman 1:6e4d2cff76e8 43 data[i] = '\0';
sampullman 0:f309a2b2f27b 44 }
sampullman 0:f309a2b2f27b 45
sampullman 0:f309a2b2f27b 46 int main() {
sampullman 0:f309a2b2f27b 47 host.baud(115200);
sampullman 1:6e4d2cff76e8 48 bt.baud(230400);
sampullman 0:f309a2b2f27b 49
sampullman 0:f309a2b2f27b 50 // Initialize a 12Mhz XCLK for the camera
sampullman 0:f309a2b2f27b 51 camera.Init();
sampullman 0:f309a2b2f27b 52
sampullman 0:f309a2b2f27b 53 // Reset camera on power up
sampullman 0:f309a2b2f27b 54 camera.Reset();
sampullman 0:f309a2b2f27b 55
sampullman 0:f309a2b2f27b 56 // Set up for 160*120 pixels RGB565
sampullman 0:f309a2b2f27b 57 camera.InitQQVGA();
sampullman 0:f309a2b2f27b 58
sampullman 0:f309a2b2f27b 59 char c;
sampullman 1:6e4d2cff76e8 60 char data[20];
sampullman 0:f309a2b2f27b 61 while(1) {
sampullman 1:6e4d2cff76e8 62 if(bt.readable()) {
sampullman 1:6e4d2cff76e8 63 c = bt.getc();
sampullman 1:6e4d2cff76e8 64 switch(c) {
sampullman 1:6e4d2cff76e8 65 case REQUEST_PROFILE:
sampullman 1:6e4d2cff76e8 66 host.printf("Profile requested\n\r");
sampullman 1:6e4d2cff76e8 67 bt.putc(CLIENT_PROFILE);
sampullman 1:6e4d2cff76e8 68 bt.putc((TAPCAM_ID >> 4) & 0x0F);
sampullman 1:6e4d2cff76e8 69 bt.putc(TAPCAM_ID & 0x0F);
sampullman 1:6e4d2cff76e8 70 bt.printf("device\n");
sampullman 1:6e4d2cff76e8 71 break;
sampullman 1:6e4d2cff76e8 72 case CLIENT_PROFILE: {
sampullman 1:6e4d2cff76e8 73 host.printf("Client profile:\n\r");
sampullman 1:6e4d2cff76e8 74 int id = bt.getc() << 4;
sampullman 1:6e4d2cff76e8 75 id |= bt.getc();
sampullman 1:6e4d2cff76e8 76 readLine(&bt, data);
sampullman 1:6e4d2cff76e8 77 host.printf("ID: %d\n\r", id);
sampullman 1:6e4d2cff76e8 78 host.printf("Type: %s\n\r", data);
sampullman 1:6e4d2cff76e8 79 break;
sampullman 1:6e4d2cff76e8 80 }
sampullman 1:6e4d2cff76e8 81 case FEED_REQUEST:
sampullman 1:6e4d2cff76e8 82 host.printf("Feed requested\n\r");
sampullman 1:6e4d2cff76e8 83 bt.putc(FEED_START);
sampullman 1:6e4d2cff76e8 84 break;
sampullman 1:6e4d2cff76e8 85 case FEED_START_ACK:
sampullman 1:6e4d2cff76e8 86 host.printf("Feed start acknowledged\n\r");
sampullman 1:6e4d2cff76e8 87 feedMode = 1;
sampullman 1:6e4d2cff76e8 88 break;
sampullman 1:6e4d2cff76e8 89 case FEED_CANCEL:
sampullman 1:6e4d2cff76e8 90 host.printf("Feed canceled\n\r");
sampullman 1:6e4d2cff76e8 91 feedMode = 0;
sampullman 1:6e4d2cff76e8 92 break;
sampullman 1:6e4d2cff76e8 93 }
sampullman 1:6e4d2cff76e8 94 }
sampullman 1:6e4d2cff76e8 95 if(feedMode) {
sampullman 1:6e4d2cff76e8 96 int bytes = camera.captureImage();
sampullman 1:6e4d2cff76e8 97 bt.putc(FRAME_READ);
sampullman 1:6e4d2cff76e8 98 bt.printf(ORIENTATION);
sampullman 1:6e4d2cff76e8 99 bt.printf("%d\n", bytes);
sampullman 1:6e4d2cff76e8 100 camera.sendImage(&bt, bytes);
sampullman 1:6e4d2cff76e8 101 host.printf("Sent %d\n\r", bytes);
sampullman 1:6e4d2cff76e8 102 wait_ms(100);
sampullman 1:6e4d2cff76e8 103 }
sampullman 0:f309a2b2f27b 104 if(host.readable()) {
sampullman 0:f309a2b2f27b 105 c = host.getc();
sampullman 1:6e4d2cff76e8 106 if(c == 'r') {
sampullman 1:6e4d2cff76e8 107 int reg = getHexWord(&host);
sampullman 1:6e4d2cff76e8 108 host.printf("%d\n\r", camera.ReadReg(reg));
sampullman 1:6e4d2cff76e8 109 } else if(c == 'w') {
sampullman 1:6e4d2cff76e8 110 int reg = getHexWord(&host);
sampullman 1:6e4d2cff76e8 111 int val = getHexWord(&host);
sampullman 1:6e4d2cff76e8 112 camera.WriteReg(reg, val);
sampullman 1:6e4d2cff76e8 113 host.printf("%d\n\r", camera.ReadReg(reg));
sampullman 1:6e4d2cff76e8 114 } else if(c == 't') {
sampullman 1:6e4d2cff76e8 115 camera.scopeTest(&host);
sampullman 1:6e4d2cff76e8 116 } else if(c == 'c') {
sampullman 1:6e4d2cff76e8 117 status = 1;
sampullman 1:6e4d2cff76e8 118 int bytes = camera.captureImage();
sampullman 1:6e4d2cff76e8 119 host.printf("%d\n", bytes);
sampullman 1:6e4d2cff76e8 120 camera.sendImage(&host, bytes);
sampullman 1:6e4d2cff76e8 121 status = 0;
sampullman 1:6e4d2cff76e8 122 } else if(c == 's') {
sampullman 1:6e4d2cff76e8 123 feedMode = false;
sampullman 1:6e4d2cff76e8 124 } else if(c == 'p') {
sampullman 1:6e4d2cff76e8 125 bt.putc(REQUEST_PROFILE);
sampullman 1:6e4d2cff76e8 126 }
sampullman 0:f309a2b2f27b 127 }
sampullman 0:f309a2b2f27b 128 }
sampullman 0:f309a2b2f27b 129 }
sampullman 0:f309a2b2f27b 130