<p>아두이노 제작해 보는 RC카를 단계 별로 살펴보면 처음에 간단한 셀프 주행일 것이다. 즉 전진 후진 좌회전 우회전 기능을 부여하면 좁은 공간 안에서 단조롭게 셀프 주행이 가능해진다. 이어서 HC-06 블루투스 보드를 추가하게 되면 블루투스에 의한 무선 조종이 가능해진다. 물론 스마트 폰 앱을 앱인벤터로 코드를 작성하여 사용하게 된다. 이러한 내용의 아두이노 RC카 제작 사례를 여러 차례 블로그에 게재했었다. 본 블로그 하단의 검색 창에서 RC카 또는 꿈의 대학으로 검색해 보면 그 과정을 쉽게 찾아 볼 수 있을 것이다.</p> <p><img src="https://cdn.steemitimages.com/DQmWZpcHpto5UFj4Xa7y6DFSm5ZDoz7YtsAmJYvhfxHv3L5/noname01.png" alt="noname01.png"></p> <p>한편 인공지능 즉 AI를 사용하지 않으면서도 간단한 알고리듬 적용에 의하여 앞에서 나타나는 장애물을 피해갈 수 있는 RC카를 제작해 보고자 한다. 장애물과의 충돌을 피할 수 있는 능력은 박쥐 사례에서 흔히 찾아 볼 수 있으므로 유사하게 초음파 센서를 사용해서 전 근접된 거리에 장애물이 있으면 일단 속도를 낮춰 멈춘 후 어느 정도 후진 후 우회전이든 좌회전하여 전진 주행 시키도록 하는 것이다.</p> <p>위 그림에서 보듯이 한쪽 방향으로 방향을 변경하여 진행 후에는 장애물을 우회는 하지만 통과하는 것이 아니므로 우회전 후에 측정한 거리 값과 우회전 이전에 측정한 장애물과의 거리 값과 차이를 계산하여 + 이면 장애물을 통과 한 상태이므로 약하게 좌회전 시켜 전진 시켜야 할 것이다.</p> <p>다음의 동영상에서 알고리듬이 작동하는지 관찰해 보자.<br> <a href="https://youtu.be/E1k1OabTZ4Y">https://youtu.be/E1k1OabTZ4Y</a></p> <p>//RCCAR_ULTRASONIC_02<br> #include <AFMotor.h><br> #define ECHO 2<br> #define TRIG 13</p> <p>AF_DCMotor motor1(3);<br> AF_DCMotor motor2(4);<br> int mspd = 160;<br> char command;<br> int cmp;</p> <p>void setup() {<br> cmp = 50;<br> Serial.begin(9600);<br> pinMode(TRIG,OUTPUT);<br> pinMode(ECHO,INPUT);<br> Stop();<br> delay(1000);<br> forward();<br> delay(500);<br> }</p> <p>void loop() {<br> digitalWrite(TRIG,HIGH); //send Pulse<br> delayMicroseconds(10);<br> digitalWrite(TRIG,LOW);<br> int us = pulseIn(ECHO,HIGH); //get return time<br> int cm = us/58;<br> Serial.print("cm : ");<br> Serial.println(cm);</p> <p>if( cm < 30 ) {<br> Stop();<br> delay(500);<br> back();<br> delay(1000);<br> right();<br> delay(500);<br> forward();<br> delay(1000);<br> }<br> if( (cm-cmp) > 0 ) {<br> left();<br> delay(400);<br> forward();<br> delay(1000);<br> }<br> cmp = cm;<br> }</p> <p>void forward() {<br> motor1.setSpeed(mspd); //Define maximum velocity<br> motor1.run(FORWARD); //rotate the motor clockwise<br> motor2.setSpeed(mspd); //Define maximum velocity<br> motor2.run(FORWARD); //rotate the motor clockwise<br> }</p> <p>void back() {<br> motor1.setSpeed(mspd);<br> motor1.run(BACKWARD); //rotate the motor counterclockwise<br> motor2.setSpeed(mspd);<br> motor2.run(BACKWARD); //rotate the motor counterclockwise<br> }</p> <p>void left() {<br> motor1.setSpeed(mspd); //Define maximum velocity<br> motor1.run(FORWARD); //rotate the motor clockwise<br> motor2.setSpeed(0);<br> motor2.run(RELEASE); //turn motor2 off<br> }</p> <p>void right() {<br> motor1.setSpeed(0);<br> motor1.run(RELEASE); //turn motor1 off<br> motor2.setSpeed(mspd); //Define maximum velocity<br> motor2.run(FORWARD); //rotate the motor clockwise<br> }</p> <p>void Stop() {<br> motor1.setSpeed(0);<br> motor1.run(RELEASE); //turn motor1 off<br> motor2.setSpeed(0);<br> motor2.run(RELEASE); //turn motor2 off<br> }</p> <p>//끝</p> <p>![마나마인로고.png]<br> <a href="https://cdn.steemitimages.com/DQmeePhYx37SUt2zaQJZjJZenWLWSyeK2zKiEp2erB77Lhb/%EB%A7%88%EB%82%98%EB%A7%88%EC%9D%B8%EB%A1%9C%EA%B3%A0.png">https://cdn.steemitimages.com/DQmeePhYx37SUt2zaQJZjJZenWLWSyeK2zKiEp2erB77Lhb/%EB%A7%88%EB%82%98%EB%A7%88%EC%9D%B8%EB%A1%9C%EA%B3%A0.png</a></p>