ImJa 보드에서 시리얼 통신에 이어 GPIO를 제어하는 방법을 알아 보겠습니다. ImJa 보드에는 입력과 출력으로 설정해서 사용할 수 있는 GPIO  8개 핀을 제공합니다. 이 글에서 소개하는 샘플에서는 GPIO 8개 핀 중 4개를 출력으로 설정하고 나머지 4개 GPIO 핀을 입력을 설정한 후, GPIO 입력 값에 따라 출력합니다.

Java만으로 GPIO를 제어할 수 있고 사용하는 API도 매우 단순해서 Java 초보자라도 30분 정도 익히면 무리 없이 코드를 작성할 수 있습니다.

001 ImJa-GPIO.png ▲ 사진에서 (1)이 ImJa 보드입니다. (2) 헤드핀에 전원과 GND, GPIO 핀을 가지고 있지요. (3) LED 보드에 GPIO 출력 핀과 연결하고 (4) 버튼이 있는 보드에 GPIO 입력 핀을 연결했습니다. 어떻게 ImJa 보드에서 Java 언어만으로 GPIO를 제어하는 지 프로그램 작성해 볼까요?

프로젝트 생성


ImJa 보드에서 Java 언어만으로 프로그램을 작성하기 위해서는 Java 프로젝트에 ImJa 라이브러리를 사용할 수 있도록 준비해야 합니다. 아래 글을 참고해서 GpioSample 프로젝트를 생성하고 ImJa.jar 파일과 jsch.jar 파일을 lib 폴더에 올립니다. 그리고 컴파일을 위한 build.properties와 build.xml 파일을 생성한 후 Ant에 등록하세요. 물론, 이 방법도 아래 링크에 자세히 나와 있습니다.


002 ImJa-GPIO.png
▲ 이클립스에 Java 프로젝트를 생성한 후 lib 폴더를 만들고 imja.jar과 jsch.jar 파일을 복사하고 환경 파일에 등록했습니다.

003 ImJa-GPIO.png
▲ 소스를 생성하기 위해 프로젝트 이름에서 마우스 우측 버튼을 클릭하고 New>>Class를 선택합니다.

004 ImJa-GPIO.png
▲ Package 이름에 gpioSample를, Name에는 GpioSample를 입력합니다. 

프로그램 소스 입력

생성된 소스 파일에 아래 프로그램 소스를 입력합니다.
package imja.sample;

import com.falinux.imja.Gpio;
import com.falinux.imja.Poll;

public class GpioExample extends Gpio {

	private Poll poll = null;

	public GpioExample(String driverNm) {
		super(driverNm);
		
		poll = new Poll();
		open();
		
		// output address set
		addOutputAddress(1);
		addOutputAddress(2);
		addOutputAddress(3);
		addOutputAddress(4);
		
		// input address set
		addInputAddress(5);
		addInputAddress(6);
		addInputAddress(7);
		addInputAddress(8);

		// 출력 초기화
		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;
  }

	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.pollDoLoop(100);

			tmCurrent = System.currentTimeMillis();

			if ((tmCurrent - tmBefore) > 300) {
				tmBefore = tmCurrent;
				onTimer();
			}
		}
	}
	public static void main(String[] args) {

		 new GpioExample( "/dev/dev-imja_gpio").run();
	}

}
005 ImJa-GPIO.png
▲ 이클립스에 소스코르를 입력한 모습입니다.

프로젝트 빌드 및 실행

006 ImJa-GPIO.png
▲ Ant에서 "target_device_upload"를 클릭합니다. Console 패널에 "BUILD SUCESSFUL" 메시지가 나오면 소스 컴파일과 ImJa 보드로 실행 파일이 전송된 것 입니다.

007 ImJa-GPIO.png
▲ ImJa 보드로 로그인한 후 /home으로 이동합니다. 그리고 아래 명령으로 프로그램을 실행합니다.

# java -cp appGpioSample gpioSample.GpioSample  /dev/dev-imja_gpio

008 ImJa-GPIO.png
▲ (1)입력으로 버튼을 누르면 (2)해당 번호의 LED가 켜집니다.

프로그램 소스를 보면 입력과 출력 제어 부분이 매우 간결하다는 것을 볼 수 있습니다. 다음 글에서 소스를 자세히 분석하겠습니다.