소스코드
아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드해봅니다.
// 아두이노 서보모터 각도제어 실험
int i,val;
char a[3];
boolean display;
#include <Servo.h>
Servo servo1;
void setup()
{
Serial.begin(9600);
servo1.attach(4);//서보모터를 핀4에 연결
}
void loop()
{
if (Serial.available()){ //시리얼입력이 있으면
delay(30); //시리얼입력이 모두 전송되는 시간을 벌기위해 30ms 딜레이
if (Serial.available() <= 3){ //입력된 데이터가 <=3 인경우
while (Serial.available()){ //입력된 데이터를 모두 읽어온다
a[i++] = Serial.read(); //a[]버퍼에 모두 저장
}
display = 1; //데이터를 모두 읽은 후 표시 플래그를 ON
}
else { //입력된 데이터가 >3 인 경우
Serial.flush(); //시리얼버퍼 클리어
}
}
if (a[0] == 43 && display){
val++;
servo1.write(val);
Serial.println(val);
display = 0; //표시 플래그 OFF
Serial.flush(); //시리얼버퍼 클리어
for (i = 0; i <= 3; i++) //A[]버퍼 클리어
{
a[i] = 0;
}
i = 0; //i 변수 초기화
}
if (a[0] == 45 && display){
val--;
servo1.write(val);
Serial.println(val);
display = 0; //표시 플래그 OFF
Serial.flush(); //시리얼버퍼 클리어
for (i = 0; i <= 3; i++) //A[]버퍼 클리어
{
a[i] = 0;
}
i = 0; //i 변수 초기화
}
//======================== 데이터 검증 ======================
if (display) //표시 플래그가 ON 이면 a[]어레이의 값을 표시
{
if (!a[2]){ //입력된 값이 두자리이면
if (!a[1]){ //입력된 값이 한자리이면
a[2] = a[0];
a[1] = 48; //48은 ASCII 코드에서 0 에 해당
a[0] = 48;
}
else { //두자리인 경우
a[2] = a[1];
a[1] = a[0];
a[0] = 48;
}
}
//== A[]버퍼의 값을 각도로 변환한 후 서보모터로 전송하고 화면출력 ==
for (i=0;i<=3;i++){ //char 변수를 int 변수로 변환
a[i] -= 48;
}
val = 100*a[0] + 10*a[1] + a[2];
servo1.write(val);
Serial.println(val);
display = 0; //표시 플래그 초기화
Serial.flush(); //시리얼버퍼 초기화
for (i = 0; i <= 3; i++) //a[]버퍼 초기화
{
a[i] = 0;
}
i = 0; //i변수 초기화
}
}
아두이노 IDE에서 시리얼 모니터 창을 열어서 아래와 같이 0~180도의 각도를 입력하면 입력한 위치로 회전함을 알 수 있습니다.