일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- testautomation
- MBLOCK
- 올로
- NocoDB
- 코딩봇
- 업로드모드
- TP4056
- c#
- 아두이노
- Dynamixel
- QA
- 무명의개발자
- chromedriver
- 로보티즈
- 엠블록
- automation
- 크롬드라이버
- Ollo
- 테스트자동화
- 테스트 자동화
- mysql4
- CM-50
- 절벽아래은둔자
- 다이나믹셀
- hutc
- 아두이노코딩봇
- ChatGPT
- 효용감
- Robotis
- arduino
- Today
- Total
Hermit Under the Cliff
[Arduino] 아두이노 코딩봇 만들기 (14) - 서보모터를 이용해 회전하는 머리 달아주기 본문
[Arduino] 아두이노 코딩봇 만들기 (14) - 서보모터를 이용해 회전하는 머리 달아주기
AnonymousDeveloper 2022. 3. 21. 15:44이제 간단하게 달아줄 수 있는 모듈들은 거의 다 달아준 것 같습니다만
실제 로봇 처럼 머리를 움직여 주면 따님이 더 좋아할 것 같습니다.
로봇의 머리에다가 초음파 센서를 옮겨 달아서 고개를 좌우로 돌리면서
좌우의 거리를 측정할 수 있도록 만들어 줄까 합니다.
머리를 움직여 주기 위해서는 모터가 필요합니다.
아두이노 스타터킷에 들어있는 모터 중 SG90이라는 서보모터를 사용해 봅니다.
서보 모터는 0~180도 까지의 지정된 각도로 모터의 움직임을 제어해 줄 수 있습니다.
사용되는 선은 세개로 Vcc, GND와 Signal 선입니다.
각각 5V, GND와 9번 핀에 연결을 해 준 뒤 간단하게 동작확인을 해 줍니다.
#include "Servo.h"
Servo microServo;
int servo = 9;
void setup() {
microServo.attach(servo);
}
void loop(){
microServo.write(30);
delay(500);
microServo.write(50);
delay(500);
microServo.write(70);
delay(500);
microServo.write(90);
delay(500);
microServo.write(110);
delay(500);
microServo.write(130);
delay(500);
microServo.write(150);
delay(500);
}
위 간단한 예제와 같이 Servo.h 라이브러리를 추가해 주면
write 함수를 통해 각도를 써 주는 것만으로도 모터의 방향을 설정해 줄 수 있습니다.
위 코드를 올려서 동작을 확인해 보면
전원이 들어오면 90도의 각도로 캘리브레이션이 되는 걸 확인할 수 있고
로봇의 머리에 알맞는 각도를 체크해 볼 수 있습니다.
서보모터와 로봇의 머리를 고정해주기 위해서 여러 방법을 고민해보다가
아래와 같이 글루건을 이용하여 대부분의 작업을 해버렸습니다.
(만들어서 팔 물건이 아니니 대충 대충 합니다.)
이렇게 하드웨어 작업이 완료가 되었으면 나머지 코드들을 알맞게 작성해 줍니다.
업로드 모드를 위한 Control Protocol은 아래와 같이
Servo와 Head 두 가지를 추가해 주었습니다.
Servo 명령어는 각도를 받아 회전을 시키는 것이고
Head 명령어는 지정된 각도로 왼쪽,오른쪽,중간 부분을 바라보게 하는 명령입니다.
/* Control protocol
@[Target(1)][Length(2)][Data]#
Servo :
Angle (Example @S0290# : Set servo angle to 90 dgree)
Head :
SR[Angle] : Set right angle to [Angle]
SL[Angle] : Set left angle to [Angle]
SC[Angle] : Set center angle to [Angle]
TR : Turn head to right
TL : Turn head to left
TC : Trun head to center
*/
이 동작을 위한 코드는 아래와 같이 작성하였습니다.
int rightAngle = 30;
int leftAngle = 150;
int centerAngle = 90;
switch(target){
case 'S': // Servo control
microServo.write(data.toInt());
break;
case 'H': // Head control with servo
if (data.equals("TR"))
{
microServo.write(rightAngle);
}
else if (data.equals("TL"))
{
microServo.write(leftAngle);
}
else if (data.equals("TC"))
{
microServo.write(centerAngle);
}
else
{
String setCommand = data.substring(0,2);
int targetValue = data.substring(2).toInt();
if(setCommand.equals("SR"))
{
rightAngle = targetValue;
}
else if(setCommand.equals("SL"))
{
leftAngle = targetValue;
}
else if(setCommand.equals("SC"))
{
centerAngle = targetValue;
}
}
break;
}
이제 시리얼 명령을 이용해서 머리의 각도를 조절할 수 있게 되었으니
블록들도 아래와 같이 만들어 줍니다.
위의 두개의 블록은 H 명령어셋을 사용하여 왼쪽, 오른쪽, 정면을 바라볼 수 있게 하거나
각 방향의 각도를 변경할 수 있도록 하였습니다.
마지막 블록은 S 명령어셋을 사용하여 직접 서보모터의 각도를 설정할 수 있습니다.
(args, app, device, block) => {
// JavaScript code
var dir;
if (block.arguments.direction == 'right') {
dir = "SR";
}
else if (block.arguments.direction == 'left') {
dir = "SL";
}
else {
dir = "SC";
}
var length = block.arguments.angle.length + 2;
var strLength = String(length);
var command = "@H" + strLength.padStart(2, '0') + dir + block.arguments.angle + "#";
device.writeText(command);
}
머리의 방향에 따른 각도를 설정하는 라이브 모드의 코드를 예로 보시면
위와 같이 direction argument에 따라서 명령어를 정의하고 (SR,SL,SC)
이를 전달받은 각도와 함께 명령어로 만들어 전달하고 있습니다.
또한 이 블록의 목적이 모터의 영점이 틀어졌을때 조정을 하려고 만든 것이기 때문에
업로드 모드의 코드에서는 code: 부분이 아닌 setup: 부분에 아래의 코드를 추가하였습니다.
/*{{this.direction}}*/Angle = /*{{this.angle}}*/;
나머지 블록들도 비슷한 형식으로 작성을 해 주시면 됩니다.
자세한 코드는 깃허브에 올라가 있는 extension 파일을 참고하시면 되겠습니다.
이제 처음에 목표했던 모든 기능을 로봇에 장착을 해 주는 것 까지는 하였는데
이상하게도 8x8 dot matrix와 서보모터를 함께 동작을 시켜주면
뭔가 제가 원하는대로 동작을 하지 않습니다.
dot matrix에는 이상한 그림이 나올 때도 있고
서보모터는 계속 마음대로 막 돌아가고 이상합니다.
아두이노에 연결해 놓은 모듈들의 전원선을 아두이노 5v 핀에 묶어서 연결을 해놓아서
전류가 부족한게 아닌가 생각이 됩니다.
찾아보니 5v output의 최대전류는 20mA로 권장하고 있네요.
이 문제를 해결하기 위해서 다음 포스트에서는
제가 설계한 하드웨어 구성을 알아보도록 하겠습니다.
역시나 모든 코드들은 깃허브에서 확인 가능합니다.
https://github.com/reitn/OlbinBot
GitHub - reitn/OlbinBot: Olbin Coding bot based on Arduino and Mblock
Olbin Coding bot based on Arduino and Mblock. Contribute to reitn/OlbinBot development by creating an account on GitHub.
github.com
'Personal Projects > 아두이노 코딩봇' 카테고리의 다른 글
[Arduino] 아두이노 코딩봇 만들기 (16) - 엠블록 변수 사용 (0) | 2022.03.22 |
---|---|
[Arduino] 아두이노 코딩봇 만들기 (15) - 하드웨어 구성 (0) | 2022.03.21 |
[Arduino] 아두이노 코딩봇 만들기 (13) - 8x8 LED Dot Matrix 장착 (0) | 2022.03.18 |
[Arduino] 아두이노 코딩봇 만들기 (12) - 속도조절을 위한 버튼 (0) | 2022.03.08 |
[Arduino] 아두이노 코딩봇 만들기 (11) - 초음파 센서 추가하기 (0) | 2022.03.03 |