아두이노

RC CAR

내동 2017. 1. 30. 07:11

   [흐름도  ]

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