SPAC2 블루투스모듈과 안드로이드앱을 이용한 무선 주행실험

아두이노 우노를 이용한 2WD 자동차 스마트카 로봇 SPAC2입니다. SPAC1의 상위모델로 충전용 18650배터리 2개(7.4V)를 사용하여 강력한 구동이 가능하고 오랜 주행이 가능합니다. 여기서는 블루투스모듈과 안드로이드앱을 이용한 무선 주행실험을 합니다. 

1. 블루투스모듈 결선

블루투스 모듈을 브레드보드에 꼽고 아두이노 보드와 결선합니다. 

블루투스 모듈 결선

VCC - 5V
GND - GND
TXD - RXD
RXD - TXD

 

구글 안드로이드 마켓에서 Arduino Bluetooth RC Car를 검색하여 설치합니다.

블루투스 기기를 검색한 후 BT04-A가 검색되면 패어링 암호 1234를 입력하시면 됩니다.

 

2. 소스 및 주행실험

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

* 주의 사항 : 업로드전에 아두이노 우노보드와 블루투스모듈과 연결되 TX핀과 RX핀을 뽑으시기 바랍니다. 그렇지 않으면 업로드오류가 납니다. 업로드를 완료한 후 다시 RX핀과 TX핀을 연결하시면 됩니다.

 

// SPAC2 블루투스 무선 구동실험

int Left_motor_back=8;     //좌측모터후진(IN1)
int Left_motor_go=9;     //좌측모터전진(IN2)

int Right_motor_go=10;    // 우측모터전진(IN3)
int Right_motor_back=11;    // 우측모터후진(IN4)

char command; 

void setup()
{
  //모터구동을을 위한 초기화
  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  pinMode(13, OUTPUT);////포트설정 출력

  Serial.begin(9600);	//전송속도9600
}
void run()     // 전진
{
  digitalWrite(Right_motor_go,HIGH);  //우측모터전진
  digitalWrite(Right_motor_back,LOW);     
  //analogWrite(Right_motor_go,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  //analogWrite(Right_motor_back,0);
  digitalWrite(Left_motor_go,HIGH);  //좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  //analogWrite(Left_motor_go,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  //analogWrite(Left_motor_back,0);
  //delay(time * 100);   //딜레이  
}

void brake()         //제동, 정지
{
  digitalWrite(Right_motor_go,LOW);
  digitalWrite(Right_motor_back,LOW);
  digitalWrite(Left_motor_go,LOW);
  digitalWrite(Left_motor_back,LOW);
  //delay(time * 100);//딜레이  
}

void left()         //좌회전(좌측정지,우측직진)
{
  digitalWrite(Right_motor_go,HIGH);	// 우측모터전진
  digitalWrite(Right_motor_back,LOW);
  //analogWrite(Right_motor_go,200); 
  //analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);   //좌측모터정지
  digitalWrite(Left_motor_back,LOW);
  //analogWrite(Left_motor_go,0); 
  //analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void spin_left()         //좌측스핀(좌측후진,우측직진)
{
  digitalWrite(Right_motor_go,HIGH);	// 우측모터전진
  digitalWrite(Right_motor_back,LOW);
  //analogWrite(Right_motor_go,200); 
  //analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);   //좌측모터후진
  digitalWrite(Left_motor_back,HIGH);
  //analogWrite(Left_motor_go,0); 
  //analogWrite(Left_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void right()        //우회전(우측정지, 좌측직진)
{
  digitalWrite(Right_motor_go,LOW);   //우측모터정지
  digitalWrite(Right_motor_back,LOW);
  analogWrite(Right_motor_go,0); 
  analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,HIGH);//좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  analogWrite(Left_motor_go,200); 
  analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void spin_right()        //우측스핀(우측후진, 좌측전진)
{
  digitalWrite(Right_motor_go,LOW);   //우측모터후진
  digitalWrite(Right_motor_back,HIGH);
  //analogWrite(Right_motor_go,0); 
  //analogWrite(Right_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,HIGH);//좌측모터전진
  digitalWrite(Left_motor_back,LOW);
  //analogWrite(Left_motor_go,200); 
  //analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);	//딜레이  
}

void back()          //후진
{
  digitalWrite(Right_motor_go,LOW);  //우측모터후진
  digitalWrite(Right_motor_back,HIGH);
  //analogWrite(Right_motor_go,0);
  //analogWrite(Right_motor_back,150);//PWM값 0~255 조정,모터의 회전속도 조절.
  digitalWrite(Left_motor_go,LOW);  //좌측모터후진
  digitalWrite(Left_motor_back,HIGH);
  //analogWrite(Left_motor_go,0);
  //analogWrite(Left_motor_back,150);//PWM값 0~255 조정,모터의 회전속도 조절.
  //delay(time * 100);     //딜레이  
}

void loop(){
  if(Serial.available() > 0){ 
    command = Serial.read(); 
    brake(); //initialize with motors stoped
    //Change pin mode only if new command is different from previous.   
    //Serial.println(command);
    switch(command){
    case 'F':  
      run();
      break;
    case 'B':  
       back();
      break;
    case 'L':  
      right();
      break;
    case 'R':
      left();
      break;
    }
  } 
}

Topic: