얼마전 구입한 Aduino Bluetooth Smart Car Kit 를 조립, 기동시키다.

아두이노 위에 L298P 모터 드라이버 쉴드를 끼워넣었고 HC-06 블루투스 모듈을 모터 쉴드에 끼웠다. 9V 배터리에서 나온 전원은 모터 쉴드 2개짜리 연결 포트로 연결(검은 선은 GND), 좌/우 모터의 전선은 4개짜리 연결 포트에 우 - + 좌 - + 순으로 연결.

자동차는 안드로이드의 BlueTooth Serial Controller 앱으로 무선 조종이 가능하다.
조종은 전/후진, 좌/우회전, 정지가 가능.

판매업체의 조립 가이드 내용 보고 아두이노 RC-Car Kit 조립 완료.

https://github.com/ntrexeng/smart_car 에서 프로그램(bluetooth_rc_car.ino) 다운받아 Aduino 1.0.6으로 도구-시리얼 포트에서 연결된 포트 선택한 뒤(지금은 COM6) 아두이노에 올리기 완료(올리기전에 블루투스 모듈은 빼고 올려야 한단다).

갤노트4로 Google Play Store에서 BlueTooth Serial Controller 앱 설치.
앱 실행하고 Preference로 들어가 Visibility로 버튼 보이고 안보이는 것 설정, Name으로 버튼의 이름 정하기, Command에서 각 버튼 눌렀을시 명령 입력(wasd로 이동, x로 정지) 설정. 설정을 마치고 첫 화면으로 이동, 아두이노 RC-Car에 블루투스가 꽂혀있는지, 전원을 넣었는지 확인한 뒤 Connect를 눌러 HC-06 선택하여 연결.
이후엔 버튼으로 아두이노 RC-Car의 조절이 가능하다고 한다.

아두이노 카에 9V 네모 건전지를 끼워넣고(건전지를 넣고나니 건전지 박스 뚜껑이 닫히지 않는다) 전원 스위치를 올린 뒤 갤노트4의 BlueTooth Serial Controller 앱에서 Connect 버튼을 클릭했는데 블루투스 수신을 하지못해 연결이 안된다.
라즈베리 파이3 라즈비안의 블루투스로는 HC06으로 잡히는 걸 보면 앱 혹은 갤노트4의 문제인듯 보인다.
갤노트4 자체로는 블루투스 스피커를 잘 잡아내고 작동한다. HC06의 경우 비밀번호 입력 화면이 뜨고 0000 또는 1234를 입력하라 하여 0000을 입력했으나 연결에 실패한다. 1234를 넣으니 등록에 성공했다.

이후엔 제대로 작동하기 시작했다. 다만 좌우바퀴 연결과 아두이노 프로그래밍 설정과 맞지 않았는지 좌우회전이 전후이동, 전후이동이 좌우회전으로 매핑된 결과가 되었지만 그건 앱에서 간단히 재조정이 가능했다. w > d, s > a, a > w, d > s 로 설정해주니 써진대로 작동한다. 다만 한쪽 바퀴의 회전속도가 좀 더 빠른듯 하여 제대로 직진이 되진 않는다. 어쨋건 아두이노 RC-Car Kit의 조립, 프로그램 인식, 안드로이드 앱으로 원격조종까지 모두 성공했다.

한데 위 설명서들을 보다보면 조립은 사진들이 너무 작아 알아보기 힘들고 코딩, 조작관련 설명은 미묘하게 틀리게 입력된 것들이 꽤 되는 편.

그나저나 과연 아두이노. 모터 조종 코드도, 블루투스 적용도 정말 간단하다. 복잡한 물리적 회로 연결 과정도 모터쉴드가 대신 처리해 간단. 이렇게 심플한 과정으로 원격 조종되는 자동차를 만들 수 있다는 사실이 놀랍다.

17/10/22 일

================================================================
2017/10/23 월 추가
다운받은 bluetooth_rc_car.ino를 살짝 수정하여 AduinoBluetoothCarCtrl.ino로 만들다.
변수, 함수 이름을 내 식으로 바꾸고 좌/우 모터의 정방향/역방향이 각각 다르게 세팅되어 있던걸 똑같이 정방향은 1, 역방향은 0으로 변경, 좌/우 회전시 속도를 전/후진시 속도의 반으로 변경했다.
BlueTooth Serial Controller 앱에서는 전진/후진/좌/우를 w/s/a/d로 설정하면 된다.
잘 기동된다. 다만 오른쪽 바퀴와 모터의 연결이 좀 잘못된 것인지 전진시 우측으로 약간 굽는 문제는 여전.

