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/Camera.cpp@26:5814404856e2, 2017-02-21 (annotated)
- Committer:
- hazheng
- Date:
- Tue Feb 21 20:36:38 2017 +0000
- Revision:
- 26:5814404856e2
- Parent:
- 25:6f63053cee81
- Child:
- 27:c68f711e5b67
Finished camera initialization, and some test code for camera.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hazheng | 3:c8867972ffc7 | 1 | #include "Camera.h" |
hazheng | 3:c8867972ffc7 | 2 | |
hazheng | 13:7dcb1642ef99 | 3 | #include "Core.h" |
hazheng | 13:7dcb1642ef99 | 4 | #include "OV7725RegAddr.h" |
hazheng | 13:7dcb1642ef99 | 5 | #include "PinAssignment.h" |
hazheng | 13:7dcb1642ef99 | 6 | #include "SWUSBServer.h" |
hazheng | 13:7dcb1642ef99 | 7 | |
hazheng | 26:5814404856e2 | 8 | namespace |
hazheng | 3:c8867972ffc7 | 9 | { |
hazheng | 26:5814404856e2 | 10 | DigitalOut testLED(LED_GREEN, 1); |
hazheng | 25:6f63053cee81 | 11 | |
hazheng | 26:5814404856e2 | 12 | bool isInLine = false; |
hazheng | 26:5814404856e2 | 13 | uint8_t currentCol = 0; |
hazheng | 26:5814404856e2 | 14 | uint8_t outCurrentCol = 0; |
hazheng | 26:5814404856e2 | 15 | |
hazheng | 26:5814404856e2 | 16 | uint16_t currentRow = 0; |
hazheng | 26:5814404856e2 | 17 | uint16_t outCurrentRow = 0; |
hazheng | 3:c8867972ffc7 | 18 | } |
hazheng | 3:c8867972ffc7 | 19 | |
hazheng | 26:5814404856e2 | 20 | |
hazheng | 26:5814404856e2 | 21 | static void OnPixelClock() |
hazheng | 3:c8867972ffc7 | 22 | { |
hazheng | 26:5814404856e2 | 23 | if(isInLine) |
hazheng | 26:5814404856e2 | 24 | { |
hazheng | 26:5814404856e2 | 25 | ++currentCol; |
hazheng | 26:5814404856e2 | 26 | } |
hazheng | 3:c8867972ffc7 | 27 | } |
hazheng | 3:c8867972ffc7 | 28 | |
hazheng | 26:5814404856e2 | 29 | static void OnHorizontalRise() |
hazheng | 3:c8867972ffc7 | 30 | { |
hazheng | 26:5814404856e2 | 31 | isInLine = true; |
hazheng | 25:6f63053cee81 | 32 | |
hazheng | 26:5814404856e2 | 33 | ++currentRow; |
hazheng | 25:6f63053cee81 | 34 | } |
hazheng | 25:6f63053cee81 | 35 | |
hazheng | 26:5814404856e2 | 36 | static void OnHorizontalFall() |
hazheng | 25:6f63053cee81 | 37 | { |
hazheng | 26:5814404856e2 | 38 | isInLine = false; |
hazheng | 3:c8867972ffc7 | 39 | |
hazheng | 26:5814404856e2 | 40 | outCurrentCol = currentCol; |
hazheng | 26:5814404856e2 | 41 | currentCol = 0; |
hazheng | 26:5814404856e2 | 42 | } |
hazheng | 26:5814404856e2 | 43 | |
hazheng | 26:5814404856e2 | 44 | static void OnFrameClock() |
hazheng | 26:5814404856e2 | 45 | { |
hazheng | 26:5814404856e2 | 46 | outCurrentRow = currentRow; |
hazheng | 26:5814404856e2 | 47 | currentRow = 0; |
hazheng | 3:c8867972ffc7 | 48 | testLED = testLED.read() == 1 ? 0 : 1; |
hazheng | 3:c8867972ffc7 | 49 | } |
hazheng | 3:c8867972ffc7 | 50 | |
hazheng | 13:7dcb1642ef99 | 51 | Camera::Camera(SW::Core & core) : |
hazheng | 13:7dcb1642ef99 | 52 | m_core(core), |
hazheng | 25:6f63053cee81 | 53 | m_pClock(InterruptIn(PIN_CC_PCLOCK)), |
hazheng | 25:6f63053cee81 | 54 | m_href(InterruptIn(PIN_CC_HREF)), |
hazheng | 25:6f63053cee81 | 55 | m_vsnyc(InterruptIn(PIN_CC_VSYNC)), |
hazheng | 25:6f63053cee81 | 56 | m_hasPic(false), |
hazheng | 26:5814404856e2 | 57 | m_regBuf(NULL), |
hazheng | 26:5814404856e2 | 58 | m_debugOutputTimer(0.0f) |
hazheng | 3:c8867972ffc7 | 59 | { |
hazheng | 26:5814404856e2 | 60 | m_regBuf = new OV7725RegBuf(m_core); |
hazheng | 26:5814404856e2 | 61 | |
hazheng | 26:5814404856e2 | 62 | #if (CAMERA_PIXEL_WIDTH == 80) |
hazheng | 26:5814404856e2 | 63 | m_regBuf->SCCBWrite(OV7725_HOutSize, 0x14); |
hazheng | 26:5814404856e2 | 64 | #elif (CAMERA_PIXEL_WIDTH == 160) |
hazheng | 26:5814404856e2 | 65 | m_regBuf->SCCBWrite(OV7725_HOutSize, 0x28); |
hazheng | 26:5814404856e2 | 66 | #elif (CAMERA_PIXEL_WIDTH == 240) |
hazheng | 26:5814404856e2 | 67 | m_regBuf->SCCBWrite(OV7725_HOutSize, 0x3c); |
hazheng | 26:5814404856e2 | 68 | #elif (CAMERA_PIXEL_WIDTH == 320) |
hazheng | 26:5814404856e2 | 69 | m_regBuf->SCCBWrite(OV7725_HOutSize, 0x50); |
hazheng | 26:5814404856e2 | 70 | #endif |
hazheng | 26:5814404856e2 | 71 | |
hazheng | 26:5814404856e2 | 72 | #if (CAMERA_PIXEL_HEIGHT == 60 ) |
hazheng | 26:5814404856e2 | 73 | m_regBuf->SCCBWrite(OV7725_VOutSize, 0x1E); |
hazheng | 26:5814404856e2 | 74 | #elif (CAMERA_PIXEL_HEIGHT == 120 ) |
hazheng | 26:5814404856e2 | 75 | m_regBuf->SCCBWrite(OV7725_VOutSize, 0x3c); |
hazheng | 26:5814404856e2 | 76 | #elif (CAMERA_PIXEL_HEIGHT == 180 ) |
hazheng | 26:5814404856e2 | 77 | m_regBuf->SCCBWrite(OV7725_VOutSize, 0x5a); |
hazheng | 26:5814404856e2 | 78 | #elif (CAMERA_PIXEL_HEIGHT == 240 ) |
hazheng | 26:5814404856e2 | 79 | m_regBuf->SCCBWrite(OV7725_VOutSize, 0x78); |
hazheng | 26:5814404856e2 | 80 | #endif |
hazheng | 3:c8867972ffc7 | 81 | |
hazheng | 26:5814404856e2 | 82 | m_regBuf->SCCBWrite(OV7725_COM4, 0x01); |
hazheng | 26:5814404856e2 | 83 | m_regBuf->SCCBWrite(OV7725_CLKRC, 0x86); |
hazheng | 26:5814404856e2 | 84 | |
hazheng | 26:5814404856e2 | 85 | char buf[20]; |
hazheng | 26:5814404856e2 | 86 | unsigned char tempV = m_regBuf->SCCBRead(OV7725_HOutSize); |
hazheng | 26:5814404856e2 | 87 | sprintf(buf, "CamReg %#x=%#x", OV7725_HOutSize, tempV); |
hazheng | 26:5814404856e2 | 88 | m_core.GetUSBServer().PushReliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 89 | |
hazheng | 26:5814404856e2 | 90 | tempV = m_regBuf->SCCBRead(OV7725_VOutSize); |
hazheng | 26:5814404856e2 | 91 | sprintf(buf, "CamReg %#x=%#x", OV7725_VOutSize, tempV); |
hazheng | 26:5814404856e2 | 92 | m_core.GetUSBServer().PushReliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 93 | |
hazheng | 26:5814404856e2 | 94 | tempV = m_regBuf->SCCBRead(OV7725_COM4); |
hazheng | 26:5814404856e2 | 95 | sprintf(buf, "CamReg %#x=%#x", OV7725_COM4, tempV); |
hazheng | 26:5814404856e2 | 96 | m_core.GetUSBServer().PushReliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 97 | |
hazheng | 26:5814404856e2 | 98 | tempV = m_regBuf->SCCBRead(OV7725_CLKRC); |
hazheng | 26:5814404856e2 | 99 | sprintf(buf, "CamReg %#x=%#x", OV7725_CLKRC, tempV); |
hazheng | 26:5814404856e2 | 100 | m_core.GetUSBServer().PushReliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 101 | |
hazheng | 26:5814404856e2 | 102 | delete m_regBuf; |
hazheng | 26:5814404856e2 | 103 | m_regBuf = NULL; |
hazheng | 26:5814404856e2 | 104 | |
hazheng | 26:5814404856e2 | 105 | StartReceivingPic(); |
hazheng | 3:c8867972ffc7 | 106 | } |
hazheng | 3:c8867972ffc7 | 107 | |
hazheng | 3:c8867972ffc7 | 108 | Camera::~Camera() |
hazheng | 3:c8867972ffc7 | 109 | { |
hazheng | 3:c8867972ffc7 | 110 | |
hazheng | 3:c8867972ffc7 | 111 | } |
hazheng | 3:c8867972ffc7 | 112 | |
hazheng | 26:5814404856e2 | 113 | void Camera::Update(float deltaTime) |
hazheng | 26:5814404856e2 | 114 | { |
hazheng | 26:5814404856e2 | 115 | m_debugOutputTimer += deltaTime; |
hazheng | 26:5814404856e2 | 116 | |
hazheng | 26:5814404856e2 | 117 | if(m_debugOutputTimer >= 2.0) |
hazheng | 26:5814404856e2 | 118 | { |
hazheng | 26:5814404856e2 | 119 | char buf[20]; |
hazheng | 26:5814404856e2 | 120 | sprintf(buf, "ColSize: %u", outCurrentCol); |
hazheng | 26:5814404856e2 | 121 | m_core.GetUSBServer().PushUnreliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 122 | sprintf(buf, "RowSize: %u", outCurrentRow); |
hazheng | 26:5814404856e2 | 123 | m_core.GetUSBServer().PushUnreliableMsg('D', buf); |
hazheng | 26:5814404856e2 | 124 | |
hazheng | 26:5814404856e2 | 125 | m_debugOutputTimer = 0.0f; |
hazheng | 26:5814404856e2 | 126 | } |
hazheng | 26:5814404856e2 | 127 | |
hazheng | 26:5814404856e2 | 128 | } |
hazheng | 26:5814404856e2 | 129 | |
hazheng | 26:5814404856e2 | 130 | void Camera::StartReceivingPic() |
hazheng | 26:5814404856e2 | 131 | { |
hazheng | 26:5814404856e2 | 132 | m_pClock.rise(&OnPixelClock); |
hazheng | 26:5814404856e2 | 133 | m_href.rise(&OnHorizontalRise); |
hazheng | 26:5814404856e2 | 134 | m_href.fall(&OnHorizontalFall); |
hazheng | 26:5814404856e2 | 135 | m_vsnyc.fall(&OnFrameClock); |
hazheng | 26:5814404856e2 | 136 | } |
hazheng | 26:5814404856e2 | 137 | |
hazheng | 26:5814404856e2 | 138 | void Camera::StopReceivingPic() |
hazheng | 26:5814404856e2 | 139 | { |
hazheng | 26:5814404856e2 | 140 | m_vsnyc.fall(NULL); |
hazheng | 26:5814404856e2 | 141 | m_href.fall(NULL); |
hazheng | 26:5814404856e2 | 142 | m_href.rise(NULL); |
hazheng | 26:5814404856e2 | 143 | m_pClock.rise(NULL); |
hazheng | 26:5814404856e2 | 144 | } |
hazheng | 26:5814404856e2 | 145 | |
hazheng | 3:c8867972ffc7 | 146 | bool Camera::HasPicture() const |
hazheng | 3:c8867972ffc7 | 147 | { |
hazheng | 3:c8867972ffc7 | 148 | return m_hasPic; |
hazheng | 3:c8867972ffc7 | 149 | } |
hazheng | 3:c8867972ffc7 | 150 | |
hazheng | 3:c8867972ffc7 | 151 | const unsigned char * Camera::GetPicture() const |
hazheng | 3:c8867972ffc7 | 152 | { |
hazheng | 13:7dcb1642ef99 | 153 | return NULL; //m_pics[m_currentIndex == 0 ? 1 : 0]; |
hazheng | 13:7dcb1642ef99 | 154 | } |
hazheng | 13:7dcb1642ef99 | 155 |