임베디드 프로그래밍 Lecture #03 2017. 9. 25.

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

                                  9장 컴퓨터 기반 데이터 수집의 기초.
Vision System Lab, Sang-Hun Han
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
Analog to Digital Converter
10. 예외 처리.
AVR 실습.
인터럽트 종류 인터럽트 요구시 I/O장치 인식 방법
임베디드 프로그래밍 Lecture #
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
IoT(사물인터넷) 보안 2016년 2학기 2. 라즈베리파이 준비.
Smart IoT 설계 시스템 Lecture 07. 센서와 액츄에이터 실습.
                                  8장 A/D 변환기 A/D Converter? A/D Converter 원리 Bit 수와 최대범위 및 해상도와의 관계.
                                  7장 D/A 변환기 D/A Converter? D/A Converter 원리 Bit 수와 최대범위 및 해상도와의 관계.
2013 스마트 컨트롤러 중간 프로젝트 김성엽 진종영 조유진
아날로그 입력과 출력.
제어기술 소개 목표 : 제어기의 종류, 제어 방식 등을 살펴본다. 주요내용 제어기의 종류 제어방식 : 시퀀스, 피드백, 등.
아두이노 기반 펌웨어 개발 FUTURE INNOVATOR 강사: 김 영 준 ㈜헬로앱스
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
임베디드 프로그래밍 Lecture #
제7장 제어구조 I – 식과 문장.
임베디드 프로그래밍 Lecture #
Lesson 3. 입출력과 제어문.
GPIO RaspberryPi Sejin Oh.
임베디드 프로그래밍 Lecture #
임베디드 프로그래밍 Lecture #
UNIT 06 JTAG Debugger 로봇 SW 교육원 조용수.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
명품 Java Programming.
독립형 모션제어기 사양 - Catalog (optional) XMC-PO04-MOD
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
DK-128 ADC 실습 아이티즌 기술연구소
WinCE Device Driver 실습 #3
WinCE Device Driver 실습 #2
주소록 프로그램.
DK-128 실습 EEPROM 제어 아이티즌 기술연구소
타이머카운터 사용법 휴먼네트웍스 기술연구소
ATmega128 FND 실습 휴먼네트웍스 기술연구소
DK-128 FND 실습 아이티즌 기술연구소 김태성 연구원
Microprocessor I/O Port & CLCD Noh Jin-Seok.
Method & library.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
DataScience Lab. 박사과정 김희찬 (월)
RPi2 SPI 8x8 Dot Matrix LED
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
임베디드 프로그래밍 Lecture #
SSH, VNC Mobile Engineering, Kyungwoon Univ. Embedded System Design.
임베디드 프로그래밍 Lecture #
DK-128 FND 실습 아이티즌 기술연구소
Lesson 2. 기본 데이터형.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
DK-128 실습 내부 EEPROM 제어 아이티즌 기술연구소 김태성 연구원
DK-128 실습 타이머카운터 사용법 아이티즌 기술연구소
컴퓨터공학실습(I) 3주 인공지능연구실.
자바 5.0 프로그래밍.
UNIT 25 SPI 로봇 SW 교육원 조용수.
7. 실제 세계와의 통로 센서 정보영재 석사 김석전.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
DK-128 개발환경 설정 아이티즌 기술연구소
DK-128 직렬통신 실습 아이티즌 기술연구소
UNIT 25 SPI 로봇 SW 교육원 조용수.
AdcRead API 함수 분석 마이크로프로세서.
아두이노 프로그래밍 Lecture #
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
Progress Seminar 양승만.
임베디드 프로그래밍 Lecture #
Presentation transcript:

임베디드 프로그래밍 Lecture #03 2017. 9. 25

목 차 라즈베리파이의 장치 제어 디지털 출력 및 입력 테스트 디지털 입력 이벤트 처리 테스트 아날로그 입출력 테스트 I2C 통신 테스트 UART 통신 테스트

라즈베리파이의 장치 제어 (1) IoT 단말 장치의 구성 Sensors Communication Device Controller Sensors Actuator Communication Device

