메뉴 건너뛰기

XEDITION

아두이노

rc 카 작업용

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

 
#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 12
» rc 카 작업용 [1] 묵묵이 2017.02.07 11
공지 [sketch_mydust] 미세멘지 측정기 작업 용 [2] 묵묵이 2017.02.07 15
42 RFID 정보를 읽고 쓸 수 있는 Proxmark3 묵묵이 2024.09.13 1
41 [Android,Java] 안드로이드 - AES256 암호화 및 복호화 예제 소스 다운로드 file 묵묵이 2022.06.12 0
40 교류모터 속도제어킷 묵묵이 2021.05.02 7
39 WiFiHTTPSServer test 묵묵이 2020.03.02 7
38 8GLIB 유저매뉴얼 구글번역 묵묵이 2020.02.29 5
37 아두이노 2.4G 통신 모듈 사용하기 묵묵이 2019.04.04 9
36 전기가용량 계산 방법 - 전압, 전류와 전력량 측정에 대한 내용 묵묵이 2017.07.27 9
35 초저렴 iot 모듈 묵묵이 2017.06.04 8
34 적정 습도 / 미세먼지 값보정 묵묵이 2017.05.11 8
33 5V동작 20A 전류 센서 모듈 측정하기 ... [6] 묵묵이 2017.04.17 16
32 먼지 센서 구매 하는곳 ... 묵묵이 2017.04.15 7
31 라즈베리파이 프로그램 자동 실행 묵묵이 2017.03.12 8
30 라즈베리파일 설정 묵묵이 2017.03.11 6
29 [라즈베리파이] C언어를 이용한 GPIO 입출력 제어 [3] 묵묵이 2017.03.07 5
28 와이파이 모듈(ESP8266) 공유기 연결 AT 명령어 [1] file 묵묵이 2017.02.26 6
27 아두이노 EEPROM 사용해보기 묵묵이 2017.02.20 6
26 [아두이노] 0.96인치 OLED LCD 모듈 텍스트 출력 [2] file 묵묵이 2017.02.20 9
25 HEX to DEC 묵묵이 2017.02.10 5
위로