Added program for mark detection (Cross line, Left half line and Right half line).

Dependencies:   GR-PEACH_video mbed

Fork of TraceMark_Program_60fps by Micon Car Rally

Committer:
TetsuyaKonno
Date:
Fri Mar 17 03:53:01 2017 +0000
Revision:
2:af4db183ee76
Parent:
1:4a94c87a7d04
Added program for mark detection (Cross line, Left half line and Right half line).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TetsuyaKonno 0:158dbfb66e62 1 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 2 //Supported MCU: RZ/A1H
TetsuyaKonno 0:158dbfb66e62 3 //File Contents: Trace Program by Image Processing
TetsuyaKonno 0:158dbfb66e62 4 // (GR-PEACH version on the Micon Car)
TetsuyaKonno 2:af4db183ee76 5 //Version number: Ver.2.00
TetsuyaKonno 2:af4db183ee76 6 //Date: 2017.03.17
TetsuyaKonno 0:158dbfb66e62 7 //Copyright: Renesas Electronics Corporation
TetsuyaKonno 0:158dbfb66e62 8 // Hitachi Document Solutions Co., Ltd.
TetsuyaKonno 0:158dbfb66e62 9 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 10
TetsuyaKonno 0:158dbfb66e62 11 //This program supports the following boards:
TetsuyaKonno 0:158dbfb66e62 12 //* GR-PEACH(E version)
TetsuyaKonno 0:158dbfb66e62 13 //* Motor drive board Ver.5
TetsuyaKonno 0:158dbfb66e62 14 //* Camera module (SC-310)
TetsuyaKonno 2:af4db183ee76 15
TetsuyaKonno 0:158dbfb66e62 16 //Include
TetsuyaKonno 0:158dbfb66e62 17 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 18 #include "mbed.h"
TetsuyaKonno 0:158dbfb66e62 19 #include "math.h"
TetsuyaKonno 0:158dbfb66e62 20 #include "iodefine.h"
TetsuyaKonno 0:158dbfb66e62 21 #include "DisplayBace.h"
TetsuyaKonno 0:158dbfb66e62 22
TetsuyaKonno 0:158dbfb66e62 23 //Define
TetsuyaKonno 0:158dbfb66e62 24 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 25 //Motor PWM cycle
TetsuyaKonno 0:158dbfb66e62 26 #define MOTOR_PWM_CYCLE 33332 /* Motor PWM period */
TetsuyaKonno 0:158dbfb66e62 27 /* 1ms P0φ/1 = 0.03us */
TetsuyaKonno 0:158dbfb66e62 28 //Motor speed
TetsuyaKonno 0:158dbfb66e62 29 #define MAX_SPEED 40 /* motor() set: 0 to 100 */
TetsuyaKonno 0:158dbfb66e62 30
TetsuyaKonno 0:158dbfb66e62 31 //Servo PWM cycle
TetsuyaKonno 0:158dbfb66e62 32 #define SERVO_PWM_CYCLE 33332 /* SERVO PWM period */
TetsuyaKonno 0:158dbfb66e62 33 /* 16ms P0φ/16 = 0.48us */
TetsuyaKonno 0:158dbfb66e62 34 #define SERVO_CENTER 3124 /* 1.5ms / 0.48us - 1 = 3124*/
TetsuyaKonno 0:158dbfb66e62 35 #define HANDLE_STEP 18 /* 1 degree value */
TetsuyaKonno 0:158dbfb66e62 36
TetsuyaKonno 0:158dbfb66e62 37 //LED Color on GR-PEACH
TetsuyaKonno 0:158dbfb66e62 38 #define LED_OFF 0x00
TetsuyaKonno 0:158dbfb66e62 39 #define LED_RED 0x01
TetsuyaKonno 0:158dbfb66e62 40 #define LED_GREEN 0x02
TetsuyaKonno 0:158dbfb66e62 41 #define LED_YELLOW 0x03
TetsuyaKonno 0:158dbfb66e62 42 #define LED_BLUE 0x04
TetsuyaKonno 0:158dbfb66e62 43 #define LED_PURPLE 0x05
TetsuyaKonno 0:158dbfb66e62 44 #define LED_SKYBLUE 0x06
TetsuyaKonno 0:158dbfb66e62 45 #define LED_WHITE 0x07
TetsuyaKonno 0:158dbfb66e62 46
TetsuyaKonno 0:158dbfb66e62 47 //Status
TetsuyaKonno 0:158dbfb66e62 48 #define ERROR 0x00
TetsuyaKonno 0:158dbfb66e62 49 #define STOP 0x01
TetsuyaKonno 0:158dbfb66e62 50 #define RUN 0x02
TetsuyaKonno 0:158dbfb66e62 51 #define DEBUG 0x03
TetsuyaKonno 0:158dbfb66e62 52 #define MOTOR_START 0x04
TetsuyaKonno 0:158dbfb66e62 53 #define MOTOR_STOP 0x05
TetsuyaKonno 0:158dbfb66e62 54 #define MARK_T 0x06
TetsuyaKonno 2:af4db183ee76 55 #define MARK_C 0x07
TetsuyaKonno 2:af4db183ee76 56 #define MARK_R 0x08
TetsuyaKonno 2:af4db183ee76 57 #define MARK_L 0x09
TetsuyaKonno 0:158dbfb66e62 58
TetsuyaKonno 0:158dbfb66e62 59 //Define(NTSC-Video)
TetsuyaKonno 0:158dbfb66e62 60 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 61 #define VIDEO_INPUT_CH (DisplayBase::VIDEO_INPUT_CHANNEL_0)
TetsuyaKonno 0:158dbfb66e62 62 #define VIDEO_INT_TYPE (DisplayBase::INT_TYPE_S0_VFIELD)
TetsuyaKonno 0:158dbfb66e62 63 #define DATA_SIZE_PER_PIC (2u)
TetsuyaKonno 0:158dbfb66e62 64
TetsuyaKonno 0:158dbfb66e62 65 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
TetsuyaKonno 0:158dbfb66e62 66 in accordance with the frame buffer burst transfer mode. */
TetsuyaKonno 0:158dbfb66e62 67 #define PIXEL_HW (320u) /* QVGA */
TetsuyaKonno 0:158dbfb66e62 68 #define PIXEL_VW (240u) /* QVGA */
TetsuyaKonno 0:158dbfb66e62 69 #define VIDEO_BUFFER_STRIDE (((PIXEL_HW * DATA_SIZE_PER_PIC) + 31u) & ~31u)
TetsuyaKonno 0:158dbfb66e62 70 #define VIDEO_BUFFER_HEIGHT (PIXEL_VW)
TetsuyaKonno 0:158dbfb66e62 71
TetsuyaKonno 0:158dbfb66e62 72 //Constructor
TetsuyaKonno 0:158dbfb66e62 73 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 74 Ticker interrput;
TetsuyaKonno 0:158dbfb66e62 75 Serial pc(USBTX, USBRX);
TetsuyaKonno 0:158dbfb66e62 76 DigitalOut LED_R(P6_13); /* LED1 on the GR-PEACH board */
TetsuyaKonno 0:158dbfb66e62 77 DigitalOut LED_G(P6_14); /* LED2 on the GR-PEACH board */
TetsuyaKonno 0:158dbfb66e62 78 DigitalOut LED_B(P6_15); /* LED3 on the GR-PEACH board */
TetsuyaKonno 0:158dbfb66e62 79 DigitalOut USER_LED(P6_12); /* USER_LED on the GR-PEACH board */
TetsuyaKonno 0:158dbfb66e62 80 DigitalIn user_botton(P6_0); /* SW1 on the GR-PEACH board */
TetsuyaKonno 0:158dbfb66e62 81
TetsuyaKonno 0:158dbfb66e62 82 DigitalOut Left_motor_signal(P4_6); /* Used by motor fanction */
TetsuyaKonno 0:158dbfb66e62 83 DigitalOut Right_motor_signal(P4_7); /* Used by motor fanction */
TetsuyaKonno 0:158dbfb66e62 84 DigitalIn push_sw(P2_13); /* SW1 on the Motor Drive board */
TetsuyaKonno 0:158dbfb66e62 85 DigitalOut LED_3(P2_14); /* LED3 on the Motor Drive board */
TetsuyaKonno 0:158dbfb66e62 86 DigitalOut LED_2(P2_15); /* LED2 on the Motor Drive board */
TetsuyaKonno 0:158dbfb66e62 87
TetsuyaKonno 0:158dbfb66e62 88 //Prototype(NTSC-video)
TetsuyaKonno 0:158dbfb66e62 89 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 90 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type);
TetsuyaKonno 0:158dbfb66e62 91 static void WaitVfield(const int32_t wait_count);
TetsuyaKonno 0:158dbfb66e62 92 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type);
TetsuyaKonno 0:158dbfb66e62 93 static void WaitVsync(const int32_t wait_count);
TetsuyaKonno 0:158dbfb66e62 94
TetsuyaKonno 0:158dbfb66e62 95 //Prototype
TetsuyaKonno 0:158dbfb66e62 96 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 97 //Peripheral functions
TetsuyaKonno 0:158dbfb66e62 98 void init_MTU2_PWM_Motor( void ); /* Initialize PWM functions */
TetsuyaKonno 0:158dbfb66e62 99 void init_MTU2_PWM_Servo( void ); /* Initialize PWM functions */
TetsuyaKonno 0:158dbfb66e62 100 void intTimer( void ); /* Interrupt fanction */
TetsuyaKonno 0:158dbfb66e62 101
TetsuyaKonno 0:158dbfb66e62 102 //GR-peach board
TetsuyaKonno 0:158dbfb66e62 103 void led_rgb(int led);
TetsuyaKonno 0:158dbfb66e62 104 void led_m_user( int led );
TetsuyaKonno 0:158dbfb66e62 105 unsigned int user_button_get( void );
TetsuyaKonno 0:158dbfb66e62 106 void led_m_set( int set );
TetsuyaKonno 0:158dbfb66e62 107 void led_m_process( void ); /* Function for only interrupt */
TetsuyaKonno 0:158dbfb66e62 108
TetsuyaKonno 0:158dbfb66e62 109 //Motor drive board
TetsuyaKonno 0:158dbfb66e62 110 void led_out(int led);
TetsuyaKonno 0:158dbfb66e62 111 unsigned int pushsw_get( void );
TetsuyaKonno 0:158dbfb66e62 112 void motor( int accele_l, int accele_r );
TetsuyaKonno 2:af4db183ee76 113 void motor2( int accele_l, int accele_r );
TetsuyaKonno 0:158dbfb66e62 114 void handle( int angle );
TetsuyaKonno 0:158dbfb66e62 115 int diff( int pwm );
TetsuyaKonno 0:158dbfb66e62 116
TetsuyaKonno 0:158dbfb66e62 117 //Prototype(Image process)
TetsuyaKonno 0:158dbfb66e62 118 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 119 void Image_Extraction( unsigned char *buff_addr, unsigned char *Data_Y, int frame );
TetsuyaKonno 0:158dbfb66e62 120 void Image_Reduction( unsigned char *Data_Y, int Data_W , unsigned char *Comp_Y, int Comp_M );
TetsuyaKonno 0:158dbfb66e62 121 void Binarization_process( unsigned char *Comp_Y, unsigned char *Binary, long items, int threshold );
TetsuyaKonno 0:158dbfb66e62 122
TetsuyaKonno 0:158dbfb66e62 123 //Prototype(Digital sensor process)
TetsuyaKonno 0:158dbfb66e62 124 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 125 int CenterLine_Corrective( unsigned char *Binary );
TetsuyaKonno 0:158dbfb66e62 126 void digital_sensor_process( unsigned char *Binary ); /* Function for only interrupt */
TetsuyaKonno 0:158dbfb66e62 127 unsigned char digital_sensor( void );
TetsuyaKonno 0:158dbfb66e62 128
TetsuyaKonno 0:158dbfb66e62 129 //Prototype(Mark detection process)
TetsuyaKonno 0:158dbfb66e62 130 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 131 void Image_part_Extraction( unsigned char *Binary, int Width, int Xpix, int Ypix, unsigned char *Data_B, int x_size, int y_size );
TetsuyaKonno 0:158dbfb66e62 132 double Standard_Deviation( unsigned char *data, double *Devi, int items );
TetsuyaKonno 0:158dbfb66e62 133 double Covariance( double *Devi_A, double *Devi_B, int items );
TetsuyaKonno 0:158dbfb66e62 134 int Judgement_ImageMatching( double covari, double SDevi_A, double SDevi_B );
TetsuyaKonno 2:af4db183ee76 135
TetsuyaKonno 0:158dbfb66e62 136 void MarkDetect_process_T( void );
TetsuyaKonno 2:af4db183ee76 137 void MarkDetect_process_C( void );
TetsuyaKonno 2:af4db183ee76 138 void MarkDetect_process_R( void );
TetsuyaKonno 2:af4db183ee76 139 void MarkDetect_process_L( void );
TetsuyaKonno 2:af4db183ee76 140
TetsuyaKonno 0:158dbfb66e62 141 int MarkCheck_Triangle( int percentage );
TetsuyaKonno 2:af4db183ee76 142 int MarkCheck_Crossline( int percentage );
TetsuyaKonno 2:af4db183ee76 143 int MarkCheck_Rightline( int percentage );
TetsuyaKonno 2:af4db183ee76 144 int MarkCheck_Leftline( int percentage );
TetsuyaKonno 0:158dbfb66e62 145
TetsuyaKonno 0:158dbfb66e62 146 //Prototype(Display Debug)
TetsuyaKonno 0:158dbfb66e62 147 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 148 void ImageData_Serial_Out( unsigned char *Data_Y, int Width );
TetsuyaKonno 0:158dbfb66e62 149 void ImageData_Serial_Out2( unsigned char *Data_Y, int Width );
TetsuyaKonno 0:158dbfb66e62 150
TetsuyaKonno 0:158dbfb66e62 151 //Globle variable (NTSC-video)
TetsuyaKonno 0:158dbfb66e62 152 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 153 static uint8_t FrameBuffer_Video_A[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(16))); //16 bytes aligned!;
TetsuyaKonno 0:158dbfb66e62 154 uint8_t * write_buff_addr = FrameBuffer_Video_A;
TetsuyaKonno 0:158dbfb66e62 155 static volatile int32_t vsync_count;
TetsuyaKonno 0:158dbfb66e62 156 static volatile int32_t vfield_count;
TetsuyaKonno 0:158dbfb66e62 157 static volatile int32_t vfield_count2 = 1;
TetsuyaKonno 0:158dbfb66e62 158 static volatile int32_t vfield_count2_buff;
TetsuyaKonno 0:158dbfb66e62 159
TetsuyaKonno 0:158dbfb66e62 160 //Globle variable for Image process
TetsuyaKonno 0:158dbfb66e62 161 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 162 unsigned char ImageData_A[160*120];
TetsuyaKonno 0:158dbfb66e62 163 unsigned char ImageComp_A[20*15];
TetsuyaKonno 0:158dbfb66e62 164 unsigned char ImageBinary[20*15];
TetsuyaKonno 0:158dbfb66e62 165
TetsuyaKonno 0:158dbfb66e62 166 //Globle variable for Digital sensor process
TetsuyaKonno 0:158dbfb66e62 167 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 168 volatile int Sensor_X[8][6];
TetsuyaKonno 0:158dbfb66e62 169 volatile unsigned char sensor_value;
TetsuyaKonno 0:158dbfb66e62 170
TetsuyaKonno 0:158dbfb66e62 171 //Globle variable for Mark detection process
TetsuyaKonno 0:158dbfb66e62 172 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 173 double TempDevi_Triangle[15];
TetsuyaKonno 0:158dbfb66e62 174 unsigned char TempBinary_Triangle[15] = {0,1,1,1,0,
TetsuyaKonno 0:158dbfb66e62 175 0,0,1,0,0,
TetsuyaKonno 0:158dbfb66e62 176 0,0,0,0,0};
TetsuyaKonno 2:af4db183ee76 177 double TempDevi_Crossline[28];
TetsuyaKonno 2:af4db183ee76 178 unsigned char TempBinary_Crossline[28] = {0,0,0,0,0,1,1,1,1,0,0,0,0,0,
TetsuyaKonno 2:af4db183ee76 179 1,1,1,1,1,1,1,1,1,1,1,1,1,1};
TetsuyaKonno 2:af4db183ee76 180 double TempDevi_Rightline[28];
TetsuyaKonno 2:af4db183ee76 181 unsigned char TempBinary_Rightline[28] = {0,0,0,0,0,1,1,1,1,0,0,0,0,0,
TetsuyaKonno 2:af4db183ee76 182 0,0,0,0,0,0,1,1,1,1,1,1,1,1};
TetsuyaKonno 2:af4db183ee76 183 double TempDevi_Leftline[28];
TetsuyaKonno 2:af4db183ee76 184 unsigned char TempBinary_Leftline[28] = {0,0,0,0,0,1,1,1,1,0,0,0,0,0,
TetsuyaKonno 2:af4db183ee76 185 1,1,1,1,1,1,1,1,0,0,0,0,0,0};
TetsuyaKonno 2:af4db183ee76 186 double NowDevi[30];
TetsuyaKonno 2:af4db183ee76 187 unsigned char NowImageBinary[30];
TetsuyaKonno 0:158dbfb66e62 188
TetsuyaKonno 0:158dbfb66e62 189 volatile double retDevi_Triangle;
TetsuyaKonno 2:af4db183ee76 190 volatile double retDevi_Crossline;
TetsuyaKonno 2:af4db183ee76 191 volatile double retDevi_Rightline;
TetsuyaKonno 2:af4db183ee76 192 volatile double retDevi_Leftline;
TetsuyaKonno 0:158dbfb66e62 193
TetsuyaKonno 0:158dbfb66e62 194 volatile double retDevi;
TetsuyaKonno 0:158dbfb66e62 195 volatile double retCovari;
TetsuyaKonno 0:158dbfb66e62 196 volatile int retJudgeIM;
TetsuyaKonno 2:af4db183ee76 197 volatile int retJudgeIM_Max[4];
TetsuyaKonno 0:158dbfb66e62 198
TetsuyaKonno 0:158dbfb66e62 199 int Xt, Yt;
TetsuyaKonno 2:af4db183ee76 200 int Xc, Yc;
TetsuyaKonno 2:af4db183ee76 201 int Xr, Yr;
TetsuyaKonno 2:af4db183ee76 202 int Xl, Yl;
TetsuyaKonno 0:158dbfb66e62 203
TetsuyaKonno 0:158dbfb66e62 204 //Globle variable for led fanction
TetsuyaKonno 0:158dbfb66e62 205 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 206 volatile int led_set; /* Status */
TetsuyaKonno 0:158dbfb66e62 207
TetsuyaKonno 0:158dbfb66e62 208 // LED, OnTime, OffTime,
TetsuyaKonno 0:158dbfb66e62 209 volatile int led_data[10][3]= {LED_RED, 50, 50, /* ERROR */
TetsuyaKonno 0:158dbfb66e62 210 LED_RED, 500, 0, /* STOP */
TetsuyaKonno 0:158dbfb66e62 211 LED_GREEN, 500, 500, /* RUN */
TetsuyaKonno 0:158dbfb66e62 212 LED_BLUE, 50, 50, /* DEBUG */
TetsuyaKonno 0:158dbfb66e62 213 LED_GREEN, 1, 0, /* MOTOR_START */
TetsuyaKonno 0:158dbfb66e62 214 LED_RED, 1, 0, /* MOTOR_STOP */
TetsuyaKonno 2:af4db183ee76 215 LED_WHITE, 500, 500, /* MARK_T */
TetsuyaKonno 2:af4db183ee76 216 LED_YELLOW, 500, 500, /* MARK_C */
TetsuyaKonno 2:af4db183ee76 217 LED_PURPLE, 500, 500, /* MARK_R */
TetsuyaKonno 2:af4db183ee76 218 LED_SKYBLUE,500, 500}; /* MARK_L */
TetsuyaKonno 0:158dbfb66e62 219
TetsuyaKonno 0:158dbfb66e62 220 //Globle variable for Trace program
TetsuyaKonno 0:158dbfb66e62 221 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 222 volatile unsigned long cnt0; /* Used by timer function */
TetsuyaKonno 0:158dbfb66e62 223 volatile unsigned long cnt1; /* Used within main */
TetsuyaKonno 0:158dbfb66e62 224 volatile int pattern; /* Pattern numbers */
TetsuyaKonno 0:158dbfb66e62 225 volatile int handle_buff;
TetsuyaKonno 0:158dbfb66e62 226
TetsuyaKonno 2:af4db183ee76 227 volatile unsigned long main_cnt = 0; /* Used by timer function */
TetsuyaKonno 2:af4db183ee76 228
TetsuyaKonno 0:158dbfb66e62 229 const int revolution_difference[] = {
TetsuyaKonno 0:158dbfb66e62 230 100, 98, 97, 95, 93,
TetsuyaKonno 0:158dbfb66e62 231 92, 90, 88, 87, 85,
TetsuyaKonno 0:158dbfb66e62 232 84, 82, 81, 79, 78,
TetsuyaKonno 0:158dbfb66e62 233 76, 75, 73, 72, 71,
TetsuyaKonno 0:158dbfb66e62 234 69, 68, 66, 65, 64,
TetsuyaKonno 0:158dbfb66e62 235 62, 61, 59, 58, 57,
TetsuyaKonno 0:158dbfb66e62 236 55, 54, 52, 51, 50,
TetsuyaKonno 0:158dbfb66e62 237 48, 47, 45, 44, 42,
TetsuyaKonno 0:158dbfb66e62 238 41, 39, 38, 36, 35,
TetsuyaKonno 0:158dbfb66e62 239 33 };
TetsuyaKonno 0:158dbfb66e62 240
TetsuyaKonno 0:158dbfb66e62 241 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 242 // Main function
TetsuyaKonno 0:158dbfb66e62 243 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 244 int main( void )
TetsuyaKonno 0:158dbfb66e62 245 {
TetsuyaKonno 0:158dbfb66e62 246 /* NTSC-Video */
TetsuyaKonno 0:158dbfb66e62 247 DisplayBase::graphics_error_t error;
TetsuyaKonno 0:158dbfb66e62 248
TetsuyaKonno 0:158dbfb66e62 249 /* Create DisplayBase object */
TetsuyaKonno 0:158dbfb66e62 250 DisplayBase Display;
TetsuyaKonno 0:158dbfb66e62 251
TetsuyaKonno 0:158dbfb66e62 252 /* Graphics initialization process */
TetsuyaKonno 0:158dbfb66e62 253 error = Display.Graphics_init(NULL);
TetsuyaKonno 0:158dbfb66e62 254 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 255 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 256 while (1);
TetsuyaKonno 0:158dbfb66e62 257 }
TetsuyaKonno 0:158dbfb66e62 258
TetsuyaKonno 0:158dbfb66e62 259 error = Display.Graphics_Video_init( DisplayBase::INPUT_SEL_VDEC, NULL);
TetsuyaKonno 0:158dbfb66e62 260 if( error != DisplayBase::GRAPHICS_OK ) {
TetsuyaKonno 0:158dbfb66e62 261 while(1);
TetsuyaKonno 0:158dbfb66e62 262 }
TetsuyaKonno 0:158dbfb66e62 263
TetsuyaKonno 0:158dbfb66e62 264 /* Interrupt callback function setting (Vsync signal input to scaler 0) */
TetsuyaKonno 0:158dbfb66e62 265 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_VI_VSYNC, 0, IntCallbackFunc_Vsync);
TetsuyaKonno 0:158dbfb66e62 266 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 267 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 268 while (1);
TetsuyaKonno 0:158dbfb66e62 269 }
TetsuyaKonno 0:158dbfb66e62 270
TetsuyaKonno 0:158dbfb66e62 271 /* Video capture setting (progressive form fixed) */
TetsuyaKonno 0:158dbfb66e62 272 error = Display.Video_Write_Setting(
TetsuyaKonno 0:158dbfb66e62 273 VIDEO_INPUT_CH,
TetsuyaKonno 0:158dbfb66e62 274 DisplayBase::COL_SYS_NTSC_358,
TetsuyaKonno 0:158dbfb66e62 275 write_buff_addr,
TetsuyaKonno 0:158dbfb66e62 276 VIDEO_BUFFER_STRIDE,
TetsuyaKonno 0:158dbfb66e62 277 DisplayBase::VIDEO_FORMAT_YCBCR422,
TetsuyaKonno 0:158dbfb66e62 278 DisplayBase::WR_RD_WRSWA_32_16BIT,
TetsuyaKonno 0:158dbfb66e62 279 PIXEL_VW,
TetsuyaKonno 0:158dbfb66e62 280 PIXEL_HW
TetsuyaKonno 0:158dbfb66e62 281 );
TetsuyaKonno 0:158dbfb66e62 282 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 283 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 284 while (1);
TetsuyaKonno 0:158dbfb66e62 285 }
TetsuyaKonno 0:158dbfb66e62 286
TetsuyaKonno 0:158dbfb66e62 287 /* Interrupt callback function setting (Field end signal for recording function in scaler 0) */
TetsuyaKonno 0:158dbfb66e62 288 error = Display.Graphics_Irq_Handler_Set(VIDEO_INT_TYPE, 0, IntCallbackFunc_Vfield);
TetsuyaKonno 0:158dbfb66e62 289 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 290 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 291 while (1);
TetsuyaKonno 0:158dbfb66e62 292 }
TetsuyaKonno 0:158dbfb66e62 293
TetsuyaKonno 0:158dbfb66e62 294 /* Video write process start */
TetsuyaKonno 0:158dbfb66e62 295 error = Display.Video_Start (VIDEO_INPUT_CH);
TetsuyaKonno 0:158dbfb66e62 296 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 297 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 298 while (1);
TetsuyaKonno 0:158dbfb66e62 299 }
TetsuyaKonno 0:158dbfb66e62 300
TetsuyaKonno 0:158dbfb66e62 301 /* Video write process stop */
TetsuyaKonno 0:158dbfb66e62 302 error = Display.Video_Stop (VIDEO_INPUT_CH);
TetsuyaKonno 0:158dbfb66e62 303 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 304 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 305 while (1);
TetsuyaKonno 0:158dbfb66e62 306 }
TetsuyaKonno 0:158dbfb66e62 307
TetsuyaKonno 0:158dbfb66e62 308 /* Video write process start */
TetsuyaKonno 0:158dbfb66e62 309 error = Display.Video_Start (VIDEO_INPUT_CH);
TetsuyaKonno 0:158dbfb66e62 310 if (error != DisplayBase::GRAPHICS_OK) {
TetsuyaKonno 0:158dbfb66e62 311 printf("Line %d, error %d\n", __LINE__, error);
TetsuyaKonno 0:158dbfb66e62 312 while (1);
TetsuyaKonno 0:158dbfb66e62 313 }
TetsuyaKonno 0:158dbfb66e62 314
TetsuyaKonno 0:158dbfb66e62 315 /* Wait vsync to update resister */
TetsuyaKonno 0:158dbfb66e62 316 WaitVsync(1);
TetsuyaKonno 0:158dbfb66e62 317
TetsuyaKonno 0:158dbfb66e62 318 /* Wait 2 Vfield(Top or bottom field) */
TetsuyaKonno 0:158dbfb66e62 319 WaitVfield(2);
TetsuyaKonno 0:158dbfb66e62 320
TetsuyaKonno 0:158dbfb66e62 321 /* Initialize MCU functions */
TetsuyaKonno 0:158dbfb66e62 322 init_MTU2_PWM_Motor();
TetsuyaKonno 0:158dbfb66e62 323 init_MTU2_PWM_Servo();
TetsuyaKonno 0:158dbfb66e62 324 interrput.attach(&intTimer, 0.001);
TetsuyaKonno 0:158dbfb66e62 325 pc.baud(230400);
TetsuyaKonno 0:158dbfb66e62 326
TetsuyaKonno 0:158dbfb66e62 327 /* Initialize Micon Car state */
TetsuyaKonno 0:158dbfb66e62 328 led_out( 0x0 );
TetsuyaKonno 0:158dbfb66e62 329 handle( 0 );
TetsuyaKonno 0:158dbfb66e62 330 motor( 0, 0 );
TetsuyaKonno 0:158dbfb66e62 331
TetsuyaKonno 0:158dbfb66e62 332 /* wait to stabilize NTSC signal (about 170ms) */
TetsuyaKonno 0:158dbfb66e62 333 wait(0.2);
TetsuyaKonno 0:158dbfb66e62 334
TetsuyaKonno 0:158dbfb66e62 335 /* Initialize Digital sensor */
TetsuyaKonno 0:158dbfb66e62 336 CenterLine_Corrective( ImageBinary );
TetsuyaKonno 0:158dbfb66e62 337
TetsuyaKonno 0:158dbfb66e62 338 /* Initialize Mark detection */
TetsuyaKonno 0:158dbfb66e62 339 retDevi_Triangle = Standard_Deviation( TempBinary_Triangle, TempDevi_Triangle, 15 );
TetsuyaKonno 2:af4db183ee76 340 retDevi_Crossline = Standard_Deviation( TempBinary_Crossline, TempDevi_Crossline, 28 );
TetsuyaKonno 2:af4db183ee76 341 retDevi_Rightline = Standard_Deviation( TempBinary_Rightline, TempDevi_Rightline, 28 );
TetsuyaKonno 2:af4db183ee76 342 retDevi_Leftline = Standard_Deviation( TempBinary_Leftline, TempDevi_Leftline, 28 );
TetsuyaKonno 0:158dbfb66e62 343
TetsuyaKonno 0:158dbfb66e62 344 if( user_button_get() ) {
TetsuyaKonno 0:158dbfb66e62 345 wait(0.1);
TetsuyaKonno 0:158dbfb66e62 346 led_m_set( DEBUG );
TetsuyaKonno 0:158dbfb66e62 347 while( user_button_get() );
TetsuyaKonno 0:158dbfb66e62 348 wait(0.5);
TetsuyaKonno 0:158dbfb66e62 349 pc.printf( "Please push the SW ( on the Motor drive board )\n\r" );
TetsuyaKonno 0:158dbfb66e62 350 pc.printf( "\n\r" );
TetsuyaKonno 2:af4db183ee76 351 while( !pushsw_get() );
TetsuyaKonno 0:158dbfb66e62 352 while( 1 ){
TetsuyaKonno 0:158dbfb66e62 353 ImageData_Serial_Out2( ImageBinary, 20 );
TetsuyaKonno 0:158dbfb66e62 354 }
TetsuyaKonno 0:158dbfb66e62 355 }
TetsuyaKonno 0:158dbfb66e62 356 led_m_set( RUN );
TetsuyaKonno 0:158dbfb66e62 357
TetsuyaKonno 0:158dbfb66e62 358 while( 1 ) {
TetsuyaKonno 2:af4db183ee76 359
TetsuyaKonno 0:158dbfb66e62 360 switch( pattern ) {
TetsuyaKonno 0:158dbfb66e62 361 /*****************************************************************
TetsuyaKonno 0:158dbfb66e62 362 About patern
TetsuyaKonno 0:158dbfb66e62 363 0:wait for switch input
TetsuyaKonno 0:158dbfb66e62 364 1:check if start bar is open
TetsuyaKonno 0:158dbfb66e62 365 11:normal trace
TetsuyaKonno 0:158dbfb66e62 366 12:Left side
TetsuyaKonno 0:158dbfb66e62 367 13:right side
TetsuyaKonno 0:158dbfb66e62 368 *****************************************************************/
TetsuyaKonno 0:158dbfb66e62 369 case 0:
TetsuyaKonno 0:158dbfb66e62 370 /* wait for switch input */
TetsuyaKonno 0:158dbfb66e62 371 if( pushsw_get() ) {
TetsuyaKonno 0:158dbfb66e62 372 led_out( 0x0 );
TetsuyaKonno 0:158dbfb66e62 373 led_m_set( RUN );
TetsuyaKonno 0:158dbfb66e62 374 pattern = 11;
TetsuyaKonno 0:158dbfb66e62 375 cnt1 = 0;
TetsuyaKonno 0:158dbfb66e62 376 break;
TetsuyaKonno 0:158dbfb66e62 377 }
TetsuyaKonno 0:158dbfb66e62 378 if( cnt1 < 100 ) {
TetsuyaKonno 0:158dbfb66e62 379 led_out( 0x1 );
TetsuyaKonno 0:158dbfb66e62 380 } else if( cnt1 < 200 ) {
TetsuyaKonno 0:158dbfb66e62 381 led_out( 0x2 );
TetsuyaKonno 0:158dbfb66e62 382 } else {
TetsuyaKonno 0:158dbfb66e62 383 cnt1 = 0;
TetsuyaKonno 0:158dbfb66e62 384 }
TetsuyaKonno 0:158dbfb66e62 385 break;
TetsuyaKonno 2:af4db183ee76 386
TetsuyaKonno 0:158dbfb66e62 387 case 11:
TetsuyaKonno 0:158dbfb66e62 388 /* normal trace */
TetsuyaKonno 0:158dbfb66e62 389 if( MarkCheck_Triangle( 90 ) ) {
TetsuyaKonno 0:158dbfb66e62 390 led_m_set( MARK_T );
TetsuyaKonno 0:158dbfb66e62 391 pattern = 91;
TetsuyaKonno 0:158dbfb66e62 392 break;
TetsuyaKonno 0:158dbfb66e62 393 }
TetsuyaKonno 2:af4db183ee76 394 if( MarkCheck_Crossline( 90 ) ) { /* Cross line check */
TetsuyaKonno 2:af4db183ee76 395 led_m_set( MARK_C );
TetsuyaKonno 2:af4db183ee76 396 pattern = 21;
TetsuyaKonno 2:af4db183ee76 397 break;
TetsuyaKonno 2:af4db183ee76 398 }
TetsuyaKonno 2:af4db183ee76 399 if( MarkCheck_Rightline( 90 ) ) { /* Right half line detection check */
TetsuyaKonno 2:af4db183ee76 400 led_m_set( MARK_R );
TetsuyaKonno 2:af4db183ee76 401 pattern = 51;
TetsuyaKonno 2:af4db183ee76 402 break;
TetsuyaKonno 2:af4db183ee76 403 }
TetsuyaKonno 2:af4db183ee76 404 if( MarkCheck_Leftline( 90 ) ) { /* Left half line detection check */
TetsuyaKonno 2:af4db183ee76 405 led_m_set( MARK_L );
TetsuyaKonno 2:af4db183ee76 406 pattern = 61;
TetsuyaKonno 2:af4db183ee76 407 break;
TetsuyaKonno 2:af4db183ee76 408 }
TetsuyaKonno 0:158dbfb66e62 409 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 0:158dbfb66e62 410 case 0x00:
TetsuyaKonno 0:158dbfb66e62 411 handle( 0 );
TetsuyaKonno 0:158dbfb66e62 412 motor( 100, 100 );
TetsuyaKonno 0:158dbfb66e62 413 break;
TetsuyaKonno 0:158dbfb66e62 414 case 0x02:
TetsuyaKonno 0:158dbfb66e62 415 handle( 3 );
TetsuyaKonno 0:158dbfb66e62 416 motor( 100, diff(100) );
TetsuyaKonno 0:158dbfb66e62 417 break;
TetsuyaKonno 0:158dbfb66e62 418 case 0x03:
TetsuyaKonno 0:158dbfb66e62 419 handle( 12 );
TetsuyaKonno 0:158dbfb66e62 420 motor( 100, diff(100) );
TetsuyaKonno 0:158dbfb66e62 421 break;
TetsuyaKonno 0:158dbfb66e62 422 case 0x01:
TetsuyaKonno 0:158dbfb66e62 423 handle( 20 );
TetsuyaKonno 0:158dbfb66e62 424 motor( 100, diff(100) );
TetsuyaKonno 0:158dbfb66e62 425 pattern = 12;
TetsuyaKonno 0:158dbfb66e62 426 break;
TetsuyaKonno 0:158dbfb66e62 427 case 0x04:
TetsuyaKonno 0:158dbfb66e62 428 handle( -3 );
TetsuyaKonno 0:158dbfb66e62 429 motor( diff(100), 100 );
TetsuyaKonno 0:158dbfb66e62 430 break;
TetsuyaKonno 0:158dbfb66e62 431 case 0x0c:
TetsuyaKonno 0:158dbfb66e62 432 handle( -12 );
TetsuyaKonno 0:158dbfb66e62 433 motor( diff(100), 100 );
TetsuyaKonno 0:158dbfb66e62 434 break;
TetsuyaKonno 0:158dbfb66e62 435 case 0x08:
TetsuyaKonno 0:158dbfb66e62 436 handle( -20 );
TetsuyaKonno 0:158dbfb66e62 437 motor( diff(100), 100 );
TetsuyaKonno 0:158dbfb66e62 438 pattern = 13;
TetsuyaKonno 0:158dbfb66e62 439 break;
TetsuyaKonno 0:158dbfb66e62 440 default:
TetsuyaKonno 0:158dbfb66e62 441 break;
TetsuyaKonno 0:158dbfb66e62 442 }
TetsuyaKonno 0:158dbfb66e62 443 break;
TetsuyaKonno 2:af4db183ee76 444
TetsuyaKonno 0:158dbfb66e62 445 case 12:
TetsuyaKonno 0:158dbfb66e62 446 /* Left side */
TetsuyaKonno 0:158dbfb66e62 447 if( (digital_sensor()&0x02) == 0x02 ) {
TetsuyaKonno 0:158dbfb66e62 448 pattern = 11;
TetsuyaKonno 0:158dbfb66e62 449 break;
TetsuyaKonno 0:158dbfb66e62 450 }
TetsuyaKonno 0:158dbfb66e62 451 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 0:158dbfb66e62 452 case 0x01:
TetsuyaKonno 0:158dbfb66e62 453 handle( 20 );
TetsuyaKonno 0:158dbfb66e62 454 motor( 100, diff(100) );
TetsuyaKonno 0:158dbfb66e62 455 break;
TetsuyaKonno 0:158dbfb66e62 456 case 0x00:
TetsuyaKonno 0:158dbfb66e62 457 case 0x08:
TetsuyaKonno 0:158dbfb66e62 458 case 0x0c:
TetsuyaKonno 0:158dbfb66e62 459 handle( 22 );
TetsuyaKonno 0:158dbfb66e62 460 motor( 100, diff(100) );
TetsuyaKonno 0:158dbfb66e62 461 break;
TetsuyaKonno 0:158dbfb66e62 462 default:
TetsuyaKonno 0:158dbfb66e62 463 break;
TetsuyaKonno 0:158dbfb66e62 464 }
TetsuyaKonno 0:158dbfb66e62 465 break;
TetsuyaKonno 2:af4db183ee76 466
TetsuyaKonno 0:158dbfb66e62 467 case 13:
TetsuyaKonno 0:158dbfb66e62 468 /* right side */
TetsuyaKonno 0:158dbfb66e62 469 if( (digital_sensor()&0x04) == 0x04 ) {
TetsuyaKonno 0:158dbfb66e62 470 pattern = 11;
TetsuyaKonno 0:158dbfb66e62 471 }
TetsuyaKonno 0:158dbfb66e62 472 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 0:158dbfb66e62 473 case 0x08:
TetsuyaKonno 0:158dbfb66e62 474 handle( -20 );
TetsuyaKonno 0:158dbfb66e62 475 motor( diff(100), 100 );
TetsuyaKonno 0:158dbfb66e62 476 break;
TetsuyaKonno 0:158dbfb66e62 477 case 0x00:
TetsuyaKonno 0:158dbfb66e62 478 case 0x01:
TetsuyaKonno 0:158dbfb66e62 479 case 0x03:
TetsuyaKonno 0:158dbfb66e62 480 handle( -22 );
TetsuyaKonno 0:158dbfb66e62 481 motor( diff(100), 100 );
TetsuyaKonno 0:158dbfb66e62 482 break;
TetsuyaKonno 0:158dbfb66e62 483 default:
TetsuyaKonno 0:158dbfb66e62 484 break;
TetsuyaKonno 0:158dbfb66e62 485 }
TetsuyaKonno 0:158dbfb66e62 486 break;
TetsuyaKonno 0:158dbfb66e62 487
TetsuyaKonno 2:af4db183ee76 488 case 21:
TetsuyaKonno 2:af4db183ee76 489 /* Processing at 1st cross line */
TetsuyaKonno 2:af4db183ee76 490 led_out( 0x3 );
TetsuyaKonno 2:af4db183ee76 491 handle( 0 );
TetsuyaKonno 2:af4db183ee76 492 motor2( 0 ,0 );
TetsuyaKonno 2:af4db183ee76 493 pattern = 22;
TetsuyaKonno 2:af4db183ee76 494 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 495 break;
TetsuyaKonno 2:af4db183ee76 496
TetsuyaKonno 2:af4db183ee76 497 case 22:
TetsuyaKonno 2:af4db183ee76 498 /* Read but ignore 2nd line */
TetsuyaKonno 2:af4db183ee76 499 if( cnt1 > 100 ) {
TetsuyaKonno 2:af4db183ee76 500 pattern = 23;
TetsuyaKonno 2:af4db183ee76 501 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 502 }
TetsuyaKonno 2:af4db183ee76 503 break;
TetsuyaKonno 2:af4db183ee76 504
TetsuyaKonno 2:af4db183ee76 505 case 23:
TetsuyaKonno 2:af4db183ee76 506 /* Trace, crank detection after cross line */
TetsuyaKonno 2:af4db183ee76 507 if( (digital_sensor()&0x0c) == 0x0c) {
TetsuyaKonno 2:af4db183ee76 508 /* Left crank determined -> to left crank clearing processing */
TetsuyaKonno 2:af4db183ee76 509 led_out( 0x1 );
TetsuyaKonno 2:af4db183ee76 510 pattern = 31;
TetsuyaKonno 2:af4db183ee76 511 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 512 break;
TetsuyaKonno 2:af4db183ee76 513 }
TetsuyaKonno 2:af4db183ee76 514 if( (digital_sensor()&0x03) == 0x03 ) {
TetsuyaKonno 2:af4db183ee76 515 /* Right crank determined -> to right crank clearing processing */
TetsuyaKonno 2:af4db183ee76 516 led_out( 0x2 );
TetsuyaKonno 2:af4db183ee76 517 pattern = 41;
TetsuyaKonno 2:af4db183ee76 518 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 519 break;
TetsuyaKonno 2:af4db183ee76 520 }
TetsuyaKonno 2:af4db183ee76 521 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 2:af4db183ee76 522 case 0x00:
TetsuyaKonno 2:af4db183ee76 523 /* Center -> straight */
TetsuyaKonno 2:af4db183ee76 524 handle( 0 );
TetsuyaKonno 2:af4db183ee76 525 motor2( 27 ,27 );
TetsuyaKonno 2:af4db183ee76 526 break;
TetsuyaKonno 2:af4db183ee76 527 case 0x02:
TetsuyaKonno 2:af4db183ee76 528 /* Left of center -> turn to right */
TetsuyaKonno 2:af4db183ee76 529 handle( 4 );
TetsuyaKonno 2:af4db183ee76 530 motor2( 27 ,diff(27) );
TetsuyaKonno 2:af4db183ee76 531 break;
TetsuyaKonno 2:af4db183ee76 532 case 0x04:
TetsuyaKonno 2:af4db183ee76 533 /* Right of center -> turn to left */
TetsuyaKonno 2:af4db183ee76 534 handle( -4 );
TetsuyaKonno 2:af4db183ee76 535 motor2( diff(27) ,27 );
TetsuyaKonno 2:af4db183ee76 536 break;
TetsuyaKonno 2:af4db183ee76 537 default:
TetsuyaKonno 2:af4db183ee76 538 break;
TetsuyaKonno 2:af4db183ee76 539 }
TetsuyaKonno 2:af4db183ee76 540 break;
TetsuyaKonno 2:af4db183ee76 541
TetsuyaKonno 2:af4db183ee76 542 case 31:
TetsuyaKonno 2:af4db183ee76 543 if( (digital_sensor()&0x0f) == 0x00 ) {
TetsuyaKonno 2:af4db183ee76 544 handle( -40 );
TetsuyaKonno 2:af4db183ee76 545 motor2( diff(25) ,45 );
TetsuyaKonno 2:af4db183ee76 546 pattern = 32;
TetsuyaKonno 2:af4db183ee76 547 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 548 }
TetsuyaKonno 2:af4db183ee76 549 break;
TetsuyaKonno 2:af4db183ee76 550
TetsuyaKonno 2:af4db183ee76 551 case 32:
TetsuyaKonno 2:af4db183ee76 552 /* Left crank clearing processing - wait until stable */
TetsuyaKonno 2:af4db183ee76 553 if( cnt1 > 300 ) {
TetsuyaKonno 2:af4db183ee76 554 pattern = 33;
TetsuyaKonno 2:af4db183ee76 555 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 556 }
TetsuyaKonno 2:af4db183ee76 557 break;
TetsuyaKonno 2:af4db183ee76 558
TetsuyaKonno 2:af4db183ee76 559 case 33:
TetsuyaKonno 2:af4db183ee76 560 /* Left crank clearing processing - check end of turn */
TetsuyaKonno 2:af4db183ee76 561 if( (digital_sensor()&0x04) == 0x04 ) {
TetsuyaKonno 2:af4db183ee76 562 led_out( 0x0 );
TetsuyaKonno 2:af4db183ee76 563 led_m_set( RUN );
TetsuyaKonno 2:af4db183ee76 564 pattern = 11;
TetsuyaKonno 2:af4db183ee76 565 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 566 }
TetsuyaKonno 2:af4db183ee76 567 break;
TetsuyaKonno 2:af4db183ee76 568
TetsuyaKonno 2:af4db183ee76 569 case 41:
TetsuyaKonno 2:af4db183ee76 570 if( (digital_sensor()&0x0f) == 0x00 ) {
TetsuyaKonno 2:af4db183ee76 571 handle( 41 );
TetsuyaKonno 2:af4db183ee76 572 motor2( 50 ,diff(25) );
TetsuyaKonno 2:af4db183ee76 573 pattern = 42;
TetsuyaKonno 2:af4db183ee76 574 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 575 }
TetsuyaKonno 2:af4db183ee76 576 break;
TetsuyaKonno 2:af4db183ee76 577
TetsuyaKonno 2:af4db183ee76 578 case 42:
TetsuyaKonno 2:af4db183ee76 579 /* Right crank clearing processing - wait until stable */
TetsuyaKonno 2:af4db183ee76 580 if( cnt1 > 300 ) {
TetsuyaKonno 2:af4db183ee76 581 pattern = 43;
TetsuyaKonno 2:af4db183ee76 582 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 583 }
TetsuyaKonno 2:af4db183ee76 584 break;
TetsuyaKonno 2:af4db183ee76 585
TetsuyaKonno 2:af4db183ee76 586 case 43:
TetsuyaKonno 2:af4db183ee76 587 /* Right crank clearing processing - check end of turn */
TetsuyaKonno 2:af4db183ee76 588 if( (digital_sensor()&0x02) == 0x02 ) {
TetsuyaKonno 2:af4db183ee76 589 led_out( 0x0 );
TetsuyaKonno 2:af4db183ee76 590 led_m_set( RUN );
TetsuyaKonno 2:af4db183ee76 591 pattern = 11;
TetsuyaKonno 2:af4db183ee76 592 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 593 }
TetsuyaKonno 2:af4db183ee76 594 break;
TetsuyaKonno 2:af4db183ee76 595
TetsuyaKonno 2:af4db183ee76 596 case 51:
TetsuyaKonno 2:af4db183ee76 597 /* Processing at 1st right half line detection */
TetsuyaKonno 2:af4db183ee76 598 led_out( 0x2 );
TetsuyaKonno 2:af4db183ee76 599 handle( 0 );
TetsuyaKonno 2:af4db183ee76 600 motor2( 0 ,0 );
TetsuyaKonno 2:af4db183ee76 601 pattern = 52;
TetsuyaKonno 2:af4db183ee76 602 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 603 break;
TetsuyaKonno 2:af4db183ee76 604
TetsuyaKonno 2:af4db183ee76 605 case 52:
TetsuyaKonno 2:af4db183ee76 606 /* Read but ignore 2nd time */
TetsuyaKonno 2:af4db183ee76 607 if( cnt1 > 100 ) {
TetsuyaKonno 2:af4db183ee76 608 pattern = 53;
TetsuyaKonno 2:af4db183ee76 609 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 610 break;
TetsuyaKonno 2:af4db183ee76 611 }
TetsuyaKonno 2:af4db183ee76 612 if( MarkCheck_Crossline( 90 ) ) { /* Cross line check */
TetsuyaKonno 2:af4db183ee76 613 led_m_set( MARK_C );
TetsuyaKonno 2:af4db183ee76 614 pattern = 21;
TetsuyaKonno 2:af4db183ee76 615 break;
TetsuyaKonno 2:af4db183ee76 616 }
TetsuyaKonno 2:af4db183ee76 617 break;
TetsuyaKonno 2:af4db183ee76 618
TetsuyaKonno 2:af4db183ee76 619 case 53:
TetsuyaKonno 2:af4db183ee76 620 /* Trace, lane change after right half line detection */
TetsuyaKonno 2:af4db183ee76 621 if( (digital_sensor()&0x1f) == 0x00 ) {
TetsuyaKonno 2:af4db183ee76 622 handle( 22 );
TetsuyaKonno 2:af4db183ee76 623 motor2( 35 ,diff(25) );
TetsuyaKonno 2:af4db183ee76 624 pattern = 54;
TetsuyaKonno 2:af4db183ee76 625 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 626 break;
TetsuyaKonno 2:af4db183ee76 627 }
TetsuyaKonno 2:af4db183ee76 628 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 2:af4db183ee76 629 case 0x00:
TetsuyaKonno 2:af4db183ee76 630 /* Center -> straight */
TetsuyaKonno 2:af4db183ee76 631 handle( 0 );
TetsuyaKonno 2:af4db183ee76 632 motor2( 30 ,30 );
TetsuyaKonno 2:af4db183ee76 633 break;
TetsuyaKonno 2:af4db183ee76 634 case 0x02:
TetsuyaKonno 2:af4db183ee76 635 /* Left of center -> turn to right */
TetsuyaKonno 2:af4db183ee76 636 handle( 4 );
TetsuyaKonno 2:af4db183ee76 637 motor2( 30 ,diff(30) );
TetsuyaKonno 2:af4db183ee76 638 break;
TetsuyaKonno 2:af4db183ee76 639 case 0x04:
TetsuyaKonno 2:af4db183ee76 640 /* Right of center -> turn to left */
TetsuyaKonno 2:af4db183ee76 641 handle( -4 );
TetsuyaKonno 2:af4db183ee76 642 motor2( diff(30) ,30 );
TetsuyaKonno 2:af4db183ee76 643 break;
TetsuyaKonno 2:af4db183ee76 644 default:
TetsuyaKonno 2:af4db183ee76 645 break;
TetsuyaKonno 2:af4db183ee76 646 }
TetsuyaKonno 2:af4db183ee76 647 break;
TetsuyaKonno 2:af4db183ee76 648
TetsuyaKonno 2:af4db183ee76 649 case 54:
TetsuyaKonno 2:af4db183ee76 650 if( cnt1 > 500 ){
TetsuyaKonno 2:af4db183ee76 651 pattern = 55;
TetsuyaKonno 2:af4db183ee76 652 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 653 }
TetsuyaKonno 2:af4db183ee76 654 break;
TetsuyaKonno 2:af4db183ee76 655
TetsuyaKonno 2:af4db183ee76 656 case 55:
TetsuyaKonno 2:af4db183ee76 657 /* Right lane change end check */
TetsuyaKonno 2:af4db183ee76 658 if( (digital_sensor()&0x04) == 0x04 ) {
TetsuyaKonno 2:af4db183ee76 659 led_out( 0x0 );
TetsuyaKonno 2:af4db183ee76 660 led_m_set( RUN );
TetsuyaKonno 2:af4db183ee76 661 pattern = 11;
TetsuyaKonno 2:af4db183ee76 662 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 663 }
TetsuyaKonno 2:af4db183ee76 664 break;
TetsuyaKonno 2:af4db183ee76 665
TetsuyaKonno 2:af4db183ee76 666 case 61:
TetsuyaKonno 2:af4db183ee76 667 /* Processing at 1st left half line detection */
TetsuyaKonno 2:af4db183ee76 668 led_out( 0x1 );
TetsuyaKonno 2:af4db183ee76 669 handle( 0 );
TetsuyaKonno 2:af4db183ee76 670 motor2( 0 ,0 );
TetsuyaKonno 2:af4db183ee76 671 pattern = 62;
TetsuyaKonno 2:af4db183ee76 672 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 673 break;
TetsuyaKonno 2:af4db183ee76 674
TetsuyaKonno 2:af4db183ee76 675 case 62:
TetsuyaKonno 2:af4db183ee76 676 /* Read but ignore 2nd time */
TetsuyaKonno 2:af4db183ee76 677 if( cnt1 > 100 ) {
TetsuyaKonno 2:af4db183ee76 678 pattern = 63;
TetsuyaKonno 2:af4db183ee76 679 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 680 break;
TetsuyaKonno 2:af4db183ee76 681 }
TetsuyaKonno 2:af4db183ee76 682 if( MarkCheck_Crossline( 90 ) ) { /* Cross line check */
TetsuyaKonno 2:af4db183ee76 683 led_m_set( MARK_C );
TetsuyaKonno 2:af4db183ee76 684 pattern = 21;
TetsuyaKonno 2:af4db183ee76 685 break;
TetsuyaKonno 2:af4db183ee76 686 }
TetsuyaKonno 2:af4db183ee76 687 break;
TetsuyaKonno 2:af4db183ee76 688
TetsuyaKonno 2:af4db183ee76 689 case 63:
TetsuyaKonno 2:af4db183ee76 690 /* Trace, lane change after left half line detection */
TetsuyaKonno 2:af4db183ee76 691 if( (digital_sensor()&0x1f) == 0x00 ) {
TetsuyaKonno 2:af4db183ee76 692 handle( -22 );
TetsuyaKonno 2:af4db183ee76 693 motor2( diff(25) ,35 );
TetsuyaKonno 2:af4db183ee76 694 pattern = 64;
TetsuyaKonno 2:af4db183ee76 695 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 696 break;
TetsuyaKonno 2:af4db183ee76 697 }
TetsuyaKonno 2:af4db183ee76 698 switch( (digital_sensor()&0x0f) ) {
TetsuyaKonno 2:af4db183ee76 699 case 0x00:
TetsuyaKonno 2:af4db183ee76 700 /* Center -> straight */
TetsuyaKonno 2:af4db183ee76 701 handle( 0 );
TetsuyaKonno 2:af4db183ee76 702 motor2( 35 ,35 );
TetsuyaKonno 2:af4db183ee76 703 break;
TetsuyaKonno 2:af4db183ee76 704 case 0x02:
TetsuyaKonno 2:af4db183ee76 705 /* Left of center -> turn to right */
TetsuyaKonno 2:af4db183ee76 706 handle( 4 );
TetsuyaKonno 2:af4db183ee76 707 motor2( 35 ,diff(35) );
TetsuyaKonno 2:af4db183ee76 708 break;
TetsuyaKonno 2:af4db183ee76 709 case 0x04:
TetsuyaKonno 2:af4db183ee76 710 /* Right of center -> turn to left */
TetsuyaKonno 2:af4db183ee76 711 handle( -4 );
TetsuyaKonno 2:af4db183ee76 712 motor2( diff(35) ,35 );
TetsuyaKonno 2:af4db183ee76 713 break;
TetsuyaKonno 2:af4db183ee76 714 default:
TetsuyaKonno 2:af4db183ee76 715 break;
TetsuyaKonno 2:af4db183ee76 716 }
TetsuyaKonno 2:af4db183ee76 717 break;
TetsuyaKonno 2:af4db183ee76 718
TetsuyaKonno 2:af4db183ee76 719 case 64:
TetsuyaKonno 2:af4db183ee76 720 if( cnt1 > 500 ){
TetsuyaKonno 2:af4db183ee76 721 pattern = 65;
TetsuyaKonno 2:af4db183ee76 722 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 723 }
TetsuyaKonno 2:af4db183ee76 724 break;
TetsuyaKonno 2:af4db183ee76 725
TetsuyaKonno 2:af4db183ee76 726 case 65:
TetsuyaKonno 2:af4db183ee76 727 /* Left lane change end check */
TetsuyaKonno 2:af4db183ee76 728 if( (digital_sensor()&0x02) == 0x02 ) {
TetsuyaKonno 2:af4db183ee76 729 led_out( 0x0 );
TetsuyaKonno 2:af4db183ee76 730 led_m_set( RUN );
TetsuyaKonno 2:af4db183ee76 731 pattern = 11;
TetsuyaKonno 2:af4db183ee76 732 cnt1 = 0;
TetsuyaKonno 2:af4db183ee76 733 }
TetsuyaKonno 2:af4db183ee76 734 break;
TetsuyaKonno 2:af4db183ee76 735
TetsuyaKonno 0:158dbfb66e62 736 case 91:
TetsuyaKonno 0:158dbfb66e62 737 handle( 0 );
TetsuyaKonno 0:158dbfb66e62 738 motor( 0, 0 );
TetsuyaKonno 0:158dbfb66e62 739 break;
TetsuyaKonno 0:158dbfb66e62 740
TetsuyaKonno 0:158dbfb66e62 741 default:
TetsuyaKonno 0:158dbfb66e62 742 break;
TetsuyaKonno 0:158dbfb66e62 743 }
TetsuyaKonno 0:158dbfb66e62 744 }
TetsuyaKonno 0:158dbfb66e62 745 }
TetsuyaKonno 0:158dbfb66e62 746
TetsuyaKonno 0:158dbfb66e62 747 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 748 // Initialize functions
TetsuyaKonno 0:158dbfb66e62 749 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 750 //Initialize MTU2 PWM functions
TetsuyaKonno 0:158dbfb66e62 751 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 752 //MTU2_3, MTU2_4
TetsuyaKonno 0:158dbfb66e62 753 //Reset-Synchronized PWM mode
TetsuyaKonno 0:158dbfb66e62 754 //TIOC4A(P4_4) :Left-motor
TetsuyaKonno 0:158dbfb66e62 755 //TIOC4B(P4_5) :Right-motor
TetsuyaKonno 0:158dbfb66e62 756 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 757 void init_MTU2_PWM_Motor( void )
TetsuyaKonno 0:158dbfb66e62 758 {
TetsuyaKonno 0:158dbfb66e62 759 /* Port setting for S/W I/O Contorol */
TetsuyaKonno 0:158dbfb66e62 760 /* alternative mode */
TetsuyaKonno 0:158dbfb66e62 761
TetsuyaKonno 0:158dbfb66e62 762 /* MTU2_4 (P4_4)(P4_5) */
TetsuyaKonno 0:158dbfb66e62 763 GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/
TetsuyaKonno 0:158dbfb66e62 764 GPIOPFCAE4 &= 0xffcf; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 765 GPIOPFCE4 |= 0x0030; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 766 GPIOPFC4 &= 0xffcf; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 767 /* 2nd altemative function/output */
TetsuyaKonno 0:158dbfb66e62 768 GPIOP4 &= 0xffcf; /* */
TetsuyaKonno 0:158dbfb66e62 769 GPIOPM4 &= 0xffcf; /* p4_4,P4_5:output */
TetsuyaKonno 0:158dbfb66e62 770 GPIOPMC4 |= 0x0030; /* P4_4,P4_5:double */
TetsuyaKonno 0:158dbfb66e62 771
TetsuyaKonno 0:158dbfb66e62 772 /* Mosule stop 33(MTU2) canceling */
TetsuyaKonno 0:158dbfb66e62 773 CPGSTBCR3 &= 0xf7;
TetsuyaKonno 0:158dbfb66e62 774
TetsuyaKonno 0:158dbfb66e62 775 /* MTU2_3 and MTU2_4 (Motor PWM) */
TetsuyaKonno 0:158dbfb66e62 776 MTU2TCR_3 = 0x20; /* TCNT Clear(TGRA), P0φ/1 */
TetsuyaKonno 0:158dbfb66e62 777 MTU2TOCR1 = 0x04; /* */
TetsuyaKonno 0:158dbfb66e62 778 MTU2TOCR2 = 0x40; /* N L>H P H>L */
TetsuyaKonno 0:158dbfb66e62 779 MTU2TMDR_3 = 0x38; /* Buff:ON Reset-Synchronized PWM mode */
TetsuyaKonno 0:158dbfb66e62 780 MTU2TMDR_4 = 0x30; /* Buff:ON */
TetsuyaKonno 0:158dbfb66e62 781 MTU2TOER = 0xc6; /* TIOC3B,4A,4B enabled output */
TetsuyaKonno 0:158dbfb66e62 782 MTU2TCNT_3 = MTU2TCNT_4 = 0; /* TCNT3,TCNT4 Set 0 */
TetsuyaKonno 0:158dbfb66e62 783 MTU2TGRA_3 = MTU2TGRC_3 = MOTOR_PWM_CYCLE;
TetsuyaKonno 0:158dbfb66e62 784 /* PWM-Cycle(1ms) */
TetsuyaKonno 0:158dbfb66e62 785 MTU2TGRA_4 = MTU2TGRC_4 = 0; /* Left-motor(P4_4) */
TetsuyaKonno 0:158dbfb66e62 786 MTU2TGRB_4 = MTU2TGRD_4 = 0; /* Right-motor(P4_5) */
TetsuyaKonno 0:158dbfb66e62 787 MTU2TSTR |= 0x40; /* TCNT_4 Start */
TetsuyaKonno 0:158dbfb66e62 788 }
TetsuyaKonno 0:158dbfb66e62 789
TetsuyaKonno 0:158dbfb66e62 790 //Initialize MTU2 PWM functions
TetsuyaKonno 0:158dbfb66e62 791 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 792 //MTU2_0
TetsuyaKonno 0:158dbfb66e62 793 //PWM mode 1
TetsuyaKonno 0:158dbfb66e62 794 //TIOC0A(P4_0) :Servo-motor
TetsuyaKonno 0:158dbfb66e62 795 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 796 void init_MTU2_PWM_Servo( void )
TetsuyaKonno 0:158dbfb66e62 797 {
TetsuyaKonno 0:158dbfb66e62 798 /* Port setting for S/W I/O Contorol */
TetsuyaKonno 0:158dbfb66e62 799 /* alternative mode */
TetsuyaKonno 0:158dbfb66e62 800
TetsuyaKonno 0:158dbfb66e62 801 /* MTU2_0 (P4_0) */
TetsuyaKonno 0:158dbfb66e62 802 GPIOPBDC4 = 0x0000; /* Bidirection mode disabled*/
TetsuyaKonno 0:158dbfb66e62 803 GPIOPFCAE4 &= 0xfffe; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 804 GPIOPFCE4 &= 0xfffe; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 805 GPIOPFC4 |= 0x0001; /* The alternative function of a pin */
TetsuyaKonno 0:158dbfb66e62 806 /* 2nd alternative function/output */
TetsuyaKonno 0:158dbfb66e62 807 GPIOP4 &= 0xfffe; /* */
TetsuyaKonno 0:158dbfb66e62 808 GPIOPM4 &= 0xfffe; /* p4_0:output */
TetsuyaKonno 0:158dbfb66e62 809 GPIOPMC4 |= 0x0001; /* P4_0:double */
TetsuyaKonno 0:158dbfb66e62 810
TetsuyaKonno 0:158dbfb66e62 811 /* Mosule stop 33(MTU2) canceling */
TetsuyaKonno 0:158dbfb66e62 812 CPGSTBCR3 &= 0xf7;
TetsuyaKonno 0:158dbfb66e62 813
TetsuyaKonno 0:158dbfb66e62 814 /* MTU2_0 (Motor PWM) */
TetsuyaKonno 0:158dbfb66e62 815 MTU2TCR_0 = 0x22; /* TCNT Clear(TGRA), P0φ/16 */
TetsuyaKonno 0:158dbfb66e62 816 MTU2TIORH_0 = 0x52; /* TGRA L>H, TGRB H>L */
TetsuyaKonno 0:158dbfb66e62 817 MTU2TMDR_0 = 0x32; /* TGRC and TGRD = Buff-mode*/
TetsuyaKonno 0:158dbfb66e62 818 /* PWM-mode1 */
TetsuyaKonno 0:158dbfb66e62 819 MTU2TCNT_0 = 0; /* TCNT0 Set 0 */
TetsuyaKonno 0:158dbfb66e62 820 MTU2TGRA_0 = MTU2TGRC_0 = SERVO_PWM_CYCLE;
TetsuyaKonno 0:158dbfb66e62 821 /* PWM-Cycle(16ms) */
TetsuyaKonno 0:158dbfb66e62 822 MTU2TGRB_0 = MTU2TGRD_0 = 0; /* Servo-motor(P4_0) */
TetsuyaKonno 0:158dbfb66e62 823 MTU2TSTR |= 0x01; /* TCNT_0 Start */
TetsuyaKonno 0:158dbfb66e62 824 }
TetsuyaKonno 0:158dbfb66e62 825
TetsuyaKonno 0:158dbfb66e62 826 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 827 // @brief Interrupt callback function
TetsuyaKonno 0:158dbfb66e62 828 // @param[in] int_type : VDC5 interrupt type
TetsuyaKonno 0:158dbfb66e62 829 // @retval None
TetsuyaKonno 0:158dbfb66e62 830 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 831 static void IntCallbackFunc_Vfield(DisplayBase::int_type_t int_type)
TetsuyaKonno 0:158dbfb66e62 832 {
TetsuyaKonno 0:158dbfb66e62 833 if (vfield_count > 0) {
TetsuyaKonno 0:158dbfb66e62 834 vfield_count--;
TetsuyaKonno 0:158dbfb66e62 835 }
TetsuyaKonno 0:158dbfb66e62 836 /* top or bottom (Change) */
TetsuyaKonno 0:158dbfb66e62 837 if ( vfield_count2 == 0 ) vfield_count2 = 1;
TetsuyaKonno 0:158dbfb66e62 838 else if ( vfield_count2 == 1 ) vfield_count2 = 0;
TetsuyaKonno 2:af4db183ee76 839 led_m_user( vfield_count2 );
TetsuyaKonno 0:158dbfb66e62 840 }
TetsuyaKonno 0:158dbfb66e62 841
TetsuyaKonno 0:158dbfb66e62 842 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 843 // @brief Wait for the specified number of times Vsync occurs
TetsuyaKonno 0:158dbfb66e62 844 // @param[in] wait_count : Wait count
TetsuyaKonno 0:158dbfb66e62 845 // @retval None
TetsuyaKonno 0:158dbfb66e62 846 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 847 static void WaitVfield(const int32_t wait_count)
TetsuyaKonno 0:158dbfb66e62 848 {
TetsuyaKonno 0:158dbfb66e62 849 vfield_count = wait_count;
TetsuyaKonno 0:158dbfb66e62 850 while (vfield_count > 0) {
TetsuyaKonno 0:158dbfb66e62 851 /* Do nothing */
TetsuyaKonno 0:158dbfb66e62 852 }
TetsuyaKonno 0:158dbfb66e62 853 }
TetsuyaKonno 0:158dbfb66e62 854
TetsuyaKonno 0:158dbfb66e62 855 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 856 // @brief Interrupt callback function for Vsync interruption
TetsuyaKonno 0:158dbfb66e62 857 // @param[in] int_type : VDC5 interrupt type
TetsuyaKonno 0:158dbfb66e62 858 // @retval None
TetsuyaKonno 0:158dbfb66e62 859 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 860 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type)
TetsuyaKonno 0:158dbfb66e62 861 {
TetsuyaKonno 0:158dbfb66e62 862 if (vsync_count > 0) {
TetsuyaKonno 0:158dbfb66e62 863 vsync_count--;
TetsuyaKonno 0:158dbfb66e62 864 }
TetsuyaKonno 0:158dbfb66e62 865 }
TetsuyaKonno 0:158dbfb66e62 866
TetsuyaKonno 0:158dbfb66e62 867 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 868 // @brief Wait for the specified number of times Vsync occurs
TetsuyaKonno 0:158dbfb66e62 869 // @param[in] wait_count : Wait count
TetsuyaKonno 0:158dbfb66e62 870 // @retval None
TetsuyaKonno 0:158dbfb66e62 871 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 872 static void WaitVsync(const int32_t wait_count)
TetsuyaKonno 0:158dbfb66e62 873 {
TetsuyaKonno 0:158dbfb66e62 874 vsync_count = wait_count;
TetsuyaKonno 0:158dbfb66e62 875 while (vsync_count > 0) {
TetsuyaKonno 0:158dbfb66e62 876 /* Do nothing */
TetsuyaKonno 0:158dbfb66e62 877 }
TetsuyaKonno 0:158dbfb66e62 878 }
TetsuyaKonno 0:158dbfb66e62 879
TetsuyaKonno 0:158dbfb66e62 880 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 881 // Interrupt function( intTimer )
TetsuyaKonno 0:158dbfb66e62 882 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 883 void intTimer( void )
TetsuyaKonno 0:158dbfb66e62 884 {
TetsuyaKonno 0:158dbfb66e62 885 static int counter = 0;
TetsuyaKonno 2:af4db183ee76 886
TetsuyaKonno 0:158dbfb66e62 887 cnt0++;
TetsuyaKonno 0:158dbfb66e62 888 cnt1++;
TetsuyaKonno 0:158dbfb66e62 889
TetsuyaKonno 0:158dbfb66e62 890 /* field check */
TetsuyaKonno 2:af4db183ee76 891 if( vfield_count2 == vfield_count2_buff ) {
TetsuyaKonno 0:158dbfb66e62 892 vfield_count2_buff = vfield_count2;
TetsuyaKonno 0:158dbfb66e62 893 }
TetsuyaKonno 2:af4db183ee76 894 /* Top field / bottom field */
TetsuyaKonno 1:4a94c87a7d04 895 switch( counter++ ) {
TetsuyaKonno 1:4a94c87a7d04 896 case 0:
TetsuyaKonno 1:4a94c87a7d04 897 Image_Extraction( write_buff_addr, ImageData_A, vfield_count2 );
TetsuyaKonno 1:4a94c87a7d04 898 break;
TetsuyaKonno 1:4a94c87a7d04 899 case 1:
TetsuyaKonno 1:4a94c87a7d04 900 Image_Extraction( write_buff_addr, ImageData_A, vfield_count2 );
TetsuyaKonno 1:4a94c87a7d04 901 break;
TetsuyaKonno 1:4a94c87a7d04 902 case 2:
TetsuyaKonno 1:4a94c87a7d04 903 Image_Reduction( ImageData_A, 160, ImageComp_A, 8 );
TetsuyaKonno 1:4a94c87a7d04 904 break;
TetsuyaKonno 1:4a94c87a7d04 905 case 3:
TetsuyaKonno 1:4a94c87a7d04 906 Image_Reduction( ImageData_A, 160, ImageComp_A, 8 );
TetsuyaKonno 1:4a94c87a7d04 907 break;
TetsuyaKonno 1:4a94c87a7d04 908 case 4:
TetsuyaKonno 1:4a94c87a7d04 909 Binarization_process( ImageComp_A, ImageBinary, 20*15, 128 );
TetsuyaKonno 1:4a94c87a7d04 910 break;
TetsuyaKonno 1:4a94c87a7d04 911 case 5:
TetsuyaKonno 1:4a94c87a7d04 912 /* Trace by image processing */
TetsuyaKonno 1:4a94c87a7d04 913 digital_sensor_process( ImageBinary );
TetsuyaKonno 1:4a94c87a7d04 914 break;
TetsuyaKonno 1:4a94c87a7d04 915 case 6:
TetsuyaKonno 1:4a94c87a7d04 916 //MarkCheck_Triangle
TetsuyaKonno 1:4a94c87a7d04 917 MarkDetect_process_T();
TetsuyaKonno 1:4a94c87a7d04 918 break;
TetsuyaKonno 2:af4db183ee76 919 case 7:
TetsuyaKonno 2:af4db183ee76 920 //MarkCheck_Crossline
TetsuyaKonno 2:af4db183ee76 921 MarkDetect_process_C();
TetsuyaKonno 2:af4db183ee76 922 break;
TetsuyaKonno 2:af4db183ee76 923 case 8:
TetsuyaKonno 2:af4db183ee76 924 //MarkCheck_Rightline
TetsuyaKonno 2:af4db183ee76 925 MarkDetect_process_R();
TetsuyaKonno 2:af4db183ee76 926 break;
TetsuyaKonno 2:af4db183ee76 927 case 9:
TetsuyaKonno 2:af4db183ee76 928 //MarkCheck_Leftline
TetsuyaKonno 2:af4db183ee76 929 MarkDetect_process_L();
TetsuyaKonno 2:af4db183ee76 930 break;
TetsuyaKonno 2:af4db183ee76 931 case 15:
TetsuyaKonno 2:af4db183ee76 932 counter = 0;
TetsuyaKonno 2:af4db183ee76 933 break;
TetsuyaKonno 1:4a94c87a7d04 934 default:
TetsuyaKonno 1:4a94c87a7d04 935 break;
TetsuyaKonno 2:af4db183ee76 936
TetsuyaKonno 0:158dbfb66e62 937 }
TetsuyaKonno 0:158dbfb66e62 938 /* LED processing */
TetsuyaKonno 0:158dbfb66e62 939 led_m_process();
TetsuyaKonno 0:158dbfb66e62 940 }
TetsuyaKonno 0:158dbfb66e62 941
TetsuyaKonno 0:158dbfb66e62 942 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 943 // functions ( on GR-PEACH board )
TetsuyaKonno 0:158dbfb66e62 944 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 945 //led_rgb Function
TetsuyaKonno 0:158dbfb66e62 946 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 947 void led_rgb(int led)
TetsuyaKonno 0:158dbfb66e62 948 {
TetsuyaKonno 0:158dbfb66e62 949 LED_R = led & 0x1;
TetsuyaKonno 0:158dbfb66e62 950 LED_G = (led >> 1 ) & 0x1;
TetsuyaKonno 0:158dbfb66e62 951 LED_B = (led >> 2 ) & 0x1;
TetsuyaKonno 0:158dbfb66e62 952 }
TetsuyaKonno 0:158dbfb66e62 953
TetsuyaKonno 0:158dbfb66e62 954 //user_button_get Function
TetsuyaKonno 0:158dbfb66e62 955 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 956 unsigned int user_button_get( void )
TetsuyaKonno 0:158dbfb66e62 957 {
TetsuyaKonno 0:158dbfb66e62 958 return (~user_botton) & 0x1; /* Read ports with switches */
TetsuyaKonno 0:158dbfb66e62 959 }
TetsuyaKonno 0:158dbfb66e62 960
TetsuyaKonno 0:158dbfb66e62 961 //led_m_user Function
TetsuyaKonno 0:158dbfb66e62 962 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 963 void led_m_user( int led )
TetsuyaKonno 0:158dbfb66e62 964 {
TetsuyaKonno 0:158dbfb66e62 965 USER_LED = led & 0x01;
TetsuyaKonno 0:158dbfb66e62 966 }
TetsuyaKonno 0:158dbfb66e62 967
TetsuyaKonno 0:158dbfb66e62 968 //Lled_m_set Function
TetsuyaKonno 0:158dbfb66e62 969 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 970 void led_m_set( int set )
TetsuyaKonno 0:158dbfb66e62 971 {
TetsuyaKonno 0:158dbfb66e62 972 led_set = set;
TetsuyaKonno 0:158dbfb66e62 973 }
TetsuyaKonno 0:158dbfb66e62 974
TetsuyaKonno 0:158dbfb66e62 975 //led_m_process Function for only interrupt
TetsuyaKonno 0:158dbfb66e62 976 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 977 void led_m_process( void )
TetsuyaKonno 0:158dbfb66e62 978 {
TetsuyaKonno 0:158dbfb66e62 979 static unsigned long led_timer;
TetsuyaKonno 0:158dbfb66e62 980
TetsuyaKonno 0:158dbfb66e62 981 led_timer++;
TetsuyaKonno 0:158dbfb66e62 982
TetsuyaKonno 0:158dbfb66e62 983 /* Display */
TetsuyaKonno 0:158dbfb66e62 984 if( led_timer < led_data[led_set][1] ) led_rgb( led_data[led_set][0] );
TetsuyaKonno 0:158dbfb66e62 985 else if( led_timer < ( led_data[led_set][1] + led_data[led_set][2] ) ) led_rgb( LED_OFF );
TetsuyaKonno 0:158dbfb66e62 986 else led_timer = 0;
TetsuyaKonno 0:158dbfb66e62 987 }
TetsuyaKonno 0:158dbfb66e62 988
TetsuyaKonno 0:158dbfb66e62 989 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 990 // functions ( on Motor drive board )
TetsuyaKonno 0:158dbfb66e62 991 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 992 //led_out Function
TetsuyaKonno 0:158dbfb66e62 993 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 994 void led_out(int led)
TetsuyaKonno 0:158dbfb66e62 995 {
TetsuyaKonno 0:158dbfb66e62 996 led = ~led;
TetsuyaKonno 0:158dbfb66e62 997 LED_3 = led & 0x1;
TetsuyaKonno 0:158dbfb66e62 998 LED_2 = ( led >> 1 ) & 0x1;
TetsuyaKonno 0:158dbfb66e62 999 }
TetsuyaKonno 0:158dbfb66e62 1000
TetsuyaKonno 0:158dbfb66e62 1001 //pushsw_get Function
TetsuyaKonno 0:158dbfb66e62 1002 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1003 unsigned int pushsw_get( void )
TetsuyaKonno 0:158dbfb66e62 1004 {
TetsuyaKonno 0:158dbfb66e62 1005 return (~push_sw) & 0x1; /* Read ports with switches */
TetsuyaKonno 0:158dbfb66e62 1006 }
TetsuyaKonno 0:158dbfb66e62 1007
TetsuyaKonno 0:158dbfb66e62 1008 //motor speed control(PWM)
TetsuyaKonno 0:158dbfb66e62 1009 //Arguments: motor:-100 to 100
TetsuyaKonno 0:158dbfb66e62 1010 //Here, 0 is stop, 100 is forward, -100 is reverse
TetsuyaKonno 0:158dbfb66e62 1011 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1012 void motor( int accele_l, int accele_r )
TetsuyaKonno 0:158dbfb66e62 1013 {
TetsuyaKonno 0:158dbfb66e62 1014 accele_l = ( accele_l * MAX_SPEED ) / 100;
TetsuyaKonno 0:158dbfb66e62 1015 accele_r = ( accele_r * MAX_SPEED ) / 100;
TetsuyaKonno 0:158dbfb66e62 1016
TetsuyaKonno 0:158dbfb66e62 1017 /* Left Motor Control */
TetsuyaKonno 0:158dbfb66e62 1018 if( accele_l >= 0 ) {
TetsuyaKonno 0:158dbfb66e62 1019 /* forward */
TetsuyaKonno 0:158dbfb66e62 1020 Left_motor_signal = 0;
TetsuyaKonno 0:158dbfb66e62 1021 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100;
TetsuyaKonno 0:158dbfb66e62 1022 } else {
TetsuyaKonno 0:158dbfb66e62 1023 /* reverse */
TetsuyaKonno 0:158dbfb66e62 1024 Left_motor_signal = 1;
TetsuyaKonno 0:158dbfb66e62 1025 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100;
TetsuyaKonno 0:158dbfb66e62 1026 }
TetsuyaKonno 0:158dbfb66e62 1027
TetsuyaKonno 0:158dbfb66e62 1028 /* Right Motor Control */
TetsuyaKonno 0:158dbfb66e62 1029 if( accele_r >= 0 ) {
TetsuyaKonno 0:158dbfb66e62 1030 /* forward */
TetsuyaKonno 0:158dbfb66e62 1031 Right_motor_signal = 0;
TetsuyaKonno 0:158dbfb66e62 1032 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100;
TetsuyaKonno 0:158dbfb66e62 1033 } else {
TetsuyaKonno 0:158dbfb66e62 1034 /* reverse */
TetsuyaKonno 0:158dbfb66e62 1035 Right_motor_signal = 1;
TetsuyaKonno 0:158dbfb66e62 1036 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100;
TetsuyaKonno 0:158dbfb66e62 1037 }
TetsuyaKonno 0:158dbfb66e62 1038 }
TetsuyaKonno 2:af4db183ee76 1039
TetsuyaKonno 2:af4db183ee76 1040 //motor speed control(PWM)
TetsuyaKonno 2:af4db183ee76 1041 //Arguments: motor:-100 to 100
TetsuyaKonno 2:af4db183ee76 1042 //Here, 0 is stop, 100 is forward, -100 is reverse
TetsuyaKonno 2:af4db183ee76 1043 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1044 void motor2( int accele_l, int accele_r )
TetsuyaKonno 2:af4db183ee76 1045 {
TetsuyaKonno 2:af4db183ee76 1046 /* Left Motor Control */
TetsuyaKonno 2:af4db183ee76 1047 if( accele_l >= 0 ) {
TetsuyaKonno 2:af4db183ee76 1048 /* forward */
TetsuyaKonno 2:af4db183ee76 1049 Left_motor_signal = 0;
TetsuyaKonno 2:af4db183ee76 1050 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_l / 100;
TetsuyaKonno 2:af4db183ee76 1051 } else {
TetsuyaKonno 2:af4db183ee76 1052 /* reverse */
TetsuyaKonno 2:af4db183ee76 1053 Left_motor_signal = 1;
TetsuyaKonno 2:af4db183ee76 1054 MTU2TGRC_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_l ) / 100;
TetsuyaKonno 2:af4db183ee76 1055 }
TetsuyaKonno 0:158dbfb66e62 1056
TetsuyaKonno 2:af4db183ee76 1057 /* Right Motor Control */
TetsuyaKonno 2:af4db183ee76 1058 if( accele_r >= 0 ) {
TetsuyaKonno 2:af4db183ee76 1059 /* forward */
TetsuyaKonno 2:af4db183ee76 1060 Right_motor_signal = 0;
TetsuyaKonno 2:af4db183ee76 1061 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * accele_r / 100;
TetsuyaKonno 2:af4db183ee76 1062 } else {
TetsuyaKonno 2:af4db183ee76 1063 /* reverse */
TetsuyaKonno 2:af4db183ee76 1064 Right_motor_signal = 1;
TetsuyaKonno 2:af4db183ee76 1065 MTU2TGRD_4 = (long)( MOTOR_PWM_CYCLE - 1 ) * ( -accele_r ) / 100;
TetsuyaKonno 2:af4db183ee76 1066 }
TetsuyaKonno 2:af4db183ee76 1067 }
TetsuyaKonno 2:af4db183ee76 1068
TetsuyaKonno 0:158dbfb66e62 1069 //handle Function
TetsuyaKonno 0:158dbfb66e62 1070 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1071 void handle( int angle )
TetsuyaKonno 0:158dbfb66e62 1072 {
TetsuyaKonno 0:158dbfb66e62 1073 handle_buff = angle;
TetsuyaKonno 0:158dbfb66e62 1074 /* When the servo move from left to right in reverse, replace "-" with "+" */
TetsuyaKonno 0:158dbfb66e62 1075 MTU2TGRD_0 = SERVO_CENTER - angle * HANDLE_STEP;
TetsuyaKonno 0:158dbfb66e62 1076 }
TetsuyaKonno 0:158dbfb66e62 1077
TetsuyaKonno 0:158dbfb66e62 1078 //diff Function
TetsuyaKonno 0:158dbfb66e62 1079 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1080 int diff( int pwm )
TetsuyaKonno 0:158dbfb66e62 1081 {
TetsuyaKonno 0:158dbfb66e62 1082 int i, ret;
TetsuyaKonno 0:158dbfb66e62 1083
TetsuyaKonno 0:158dbfb66e62 1084 i = handle_buff;
TetsuyaKonno 0:158dbfb66e62 1085 if( i < 0 ) i = -i;
TetsuyaKonno 0:158dbfb66e62 1086 if( i > 45 ) i = 45;
TetsuyaKonno 0:158dbfb66e62 1087 ret = revolution_difference[i] * pwm / 100;
TetsuyaKonno 0:158dbfb66e62 1088
TetsuyaKonno 0:158dbfb66e62 1089 return ret;
TetsuyaKonno 0:158dbfb66e62 1090 }
TetsuyaKonno 0:158dbfb66e62 1091
TetsuyaKonno 0:158dbfb66e62 1092 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 1093 // Image process functions
TetsuyaKonno 0:158dbfb66e62 1094 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 1095 //Image Data YCbCr -> Y(320*240pix) -> Y(160*120)
TetsuyaKonno 0:158dbfb66e62 1096 //frame 0 : Top field
TetsuyaKonno 0:158dbfb66e62 1097 //frame 1 : Bottom field
TetsuyaKonno 0:158dbfb66e62 1098 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1099 void Image_Extraction( unsigned char *buff_addr, unsigned char *Data_Y, int frame )
TetsuyaKonno 0:158dbfb66e62 1100 {
TetsuyaKonno 0:158dbfb66e62 1101 static int Xp, Yp, inc, Data_Y_buff;
TetsuyaKonno 0:158dbfb66e62 1102 static int counter = 0;
TetsuyaKonno 0:158dbfb66e62 1103
TetsuyaKonno 0:158dbfb66e62 1104 // Distributed processing
TetsuyaKonno 0:158dbfb66e62 1105 switch( counter++ ) {
TetsuyaKonno 0:158dbfb66e62 1106 case 0:
TetsuyaKonno 0:158dbfb66e62 1107 for( Yp = frame, inc = 0; Yp < 120; Yp+=2 ){
TetsuyaKonno 0:158dbfb66e62 1108 for( Xp = 0; Xp < 640; Xp+=4, inc++ ){
TetsuyaKonno 0:158dbfb66e62 1109 Data_Y_buff = (int)buff_addr[(Xp+0)+(640*Yp)];
TetsuyaKonno 0:158dbfb66e62 1110 Data_Y_buff += (int)buff_addr[(Xp+2)+(640*Yp)];
TetsuyaKonno 0:158dbfb66e62 1111 Data_Y[inc] = Data_Y_buff >> 1;
TetsuyaKonno 0:158dbfb66e62 1112 }
TetsuyaKonno 0:158dbfb66e62 1113 }
TetsuyaKonno 0:158dbfb66e62 1114 break;
TetsuyaKonno 0:158dbfb66e62 1115 case 1:
TetsuyaKonno 0:158dbfb66e62 1116 for( /* None */ ; Yp < 240; Yp+=2 ){
TetsuyaKonno 0:158dbfb66e62 1117 for( Xp = 0; Xp < 640; Xp+=4, inc++ ){
TetsuyaKonno 0:158dbfb66e62 1118 Data_Y_buff = (int)buff_addr[(Xp+0)+(640*Yp)];
TetsuyaKonno 0:158dbfb66e62 1119 Data_Y_buff += (int)buff_addr[(Xp+2)+(640*Yp)];
TetsuyaKonno 0:158dbfb66e62 1120 Data_Y[inc] = Data_Y_buff >> 1;
TetsuyaKonno 0:158dbfb66e62 1121 }
TetsuyaKonno 0:158dbfb66e62 1122 }
TetsuyaKonno 0:158dbfb66e62 1123 counter = 0;
TetsuyaKonno 0:158dbfb66e62 1124 break;
TetsuyaKonno 0:158dbfb66e62 1125 default:
TetsuyaKonno 0:158dbfb66e62 1126 break;
TetsuyaKonno 0:158dbfb66e62 1127 }
TetsuyaKonno 0:158dbfb66e62 1128 }
TetsuyaKonno 0:158dbfb66e62 1129
TetsuyaKonno 0:158dbfb66e62 1130 //Image_Reduction Function ( Averaging processing )
TetsuyaKonno 0:158dbfb66e62 1131 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1132 void Image_Reduction( unsigned char *Data_Y, int Data_W , unsigned char *Comp_Y, int Comp_M )
TetsuyaKonno 0:158dbfb66e62 1133 {
TetsuyaKonno 0:158dbfb66e62 1134 int Data_H, Pixel_T, Pixel_D;
TetsuyaKonno 0:158dbfb66e62 1135 int x, y;
TetsuyaKonno 0:158dbfb66e62 1136 static int Xp, Yp, inc;
TetsuyaKonno 0:158dbfb66e62 1137 static int counter = 0;
TetsuyaKonno 0:158dbfb66e62 1138
TetsuyaKonno 0:158dbfb66e62 1139 Data_H = (Data_W / (double)4) * 3;
TetsuyaKonno 0:158dbfb66e62 1140 Pixel_D = Comp_M * Comp_M;
TetsuyaKonno 0:158dbfb66e62 1141
TetsuyaKonno 0:158dbfb66e62 1142 switch( counter++ ) {
TetsuyaKonno 0:158dbfb66e62 1143 case 0:
TetsuyaKonno 0:158dbfb66e62 1144 for( Yp = 0, inc = 0; Yp < ( Data_H / 2); Yp+=Comp_M ){
TetsuyaKonno 0:158dbfb66e62 1145 for( Xp = 0; Xp < Data_W; Xp+=Comp_M, inc++ ){
TetsuyaKonno 0:158dbfb66e62 1146 Pixel_T = 0;
TetsuyaKonno 0:158dbfb66e62 1147 for( y = 0; y < Comp_M; y++ ){
TetsuyaKonno 0:158dbfb66e62 1148 for( x = 0; x < Comp_M; x++ ){
TetsuyaKonno 0:158dbfb66e62 1149 Pixel_T += Data_Y[( Xp + x ) + (( Yp + y ) * Data_W )];
TetsuyaKonno 0:158dbfb66e62 1150 }
TetsuyaKonno 0:158dbfb66e62 1151 }
TetsuyaKonno 0:158dbfb66e62 1152 Comp_Y[inc] = Pixel_T / Pixel_D;
TetsuyaKonno 0:158dbfb66e62 1153 }
TetsuyaKonno 0:158dbfb66e62 1154 }
TetsuyaKonno 0:158dbfb66e62 1155 break;
TetsuyaKonno 0:158dbfb66e62 1156 case 1:
TetsuyaKonno 0:158dbfb66e62 1157 for( /* None */ ; Yp < Data_H ; Yp+=Comp_M ){
TetsuyaKonno 0:158dbfb66e62 1158 for( Xp = 0; Xp < Data_W; Xp+=Comp_M, inc++ ){
TetsuyaKonno 0:158dbfb66e62 1159 Pixel_T = 0;
TetsuyaKonno 0:158dbfb66e62 1160 for( y = 0; y < Comp_M; y++ ){
TetsuyaKonno 0:158dbfb66e62 1161 for( x = 0; x < Comp_M; x++ ){
TetsuyaKonno 0:158dbfb66e62 1162 Pixel_T += Data_Y[( Xp + x ) + (( Yp + y ) * Data_W )];
TetsuyaKonno 0:158dbfb66e62 1163 }
TetsuyaKonno 0:158dbfb66e62 1164 }
TetsuyaKonno 0:158dbfb66e62 1165 Comp_Y[inc] = Pixel_T / Pixel_D;
TetsuyaKonno 0:158dbfb66e62 1166 }
TetsuyaKonno 0:158dbfb66e62 1167 }
TetsuyaKonno 0:158dbfb66e62 1168 counter = 0;
TetsuyaKonno 0:158dbfb66e62 1169 break;
TetsuyaKonno 0:158dbfb66e62 1170 default:
TetsuyaKonno 0:158dbfb66e62 1171 break;
TetsuyaKonno 0:158dbfb66e62 1172 }
TetsuyaKonno 0:158dbfb66e62 1173 }
TetsuyaKonno 0:158dbfb66e62 1174
TetsuyaKonno 0:158dbfb66e62 1175 // Binarization_process Function
TetsuyaKonno 0:158dbfb66e62 1176 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1177 void Binarization_process( unsigned char *Comp_Y, unsigned char *Binary, long items, int threshold )
TetsuyaKonno 0:158dbfb66e62 1178 {
TetsuyaKonno 0:158dbfb66e62 1179 int i;
TetsuyaKonno 0:158dbfb66e62 1180
TetsuyaKonno 0:158dbfb66e62 1181 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:158dbfb66e62 1182 if( Comp_Y[i] >= threshold ) Binary[i] = 1;
TetsuyaKonno 0:158dbfb66e62 1183 else Binary[i] = 0;
TetsuyaKonno 0:158dbfb66e62 1184 }
TetsuyaKonno 0:158dbfb66e62 1185 }
TetsuyaKonno 0:158dbfb66e62 1186
TetsuyaKonno 0:158dbfb66e62 1187 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 1188 // digital sensor functions
TetsuyaKonno 0:158dbfb66e62 1189 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 1190 //CenterLine_Corrective Function ( image size 20*15pix )
TetsuyaKonno 0:158dbfb66e62 1191 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1192 int CenterLine_Corrective( unsigned char *Binary )
TetsuyaKonno 0:158dbfb66e62 1193 {
TetsuyaKonno 0:158dbfb66e62 1194 #define L 0
TetsuyaKonno 0:158dbfb66e62 1195 #define R 1
TetsuyaKonno 0:158dbfb66e62 1196
TetsuyaKonno 0:158dbfb66e62 1197 int iRet, offset_X, offset_Y;
TetsuyaKonno 0:158dbfb66e62 1198 int Xpix, X;
TetsuyaKonno 0:158dbfb66e62 1199 int Ypix;
TetsuyaKonno 0:158dbfb66e62 1200 int Pixel_diff[2];
TetsuyaKonno 0:158dbfb66e62 1201 int Error_cnt;
TetsuyaKonno 0:158dbfb66e62 1202 int value;
TetsuyaKonno 0:158dbfb66e62 1203
TetsuyaKonno 0:158dbfb66e62 1204 /* Center of image */
TetsuyaKonno 0:158dbfb66e62 1205 offset_X = 6;
TetsuyaKonno 0:158dbfb66e62 1206 offset_Y = 12;
TetsuyaKonno 0:158dbfb66e62 1207
TetsuyaKonno 0:158dbfb66e62 1208 /* corrective of center line */
TetsuyaKonno 0:158dbfb66e62 1209 for( Ypix = 0, Error_cnt = 0; Ypix < (offset_Y - 4); Ypix++ ) {
TetsuyaKonno 0:158dbfb66e62 1210 for( value = 0; value < 2; value++ ) {
TetsuyaKonno 0:158dbfb66e62 1211 for( Xpix = offset_X; Xpix < (offset_X + 8); Xpix++ ) {
TetsuyaKonno 0:158dbfb66e62 1212 /* Lift side */
TetsuyaKonno 0:158dbfb66e62 1213 Pixel_diff[L] = 0;
TetsuyaKonno 0:158dbfb66e62 1214 if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + Xpix ] >= 1 ) {
TetsuyaKonno 0:158dbfb66e62 1215 for( X = Xpix; X > (Xpix - 4); X-- ) {
TetsuyaKonno 0:158dbfb66e62 1216 if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + X ] >= 1 ) {
TetsuyaKonno 0:158dbfb66e62 1217 Pixel_diff[L]++;
TetsuyaKonno 0:158dbfb66e62 1218 } else {
TetsuyaKonno 0:158dbfb66e62 1219 break;
TetsuyaKonno 0:158dbfb66e62 1220 }
TetsuyaKonno 0:158dbfb66e62 1221 }
TetsuyaKonno 0:158dbfb66e62 1222 } else {
TetsuyaKonno 0:158dbfb66e62 1223 Pixel_diff[L] = -1;
TetsuyaKonno 0:158dbfb66e62 1224 }
TetsuyaKonno 0:158dbfb66e62 1225 /* Right side */
TetsuyaKonno 0:158dbfb66e62 1226 Pixel_diff[R] = 0;
TetsuyaKonno 0:158dbfb66e62 1227 if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + (Xpix + 1) ] >= 1 ) {
TetsuyaKonno 0:158dbfb66e62 1228 for( X = (Xpix + 1); X < ((Xpix + 1) + 4); X++ ) {
TetsuyaKonno 0:158dbfb66e62 1229 if( Binary[ ( ( offset_Y - Ypix ) * 20 ) + X ] >= 1 ) {
TetsuyaKonno 0:158dbfb66e62 1230 Pixel_diff[R]++;
TetsuyaKonno 0:158dbfb66e62 1231 } else {
TetsuyaKonno 0:158dbfb66e62 1232 break;
TetsuyaKonno 0:158dbfb66e62 1233 }
TetsuyaKonno 0:158dbfb66e62 1234 }
TetsuyaKonno 0:158dbfb66e62 1235 } else {
TetsuyaKonno 0:158dbfb66e62 1236 Pixel_diff[R] = 1;
TetsuyaKonno 0:158dbfb66e62 1237 }
TetsuyaKonno 0:158dbfb66e62 1238 /* check */
TetsuyaKonno 0:158dbfb66e62 1239 iRet = Pixel_diff[L] - Pixel_diff[R];
TetsuyaKonno 0:158dbfb66e62 1240 if( value >= iRet && iRet >= -value ) {
TetsuyaKonno 0:158dbfb66e62 1241 break;
TetsuyaKonno 0:158dbfb66e62 1242 }
TetsuyaKonno 0:158dbfb66e62 1243 }
TetsuyaKonno 0:158dbfb66e62 1244 if( value >= iRet && iRet >= -value ) {
TetsuyaKonno 0:158dbfb66e62 1245 /* X coordinate */
TetsuyaKonno 0:158dbfb66e62 1246 Sensor_X[Ypix][2] = Xpix;
TetsuyaKonno 0:158dbfb66e62 1247 Sensor_X[Ypix][3] = Xpix + 1;
TetsuyaKonno 0:158dbfb66e62 1248 break;
TetsuyaKonno 0:158dbfb66e62 1249 } else {
TetsuyaKonno 0:158dbfb66e62 1250 Sensor_X[Ypix][2] = Sensor_X[Ypix][3] = -1;
TetsuyaKonno 0:158dbfb66e62 1251 Error_cnt++;
TetsuyaKonno 0:158dbfb66e62 1252 }
TetsuyaKonno 0:158dbfb66e62 1253 }
TetsuyaKonno 0:158dbfb66e62 1254 /* Left side sensor */
TetsuyaKonno 0:158dbfb66e62 1255 Sensor_X[Ypix][1] = Sensor_X[Ypix][2] - ( Pixel_diff[L] );
TetsuyaKonno 0:158dbfb66e62 1256 Sensor_X[Ypix][0] = Sensor_X[Ypix][1] - ( Pixel_diff[L] + 1 );//( Sensor_X[Ypix][2] - Sensor_X[Ypix][1] );
TetsuyaKonno 0:158dbfb66e62 1257 /* Right side sensor */
TetsuyaKonno 0:158dbfb66e62 1258 Sensor_X[Ypix][4] = Sensor_X[Ypix][3] + ( Pixel_diff[R] );
TetsuyaKonno 0:158dbfb66e62 1259 Sensor_X[Ypix][5] = Sensor_X[Ypix][4] + ( Pixel_diff[R] + 1 );//( Sensor_X[Ypix][4] - Sensor_X[Ypix][3] );
TetsuyaKonno 0:158dbfb66e62 1260 }
TetsuyaKonno 0:158dbfb66e62 1261 return Error_cnt;
TetsuyaKonno 0:158dbfb66e62 1262 }
TetsuyaKonno 0:158dbfb66e62 1263
TetsuyaKonno 0:158dbfb66e62 1264 //digital_sensor_process Function
TetsuyaKonno 0:158dbfb66e62 1265 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1266 void digital_sensor_process( unsigned char *Binary )
TetsuyaKonno 0:158dbfb66e62 1267 {
TetsuyaKonno 0:158dbfb66e62 1268 int Ypix;
TetsuyaKonno 0:158dbfb66e62 1269 int offset_Y;
TetsuyaKonno 0:158dbfb66e62 1270 unsigned char sensor, data;
TetsuyaKonno 0:158dbfb66e62 1271
TetsuyaKonno 0:158dbfb66e62 1272 offset_Y = 12;
TetsuyaKonno 0:158dbfb66e62 1273 sensor = 0;
TetsuyaKonno 0:158dbfb66e62 1274
TetsuyaKonno 0:158dbfb66e62 1275 data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][2] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1276 data |= Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][3] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1277 sensor |= (data << 4) & 0x10;
TetsuyaKonno 0:158dbfb66e62 1278 data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][0] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1279 sensor |= (data << 3) & 0x08;
TetsuyaKonno 0:158dbfb66e62 1280 data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][1] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1281 sensor |= (data << 2) & 0x04;
TetsuyaKonno 0:158dbfb66e62 1282 data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][4] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1283 sensor |= (data << 1) & 0x02;
TetsuyaKonno 0:158dbfb66e62 1284 data = Binary[ ( (offset_Y - Ypix) * 20 ) + Sensor_X[Ypix][5] ] & 0x01;
TetsuyaKonno 0:158dbfb66e62 1285 sensor |= (data << 0) & 0x01;
TetsuyaKonno 0:158dbfb66e62 1286 sensor &= 0x1f;
TetsuyaKonno 0:158dbfb66e62 1287 sensor_value = sensor;
TetsuyaKonno 0:158dbfb66e62 1288 }
TetsuyaKonno 0:158dbfb66e62 1289
TetsuyaKonno 0:158dbfb66e62 1290 //digital_sensor Function
TetsuyaKonno 0:158dbfb66e62 1291 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1292 unsigned char digital_sensor( void )
TetsuyaKonno 0:158dbfb66e62 1293 {
TetsuyaKonno 0:158dbfb66e62 1294 return sensor_value;
TetsuyaKonno 0:158dbfb66e62 1295 }
TetsuyaKonno 0:158dbfb66e62 1296
TetsuyaKonno 0:158dbfb66e62 1297 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 1298 // Mark detect functions
TetsuyaKonno 0:158dbfb66e62 1299 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 1300 // Extract_Image
TetsuyaKonno 0:158dbfb66e62 1301 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1302 void Image_part_Extraction( unsigned char *Binary, int Width, int Xpix, int Ypix, unsigned char *Data_B, int x_size, int y_size )
TetsuyaKonno 0:158dbfb66e62 1303 {
TetsuyaKonno 0:158dbfb66e62 1304 int x, y;
TetsuyaKonno 0:158dbfb66e62 1305 for( y = 0; y < y_size; y++ ) {
TetsuyaKonno 0:158dbfb66e62 1306 for( x = 0; x < x_size; x++ ) {
TetsuyaKonno 0:158dbfb66e62 1307 Data_B[ x + ( y * x_size ) ] = Binary[ (Xpix + x) + ( (Ypix + y) * Width ) ];
TetsuyaKonno 0:158dbfb66e62 1308 }
TetsuyaKonno 0:158dbfb66e62 1309 }
TetsuyaKonno 0:158dbfb66e62 1310 }
TetsuyaKonno 0:158dbfb66e62 1311
TetsuyaKonno 0:158dbfb66e62 1312 // Standard deviation
TetsuyaKonno 0:158dbfb66e62 1313 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1314 double Standard_Deviation( unsigned char *data, double *Devi, int items )
TetsuyaKonno 0:158dbfb66e62 1315 {
TetsuyaKonno 0:158dbfb66e62 1316 int i;
TetsuyaKonno 0:158dbfb66e62 1317 double iRet_A, iRet_C, iRet_D;
TetsuyaKonno 0:158dbfb66e62 1318
TetsuyaKonno 0:158dbfb66e62 1319 /* A 合計値 平均化 */
TetsuyaKonno 0:158dbfb66e62 1320 iRet_A = 0;
TetsuyaKonno 0:158dbfb66e62 1321 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:158dbfb66e62 1322 iRet_A += data[i];
TetsuyaKonno 0:158dbfb66e62 1323 }
TetsuyaKonno 0:158dbfb66e62 1324 iRet_A /= items;
TetsuyaKonno 0:158dbfb66e62 1325
TetsuyaKonno 0:158dbfb66e62 1326 /* B 偏差値 */
TetsuyaKonno 0:158dbfb66e62 1327 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:158dbfb66e62 1328 Devi[i] = data[i] - iRet_A;
TetsuyaKonno 0:158dbfb66e62 1329 }
TetsuyaKonno 0:158dbfb66e62 1330
TetsuyaKonno 0:158dbfb66e62 1331 /* C 分散 */
TetsuyaKonno 0:158dbfb66e62 1332 iRet_C = 0;
TetsuyaKonno 0:158dbfb66e62 1333 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:158dbfb66e62 1334 iRet_C += ( Devi[i] * Devi[i] );
TetsuyaKonno 0:158dbfb66e62 1335 }
TetsuyaKonno 0:158dbfb66e62 1336 iRet_C /= items;
TetsuyaKonno 0:158dbfb66e62 1337
TetsuyaKonno 0:158dbfb66e62 1338 /* D 標準偏差 */
TetsuyaKonno 0:158dbfb66e62 1339 iRet_D = sqrt( iRet_C );
TetsuyaKonno 0:158dbfb66e62 1340
TetsuyaKonno 0:158dbfb66e62 1341 return iRet_D;
TetsuyaKonno 0:158dbfb66e62 1342 }
TetsuyaKonno 0:158dbfb66e62 1343
TetsuyaKonno 0:158dbfb66e62 1344 // Covariance
TetsuyaKonno 0:158dbfb66e62 1345 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1346 double Covariance( double *Devi_A, double *Devi_B, int items )
TetsuyaKonno 0:158dbfb66e62 1347 {
TetsuyaKonno 0:158dbfb66e62 1348 int i;
TetsuyaKonno 0:158dbfb66e62 1349 double iRet, iRet_buff;
TetsuyaKonno 0:158dbfb66e62 1350
TetsuyaKonno 0:158dbfb66e62 1351 iRet = 0;
TetsuyaKonno 0:158dbfb66e62 1352 for( i = 0; i < items; i++ ) {
TetsuyaKonno 0:158dbfb66e62 1353 iRet_buff = Devi_A[i] * Devi_B[i];
TetsuyaKonno 0:158dbfb66e62 1354 iRet += iRet_buff;
TetsuyaKonno 0:158dbfb66e62 1355 }
TetsuyaKonno 0:158dbfb66e62 1356 iRet /= items;
TetsuyaKonno 0:158dbfb66e62 1357
TetsuyaKonno 0:158dbfb66e62 1358 return iRet;
TetsuyaKonno 0:158dbfb66e62 1359 }
TetsuyaKonno 0:158dbfb66e62 1360
TetsuyaKonno 0:158dbfb66e62 1361 // Judgement_ImageMatching
TetsuyaKonno 0:158dbfb66e62 1362 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1363 int Judgement_ImageMatching( double covari, double SDevi_A, double SDevi_B )
TetsuyaKonno 0:158dbfb66e62 1364 {
TetsuyaKonno 0:158dbfb66e62 1365 int iRet;
TetsuyaKonno 0:158dbfb66e62 1366
TetsuyaKonno 0:158dbfb66e62 1367 iRet = ( covari * 100 ) / ( SDevi_A * SDevi_B );
TetsuyaKonno 0:158dbfb66e62 1368
TetsuyaKonno 0:158dbfb66e62 1369 return iRet;
TetsuyaKonno 0:158dbfb66e62 1370 }
TetsuyaKonno 0:158dbfb66e62 1371
TetsuyaKonno 0:158dbfb66e62 1372 // MarkDetect_process_T
TetsuyaKonno 0:158dbfb66e62 1373 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1374 void MarkDetect_process_T( void )
TetsuyaKonno 0:158dbfb66e62 1375 {
TetsuyaKonno 0:158dbfb66e62 1376 int x, y;
TetsuyaKonno 0:158dbfb66e62 1377
TetsuyaKonno 0:158dbfb66e62 1378 retJudgeIM_Max[0] = 0;
TetsuyaKonno 0:158dbfb66e62 1379 for( y = 0; y <= 12; y++ ) {
TetsuyaKonno 0:158dbfb66e62 1380 for( x = 0; x <= 15; x++ ) {
TetsuyaKonno 0:158dbfb66e62 1381 Image_part_Extraction( ImageBinary, 20, x, y, NowImageBinary, 5, 3 );
TetsuyaKonno 0:158dbfb66e62 1382 retDevi = Standard_Deviation( NowImageBinary, NowDevi, 15 );
TetsuyaKonno 0:158dbfb66e62 1383 retCovari = Covariance( TempDevi_Triangle, NowDevi, 15 );
TetsuyaKonno 0:158dbfb66e62 1384 retJudgeIM = 0;
TetsuyaKonno 0:158dbfb66e62 1385 retJudgeIM = Judgement_ImageMatching( retCovari, retDevi_Triangle, retDevi );
TetsuyaKonno 0:158dbfb66e62 1386 if( 100 >= retJudgeIM && retJudgeIM > retJudgeIM_Max[0] ) {
TetsuyaKonno 0:158dbfb66e62 1387 Xt = x;
TetsuyaKonno 0:158dbfb66e62 1388 Yt = y;
TetsuyaKonno 0:158dbfb66e62 1389 retJudgeIM_Max[0] = retJudgeIM;
TetsuyaKonno 0:158dbfb66e62 1390 }
TetsuyaKonno 0:158dbfb66e62 1391 }
TetsuyaKonno 0:158dbfb66e62 1392 }
TetsuyaKonno 0:158dbfb66e62 1393 }
TetsuyaKonno 0:158dbfb66e62 1394
TetsuyaKonno 2:af4db183ee76 1395 // MarkDetect_process_C
TetsuyaKonno 2:af4db183ee76 1396 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1397 void MarkDetect_process_C( void )
TetsuyaKonno 2:af4db183ee76 1398 {
TetsuyaKonno 2:af4db183ee76 1399 int x, y;
TetsuyaKonno 2:af4db183ee76 1400
TetsuyaKonno 2:af4db183ee76 1401 retJudgeIM_Max[1] = 0;
TetsuyaKonno 2:af4db183ee76 1402 for( y = 0; y <= 13; y++ ) {
TetsuyaKonno 2:af4db183ee76 1403 for( x = 0; x <= 6; x++ ) {
TetsuyaKonno 2:af4db183ee76 1404 Image_part_Extraction( ImageBinary, 20, x, y, NowImageBinary, 14, 2 );
TetsuyaKonno 2:af4db183ee76 1405 retDevi = Standard_Deviation( NowImageBinary, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1406 retCovari = Covariance( TempDevi_Crossline, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1407 retJudgeIM = 0;
TetsuyaKonno 2:af4db183ee76 1408 retJudgeIM = Judgement_ImageMatching( retCovari, retDevi_Crossline, retDevi );
TetsuyaKonno 2:af4db183ee76 1409 if( 100 >= retJudgeIM && retJudgeIM > retJudgeIM_Max[1] ) {
TetsuyaKonno 2:af4db183ee76 1410 Xc = x;
TetsuyaKonno 2:af4db183ee76 1411 Yc = y;
TetsuyaKonno 2:af4db183ee76 1412 retJudgeIM_Max[1] = retJudgeIM;
TetsuyaKonno 2:af4db183ee76 1413 }
TetsuyaKonno 2:af4db183ee76 1414 }
TetsuyaKonno 2:af4db183ee76 1415 }
TetsuyaKonno 2:af4db183ee76 1416 }
TetsuyaKonno 2:af4db183ee76 1417
TetsuyaKonno 2:af4db183ee76 1418 // MarkDetect_process_R
TetsuyaKonno 2:af4db183ee76 1419 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1420 void MarkDetect_process_R( void )
TetsuyaKonno 2:af4db183ee76 1421 {
TetsuyaKonno 2:af4db183ee76 1422 int x, y;
TetsuyaKonno 2:af4db183ee76 1423
TetsuyaKonno 2:af4db183ee76 1424 retJudgeIM_Max[2] = 0;
TetsuyaKonno 2:af4db183ee76 1425 for( y = 0; y <= 13; y++ ) {
TetsuyaKonno 2:af4db183ee76 1426 for( x = 0; x <= 6; x++ ) {
TetsuyaKonno 2:af4db183ee76 1427 Image_part_Extraction( ImageBinary, 20, x, y, NowImageBinary, 14, 2 );
TetsuyaKonno 2:af4db183ee76 1428 retDevi = Standard_Deviation( NowImageBinary, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1429 retCovari = Covariance( TempDevi_Rightline, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1430 retJudgeIM = 0;
TetsuyaKonno 2:af4db183ee76 1431 retJudgeIM = Judgement_ImageMatching( retCovari, retDevi_Rightline, retDevi );
TetsuyaKonno 2:af4db183ee76 1432 if( 100 >= retJudgeIM && retJudgeIM > retJudgeIM_Max[2] ) {
TetsuyaKonno 2:af4db183ee76 1433 Xr = x;
TetsuyaKonno 2:af4db183ee76 1434 Yr = y;
TetsuyaKonno 2:af4db183ee76 1435 retJudgeIM_Max[2] = retJudgeIM;
TetsuyaKonno 2:af4db183ee76 1436 }
TetsuyaKonno 2:af4db183ee76 1437 }
TetsuyaKonno 2:af4db183ee76 1438 }
TetsuyaKonno 2:af4db183ee76 1439 }
TetsuyaKonno 2:af4db183ee76 1440
TetsuyaKonno 2:af4db183ee76 1441 // MarkDetect_process_L
TetsuyaKonno 2:af4db183ee76 1442 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1443 void MarkDetect_process_L( void )
TetsuyaKonno 2:af4db183ee76 1444 {
TetsuyaKonno 2:af4db183ee76 1445 int x, y;
TetsuyaKonno 2:af4db183ee76 1446
TetsuyaKonno 2:af4db183ee76 1447 retJudgeIM_Max[3] = 0;
TetsuyaKonno 2:af4db183ee76 1448 for( y = 0; y <= 13; y++ ) {
TetsuyaKonno 2:af4db183ee76 1449 for( x = 0; x <= 6; x++ ) {
TetsuyaKonno 2:af4db183ee76 1450 Image_part_Extraction( ImageBinary, 20, x, y, NowImageBinary, 14, 2 );
TetsuyaKonno 2:af4db183ee76 1451 retDevi = Standard_Deviation( NowImageBinary, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1452 retCovari = Covariance( TempDevi_Leftline, NowDevi, 28 );
TetsuyaKonno 2:af4db183ee76 1453 retJudgeIM = 0;
TetsuyaKonno 2:af4db183ee76 1454 retJudgeIM = Judgement_ImageMatching( retCovari, retDevi_Leftline, retDevi );
TetsuyaKonno 2:af4db183ee76 1455 if( 100 >= retJudgeIM && retJudgeIM > retJudgeIM_Max[3] ) {
TetsuyaKonno 2:af4db183ee76 1456 Xl = x;
TetsuyaKonno 2:af4db183ee76 1457 Yl = y;
TetsuyaKonno 2:af4db183ee76 1458 retJudgeIM_Max[3] = retJudgeIM;
TetsuyaKonno 2:af4db183ee76 1459 }
TetsuyaKonno 2:af4db183ee76 1460 }
TetsuyaKonno 2:af4db183ee76 1461 }
TetsuyaKonno 2:af4db183ee76 1462 }
TetsuyaKonno 2:af4db183ee76 1463
TetsuyaKonno 0:158dbfb66e62 1464 // MarkCheck Triangle detection
TetsuyaKonno 0:158dbfb66e62 1465 // Return values: 0: no triangle mark, 1: Triangle mark
TetsuyaKonno 0:158dbfb66e62 1466 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1467 int MarkCheck_Triangle( int percentage )
TetsuyaKonno 0:158dbfb66e62 1468 {
TetsuyaKonno 0:158dbfb66e62 1469 int ret;
TetsuyaKonno 0:158dbfb66e62 1470
TetsuyaKonno 0:158dbfb66e62 1471 ret = 0;
TetsuyaKonno 0:158dbfb66e62 1472 if( retJudgeIM_Max[0] >= percentage ) {
TetsuyaKonno 0:158dbfb66e62 1473 ret = 1;
TetsuyaKonno 0:158dbfb66e62 1474 }
TetsuyaKonno 0:158dbfb66e62 1475
TetsuyaKonno 0:158dbfb66e62 1476 return ret;
TetsuyaKonno 0:158dbfb66e62 1477 }
TetsuyaKonno 0:158dbfb66e62 1478
TetsuyaKonno 2:af4db183ee76 1479 // Cross line detection processing
TetsuyaKonno 2:af4db183ee76 1480 // Return values: 0: no cross line, 1: cross line
TetsuyaKonno 2:af4db183ee76 1481 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1482 int MarkCheck_Crossline( int percentage )
TetsuyaKonno 2:af4db183ee76 1483 {
TetsuyaKonno 2:af4db183ee76 1484 int ret;
TetsuyaKonno 2:af4db183ee76 1485
TetsuyaKonno 2:af4db183ee76 1486 ret = 0;
TetsuyaKonno 2:af4db183ee76 1487 if( retJudgeIM_Max[1] >= percentage ) {
TetsuyaKonno 2:af4db183ee76 1488 ret = 1;
TetsuyaKonno 2:af4db183ee76 1489 }
TetsuyaKonno 2:af4db183ee76 1490
TetsuyaKonno 2:af4db183ee76 1491 return ret;
TetsuyaKonno 2:af4db183ee76 1492 }
TetsuyaKonno 2:af4db183ee76 1493
TetsuyaKonno 2:af4db183ee76 1494 // Right half line detection processing
TetsuyaKonno 2:af4db183ee76 1495 // Return values: 0: not detected, 1: detected
TetsuyaKonno 2:af4db183ee76 1496 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1497 int MarkCheck_Rightline( int percentage )
TetsuyaKonno 2:af4db183ee76 1498 {
TetsuyaKonno 2:af4db183ee76 1499 int ret;
TetsuyaKonno 2:af4db183ee76 1500
TetsuyaKonno 2:af4db183ee76 1501 ret = 0;
TetsuyaKonno 2:af4db183ee76 1502 if( retJudgeIM_Max[2] >= percentage ) {
TetsuyaKonno 2:af4db183ee76 1503 ret = 1;
TetsuyaKonno 2:af4db183ee76 1504 }
TetsuyaKonno 2:af4db183ee76 1505
TetsuyaKonno 2:af4db183ee76 1506 return ret;
TetsuyaKonno 2:af4db183ee76 1507 }
TetsuyaKonno 2:af4db183ee76 1508
TetsuyaKonno 2:af4db183ee76 1509 // Left half line detection processing
TetsuyaKonno 2:af4db183ee76 1510 // Return values: 0: not detected, 1: detected
TetsuyaKonno 2:af4db183ee76 1511 //------------------------------------------------------------------//
TetsuyaKonno 2:af4db183ee76 1512 int MarkCheck_Leftline( int percentage )
TetsuyaKonno 2:af4db183ee76 1513 {
TetsuyaKonno 2:af4db183ee76 1514 int ret;
TetsuyaKonno 2:af4db183ee76 1515
TetsuyaKonno 2:af4db183ee76 1516 ret = 0;
TetsuyaKonno 2:af4db183ee76 1517 if( retJudgeIM_Max[3] >= percentage ) {
TetsuyaKonno 2:af4db183ee76 1518 ret = 1;
TetsuyaKonno 2:af4db183ee76 1519 }
TetsuyaKonno 2:af4db183ee76 1520
TetsuyaKonno 2:af4db183ee76 1521 return ret;
TetsuyaKonno 2:af4db183ee76 1522 }
TetsuyaKonno 2:af4db183ee76 1523
TetsuyaKonno 0:158dbfb66e62 1524 //******************************************************************//
TetsuyaKonno 0:158dbfb66e62 1525 // Debug functions
TetsuyaKonno 0:158dbfb66e62 1526 //*******************************************************************/
TetsuyaKonno 0:158dbfb66e62 1527 //Image Data Output( for the Excel )
TetsuyaKonno 0:158dbfb66e62 1528 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1529 void ImageData_Serial_Out( unsigned char *Data_Y, int Width )
TetsuyaKonno 0:158dbfb66e62 1530 {
TetsuyaKonno 0:158dbfb66e62 1531 int Xp, Yp, inc, Height;
TetsuyaKonno 0:158dbfb66e62 1532
TetsuyaKonno 0:158dbfb66e62 1533 Height = (Width / (double)4) * 3;
TetsuyaKonno 0:158dbfb66e62 1534 for( Yp = 0, inc = 0; Yp < Height; Yp++ ) {
TetsuyaKonno 0:158dbfb66e62 1535 for( Xp = 0; Xp < Width; Xp++, inc++ ) {
TetsuyaKonno 0:158dbfb66e62 1536 pc.printf( "%d,", Data_Y[ inc ] );
TetsuyaKonno 0:158dbfb66e62 1537 }
TetsuyaKonno 0:158dbfb66e62 1538 pc.printf("\n\r");
TetsuyaKonno 0:158dbfb66e62 1539 }
TetsuyaKonno 0:158dbfb66e62 1540 }
TetsuyaKonno 0:158dbfb66e62 1541
TetsuyaKonno 0:158dbfb66e62 1542 //Image Data Output2( for TeraTerm )
TetsuyaKonno 0:158dbfb66e62 1543 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1544 void ImageData_Serial_Out2( unsigned char *Data_Y, int Width )
TetsuyaKonno 0:158dbfb66e62 1545 {
TetsuyaKonno 0:158dbfb66e62 1546 int Xp, Yp, Height;
TetsuyaKonno 0:158dbfb66e62 1547
TetsuyaKonno 0:158dbfb66e62 1548 Height = (Width / (double)4) * 3;
TetsuyaKonno 0:158dbfb66e62 1549 for( Yp = 0; Yp < Height; Yp++ ) {
TetsuyaKonno 0:158dbfb66e62 1550 for( Xp = 0; Xp < Width; Xp++ ) {
TetsuyaKonno 0:158dbfb66e62 1551 pc.printf( "%d ", Data_Y[Xp + (Yp * Width)] );
TetsuyaKonno 0:158dbfb66e62 1552 }
TetsuyaKonno 0:158dbfb66e62 1553 pc.printf( "\n\r" );
TetsuyaKonno 0:158dbfb66e62 1554 }
TetsuyaKonno 0:158dbfb66e62 1555
TetsuyaKonno 0:158dbfb66e62 1556 //Add display
TetsuyaKonno 0:158dbfb66e62 1557 pc.printf( "\n\r" );
TetsuyaKonno 0:158dbfb66e62 1558 pc.printf( "sensor_inp = 0x%02x\n\r", digital_sensor() );
TetsuyaKonno 0:158dbfb66e62 1559 pc.printf( "T = %3d%% %01d X=%2d Y=%2d\n\r", retJudgeIM_Max[0], MarkCheck_Triangle( 90 ), Xt, Yt );
TetsuyaKonno 2:af4db183ee76 1560 pc.printf( "C = %3d%% %01d X=%2d Y=%2d\n\r", retJudgeIM_Max[1], MarkCheck_Crossline( 90 ), Xc, Yc );
TetsuyaKonno 2:af4db183ee76 1561 pc.printf( "R = %3d%% %01d X=%2d Y=%2d\n\r", retJudgeIM_Max[2], MarkCheck_Rightline( 90 ), Xr, Yr );
TetsuyaKonno 2:af4db183ee76 1562 pc.printf( "L = %3d%% %01d X=%2d Y=%2d\n\r", retJudgeIM_Max[3], MarkCheck_Leftline( 90 ), Xl, Yl );
TetsuyaKonno 0:158dbfb66e62 1563 pc.printf( "\n\r" );
TetsuyaKonno 2:af4db183ee76 1564 Height += 7;
TetsuyaKonno 0:158dbfb66e62 1565
TetsuyaKonno 0:158dbfb66e62 1566 pc.printf( "\033[%dA" , Height );
TetsuyaKonno 0:158dbfb66e62 1567 }
TetsuyaKonno 0:158dbfb66e62 1568
TetsuyaKonno 0:158dbfb66e62 1569 //------------------------------------------------------------------//
TetsuyaKonno 0:158dbfb66e62 1570 // End of file
TetsuyaKonno 0:158dbfb66e62 1571 //------------------------------------------------------------------//