2010년 3월 29일 월요일

[Line Tracer] 지능형 모형차 경진대회 2008 - 센서 인터럽트

2008년도 지능형 모형차 경진대회에 참가했던 소스를 공개합니다...

엔코더가 고장나는 바람에 예선주행을 잘 달렸음에도 불구하고... 본선에서 좌절을 맛보았지만...

라인트레이서를 처음 접하시는 분이라면 큰 도움이 될 것 같네요.

원하시는 분이 계시다면 하드웨어 관련 자료도 포스팅 하도록 하겠습니다 ^^

참 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
}

* 주석이 많아서 쉽게 이해하실 수 있을꺼라 생각하지만... 어디까지나 주관적인 생각이므로
  궁금한게 있으시다면 답글이나 메일 남겨주세요^^

댓글 없음:

댓글 쓰기