반응형
지난번 진행에 이어 하드웨어 구성 이전의 마지막? 테스트로,
음성인식을 통해 전달된 정보를 블루투스를 통해 아두이노와 연결된 서보모터를 작동하는 테스트를 진행했다.
블루투스 모듈은 아래와 같이 현재 보유하고 있는 HC-05를 사용하였다.
(빵판을 어디에 두었는지 여분이 없어서 직접 연결했다... 테스트시에는 빵판이 꼭 필요하다..)
참고적으로 RX와 TX를 처음 8번, 10번에 연결했는데 핀문제인지 안돼서 2번과 3번으로 옮겼다.
(아두이노가 점점 기능 상실되어 가고 있는 것 같다...)
기본적인 설정으로 이름은 그대로 하고 속도만 다시 지정했다.
AT+UART=9600,1,0
그리고 여기에 사용된 아두이노 코드는 아래와 같이 간단하게 테스트용으로 작성해 봤다.
서보모터의 기준점을 정해 놓고 앞뒤로 움직일 수 있도록 한 것이다.
실제로 이코드는 그대로 사용할 수 없는데 서보모터를 제어하기 위한 것이 아니라 일반 DC모터를 제어해야 하기 때문에 거의 다 고쳐야 한다. 작동 후 되돌아오게 만든 것으로 잘되는지 참고용 테스트를 위한 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
#include <Servo.h>
#include <SoftwareSerial.h>
Servo myservo_1;
Servo myservo_2;
#define bt_RX 2
#define bt_TX 3
SoftwareSerial bluetooth(bt_RX, bt_TX);
int _defPos = 90;
bool _state = true;
String _inString;
void setup() {
myservo_1.attach(10);
myservo_2.attach(11);
myservo_1.write(_defPos);
myservo_2.write(_defPos);
//Serial.begin(9600);
bluetooth.begin(9600);
//Serial.println("Start~");
delay(500);
}
void loop()
{
if(bluetooth.available() > 0 && _state)
{
_inString = bluetooth.readString(); // mvf30,10 > 명령어거리,속도
int _index = _inString.indexOf(',');
int _stringLength = _inString.length();
String _moveStr = _inString.substring(3,_index);
String _speedStr = _inString.substring(_index + 1, _stringLength);
_inString = _inString.substring(0, 3);
if(_inString == "mvf") // 전진
MoveF(_moveStr.toInt(), _speedStr.toFloat());
else if(_inString == "mvb") // 후진
MoveB(_moveStr.toInt(), _speedStr.toFloat());
else if(_inString == "anr") // 우회전
Rotate(_moveStr.toInt(), _speedStr.toFloat());
else if(_inString == "anl") // 좌회전
Rotate(-1*_moveStr.toInt(), _speedStr.toFloat());
}
delay(10);
}
void MoveF(int _move, float _speed) {
_state = false;
int _tarPos = _defPos + _move;
int _pos = _defPos;
for (_pos = _defPos; _pos < _tarPos; _pos += 1)
ServoActive(_pos, _speed);
for (_pos = _tarPos; _pos > _defPos; _pos -= 1)
ServoActive(_pos, _speed);
_inString = "";
_state = true;
}
void MoveB(int _move, float _speed) {
_state = false;
int _tarPos = _defPos - _move;
int _pos = _defPos;
for (_pos = _defPos; _pos > _tarPos; _pos -= 1)
ServoActive(_pos, _speed);
for (_pos = _tarPos; _pos < _defPos; _pos += 1)
ServoActive(_pos, _speed);
_inString = "";
_state = true;
}
void ServoActive(int _pos, float _speed) {
myservo_1.write(_pos);
myservo_2.write(_pos);
delay(_speed);
}
void Rotate(int _angle, float _speed)
{
_state = false;
int _posR = _defPos;
int _posL = _defPos;
int _tarPos = _defPos + abs(_angle);
while(_posR < _tarPos) {
if(_angle > 0) {
myservo_1.write(_posR);
myservo_2.write(_posL);
} else {
myservo_1.write(_posL);
myservo_2.write(_posR);
}
delay(_speed);
_posR += 1;
_posL -= 1;
}
while(_defPos < _posR) { // angle이 0보다 크면 오른쪽, 아니면 왼쪽
if(_angle > 0) {
myservo_1.write(_posR);
myservo_2.write(_posL);
} else {
myservo_1.write(_posL);
myservo_2.write(_posR);
}
delay(_speed);
_posR -= 1;
_posL += 1;
}
_inString = "";
_state = true;
}
|
cs |
이 코드를 아두이노에 넣고 유니티로 빌드된 앱에서 접속하여 음성인식으로 동작을 구현하였다.
결과적으로 일단 테스트는 잘 되었다. 이걸 DC모터에 맞게 코드를 고치기만 하면 된다.
이제 다음 단계는 하드웨어를 구성하는 것이다.
아두이노 미니로 일단 생각하고 그에 맞는 부품들을 구매해야 한다.
반응형
'개발 관련 > 프로젝트' 카테고리의 다른 글
아두이노 시스템 설계 (3) | 2023.12.17 |
---|---|
Unity 음성인식으로 서보모터 작동 (0) | 2023.12.09 |
Unity 프로젝트 점검 (0) | 2023.12.03 |
Unity 음성인식과 블루투스 (0) | 2023.11.24 |
Unity 블루투스 연동 (0) | 2023.11.17 |
댓글