2020. 8. 5. 16:42ㆍDo! 개발
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%가 가장 잘
작동하였다.
'Do! 개발' 카테고리의 다른 글
[리눅스] ubuntu 18.04 python-dev 설치 의존성 오류 해결 (0) | 2020.10.08 |
---|---|
[인공지능 프로젝트] Keras를 활용한 주식 예측 (0) | 2020.09.04 |
[Python 프로젝트]음성인식 비서 자비스 (0) | 2020.08.05 |
[R 프로젝트]정권별 국내 부동산 시장 분석 (0) | 2020.08.05 |
[JAVA 프로젝트]지금 우리 학교는 – COVID19로 인한 초 · 중 · 고등학교 등교 현황 지도 웹사이트 (0) | 2020.08.05 |