라즈베리파이의 장치 제어 (2) 라즈베리파이의 장치 제어 Communication Interface GPIO IO Digital Input(DI) 26개의 GPIO Digital Output(DO) Ethernet Analog Input(DI) WiFi PWM 지원 Analog Output(DO) Serial Comm. Bluetooth 2 채널 지원 SPI Communication Interface I2C UART Device Interface

라즈베리파이의 장치 제어 (3) 라즈베리파이의 입출력 핀 구성

디지털 출력 및 입력 테스트 (1) 버튼 입력 처리 택 스위치(Tact Switch) 버튼 입력 회로 구성 GPIO Pin GND (2) Pull-up 회로 GPIO Pin Vcc (1) Pull-down 회로 Vcc 10kΩ 10kΩ GND

디지털 출력 및 입력 테스트 (2) 버튼 입력 테스트 회로 LED – gpio 17(11) Led Button – gpio 23(16) Exit Button – gpio 24(18) 동작: Led button 입력에 따라 LED on-off Exit button 입력 시에 프로그램 종료

디지털 출력 및 입력 테스트 (3) 버튼 입력 테스트 프로그램 import java.io.IOException; import jdk.dio.DeviceManager; import jdk.dio.gpio.GPIOPin; public class PushButton { private static final String LED_PIN = "GPIO17"; private static final String LED_BTN = "GPIO23"; private static final String EXIT_BTN = "GPIO24"; private GPIOPin ledPin; private GPIOPin ledBtnPin; private GPIOPin exitBtnPin; public PushButton() { super(); this.ledPin = DeviceManager.open(LED_PIN, GPIOPin.class); this.ledBtnPin = DeviceManager.open(LED_BTN, GPIOPin.class); this.exitBtnPin = DeviceManager.open(EXIT_BTN, GPIOPin.class); System.out.println("Devices successfully opened..."); } public void run() throws IOException { boolean exit = false; boolean led = false; try { while (!exit) { led = ledBtnPin.getValue(); ledPin.setValue(led); System.out.System.out.println("LED: " + (led?"ON":"OFF")); exit = exitBtnPin.getValue(); Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println("Exit..."); close();

디지털 출력 및 입력 테스트 (4) 버튼 입력 테스트 프로그램 (계속) public void close() throws IOException { ledPin.close(); ledBtnPin.close(); exitBtnPin.close(); } public static void public static void main(String[] args) { PushButton pushButton = new PushButton(); pushButton.run();

장치타입 정의에 의해 장치의 기본 속성값이 결정 디지털 출력 및 입력 테스트 (5) 버튼 입력 테스트 프로그램 – 장치 레지스트리 # RPi P3 header pins 17 = deviceType: gpio.GPIOPin, pinNumber:17, name:GPIO17, mode:4, direction:1, predefined:true 23 = deviceType: gpio.GPIOPin, pinNumber:23, name:GPIO23, mode:2, direction:0, predefined:true 23 = deviceType: gpio.GPIOPin, pinNumber:24, name:GPIO24, mode:2, direction:0, predefined:true gpio.GPIOPin = initValue:0, deviceNumber:0, direction:0, mode:1, trigger:0, predefined:true 장치이름 장치번호 장치타입 정의에 의해 장치의 기본 속성값이 결정

디지털 출력 및 입력 테스트 (6) 버튼 입력 테스트 프로그램 – 장치 레지스트리 속성 장치번호 & 장치이름 – 장치 식별자 deviceType – 장치 타입 선언에 의해 장치의 기본 속성값을 정의 pinNumber – GPIO 장치 속성으로 입출력 핀의 GPIO pin 번호 mode – GPIO pin 모드 정의 pull-up input(1), pull-down input(2) push-pull output(4), open-drain output(8) direction – GPIO pin의 입출력 방향 정의 입력전용(0), 출력전용(1), 초기입력 양방향(2), 초기출력 양방향(3) predefined – 장치 속성 정보의 수정 가능 여부 true – 프로그래밍에 의해 속성 정보 수정 가능, false – 수정 불가능 initValue – 출력 GPIO pin의 초기값 trigger - GPIO pin의 입력 모드에서의 트리거 모드 지정 no-trigger(0), rising-edge(1), falling-edge(2), both-edges(3)

디지털 출력 및 입력 테스트 (7) 버튼 입력 테스트 프로그램 – 장치 보안 정책 build.xml 파일 수정 grant { permission jdk.dio.DeviceMgmtPermission "*:*", "open"; };

디지털 출력 및 입력 테스트 (8) 버튼 입력 테스트 프로그램 – 실행 환경 설정 프로젝트 속성(properties) 설정 메뉴 선택

디지털 출력 및 입력 테스트 (9) 버튼 입력 테스트 프로그램 – 테스트 원격 실행 원격 디버깅 버튼 입력 처리 동작의 타이밍 지연 문제 버튼 입력에 대한 1초 주기의 폴링(polling)에 의해 야기 디지털 입력에 대한 트리거 이벤트(trigger event) 처리로 해결

디지털 입력 이벤트 처리 (1) 버튼 입력 이벤트 처리 디지털 입력 이벤트 모델 Device I/O 라이브러리는 하드웨어 인터럽트 혹은 소프트웨어 시그널을 처리하 기 위한 이벤트 모델을 제공

디지털 입력 이벤트 처리 (2) 버튼 입력 이벤트 처리 프로그램 테스트 회로는 앞의 회로를 동일하게 사용 이벤트 수신 처리 프로그램 – 교재 pp.126~126, 예제 3-9

디지털 입력 이벤트 처리 (3) import java.io.IOException; import jdk.dio.DeviceManager; import jdk.dio.gpio.GPIOPin; import jdk.dio.gpio.PinEvent; import .jdk.dio.gpio.PinListener; public class PushButtonEvent implements Runnable { private static final String LED_PIN = "GPIO17"; private static final String LED_BTN = "GPIO23"; private static final String EXIT_BTN = "GPIO24"; private GPIOPin ledPin; private GPIOPin ledBtnPin; private GPIOPin exitBtnPin; private volatile boolean exit = false; public PushButtonEvent() { super(); this.ledPin = DeviceManager.open(LED_PIN, GPIOPin.class); this.ledBtnPin = DeviceManager.open(LED_BTN, GPIOPin.class); this.exitBtnPin = DeviceManager.open(EXIT_BTN, GPIOPin.class); System.out.println("Devices successfully opened..."); ledBtnPin.setInputListener(new PinListener() { public void valueChanged(PinEvent event) { try { boolean led = event.getValue(); ledPin.setValue(led) System.out.println("LED: " + (led?"ON":"OFF")); } catch (IOException e) { System.out.println("Error! " + e.getMessage()); exit = true; } }); exitBtnPin.setInputListener(new PinListener() { if (!exit) { exit = event.getValue();

디지털 입력 이벤트 처리 (4) public void run() { try { while (!exit) { Thread.sleep(1000); } System.out.println("Exit..."); close(); } catch (IOException|InterruptedException e) { public void close() { ledPin.close(); ledBtnPin.close(); exitBtnPin.close(); public static void main(String[] args) { PushButtonEvent pushButton = new PushButtonEvent(); Thread thread = new Thread(pushButton); thread.start();

디지털 입력 이벤트 처리 (5) 버튼 입력 이벤트 처리 프로그램 – 장치 레지스트리 # RPi P3 header pins 17 = deviceType: gpio.GPIOPin, pinNumber:17, name:GPIO17, mode:4, direction:1, predefined:true 23 = deviceType: gpio.GPIOPin, pinNumber:23, name:GPIO23, predefined:true 23 = deviceType: gpio.GPIOPin, pinNumber:24, name:GPIO24, predefined:true gpio.GPIOPin = initValue:0, deviceNumber:0, direction:0, mode:2, trigger:3, predefined:true

디지털 입력 이벤트 처리 (6) 버튼 입력 이벤트 처리 프로그램 – 장치 보안 정책 grant { permission jdk.dio.DeviceMgmtPermission "*:*", "open"; };

디지털 입력 이벤트 처리 (7) 버튼 입력 이벤트 처리 프로그램 – 실행 환경 설정 앞 예제와 동일하게 설정

디지털 입력 이벤트 처리 (8) 버튼 입력 이벤트 처리 프로그램 – 테스트 원격 실행 원격 디버깅

아날로그 입출력 (1) 아날로그 입력 대부분의 저항성 센서는 아날로그 신호로 측정값을 출력 저항성 센서의 기본 회로: 저항병렬연결의 분압 원리 이용 센서값 처리를 위해서는 아날로그 신호의 디지털 값으로 변환 필요 ADC(Analog-to-Digital Converter) 저항성 센서 고정 저항 GND Vcc 센서값 측정

아날로그 입출력 (2) 아날로그 출력 대부분의 액츄에이터(Actuator) 장치는 아날로그 신호로 제어 예: 서보 모터 속도 제어 LED 밝기 제어 등 디지털 값을 아날로그 신호로 변환하는 장치가 필요 Hardware PWM Software PWM DAC(Digital-to-Analog Converter)

아날로그 입출력 (3) 라즈베리파이의 아날로그 입출력 라즈베리파이는 ADC/DAC 장치를 지원하지 않는다  라즈베리파이만으로는 아날로그 입출력을 수행하지 못함. 별도의 ADC/DAC 장치를 이용하여 아날로그 입출력 처리 MCP4911, MCP3002, PCF8591 등 외부 ACD/DAC와 라즈베리파이 사이의 인터페이스 I2C(Inter-IC) SPI(Serial Peripheral Interface)

아날로그 입출력 (4) 라즈베리파이의 아날로그 입출력 ADC Sensors RaspberryPi I2C / SPI Actuator ADC I2C / SPI DAC

아날로그 입출력 (5) I2C 시리얼 통신

아날로그 입출력 (6) SPI 시리얼 통신

아날로그 입출력 (7) PCF8591 Breakout Board PCF8591T : 8-bit AD-DA Converter / I2C Interface

아날로그 입출력 (8) PCF8591 Breakout Board PCF8591T Spec: Addressing: Control byte: A2: High, A1: Low A0: Low => 주소: 0x48

아날로그 입출력 (9) PCF8591 Breakout Board Jumper Setting AIN0 <-->INPUT0(Potentiometer) AIN1 <-->INPUT1(Photoresistor) AIN2 <-->INPUT2(Themistor) AIN3 AOUT

아날로그 입출력 (10) PCF8591 Breakout Board 연결 라즈베리파이와의 연결 DAC 테스트 연결 AOUT Pin 3 Pin 5 Pin 1 Pin 9 AOUT GND

아날로그 입출력 (11) 라즈베리파이의 I2C Bus 설정 (1) 라즈베리파이 설정 유틸리티 “raspi-config”을 이용하여 I2C 장치를 사 용 가능하도록 설정 # sudo raspi-config I2C Tool 설치 # sudo apt-get install i2c-tools I2C 사용자 그룹에 “pi” user 추가 # sudo adduser pi i2c

PCF8591 Breakout board의 주소는 0x48 아날로그 입출력 (12) 라즈베리파이의 I2C Bus 설정(2) I2C Tool 테스트 및 i2c slave 장치 주소 확인 # sudo i2cdetect –l // i2c 장치 목록 확인 # sudo i2cdetect –y 1 PCF8591 Breakout board의 주소는 0x48

샘플링 지연으로 인해 첫 번째 읽은 값과 두 번째 읽은 값이 다를 수 있음 아날로그 입출력 (13) I2C Bus 입출력 테스트 (1) PCF8591 AIN0 값 읽기 # sudo i2cset –y 1 0x48 0x00 // send control byte to read AIN0(Potentiometer) # sudo i2cget –y 1 0x48 // read one byte from bus 1 dev 0x48 # sudo i2cget –y 1 0x48 샘플링 지연으로 인해 첫 번째 읽은 값과 두 번째 읽은 값이 다를 수 있음

아날로그 입출력 (14) I2C Bus 입출력 테스트 (2) PCF8591 AIN1 값 읽기 # sudo i2cset –y 1 0x48 0x01 // set control byte to read AIN1(Photoresistor) # sudo i2cget –y 1 0x48 // read one byte from bus 1 dev 0x48 # sudo i2cget –y 1 0x48

PCF8591 Breakout 보드 위의 LED 밝기 변화를 확인 아날로그 입출력 (15) I2C Bus 입출력 테스트 (3) PCF8591 AOUT(PWM) 출력 # sudo i2cset –y 1 0x48 0x40 0xff // set a value 0xff to AOUT # sudo i2cset –y 1 0x48 0x40 0xc0 // set a value 0xc0 to AOUT # sudo i2cset –y 1 0x48 0x40 0x90 // set a value 0x90 to AOUT # sudo i2cset –y 1 0x48 0x40 0x00 // set a value 0x00 to AOUT PCF8591 Breakout 보드 위의 LED 밝기 변화를 확인

아날로그 입출력 (16) PCF8591 Breakout Board 테스트 (1) NetBeans IDE를 이용한 테스트 프로그램 작성 및 테스트 아날로그 입력값을 읽어 화면에 출력 아날로그 출력을 이용하여 LED Dimming NetBeans IDE에서 새로운 프로젝트 생성 프로젝트명: PCF8591BB_Test 프로젝트 속성 설정에서 라이브러리 추가 dio.jar 라이브러리 추가

아날로그 입출력 (17) PCF8591 Breakout Board 테스트 (2) jdk.dio.i2cdev 패키지를 이용하여 I2C 장치 드라 이브 구현 “source packages” 내에 “i2c_dev” 패키지 생성 “i2c_dev” 패키지 내에 다음의 클래스 파일 생성 I2CRPi.java – I2C Device wrapper class I2CUtils.java – I2C Device I/O utility method(static method) 지원 PCF8591.java – PCF8591 IC의 register I/O enumerator 객체 정의

아날로그 입출력 (18) PCF8591 Breakout Board 테스트 (3) i2c_dev.I2CRPi.java package i2c_dev; import java.io.IOException; import jdk.dio.DeviceManager; import jdk.dio.i2cbus.I2CDevice; import jdk.dio.i2cbus.I2CDeviceConfig; public class I2CRPi { private I2CDeviceConfig config; public I2CDevice device = null; public I2CRPi(int i2cAddress) throws IOException { config = new I2CDeviceConfig.Builder() .setAddress(i2cAddress, I2CDeviceConfig.ADDR_SIZE_7) .build(); device = (I2CDevice) DeviceManager.open(I2CDevice.class, config); } public void close() { try { device.close(); } catch (IOException ex) { ex.printStackTrace(); }

아날로그 입출력 (19) PCF8591 Breakout Board 테스트 (4) i2c_dev.I2CUtils.java package i2c_dev; import java.io.IOException; import java.nio.ByteBuffer; import jdk.dio.i2cbus.I2CDevice; /** * Functions to read and write to I2C Raspberry Pi bus * */ public class I2CUtils { * @param mili public static void I2Cdelay(int mili) { try { Thread.sleep(mili); } catch (InterruptedException ex) { } /** * @param mili * @param nano */ public static void I2CdelayNano(int mili, int nano) { try { Thread.sleep(mili, nano); } catch (InterruptedException ex) { } * @param b * @return byte values from -127..128 convert 128..255 public static int asInt(byte b) { int i = b; if (i < 0) { i += 256; return i;

/** * @param device Device connected to I2C bus * @param cmd Command send to device * @return read an int from a device connected to I2C bus */ public static int read(I2CDevice device, int cmd) { ByteBuffer rxBuf = ByteBuffer.allocateDirect(1); try { device.read(cmd, 1, rxBuf); } catch (IOException ex) { //Logger.getGlobal().log(Level.WARNING,ex.getMessage()); //ex.printStackTrace(); System.out.println("WARNING: " + ex.getMessage()); } return asInt(rxBuf.get(0)); * @param cmd Command send to Arduino Due * @return read a float from Arduino Due connected to I2C bus. All bytes * received must be swamp order public static float readFloatArduino(I2CDevice device, int cmd) { byte[] b = new byte[4]; ByteBuffer rxBuf = ByteBuffer.allocateDirect(4); device.read(cmd, 4, rxBuf); //Logger.getGlobal().log(Level.WARNING, ex.getMessage()); rxBuf.clear(); for (int i = 0; i < 4; i++) { b[i] = rxBuf.get(3 - i); return ByteBuffer.wrap(b).getFloat(); } /** * @param device Device connected to I2C bus * @param cmd Command send to Arduino Due * @return read a short from Arduino Due connected to I2C bus. All bytes * received must be swamp order */ public static short readShortArduino(I2CDevice device, int cmd) { byte[] b = new byte[2]; ByteBuffer rxBuf = ByteBuffer.allocateDirect(2); try { device.read(cmd, 2, rxBuf); } catch (IOException ex) { //Logger.getGlobal().log(Level.WARNING, ex.getMessage()); System.out.println("WARNING: " + ex.getMessage()); rxBuf.clear(); for (int i = 0; i < 2; i++) { b[i] = rxBuf.get(1 - i); return ByteBuffer.wrap(b).getShort(); * @param cmd Command send to a device * @return read a short from a device connected to I2C bus public static short readShort(I2CDevice device, int cmd) { //byte[] b = new byte[2];

try { device.read(cmd, 1, rxBuf); } catch (IOException ex) { //Logger.getGlobal().log(Level.WARNING, ex.getMessage()); System.out.println("WARNING: " + ex.getMessage()); } rxBuf.clear(); return rxBuf.getShort(); /** * @param device Device connected to I2C bus * @param cmd Command send to a device * @param value Command value to wite to device */ public static void write(I2CDevice device, byte cmd, byte value) { ByteBuffer txBuf = ByteBuffer.allocateDirect(2); txBuf.put(0, cmd); txBuf.put(1, value); device.write(txBuf); * Write multiple bits in an 8-bit device register. * @param devAddr I2C slave device address * @param regAddr Register regAddr to write to * @param bitStart First bit position to write (0-7) * @param length Number of bits to write (not more than 8) * @param data Right-aligned value to write public static void writeBits(I2CDevice devAddr, byte regAddr, int bitStart, int length, int data) { // 010 value to write // 76543210 bit numbers // xxx args: bitStart=4, length=3 // 00011100 mask byte // 10101111 original value (sample) // 10100011 original & ~mask // 10101011 masked | value byte b = (byte) read(devAddr, regAddr); if (b != 0) { int mask = ((1 << length) - 1) << (bitStart - length + 1); data <<= (bitStart - length + 1); // shift data into correct position data &= mask; // zero all non-important bits in data b &= ~(mask); // zero all important bits in existing byte b |= data; // combine data with existing byte write(devAddr, regAddr, b); } /** * write a single bit in an 8-bit device register. * * @param devAddr I2C slave device address * @param regAddr Register regAddr to write to * @param bitNum Bit position to write (0-7) * @param data */ public static void writeBit(I2CDevice devAddr, byte regAddr, int bitNum, int data) { int b= (byte) read(devAddr, regAddr); b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); write(devAddr, regAddr, (byte) b);

아날로그 입출력 (20) PCF8591 Breakout Board 테스트 (5) i2c_dev.PCF8591.java package i2c_dev; import jdk.dio.i2cbus.I2CDevice; public enum PCF8591 { /** * Analog Input 0 */ AIN0(0x0), * Analog Input 1 AIN1(0x01), * Analog Input 2 AIN2(0x02), /** * Analog Input 3 */ AIN3(0x03), * Analog Output AOUT(0x40); * public byte cmd; private PCF8591(int cmd) { this.cmd = (byte) cmd; } /** * @param device * @return */ public int read(I2CDevice device) { return I2CUtils.read(device, this.cmd); } * @param value public void write(I2CDevice device, int value) { I2CUtils.write(device, this.cmd, (byte)value);

아날로그 입출력 (21) PCF8591 Breakout Board 테스트 (6) 앞에서 구현한 I2C 장치 인터페이스 클래스를 이용하여 PCF8591 장치 드라이브 구현 “source packages” 내에 “i2c_dev.drivers” 패키지 생성 “i2c_dev.drivers” 패키지 내에 다음의 클래스 파일 생성 PCF8591Device.java – PCF8591 IC의 장치 드라이브 클래스

아날로그 입출력 (22) PCF8591 Breakout Board 테스트 (7) i2c_dev.drivers.PCF8591Device.java switch (ainPin) { case 0: value = PCF8591.AIN0.read(device); break; case 1: value = PCF8591.AIN1.read(device); break; case 2: value = PCF8591.AIN2.read(device); break; case 3: value = PCF8591.AIN3.read(device); break; } return value; public void analogWrite(int pwm) throws IOException { PCF8591.AOUT.write(device, pwm); package i2c_dev.drivers; import i2c_dev.I2CRPi; import i2c_dev.PCF8591; import java.io.IOException; public class PCF8591Device extends I2CRPi { private static final int PCF8591Addr = 0x48; public PCF8591Device() throws IOException { super(PCF8591Addr); device.write(0x00); } public int analogRead(int ainPin) { int value = 0;

아날로그 입출력 (23) PCF8591 Breakout Board 테스트 (8) PCF8591 장치 테스트 프로그램 구현 Pcf8591bb_test.PCF8591Test.java 아날로그 입력 0~3을 순서대로 읽어 화면에 출력 아날로그 출력을 이용하여 LED dimming

package pcf8591bb_test; import i2c_dev.I2CUtils; import i2c_dev.drivers.PCF8591Device; import java.io.IOException; public class I2CTest { public static void main(String[] args) { try { PCF8591Device adConverter = new PCF8591Device(); adConverter.analogRead(0); I2CUtils.I2Cdelay(1000); System.out.println("Potentimeter Input : " + adConverter.analogRead(0)); adConverter.analogRead(1); System.out.println("Photoregister Input : " + adConverter.analogRead(1)); adConverter.analogRead(2); System.out.println("Themistor Input : " + adConverter.analogRead(2)); System.out.println("LED dimming..."); adConverter.analogWrite(0xff); I2CUtils.I2Cdelay(3000); adConverter.analogWrite(0xcf); adConverter.analogWrite(0xaf); adConverter.analogWrite(0x9f); adConverter.analogWrite(0x00); } catch (IOException ex) { System.out.println("ERROR: " + ex.getMessage()); } } // main()

아날로그 입출력 (24) PCF8591 Breakout Board 테스트 (9) 설정 파일 추가 “config” 디렉토리 추가 장치 레지스트리 파일 및 보안 정책 파일 추가 build.xml 파일 수정

아날로그 입출력 (25) PCF8591 Breakout Board 테스트 (10) 설정 파일 – 장치 레지스트리 파일 본 예제에서는 프로그램 내에서 장치 설정을 동적으로 수행하기 때문에 장치 레 지스트리 파일 내용이 영향을 미치지 않는다. # RPi3 header pins 1 = deviceType: gpio.GPIOPin, pinNumber:4, name:GPIO4, predefined:true 2 = deviceType: gpio.GPIOPin, pinNumber:7, name:GPIO7, mode:4, direction:1, predefined:true #3 = deviceType: gpio.GPIOPin, pinNumber:17, name:GPIO17, predefined:true 17 = deviceType: gpio.GPIOPin, pinNumber:17, name:GPIO17, mode:4, direction:1, predefined:true 4 = deviceType: gpio.GPIOPin, pinNumber:18, name:GPIO18, mode:4, direction:1, predefined:true 5 = deviceType: gpio.GPIOPin, pinNumber:22, name:GPIO22, predefined:true 6 = deviceType: gpio.GPIOPin, pinNumber:23, name:GPIO23, mode:2, direction:0, predefined:true 7 = deviceType: gpio.GPIOPin, pinNumber:24, name:GPIO24, mode:2, direction:0, predefined:true …

아날로그 입출력 (26) PCF8591 Breakout Board 테스트 (11) 설정 파일 – 보안 정책 파일 // policy for DIO framework grant { // Very permissive permissions permission jdk.dio.DeviceMgmtPermission "*:*", "open"; permission jdk.dio.gpio.GPIOPinPermission "*:*"; permission jdk.dio.i2cbus.I2CPermission "*:*"; permission jdk.dio.spibus.SPIPermission "*:*"; };

아날로그 입출력 (27) PCF8591 Breakout Board 테스트 (12) build.xml 파일 수정

아날로그 입출력 (28) PCF8591 Breakout Board 테스트 (13) 프로젝트 속성 설정 수정 Sources / Run 속성 수정

아날로그 입출력 (29) PCF8591 Breakout Board 테스트 (14) 원격 실행 원격 디버깅