ImJa 솔루션
글 수 23
2015.05.29 13:58:53 (*.134.169.166)
8282
ImJa보드를 이용하면 Java 초보자도 30분 만에 GPIO 제어를 할 수 있습니다.
물론 Ctrl-C, Ctrl-V는 아니구요, ImJa보드에서 제공하는 GPIO 제어 API를 이용하면
매우 간단히 프로그램을 작성할 수 있습니다.
샘플 프로그램 설명하기 전에 GPIO를 간단히 말씀 드리면,
GPIO는 설정에 따라 입력이 될 수도, 출력이 될 수도 있습니다.
예를 들어 스위치 4개를 입력 받고, 각 스위치별로 형광등을 켜고 끈다면
프로그램을 시작할 때 GPIO 4개 핀을 스위치를 위해 입력으로 설정하고,
형광등을 위해 GPIO 4개 핀을 출력으로 설정해서 사용하면 됩니다.
자, 초보자도 30분이면 GPIO를 제어할 수 있는 ImJa보드
샘플 소스 코드를 보실까요?
package imja.sample; // 패키지 이름 import com.falinux.imja.Gpio; // ImJa보드 라이브러리에서 GPIO 객체 import import com.falinux.imja.Poll; // ImJa보드 라이브러리에서 Poll 객체 import
public class GpioExample extends Gpio {
// GPIO를 제어하는 코드에서도 Poll 함수를 사용합니다. // Poll 함수를 이용하면 타이머 함수를 구현하기 쉽고 // 키보드 입력을 시리얼이나 소켓 통신처럼 처리할 수 있습니다.
private Poll poll = null;
public GpioExample(String driverNm) {
super(driverNm);
poll = new Poll();
open();// 아래 부분이 GPIO 핀을 입력과 출력으로 설정하는 부분입니다. // ImJa보드에는 총 8개의 GPIO 핀을 가지고 있습니다. // 각각의 핀을 입력 또는 출력으로 설정할 수 있는데, // 본 샘플 코드에서는 1번부터 4번 핀까지를 출력으로 // 5번에서 8번 핀까지는 입력으로 설정했습니다. // output address set addOutputAddress(1); addOutputAddress(2); addOutputAddress(3); addOutputAddress(4); // input address set addInputAddress(5); addInputAddress(6); addInputAddress(7); addInputAddress(8);
// GPIO 핀을 출력으로 설정하고 아무런 값을 지정하지 않으면 // 하드웨어 설계에 따라서 원치 않는 출력이 발생할 수 있습니다. // 프로그램 시작하자 마자 모터를 돌리거나 형광등을 켜서는 안 되겠지요. // 이런 문제를 없애기 위해 GPIO 출력 PIN에 대해서는 // 하드웨어 설계에 따라 0 또는 1로 반드시 초기화 합니다.
// 출력 초기화
write(1, 0);
write(2, 0);
write(3, 0);
write(4, 0);
poll.rebuild();
}
@Override
public int onDisconnect(long arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int onError(long arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int onHup(long arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int onRead(long arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int onTimeOut(long arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int onWrite(long arg0) {
// TODO Auto-generated method stub
return 0;
}
// Poll 함수를 이용하면 아래와 같이 타이머를 쉽게 구현할 수 있습니다. // 본 샘플에서는 300msec마다 onTimer() 함수가 호출됩니다. // 타이머에서는 입력 값을 그대로 출력 핀으로 출력합니다.
private void onTimer() {
write(1, read(5) == 1 ? 0:1);
write(2, read(6) == 1 ? 0:1);
write(3, read(7) == 1 ? 0:1);
write(4, read(8) == 1 ? 0:1);
}
public void run() {
long tmCurrent = 0L;
long tmBefore = 0L;
while (true) {// Poll 함수는 인수로 지정한 시간만큼 sleep 상태가 되며 // 체크를 원하는 이벤트가 발생하면 바로 복귀합니다. // 본 샘플에서는 Poll함수에 이벤트를 등록하지 않았으므로 // 지정된 시간만큼 sleep가 됩니다. // Poll에 대해서는 곧 자세한 글을 올리겠습니다.
poll.pollDoLoop(100);
// 현재 시간을 비교해서 300msec가 지나면 // 타이머 함수를 호출합니다.
tmCurrent = System.currentTimeMillis();
if ((tmCurrent - tmBefore) > 300) {
tmBefore = tmCurrent;
onTimer();
}
}
}
public static void main(String[] args) {
new GpioExample( "/dev/dev-imja_gpio").run();
}
}
샘플 코드에서는 300msec마다 GPIO 입력 핀의 값을 읽어서는 1또는 0 값을 그대로 GPIO 출력 핀으로 출력하고 있습니다. 만일 입력 쪽에 스위치를 연결해서 On 또는 Off 하면 해당 GPIO 출력 핀의 값도 켜지거나 꺼지게 됩니다.


