메뉴 건너뛰기

XEDITION

아두이노

rc 카 작업용

묵묵이 2017.02.07 17:38 조회 수 : 14

 
#include <IRremote.h>
#include <IRremoteInt.h>
#include <Servo.h>

int APIN_NEARREAD = 1;  // ir 거리측정
int DPIN_RECV_IR = 11;
int DPIN_SERVOR = 9; // 서보모터 9 번핀 ..
int DPIN_DCAF = 7; // DC모터 7 번핀 ..
int DPIN_DCAB = 8; // DC모터 8 번핀 ..
Servo myservo;
IRrecv irrecv(DPIN_RECV_IR);     //IRrecv 객체를 만듭니다 (아날로그 5번핀으로 수신)
decode_results result;  //수신받은 데이타를 저장할 구조체를 만듭니다
volatile unsigned long IR_code;
void setup()

  irrecv.enableIRIn();  //수신을 시작합니다
  irrecv.blink13(true);  //수신받았을 경우 아두이노 13번핀을 깜빡입니다
  myservo.attach(DPIN_SERVOR); // 9 번핀 ..
  myservo.write(90); // 서보 모터 움직임
 
  pinMode(DPIN_DCAF,OUTPUT);  // 전진
  pinMode(DPIN_DCAB,OUTPUT);  // 후진
 
  digitalWrite(DPIN_DCAF,LOW);
  digitalWrite(DPIN_DCAB,LOW);
  Serial.begin(9600);
}
void loop()
{
  if(!irrecv.decode(&result)) return;  //수신받은게 없으면 아래를 수행하지 않습니다.
 
  if(result.decode_type == SAMSUNG){ //삼성리모콘이면
    Serial.println("Samsung");
  } else if(result.decode_type == LG){ //LG리모콘이면
    Serial.println("LG");
  } else {                     //기타 NEC, SONY, RC5 등을 쓴다면 else if 로 추가해주세요
   //Serial.println("Other :" + result.value);
   Serial.print("Other Remote :");
  }
  IR_code = result.value;
  switch (IR_code)
  {
  case (0xA9AEAB34):
      Serial.println("Front Data Dn : ");     
      fn_carmove("F");     
      break;   
 
  //case (0xF3EAEB56):
  case (0x32D19EA0):
      Serial.println("Back Data Dn : ");
      fn_carmove("B");       
      break;
  case (0xF3EAEB55):
      Serial.print("Left Data Dn : ");     
      fn_carmove("L");
      break;
   
  case (0x2804976D):
      Serial.println("Right Data Dn : ");     
      fn_carmove("R");
      break;
  case (0x7B1FB3B8): 
      //digitalWrite(IN2,HIGH);  //motor stop
      Serial.println("Front && Left");
       fn_carmove("FL");
      break;
  //case (0x32D19EA0):  // 중복 됨 .. 
      //digitalWrite(IN2,HIGH);  //motor stop
      Serial.println("Front && Right");
       fn_carmove("FR");
      break;
  case (0xF236570A): 
      //digitalWrite(IN2,HIGH);  //motor stop
      Serial.println("Back && Left");
       fn_carmove("BL");
      break;
  case (0xF19EF067): 
      //digitalWrite(IN2,HIGH);  //motor stop
      Serial.println("Back && Right");
       fn_carmove("BR");
      break;
  case (0x315CB683): 
      //digitalWrite(IN2,HIGH);  //motor stop
      Serial.println("Btn Up : Stop Action");
      fn_carmove("");
      break;
  default:
    Serial.print("Data: ");
    Serial.println(IR_code, HEX); //받은 데이타를 16진수로 표시합니다
    Serial.print("Length: ");
    Serial.println(IR_code, DEC); //데이타의 길이를 10진수로 표시합니다.
    break;
  }
  delay(10);
  irrecv.resume(); // 다시 수신할 수 있도록 합니다
}

void fn_carmove(String sMode)
{
   if( sMode == "F" )
   {
    //최대속도로정회전
    fn_dcmove("F");     
   } else if( sMode == "FL" )
   {
    fn_dcmove("F");
    myservo.write(30); // 서보 모터 움직임
   } else if( sMode == "FR" )  
   {
    fn_dcmove("F");
    myservo.write(170); // 서보 모터 움직임
   } else if( sMode == "B" )
   {
    fn_dcmove("B");
   } else if( sMode == "BL" )
   {
    fn_dcmove("B");
    myservo.write(30); // 서보 모터 움직임
   } else if( sMode == "BR" )
   {
    fn_dcmove("B");
    myservo.write(170); // 서보 모터 움직임
   } else if( sMode == "L" )
   {   
    myservo.write(30); // 서보 모터 움직임
   }  else if( sMode == "R" )
   {   
    myservo.write(170); // 서보 모터 움직임
   } else {
    // 멈춤
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    analogWrite(6,255);
    myservo.write(90); // 서보 모터 정위치
   }
}
 
void fn_dcmove(String sMode)
{
  int iNearVal = fn_irread();
  if( iNearVal < 30 )
  {
    sMode = "";
    int noteDuration = 1000 / 262;
    //tone(11, 262, noteDuration);
  }
  
   if( sMode == "F" )
   {
    //최대속도로정회전
    digitalWrite(DPIN_DCAF,HIGH);
    digitalWrite(DPIN_DCAB,LOW);
    analogWrite(6,255);  // 속도 100%   6 번 포트
    //analogWrite(6,127);  // 속도 50 %     
   } else if( sMode == "B" )
   {
    //최대속도로정회전
    digitalWrite(DPIN_DCAF,LOW);
    digitalWrite(DPIN_DCAB,HIGH);   
    analogWrite(6,255);
   } else {
    // 멈춤
    digitalWrite(DPIN_DCAF,LOW);
    digitalWrite(DPIN_DCAB,LOW);
    analogWrite(6,255);
   }
}
int fn_irread()
{
  int val;
  int volt = analogRead(APIN_NEARREAD);
  val = (6762/(volt-9))-4;
  Serial.print("ir value : " );
  Serial.println(val);  // 거리 값
  return val;
}

 

위로