아두이노로 RC카를 조립하여 여러가지 방법으로 원격제어를 할 수 있다.
그중에 적외선 센서를 사용하여 제어를 해보았음
RC카 모터 연결
기본적인 회로를 구성하고 모터드라이버와 아두이노를 연결
- 18650 2개를 사용하여 L298N에 연결
- 아두이노 전원을 L298N에서 연결 받음(정전압 출력 5V를 아두이노 Vin으로 입력받음)
- 좌회전 / 우회전이 제대로 되려면 PWM값을 90정도는 설정 해 주어야함
- L298N과 아두이노의 핀연결 및 모터 제어 코드는 아래 블로그 참조
회로연결이 가장 깔끔했음
적외선 리모콘 제어
적외선 리모콘 모델은 CAR MP3 / 적외선 수신기는 HX1838임
다음과 같이 리모콘을 누르면 동작하도록 코딩할 예정
아두이노에서 우선 적외선 라이브러리 추가하기(스케치 -> 라이브러리 포함하기 -> 라이브러리 관리)
라이브러리 매니저에서 IRremote 검색하여 추가
여기서 문제가 발생함
- 기존의 여러 참조블로그들은 제대로 동작하지 않았음
https://copynull.tistory.com/385
- 구글에서 3.x버전에 대한 내용을 찾았음
- 아래 유튜브와 유튜브와 관련된 깃허브 내용임
적외선 센서
https://www.youtube.com/watch?v=9cJT-tfODsg
유튜브관련 블로그
https://github.com/Arduino-IRremote/Arduino-IRremote/blob/master/README.md
최종코드
#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 |