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

경기 꿈의 대학 네째주 II: 아두이노 RC카 제작

coding art 2019. 5. 13. 12:27
728x90

 

RC카 차체를 양면 테이프만 사용하여 조립하도록 하자. 앞바퀴에 해당하는 스틸 볼(스틸 캐스터)의 플라스틱이 바닥면과 닫지 않도록 높이를 맞춰주어야 한다.

작은 빵판이나 3D 출력한 조각을 사용하면된다.

 

 다음 사진은 RC카의 상면도이다. 건전지 폭을 포함하여 적절하게 부품을 배치하도록 하자. 아두이노 우노 보드 위에 Adafruit 모터 쉴드를 끼운 상태라 아두이노 보드가 보이지 않는 상태다. 블루투스 통신을 위한 HC-06 보드도 그림과 같이 배치하여 양면 테리프 작업에 의해 고정한다.

 

 

Adafruit 사의 모터쉴드를 구매 후 사용자가 4곳에서 납땜을 해야 한다. RC카의 스마트폰 무선 조종이 가능하게끔 HC-06 블루투스 보드를 설치해야 한다. HC-065V, GND, TX, RX 핀을 가지고 있다. 아두이노와 연결시 서로 반대로 TX -> RX. RX -> TX 연결하자.

 

블루투스 RC카를 위한 블루투스 배선은 마지막 단계에 하도록 하자.

따라서 HC-06RX,TX 배선 연결은 반드시 제거해 두고 마지막 업로딩 시 연결하도록 한다.

 

우선 좌우 DC모터를 모터쉴드에 아래 그림처럼 배선하도록 한다. 오른쪽 모터가 모터쉴드의 M3에 연결되고 왼쪽 모터가 모터쉴드의 M4에 연결된다.

 

 

프로그램 주행을 위한 코드를 업로드 한 후 9V 건전지 직류 전원 잭을 연결하여 바퀴의 회전 방향을 관찰하자. 프로그램 주행 코드는 전진 후진 좌회전 우회전 순으로 코딩이 되어 있다. 만약 좌우 바퀴의 회전 방향이 맞지 않으면 M3 M4에 연결된 배선을 바꿔주면 된다.

 

코드 작업 시작전에 모터 제어를 위한 라이브러리를 다운받아 설치하고 메뉴 스케치의 라이브러리 포함하기에서 Adafruit-Shield-ibrary-master 의 경로를 등록해두자. 

Adafruit-Motor-Shield-library-master.zip
0.01MB

 

 

최대 속도 조절

mspd 값을 160255 사이에서 설정하자. USB 테스트 시에는 5V 의 전원을 공급하여 바퀴를 돌리지만 9V 건전지를 사용할 때에는 전원이 변동되고 더 많은 전류를 흘려주므로 160에서 USB전원으로 간신히 바퀴가 돌 정도면 9V 건전지 파워에 의해서는 그 보다 강한 파워로 주행하게 된다. 가급적이면 건전지를 정약할 수 있도록 작은 값 160 정도를 주도록 하자.

만약의 경우 잉~잉~ 거리는 소리만 날수도 있는데 이는 USB 파워가 약할 경우이다.

 

 전진 서브루틴은 각 모터별 최대속도 지정과 함께 FORWARD 파라메터 값이 입력된다.

후진 서브루틴은 각 모터별 최대속도 지정과 함께 BACKWARD 파라메터 값이 입력된다.

그밖에도 STOP, LEFT, RIGHT 루틴이 필요하다. 특히 STOP에서는 파라메터 값 REKEASE가 사용되며 이때에는 최대속도 값 0과 함께 모터가 전기적으로 꺼진다.

 

메인 프로그램인 loop()에서 순차적으로 전진, 후진, 좌회전, 우회전을 호출한다. 전진 후진은 1000 으로 좌우회전은 500 으로 하여 지연효과를 관찰해 보자.

//FOF4YFTIA0WX947_F

 

//This program is used to control a robot car
#include <AFMotor.h>

//creates two objects to control the terminal 3 and 4 of motor shield
AF_DCMotor motor1(3); // 3번은 모터쉴드에서 확인 가능
AF_DCMotor motor2(4); // 4번은 모터쉴드에서 확인 가능
int mspd = 180 ; //전지소모를 줄이도록 255가 아닌 160 
 
void setup() {      
  Serial.begin(9600); 
}

void loop(){
      forward();
      delay(1000);
      back();
      delay(1000);
      left();        
      delay(1000);   # 500 으로 변경하여 조종 효과를 관찰하자.
      right();
      delay(1000);   # 500 으로 변경하여 조종 효과를 관찰하자.
}

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
}