아두이노프로세싱 프로그래밍

경기 꿈의 대학 다섯째주: 아두이노 RC카Roll Out:시리얼 모니터 입력에 의한 RC카 주행

coding art 2019. 5. 20. 14:14
728x90


Rollout 이란 시제작한 비행기나 차를 처음 공식적으로 운전하는 행사를 뜻한다. RC카에서 USB케이블을 제거하고 9V 건전지를 어댑터에 연결하여 바닥에서 주행시켜보자.

 

프로그램 주행이 가능한 RC카를 제작 완료한 다음 단계에서는 RC카를 USB 케이블로 연결한 상태에서 즉 PC에서 5V 전원을 공급 받으면서 시리얼 모니터에서 입력된 명령을 사용하여 RC카를 손에 든 상태에서 주행시켜 보자.

 

AFMotor.h 라이브러리 호출과 class 명령 AF_DCMotor 사용은 변동이 없다. 최대 속도는 160 이 적당하다. 하지만 USB 연결 전원 상태에서 전진을 위한 회전이 약하거나 윙하는 소음이 나면서 원활하지 않을 수 도 있음에 주의하자. 하지만 9V 건전지 어댑터 전원 모드에서는 제대로 잘 회전한다. 이 단계는 해보면 쉽게 알 수 있다.

 

아울러 시리얼 모니터에서 주행 명령을 입력하려면 주행 명령 ‘F’(전진), ‘B’(후진), ‘L’(좌회전), ‘R’(우회전), ‘S’(멈춤)5종류의 문자 입력이 필요하므로 character 타입을 선언한다.



‘F’(전진), ‘B’(후진), ‘L’(좌회전), ‘R’(우회전), ‘S’(멈춤) 루틴들은 아래와 같이 서브루틴으로 포함되어야 한다. 프로그램 주행을 위해서는 loop()에서 이들을 호출함과 아울러 적절한 delay를 줄 필요가 있다.



외부 입력에 의한 RC카 주행을 위해서 시리얼 모니터에서 키보드 문자가 입력되면 아두이노 시리얼 버퍼에서 Seral.available() 0인지 0보다 큰지를 확인을 통해 이를 감지해야 한다.




아울러 Serial.read()에 의해 문자를 읽어서 if 문에서 판독하여 해당하는 주행 명령 서브루틴을 호출한다. RC카와 USB 케이블이 연결된 상태에서 확인 작업이 가능하다.

 

키 보드 입력에 의해 RC카 조종이 가능해 지면 이 방법을 연장하여 블루투스 보드 HC-06에 의한 무선 조종이 가능해지게 된다.


스마트폰에 의한 RC카 블루투스 무선 조종을 위해서는 RC카 아두이노 시리얼 모니터에서 입력하던 내용을 스마트폰에서 앱을 사용하여 대신하면 된다. 앱을 준비하려면 별도로 앱인벤터를 배워 코딩을 해야 하나 아두이노 코딩을 하는 수준에서 앱인벤터를 함께 코딩하기 어려우므로 Play Sore에서 RC카 조종 앱을 다운받아 사용하면 된다.

 

다음의 RC카 조종 앱은 Play Sore에서 EvArt 로 검색하면 3번째에 위치하고 있다.

블루투스 보드 HC-06 배선 및 업로딩 및 Pairing 과정은 다음 주에 할 계획이다.

 

아래 코드는 블루투스용이지만 HC-06 배선 없이 USB 케이블 연결 상태에서 키 보드 입력 시험이 가능하다.


//FOF4YFTIA0WX947_F_BT_01

#include <AFMotor.h>
AF_DCMotor motor1(3);
AF_DCMotor motor2(4);
int mspd = 120;
char command;

void setup() {      
  Serial.begin(9600); 
  Stop();
}

void loop(){
 
 if(Serial.available() > 0){
    command = Serial.read();
   
     if( command == 'F') {
      forward();
      delay(1000);
     }

     if( command == 'B') {
      back();
      delay(1000);
     }

     if( command == 'L') {
      left();
      delay(1000);
     }

     if( command == 'R') {
      right();
      delay(1000);
     }

     if( command == 'S') {
      Stop();
      delay(1000);
     }
 }
}

void forward()  {
  motor1.setSpeed(mspd); //Define maximum velocity
  motor1.run(FORWARD); //rotate the motor clockwise
  motor2.setSpeed(mspd); //Define maximum velocity
  motor2.run(FORWARD); //rotate the motor clockwise
}

void back()  {
  motor1.setSpeed(mspd);
  motor1.run(BACKWARD); //rotate the motor counterclockwise
  motor2.setSpeed(mspd);
  motor2.run(BACKWARD); //rotate the motor counterclockwise
}

void left()  {
  motor1.setSpeed(mspd); //Define maximum velocity
  motor1.run(FORWARD); //rotate the motor clockwise
  motor2.setSpeed(0);
  motor2.run(RELEASE); //turn motor2 off
}

void right()  {
  motor1.setSpeed(0);
  motor1.run(RELEASE); //turn motor1 off
  motor2.setSpeed(mspd); //Define maximum velocity
  motor2.run(FORWARD); //rotate the motor clockwise
}

void Stop()  {
  motor1.setSpeed(0);
  motor1.run(RELEASE); //turn motor1 off
  motor2.setSpeed(0);
  motor2.run(RELEASE); //turn motor2 off
}

//끝