코드 작성하기 코드는 이전 코드와 다소 비슷하며, 주기적으로 서보를 회전시키도록 할 것이기 때문에 3.1 LED & 버튼 예제의 코드와 유사합니다.
맴버 객체/변수 작성 서보 모터 제어를 위해 Servo 클래스 객체와 이를 주기적으로 제어하기 위해 쓰레드, 러너블 클래스 객체를 선언해줍니다. While문 내부는 후에 채우도록 하겠습니다.
private Servo mServo; Thread mThread; Runnable mRunnable = new Runnable() { public void run() { while (true) {
} } };
멤버 객체 초기화 서보 모터를 초기화 하는 방법은 아래와 같습니다. 먼저 모터의 스펙을 알아야 하므로 데이터 시트를 잠시 참고해보겠습니다.
위 내용을 정리해보면, PWM의 주파수는 50㎐, 주기가 50㎳에 PWM의 폭이 1㎳ 일 때 -90도, 2㎳ 일 때 90도, 1.5㎳ 일 때 0도 입니다. 이것을 서보 클래스를 초기화할 때 펄스폭은 1~2㎳, 각도 폭은 -90~90도로 설정해줍니다. 문제는 펄스폭 부분이 정확히 맞지가 않습니다. 심지어 같은 SG90 서보 모터인데도 서로 조금씩 다릅니다. 아래 코드는 필자가 값을 조금씩 바꿔보면서 맞춘 것으로 펄스폭이 원래 1~2㎳이어야 했던 것을 0.75~2.6㎳로 조정했습니다. 여러분들도 실제 하시려면 값을 조금 조정하셔야 할 것입니다.
try { mServo = new Servo("PWM1"); mServo.setPulseDurationRange(0.75,2.6); mServo.setAngleRange(-90, 90); mServo.setEnabled(true); } catch (IOException e) {}
mThread = new Thread(mRunnable); mThread.start();
멤버 함수 작성 처음 멤버 객체/변수 작성 부분에서 비워놓았던 While 문 내부를 여기서 채우도록 하겠습니다. Servo 클래스의 setAngle 함수를 이용해서 서보 모터의 각도값을 입력해줍니다. 첫 루프에서 -90도로 출발한 다음 2초를 대기하고 다시 90도로 출발한 다음 2초 대기하기를 반복하는 코드입니다.
while (true) { try { mServo.setAngle(-90); } catch (IOException e) {}
try { Thread.sleep(2000); } catch (InterruptedException e) {}
try { mServo.setAngle(90); } catch (IOException e) {}
try { Thread.sleep(2000); } catch (InterruptedException e) {} }
전체 코드 아래는 MainActivity.java 파일의 전체 내용입니다. 맨 위의 패키지 부분은 혼란의 여유가 있어서 포함시키지 않았습니다.
import android.app.Activity; import android.os.Bundle;
import com.google.android.things.contrib.driver.pwmservo.Servo;
import java.io.IOException;
public class MainActivity extends Activity { private Servo mServo; Thread mThread; Runnable mRunnable = new Runnable() { public void run() { while (true) { try { mServo.setAngle(-90); } catch (IOException e) {}
try { Thread.sleep(2000); } catch (InterruptedException e) {}
try { mServo.setAngle(90); } catch (IOException e) {}
try { Thread.sleep(2000); } catch (InterruptedException e) {} } } };
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
try { mServo = new Servo("PWM0"); mServo.setPulseDurationRange(0.75,2.6); mServo.setAngleRange(-90, 90); mServo.setEnabled(true); } catch (IOException e) {}
mThread = new Thread(mRunnable); mThread.start(); } }
|