개발 관련/프로젝트

로봇제작 - 서보모터 교체를 위한 테스트

by 소서리스25 2024. 5. 21.
반응형

수술도 잘 끝났고 어느 정도 회복되어서 이제 다시 작업을 재개하였다.

 

우선 지난번 구매한 서보모터의 각도 테스트를 위해서 실제 사용하는 코드를 단순화해서 테스트했는데 문제가 생겼다. 큰 문제는 아니긴 한데 번거롭게 되어 버렸다.

 

즉, 각각의 서보모터 회전은 대략 0~180도로 문제가 없는데 HS-311의 기본 회전 방향과 MG995의 기본 회전 방향이 반대다...

아래 동영상부터 확인해보면 기본 회전이 반대방향인 것을 알 수 있다.

그냥 모든 서보모터를 변경했어야 하나라고 생각할 수도 있겠지만.. MG995가 힘은 좋지만 생각보다 무겁다. 그리고 HS-311의 크기보다 약간 폭이 길다.

 

이거 수정하는 방법이 있는지 우선 찾아봐야겠다.

 

만약 안되면 해당 코드가 사용되는 명령어를 모두 변경해야 한다. 정말 귀찮은 일이다.

사용 제한 값을 모두 찾아서 다시 적용해야 한다. 아울러 같은 delay 시간을 줬는데 속도가 많이 다르다..;;;

 

위의 테스트 코드는 아래와 같다. 시리얼 모니터에서 테스트해 볼 수 있다.

 

"ga180n1" 은 MG995 서보모터

"gb180n1"은 HS-311 서보모터

 

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
#include <Servo.h>
 
String _inString;
Servo myservo1;
Servo myservo2;
 
int pos = 0;
bool _state = true;
int _actionState = 0;
int _sPower = 0;
int _armState = 0;
 
String _angle = "";
String _speed = "";
 
void setup() {
  myservo1.attach(16);
  myservo2.attach(17);
  
  myservo1.write(0);
  myservo2.write(0);
  
  Serial.begin(9600);
  Serial.println("Start~");
 
  delay(500);
}
 
void loop() 
{
  if (Serial.available())
  {
    _inString = Serial.readString();
    Serial.println(_inString);
 
    int _indexS = _inString.indexOf('n');  // "gg120n1"
    int _stringLengthS = _inString.length();
    _angle = _inString.substring(2,_indexS);
    _speed = _inString.substring(_indexS + 1, _stringLengthS);    
 
    _inString = _inString.substring(0,2);
    
    if(_inString == "ga")
    {
      _armState = 1;
    }
    else if(_inString == "gb")
    {
      _armState = 2;
    }
    else if(_inString == "gg")
    {
      Active(myservo1, _angle.toInt(), _speed.toFloat()*10);
    }
  } 
 
  if(_armState == 1)
  {
    ArmActive(myservo1, 15, _angle.toInt(), _speed.toFloat()*10);
  }
  else if(_armState == 2)
  {
    ArmActive(myservo2, 15, _angle.toInt(), _speed.toFloat()*10);
  } 
  
  delay(10);
 
void ArmActive(Servo _servo, int _const, int _target, int _speed)
{
  _actionState = 1;
  if(_servo.read() < _target && _const+1 < _target)
  {
    _sPower += 1;
    _servo.write(_sPower);
    delay(_speed);
  }
  else if(_servo.read() > _target && _const-1 < _target)
  {
    _sPower -= 1;
    _servo.write(_sPower);
    delay(_speed);
  }
 
  if(_servo.read() == _target)
  {
    _armState = false;
    _actionState = 0;
    _armState = 0;
    Serial.println(F("done"));
  }
}
 
 
void Active(Servo _servo, int _angle, float _speed)
{
      _state = false;
 
      for (pos = 0; pos <= _angle; pos += 1)
      { 
        _servo.write(pos);
        delay(_speed);
      }
  
      for (pos = _angle; pos >= 0; pos -= 1
      {
        _servo.write(pos);
        delay(_speed);
      }
 
      //_inString = "";
      _state = true;
}
cs

 

 

반응형

댓글