SW개발자를 위한 Hardware 워크숍
박동희
노트: http://dh8.kr/workshop/hwworkshop/
Helloboard
어린 창작자를 위한 워크숍
워크숍에서 다루는 내용
- 하드웨어 기초
- 계측 장비 사용(멀티미터, 오실로스코프)]
- 자신이 만든 하드웨어에 간단한 프로그래밍
- 회로도 읽기
- 데이터 쉬트 읽기
참가자 소개
- 삼일 안 자신이 얻었으면 하는것?
- 어떤 일을 하는지?
- 요즘의 고민?
- 그외 관심사?
시간표
임베디드 하드웨어/소프트웨어 개발 시작하기
처음 시작할때는 취미 플래폼 체크: Rpi, Arduino, Particle, Mbed
- C언어 배우기
- 기초 전자이론 (전압, 전류, 파워, 저항, 옴의법칙)
- 납땜, 멀티미터, 디버거, 오실로스코프(또는 로직 애널라이져)
- 마이크로컨트롤러와 툴체인 선택. 개발보드
- 부품 선택 구매(digikey, mouser), 그리고 데이터 쉬트 읽기.
Arduino?

Arduino 시작
시작은 2005년 이탈리아 Interaction Design Institute Ivrea
- 간단하고
- 싸고
- 사용하기 쉬운
하드웨어 플랫폼 만들기
Maker 문화를 만든 불씨!
Arduino 회로도

우리가 만들 Arduino 회로도
Arduino 만들기 재료

브레드 보드, 전선, 7805 레귤레이터, LED, 220옴 저항, 10k 옴 저항, 1k 옴 저항, 10uF 캐퍼시터, 16MHz 클럭 크리스탈, 22pF 캐퍼시터 2개, 버튼 스위치, USB 시리얼 컨버터
Multi meter
- 전압, 저항, 전류
- 연결(short)이 되어 있는지 체크


Breadboard
브레드보드의 내부는 어떻게 연결 되어 있나?
Breadboard 내부
Arduino 만들기 순서
- 5V 전원회로
- MCU 회로
- UART 통신회로
5V 전원회로
- C1, C2의 크기는 부하 용량에 의해 결정.
Voltage Regulator 7805
실습: 7805 데이터 쉬트 읽기 fairchild
- 핀배열. in, out, gnd
- 출력 전압, 최대 공급전류
- 입력 전압
7805 내부회로

7805 내부 회로.
출처: https://www.sparkfun.com/datasheets/Components/LM7805.pdf
5V analog circuit
제너다이오드 제너 점 5.6v, Base-Emitter forward bias 0.7v
5.6v- 0.7v = 4.9v
콘덴서
from: wikipedia
전해 콘덴서 내부
바이패스 콘덴서
전기회로 이론
- 옴의 법칙
- 키리히호프의 전류 법칙 : 들어오는 전류는 나가는 전류와 같다. (직렬연결, 병렬연결)
- 키리히호프의 전압 법칙
- AC/DC
옴의 법칙
- V= RI
- 전압 = 전류 x 저항
I(전자의 흐름)는 V(세기)에 비례. 비례 상수는 R.
https://youtu.be/mB1z_x7J5Aw?t=178 Electrical Resistance - Georg Ohm
LED (Light Emitting Diode)