Converter8 안드로이드에 BlueTooth Serial Controller 앱을 설치하고 설정한 뒤 갤노트4로 자동차 조종 영상을 촬영하다.

AduinoBluetoothCarCtrl.ino===================================

//프로그램을 업로드할 때는 블루투스 칩을 뺀 뒤 하고
//업로드가 완료된 뒤 블루투스 칩을 다시 꽂아야 한다.

#define MOTOR_A_SPD 10  //모터A의 속력을 결정하는 핀
#define MOTOR_B_SPD 11  //모터B의 속력을 결정하는 핀
#define MOTOR_A_DIR 12  //모터A의 방향을 결정하는 핀
#define MOTOR_B_DIR 13  //모터B의 방향을 결정하는 핀
#define A_BAL 1   //모터A 속력 균형 계수 기본값 1
#define B_BAL 1   //모터B 속력 균형 계수 기본값 1

unsigned char mAspd = 0, mBspd = 0; //모터의 속력을 결정하는 전역변수
boolean mAdir = 0, mBdir = 0; //모터의 방향을 결정하는 전역변수

void setup(){
  Serial.begin(9600); //시리얼 통신 초기화

  pinMode(MOTOR_A_DIR, OUTPUT); //모터A 방향 핀 출력으로 설정
  pinMode(MOTOR_B_DIR, OUTPUT); //모터B 방향 핀 출력으로 설정

  Serial.println("terminal access ok"); //터미널 작동 확인용 문자열
}

void loop(){
  unsigned char buttonCmd = 0; //명령어 저장용 문자형 변수

  if (Serial.available()){ //데이터가 입력되었을 때
    buttonCmd = Serial.read(); //변수에 입력된 데이터 저장
    RCctrlVal(buttonCmd);  //입력된 데이터에 따라 모터에 입력될 변수를 조정하는 함수
  }
  MotorDrive();  //모터를 구동하는 함수
}

//입력된 데이터에 따라 모터에 입력될 변수 조정 함수
void RCctrlVal(unsigned char cmd){
  if(cmd == 'w'){  //'w'가 입력되었을 때, 전진
    mAdir = 1;  //모터A 정방향
    mBdir = 1;  //모터B 정방향
    mAspd = 128*A_BAL;  //모터A의 128의 PWM
    mBspd = 128*B_BAL;  //모터B의 128의 PWM
  }
  else if(cmd == 'a'){  //'a'가 입력되었을 때, 제자리 좌회전
    mAdir = 1;  //모터A 정방향
    mBdir = 0;  //모터B 역방향
    mAspd = 64*A_BAL;  //모터A의 64의 PWM
    mBspd = 64*B_BAL;  //모터B의 64의 PWM
  }
  else if(cmd == 'd'){  //'d'가 입력되었을 때, 제자리 우회전
    mAdir = 0;  //모터A 역방향
    mBdir = 1;  //모터B 정방향
    mAspd = 64*A_BAL;  //모터A의 64의 PWM
    mBspd = 64*B_BAL;  //모터B의 64의 PWM
  }
  else if(cmd == 's'){  //'s'가 입력되었을 때, 후진
    mAdir = 0;  //모터A 역방향
    mBdir = 0;  //모터B 역방향
    mAspd = 128*A_BAL;  //모터A의 128의 PWM
    mBspd = 128*B_BAL;  //모터B의 128의 PWM
  }
  else if(cmd == 'x'){ //'x'가 입력되었을 때, 정지
    mAdir = 1;  //모터A 정방향
    mBdir = 1;  //모터B 정방향
    mAspd = 0;  //모터A의 정지
    mBspd = 0;  //모터B의 정지
  }
}

//모터 구동 함수
void MotorDrive(){  
  digitalWrite(MOTOR_A_DIR, mAdir);  //모터A의 방향을 디지털 출력
  digitalWrite(MOTOR_B_DIR, mBdir);  //모터B의 방향을 디지털 출력
  analogWrite(MOTOR_A_SPD, mAspd);  //모터A의 속력을 PWM 출력
  analogWrite(MOTOR_B_SPD, mBspd);  //모터B의 속력을 PWM 출력
}