엔코더가 고장나는 바람에 예선주행을 잘 달렸음에도 불구하고... 본선에서 좌절을 맛보았지만...
라인트레이서를 처음 접하시는 분이라면 큰 도움이 될 것 같네요.
원하시는 분이 계시다면 하드웨어 관련 자료도 포스팅 하도록 하겠습니다 ^^
참 MCU는 MC9S12DP256B입니다.
댓글 많이 달아주세요~
소스코드1차 - 센서 인터럽트 부분
void Sensor_OnEnd(void)
{
byte i;
byte key_down=0;
int tmp_SensorMin;
signed int ErrLine;
// Sensor and Servo
(void)Sensor_GetValue8(SensorVal); // 현재 센서값 읽기
Light_Sensor_PutVal(0); // 발광 센서 끄기
(void)Sensor_Stop(); // ADC Stop
for(i = 6 ; i > -1 ; i--)
SensorRatio[i] = ( (SensorVal[i] - SensorMin[i]) * 100 / (SensorMax[i] - SensorMin[i]) ); //센서별 변화량 구하기
// 가장 작은 센서값 & 센서 찾기
tmp_SensorMin = SensorRatio[3];
tmp_SensorMin_Pin_Prev = tmp_SensorMin_Pin; // 이전 라인값 기억
for(i = 6 ; i > -1 ; i--)
{
if(SensorRatio[6 - i] > 100) // 변화률이 100이상이면 100으로 함
SensorRatio[6 - i] = 100;
else if(SensorRatio[6 - i] < 0) // 변화률이 0이하이면 0으로 함
SensorRatio[6 - i] = 0;
if(SensorRatio[6 - i] <= tmp_SensorMin) // 가장 작은 SensorRatio찾기
{
tmp_SensorMin_Pin = 6 - i;
tmp_SensorMin = SensorRatio[6 - i];
}
}
// 라인을 찾은 센서가 갑자기 변하는 경우 보정
ErrLine = tmp_SensorMin_Pin_Prev - tmp_SensorMin_Pin;
if(ErrLine > 3 || ErrLine < -3) //이전 라인값과 4이상 차이나면 오류로 판단
tmp_SensorMin_Pin = tmp_SensorMin_Pin_Prev;
if(tmp_SensorMin_Pin == 0 || tmp_SensorMin_Pin == 1)
cnt_Left++;
else if(tmp_SensorMin_Pin == 5 || tmp_SensorMin_Pin == 6)
cnt_Right++;
else
{
cnt_Left = 0;
cnt_Right = 0;
}
key_down = Sensor_InitSW_GetVal();
Direct(200,1);
// 라인별 제어?
switch(tmp_SensorMin_Pin)
{
case 0 :
case 6 :
Position = (3 - tmp_SensorMin_Pin) * 100; // 300 200 100 0 -100 -200 -300
Direct(Position, tmp_SensorMin_Pin);
break;
case 1 :
case 5 :
Position = (3 - tmp_SensorMin_Pin) * 120; // 300 240 100 0 -100 -240 -300
Position += ( (SensorRatio[tmp_SensorMin_Pin + 1] - SensorRatio[tmp_SensorMin_Pin - 1]) * 13 / 10 ); //13/10의 가중치
Direct(Position, tmp_SensorMin_Pin);
break;
case 2 :
case 3 :
case 4 :
Position = (3 - tmp_SensorMin_Pin) * 100; // 300 200 100 0 -100 -200 -300
Position += ( (SensorRatio[tmp_SensorMin_Pin + 1] - SensorRatio[tmp_SensorMin_Pin - 1]) * 128 / 100); //128/100의 가중치
Direct(Position, tmp_SensorMin_Pin);
break;
default :
break;
}
LineView_PutVal(0xAA); //8421 8421
time_ms++; //ms단위 시간 증가
// Debug_Pin_PutVal(0); // use to debug
}
* 주석이 많아서 쉽게 이해하실 수 있을꺼라 생각하지만... 어디까지나 주관적인 생각이므로
궁금한게 있으시다면 답글이나 메일 남겨주세요^^
댓글 없음:
댓글 쓰기