Diode
Diode
from: Collin Mel Cunningham http://goo.gl/h8MoY
- Forward voltage: 0.7v
- I-V curve
LED
Forward voltage : 2V Forward current : 20mA
R1 ?
MCU 회로
Atmega8 datasheet 읽기
- 주요 동작
- Operating voltage 동작 조건 (파워)
- Peripheral 주요 기능, 주변기기
- Memory 메모리 종류/용량
- Pin description, pin mapping
- GPIO?
- Application note
- Block diagram
실습: 팀당 1개씩 읽은 내용 공유.
Arduino atmega8 pin mapping
Arduino on breadboard
https://www.dropbox.com/sh/9elkqexib28sqat/2G90u12MPO
USB serial convertor (CP2103)
개발환경 다운로드
http://119.205.220.242/~donghee/hw/
- Arduino IDE : http://arduino.cc
- Cp210x VCP driver : http://dh8.kr/wiki/doku.php/cp2103
Bootloader
Serial Bootloader for Atmel mega8 AVR Controller
http://goo.gl/r5R3S
ATmegaBOOT.c
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define MAX_TIME_COUNT (F_CPU>>1)
#define HW_VER 0x02
#define SW_MAJOR 0x01
#define SW_MINOR 0x12
#ifndef outb
#define outb(sfr,val) (_SFR_BYTE(sfr) = (val))
#endif
#ifndef inb
#define inb(sfr) _SFR_BYTE(sfr)
#endif
소프트웨어 개발자를 위한 하드웨어 워크숍: 둘째날
체크인: 모닝페이지
- 규칙: 정해진 시간동안 종이에 머리속에 드는 생각(가치있다고 생각하는일 or 괴로운일)을 종이에 채운다.
- 시간: 5분
Quiz
- 회로도 그리기(9v–5v): 파워회로 + LED
- 왜 바이패스 캐패시터를 쓰나?
- 외부 클럭 회로
- 마이크로 컨트롤러의 리셋 회로
- UART 연결 USB rs232 <-> atmega8
Arduino UNO 탐험!
http://arduino.cc/en/Main/arduinoBoardUno
http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf
Arduino UNO의 새로운 기능
- Auto Reset When Uploading
- USB전원/ DC전원 자동 스위칭(DC전원 우선)
- 3.3v Regulator
- usb to uart ic
- 500mA USB fuse
Arduino Uno Rev3 회로도 읽기
- 회로도: 구글링 Arduino Uno Rev3 Schemastic
- 회로도 읽기: 전원, 오실레이터, 리셋, uart통신 라인 읽기.
- 발견 또는 질문: 팀당 1개씩.
Input/Output
- Digital Input/ Output
- Analog Input/ PWM
Digital Output
digital pin 12, 13 에 두개의 LED 연결하여 제어하기 (회로도를 보드로 옮기기)
friz(arduino_led2.frz)
Digital Input
Digital pin 7에 풀업버튼 연결
Digital Input
해보기: Play and Stop
- 풀업버튼 2개를 연결한다.
- Press Play Button: 두개의 LED를 번갈아가면서 실행.
- Press Stop Button: 두개의 LED 모두를 끈다.
- 코드 공유/ 리뷰.
Analog Input
가변저항
해보기 1. AnalogInput 예제 2. 512 threshold, CdS 사용 3. 가변저항 전압 측정, 4. Serialport로 온 가변 값과 비교.
Analog Input
LM35
http://www.ti.com/lit/ds/symlink/lm35.pdf
해보기 1. LM35 데이터 쉬트에서 pin 배열, 동작전압, 온도 2. Arduino에 연결하는 회로도 그려보기
[ADC값] -(/1023*5)-> [전압] -(*100)-> [온도]
Analog Input
Sharp GP2Y0A51SK : 거리센서
핀 연결: http://goo.gl/OxlwN
잠깐만! 오실로 스코프 : DSO nano V2
http://www.seeedstudio.com/wiki/DSO_Nano_v2#Usage
http://www.seeedstudio.com/wiki/images/9/97/DSO_Nano_manual.pdf
DSO nano V2 파형 트리거 잡는 기능으로 파형 읽기
PWM (Pulse Width Modulation)
http://dh8.kr/wiki/doku.php/workshop:pwm
해보기 1. 오실로 스코프로 PWM 확인 2. LED 또는 모터 연결하기 3. Fading 예제 실행해보기. 4. 센서(가변저항) 입력받아서 PWM duty ratio 바꾸기
TR, FET, Relay로 큰전력의 주변기기 다루기
BJT TR: P2N2222A
http://blog.naver.com/dolicom/10083875471
FET: FQP33N10 or IRF540
FET구조와 동작: http://blog.daum.net/kingbin/12135407 http://goo.gl/nuwcM
Transistor Therory Explained - (How it works) Transistor / MOSFET tutorial
https://www.youtube.com/watch?v=EIPSxUKrt2I
Relay: DC/AC제어
NPN Bipolar Transistor
실습: P2N2222A 데이터 쉬트 읽기 fairchild
- 핀배열. base, collector, emittor.
- Vbe 동작 전압
- Veb, Vce 한계전압 Veb=6v Vce=40v
- 증폭. hFE
DC 모터 제어
arduino 9번핀을 NPN BJT의 Base에 연결! PWM으로 제어해보자!
해보기: NPN BJT(P2N2222A) 데이터 쉬트 읽기
해보기: BJT(npn)_를 MOSFET(n-channel 으로 바꾸어 보자!)
QUIZ: 모터의 방향을 바꿀려면? 4개의 BJT를 이용하여, 모터를 바꿀 수 있다.
Servo
Arduino 예제: Servo -> Sweep 참고.
일상에서 유용한 장치 만들기 예시 프로젝트: 자료조사!
내일 프로젝트에서 진행할 내용 사전조사
- 클라우드 펀딩 사이트( kickstarter.com, indiegogo.com )
- Hardware Startup Accelerator 포트폴리오
Hardware Startup Accelerator
- http://lemnoslabs.com
- http://highway1.io/startups/
- http://www.hax.co
Hardware project
- CatchCats: https://tumblbug.com/catchcats
- Tile: http://www.thetileapp.com/
- tado: http://goo.gl/yQ8kPh
- peeple: https://www.kickstarter.com/projects/1544392549/peeple-caller-id-for-your-front-door http://building10.com/
- PowerUp 3.0 - Smartphone Controlled Paper Airplane: http://goo.gl/6wrFoD
- Chui: getchui.com
- Korner: http://goo.gl/8akgXj
- SCiO: Your Sixth Sense: http://goo.gl/jT3c9h
- myspiroo: http://www.myspiroo.com/#intro https://www.youtube.com/watch?v=MAJ4TN9orJ8
- Helios Bars: https://www.kickstarter.com/projects/kennygibbs/helios-bars-transform-any-bike-into-a-smart-bike
- Kittyo http://news.dmm-make.com/2014/05/kittyo
- http://dh8.kr/workshop/arduinoprototyping/arduino_basic.html
- podo https://giveit100.com/@PodoLabs/dtk0zs/ https://www.youtube.com/watch?v=CU3VqpDIQxs The Making of Podo
Universal Design
- https://www.youtube.com/watch?v=SyyZuvTXJpM
- https://www.youtube.com/watch?v=6rh6WfSm9CE
소프트웨어 개발자를 위한 하드웨어 워크숍: 셋째날
체크인: 몸상태 알아보기
통신
- 페러럴통신
- 시리얼통신
페러럴 통신

