Skip to content

Commit 3722a76

Browse files
committed
Add basic operation example for line tracer
- Implement forward, left turn, right turn, and stop actions using IR sensors - Implement setup and loop functions for initial configuration and motor control - Add serial print statements for debugging
1 parent 8974def commit 3722a76

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include <CA_MotorShield.h>
2+
3+
// 모터 쉴드 객체를 생성하고 I2C 주소를 초기화합니다.
4+
CA_MotorShield dcMotor(0x60);
5+
6+
// 각 모터에 대한 포인터를 초기화합니다.
7+
CA_DCMotor *motor1 = dcMotor.getMotor(1);
8+
CA_DCMotor *motor2 = dcMotor.getMotor(2);
9+
CA_DCMotor *motor3 = dcMotor.getMotor(3);
10+
CA_DCMotor *motor4 = dcMotor.getMotor(4);
11+
12+
// 최대 속도를 정의하는 상수입니다.
13+
#define MAX_SPEED 120
14+
15+
// 라인 트레이서의 이동 방향을 나타내는 상수입니다.
16+
#define C_LEFT 1 // 좌회전
17+
#define C_RIGHT 2 // 우회전
18+
#define C_FORWARD 3 // 전진
19+
#define C_BACKWARD 4 // 후진
20+
21+
// 적외선(IR) 센서 핀을 정의하는 상수입니다. 이 센서들은 무광 흑색과 밝은색 사이를 구분하는 데 사용됩니다.
22+
const int leftSensor = A2; // 왼쪽 적외선 센서로, 라인트레이서의 경로에 따라 무광 흑색과 밝은색을 감지합니다.
23+
const int rightSensor = A3; // 오른쪽 적외선 센서로, 마찬가지로 라인트레이서의 경로에 따라 무광 흑색과 밝은색을 감지합니다.
24+
25+
/**
26+
* @brief 라인트레이서 프로그램의 초기 설정을 수행하는 함수입니다.
27+
*
28+
* 이 함수는 라인트레이서가 시작될 때 한 번 호출되어, 필요한 하드웨어 설정을 초기화합니다.
29+
* - 시리얼 통신을 시작하여 디버깅 메시지를 출력할 수 있도록 설정합니다.
30+
* - 적외선 센서를 사용하기 위해 해당 핀을 입력 모드로 설정합니다.
31+
* - 모터 쉴드를 초기화하고, 모터의 동작을 위한 주파수를 설정합니다.
32+
*
33+
* @details
34+
* Serial.begin(9600): 시리얼 통신을 9600bps의 전송 속도로 시작합니다. 이를 통해
35+
* 프로그램의 실행 상태를 모니터링하고, 디버깅 정보를 출력할 수 있습니다.
36+
*
37+
* pinMode(): leftSensor와 rightSensor 핀을 INPUT 모드로 설정하여, 적외선 센서로부터
38+
* 신호를 읽을 수 있게 합니다.
39+
*
40+
* dcMotor.begin()과 dcMotor.setFrequency(1600): 모터 쉴드를 사용하기 위한 초기화 과정을
41+
* 수행하고, 모터의 동작 주파수를 1600Hz로 설정합니다. 이 설정은 모터의 성능과 효율에 영향을 줍니다.
42+
*/
43+
void setup() {
44+
Serial.begin(9600);
45+
Serial.println("........Start........");
46+
47+
// 센서 핀을 입력으로 설정합니다.
48+
pinMode(leftSensor, INPUT);
49+
pinMode(rightSensor, INPUT);
50+
51+
// 모터 쉴드를 초기화합니다.
52+
dcMotor.begin();
53+
dcMotor.setFrequency(1600);
54+
}
55+
56+
/**
57+
* @brief 주요 실행 루프에서 라인트레이서의 동작을 제어합니다.
58+
*
59+
* 이 함수는 라인트레이서의 적외선 센서 상태를 지속적으로 검사하여, 센서가 감지하는
60+
* 바닥의 색에 따라 모터의 방향과 속도를 조절합니다. 센서가 검은색 라인을 감지하면
61+
* 낮은 전기 신호(LOW)를, 밝은 바닥을 감지하면 높은 전기 신호(HIGH)를 출력합니다.
62+
* 이 정보를 바탕으로 라인트레이서는 전진, 좌회전, 우회전, 정지 중 하나의 동작을 수행합니다.
63+
*
64+
* - 전진: 두 센서 모두 검은색 라인 위에 있을 때
65+
* - 좌회전: 왼쪽 센서만 검은색 라인을 감지할 때
66+
* - 우회전: 오른쪽 센서만 검은색 라인을 감지할 때
67+
* - 정지: 두 센서 모두 밝은 바닥을 감지할 때
68+
*
69+
* 이 로직은 라인트레이서가 주어진 경로를 따라 정확하게 이동하도록 보장합니다.
70+
*/
71+
void loop() {
72+
// 전진: 왼쪽과 오른쪽 적외선 센서가 모두 검은색 라인 위에 있을 때
73+
// 센서가 검은색을 감지하면 디지털 신호를 LOW(0)로 출력합니다.
74+
if (digitalRead(leftSensor) == LOW && digitalRead(rightSensor) == LOW) {
75+
setMotorsDirection(C_FORWARD, MAX_SPEED); // 모터를 전진 방향으로 설정하고 최대 속도로 이동합니다.
76+
}
77+
// 좌회전: 왼쪽 센서만 검은색을 감지하고, 오른쪽 센서는 흰색 바닥을 감지할 때
78+
// 왼쪽 센서가 LOW, 오른쪽 센서가 HIGH 신호를 출력합니다.
79+
else if (digitalRead(leftSensor) == LOW && digitalRead(rightSensor) == HIGH) {
80+
setMotorsDirection(C_LEFT, MAX_SPEED); // 모터를 좌회전 방향으로 설정하고 최대 속도로 회전합니다.
81+
}
82+
// 우회전: 오른쪽 센서만 검은색을 감지하고, 왼쪽 센서는 흰색 바닥을 감지할 때
83+
// 오른쪽 센서가 LOW, 왼쪽 센서가 HIGH 신호를 출력합니다.
84+
else if (digitalRead(leftSensor) == HIGH && digitalRead(rightSensor) == LOW) {
85+
setMotorsDirection(C_RIGHT, MAX_SPEED); // 모터를 우회전 방향으로 설정하고 최대 속도로 회전합니다.
86+
}
87+
// 정지: 두 센서 모두 흰색 바닥을 감지할 때
88+
// 두 센서 모두 HIGH 신호를 출력합니다.
89+
else {
90+
stopAllMotors(); // 모든 모터를 정지시킵니다.
91+
}
92+
}
93+
94+
95+
/**
96+
* @brief RC카의 모터들을 특정 방향으로 설정하는 함수입니다.
97+
*
98+
* 이 함수는 입력된 방향에 따라 RC카의 모터들을 적절히 제어합니다. 왼쪽, 오른쪽,
99+
* 전진, 후진 등의 방향에 따라 모터들의 회전 방향을 설정합니다. 이를 통해 RC카가
100+
* 원하는 방향으로 움직일 수 있도록 합니다.
101+
*
102+
* @param direction 설정할 모터의 방향. C_LEFT, C_RIGHT, C_FORWARD, C_BACKWARD 중 하나를 사용합니다.
103+
* @param speed 모터가 도달할 속도. 이 속도는 감속 또는 증가됩니다.
104+
*/
105+
void setMotorsDirection(uint8_t direction, uint8_t speed) {
106+
// 모터의 방향을 설정합니다.
107+
if (direction == C_LEFT) {
108+
motor1->run(BACKWARD); // 1번 모터를 뒤로 돌려 왼쪽으로 회전시킵니다.
109+
motor2->run(BACKWARD); // 2번 모터도 뒤로 돌려 왼쪽으로 회전시킵니다.
110+
motor3->run(FORWARD); // 3번 모터를 앞으로 돌려 왼쪽으로 회전시킵니다.
111+
motor4->run(FORWARD); // 4번 모터도 앞으로 돌려 왼쪽으로 회전시킵니다.
112+
} else if (direction == C_RIGHT) {
113+
motor1->run(FORWARD); // 1번 모터를 앞으로 돌려 오른쪽으로 회전시킵니다.
114+
motor2->run(FORWARD); // 2번 모터도 앞으로 돌려 오른쪽으로 회전시킵니다.
115+
motor3->run(BACKWARD); // 3번 모터를 뒤로 돌려 오른쪽으로 회전시킵니다.
116+
motor4->run(BACKWARD); // 4번 모터도 뒤로 돌려 오른쪽으로 회전시킵니다.
117+
} else if (direction == C_FORWARD) {
118+
motor1->run(FORWARD); // 모든 모터를 앞으로 돌려 RC카가 전진하도록 합니다.
119+
motor2->run(FORWARD);
120+
motor3->run(FORWARD);
121+
motor4->run(FORWARD);
122+
} else if (direction == C_BACKWARD) {
123+
motor1->run(BACKWARD); // 모든 모터를 뒤로 돌려 RC카가 후진하도록 합니다.
124+
motor2->run(BACKWARD);
125+
motor3->run(BACKWARD);
126+
motor4->run(BACKWARD);
127+
}
128+
129+
motor1->setSpeed(speed);
130+
motor2->setSpeed(speed);
131+
motor3->setSpeed(speed);
132+
motor4->setSpeed(speed);
133+
}
134+
135+
/**
136+
* @brief RC카의 모든 모터들을 점차적으로 감속시켜 정지시키는 함수입니다.
137+
*
138+
* 함수 실행이 끝나면 모든 모터는 정지 상태(RELEASE)가 됩니다,
139+
*/
140+
void StopAllMotors() {
141+
// 모든 모터를 정지시킵니다.
142+
motor1->run(RELEASE);
143+
motor2->run(RELEASE);
144+
motor3->run(RELEASE);
145+
motor4->run(RELEASE);
146+
}

0 commit comments

Comments
 (0)