자바 ME 8로 라즈베리 파이 IoT 구축: 1부 – GPIO 센서 연동
개요
자바 ME 8로 라즈베리 파이에서 센서를 연결하고 제어해 강력한 IoT 기능을 구현하는 방법을 알아봅니다.
2014년 9월 발행
자바 ME 8 최신 릴리스는 LED, 릴레이, LCD, 센서, 모터, 스위치 제어를 단순화하는 견고한 Device I/O API를 도입했습니다.
이 문서는 라즈베리 파이 모델 B를 GPIO, I²C, SPI, UART 인터페이스로 전자 센서와 통합하는 3부작 시리즈의 시작입니다.
이 인터페이스로 자바 ME 8을 활용해 장치를 구동하면 완전한 기능을 갖춘 IoT 생태계를 구축할 수 있습니다.
이번 편에서는 GPIO에 초점을 맞춰 다음을 위한 즉시 사용 가능한 자바 ME 8 클래스를 제공합니다:
- DFRobot DFR0076 화염 센서로 화염 감지
- HC-SR501 PIR 센서로 모션 감지
- HC-SR04 초음파 모듈로 거리 측정
참고: 전체 소스 파일을 포함한 NetBeans IDE 8.0 프로젝트는 여기에서 다운로드 가능합니다.
Device I/O API 개요
Device I/O API 사양은 임베디드 플랫폼에서 자바 애플리케이션을 위한 범용 주변장치 I/O 인터페이스를 정의합니다. 다음과 같은 일반적인 장치를 다룹니다:
- GPIO, I²C, SPI, UART
- ADC 및 DAC
- 메모리 매핑 I/O
- AT 명령 모듈
- 워치독 타이머와 펄스 카운터
- PWM 생성기와 일반 장치
주요 회로 고려사항
모든 라즈베리 파이 GPIO 핀은 3.3V에서 동작합니다. 센서 연결 전 전압 요구사항을 확인하세요. 장치가 5V를 기대하면 로직 레벨 컨버터(예: BSS138 MOSFET 기반 시프터)를 사용해 신호를 안전하게 변환하세요.
화염 감지기 연결
DFR0076 화염 센서는 ~760nm~1100nm 파장의 빛을 감지하며 감지 범위는 20~100cm입니다. 화염이 있으면 신호 핀이 HIGH로 풀업됩니다.
도면 3과 같이 센서를 파이의 3.3V, GND, GPIO 22에 배선한 후 제어용 자바 ME 8 클래스를 생성합니다.
Listing 1 – DFR0076Device 클래스
public class DFR0076Device {
private GPIOPin pin = null; // 화염 센서 제어용 핀
}
Listing 2 – GPIO 핀 초기화
public DFR0076Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_UP,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
}
Listing 3 – 리스너 등록
public void setListener(PinListener flameListener) {
if (pin != null) {
pin.setInputListener(flameListener);
}
}
Listing 4 – 리소스 정리
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Listing 5 – 화염 센서 사용하는 MIDlet
public class TestSensors extends MIDlet {
private DFR0076Device flame;
private static final int FLAME_DETECTOR_PIN = 22;
public void startApp() {
flame = new DFR0076Device(FLAME_DETECTOR_PIN);
flame.setListener(new FlameSensor());
}
public void destroyApp(boolean unconditional) {
flame.close();
}
private static int waitNext = 1;
private class FlameSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue() && --waitNext == 0) {
System.out.println("WARNING Flame detected!!!");
waitNext = 10;
}
}
}
}
모션 감지기 연결
모션 감지 시 3.3V 펄스를 출력하는 HC-SR501 PIR 센서를 통합합니다. 센서의 세 핀은 GND, VCC(3~5V), 디지털 출력입니다.
PIR의 감도와 지연을 포텐셔미터로 조정하고, 점퍼를 'L'(단일 트리거) 또는 'H'(반복 트리거)로 설정합니다.
PIR을 5V, GND, GPIO 24에 배선한 후 전용 HCSR501Device 클래스로 MIDlet을 확장합니다.
Listing 6 – HCSR501Device 클래스
public class HCSR501Device {
private GPIOPin pin = null;
}
Listing 7 – 3초 지연 포함한 핀 초기화
public HCSR501Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_DOWN,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
I2CUtils.I2Cdelay(3000); // 센서 안정화 대기
}
Listing 8 – 모션 리스너 등록
public void setListener(PinListener pirListener) {
if (pin != null) {
pin.setInputListener(pirListener);
}
}
Listing 9 – 정리
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
TestSensors MIDlet을 확장해 모션 이벤트 처리:
Listing 10 – PIR 지원 MIDlet
// PIR 센서 초기화
private HCSR501Device pir;
private static final int MOTION_DETECTOR_PIN = 24;
@Override
public void startApp() {
pir = new HCSR501Device(MOTION_DETECTOR_PIN);
pir.setListener(new PirSensor());
}
@Override
public void destroyApp(boolean unconditional) {
pir.close();
}
private class PirSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue()) {
System.out.println("WARNING Motion detected!!!");
}
}
}
더 깊은 내용은 전체 시리즈 참조: 자바 ME 8 + 라즈베리 파이 + 센서 = IoT 월드 (1부)