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()"関数を使うことができます.

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?

UserRevisionLine numberNew 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