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:
Wed Mar 01 16:31:36 2017 +0000
Revision:
29:f87d8790f57d
Parent:
28:271fc8445e89
Child:
32:5badeff825dc
Added test code for ArduCam. Cam is not working yet.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hazheng 28:271fc8445e89 1 #include "ArduCAM.h"
hazheng 28:271fc8445e89 2
hazheng 29:f87d8790f57d 3 #include "GlobalVariable.h"
hazheng 29:f87d8790f57d 4 #include "SWUSBServer.h"
hazheng 29:f87d8790f57d 5
hazheng 28:271fc8445e89 6 extern SPI g_spi_port;
hazheng 28:271fc8445e89 7
hazheng 29:f87d8790f57d 8 DigitalOut cam_cs(PIN_ACC_CS);
hazheng 29:f87d8790f57d 9
hazheng 29:f87d8790f57d 10 DigitalOut testLED2(LED_RED, 1);
hazheng 29:f87d8790f57d 11
hazheng 29:f87d8790f57d 12 /*
hazheng 29:f87d8790f57d 13 inline static uint8_t ardu_cam_spi_io(int address, int value = 0x00)
hazheng 29:f87d8790f57d 14 {
hazheng 29:f87d8790f57d 15 //g_spi_port.lock();
hazheng 29:f87d8790f57d 16
hazheng 29:f87d8790f57d 17 cam_cs = 0;
hazheng 29:f87d8790f57d 18 g_spi_port.write(address);
hazheng 29:f87d8790f57d 19 uint8_t result = g_spi_port.write(value);
hazheng 29:f87d8790f57d 20 cam_cs = 1;
hazheng 29:f87d8790f57d 21
hazheng 29:f87d8790f57d 22 //g_spi_port.unlock();
hazheng 29:f87d8790f57d 23
hazheng 29:f87d8790f57d 24 return result;
hazheng 29:f87d8790f57d 25 }
hazheng 29:f87d8790f57d 26 */
hazheng 29:f87d8790f57d 27
hazheng 29:f87d8790f57d 28 //Write ArduChip internal registers
hazheng 29:f87d8790f57d 29 void ardu_cam_write_reg(uint8_t addr, uint8_t data)
hazheng 29:f87d8790f57d 30 {
hazheng 29:f87d8790f57d 31 ardu_cam_bus_write(addr | 0x80, data);
hazheng 29:f87d8790f57d 32 }
hazheng 29:f87d8790f57d 33
hazheng 29:f87d8790f57d 34 //Read ArduChip internal registers
hazheng 29:f87d8790f57d 35 uint8_t ardu_cam_read_reg(uint8_t addr)
hazheng 29:f87d8790f57d 36 {
hazheng 29:f87d8790f57d 37 uint8_t data;
hazheng 29:f87d8790f57d 38 data = ardu_cam_bus_read(addr & 0x7F);
hazheng 29:f87d8790f57d 39 return data;
hazheng 29:f87d8790f57d 40 }
hazheng 29:f87d8790f57d 41
hazheng 28:271fc8445e89 42 bool ardu_cam_init()
hazheng 28:271fc8445e89 43 {
hazheng 29:f87d8790f57d 44 uint8_t VerNum = ardu_cam_read_reg(0x40);
hazheng 29:f87d8790f57d 45 VerNum = ardu_cam_read_reg(0x40);
hazheng 29:f87d8790f57d 46
hazheng 29:f87d8790f57d 47 char buf[20];
hazheng 29:f87d8790f57d 48 sprintf(buf, "Ardu Ver %#x", VerNum);
hazheng 29:f87d8790f57d 49 g_core.GetUSBServer().PushReliableMsg('D', buf);
hazheng 29:f87d8790f57d 50
hazheng 29:f87d8790f57d 51 ardu_cam_write_reg(ARDUCHIP_TEST1, ARDUCHIP_TEST_MSG);
hazheng 29:f87d8790f57d 52 uint8_t testV = ardu_cam_read_reg(ARDUCHIP_TEST1);
hazheng 29:f87d8790f57d 53 if(VerNum != 0x61 || testV != ARDUCHIP_TEST_MSG)
hazheng 29:f87d8790f57d 54 {
hazheng 29:f87d8790f57d 55 g_core.GetUSBServer().PushReliableMsg('D', "CameraInit Fa");
hazheng 29:f87d8790f57d 56 return false;
hazheng 29:f87d8790f57d 57 }
hazheng 29:f87d8790f57d 58 g_core.GetUSBServer().PushReliableMsg('D', "CameraInit Su");
hazheng 29:f87d8790f57d 59
hazheng 29:f87d8790f57d 60 ardu_cam_set_mode(MCU2LCD_MODE);
hazheng 29:f87d8790f57d 61 ardu_cam_start_capture();
hazheng 29:f87d8790f57d 62
hazheng 29:f87d8790f57d 63 wait(0.1);
hazheng 29:f87d8790f57d 64 ardu_cam_set_mode(CAM2LCD_MODE);
hazheng 28:271fc8445e89 65
hazheng 28:271fc8445e89 66
hazheng 29:f87d8790f57d 67 unsigned char tempV = ardu_cam_read_reg(ARDUCHIP_MODE);
hazheng 29:f87d8790f57d 68 sprintf(buf, "Ardu Stat %#x", tempV);
hazheng 29:f87d8790f57d 69 g_core.GetUSBServer().PushReliableMsg('D', buf);
hazheng 29:f87d8790f57d 70
hazheng 29:f87d8790f57d 71 tempV = ardu_cam_read_reg(ARDUCHIP_CAP_CTRL);
hazheng 29:f87d8790f57d 72 sprintf(buf, "Ardu FS1 %#x", tempV);
hazheng 29:f87d8790f57d 73 g_core.GetUSBServer().PushReliableMsg('D', buf);
hazheng 29:f87d8790f57d 74
hazheng 29:f87d8790f57d 75 return true;
hazheng 29:f87d8790f57d 76 }
hazheng 29:f87d8790f57d 77
hazheng 29:f87d8790f57d 78 void ardu_cam_set_mode(uint8_t mode)
hazheng 29:f87d8790f57d 79 {
hazheng 29:f87d8790f57d 80 //ardu_cam_bus_io(ARDUCHIP_MODE, mode);
hazheng 29:f87d8790f57d 81 switch(mode)
hazheng 29:f87d8790f57d 82 {
hazheng 29:f87d8790f57d 83 case MCU2LCD_MODE:
hazheng 29:f87d8790f57d 84 ardu_cam_write_reg(ARDUCHIP_MODE, MCU2LCD_MODE);
hazheng 29:f87d8790f57d 85 break;
hazheng 29:f87d8790f57d 86 case CAM2LCD_MODE:
hazheng 29:f87d8790f57d 87 ardu_cam_write_reg(ARDUCHIP_MODE, CAM2LCD_MODE);
hazheng 29:f87d8790f57d 88 break;
hazheng 29:f87d8790f57d 89 //case LCD2MCU_MODE:
hazheng 29:f87d8790f57d 90 //ardu_cam_write_reg(ARDUCHIP_MODE, LCD2MCU_MODE);
hazheng 29:f87d8790f57d 91 //break;
hazheng 29:f87d8790f57d 92 default:
hazheng 29:f87d8790f57d 93 ardu_cam_write_reg(ARDUCHIP_MODE, CAM2LCD_MODE);
hazheng 29:f87d8790f57d 94 break;
hazheng 29:f87d8790f57d 95 }
hazheng 29:f87d8790f57d 96 }
hazheng 29:f87d8790f57d 97
hazheng 29:f87d8790f57d 98 void ardu_cam_start_capture()
hazheng 29:f87d8790f57d 99 {
hazheng 29:f87d8790f57d 100 ardu_cam_write_reg(ARDUCHIP_FIFO, FIFO_CLEAR_MASK);
hazheng 29:f87d8790f57d 101 ardu_cam_write_reg(ARDUCHIP_CAP_CTRL, 0x05);
hazheng 29:f87d8790f57d 102 ardu_cam_write_reg(ARDUCHIP_FIFO, FIFO_START_MASK);
hazheng 29:f87d8790f57d 103 }
hazheng 29:f87d8790f57d 104
hazheng 29:f87d8790f57d 105 int ardu_cam_bus_write(int address, int value)
hazheng 29:f87d8790f57d 106 {
hazheng 29:f87d8790f57d 107 // take the SS pin low to select the chip:
hazheng 29:f87d8790f57d 108 cam_cs = 0;
hazheng 29:f87d8790f57d 109 // send in the address and value via SPI:
hazheng 29:f87d8790f57d 110 g_spi_port.write(address);
hazheng 29:f87d8790f57d 111 g_spi_port.write(value);
hazheng 29:f87d8790f57d 112 // take the SS pin high to de-select the chip:
hazheng 29:f87d8790f57d 113 cam_cs = 1;
hazheng 29:f87d8790f57d 114
hazheng 29:f87d8790f57d 115 return value;
hazheng 29:f87d8790f57d 116 }
hazheng 29:f87d8790f57d 117
hazheng 29:f87d8790f57d 118 uint8_t ardu_cam_bus_read(int address)
hazheng 29:f87d8790f57d 119 {
hazheng 29:f87d8790f57d 120 uint8_t value = 0;
hazheng 29:f87d8790f57d 121 // take the SS pin low to select the chip:
hazheng 29:f87d8790f57d 122 cam_cs = 0;
hazheng 29:f87d8790f57d 123 // send in the address and value via SPI:
hazheng 29:f87d8790f57d 124 g_spi_port.write(address);
hazheng 29:f87d8790f57d 125 value = g_spi_port.write(0x00);
hazheng 29:f87d8790f57d 126 // take the SS pin high to de-select the chip:
hazheng 29:f87d8790f57d 127 cam_cs = 1;
hazheng 29:f87d8790f57d 128 return value;
hazheng 29:f87d8790f57d 129 }