자동차만들기#3-코딩하기43.9번째장난감:자율주행

복잡한 코딩 시간이다쉽게 가기 위해 복수의 함수로 동작을 구분하여 설명한다.

먼저 접속한 선을 참조해야 하기 때문에 접속된 내용을 다시 가져와 보면서 코드를 정리한다.

첫 번째로 해야 할 것은 연결된 핀을 정의하는 것이다.

위와 같이 핀접속에 관한 사항을 모두 정의하면 된다.서보 모터의 경우 좌우 움직임을 090도까지 회전하려고 하고 초기에는 45도로 고정해 정면을 보도록 한다.stop Motors는 모든 모터를 정지하라는 함수이다.모든 움직임은 별도의 함수를 통해 실현되므로, 우리가 모터의 움직임을 위해 만들어야 하는 함수는 다음과 같다.

voidforward()//직진하라voidbackward()//후진하라voidleft()//좌측으로 움직여라voidright()//우측으로 움직여라stopMotors()//멈춰라

좌우 장애물을 판단해 방향을 결정하기 위한 함수는 다음과 같다.floatcheck_distance()//좌우 어느쪽에 장애물이 멀리 있는지 판단하여 방향전환 voidchange Direction()//초음파센서 거리측정

이상을 하나씩 잘 조합해 나가는 법을 배워야 한다.

모터가 스톱하는 경우는 좌우 바퀴의 모든 전원이 LOW 상태일 것.그 코드는 이하와 같다.void stopMotors() {digitalWrite(INL1, LOW);digitalWrite(INL2, LOW);digitalWrite(INR1, LOW);digitalWrite(INR2, LOW);}

앞으로 갈 때는 모든 모터가 같은 방향으로 움직여야 한다.왜 1, 2의 HIGH, LOW가 반대냐 하면, 그렇게 모터에 들어간 전선의 방향이 정해져 있기 때문이다.아래 방향이 앞으로 가는 방향이라면 그 반대 방향으로 HIGH, LOW를 선택하면 모터가 뒤로 가는 방향이 된다. 이 값은 각각 설치된 모터에 따라 확인하고 정리하면 된다.

void forward() {digitalWrite(INL1, HIGH);digitalWrite(INL2, LOW);digitalWrite(INR1, LOW);digitalWrite(INR2, HIGH);}

그렇다면, 뒤로 가는 코드는 당연히, 이하와 같을 것이다.void backward() {digitalWrite(INL1, LOW);digitalWrite(INL2, HIGH);digitalWrite(INR1, HIGH);digitalWrite(INR2, LOW);}

왼쪽으로 가려면 오른쪽 바퀴는 앞으로 굴러가고 왼쪽 바퀴는 뒤로 구르면 쉽게 방향이 전환된다.void left() {digitalWrite(INL1, LOW);digitalWrite(INL2, HIGH);digitalWrite(INR1, LOW);digitalWrite(INR2, HIGH);}

오른쪽으로 가려면 왼쪽 바퀴는 앞으로 굴러가고 오른쪽 바퀴는 뒤로 구르면 쉽게 방향이 전환된다.void right() {Serial.println(“right…”);digitalWrite(INL1, HIGH);analogWrite(INL2, LOW);digitalWrite(INR1, HIGH);analogWrite(INR2, LOW); };analogW

다음으로 장애물에 대한 판단과 방향 전환을 어떻게 할 것인가를 코드로 해보자, 이 코드는 앞에 있는 장애물의 거리다. 예전에 만든 코드와는 조금 다르게 만들어 봤다.모든 정밀한 계산은 온도를 측정하지 않는 한 불가능하다.어쨌든 거리를 측정하고 그 cm값을 return한다.

float check_distance() {digital Write(tPin, LOW); delay Microseconds(10); digital Write(tPin, HIGH); delay Microseconds(10); digital Write(tPin, LOW);flay HIGH);flay Hist, doulat)

지금까지는 하드웨어를 구동하는 기본 코드를 한 것으로, 앞으로는 제작자의 기량과 기획에 따라 마음껏 바꿔도 될 가장 중요한 코드이다. 독자가 원하는 형태로 수정하고 싶으면 여기를 수정하면 된다.여기는 좀 더 자세히 설명하려고 해.

void change Direction() {

intl Dist;//왼쪽 장애물의 거리 intr Dist;//오른쪽 장애물의 거리 day(300);

Srv.write(90);//초음파센서의 방향을 왼쪽으로 돌린다.day(300);//잠시 여유를 두어야 함. 이 부분을 넣지 않아서 문제가 많았다.// 만약 좌우 거리 값이 틀렸다면, 조금 더 day 값을 늘려 보아라. lDist= check_distance();// 좌측 장애물 거리 측정 day(600);

Srv.write(0);//초음파센서의 방향을 오른쪽으로 돌린다.day(300);//잠시 여유를 두어야 함. 이 부분을 넣지 않아서 문제가 많았다. rDist=check_distance();//오른쪽 장애물 거리측정 day(600);

Srv.write(45);//다시 정면을 본다.if(lDist<rDist) {//좌측에 장애물이 가까우면 right();//우측에 방향전환 day(300);//우측의 회전량을 이 값으로 조절 stop Motors();//멈춤}else {//우측 장애물이 가까우면 left();//좌측으로 방향전환 day(300);//좌측회전량을 이 값으로 조절 stop Motors ();//좌측에서 멈춤)

모든 코드 해석을 한 줄씩 첨부했으니 잘 확인하고 이해해 달라.이제 이 모든 코드를 실행하는 loop 함수를 확인해 보자.

프로그램이 시작되면 주행 중 정면 20cm 앞에 장애물이 있을 경우 change Direction 함수를 불러 왼쪽 또는 오른쪽으로 장애물을 피하도록 명령이 정리되어 있다.3개로 나뉜 자율주행 자동차 만들기가 끝났다.

좀 복잡한 내용이었을지 모르지만 이들 코드가 모든 아두이노 장난감 자동차를 전후좌우로 움직이는 코드의 근간이다. 이 코드를 이용해 향후 블루투스나 무선으로 조종하는 자동차를 만들게 되니, 잘 이해해 주시기 바란다.다시 한 번 자동차의 움직임을 보면서 마무리하자.

error: Content is protected !!