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
main.cpp
- Committer:
- hazheng
- Date:
- 2017-03-30
- Revision:
- 46:a5eb9bd3bb55
- Parent:
- 45:501b7909139a
- Child:
- 47:a682be9908b9
- Child:
- 48:f76b5e252444
File content as of revision 46:a5eb9bd3bb55:
#include "mbed.h" #include <math.h> #define PI 3.14159265f #include "Motor.h" #include "Servo.h" #include "WheelEncoder.h" #include "Core.h" #include "SWUSBServer.h" #include "ArduCAM.h" #include "ArduUTFT.h" #include "PinAssignment.h" #include "GlobalVariable.h" SPI g_spi_port(PIN_SPI_MOSI, PIN_SPI_MISO, PIN_SPI_SCK); SW::Core g_core; int main(void) { Timer timer; g_spi_port.frequency(5500000); //g_spi_port.format(8, 0); //SW::Core core; //Motor motor(g_core); //Servo servo(g_core); //WheelEncoder wheelEncoder(core); //Camera cam(core); motor_init(); servo_init(); bool isRegRead = false; ardu_utft_init(); ardu_cam_init(); float tempCount = 0; //timer.reset(); timer.start(); float timeWas = timer.read(); motor_set_speeds(0.12f, 0.12f); servo_set_angle(0.0f); while (1) { //motor_set_speeds(0.12f, 0.12f); //servo_set_angle(0.0f); float deltaTime = timeWas; timeWas = timer.read(); deltaTime = timeWas - deltaTime; //led = 0; g_core.Update(deltaTime); //motor.Update(deltaTime); //servo.Update(deltaTime); //wheelEncoder.Update(deltaTime); //cam.Update(deltaTime); tempCount += deltaTime; if(tempCount > 1.0f) { //led = !led; tempCount = 0.0f; } if(!isRegRead && g_core.GetUSBServer().GetStatus() == SER_STAT_RUNNING && timer.read() > 2.5f && ardu_cam_is_capture_finished()) { //OV7725RegBuf * regBuf = new OV7725RegBuf(g_core); //regBuf->ReadRegisters(); //delete regBuf; //ardu_cam_print_debug(); isRegRead = true; } //ardu_cam_display_img_utft(); volatile const uint8_t * centerLine = ardu_cam_get_center_array(); /////////////Calculate the curvature: float srcY = (0.0f + 1.0f) / 2.0f; float srcX = static_cast<float>(centerLine[0] + centerLine[1]) / 2.0f; float destY = static_cast<float>(CAM_ROI_UPPER_LIMIT - 1 + (CAM_ROI_UPPER_LIMIT - 2)) / 2.0f; float destX = static_cast<float>(centerLine[CAM_ROI_UPPER_LIMIT - 1] + centerLine[CAM_ROI_UPPER_LIMIT - 2]) / 2.0f; float disY = destY - srcY; float disX = destX - srcX; float angle = static_cast<float>(atan(static_cast<double>(disX / disY)) * (180.0f / PI)); /////////////////////////////////////// /////////////Calculate the offset: float centerPos = static_cast<float>(RESOLUTION_WIDTH / 2); float offsetPercent = (static_cast<float>(centerLine[3]) - centerPos); offsetPercent = offsetPercent / centerPos; ////////////////////////////////////// servo_set_angle((angle * -0.4f) + (offsetPercent * SERVO_MAX_ANGLE)); //char buf[20]; //sprintf(buf, "angle %f", angle); //g_core.GetUSBServer().PushUnreliableMsg('D', buf); /* std::string tempStr = "XX"; for(uint8_t i = 0; i < CAM_ROI_UPPER_LIMIT; ++i) { tempStr[0] = i; tempStr[1] = centerLine[i]; g_core.GetUSBServer().PushUnreliableMsg('L', tempStr); } */ /* if(offsetPercent > 0.1) { motor_set_speeds(0.05f, 0.05f); } else { motor_set_speeds(0.13f, 0.13f); } */ //wait(0.01); } } /* PwmOut servo(PTE20); int main() { servo.period(0.020); // servo requires a 20ms period while (1) { for(float offset=0.0; offset<0.001; offset+=0.0001) { servo.pulsewidth(0.001 + offset); // servo position determined by a pulsewidth between 1-2ms wait(0.25); } } } */ /* //code for accelerometer sensor. const char regAddr = 0x0D; char readValue = 0; int result1 = m_sccbCtrl.write(0x1D<<1, ®Addr, 1, true); int result2 = m_sccbCtrl.read(0x1D<<1, &readValue, 1, false); char buf[20]; sprintf(buf, "%#x-%#x-%d-%d", regAddr, readValue, result1, result2); m_core.GetUSBServer().PushUnreliableMsg('D', buf); */