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 haofan Zheng

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?

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