개발 관련/HW 관련
Arduino 서보모터 사용 코드 설명
소서리스25
2023. 5. 25. 12:56
반응형
Arduino 서보모터 사용 코드 설명 및 동작영상
아무래도 지난번 포스팅의 코드 설명이 필요할 것 같아 작성한다. 졸려운 와중에 작성하고 예약 걸어놨는데, 다시 보니 좀 부족해 보인다. 아울러 작동 영상도 없어서 같이 올린다.
코드 중에서 크게 2가지를 간략하게 설명할 것으로 먼저 첫 번째는 명령어 형태이다.
1
2
3
4
5
|
int _index = _inString.indexOf(',');
int _stringLength = _inString.length();
String _speed = _inString.substring(_index + 1, _stringLength);
String _angle = _inString.substring(2,_index);
_inString = _inString.substring(0,2);
|
cs |
이 코드를 설명하기 전에 외부에서 어떤 명령으로 실행할 것인지를 설명하면 다음과 같다.
"go60,10"
이 형태가 외부에서 실행하는 명령어이다. Serial 통신으로 이 명령어를 받으면 된다.
go는 명령어 식별자이고, 그다음 60은 각도, 쉼표는 구분하기 위함, 10은 속도이다. 위의 코드는 해당 명령어의 값을 분리하기 위한 내용이다. split과 같은 것으로 대충 보면 알 것이다.
그리고 한번 명령이 들어가면 해당 각도로 움직였다가 다시 원위치로 돌아온다.
두 번째는 함수 실행(Active)으로 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Active(int _angle, float _speed)
{
for (pos = 0; pos <= _angle; pos += 1)
{
myservo.write(pos);
delay(_speed);
}
for (pos = _angle; pos >= 0; pos -= 1)
{
myservo.write(pos);
delay(_speed);
}
_inString = "";
}
|
cs |
여기서 한 가지 빠진 것이 있는데 중복으로 명령어가 입력되면 오류가 생길 수 있다. 따라서 최종 코드는 아래와 같다.
오류 없이 실행이 잘 되는지 아래의 영상에서 확인해 보자.
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
|
#include <Servo.h>
String _inString;
Servo myservo;
int pos = 0;
bool _state = true;
void setup() {
myservo.attach(10);
Serial.begin(9600);
Serial.println("Start~");
delay(500);
Active(45, 10);
}
void loop()
{
if (Serial.available() > 0 && _state)
{
_inString = Serial.readString();
int _index = _inString.indexOf(',');
int _stringLength = _inString.length();
String _speed = _inString.substring(_index + 1, _stringLength);
String _angle = _inString.substring(2,_index);
_inString = _inString.substring(0,2);
Serial.println(_angle);
Serial.println(_speed);
if(_inString == "go")
{
Active(_angle.toInt(), _speed.toFloat());
}
}
delay(20);
}
void Active(int _angle, float _speed)
{
_state = false;
for (pos = 0; pos <= _angle; pos += 1)
{
myservo.write(pos);
delay(_speed);
}
for (pos = _angle; pos >= 0; pos -= 1)
{
myservo.write(pos);
delay(_speed);
}
_inString = "";
_state = true;
}
|
cs |
중복 방지는 현재 서보모터가 돌고 있으면 중복으로 실행이 되지 않도록 해야 한다. 따라서 Active에서 입력 유효상태(_state = true / false)를 추가하여 주었다.
그러면 제대로 동작하는지 확인해 보자. 각도 및 속도에 따라 움직이는 것을 확인할 수 있다.
반응형