개발 관련/HW 관련

Arduino 서보모터 사용 코드 설명

by 소서리스25 2023. 5. 25.
반응형

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)를 추가하여 주었다.

 

그러면 제대로 동작하는지 확인해 보자. 각도 및 속도에 따라 움직이는 것을 확인할 수 있다.

동작영상

 

반응형

댓글