top of page

Term project(Open source)

1. Autonomous driving RC Car

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출 //모터 PIN 설정 #define LEFT_A1 4 //왼쪽 바퀴 #define LEFT_B1 5 //왼쪽 바퀴 #define RIGHT_A2 6 //오른쪽 바퀴 #define RIGHT_B2 7 //오른쪽 바퀴 //초음파 센서 PIN 설정 #define IR_TRIG 12 //TRIG 핀 설정 (초음파 보내는 핀) #define IR_ECHO 13 //ECHO 핀 설정 (반사된 초음파 받는 핀) void setup() { Serial.begin(9600); //시리얼모니터 //모터 핀모드 설정 pinMode(LEFT_A1, OUTPUT); pinMode(RIGHT_A2, OUTPUT); pinMode(LEFT_B1, OUTPUT); pinMode(RIGHT_B2, OUTPUT); //초음파 센서 핀모드 설정 pinMode(IR_TRIG, OUTPUT); pinMode(IR_ECHO, INPUT); } void loop() { float duration, distance; digitalWrite(IR_TRIG, HIGH); delay(10); digitalWrite(IR_TRIG, LOW); // echoPin 이 HIGH를 유지한 시간 duration = pulseIn(IR_ECHO, HIGH); // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다. // 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠주면 거리가 cm 로 나옴 distance = duration/58.2; Serial.print("\nDIstance : "); Serial.println(distance); if(distance < 20) { //장애물 감지 (20cm 이내) Serial.println("stop"); stop(); //정지(1초) Serial.println("backward"); backward(); //후진(0.5초) int rnd = random(0,2); //장애물 감지시 좌/우회전 랜덤처리 if(rnd == 0){ Serial.println("right"); right(); }else{ Serial.println("left"); left(); } }else{ //장애물 없음 Serial.println("forward"); forward(); } } void forward(){ digitalWrite(LEFT_A1, HIGH); digitalWrite(LEFT_B1, LOW); digitalWrite(RIGHT_A2, HIGH); digitalWrite(RIGHT_B2, LOW); } void backward(){ digitalWrite(LEFT_A1, LOW); digitalWrite(LEFT_B1, HIGH); digitalWrite(RIGHT_A2, LOW); digitalWrite(RIGHT_B2, HIGH); delay(500); } void left(){ digitalWrite(LEFT_A1, LOW); digitalWrite(LEFT_B1, HIGH); digitalWrite(RIGHT_A2, HIGH); digitalWrite(RIGHT_B2, LOW); delay(1000); } void right(){ digitalWrite(LEFT_A1, HIGH); digitalWrite(LEFT_B1, LOW); digitalWrite(RIGHT_A2, LOW); digitalWrite(RIGHT_B2, HIGH); delay(1000); } void stop(){ digitalWrite(LEFT_A1, LOW); digitalWrite(LEFT_B1, LOW); digitalWrite(RIGHT_A2, LOW); digitalWrite(RIGHT_B2, LOW); delay(1000); }

 

2. Bluetooth RC Car

#define MOTOR_A_SPD 10 //모터A의 속력을 결정하는 핀 #define MOTOR_B_SPD 11 //모터B의 속력을 결정하는 핀 #define MOTOR_A_DIR 12 //모터A의 방향을 결정하는 핀 #define MOTOR_B_DIR 13 //모터B의 방향을 결정하는 핀 #define A_BAL 1 //모터A 속력 균형 계수 기본값 1 #define B_BAL 1 //모터B 속력 균형 계수 기본값 1

unsigned char m_a_spd = 0, m_b_spd = 0; //모터의 속력을 결정하는 전역변수 boolean m_a_dir = 0, m_b_dir = 0; //모터의 방향을 결정하는 전역변수

void setup() { Serial.begin(9600); //시리얼 통신 초기화

pinMode(MOTOR_A_DIR, OUTPUT); //모터A 방향 핀 출력으로 설정 pinMode(MOTOR_B_DIR, OUTPUT); //모터B 방향 핀 출력으로 설정 Serial.println("Hello!"); //터미널 작동 확인용 문자열 }

void loop() { unsigned char bt_cmd = 0; //명령어 저장용 문자형 변수

if (Serial.available()) //데이터가 입력되었을 때 { bt_cmd = Serial.read(); //변수에 입력된 데이터 저장 rc_ctrl_val(bt_cmd); //입력된 데이터에 따라 모터에 입력될 변수를 조정하는 함수 } motor_drive(); //모터를 구동하는 함수 }

void rc_ctrl_val(unsigned char cmd) //입력된 데이터에 따라 모터에 입력될 변수를 조정하는 함수 { if(cmd == 'w') //'w'가 입력되었을 때, 전진 { m_a_dir = 1; //모터A 정방향 m_b_dir = 0; //모터B 정방향 m_a_spd = 80*A_BAL; //모터A의 128의 PWM m_b_spd = 80*B_BAL; //모터B의 128의 PWM } else if(cmd == 'a') //'a'가 입력되었을 때, 제자리 좌회전 { m_a_dir = 1; //모터A 정방향 m_b_dir = 1; //모터B 역방향 m_a_spd = 80*A_BAL; //모터A의 128의 PWM m_b_spd = 80*B_BAL; //모터B의 128의 PWM } else if(cmd == 'd') //'d'가 입력되었을 때, 제자리 우회전 { m_a_dir = 0; //모터A 역방향 m_b_dir = 0; //모터B 정방향 m_a_spd = 80*A_BAL; //모터A의 128의 PWM m_b_spd = 80*B_BAL; //모터B의 128의 PWM } else if(cmd == 's') //'s'가 입력되었을 때, 후진 { m_a_dir = 0; //모터A 역방향 m_b_dir = 1; //모터B 역방향 m_a_spd = 80*A_BAL; //모터A의 128의 PWM m_b_spd = 80*B_BAL; //모터B의 128의 PWM } else if(cmd == 'x') { m_a_dir = 1; //모터A 정방향 m_b_dir = 0; //모터B 정방향 m_a_spd = 0; //모터A의 정지 m_b_spd = 0; //모터B의 정지 } }

void motor_drive() //모터를 구동하는 함수 { digitalWrite(MOTOR_A_DIR, m_a_dir); //모터A의 방향을 디지털 출력 digitalWrite(MOTOR_B_DIR, m_b_dir); //모터B의 방향을 디지털 출력 analogWrite(MOTOR_A_SPD, m_a_spd); //모터A의 속력을 PWM 출력 analogWrite(MOTOR_B_SPD, m_b_spd); //모터B의 속력을 PWM 출력 }


bottom of page