ImJa 솔루션
글 수 23
2015.05.29 13:58:53 (*.134.169.166)
6490
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 출력 핀의 값도 켜지거나 꺼지게 됩니다.