학교 공학교육혁신센터에서 개최하는 2021 라인트레이서 경진대회에 참가했다.
- 일시: 2021.05.20(목)
추가 모집 때 동기와 같이 신청했는데, 다른 과 학생들이 신청을 많이해서 같은 팀으로 배정하기는 힘들 거라고 하셨다. 다행히 참가팀 선정 결과를 보니 동기와 같은 팀이 되었다. 우리팀은 컴퓨터공학과 2학년 2명과 정보통신공학과 1학년 1명으로, 내가 팀장을 맡았다. 팀명은 '다다다!'로 정했다. 이유? 팀원 이름에 '다'가 많이 들어가서(일단 나 포함)
🚧 키트 수령
eduino의 라인트레이서 키트와 센서 등을 받았다.
고등학생 때 동아리에서 물품 신청할 시기 되면 eduino 사이트에서 구매했던 기억이. ㅋㅋ
💣 시행 착오
기본적인 키트 조립은 집에서 한 후, 날짜를 정해 학교에서 팀원들을 만났다. 사실 하루 통으로 만나면 끝날줄 알았는데 내가 너무 아무것도 모르면서 얕잡아봤나보다... 나는 회로에 대해 잘 알지 못했고 강의는 너무 복잡해서 뭘 어디에 연결해야 할지 모르겠고;; 우리는 결국 강의를 맡아주신 교수님께 여쭤보기로 했다. 대면 강의 때 질문을 드렸는데 교수님은 츤데레 스타일이셨다.ㅋㅋ 이해하기 쉽게 그림으로 그려주시고 나같은 학생들이 있었는지 다시 깔끔하게 그려서 lms에 업로드해주셨다. 감사해요.ㅠ
그치만 문제는 여기서 끝나지 않았다... 이거 때문에 라인트레이서 포기하고 싶을 정도였다. 무엇이 문제였냐면 센서 고장!! 이거 때문에 미치는줄 알았다. 처음에는 5개의 적외선 센서를 사용하려고 했는데 2개가 고장이 났다. 여러 센서들 중 테스트해서 잘 작동하는 센서들만 골라낸 거였는데... 테스트할 때는 멀쩡해서 이미 기판에 납땜까지 했는데 고장난 것이다... 실습실에는 납땜기만 있었고 납땜 흡입기 따위는... 존재하지 않았다. 그래서 납땜기로 납을 녹여가며 겨우 빼냈지만 납이 깔끔하게 제거되지 않아 고생했다. 센서도 더 없어서 다른 팀이랑 교환하고 겨우 교체했다.
그렇게 성공적인듯 했으나... 센서는 계속 오락가락했고, 내 정신도 같이 오락가락했다.
여담으로 납땜은 중학교 기술시간에 수행평가로 했었는데 그 이후로 처음 해봤다. ㅋㅋ 중학생 때는 납땜하면서 좀 잘하는 거 같다고 생각했었는데...ㅎㅎ 오랜만에 하니 모양이 예쁘게 되지는 않았다. 그래도 재미는 있더라. 그치만 납땜기로 이미 납땜한 센서를 빼는 것은 재미있지 않았다.
💻 소스코드
int sensor1 = 9;
int sensor2 = A0;
int sensor3 = A2;
int sensor4 = A4;
int sensor5 = 10;
AF_DCMotor motor_1(1);
AF_DCMotor motor_2(4);
void setup()
{
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(sensor4, INPUT);
pinMode(sensor5, INPUT);
motor_1.setSpeed(200);
motor_1.run(RELEASE);
motor_2.setSpeed(200);
motor_2.run(RELEASE);
}
void forward() {
motor_1.run(FORWARD);
motor_2.run(FORWARD);
motor_1.setSpeed(180);
motor_2.setSpeed(180);
}
void right() {
motor_1.run(FORWARD);
motor_2.run(RELEASE);
motor_1.setSpeed(180);
}
void left() {
motor_1.run(RELEASE);
motor_2.run(FORWARD);
motor_1.setSpeed(180);
}
void _stop() {
motor_1.run(RELEASE);
motor_2.run(RELEASE);
}
void loop()
{
// 검정색0, 흰색1
if (digitalRead(sensor1) == 1 && digitalRead(sensor2) == 1 && digitalRead(sensor4) == 1 && digitalRead(sensor5) == 1) {
forward(); // 직진
}
else if (digitalRead(sensor4) == 0 || digitalRead(sensor5) == 0) {
right(); // 우회전
}
else if (digitalRead(sensor1) == 0 || digitalRead(sensor2) == 0) {
left(); // 좌회전
}
else if (digitalRead(seonsor1) == 1 && digitalRead(seonsor2) == 1 && digitalRead(seonsor3) == 1 && digitalRead(seonsor4) == 1 && digitalRead(seonsor5) == 1) {
_stop(); // 정지
}
}
기본으로 작성한 코드이다.
어... 하지만.... 센서 고장과 여러 문제가 생기면서 여기서 좀 더 수정했다. 속도도 계속 수정하고 번호도 바꿨었다.
속도는 setSpeed만 변경해서 사용하면 된다.
🚗 완성
대회 전 마지막으로 연습했을 때이다. 이 때까지는, 아니, 대회 당일 오전까지만 해도 잘 돌아갔다...
센서가 하도 고장나서 저때는 멀쩡했는지 이상했는지도 모르겠다. 위에서 센서를 교체했다고 언급했지만 또 고장이 났기 때문이다.
아두이노를 노트북에 연결했을 때는 잘 작동되는데 빼면 작동이 되지 않거나 힘이 매우 약했다. 어느 정도냐면 쟤를 손으로 들고 있으면 바퀴가 돌아가고 있는데 바닥에 내려놓으면 안돌아갔다. 바퀴의 마찰력이 더 강한 것이다. 아 ㅋㅋ 유먼가? 처음엔 전력 부족 문젠지 모르고 분명 돼야되는데 왜 안되지ㅠㅠ 이러고 있었다. 다행히 조교님😇의 도움으로 해결했다.ㅠㅠ
🚥 대회 당일
다다다! 💙
🏁 경기장
라인이 더 두꺼울줄 알았는데 예시로 보여줬던 도안과 같아서 조금 당황스러웠다.
🚩 다음에 참가한다면?
1. 기판을 사용하지 않을 것이다.
센서 고장만이 아니라 사용했던 기판에도 문제가 있었던 것 같다. 그리고 기판을 이용해서 일자로 고정해놓는 것보다 그냥 직접 연결하고 잘 인식할 수 있는 위치에 사선으로 고정하는 것이 더 좋은 것 같다.
2. 더 깊이있게 코드를 짤 것이다.
1차원적으로만 생각하고 코드를 짠 것 같다. 작년 대회 얘기를 들어보니 라인을 오버하면 조금 뒤로 돌아갔다가 다시 라인을 찾아가는 경우도 있고(하지만 이 경우에는 뒤로 갔다가 앞으로 갔다가만 반복하는 문제가 생길 수도 있다고 한다.) 다양한 방법들을 시도하신 분들이 계셨다.
🤍 마무리
우리팀은 장려상을 받았다. 열심히는 했지만 대회가 시작하고 갑자기 전처럼 작동하지 않아 많이 당황스럽고 속상했는데 운이 좋게 수상을 해서 민망했당..ㅎㅎ;