서보 모터를 돌리다 보면, 항상 160도 정도만 돌아갔는데, 서보 모터 종류에 따라 다르겠지만, MG996R, SG90, TD-8125MG 세 종류에 최종 테스트를 해본다.
(결론은 servo.attach(servoPin, 360, 2600)으로 초기화할 것. 아날로그 피드백 값으로 확인하면서 수치 조정을 한 값임)
MG996R의 경우, servo.attach(pin, 350, 2750)으로 수치를 설정했을 때 180도 이상 돌아갔다. 아날로그 피드백으로 개조했는데 그 출력값이, 같은 MG996R이라도 하더라도 개개 제품마다 조금씩 다른 듯하다. 로봇암 부위에 들어가는 모터 별로 번호를 기록해서 그 번호대로 별도의 피드백 범위를 설정해줘야 한다는 이야기겠지. 이 이야기들을 확인해보자.
아래 코드에서 500, 2500 되어 있는 것(180도에 근접했음)을 350, 2750 으로 변경해주니 드디어 180를 넘어 돌기 시작했다. 이 값을 조정하면서 아날로그 피드백 값을 검토해보면 가장 넓은 회전각일 대의 이 수치를 알 수 있다.
* MG996R 몇 대 테스트해보니 모두 180도를 넘어갔다.
* 이제 SG90: 와우, 이것도 몇 대 테스트했는데 모두 180도를 넘어갔다.
* 이제 TD-8125 : 두 대 테스트를 해보니 모두 다른 제품과 마찬가지로 180도를 넘어서 회전했다.
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup() {
myservo.attach(11, 350, 2750);
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
나는 제일 넓은 회전각을 찾아냈다고 자부하는데, 다른 코드로 재확인을 해보자.
#include <Servo.h>
int servoPin = 11;
int feedbackPin = A0;
int feedbackValue;
Servo myservo;
void setup()
{
Serial.begin(9600);
myservo.attach(servoPin, 360, 2600);
myservo.write(0);
for (int servoPos = 0; servoPos <=180; servoPos = servoPos + 1){
myservo.write(servoPos);
delay(100);
feedbackValue = analogRead(feedbackPin);
Serial.print("Position = ");
Serial.print(servoPos);
Serial.print("\t");
Serial.println(feedbackValue);
}
myservo.write(0);
Serial.println("Finished!");
}
void loop() { }
오차가 좀 발생한다. 마지막에 178~180도 사이에 간격이 넓어지면서 약 2도 정도 오차가 나고, 0도 근처에서는 다들 비슷하다.
MG996R만 확인해본 것으로, 나머지 기종은 아직 피드백 개조를 하지 않아서 잘 모르겠다.
결국, servo.attach(servoPin, 360, 2600) 으로 해야할 것 같다.
한 녀석의 출력 결과:
Position = 0 12
Position = 1 12
Position = 2 12
Position = 3 16
Position = 4 20
Position = 5 25
Position = 6 33
Position = 7 33
Position = 8 38
Position = 9 40
Position = 10 43
Position = 11 48
Position = 12 52
Position = 13 54
Position = 14 60
Position = 15 62
Position = 16 65
Position = 17 71
Position = 18 73
Position = 19 76
Position = 20 79
Position = 21 83
Position = 22 87
Position = 23 93
Position = 24 97
....
Position = 133 490
Position = 134 489
Position = 135 491
Position = 136 498
Position = 137 505
Position = 138 502
Position = 139 509
Position = 140 513
Position = 141 516
Position = 142 522
Position = 143 522
Position = 144 529
Position = 145 529
Position = 146 533
Position = 147 534
Position = 148 538
Position = 149 545
Position = 150 549
Position = 151 552
Position = 152 557
Position = 153 562
Position = 154 567
Position = 155 566
Position = 156 570
Position = 157 571
Position = 158 577
Position = 159 581
Position = 160 595
Position = 161 584
Position = 162 593
Position = 163 596
Position = 164 599
Position = 165 600
Position = 166 603
Position = 167 610
Position = 168 616
Position = 169 618
Position = 170 621
Position = 171 621
Position = 172 629
Position = 173 631
Position = 174 638
Position = 175 636
Position = 176 642
Position = 177 646
Position = 178 650
Position = 179 653
Position = 180 657
Finished!