[흐름도 ]
RC Car가 동작하는 흐름도 이디 먼저 불루투스 모듈을 통하여 신호를 받는다. 새로운 신호가 들어 오지 않으면 이전 신호로 인식한다.
초음파 센서에서 거리 10센치이내에 물체가 들어오면 위험허고 판단하여 정지한다 불루투스 신호에 따라 정지 또는 회전을 하게 된다.
#include<Software Serial.h>
SoftwareSerial BTSerial(3,2);
int Right_Motor[2]={4,5};
int Left_Motor[2]={6,7};
int SPEED[2]={A0,A1};
int Hc_04_Tpin=A2;
int Hc_04_Epin=A3;
unsigned long time;
int Speed=0;
long Hc_04_Value, distance;
void setup(){
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(Right_Motor[0],OUTPUT);
pinMode(Right_Motor[1],OUTPUT);
pinMode(Light_Motor[0],OUTPUT);
pinMode(Light_Motor[1],OUTPUT);
pinMode(HC-04-Tpin,OUTPUT);
pinMode(HC-04-EPin,INPUT);
Speed=0;
}
void loop(){
int BT;
BT=BTserial(BT);
delay(300);
Motor(BT);
}
int BTserial( int BT)
{
int BT_new=0;
if(BTSerial.avaialble())
{
time=millis();
for(;(millis()-time<2000)&&(BT_new !=65)&&(BT_new !=66)&&(BT_new!=67)&&(BT_new !=68)&&(BT_new !=69);)
{delay(100);
BT_new=BTSerial.read();
}
if((BT_new !=65)&&(BT_new !=66)&&(BT`new !=67)&&(BT_new !=68)&&(BT_new!=69))
return BT;
Serial.println(BT_new);
BT=BT_new;
}
return BT;
}
void Go()
{
digitalWrite(Right_Motor[0], HIGH);
digitalWrite(Right_Motor[1], LOW);
analogWrite(SPEED[0],Speed);
digitalWrite(Light_Motor[0], HIGH);
digitalWrite(Light_Motor[1], LOW);
analogWrite(SPEED[1],Speed);
}
void Back()
{
digitalWrite(Right_Motor[0], LOW);
digitalWrite(Right_Motor[1], HIGH);
analogWrite(SPEED[0],-Speed);
digitalWrite(Light_Motor[0], LOW);
digitalWrite(Light_Motor[1], HIGH);
analogWrite(SPEED[1],-Speed);
}
void Left()
{
if(Speed == 0|| Speed>0)
{
digitalWrite(Right_Motor[0], HIGH);
digitalWrite(Right_Motor[1], LOW);
analogWrite(SPEED[0], 255);
digitalWrite(Light_Motor[0], LOW);
digitalWrite(Light_Motor[1], LOW);
analogWrite(SPEED[1], 0);
}
else if (Speed <0 )
{
digitalWrite(Right_Motor[0], LOW);
digitalWrite(Right_Motor[1], HIGH);
analogWrite(SPEED[0],255);
digitalWrite(Light_Motor[0], LOW);
digitalWrite(Light_Motor[1], LOW);
analogWrite(SPEED[1],0 );
}
void Right()
{
if(Speed == 0|| Speed>0)
{
digitalWrite(Right_Motor[0], LOW);
digitalWrite(Right_Motor[1], LOW);
analogWrite(SPEED[0], 0 );
digitalWrite(Light_Motor[0], HIGH);
digitalWrite(Light_Motor[1], LOW);
analogWrite(SPEED[1], 255);
}
else if (Speed <0 )
{
digitalWrite(Right_Motor[0], LOW);
digitalWrite(Right_Motor[1], LOW);
analogWrite(SPEED[0], 0 );
digitalWrite(Light_Motor[0], LOW);
digitalWrite(Light_Motor[1], HIGH);
analogWrite(SPEED[1], 255 );
}
}
void Stop()
{
digitalWrite(Right_Motor[0], HIGH);
digitalWrite(Right_Motor[1], LOW);
digitalWrite(Light_Motor[0], LOW);
digitalWrite(Light_Motor[1], LOW);
}
void Motor ( int state)
{
state = HC_04(state);
switch(state)
{
case 65 :
Speed + = 70 ;
if ( Speed == 255 || Speed > 255)
{
Speed = 255;
}
Go( );
Serial.println(Speed,DEC);
break;
case 69 :
Speed - = 70 ;
if ( Speed == - 255 || Speed < - 255)
{
Speed = -255;
}
Back( );
Serial.println(Speed,DEC);
break;
case 68:
Right () ;
Serial.println( " Right " );
break ;
case 66:
Left () ;
Serial.println( " Left " );
break ;
case 67 :
Stop () ;
break;
default ;
Stop () ;
Serial.println ( " NO button " );
breal;
}
}
int HC_04 ( int state)
{
digitalWrite( HC_04_Tpin, LOW) ;
delayMicroseconds(4) ;
digitalWrite( HC_04_Tpin, HIGH) ;
delayMicroseconds(20) ;
digitalWrite( HC_04_Tpin, LOW) ;
HC_04_Value = pulseIn( HC_04_Epin, HIGH);
distance = HC_04_Value/29/2;
if ( distance <100 )
{
state = 67;
Serial.println ( " Stop " ) ;
Serial,println ( distance );
return state ;
}
else if ( 100< distance < 700 )
{
Serial,println ( " Warning" );
Serial,print ( "distance = );
Serial,print ( distance );
Serial,println ( " mm" );
}
return state;
}
'아두이노' 카테고리의 다른 글
500W 서보모터 (0) | 2017.02.01 |
---|---|
부루투스 (0) | 2017.02.01 |
14장 구름생성 단열변화 (0) | 2016.02.29 |
13장 빛의세기에따른 광합성 속도변화 (0) | 2016.02.29 |
12장 솔레노이드 내부 자기장 측정하기 (0) | 2016.02.29 |