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 출력 핀의 값도 켜지거나 꺼지게 됩니다.