본문 바로가기

Embedded/Arduino

아두이노+RC카+적외선센서 제어

아두이노로 RC카를  조립하여 여러가지 방법으로 원격제어를 할 수 있다.

그중에 적외선 센서를 사용하여 제어를 해보았음

 

RC카 모터 연결

기본적인 회로를 구성하고 모터드라이버와 아두이노를 연결

- 18650 2개를 사용하여 L298N에 연결

- 아두이노 전원을 L298N에서 연결 받음(정전압 출력 5V를 아두이노 Vin으로 입력받음)

- 좌회전 / 우회전이 제대로 되려면 PWM값을 90정도는 설정 해 주어야함

- L298N과 아두이노의 핀연결 및 모터 제어 코드는 아래 블로그 참조

  회로연결이 가장 깔끔했음

https://makernambo.com/61

 

L298N 드라이버로 DC모터 제어하기

 L298N 드라이버 모듈은 2개의 DC모터 또는 1개의 스테핑모터를 제어하기 위한 모터드라이버 이다. 두개의 DC모터를 각각 속도와 방향 제어할 수 있으므로 전동 모형자동차 제작시 전진/후진 및

makernambo.com

 

적외선 리모콘 제어

적외선 리모콘 모델은 CAR MP3 / 적외선 수신기는 HX1838임

다음과 같이 리모콘을 누르면 동작하도록 코딩할 예정

 

아두이노에서 우선 적외선 라이브러리 추가하기(스케치 -> 라이브러리 포함하기 -> 라이브러리 관리)

라이브러리 매니저에서 IRremote 검색하여 추가

여기서 문제가 발생함

- 기존의 여러 참조블로그들은 제대로 동작하지 않았음 

https://copynull.tistory.com/385 

 

[아두이노] 19. IR 적외선 수신 센서 및 리모컨

IR 적외선 수신 센서는 적외선 리모컨용 38khz 대역의 적외선을 수신하여 출력하는 센서로 아두이노에서 적외선 신호를 감지 판별할 수 있습니다. 적외선은 우리 생활의 많은 분야에

copynull.tistory.com

- 구글에서 3.x버전에 대한 내용을 찾았음

- 아래 유튜브와 유튜브와 관련된 깃허브 내용임

 

적외선 센서

https://www.youtube.com/watch?v=9cJT-tfODsg 

유튜브관련 블로그

https://github.com/Arduino-IRremote/Arduino-IRremote/blob/master/README.md

 

GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple

Infrared remote library for Arduino: send and receive infrared signals with multiple protocols - GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive in...

github.com

 

 

최종코드

 

#include <IRremote.hpp>

#define ENABLE_A  10  
#define IN1_A  9   
#define IN2_A  8   
#define ENABLE_B  5  
#define IN3_B  7   
#define IN4_B  6

#define FORWARD 2
#define BACKWARD 8
#define RIGHT 6
#define LEFT 4
#define STOP 5

#define IR_RECEIVE_PIN A0
  
int speedDC = 90;  

IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
  
void setup()  
{  
  pinMode(ENABLE_A,OUTPUT);  
  pinMode(IN1_A,OUTPUT);  
  pinMode(IN2_A,OUTPUT);
  pinMode(ENABLE_B,OUTPUT);  
  pinMode(IN3_B,OUTPUT);  
  pinMode(IN4_B,OUTPUT);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the receiver
  Serial.begin(9600);
  motor_direction(STOP);
  motor_speed(0);
}  
  
void motor_speed(int speed_up)  
{ 
  speedDC += speed_up;
  if(speedDC >= 255)
    speedDC = 255;
  
  if(speedDC <= 0)
    speedDC = 0; 
  
  analogWrite(ENABLE_A,speedDC);  
  analogWrite(ENABLE_B,speedDC);  
}  
  
void motor_direction(int dir)  
{ 
  Serial.println(dir); 
  if ( dir == BACKWARD ) {  // backward  
     digitalWrite(IN1_A,HIGH);  
     digitalWrite(IN2_A,LOW);  
     digitalWrite(IN3_B,HIGH);  
     digitalWrite(IN4_B,LOW);  
  }  
  else if ( dir == LEFT ) { // turn left  
     digitalWrite(IN1_A,HIGH);  
     digitalWrite(IN2_A,LOW);  
     digitalWrite(IN3_B,LOW);  
     digitalWrite(IN4_B,HIGH);  
  }  
  else if ( dir == RIGHT ) { // turn right  
     digitalWrite(IN1_A,LOW);  
     digitalWrite(IN2_A,HIGH);  
     digitalWrite(IN3_B,HIGH);  
     digitalWrite(IN4_B,LOW);  
  }    
  else if ( dir == FORWARD ) { // forward
     digitalWrite(IN1_A,LOW);  
     digitalWrite(IN2_A,HIGH);  
     digitalWrite(IN3_B,LOW);  
     digitalWrite(IN4_B,HIGH);  
  }     
  else if ( dir == STOP ) { // STOP
     digitalWrite(IN1_A,LOW);  
     digitalWrite(IN2_A,LOW);  
     digitalWrite(IN3_B,LOW);  
     digitalWrite(IN4_B,LOW);  
  }     
}  
  
void loop()  
{ 
  
  if (IrReceiver.decode()) {
    switch(IrReceiver.decodedIRData.decodedRawData){
      case 0xEA15FF00: // '+'
        motor_speed(5);
        Serial.println("SPEED UP");
        break; 
      case 0xF807FF00: //'-'
        motor_speed(-5);
        Serial.println("SPEED DN");
        break; 
      case 0xE718FF00: //'2' 
        motor_direction(FORWARD);
        Serial.println("FORWARD");
        break;
      case 0xAD52FF00: //'8'  
        motor_direction(BACKWARD);
        Serial.println("BACKWARD");  
        break;         
      case 0xA55AFF00: //'6'  
        motor_direction(RIGHT);  
        Serial.println("RIGHT");
        break;
      case 0xF708FF00: //'4'
        motor_direction(LEFT);  
        Serial.println("LEFT");
        break;                 
      case 0xE31CFF00: //'5'
        motor_direction(STOP);  
        Serial.println("STOP");
        break;                         
    }
    IrReceiver.resume(); // Enable receiving of the next value
//    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    delay(50);
  }
}

'Embedded > Arduino' 카테고리의 다른 글

arduino_v220427  (0) 2022.04.27
arduino_v220425  (0) 2022.04.25
CAN Example #3  (0) 2021.11.29
CAN Example #2  (0) 2021.11.29
CAN example #1  (0) 2021.11.29