문의하신 질문을 확인했습니다.
1. 적외선 리모컨은 적외선 송수신 범위가 짧기 때문에 바로 반응을 안하는 경우가 생길 수 있습니다.
2. 해당 서보모터 제어의 범위값을 사용자께서 지정하시고 그 범위안에서 제어문을 응용하셔야 합니다.
3. 아두이노에 코드를 업로드하고 PC와 분리 후 9V 어댑터 또는 배터리를 이용하여 전원공급시,
업로드한 코드가 돌아가는 것이 정상입니다. 배터리를 이용한 전원공급시, 배터리 소모량에 따라
출력전압이 낮아질 수 있으며, 이런 경우 전원공급 어댑터 사용을 권장해드릴 수 있습니다.
감사합니다.
[ Original Message ]
리모컨으로 서보모터 제어하는 방법 질문한 사람입니다.
일단 세팅을 해서 성공은 했는데요 3가지 질문이 있습니다.
1. 리모컨을 눌렀을때 작동을 할때가 있고, 작동을 안할때가 있습니다. 여러번 눌러야 반응하는데 이것은 리모컨 자체의 문제인가요 아니면 뭔가 코드상 문제인가요?
2. 모터가 원하는데 까지 작동을 하고나서도 계속해서 모터가 도는 소리가 들립니다(모터는 돌아가는데 실제로 기어는 안움직임).... 원하는 각도까지 움직이고나서 모터가 동작이 딱 종료되는 방법은 없나요?
3. USB를 이용해 컴퓨터에 연결해서 작동시킬때는 작동을 하는데 9V건전지로 전원을 연결하면 작동하지 않습니다. 직류 전원 공급시에는 따로 명령어를 또 넣어줘야 하나요?
영상으로 찍어올려볼 했는데 찍을때는 작동을 안하고 녹화를 안하면 작동을해서 못찍었습니다....
입력한 코드는 다음과 같습니다.
#include <Servo.h> // 서보모터 라이브러리
#include <IRremote.h> // 적외선 리모컨 라이브러리
int remote = A0; // 적외선 리모컨 수광 다이오드 신호선
int motor = 7; // 서보모터
Servo servo; // servo 라이브러리를 사용해주기 위해 servo객체 생성
IRrecv irrecv(remote); // IRremote를 사용해주기 위해 irrecv객체 생성
decode_results results; // 디코드한 결과값
int angle = 0; // 서보모터 각도 값
void setup() {
servo.attach(motor); // 모터 시작
irrecv.enableIRIn(); // 수광 다이오드 시작
pinMode(motor,OUTPUT); // 모터 출력
pinMode(remote, INPUT); // 수광 다이오드 입력
}
void loop() {
if (irrecv.decode(&results)){ // 적외선 리모컨의 신호를 받을 때
switch (results.value) {
case 0xA3C8EDDB: // + 버튼을 눌렀을 때
angle += 90; // 각도값 90 추가
if (angle > 180) // 각도가 180이 넘어갈 때
angle = 180; // 각도값 최대를 180으로
servo.write(angle); // 서보모터 각도 이동
break;
case 0xF076C13B: // - 버튼을 눌렀을 때
angle -= 90; // 각도값 90 감소
if(angle < 0) // 각도값이 0도보다 적을 때
angle = 0; // 각도값 최소값을 0으로
servo.write(angle); // 서보모터 각도 이동
break;
}
irrecv.resume(); // 수광 다이오드 다음 값 받기
}
}