시리얼 통신

출처: https://learn.sparkfun.com/tutorials/serial-communication
시리얼 통신
- UART
- SPI
- I2C
위키 http://goo.gl/cGvyY
UART
UART(Universal Asynchronous Receiver/Transmitter) 이름으로 알 수 있듯이 리시버와 트랜시버가 따로 존재하고 데이터의 클럭 정보가 없는 비동기식 통신 방식을 말한다.

시작(start bit)과 끝(stop bit) 신호가 있고 그 사이를 일정 시간으로 잘라서 데이터의 비트를 구분한다.
UART는 통신의 속도가 설정가능하고 데이터의 형식(갯수) 설정이 가능하다. UART의 종류로 RS–232(+–12), RS–422, RS–485 등이 있다.
Python 에서 Serialport
다운로드: http://goo.gl/EsIok
- Python 2.7.3 http://python.org/download/
- Pyserial Win32 (pyserial–2.5.win32.exe) google에서 pyserial win32 검색
Serialport 문자 읽기
int ledPin = 13;
int value;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
value = Serial.read();
if (value == '1') {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
}
오실로 스코프로 UART의 TTL 파형을 찍어보자.
컴퓨터에서 보드로 ‘1’ 을 입력 했을때 RX 핀에서 찍은 파형
Python
파이썬의 serial포트에서 arduino led 켜고 끄기
pyserial
>>> import serial
>>> s = serial.Serial('com5')
>>> s.write('1')
1
>>> s.write('0')
1
>>>
button.py
https://gist.github.com/donghee/efc2ae6f98a002e52df5
프로젝트
http://vimeo.com/5142195
http://vimeo.com/1750454 Ward’s virtual CEO
SPI (Serial Peripheral Interface)
SPI 는 모토로라에서 만든 통신 방식. 직렬 컴퓨터 버스 주변기기를 연결하기 위해 사용된다.
외부 주변장치와 clock 을 통하여 동기화 하는 동기식 통신 방식이며, 하나의 Master 와 하나 또는 다수의 Slave Device 간의 통신이 가능하다.
4개핀 사용: - MOSI (Master Out Slave Input) - MISO (Master Input Slave Out) - SS (Slave Select) - SCK (Serial Clock)
SPI 연결
WS2801
엄밀한 SPI는 아니지만, SPI의 변종. 입력만 있다.
WS2801
해보기
- WS2801 보드 회로도 분석.
- 데이터 쉬트의 핀배열 보고 Arduino 보드(GPIO)와 연결하기.
- 타임 차트 보고 클럭(CKI)과 데이터(SDI) 만들기.
클럭(CKI)이 LOW-> HIGH 로 변할때, 데이터(SDI)가 패치됨.
WS2801
digitalWrite(cki, LOW);
delay(1);
for (int i =0; i< 8; i++) {
digitalWrite(cki, LOW);
digitalWrite(sdi, HIGH);
delayMicroseconds(100);
digitalWrite(cki, HIGH);
delayMicroseconds(100);
}
for (int i =8; i< 16; i++) {
digitalWrite(cki, LOW);
digitalWrite(sdi, LOW);
delayMicroseconds(100);
digitalWrite(cki, HIGH);
delayMicroseconds(100);
}
for (int i =16; i< 24; i++) {
digitalWrite(cki, LOW);
digitalWrite(sdi, LOW);
delayMicroseconds(100);
digitalWrite(cki, HIGH);
delayMicroseconds(100);
}
digitalWrite(cki, LOW);
delay(1);
post_frame: https://gist.github.com/donghee/5167113
활용: Search ‘octagon lounge’ in youtube.com
Buzzer!
해보기
- 부저를 제어해서 멜로디를 만들어 보자!
- DigitalPin 8번을 Buzzer 핀에 연결.
- 예제 Digital -> toneMelody 실행.
아두이노 사운드 라이브러리: mozzi
- http://sensorium.github.io/Mozzi/gallery/
- Ototo: Make Music from Anything
I2C
I2C는 필립스사에서 고안한 방식, MCU와 주변장치의 시리얼통신 하는데 사용.
두선 사용. 여러개의 마스터 지원.
I2C 연결
특징, 통신선로 pull-up
I2C 데이터 타임차트
I2C: 통신 포멧
I2C: EEPROM (24LC256)
I2C: 24LC256
EEPROM
https://gist.github.com/donghee/b0bf974b5a925cb214df
해보기
- 데이터 쉬트 읽고, 동작전압을 찾는다.
- 24LC256의 i2c 주소를 찾는다.
- 24LC256의 데이터를 읽고 쓰는 순서를 찾는다.
I2C: tmp102
온도센서
http://pastebin.com/GLLfjhiL
해보기
- 동작전압
- tmp102의 i2c 주소
- tmp102의 데이터 포멧(온도)
SPI와 I2C 비교
SPI의 장점
- Full duplex
- Higher throughput than I2C
- 프로토콜 변경 유연성
- low power, simple
SPI 단점
- no hardware flow control. ack 가 없다.
- no addressing
- 한개의 master 만 사용할 수 있다.
- RS232, 485에 비해 짧은거리
- SPI 변종이 많다. 그리고 여러가지 모드가 있다.
부록: 회로도 읽는 팁
나누어 읽기/ 연결하여 읽기/ 전체 읽기
나누어 읽기
- 블록 다이어 그램 읽으며, 해당 블록이 회로도에서 어떤 역활하는지 알아 본다.
- 중요한 IC 찾기: 회로도에서 가장 선이 연결 많이된 회로를 찾는다.
부록: 회로도 읽는 팁
연결하여 읽기
- Power: Vcc, GND 찾기
- 각 블록(IC)은 외부와 어떻게 연결되는지, 연결되는 신호선을 찾는다.
부록: 회로도 읽는 팁
시스템을 읽기
- 각 블록 사이를 연결하여 시스템이 전체 동작을 읽는다.
- 전체 동작 흐름을 읽을때, 블록 이름이나 신호선의 이름을 참고하자.
부록: 회로도 읽는 팁
그외 회로
- 그외 box 모양이 아닌것은 저항이나 RC, op-amp 인데, 지금 당장 알필요는 없다.
- 중요하면 질문하자! ‘이 저항은 어떤 역할을 하는거야?’ 라고.
- 자주 사용되는 소자의 쓰임은 알아 두자!
Collin’s Lab: Schematics
https://www.youtube.com/watch?v=9cps7Q_IrX0
부록: 데이터쉬트 읽기
- 데이터쉬트는 주변장치의 API 메뉴얼과 같다.
- 데이터 쉬트의 독자는 하드웨어 엔지니어. 용어가 쉽지 않은건 당연!
- 중요한 정보 우선적으로 읽기. (장치 기능 설명, 장치의 block diagram, 핀아웃, 핀 설명, 샘플 회로도)
- 펌웨어 개발시 중요한 정보: 주변장치 IC를 프로그래밍 할때, 데이터쉬트의 타이밍 차트를 읽는다.
부록: 데이터쉬트 읽기
질문하기
- A. What voltage a part needs to run
- B. How fast a part will run
- C. How to communicate with a part
- D. All of the above
참고
- http://www.egr.msu.edu/classes/ece480/capstone/read_datasheet.pdf
- https://www.sparkfun.com/tutorials/223
책 추천
- Make: Electronics (Learning by Discovery) 번역: 전자부품 백과사전
- Getting Started with Arduino: 손에 잡히는 아두이노
- Practical Electronics for Inventors, Third Edition 3rd Edition
- The Art of Electronics
프로젝트 주제: 일상에서 유용한 장치 만들기
- 페르소나와 주제 정하기
- 장치를 사용할 고객은 누구인가?
- 고객의 문제는 무엇인가?
- 문제를 어떻게 해결 하는가?
- 장치의 기능
- 필요한 기술, 센서
프로젝트 제약
- 2인이 1팀. (혼자해도 됨!)
- 시간은 2시간. 리소스. 기존에 사용한 센서, 모터 이용.
- 쉬는 시간 작업시간 자유!
- 케이스가 있을것!
프로젝트 기획!
시간: 40분, 발표: 2시 정각. (발표를 2시 까지 해야 4시 40분에 워크숍 끝!)
- 프로토타이핑 스케치
- 프로덕트 박스 만들기
프로토타이핑 스케치
from http://www.iamas.ac.jp Advanced Design Project “Prototyping Sketch”
프로덕트 박스 만들기
- 계획 피드백! 시간: 30분!
- 참고: http://innovationgames.com/product-box/
프로덕트 박스
프로덕트 박스에 들어가면 좋은 내용! (SALE!!)
- 제품 이름/ 로고
- 홍보 문고
- 기능
- 특이점
- 가격
- 회사 이름
프로젝트 준비물
- 마스킹 테이프. 색지, 풀, 포스트잇, 싸인펜.
- 가위, 택배 박스 또는 과자 박스
Cardboard Prototype
- Dyson: https://youtu.be/idpedDg_2ts?t=70
- http://www.judepullen.com/designmodelling/
- http://www.judepullen.com/designmodelling/card-to-cad-creating-print-a-filter/ds-brainstorm/
결과물 공유
- 어려웠던것
- 개선하고 싶은것
- 3일간 소감 또는 배운것
Retrospective
- 재밌는점
- 아쉬운점
- 개선점