[아두이노]RC카 만들기

2020. 8. 5. 16:42Do! 개발

1. 부품

[주요 부품]

-아두이노 UNO 보드

-DC 모터 (2)

-초음파 센서 (HC-SR04)

-블루투스 (HC-06)

-DC 모터 드라이버 (L9110s)

-적외선 트랙킹 센서 (TCRT5000)

 

2. RC카 전원 회로

 

3. 실험과정

 

) RC 자동차 DC모터 회전 : BasicCommand

 

#include <SoftwareSerial.h>

#include <MagicRC.h>

 

MagicRC myRC(2, 3, 10, 11, 6, 5); // Bluetooth TX, RX

 

void setup() {

myRC.begin(9600); // Bluetooth baudrate

Serial.begin(9600);

}

 

void loop() {

if (Serial.available()) {

char c = Serial.read();

switch (c) {

case 'a':

myRC.forward();

break;

case 'b':

myRC.backward();

break;

case 'c':

myRC.turnLeft();

break;

case 'd':

myRC.turnRight();

break;

case 'e':

myRC.stop();

break;

case 'f':

int speed = Serial.parseInt();

myRC.setSpeed(speed);

break;

}

}

}

 

 

) RC 자동차 블루투스 제어

 

#include <SoftwareSerial.h>

 

SoftwareSerial BTSerial(2, 3); // Connect HC-06 (TX, RX)

 

void setup()

{

Serial.begin(9600);

Serial.println("Hello bluetooth!");

 

BTSerial.begin(9600); // set the data rate for the BT port

}

 

void loop()

{

// BT > Data > Serial

if (BTSerial.available()) {

Serial.write(BTSerial.read());

}

// Serial > Data > BT

if (Serial.available()) {

BTSerial.write(Serial.read());

}

}

 

펌웨어에 따른 AT Command 버전

- AT

- AT+VERSION

- AT+NAME=BT-01

- AT+PSWD=“1234

- AT+UART=9600,0,0

 

 

 

 

 

 

 

 

 

 

 

 

) 초음파 센서와 함께 하는 라인 트레이서

 

#include <MagicRC.h>

MagicRC myRC(2, 3, 10, 11, 6, 5); // Bluetooth TX, RX

 

const int SensorRight = A0; //우측센서

const int SensorLeft = A1; //좌측센서

 

const int SensorThr = 400; // 센서 임계값 (검은색이면 큰 값, 흰색이면 작은 값)

 

int SL; //좌측센서 상태

int SR; //우측센서 상태

 

#define TRIGGER_PIN 8 // trigger pin on the ultrasonic sensor.

#define ECHO_PIN 9 // echo pin on the ultrasonic sensor.

 

void setup()

{

Serial.begin(9600);

myRC.setSpeed(125);

pinMode(TRIGGER_PIN, OUTPUT);

pinMode(ECHO_PIN, INPUT);

}

 

int getDistance()

{

long duration, distance;

 

digitalWrite(TRIGGER_PIN, LOW);

delayMicroseconds(2);

digitalWrite(TRIGGER_PIN, HIGH); // sending a 10us pulse

delayMicroseconds(10);

digitalWrite(TRIGGER_PIN, LOW);

 

duration = pulseIn(ECHO_PIN, HIGH, 20000);

// We wait for the echo to come back, with a timeout of 20ms,

// which corresponds approximately to 3m

 

distance = (duration/2) / 29.1;

 

return distance; // returns the distance (cm). 0 means "timeout"

}

void loop()

{

int cm;

 

// 초음파센서 거리 측정

cm = getDistance();

Serial.println(cm, DEC);

 

if (cm != 0) { // Timeout이면 다시 거리 측정

if (cm > 10) { // 거리가 떨어져 있으면 움직임

// 검은색이면 큰 값, 흰색이면 작은 값

SR = analogRead(SensorRight);

SL = analogRead(SensorLeft);

if (SL < SensorThr && SR < SensorThr)

myRC.backward(); //전진 (반대방향으로 움직이므로 후진)

else if (SL > SensorThr & SR < SensorThr)// 좌회전

myRC.turnLeft();

else if (SR > SensorThr & SL < SensorThr) // 우회전

myRC.turnRight();

else // 정지

myRC.stop();

} else if (cm < 5) { // 매우 가까우면 후진

myRC.forward();

}

else { // 5cm~10cm이면 멈추어 있음.

myRC.stop();

}

}

 

delay(10);

}

 

) 기능 통합(RemoteControl + LineFollower)

 

#include <MagicRC.h>

MagicRC myRC(2, 3, 10, 11, 6, 5); // Bluetooth TX, RX

 

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3);

 

const int SensorRight = A0; //우측센서

const int SensorLeft = A1; //좌측센서

 

const int SensorThr = 400; // 센서 임계값 (검은색이면 큰 값, 흰색이면 작은 값)

 

int SL; //좌측센서 상태

int SR; //우측센서 상태

 

#define TRIGGER_PIN 8 // trigger pin on the ultrasonic sensor.

#define ECHO_PIN 9 // echo pin on the ultrasonic sensor.

 

int OperationMode = 0; // 0: Remote Control Mode

// 1: Line Follower Mode

 

long PreviousMillis = 0; // 일정 시간 간격으로 Distance를 전송하기 위함

long Interval = 100; // Distance를 전송하는 시간 간격 (msec)

 

void setup()

{

Serial.begin(9600);

BTSerial.begin(9600);

myRC.setSpeed(125);

pinMode(TRIGGER_PIN, OUTPUT);

pinMode(ECHO_PIN, INPUT);

}

void loop()

{

if (OperationMode == 0) {

loop_mode0();

}

else {

loop_mode1();

}

 

// 일정 시간 간격으로 Distance를 전송

unsigned long CurrentMillis = millis();

if(CurrentMillis - PreviousMillis > Interval) {

// save the last time you blinked the LED

PreviousMillis = CurrentMillis;

 

int cm = getDistance();

byte b = (cm < 255) ? cm : 255;

BTSerial.write(b);

}

}

int getDistance()

{

long duration, distance;

 

digitalWrite(TRIGGER_PIN, LOW);

delayMicroseconds(2);

digitalWrite(TRIGGER_PIN, HIGH); // sending a 10us pulse

delayMicroseconds(10);

digitalWrite(TRIGGER_PIN, LOW);

 

duration = pulseIn(ECHO_PIN, HIGH, 20000);

// We wait for the echo to come back, with a timeout of 20ms,

// which corresponds approximately to 3m

 

distance = (duration/2) / 29.1;

 

return distance; // returns the distance (cm). 0 means "timeout"

}

 

4. 결론

- dc모터로 구동을 했을 때, ,,,우로 이동을하였다.

- 초음파와 적외선을 같이 작동을 했을 때 라인을 따라서 한바퀴 돌다가 초음파쪽에

손을 가져가면 뒤로 이동을 하였다.

- 속도제어를 했을 때 속도가 너무 느리게하면 rc카가 구동을 안하였고, 60%가 가장 잘

작동하였다.

반응형