메뉴 건너뛰기

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;
}

 

번호 제목 글쓴이 날짜 조회 수
공지 IR 리모콘 코드 따기 [1] 묵묵이 2017.02.10 14
» rc 카 작업용 [1] 묵묵이 2017.02.07 14
공지 [sketch_mydust] 미세멘지 측정기 작업 용 [2] 묵묵이 2017.02.07 35
23 sprintf2 사용법 묵묵이 2017.02.07 5
22 디지털 온 습도계 사용 DHT22 [2] file 묵묵이 2017.02.06 5
21 미세먼지 측정기 참조 [3] 묵묵이 2017.02.06 5
20 test ir 리모컨 테스트 [1] 묵묵이 2017.01.23 5
19 ir 리모컨 값 기록 묵묵이 2017.01.18 2
18 아두이노 IR 리모컨 R 신호 반복문제 test 묵묵이 2017.01.18 6
17 아두이노 톤함수를 사용하지 않고 부저 소리내기 묵묵이 2017.01.17 1
16 키보드로 멜로디 연주하기 묵묵이 2017.01.17 4
15 아두이노에 작은별 멜로디 스케치 묵묵이 2017.01.17 4
14 아두이노 미세먼지 측정기 .. 만들기 file 묵묵이 2017.01.17 2
13 서버모터 테스트 소스 묵묵이 2017.01.16 7
12 서보모터 제어하기 묵묵이 2017.01.16 1
11 아두이노 프로 미니 보드와 USB TO TTL 모듈을 이용한 프로그램 업로드 묵묵이 2017.01.13 1
10 ir 리모컨 수신 test ( 현제 작업중 소스) [1] file 묵묵이 2017.01.12 4
9 ir 적외선 센서를 이용한 거리 측청 - test 잘됨 묵묵이 2017.01.12 2
8 초음파 센서 참고 소스 [1] 묵묵이 2017.01.12 4
7 아두이노 기초강좌 - IR 센서 [1] 묵묵이 2017.01.11 7
6 Arduino 아두이노 - relay module control 릴레이 모듈 제어 [1] 묵묵이 2017.01.10 19
5 아두이노 나노 알아보기 묵묵이 2017.01.10 2
위로