MARMEX-VB : "Mary Camera module" library
Dependents: MARMEX_VB_test MARMEX_VB_Hello
MARMEX-VB (MARY-VB) camera module library for mbed. (This module may be available in Japan only.)
Kown problem / 既知の問題
The read data may have contouring. In this case, it may require reset or changing order of data reading. The order change API is available as "read_order_change()" function.
カメラから読み出したデータに擬似輪郭が発生することがあります.この問題にはシステム全体のリセットを行うか,または読み出し順の変更を行うことで対処して下さい.読み出し順の変更はAPIの"read_order_change()"関数を使うことができます.
MARMEX_VB.h@0:c4d14dd5d479, 2014-06-06 (annotated)
- Committer:
- nxpfan
- Date:
- Fri Jun 06 03:36:58 2014 +0000
- Revision:
- 0:c4d14dd5d479
- Child:
- 1:b2324313d4da
version 0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nxpfan | 0:c4d14dd5d479 | 1 | /** MARMEX_VB Camera control library |
nxpfan | 0:c4d14dd5d479 | 2 | * |
nxpfan | 0:c4d14dd5d479 | 3 | * @class MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 4 | * @version 0.1 |
nxpfan | 0:c4d14dd5d479 | 5 | * @date 10-Jun-2014 |
nxpfan | 0:c4d14dd5d479 | 6 | * |
nxpfan | 0:c4d14dd5d479 | 7 | * Released under the Apache License, Version 2.0 : http://mbed.org/handbook/Apache-Licence |
nxpfan | 0:c4d14dd5d479 | 8 | * |
nxpfan | 0:c4d14dd5d479 | 9 | * MARMEX_VB Camera control library for mbed |
nxpfan | 0:c4d14dd5d479 | 10 | */ |
nxpfan | 0:c4d14dd5d479 | 11 | |
nxpfan | 0:c4d14dd5d479 | 12 | #ifndef MBED_MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 13 | #define MBED_MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 14 | |
nxpfan | 0:c4d14dd5d479 | 15 | /** MARMEX_VB class |
nxpfan | 0:c4d14dd5d479 | 16 | * |
nxpfan | 0:c4d14dd5d479 | 17 | * MARMEX_VB camera control library |
nxpfan | 0:c4d14dd5d479 | 18 | * This driver provide controls and data transfer interface for MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 19 | * |
nxpfan | 0:c4d14dd5d479 | 20 | * Example: |
nxpfan | 0:c4d14dd5d479 | 21 | * @code |
nxpfan | 0:c4d14dd5d479 | 22 | * |
nxpfan | 0:c4d14dd5d479 | 23 | * #include "mbed.h" |
nxpfan | 0:c4d14dd5d479 | 24 | * #include "MARMEX_OB_oled.h" |
nxpfan | 0:c4d14dd5d479 | 25 | * #include "MARMEX_VB.h" |
nxpfan | 0:c4d14dd5d479 | 26 | * |
nxpfan | 0:c4d14dd5d479 | 27 | * MARMEX_OB_oled oled1( p5, p7, p20, p16, p15 ); // mosi, sclk, cs, rst, power_control -- maple-mini-type-b-board-slot1 |
nxpfan | 0:c4d14dd5d479 | 28 | * MARMEX_VB camera( p5, p6, p7, p22, p26, p28, p27 ); // mosi, miso, sclk, cs, reset, I2C_SDA, I2C_SCL -- maple-mini-type-b-board-slot2 |
nxpfan | 0:c4d14dd5d479 | 29 | * BusOut led( LED3, LED4 ); |
nxpfan | 0:c4d14dd5d479 | 30 | * |
nxpfan | 0:c4d14dd5d479 | 31 | * #define X_OFFSET ((MARMEX_VB::PIXEL_PER_LINE - MARMEX_OB_oled::WIDTH ) / 2) |
nxpfan | 0:c4d14dd5d479 | 32 | * #define Y_OFFSET ((MARMEX_VB::LINE_PER_FRAME - MARMEX_OB_oled::HEIGHT) / 2) |
nxpfan | 0:c4d14dd5d479 | 33 | * |
nxpfan | 0:c4d14dd5d479 | 34 | * int main() |
nxpfan | 0:c4d14dd5d479 | 35 | * { |
nxpfan | 0:c4d14dd5d479 | 36 | * led = 0x3; |
nxpfan | 0:c4d14dd5d479 | 37 | * |
nxpfan | 0:c4d14dd5d479 | 38 | * oled1.cls(); |
nxpfan | 0:c4d14dd5d479 | 39 | * |
nxpfan | 0:c4d14dd5d479 | 40 | * short buf[ MARMEX_OB_oled::WIDTH ]; |
nxpfan | 0:c4d14dd5d479 | 41 | * |
nxpfan | 0:c4d14dd5d479 | 42 | * while ( 1 ) { |
nxpfan | 0:c4d14dd5d479 | 43 | * |
nxpfan | 0:c4d14dd5d479 | 44 | * led = 0x1; |
nxpfan | 0:c4d14dd5d479 | 45 | * camera.open_transfer(); |
nxpfan | 0:c4d14dd5d479 | 46 | * |
nxpfan | 0:c4d14dd5d479 | 47 | * for ( int line = 0; line < 128; line++ ) { |
nxpfan | 0:c4d14dd5d479 | 48 | * camera.read_a_line( buf, line + Y_OFFSET, X_OFFSET, 128 ); |
nxpfan | 0:c4d14dd5d479 | 49 | * oled1.blit565( 0, line, 128, 1, buf ); |
nxpfan | 0:c4d14dd5d479 | 50 | * } |
nxpfan | 0:c4d14dd5d479 | 51 | * |
nxpfan | 0:c4d14dd5d479 | 52 | * camera.close_transfer(); |
nxpfan | 0:c4d14dd5d479 | 53 | * led = 0x2; |
nxpfan | 0:c4d14dd5d479 | 54 | * } |
nxpfan | 0:c4d14dd5d479 | 55 | * } |
nxpfan | 0:c4d14dd5d479 | 56 | * @endcode |
nxpfan | 0:c4d14dd5d479 | 57 | */ |
nxpfan | 0:c4d14dd5d479 | 58 | |
nxpfan | 0:c4d14dd5d479 | 59 | #define DEFAULT_PICTURE_SIZE QCIF |
nxpfan | 0:c4d14dd5d479 | 60 | //#define DEFAULT_PICTURE_SIZE VGA |
nxpfan | 0:c4d14dd5d479 | 61 | //#define DEFAULT_PICTURE_SIZE QVGA |
nxpfan | 0:c4d14dd5d479 | 62 | //#define DEFAULT_PICTURE_SIZE QQVGA |
nxpfan | 0:c4d14dd5d479 | 63 | |
nxpfan | 0:c4d14dd5d479 | 64 | class MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 65 | { |
nxpfan | 0:c4d14dd5d479 | 66 | public: |
nxpfan | 0:c4d14dd5d479 | 67 | typedef enum { |
nxpfan | 0:c4d14dd5d479 | 68 | QCIF = 1, /**< QCIF */ |
nxpfan | 0:c4d14dd5d479 | 69 | VGA, /**< VGA */ |
nxpfan | 0:c4d14dd5d479 | 70 | QVGA, /**< QVGA */ |
nxpfan | 0:c4d14dd5d479 | 71 | QQVGA, /**< QQVGA */ |
nxpfan | 0:c4d14dd5d479 | 72 | } CameraResolution; |
nxpfan | 0:c4d14dd5d479 | 73 | |
nxpfan | 0:c4d14dd5d479 | 74 | typedef enum { |
nxpfan | 0:c4d14dd5d479 | 75 | OFF = 0, /**< ON */ |
nxpfan | 0:c4d14dd5d479 | 76 | ON, /**< OFF */ |
nxpfan | 0:c4d14dd5d479 | 77 | } SwitchState; |
nxpfan | 0:c4d14dd5d479 | 78 | |
nxpfan | 0:c4d14dd5d479 | 79 | /** General parameters for MARMEX_VB */ |
nxpfan | 0:c4d14dd5d479 | 80 | enum { |
nxpfan | 0:c4d14dd5d479 | 81 | BYTE_PER_PIXEL = 2, /**< bytes per pixel */ |
nxpfan | 0:c4d14dd5d479 | 82 | |
nxpfan | 0:c4d14dd5d479 | 83 | QCIF_PIXEL_PER_LINE = 176, /**< pixels in a line (QCIF horizontal size) */ |
nxpfan | 0:c4d14dd5d479 | 84 | QCIF_LINE_PER_FRAME = 144, /**< lines in a frame (QCIF vertical size) */ |
nxpfan | 0:c4d14dd5d479 | 85 | VGA_PIXEL_PER_LINE = 640, /**< pixels in a line (VGA horizontal size) */ |
nxpfan | 0:c4d14dd5d479 | 86 | VGA_LINE_PER_FRAME = 480, /**< lines in a frame (VGA vertical size) */ |
nxpfan | 0:c4d14dd5d479 | 87 | }; |
nxpfan | 0:c4d14dd5d479 | 88 | |
nxpfan | 0:c4d14dd5d479 | 89 | /** General parameters for MARMEX_OB_oled */ |
nxpfan | 0:c4d14dd5d479 | 90 | enum { |
nxpfan | 0:c4d14dd5d479 | 91 | NO_ERROR = 0 /**< zero */ |
nxpfan | 0:c4d14dd5d479 | 92 | }; |
nxpfan | 0:c4d14dd5d479 | 93 | |
nxpfan | 0:c4d14dd5d479 | 94 | /** Create a MARMEX_VB instance connected to specified SPI, DigitalOut and I2C pins |
nxpfan | 0:c4d14dd5d479 | 95 | * |
nxpfan | 0:c4d14dd5d479 | 96 | * @param SPI_mosi SPI-bus MOSI pin |
nxpfan | 0:c4d14dd5d479 | 97 | * @param SPI_miso SPI-bus MISO pin |
nxpfan | 0:c4d14dd5d479 | 98 | * @param SPI_sclk SPI-bus SCLK pin |
nxpfan | 0:c4d14dd5d479 | 99 | * @param SPI_cs SPI-bus Chip Select pin |
nxpfan | 0:c4d14dd5d479 | 100 | * @param cam_reset Camera reset pin |
nxpfan | 0:c4d14dd5d479 | 101 | * @param I2C_sda I2C-bus SDA pin |
nxpfan | 0:c4d14dd5d479 | 102 | * @param I2C_scl I2C-bus SCL pin |
nxpfan | 0:c4d14dd5d479 | 103 | */ |
nxpfan | 0:c4d14dd5d479 | 104 | |
nxpfan | 0:c4d14dd5d479 | 105 | MARMEX_VB( |
nxpfan | 0:c4d14dd5d479 | 106 | PinName SPI_mosi, |
nxpfan | 0:c4d14dd5d479 | 107 | PinName SPI_miso, |
nxpfan | 0:c4d14dd5d479 | 108 | PinName SPI_sck, |
nxpfan | 0:c4d14dd5d479 | 109 | PinName SPI_cs, |
nxpfan | 0:c4d14dd5d479 | 110 | PinName cam_reset, |
nxpfan | 0:c4d14dd5d479 | 111 | PinName I2C_sda, |
nxpfan | 0:c4d14dd5d479 | 112 | PinName I2C_scl |
nxpfan | 0:c4d14dd5d479 | 113 | ); |
nxpfan | 0:c4d14dd5d479 | 114 | |
nxpfan | 0:c4d14dd5d479 | 115 | /** Initialization |
nxpfan | 0:c4d14dd5d479 | 116 | * |
nxpfan | 0:c4d14dd5d479 | 117 | * Performs MARMEX_VB reset and initializations |
nxpfan | 0:c4d14dd5d479 | 118 | * This function is called from MARMEX_VB constoructor. So user don't have to call in the user code. |
nxpfan | 0:c4d14dd5d479 | 119 | * |
nxpfan | 0:c4d14dd5d479 | 120 | * This function takes about 2 seconds because there is 99 times I2C access with 20ms interval. |
nxpfan | 0:c4d14dd5d479 | 121 | * |
nxpfan | 0:c4d14dd5d479 | 122 | * @param res select camera resolution : QCIF(default), VGA, QVGA or QQVGA |
nxpfan | 0:c4d14dd5d479 | 123 | */ |
nxpfan | 0:c4d14dd5d479 | 124 | int init( CameraResolution res = QCIF ); |
nxpfan | 0:c4d14dd5d479 | 125 | |
nxpfan | 0:c4d14dd5d479 | 126 | /** Color bar ON/OFF |
nxpfan | 0:c4d14dd5d479 | 127 | * |
nxpfan | 0:c4d14dd5d479 | 128 | * Set colorbar ON/OFF |
nxpfan | 0:c4d14dd5d479 | 129 | * |
nxpfan | 0:c4d14dd5d479 | 130 | * @param sw turn-ON or -OFF colorbar : ON or OFF |
nxpfan | 0:c4d14dd5d479 | 131 | */ |
nxpfan | 0:c4d14dd5d479 | 132 | void colorbar( SwitchState sw ); |
nxpfan | 0:c4d14dd5d479 | 133 | |
nxpfan | 0:c4d14dd5d479 | 134 | /** Get holizontal size |
nxpfan | 0:c4d14dd5d479 | 135 | * |
nxpfan | 0:c4d14dd5d479 | 136 | * Returns horizontal image size (pixels) |
nxpfan | 0:c4d14dd5d479 | 137 | * |
nxpfan | 0:c4d14dd5d479 | 138 | * @return holizontal size |
nxpfan | 0:c4d14dd5d479 | 139 | */ |
nxpfan | 0:c4d14dd5d479 | 140 | int get_horizontal_size( void ); |
nxpfan | 0:c4d14dd5d479 | 141 | |
nxpfan | 0:c4d14dd5d479 | 142 | /** Get vertical size |
nxpfan | 0:c4d14dd5d479 | 143 | * |
nxpfan | 0:c4d14dd5d479 | 144 | * Returns vertical image size (pixels) |
nxpfan | 0:c4d14dd5d479 | 145 | * |
nxpfan | 0:c4d14dd5d479 | 146 | * @return vertical size |
nxpfan | 0:c4d14dd5d479 | 147 | */ |
nxpfan | 0:c4d14dd5d479 | 148 | int get_vertical_size( void ); |
nxpfan | 0:c4d14dd5d479 | 149 | |
nxpfan | 0:c4d14dd5d479 | 150 | /** Check camera availability |
nxpfan | 0:c4d14dd5d479 | 151 | * |
nxpfan | 0:c4d14dd5d479 | 152 | * Returns last I2C access result |
nxpfan | 0:c4d14dd5d479 | 153 | * This returns non-zero value if the camera initialization failed |
nxpfan | 0:c4d14dd5d479 | 154 | * |
nxpfan | 0:c4d14dd5d479 | 155 | * @return error code in init function (I2C API return value) |
nxpfan | 0:c4d14dd5d479 | 156 | */ |
nxpfan | 0:c4d14dd5d479 | 157 | int ready( void ); |
nxpfan | 0:c4d14dd5d479 | 158 | |
nxpfan | 0:c4d14dd5d479 | 159 | /** Open transfer |
nxpfan | 0:c4d14dd5d479 | 160 | * |
nxpfan | 0:c4d14dd5d479 | 161 | * Let the MARMEX_VB get ready to transfer the data. |
nxpfan | 0:c4d14dd5d479 | 162 | * When this function is called, the camera will stop updating buffer (on camera board) at end of frame. |
nxpfan | 0:c4d14dd5d479 | 163 | * |
nxpfan | 0:c4d14dd5d479 | 164 | * @return error code in init function (I2C API return value) |
nxpfan | 0:c4d14dd5d479 | 165 | */ |
nxpfan | 0:c4d14dd5d479 | 166 | void open_transfer( void ); |
nxpfan | 0:c4d14dd5d479 | 167 | |
nxpfan | 0:c4d14dd5d479 | 168 | /** Close transfer |
nxpfan | 0:c4d14dd5d479 | 169 | * |
nxpfan | 0:c4d14dd5d479 | 170 | * Letting the MARMEX_VB to know the data transfer done. |
nxpfan | 0:c4d14dd5d479 | 171 | * This function should be called when the data transfer done to resume the buffer update by camera |
nxpfan | 0:c4d14dd5d479 | 172 | */ |
nxpfan | 0:c4d14dd5d479 | 173 | void close_transfer( void ); |
nxpfan | 0:c4d14dd5d479 | 174 | |
nxpfan | 0:c4d14dd5d479 | 175 | /** Read one line data |
nxpfan | 0:c4d14dd5d479 | 176 | * |
nxpfan | 0:c4d14dd5d479 | 177 | * Reads 1 line data from MARMEX_VB |
nxpfan | 0:c4d14dd5d479 | 178 | * This function should be called when the data transfer done to resume the buffer update by camera |
nxpfan | 0:c4d14dd5d479 | 179 | * |
nxpfan | 0:c4d14dd5d479 | 180 | * @param *p pointer to array of short |
nxpfan | 0:c4d14dd5d479 | 181 | * @param line_number to select which line want to read |
nxpfan | 0:c4d14dd5d479 | 182 | * @param x_offset holizontal offset (from left) to start the read |
nxpfan | 0:c4d14dd5d479 | 183 | * @param n_of_pixels pixels to be read |
nxpfan | 0:c4d14dd5d479 | 184 | */ |
nxpfan | 0:c4d14dd5d479 | 185 | void read_a_line( short *p, int line_number, int x_offset, int n_of_pixels ); |
nxpfan | 0:c4d14dd5d479 | 186 | |
nxpfan | 0:c4d14dd5d479 | 187 | /** Read order change |
nxpfan | 0:c4d14dd5d479 | 188 | * |
nxpfan | 0:c4d14dd5d479 | 189 | * Toggles flag for read order of 2 byte data. |
nxpfan | 0:c4d14dd5d479 | 190 | * |
nxpfan | 0:c4d14dd5d479 | 191 | * @return new status of the read order flag (false = normal / true = swapped) |
nxpfan | 0:c4d14dd5d479 | 192 | */ |
nxpfan | 0:c4d14dd5d479 | 193 | int read_order_change( void ); |
nxpfan | 0:c4d14dd5d479 | 194 | |
nxpfan | 0:c4d14dd5d479 | 195 | private: |
nxpfan | 0:c4d14dd5d479 | 196 | int send_spi( char data ); |
nxpfan | 0:c4d14dd5d479 | 197 | void write_register( char reg, char value ); |
nxpfan | 0:c4d14dd5d479 | 198 | int read_register( char reg ); |
nxpfan | 0:c4d14dd5d479 | 199 | void set_address( int address ); |
nxpfan | 0:c4d14dd5d479 | 200 | |
nxpfan | 0:c4d14dd5d479 | 201 | SPI _spi; |
nxpfan | 0:c4d14dd5d479 | 202 | DigitalOut _cs; |
nxpfan | 0:c4d14dd5d479 | 203 | DigitalOut _reset; |
nxpfan | 0:c4d14dd5d479 | 204 | I2C _i2c; |
nxpfan | 0:c4d14dd5d479 | 205 | int _error_state; |
nxpfan | 0:c4d14dd5d479 | 206 | int _horizontal_size; |
nxpfan | 0:c4d14dd5d479 | 207 | int _vertical_size; |
nxpfan | 0:c4d14dd5d479 | 208 | int _read_order_change; |
nxpfan | 0:c4d14dd5d479 | 209 | |
nxpfan | 0:c4d14dd5d479 | 210 | }; |
nxpfan | 0:c4d14dd5d479 | 211 | |
nxpfan | 0:c4d14dd5d479 | 212 | #endif // MBED_MARMEX_VB |