누구나, 메이커!!
라즈베리파이로 IoT 시작하기
THINKER TO MAKER
THINKER TO MAKER
MAKE with Circulus
IoT (Internet of Things)
THINKER TO MAKER
사물 인터넷
IoT
생활 속 사물들을 유무선 네트워크로 연결해 정보를 공유하는 환경
IoT, 그러나….
오! 짱 신기하다
내가 원하는 건 없다
비싸다
VS.
Maker Movement
THINKER TO MAKER
메이커 운동
Maker
무언가를 만드는 사람
Maker Movement
Maker들이 만드는 법을 공유하고 발전시키는 흐름
만들라
나누라
주라
배우라
도구를 갖추라
가지고 놀라
참여하라
후원하라
변화하라
메이커 운동 선언문
메이커 커뮤니티
메이커 스페이스
국내현황
메이커 행사
메이커 행사
Maker Faire
메이커 행사
Hacker-thon
메이커 작품 (국외)
메이커 작품 (국내)
메이커 창업
Crowd Funding
Open Source H/W
THINKER TO MAKER
오픈소스 하드웨어
Open Source H/W
The World's First
9$ Computer
Arduino vs. Raspberry Pi
Micro Controller
No
Micro Computer
Yes
성격
리눅스
C
C, C++, Java,
Python, NodeJS,
Ruby ...
개발 언어
No Yes카메라
Limit Yes무선환경
Raspberry Pi
Name
Raspberry Pi
Model A+
Raspberry Pi
Model B+
Raspberry Pi2
Model B
Raspberry Pi
Zero
Raspberry Pi 3
Model
Price $20 $35 $5 $35
Processor ARM 11
ARM
Cortex A7
ARM 11
ARM
Coretex-A53
Clock Speed 700Mhz 900Mhz 1Ghz 1.2Ghz
RAM 256MB 512MB 1GB 512MB 1GB
Multi Core Single Quad Single Quad
Flash Micro SD Card
GPIO 40
Ethernet N/A 10/100 N/A 10/100
USB USB 2.0X1 USB 2.0X4 Micro 1 USB 2.0X4
Power 5V, 200mA 5V, 600mA 5V, 800mA 5V, 160mA N/A
Video Out HDMI, Composite Mini-HDMI
HDMI,
Composite
Audio Out HDMI, Analog Mini-HDMI HDMI, Analog
Circulus 소개
THINKER TO MAKER
온라인 코딩교육 + 메이커 플랫폼
Circulus Architecture
Core Engine
API Gateway
M2M Controller
Cloud Storage
CirculOS
Intelligence Agent
Circulus
App
Circulus
Web
Data Processing
H2H Controller
모바일부터 하드웨어까지. IoT 개발 학습/제작 클라우드 플랫폼
복잡한 IoT 지식 없이, 생각을 다양한 API를 사용하여 손쉽게 구현 가능
One JavaScript - Multi Use
JavaScript (+NodeJS) 만으로 모바일 부터 하드웨어 개발까지 구현
C 나 Java 지식 없이 하나의 언어로 IoT 서비스 제작/배포 지원
www.circul.us
www.circul.us
1. WiFi 연결
1 2
3 4
www.circul.us
2. Raspberry Pi 시리얼 번호
OR
www.circul.us
3. 프로젝트 생성하기
Lecture_01
Basic sensor study
www.circul.us
4. IP와 라즈베리파이 접속 상태 확인
라즈베리파이 OS 설치
THINKER TO MAKER
라즈비안 & Circulus OS
Rasbian
https://www.raspberrypi.org/downloads/raspbian/
Circulus OS
rom.circul.us circul.us
SSH 접속하기
THINKER TO MAKER
이렇게 사용할 수도 있어요
SSH 접속하기
Raspberry Pi IP주소
Rasbian
ID : pi
PWD : raspberry
Circulus OS
ID : pi
PWD : circulus
What to do?
THINKER TO MAKER
오늘 배울 것은?
Basic
THINKER TO MAKER
그 전에 잠깐, 기초
Javascript 기초
1. 모듈 추가하기
var wpi = require('wiring-pi');
2. 변수 선언하기
var val = 10;
3. 출력문 만들기
console.log(“Hello, Raspberry Pi”);
var num = 10;
console.log(“저는 ” + num + “살 입니다.”);
var isOn = 1;
setInterval(function(){
wpi.digitalWrite(pin, isOn);
isOn = +!isOn;
}, 1000);
Javascript 기초
4. 루프 사용하기
if(a >= b)
return a;
5. if문 사용하기
While(a == true)
console.log(“true”);
6. while문 사용하기
Bread board 사용하기
납땜없이 선 연결만을 이용하여 센서와 라즈베리파이를 연결
가로로 표시된 부분이 하나로 연결
GPIO(General Purpose Input/Output) 사용하기
입출력을 담당하는 핀,
SPI, I2C, UART 핀 지원
Wiring-pi 사용하기
GPIO 라이브러리 중 하나
아두이노와의 연계를 위해 핀 번호를 지정
15
16
1
4
5
6
10
11
26
27
28
29
8
9
7
0
2
3
12
13
14
21
22
23
24
25
LED
THINKER TO MAKER
LED
LED
LED를 켜보자!
Ground VCC
GPIO
- +
※ 일반 GPIO도 3.3V까지 출력됨.
VCC 대신 GPIO를 연결하여 입력 또는 출력으로 사용할 수 있음.
LED ON
//set module for control led
var wpi = require('wiring-pi');
//init gpio
wpi.setup('gpio');
wpi.wiringPiSetup();
//init pinMode
var pin = 4;
wpi.pinMode(pin, wpi.OUTPUT);
//on led
var isOn = 1;
wpi.digitalWrite(pin, isOn);
LED를 켜보자!
LED ON/OFF
//set module for control led
var wpi = require('wiring-pi');
//init gpio
wpi.setup('gpio');
wpi.wiringPiSetup();
//init pinMode
var pin = 4;
wpi.pinMode(pin, wpi.OUTPUT);
//on/off led
var isOn = 1;
setInterval(function(){
wpi.digitalWrite(pin, isOn);
isOn = +!isOn;
}, 1000);
1초에 한 번씩 LED가 ON/OFF되도록 해보자!
Ultrasonic Sensor
THINKER TO MAKER
초음파센서(HC-SR04)
초음파 센서 원리
초음파를 통해 일정한 거리 이내에 사물이 있는지 파악
사물과의 거리가 얼마나 떨어졌는지 측정
VCC : 5V GND : Ground
Trig : 초음파 전송 Echo : 초음파 수신
초음파 센서 원리
[High가 끝나는 시간 – Low가 끝나는 시간] / 58
초음파 센서 연결하기
VCC
Ground
Echo
Trig
초음파 센서 거리 측정하기
// Add module
var wpi = require('wiring-pi');
var sleep = require('sleep');
var microtime = require('microtime');
//set var
var TRIG, ECHO;
TRIG = 16;
ECHO = 15;
wpi.setup('gpio');
wpi.wiringPiSetup();
//init pinMode
wpi.pinMode(TRIG, wpi.OUTPUT);
wpi.pinMode(ECHO, wpi.INPUT);
//calc
setInterval(function(){
var cnt1 = 0;
var cnt2 = 0;
wpi.digitalWrite(TRIG, wpi.LOW);
sleep.usleep(2);
wpi.digitalWrite(TRIG, wpi.HIGH);
sleep.usleep(20);
wpi.digitalWrite(TRIG, wpi.LOW);
while(wpi.digitalRead(ECHO) == wpi.LOW)
{
if(cnt1++ > 1000)
{
break;
}
}
var startTime = microtime.now();
while(wpi.digitalRead(ECHO) == wpi.HIGH)
{
if(cnt2++ > 10000)
{
break;
}
}
var endTime = microtime.now();
var distance = (endTime - startTime) / 58;
console.log('distance ' + distance);
}, 1000);
7-Segment
THINKER TO MAKER
세븐-세그먼트 (4 Digit LED)
7-Segment란?
VCC 5v
GROUND Ground
SCLK 동기화 신호
MOSI 마스터 출력 -> 슬레이브 입력
MISO 슬레이브 출력 -> 마스터 입력
CE Chip enable
7-Segment 연결하기
VCC -> GPIO
Ground
CE0 -> CS#
SI
SCK->SCLK
7-Segment 연결하기
startup 동작 모드 시작
setDecodeNone Bit 단위의 데이터로 보여줌
setDedcodeAll 인코딩하여 보여줌 (“0”~”9”, “E”, “H”, “L”, “P”, “-”, “ ”만)
setDigitSegments Bit단위로 계산하여 정보를 표시(setDecodeNone)
setDigitSymbol 인코딩 가능한 값만 정보를 표시(setDecodeAll)
setScanLimit 화면에 출력할 글자 개수 제한 (MAX: 8)
setDisplayIntensity 화면 밝기 제한(MAX : 15)
7-Segment 연결하기
//set module for segment
var MAX7219 = require('max7219');
var disp = new MAX7219("/dev/spidev0.0");
//init
disp.setDecodeNone();
disp.setScanLimit(8);
disp.startup();
disp.setDisplayIntensity(15);
//display
disp.setDigitSegments(0, [0, 0, 0, 0, 1, 1, 0, 1]);
disp.setDigitSegments(1, [1, 0, 1, 1, 0, 1, 1, 1]);
disp.setDigitSegments(2, [1, 0, 0, 1, 1, 1, 1, 1]);
disp.setDigitSegments(3, [0, 1, 0, 0, 1, 1, 0, 1]);
//set module for segment
var MAX7219 = require('max7219');
var disp = new MAX7219("/dev/spidev0.0");
//init
disp.setDecodeAll();
disp.setScanLimit(8);
disp.startup();
disp.setDisplayIntensity(15);
//display
disp.setDigitSymbol(0, "H", true);
disp.setDigitSymbol(1, "-");
disp.setDigitSymbol(2, "L");
disp.setDigitSymbol(3, "-", true);
DigitSegments 방식 출력하기 DigitSymbol 방식 출력하기
7-Segment에 출력하기
//set module for segment
var MAX7219 = require('max7219');
var disp = new MAX7219("/dev/spidev0.0");
//init
disp.setDecodeAll();
disp.setScanLimit(8);
disp.startup();
disp.setDisplayIntensity(15);
//display
disp.setDigitSegments(0, [0, 0, 1, 1, 0, 1, 1, 0]);
disp.setDigitSegments(1, [0, 0, 1, 1, 0, 1, 1, 1]);
disp.setDigitSegments(2, [0, 0, 1, 1, 0, 1, 1, 0]);
disp.setDigitSegments(3, [0, 0, 1, 1, 0, 1, 1, 1]);
//set module for segment
var MAX7219 = require('max7219');
var disp = new MAX7219("/dev/spidev0.0");
//init
disp.setDecodeAll();
disp.setScanLimit(8);
disp.startup();
disp.setDisplayIntensity(15);
//display
disp.setDigitSymbol(0, 0);
disp.setDigitSymbol(1, 3);
disp.setDigitSymbol(2, 1);
disp.setDigitSymbol(3, 4);
DigitSegments 방식 출력하기 DigitSymbol 방식 출력하기
Temperature-humidity Sensor
THINKER TO MAKER
온습도 센서(DHT-11)
온습도 센서
GND
DATA
VCC
온도와 습도를 동시에 측정할 수 있는 센서
모델명 용도 온도 측정 범위 습도 측정 범위
DHT11 실내용 0 ~ 50도 20 ~ 80%
온습도 센서
//set module for dhht11
var dht = require('node-dht-sensor');
//init pin number
dht.initialize(11, 21);
//check temp, humidity
setInterval(function(){
console.log(dht.read());
}, 1000);
Remote Control with Smart Phone
THINKER TO MAKER
스마트폰으로 제어하기
개념
REMOTE
CONTROLLER
RASPBERRY PI
HTML
JAVASCRIPT JAVASCRIPT
Send/Receive
view
<html>
<head>
<title>remote control</title>
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="http://www.circul.us/circulus.js"></script>
<script src="index.js"></script>
</head>
<body>
<div> LED </div>
<button id='ledon'>ON</button>
<button id='ledoff'>OFF</button></br></br>
<div>ULTRA</div>
<button id='ultra'>ULTRA</button>
<span id='distance'>0</span>cm </br></br>
<div>TEMP/HUMI</div>
<button id='temp'>TEMP</button>
<span id='tempinfo'>0</span></br>
<button id='humi'>HUMI</button>
<span id='humiinfo'>0</span></br></br>
<span> SEGMENT</span>
<span id='segment'>0</span>
</body>
</html>
HTML로 외관 만들기
Remote Controller 확인하기
해당 주소로 PC, 스마트폰 등 다양한 기기에서 바로 사용 가능
간편 주소
circul.us/cloud/ID/프로젝트 이름/파일명.html
Socket 통신
$('#KEY').click(function(){
us.send(‘KEY');
});
JAVASCRIPT JAVASCRIPT
Send/Receive
us.receive(‘KEY,’ function(DATA){
/* 수행하고 싶은 내용 */
});
us.receive(‘KEY', function(DATA){
$('#KEY').text(DATA`);
});
Us.send(‘KEY’, DATA);
Remote Controller 초기화
$c.ready(function(us){
us.init('b5861b8d')
…
…
//us.send(KEY, DATA);
//us.receive(KEY, DATA);
});
Remote Controller (index.js)
자신의 라즈베리파이 시리얼 번호로 초기화
LED ON/OFF
$('#ledon').click(function(){
us.send('ledon');
});
$('#ledoff').click(function(){
us.send('ledoff');
});
var us = require('circulus');
us.receive('ledon', function(data){
console.log(“ledon receive”);
us.initLED(23);
us.setLED(true);
});
us.receive('ledoff', function(data){
console.log(“ledoff receive”);
us.initLED(23);
us.setLED(false);
});
Remote Controller (index.js) Raspberry Pi (index.js)
//circulus 자체 API를 사용하였습니다.
//bcm GPIO 번호
초음파 센서 거리 출력
$('#ultra').click(function(){
us.send('ultra');
});
us.receive('distance', function(data){
$('#distance').text(data);
});
us.receive('ultra', function(data){
console.log("ultra receive");
us.initDistance(15, 14);
var dist = Math.floor(us.getDistance());
us.send('distance', dist);
console.log(dist + " cm");
});
Remote Controller (index.js) Raspberry Pi (index.js)
//circulus 자체 API를 사용하였습니다.
//Trig, Echo
온/습도 출력
$('#temp').click(function(){
us.send('temp');
});
us.receive('tempinfo', function(data){
$('#tempinfo').text(data);
});
$('#humi').click(function(){
us.send('humi');
});
us.receive('humiinfo', function(data){
$('#humiinfo').text(data);
});
us.receive('temp', function(data){
console.log("temp receive");
us.initTemp(21);
var tempinfo = us.getTemp();
console.log(tempinfo.temperature);
us.send('tempinfo', tempinfo.temperature);
});
us.receive('humi', function(data){
console.log("humi receive");
us.initTemp(21);
var humi = us.getTemp();
console.log(humi.humidity);
us.send('humiinfo', humi.humidity);
Remote Controller (index.js) Raspberry Pi (index.js)
//circulus 자체 API를 사용하였습니다.
us.initText();
var i = 0;
setInterval(function(){
us.setText(i.toString() + i.toString() + i.toString() +
i.toString(), true, false, false, true);
var text = i.toString() + i.toString() + i.toString() +
i.toString();
i++;
if(i == 10)
i = 0;
console.log(text);
us.send('segment', text);
}, 1000);
세그먼트 출력
us.receive('segment', function(data){
$('#segment').text(data);
});
Remote Controller (index.js) Raspberry Pi (index.js)
//circulus 자체 API를 사용하였습니다.
Circulus API
THINKER TO MAKER
그 밖에 Circulu API
Circulus API 목록(/node_module/circulus, index.js)
camera: [Function]
stream: [Function
info: [Function]
send: [Function]
receive: [Function]
error: [Function]
join: [Function]
write: [Function]
read: [Function]
reboot: [Function]
shutdown: [Function]
update: [Function]
ttsStop: [Function]
tts: [Function]
set: [Function]
talk: [Function]
get: [Function]
initSPWM: [Function]
writeSPWM: [Function]
initText: [Function]
setBrightness: [Function]
setText: [Function]
setDigit: [Function]
getLight: [Function]
initDistance: [Function]
getDistance: [Function]
removeDistance: [Function]
initTemp: [Function]
getTemp: [Function]
initLCD: [Function]
removeLCD: [Function]
setLCD: [Function]
initLED: [Function]
setLED: [Function]
initButton: [Function]
getButton: [Function]
getText: [Function]
getGeolocation: [Function]
잠깐!
추가한 모듈의 기능을 확인하고 싶을 때는?
var us = require(‘circulus’);
console.log(us);
Console 창에서 기능리스트를 확인할 수 있다!
Design
THINKER TO MAKER
자신만의 작품 구상하기
무엇을 만들 수 있을까요?
무엇을 만들 수 있을까요?
Making
THINKER TO MAKER
만들어보기
메이킹 과정
아이디어
서비스 기획
프로토 타이핑
하드웨어 구성
소프트웨어 구성
3D 프린팅
결과 공유
만들고자 하는 아이디어를 떠올리는 단계이다.
아이디어를 서비스로 구체화 한다. 이 단계에서는 보여질 모습 뿐만 아
니라, 보이지는 않지만 사용자에게 어떤 가치를 제공할지도 염두 해 둔
다.
블록 등으로 만들어질 하드웨어 모습을 구성해 보고, 이를 사용할 모바
일 어플리케이션이 있다면 종이에 그 이미지를 구성해 본다.
오픈소스 하드웨어로 만들고자 한 내용을 구성해 본다. 프로토 타이핑및
최종적으로 보여질 외관을 고려하여 센서 및 각종 하드웨어의 배치도 고
려한다.
하드웨어를 제어할 소프트웨어와 리모콘 용도로 사용될 소프트웨어, 그
리고 서비스 제공을 위한 소프트웨어를 구성한다.
Making 한 제품의 외관과 인쇄 가능 한 부속들을 3D 모델링하고, 결과물
을 3D 프린팅하여 하드웨어를 최종 완성한다.
제품을 완성하여 외부에 공개한다. 만일 판매를 목적으로 한 제품이라면
소셜 펀딩을 이용하여 판매 가능성을 확인해 본다.
S/W를 손쉽게!!
www.npmjs.com
1. 센서 조회
2. npm 설치
3. 소스코드에서 require
외관을 만드는 방법!
3D 프린터 레지저 커터
사용 가능 장소 :
무한 상상실, 팹랩, 테크샵 등 전국 메이커 스페이스
필요한 도안을 찾는 법!
Thingiverse Instructables Makeall.com
Thank you
감사합니다.
W www.circul.us G group.circul.us
S social.circul.us C cafe.circul.us
CONTACT.US circulus@circul.us
EXPAND YOUR DIMENSION
생각에 머무는 THINKER 에서
직접 만드는 MAKER 시대
CIRCULUS 가 함께 합니다
SINCE 2013

라즈베리파이 IoT 시작하기