SmartWheels self-driving race car. Designed for NXP Cup. Uses FRDM-KL25Z, area-scan camera, and simple image processing to detect and navigate any NXP spec track.
Dependencies: TSI USBDevice mbed-dev
Fork of SmartWheels by
Hardwares/ArduCAM.h@98:fc92bb37ee17, 2017-04-20 (annotated)
- Committer:
- hazheng
- Date:
- Thu Apr 20 16:18:45 2017 +0000
- Revision:
- 98:fc92bb37ee17
- Parent:
- 96:ec89c4d1383d
- Child:
- 99:c6665262fd3d
Added intersection detection (not working yet)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hazheng | 93:8e1bd3602d53 | 1 | /** |
hazheng | 93:8e1bd3602d53 | 2 | * @file ArduCAM.h |
hazheng | 93:8e1bd3602d53 | 3 | * @brief The header file for all functions that controls the ArduCam Mini camera. |
hazheng | 93:8e1bd3602d53 | 4 | * @author Jordan Brack <jabrack@mix.wvu.edu>, Haofan Zheng <hazheng@mix.wvu.edu> |
hazheng | 93:8e1bd3602d53 | 5 | * |
hazheng | 93:8e1bd3602d53 | 6 | */ |
hazheng | 28:271fc8445e89 | 7 | #pragma once |
hazheng | 28:271fc8445e89 | 8 | #ifndef ARDU_CAM_H |
hazheng | 28:271fc8445e89 | 9 | #define ARDU_CAM_H |
hazheng | 28:271fc8445e89 | 10 | |
hazheng | 29:f87d8790f57d | 11 | #include <mbed.h> |
hazheng | 28:271fc8445e89 | 12 | #include "PinAssignment.h" |
hazheng | 28:271fc8445e89 | 13 | |
hazheng | 93:8e1bd3602d53 | 14 | #define RESOLUTION_WIDTH 80 /*!< @brief The resolution width we are using. */ |
hazheng | 93:8e1bd3602d53 | 15 | #define RESOLUTION_HEIGHT 60 /*!< @brief The resolution height we are using. */ |
hazheng | 41:7b21c5e3599e | 16 | //#define MANUAL_REDUCE_RESULOTION_BY2 |
hazheng | 93:8e1bd3602d53 | 17 | #define CAM_ROI_UPPER_LIMIT 6 /*!< @brief The number of lines we actually using for the image processing. */ |
hazheng | 65:295c222fdf88 | 18 | |
hazheng | 65:295c222fdf88 | 19 | |
hazheng | 93:8e1bd3602d53 | 20 | #define BOTH_NOT_FOUND 0 /*!< @brief ENUM for whether the border is found. Both sides of the border is not found. */ |
hazheng | 93:8e1bd3602d53 | 21 | #define LEFT_FOUND 1 /*!< @brief ENUM for whether the border is found. Left side of the border is found. */ |
hazheng | 93:8e1bd3602d53 | 22 | #define RIGHT_FOUND 2 /*!< @brief ENUM for whether the border is found. Right side of the border is found. */ |
hazheng | 93:8e1bd3602d53 | 23 | #define BOTH_FOUND 3 /*!< @brief ENUM for whether the border is found. Both sides of the border is found. */ |
hazheng | 38:0fb273b28cee | 24 | |
hazheng | 36:7e747e19f660 | 25 | //=====Must pick one and only one here!===== |
hazheng | 93:8e1bd3602d53 | 26 | //#define ARDUCAM_SHIELD_OV2640 /*!< @brief Use ArduCam Shield V2 with OV2640 camera module. */ |
hazheng | 93:8e1bd3602d53 | 27 | //#define ARDUCAM_SHIELD_OV7725 /*!< @brief Use ArduCam Shield V2 with OV7725 camera module. */ |
hazheng | 93:8e1bd3602d53 | 28 | //#define ARDUCAM_SHIELD_OV7670 /*!< @brief Use ArduCam Shield V2 with OV7670 camera module. */ |
hazheng | 93:8e1bd3602d53 | 29 | #define ARDUCAM_MINI_OV2640 /*!< @brief Use ArduCam Mini with OV2640 camera module. */ |
hazheng | 36:7e747e19f660 | 30 | //========================================== |
hazheng | 36:7e747e19f660 | 31 | |
hazheng | 37:7074a6118d03 | 32 | |
hazheng | 37:7074a6118d03 | 33 | #if defined(ARDUCAM_SHIELD_OV2640) || defined(ARDUCAM_SHIELD_OV7725) || defined(ARDUCAM_SHIELD_OV7670) |
hazheng | 93:8e1bd3602d53 | 34 | #define ARDUCAM_SHIELD /*!< @brief Use ArduCam Shield V2. (Automatically defined, DO NOT touch.) */ |
hazheng | 36:7e747e19f660 | 35 | #elif defined(ARDUCAM_MINI_OV2640) |
hazheng | 93:8e1bd3602d53 | 36 | #define ARDUCAM_MINI /*!< @brief Use ArduCam Mini. (Automatically defined, DO NOT touch.) */ |
hazheng | 36:7e747e19f660 | 37 | #else |
hazheng | 36:7e747e19f660 | 38 | #error Must pick one and only one ArduCam type! |
hazheng | 36:7e747e19f660 | 39 | #endif |
hazheng | 36:7e747e19f660 | 40 | |
hazheng | 36:7e747e19f660 | 41 | #if defined(ARDUCAM_SHIELD_OV2640) || defined(ARDUCAM_MINI_OV2640) |
hazheng | 93:8e1bd3602d53 | 42 | #define ARDUCAM_OV2640 /*!< @brief Use OV2640 camera module. (Automatically defined, DO NOT touch.) */ |
hazheng | 36:7e747e19f660 | 43 | #elif defined(ARDUCAM_SHIELD_OV7725) |
hazheng | 93:8e1bd3602d53 | 44 | #define ARDUCAM_OV7725 /*!< @brief Use OV7725 camera module. (Automatically defined, DO NOT touch.) */ |
hazheng | 37:7074a6118d03 | 45 | #elif defined(ARDUCAM_SHIELD_OV7670) |
hazheng | 93:8e1bd3602d53 | 46 | #define ARDUCAM_OV7670 /*!< @brief Use OV7670 camera module. (Automatically defined, DO NOT touch.) */ |
hazheng | 36:7e747e19f660 | 47 | #else |
hazheng | 36:7e747e19f660 | 48 | #error Must pick one and only one ArduCam type! |
hazheng | 36:7e747e19f660 | 49 | #endif |
hazheng | 36:7e747e19f660 | 50 | |
hazheng | 36:7e747e19f660 | 51 | #if defined(ARDUCAM_OV2640) |
hazheng | 36:7e747e19f660 | 52 | #include "OV2640RegProg.h" |
hazheng | 36:7e747e19f660 | 53 | #elif defined(ARDUCAM_OV7725) |
hazheng | 36:7e747e19f660 | 54 | #include "OV7725RegProg.h" |
hazheng | 37:7074a6118d03 | 55 | #elif defined(ARDUCAM_OV7670) |
hazheng | 37:7074a6118d03 | 56 | #include "OV7670RegProg.h" |
hazheng | 36:7e747e19f660 | 57 | #endif |
hazheng | 36:7e747e19f660 | 58 | |
hazheng | 36:7e747e19f660 | 59 | #if defined(ARDUCAM_SHIELD) |
hazheng | 93:8e1bd3602d53 | 60 | #define ARDUCHIP_VER_NUM 0x61 /*!< @brief ArduCam Version number for ArduCam Shield V2. */ |
hazheng | 36:7e747e19f660 | 61 | #elif defined(ARDUCAM_MINI) |
hazheng | 93:8e1bd3602d53 | 62 | #define ARDUCHIP_VER_NUM 0x55 /*!< @brief ArduCam Version number for ArduCam Mini. */ |
hazheng | 36:7e747e19f660 | 63 | #endif |
hazheng | 36:7e747e19f660 | 64 | |
hazheng | 93:8e1bd3602d53 | 65 | #define ARDUCHIP_TEST1 0x00 /*!< @brief The address for the ArduCam test register. */ |
hazheng | 93:8e1bd3602d53 | 66 | #define ARDUCHIP_TEST_MSG 0x72 /*!< @brief The message used to write/read/verify with the test register. */ |
hazheng | 29:f87d8790f57d | 67 | |
hazheng | 93:8e1bd3602d53 | 68 | #define ARDUCHIP_CAP_CTRL 0x01 /*!< @brief The register address that used to set how many picture need to take. */ |
hazheng | 29:f87d8790f57d | 69 | |
hazheng | 40:be98219930e4 | 70 | #if defined(ARDUCAM_SHIELD) |
hazheng | 93:8e1bd3602d53 | 71 | #define ARDUCHIP_MODE 0x02 /*!< @brief The address for the ArduCam bus mode setting register. */ |
hazheng | 93:8e1bd3602d53 | 72 | #define MCU2LCD_MODE 0x00 /*!< @brief The byte used to set the ArduCam bus to MCU to LCD mode. */ |
hazheng | 93:8e1bd3602d53 | 73 | #define CAM2LCD_MODE 0x01 /*!< @brief The byte used to set the ArduCam bus to CAM to LCD mode. */ |
hazheng | 40:be98219930e4 | 74 | #endif |
hazheng | 29:f87d8790f57d | 75 | |
hazheng | 93:8e1bd3602d53 | 76 | #define ARDUCHIP_FIFO 0x04 /*!< @brief The address for the ArduCam FIFO and I2C setting register. */ |
hazheng | 93:8e1bd3602d53 | 77 | #define FIFO_CLEAR_MASK 0x01 /*!< @brief The mask used to clear the FIFO. */ |
hazheng | 93:8e1bd3602d53 | 78 | #define FIFO_START_MASK 0x02 /*!< @brief The mask used to start the FIFO write. */ |
hazheng | 93:8e1bd3602d53 | 79 | #define FIFO_RDPTR_RST_MASK 0x10 /*!< @brief The mask used to reset the FIFO read pointer. */ |
hazheng | 93:8e1bd3602d53 | 80 | #define FIFO_WRPTR_RST_MASK 0x20 /*!< @brief The mask used to reset the FIFO write pointer. */ |
hazheng | 29:f87d8790f57d | 81 | |
hazheng | 93:8e1bd3602d53 | 82 | #define ARDUCHIP_TRIG 0x41 /*!< @brief The address for the ArduCam trigger status register. */ |
hazheng | 93:8e1bd3602d53 | 83 | #define VSYNC_MASK 0x01 /*!< @brief The mask used to check the Vsync status. */ |
hazheng | 93:8e1bd3602d53 | 84 | #define SHUTTER_MASK 0x02 /*!< @brief The mask used to check the shutter status. */ |
hazheng | 93:8e1bd3602d53 | 85 | #define CAP_DONE_MASK 0x08 /*!< @brief The mask used to check if the capture is done. */ |
hazheng | 44:15de535c4005 | 86 | |
hazheng | 93:8e1bd3602d53 | 87 | #define FIFO_SIZE1 0x42 /*!< @brief Camera write FIFO size[7:0] for burst to read. */ |
hazheng | 93:8e1bd3602d53 | 88 | #define FIFO_SIZE2 0x43 /*!< @brief Camera write FIFO size[15:8]. */ |
hazheng | 93:8e1bd3602d53 | 89 | #define FIFO_SIZE3 0x44 /*!< @brief Camera write FIFO size[18:16]. */ |
hazheng | 32:5badeff825dc | 90 | |
hazheng | 93:8e1bd3602d53 | 91 | #define BURST_FIFO_READ 0x3C /*!< @brief Burst FIFO read operation. */ |
hazheng | 93:8e1bd3602d53 | 92 | #define SINGLE_FIFO_READ 0x3D /*!< @brief Single FIFO read operation. */ |
hazheng | 29:f87d8790f57d | 93 | |
hazheng | 46:a5eb9bd3bb55 | 94 | #ifdef __cplusplus |
hazheng | 46:a5eb9bd3bb55 | 95 | extern "C" { |
hazheng | 46:a5eb9bd3bb55 | 96 | #endif |
hazheng | 46:a5eb9bd3bb55 | 97 | |
hazheng | 93:8e1bd3602d53 | 98 | /** |
hazheng | 93:8e1bd3602d53 | 99 | * @brief Init the camera. There is only one camera in the system, thus, this function is required to be called only once during the system initialization. |
hazheng | 93:8e1bd3602d53 | 100 | */ |
hazheng | 28:271fc8445e89 | 101 | bool ardu_cam_init(); |
hazheng | 28:271fc8445e89 | 102 | |
hazheng | 93:8e1bd3602d53 | 103 | /** |
hazheng | 93:8e1bd3602d53 | 104 | * @brief Start the capture for one picture. The capture will automatically stop after a picture is captured. |
hazheng | 93:8e1bd3602d53 | 105 | */ |
hazheng | 29:f87d8790f57d | 106 | void ardu_cam_start_capture(); |
hazheng | 29:f87d8790f57d | 107 | |
hazheng | 93:8e1bd3602d53 | 108 | /** |
hazheng | 93:8e1bd3602d53 | 109 | * @brief Get the current FIFO length. |
hazheng | 93:8e1bd3602d53 | 110 | * @return The length of the current FIFO. |
hazheng | 93:8e1bd3602d53 | 111 | */ |
hazheng | 32:5badeff825dc | 112 | uint32_t ardu_cam_get_fifo_length(); |
hazheng | 32:5badeff825dc | 113 | |
hazheng | 93:8e1bd3602d53 | 114 | /** |
hazheng | 93:8e1bd3602d53 | 115 | * @brief Get the array that describe the center line that detected by the image processing. |
hazheng | 93:8e1bd3602d53 | 116 | * @return A volatile pointer points to the array. |
hazheng | 93:8e1bd3602d53 | 117 | */ |
hazheng | 44:15de535c4005 | 118 | volatile const uint8_t* ardu_cam_get_center_array(); |
hazheng | 44:15de535c4005 | 119 | |
hazheng | 93:8e1bd3602d53 | 120 | /** |
hazheng | 93:8e1bd3602d53 | 121 | * @brief Check if the capture is finished. |
hazheng | 93:8e1bd3602d53 | 122 | * @return True if the capture is finished, otherwise, return false. |
hazheng | 93:8e1bd3602d53 | 123 | */ |
hazheng | 44:15de535c4005 | 124 | uint8_t ardu_cam_is_capture_finished(); |
hazheng | 43:0d1886f4848a | 125 | |
hazheng | 93:8e1bd3602d53 | 126 | /** |
hazheng | 93:8e1bd3602d53 | 127 | * @brief Display the image on the UTFT screen. |
hazheng | 93:8e1bd3602d53 | 128 | */ |
hazheng | 46:a5eb9bd3bb55 | 129 | void ardu_cam_display_img_utft(); |
hazheng | 46:a5eb9bd3bb55 | 130 | |
hazheng | 93:8e1bd3602d53 | 131 | /** |
hazheng | 93:8e1bd3602d53 | 132 | * @brief Get a new picture, and run the image processing. |
hazheng | 93:8e1bd3602d53 | 133 | */ |
hazheng | 57:0d8a155d511d | 134 | void image_processing(); |
hazheng | 57:0d8a155d511d | 135 | |
hazheng | 93:8e1bd3602d53 | 136 | /** |
hazheng | 93:8e1bd3602d53 | 137 | * @brief Get wether the terminate line is detected. |
hazheng | 93:8e1bd3602d53 | 138 | * @return 0 for no, 1 for yes. |
hazheng | 93:8e1bd3602d53 | 139 | */ |
hazheng | 64:43ab429a37e0 | 140 | uint8_t ardu_cam_get_is_encounter_terminate(); |
hazheng | 64:43ab429a37e0 | 141 | |
hazheng | 93:8e1bd3602d53 | 142 | /** |
hazheng | 93:8e1bd3602d53 | 143 | * @brief Get wether the borders are found. |
hazheng | 93:8e1bd3602d53 | 144 | * @return ENUM for whether the border is found. Please refer to the definition above. |
hazheng | 93:8e1bd3602d53 | 145 | */ |
hazheng | 98:fc92bb37ee17 | 146 | //uint8_t ardu_cam_get_is_border_found(); |
hazheng | 79:bdbac82c979b | 147 | |
hazheng | 98:fc92bb37ee17 | 148 | uint8_t ardu_cam_get_is_intersection_detected(); |
hazheng | 46:a5eb9bd3bb55 | 149 | #ifdef __cplusplus |
hazheng | 46:a5eb9bd3bb55 | 150 | } |
hazheng | 46:a5eb9bd3bb55 | 151 | #endif |
hazheng | 46:a5eb9bd3bb55 | 152 | |
hazheng | 34:f79db3bc2f86 | 153 | |
hazheng | 28:271fc8445e89 | 154 | #endif //ARDU_CAM_H |