3D point cloud scanner with OV7670 camera and line laser.
Dependencies: ADXL345_I2C_ HMC5843_ OV7670_ok SDFileSystem ST7735_TFT Servo mbed
Fork of OV7670_edm_full by
3D point cloud scanner with OV7670 FIFO camera and line laser. I take the brightest pixels in an image, I measure their horizontal displacement to deduce a depth value, and I generate XYZ coordinates. The camera is rotating, and I know the angle, so I can map 3D space in cylindrical coordinates. The home of the project is http://angelomottolese.eu.ai/sitoScanner.html
main.cpp@2:4ebec58ffaca, 2016-11-16 (annotated)
- Committer:
- rulla
- Date:
- Wed Nov 16 10:38:37 2016 +0000
- Revision:
- 2:4ebec58ffaca
- Parent:
- 1:c98598814170
- Child:
- 3:9244869157bd
a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ms523 | 0:aabbf2286bf2 | 1 | // |
ms523 | 0:aabbf2286bf2 | 2 | // OV7670 + FIFO AL422B camera board test |
ms523 | 0:aabbf2286bf2 | 3 | // |
ms523 | 0:aabbf2286bf2 | 4 | #include "mbed.h" |
rulla | 2:4ebec58ffaca | 5 | #include "OV7670.h" |
rulla | 2:4ebec58ffaca | 6 | #include "ST7735_TFT.h" |
ms523 | 0:aabbf2286bf2 | 7 | |
rulla | 2:4ebec58ffaca | 8 | OV7670 cam( |
ms523 | 0:aabbf2286bf2 | 9 | p28,p27, // SDA,SCL(I2C / SCCB) |
rulla | 2:4ebec58ffaca | 10 | p23,NC,p25, // VSYNC,HREF,WEN(FIFO) |
rulla | 2:4ebec58ffaca | 11 | Port0,0x07878000, |
rulla | 2:4ebec58ffaca | 12 | p26,p29,p30) ; // RRST,OE,RCLK |
ms523 | 0:aabbf2286bf2 | 13 | |
rulla | 2:4ebec58ffaca | 14 | ST7735_TFT TFT(p5, p6, p7, p8, p9, p10,"TFT"); // mosi, miso, sclk, cs, rs, reset |
rulla | 2:4ebec58ffaca | 15 | |
ms523 | 0:aabbf2286bf2 | 16 | Serial pc(USBTX,USBRX); |
ms523 | 0:aabbf2286bf2 | 17 | |
ms523 | 0:aabbf2286bf2 | 18 | #define SIZEX (160) |
ms523 | 0:aabbf2286bf2 | 19 | #define SIZEY (120) |
rulla | 2:4ebec58ffaca | 20 | #define SIZE SIZEX*SIZEY |
ms523 | 1:c98598814170 | 21 | |
rulla | 2:4ebec58ffaca | 22 | //unsigned char bank0[SIZE]; |
rulla | 2:4ebec58ffaca | 23 | //unsigned char *bank1 = (unsigned char *)(0x2007C000); |
rulla | 2:4ebec58ffaca | 24 | unsigned char bank0,bank1,bank2,bank3; |
ms523 | 0:aabbf2286bf2 | 25 | |
ms523 | 0:aabbf2286bf2 | 26 | int main() { |
ms523 | 0:aabbf2286bf2 | 27 | |
rulla | 2:4ebec58ffaca | 28 | pc.baud(115200); |
rulla | 2:4ebec58ffaca | 29 | |
ms523 | 0:aabbf2286bf2 | 30 | // Set up the TFT |
rulla | 2:4ebec58ffaca | 31 | /* |
ms523 | 0:aabbf2286bf2 | 32 | TFT.claim(stdout); // Send stdout to the TFT display |
ms523 | 0:aabbf2286bf2 | 33 | TFT.background(Black); // Set background to black |
ms523 | 0:aabbf2286bf2 | 34 | TFT.foreground(White); // Set chars to white |
ms523 | 0:aabbf2286bf2 | 35 | TFT.cls(); // Clear the screen |
ms523 | 0:aabbf2286bf2 | 36 | TFT.set_orientation(3); // Select orientation |
rulla | 2:4ebec58ffaca | 37 | */ |
rulla | 2:4ebec58ffaca | 38 | TFT.set_orientation(3); |
rulla | 2:4ebec58ffaca | 39 | |
rulla | 2:4ebec58ffaca | 40 | cam.Reset() ; |
rulla | 2:4ebec58ffaca | 41 | pc.printf("\r\nDefault\r\n"); |
rulla | 2:4ebec58ffaca | 42 | int i; |
rulla | 2:4ebec58ffaca | 43 | char data1[OV7670_REGMAX],data2[OV7670_REGMAX]; |
rulla | 2:4ebec58ffaca | 44 | for (i=0;i<OV7670_REGMAX;i++) |
rulla | 2:4ebec58ffaca | 45 | { |
rulla | 2:4ebec58ffaca | 46 | data1[i]=cam.ReadReg(i); // READ REG |
rulla | 2:4ebec58ffaca | 47 | //if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); |
rulla | 2:4ebec58ffaca | 48 | //pc.printf("Add %02X = %02X ,",i,data); |
rulla | 2:4ebec58ffaca | 49 | } |
rulla | 2:4ebec58ffaca | 50 | cam.InitQQVGA() ; |
rulla | 2:4ebec58ffaca | 51 | pc.printf("\r\nDefault\r\n"); |
rulla | 2:4ebec58ffaca | 52 | for (i=0;i<OV7670_REGMAX;i++) |
rulla | 2:4ebec58ffaca | 53 | { |
rulla | 2:4ebec58ffaca | 54 | data2[i]=cam.ReadReg(i); // READ REG |
rulla | 2:4ebec58ffaca | 55 | // if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); |
rulla | 2:4ebec58ffaca | 56 | if(data1[i]!=data2[i]) pc.printf("Add %02X = %02X/%02X ,",i,data1[i],data2[i]); |
rulla | 2:4ebec58ffaca | 57 | } |
rulla | 2:4ebec58ffaca | 58 | int j=0; |
rulla | 2:4ebec58ffaca | 59 | |
rulla | 2:4ebec58ffaca | 60 | //while(j<15){ |
rulla | 2:4ebec58ffaca | 61 | while(1){ |
rulla | 2:4ebec58ffaca | 62 | // Kick things off by capturing an image |
rulla | 2:4ebec58ffaca | 63 | cam.CaptureNext() ; |
rulla | 2:4ebec58ffaca | 64 | while (cam.CaptureDone()==0) ; |
ms523 | 0:aabbf2286bf2 | 65 | |
rulla | 2:4ebec58ffaca | 66 | pc.printf("Done %d\n",cam.CaptureDone()); |
rulla | 2:4ebec58ffaca | 67 | int x=0,y=0, r=0,g=0,b=0,colour; |
rulla | 2:4ebec58ffaca | 68 | char rr,gg,bb; |
ms523 | 1:c98598814170 | 69 | // Start reading in the image data from the camera hardware buffer |
rulla | 2:4ebec58ffaca | 70 | cam.ReadStart(); |
rulla | 2:4ebec58ffaca | 71 | |
ms523 | 1:c98598814170 | 72 | for (int i = 0; i < SIZE; i++) { |
rulla | 2:4ebec58ffaca | 73 | //if(i==0) cam.ReadOneByte(); |
ms523 | 0:aabbf2286bf2 | 74 | |
rulla | 2:4ebec58ffaca | 75 | bank0 = cam.ReadOneByte(); |
rulla | 2:4ebec58ffaca | 76 | bank1 = cam.ReadOneByte(); |
rulla | 2:4ebec58ffaca | 77 | //bank1=0; |
rulla | 2:4ebec58ffaca | 78 | //RGB |
rulla | 2:4ebec58ffaca | 79 | |
rulla | 2:4ebec58ffaca | 80 | rr=(bank1 & 0x1f) ; |
rulla | 2:4ebec58ffaca | 81 | gg= ((bank0<<3) & 0x38) | ((bank1>>5)&0x07); |
rulla | 2:4ebec58ffaca | 82 | b=(bank0 & 0xf8)>>3 ; |
rulla | 2:4ebec58ffaca | 83 | //444 |
rulla | 2:4ebec58ffaca | 84 | /* |
rulla | 2:4ebec58ffaca | 85 | b = (bank0 & 0x0F) ; |
rulla | 2:4ebec58ffaca | 86 | g = (bank1 & 0xF0) >> 4 ; |
rulla | 2:4ebec58ffaca | 87 | r = (bank1 & 0x0F) ; |
rulla | 2:4ebec58ffaca | 88 | */ |
rulla | 2:4ebec58ffaca | 89 | colour = ((r<<11)+(g<<5)+b); |
rulla | 2:4ebec58ffaca | 90 | if(i%200==0) pc.printf("RGB %d %d %d, B0 %d, B1 %d\n",rr,gg,b,bank0,bank1); |
rulla | 2:4ebec58ffaca | 91 | // TFT.pixel(x,y,colour); |
rulla | 2:4ebec58ffaca | 92 | TFT.pixel(x,y,rr); |
rulla | 2:4ebec58ffaca | 93 | |
rulla | 2:4ebec58ffaca | 94 | x++; |
rulla | 2:4ebec58ffaca | 95 | if(i%SIZEX==0) x=0,y++; |
rulla | 2:4ebec58ffaca | 96 | } |
ms523 | 1:c98598814170 | 97 | |
rulla | 2:4ebec58ffaca | 98 | cam.ReadStop() ; |
rulla | 2:4ebec58ffaca | 99 | //TFT.Bitmap(0,0,160,60,bank1); |
rulla | 2:4ebec58ffaca | 100 | //TFT.Bitmap(0,60,160,60,bank0); |
rulla | 2:4ebec58ffaca | 101 | x=0;y=0; |
rulla | 2:4ebec58ffaca | 102 | /* |
rulla | 2:4ebec58ffaca | 103 | for (int i = 0; i <= SIZE; i++) { |
rulla | 2:4ebec58ffaca | 104 | if(i==SIZEX) x=0,y++; |
rulla | 2:4ebec58ffaca | 105 | r=(bank0[i]&0xF8)>>3; |
rulla | 2:4ebec58ffaca | 106 | // TFT.pixel(x,y,bank0[i]); |
rulla | 2:4ebec58ffaca | 107 | } |
rulla | 2:4ebec58ffaca | 108 | */ |
rulla | 2:4ebec58ffaca | 109 | //j++; |
ms523 | 0:aabbf2286bf2 | 110 | } |
rulla | 2:4ebec58ffaca | 111 | } |