Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "임베디드 프로그래밍 Lecture #03 2017. 9. 25."— Presentation transcript:

1 임베디드 프로그래밍 Lecture #03

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

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

4 라즈베리파이의 장치 제어 (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

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

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

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

8 디지털 출력 및 입력 테스트 (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();

9 디지털 출력 및 입력 테스트 (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();

10 장치타입 정의에 의해 장치의 기본 속성값이 결정
디지털 출력 및 입력 테스트 (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 장치이름 장치번호 장치타입 정의에 의해 장치의 기본 속성값이 결정

11 디지털 출력 및 입력 테스트 (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)

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

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

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

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

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

17 디지털 입력 이벤트 처리 (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();

18 디지털 입력 이벤트 처리 (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();

19 디지털 입력 이벤트 처리 (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

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

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

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

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

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

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

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

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

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

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

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

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

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

33 아날로그 입출력 (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

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

35 샘플링 지연으로 인해 첫 번째 읽은 값과 두 번째 읽은 값이 다를 수 있음
아날로그 입출력 (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 샘플링 지연으로 인해 첫 번째 읽은 값과 두 번째 읽은 값이 다를 수 있음

36 아날로그 입출력 (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

37 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 밝기 변화를 확인

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

39 아날로그 입출력 (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 객체 정의

40 아날로그 입출력 (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(); }

41 아날로그 입출력 (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 { mili public static void I2Cdelay(int mili) { try { Thread.sleep(mili); } catch (InterruptedException ex) { } /** mili nano */ public static void I2CdelayNano(int mili, int nano) { try { Thread.sleep(mili, nano); } catch (InterruptedException ex) { } b byte values from convert public static int asInt(byte b) { int i = b; if (i < 0) { i += 256; return i;

42 /** device Device connected to I2C bus cmd Command send to device 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)); cmd Command send to Arduino Due 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(); } /** device Device connected to I2C bus cmd Command send to Arduino Due 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(); cmd Command send to a device read a short from a device connected to I2C bus public static short readShort(I2CDevice device, int cmd) { //byte[] b = new byte[2];

43 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(); /** device Device connected to I2C bus cmd Command send to a device 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. devAddr I2C slave device address regAddr Register regAddr to write to bitStart First bit position to write (0-7) length Number of bits to write (not more than 8) data Right-aligned value to write public static void writeBits(I2CDevice devAddr, byte regAddr, int bitStart, int length, int data) { // value to write // bit numbers // xxx args: bitStart=4, length=3 // mask byte // original value (sample) // original & ~mask // 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. * devAddr I2C slave device address regAddr Register regAddr to write to bitNum Bit position to write (0-7) 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);

44 아날로그 입출력 (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; } /** device */ public int read(I2CDevice device) { return I2CUtils.read(device, this.cmd); } value public void write(I2CDevice device, int value) { I2CUtils.write(device, this.cmd, (byte)value);

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

46 아날로그 입출력 (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;

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

48 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()

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

50 아날로그 입출력 (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

51 아날로그 입출력 (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 "*:*"; };

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

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

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


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

Similar presentations


Ads by Google