Quantcast
Channel: Hard Copy Arduino
Viewing all 99 articles
Browse latest View live
โ†ง

ESP8266 โ€“ Arduino IDE ์˜ˆ์ œ (GPIO ์ œ์–ด)

$
0
0

ย 

๋ณธ ๋ฌธ์„œ๋Š” ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ(IDE)๋ฅผ ์ด์šฉํ•ด์„œ ESP8266 ๋ชจ๋“ˆ์„ ๋‹ค๋ฃจ๋Š” ์˜ˆ์ œ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ESP8266 Arduino IDE ๋Š” ESP8266 ๋ชจ๋“ˆ์˜ ํŽŒ์›จ์–ด๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.ย ESP8266 Arduino IDE ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ESP8266์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๊ฐ€ ์ด๋ฏธ ๊ฐ–์ถ”์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. [Arduino IDE โ€“ File โ€“ Examples โ€“ ESP8266xxx] ์˜ˆ์ œ๋“ค์„ ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์†Œ๊ฐœํ•˜๋Š” ์˜ˆ์ œ๋Š” NodeMCU V1 (ESP12E ๊ธฐ๋ฐ˜) ๋ณด๋“œ์—์„œ ๋™์ž‘ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ์˜ˆ์ œ๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ๊ฐœ๋ฅผ ์œ„ํ•ด ์˜ˆ์ œ ์ฝ”๋“œ์— ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ๊ฐ€ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

NodeMCU ๋ณด๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•€์ด ๋ฐฐ์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŽŒ์›จ์–ด ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ FTDI ๋ชจ๋“ˆ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์–ด์„œ PC์— USB ์—ฐ๊ฒฐ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node-MCU-Pin-Out-Diagram1

ย 

ย 

Blink (Digital Output)

ย 

๊ฐ€์žฅ ์‰ฝ๊ณ  ๋‹จ์ˆœํ•œ LED ์ผœ๊ธฐ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

LED ๋Š” ์ €ํ•ญ๊ณผ ํ•จ๊ป˜ NodeMCU ๋ณด๋“œ์˜ GPIO14 (D5) ํ•€์— ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

int LED = 14;    // Use D5, GPIO14

void setup() {
  pinMode(LED, OUTPUT);     // Initialize the LED pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED, LOW);   // Turn the LED
  delay(1000);    // Wait for a seconds
  digitalWrite(LED, HIGH);  // Turn the LED
  delay(1000);    // Wait for a seconds
}

์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์•„์‹ค ์ˆ˜ ์žˆ๋“ฏ, ํ•€ ๋ฒˆํ˜ธ ๋นผ๊ณ  ์•„๋‘์ด๋…ธ ์Šค์ผ€์น˜์™€ ์™„์ „ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. pinMode() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํŠน์ • ํ•€์„ ์ดˆ๊ธฐํ™” ํ•ด์คฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  digitalWrite ํ•จ์ˆ˜๋กœ 3V ์ถœ๋ ฅ์„ on/off ํ•ด์ค๋‹ˆ๋‹ค.

์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด ESP8266 ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“  ๋ชฉ์ ์ด ๋ฐ”๋กœ ์ด๊ฒ๋‹ˆ๋‹ค. ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๊ฐ€์žฅ ๋ณดํŽธํ™”๋œ ๊ฐœ๋ฐœ๋ฐฉ๋ฒ•์„ ESP8266 ์—๋„ ์ ์šฉํ•จ์œผ๋กœ์จ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์ˆ˜ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ๋„ ํ•ด์ฃผ๊ณ , ๋ณด๋‹ค ์‰ฝ๊ฒŒ ESP8266 ํŽŒ์›จ์–ด ์ œ์ž‘์„ ์‹œ์ž‘ํ•˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

์•„๋‘์ด๋…ธ์™€ ์‚ฌ์šฉ๋ฒ•์€ ๋™์ผํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. setup() ํ•จ์ˆ˜์ดํ›„ loop() ํ•จ์ˆ˜๋Š” ๋ฌดํ•œ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ loop() ํ•จ์ˆ˜๊ฐ€ ํ•œ๋ฒˆ ๋๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  ๋‹ค์Œ loop() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ์ „ ESP8266 ์˜ ๋ณต์žกํ•œ WiFi ํ†ต์‹  ๊ธฐ๋Šฅ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ESP8266 core๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œย loop() ํ•จ์ˆ˜์—์„œ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฌ๋ฉด ESP8266 core๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž๊ธฐ ์—ญํ• ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๊ธ‰์  loop()๋ฅผ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ด๋“œ์—์„œ๋Š” loop() ์•ˆ์˜ ์‚ฌ์šฉ์ž ๋ฃจํ‹ด์ด 50ms ์ด๋‚ด์— ๋๋‚˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ์ด์ƒ์˜ ์‹œ๊ฐ„์„ ์š”ํ• ๊ฒฝ์šฐ ์ค‘๊ฐ„์— delay() ํ•จ์ˆ˜๋กœ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. delay() ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฃจํ‹ด์„ ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  ESP8266 core๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. (yield() ํ•จ์ˆ˜๋„ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋Š”๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.)

ย 

ย 

Button (Digital Input)

ย 

digitalWrite() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ LED ์ถœ๋ ฅ์„ ์ œ์–ดํ•ด๋ดค์œผ๋‹ˆ ์ด๋ฒˆ์—๋Š” digitalRead() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋””์ง€ํ„ธ ์ž…๋ ฅ์„ ๋ฐ›์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ์—ฐ๊ฒฐํ•ด์„œ ํด๋ฆญ์„ ์ธ์‹ํ•œ ๋’ค, LED๋ฅผ on/off ์‹œํ‚ค๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ GPIO4(D2) ํ•€์— pull-down ์ €ํ•ญ์„ ์ด์šฉํ•ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ESP8266 GPIO14 ==> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 1
  • ESP8266 3V ==> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 2
  • ESP8266 GNDย ==> 10K ์ €ํ•ญ ==> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 2

์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

int LED = 14;    // Use D5, GPIO14
int BUTTON = 4;    // Use D2, GPIO4

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);     // Initialize the LED pin as an output
  pinMode(BUTTON, INPUT);     // Initialize the BUTTON pin as an input
}

// the loop function runs over and over again forever
void loop() {
  boolean buttonPressed = digitalRead(BUTTON);
  Serial.println(buttonPressed);
  digitalWrite(LED, buttonPressed);
  delay(100);  // Wait for a while
}

setup() ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜์—์„œ ๋ฒ„ํŠผ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด GPIO 4๋ฒˆ ํ•€์„ INPUT ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  loop() ๋ฐ˜๋ณตํ•จ์ˆ˜์—์„œ๋Š” digitalRead() ํ•จ์ˆ˜๋กœ ๋ฒ„ํŠผ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ HIGH(=true, 3V, ๋ฒ„ํŠผ ํด๋ฆญ) ๋˜๋Š” LOW(=false, 0V, GND, ๋ฒ„ํŠผ ๋ฆด๋ฆฌ์ฆˆ) ๊ฐ’์œผ๋กœ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฐ’์„ ๊ทธ๋Œ€๋กœ digitalWrite() ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค LED๊ฐ€ ์ผœ์ง‘๋‹ˆ๋‹ค.

ย 

ย 

Potentiometerย (ANALOG INPUT)

ย 

์ด๋ฒˆ์—๋Š” ์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

  • https://github.com/godstale/ESP8266_Arduino_IDE_Example/blob/master/example/AnalogInput_Potentiometer/AnalogInput_Potentiometer.ino

์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ์„ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํฌํ…์…”๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌํ…์…”๋ฏธํ„ฐ๋ฅผย ADC0(A0) ์•„๋‚ ๋กœ๊ทธ ํ•€์— ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ํฌํ…์…”๋ฏธํ„ฐ 1 ํ•€ ==> ESP8266 3V
  • ํฌํ…์…”๋ฏธํ„ฐ 2ย ํ•€ (๊ฐ€์šด๋ฐ ํ•€) ==> ESP8266 ADC0(A0)
  • ํฌํ…์…”๋ฏธํ„ฐ 3ย ํ•€ ==> ESP8266ย GND

๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์œผ๋กœ ํฌํ…์…”๋ฏธํ„ฐ์—์„œ ์ฝ์€ ์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

void setup() {
  Serial.begin(115200);
}

// the loop function runs over and over again forever
void loop() {
  int analog = analogRead(A0);
  Serial.println(analog);
  delay(100);  // Wait for a while
}

์•„๋‘์ด๋…ธ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. analogRead() ํ•จ์ˆ˜๋กœ ์•„๋‚ ๋กœ๊ทธ ํ•€์˜ ์ „์•• ๋ณ€ํ™”๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ESP8266 ๋ชจ๋“ˆ์€ ์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ ํ•€์ด ํ•˜๋‚˜(A0, ADC0) ๋ฟ์ž…๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ๋Š” ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์„ ์œ„ํ•ด Serial.begin() ์œผ๋กœ ํ†ต์‹  ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์คฌ์Šต๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ์ฒ˜๋Ÿผ Serial.print(), println(), available(), read() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

LED DIMMINGย (PWM โ€“ ANALOG OUTPUT)

ย 

์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” PWM์„ ์ด์šฉํ•ด์„œ LED ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด ๋ณผ๊ฒ๋‹ˆ๋‹ค. ์•ž์„  ์˜ˆ์ œ์—์„œ ํฌํ…์…”๋ฏธํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์œผ๋‹ˆ ํฌํ…์…”๋ฏธํ„ฐ๋กœ LED ๋ฐ๊ธฐ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ• ๊ฒ๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์‚ฌ์šฉํ•œ LED, ํฌํ…์…”๋ฏธํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

int LED = 14;    // Use D5, GPIO14

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);     // Initialize the LED pin as an output
}

// the loop function runs over and over again forever
void loop() {
  int analog = analogRead(A0);
  Serial.println(analog);
  analogWrite(LED, analog/4);
  delay(100);  // Wait for a while
}

PWM ์‚ฌ์šฉ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. setup() ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜์—์„œ pinMode()๋กœ LED ํ•€์„ OUTPUT ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  analogWrite() ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ์จ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (0~255)

ํฌํ…์…”๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ฝ๋Š” analogRead() ๋ฒ”์œ„๊ฐ€ 0~1023์ด๋‹ˆ 4๋กœ ๋‚˜๋ˆ ์ค€ ๊ฐ’์„ analogWrite() ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ย 

๊ธฐํƒ€ ์˜ˆ์ œ

ย 

์œ„์—์„œ ์†Œ๊ฐœํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์„ผ์„œ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์•„๋‘์ด๋…ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย ์•„๋‘์ด๋…ธ ์ œ์–ด๋ฅผ ์œ„ํ•ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ ESP8266์—์„œ๋„ ๋ฌธ์ œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ESP8266์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ (ํ…Œ์ŠคํŠธ ๋œ) ํ˜ธํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • Adafruit_ILI9341 โ€“ Port of the Adafruit ILI9341 for the ESP8266
  • arduinoVNC โ€“ VNC Client for Arduino
  • arduinoWebSockets โ€“ WebSocket Server and Client compatible with ESP8266 (RFC6455)
  • aREST โ€“ REST API handler library.
  • Blynk โ€“ easy IoT framework for Makers (check out the Kickstarter page).
  • DallasTemperature
  • DHT-sensor-library โ€“ Arduino library for the DHT11/DHT22 temperature and humidity sensors. Download latest v1.1.1 library and no changes are necessary. Older versions should initialize DHT as follows: DHT dht(DHTPIN, DHTTYPE, 15)
  • Encoder โ€“ Arduino library for rotary encoders. Version 1.4 supports ESP8266.
  • NeoPixel โ€“ Adafruitโ€™s NeoPixel library, now with support for the ESP8266 (use version 1.0.2 or higher from Arduinoโ€™s library manager).
  • NeoPixelBus โ€“ Arduino NeoPixel library compatible with ESP8266. Use the โ€œDmaDrivenโ€ or โ€œUartDrivenโ€ branches for ESP8266. Includes HSL color support and more.
  • PubSubClient โ€“ MQTT library by @Imroy.
  • RTC โ€“ Arduino Library for Ds1307 & Ds3231 compatible with ESP8266.
  • Souliss, Smart Home โ€“ Framework for Smart Home based on Arduino, Android and openHAB.
  • ST7735 โ€“ Adafruitโ€™s ST7735 library modified to be compatible with ESP8266. Just make sure to modify the pins in the examples as they are still AVR specific.
  • Task โ€“ Arduino Nonpreemptive multitasking library. While similiar to the included Ticker library in the functionality provided, this library was meant for cross Arduino compatibility.
  • UTFT-ESP8266 โ€“ UTFT display library with support for ESP8266. Only serial interface (SPI) displays are supported for now (no 8-bit parallel mode, etc). Also includes support for the hardware SPI controller of the ESP8266.
  • WiFiManager โ€“ WiFi Connection manager with web captive portal. If it canโ€™t connect, it starts AP mode and a configuration portal so you can choose and enter WiFi credentials.
  • OneWire โ€“ Library for Dallas/Maxim 1-Wire Chips.
  • Adafruit-PCD8544-Nokia-5110-LCD-Library โ€“ Port of the Adafruit PCD8544 โ€“ library for the ESP8266.

ย 

์ธํ„ฐ๋„ท์„ ๊ฒ€์ƒ‰ํ•ด ๋ณด๋ฉด ์ด ์™ธ์—๋„ ์ฃผ์š”ํ•œ ์„ผ์„œ๋“ค์˜ ์˜ˆ์ œ๋ฅผ ๊ตฌํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

ย 

โ†ง

ESP8266 โ€“ ARDUINO IDE ์˜ˆ์ œ (WiFi ํ†ต์‹ )

$
0
0

ย 

๋ณธ ๋ฌธ์„œ๋Š” ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ(IDE)๋ฅผ ์ด์šฉํ•ด์„œ ESP8266 ๋ชจ๋“ˆ์„ ๋‹ค๋ฃจ๋Š” ์˜ˆ์ œ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ESP8266 Arduino IDE ๋Š” ESP8266 ๋ชจ๋“ˆ์˜ ํŽŒ์›จ์–ด๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.ย ESP8266 Arduino IDE ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ESP8266์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๊ฐ€ ์ด๋ฏธ ๊ฐ–์ถ”์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. [Arduino IDE โ€“ File โ€“ Examples โ€“ ESP8266xxx] ์˜ˆ์ œ๋“ค์„ ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์†Œ๊ฐœํ•˜๋Š” ์˜ˆ์ œ๋Š” NodeMCU V1 (ESP12E ๊ธฐ๋ฐ˜) ๋ณด๋“œ์—์„œ ๋™์ž‘ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ์˜ˆ์ œ๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ๊ฐœ๋ฅผ ์œ„ํ•ด ์˜ˆ์ œ ์ฝ”๋“œ์— ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•์ด ๊ฐ€ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

NodeMCU ๋ณด๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•€์ด ๋ฐฐ์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŽŒ์›จ์–ด ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ FTDI ๋ชจ๋“ˆ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์–ด์„œ PC์— USB ์—ฐ๊ฒฐ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node-MCU-Pin-Out-Diagram1

ย 

ย 

WiFi ํ†ต์‹  ๊ธฐ๋ณธ

ย 

WiFi ํ†ต์‹ ์„ ์œ„ํ•œ ๊ธฐ์ดˆ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ตฌํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์†Œ์Šค์ฝ”๋“œ๋Š” ๋‹จ์ˆœํžˆ ESP8266 ๋ชจ๋“ˆ์„ ๊ณต์œ ๊ธฐ์— ์—ฐ๊ฒฐ๋งŒ ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๋ฐœ์ƒ๋˜๋Š” WiFi ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ ์ƒ๋‹จ์— ๊ณต์œ ๊ธฐ(AP)์˜ SSID, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const char *ssid = "your_ssid";
const char *password = "your_pass";

์†Œ์Šค์ฝ”๋“œ์˜ setup() ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

void setup() {
    Serial.begin(115200);

    // delete old config
    WiFi.disconnect(true);
    delay(1000);
    WiFi.onEvent(WiFiEvent);
    WiFi.begin(ssid, password);
    Serial.println("Wait for WiFi... ");
}

WiFi ๊ฐ€ ESP8266 core์—์„œ ์ œ๊ณตํ•˜๋Š” ํ†ต์‹  ๊ธฐ๋Šฅ๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”ย ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค. WiFi.onEvent() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WiFi.onEvent(WiFiEvent);

์œ„ ์ฒ˜๋Ÿผ ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉดย WiFiEvent() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…์„ WiFiEvent() ํ•จ์ˆ˜์— ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” ESP8266WiFiType.h ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typedef enum {
    WIFI_EVENT_STAMODE_CONNECTED = 0,
    WIFI_EVENT_STAMODE_DISCONNECTED,
    WIFI_EVENT_STAMODE_AUTHMODE_CHANGE,
    WIFI_EVENT_STAMODE_GOT_IP,
    WIFI_EVENT_STAMODE_DHCP_TIMEOUT,
    WIFI_EVENT_SOFTAPMODE_STACONNECTED,
    WIFI_EVENT_SOFTAPMODE_STADISCONNECTED,
    WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED,
    WIFI_EVENT_MAX
} WiFiEvent_t;

๋ณด์‹œ๋‹ค์‹œํ”ผ AP์— ์—ฐ๊ฒฐ๋œ ํ›„ IP๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

SSID, ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ดย AP์— ์—ฐ๊ฒฐํ•˜๋Š” ํ•จ์ˆ˜๋Š” setup() ์•ˆ์— ์žˆ๋Š”ย WiFi.begin() ์ž…๋‹ˆ๋‹ค.

  • WiFi.begin(ssid, password);

ย 

ย 

WiFi Client (HTTP Request)

ย 

์ด๋ฒˆ ์˜ˆ์ œ๋Š” ESP8266 ๋ชจ๋“ˆ์„ ๊ณต์œ ๊ธฐ์— ์—ฐ๊ฒฐํ•˜๊ณ , ์™ธ๋ถ€์˜ HTTP ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๊ฒฐ๊ณผ(HTML ๋˜๋Š” ํŒŒ์ผ)๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ์˜ˆ์ œ๋“ค์€ ๋ชจ๋‘ ์•„๋ž˜ SSID, ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž์‹ ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ง€์ •ํ•ด์ค˜์•ผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

const char *ssid = "your_ssid";
const char *password = "your_pass";

์ด๋ฒˆ ์˜ˆ์ œ์—์„œ HTTP ํ†ต์‹ ์„ ํ†ตํ•ด ๋ฐ›์•„์˜ฌ ์„œ๋ฒ„๋„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด์ฃผ์„ธ์š”.

const char* host = "hardcopyworld.com";

ย 

๋จผ์ € setup() ํ•จ์ˆ˜์˜ ๋‚ด์šฉ๋ถ€ํ„ฐ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋‚ด์šฉ๋งŒ ๋ฝ‘์•„๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

void setup() {
  ......
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  ......
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

WiFi.begin(ssid, password) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ณต์œ ๊ธฐ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ด์–ด์ง€๋Š” while() ๋ฐ˜๋ณต๋ฌธ์€ ๊ณต์œ ๊ธฐ์— ์ ‘์†ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์œ ๊ธฐ์— ์ ‘์†๋˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ Serial ํ†ต์‹ ์œผ๋กœ ํ• ๋‹น๋ฐ›์€ IP๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • Serial.println(WiFi.localIP());

ย 

loop() ๋ฐ˜๋ณตํ•จ์ˆ˜์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ(์•ฝ 5์ดˆ ๊ฐ„๊ฒฉ) HTTP ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ Serial ํ†ต์‹ ์œผ๋กœ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค. ์ฃผ์š” ์ฝ”๋“œ๋งŒ ๋ฐœ์ทŒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

void loop() {
  delay(5000);
  ......
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  // We now create a URI for the request
  String url = "/";
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  int timeout = millis() + 5000;
  while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
}

ย 

๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” WiFiClient ํด๋ž˜์Šค๋Š” TCP ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. host์™€ port ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ•ด๋‹น ์„œ๋ฒ„์— TCP ์—ฐ๊ฒฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” host ๋ณ€์ˆ˜์—๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„ [hardcopyworld.com] ์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

ย 

TCP ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ•˜๋ฉด HTTP Request ํ˜•์‹์— ๋งž๊ฒŒ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์„œ ์ „์†กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");

์—ฌ๊ธฐ์„œ url ๋ณ€์ˆ˜๋Š” host ๋„๋ฉ”์ธ ๋‚ด๋ถ€์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊นŒ์ง€์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ [http://www.google.com/my/resource.html] ์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด host๋Š”ย [http://www.google.com] ์ด ๋ฉ๋‹ˆ๋‹ค. url ์€ย [/my/resource.html] ๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ http://google.com ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด host๋Š” [http://google.com], url์€ [/] ๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

client.print() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์š”์ฒญ์ด ์ „์†ก๋˜๋ฉด ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์‘๋‹ต์ด ์˜ต๋‹ˆ๋‹ค.

while (client.available() == 0) {
    if (timeout - millis() < 0) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }

client ์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ด์„œ ์‘๋‹ต์ด ์™”๋Š”์ง€ ํ™•์ธํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

ย 

HTTP Response๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋กœ ํ•œ ๋ผ์ธ์”ฉ ์ฝ์–ด Serial ํ†ต์‹ ์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์ด ๋ถ€๋ถ„์„ ์ ์ ˆํžˆ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

ย 

ย 

Web server

ย 

์ด๋ฒˆ์—๋Š” ESP8266 ๋ชจ๋“ˆ์„ ์›น ์„œ๋ฒ„๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ์žฅ์น˜์—์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ESP8266 ๋ชจ๋“ˆ์— ์ ‘์†ํ•ด์„œ HTML ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์—์„œโ€ฆ

ํ…Œ์ŠคํŠธ ์ „ GPIO13 (D7) ํ•€์— LED๋ฅผ ํ•˜๋‚˜ ์—ฐ๊ฒฐํ•ด๋‘์„ธ์š”. ์™ธ๋ถ€์—์„œ ์ ‘์† ์š”์ฒญ์ด ์˜ค๋ฉด LED๊ฐ€ ์ผœ์ง€๋„๋ก ๋งŒ๋“ค๊ฒ๋‹ˆ๋‹ค.

ย 

ํŒŒ์ผ ์ƒ๋‹จ์—์„œ ๊ณต์œ ๊ธฐ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const char *ssid = "your_ssid";
const char *password = "your_pass";
ESP8266WebServer server ( 80 );
const int led = 13;

ESP8266WebServer ํด๋ž˜์Šค์— ์›น ์„œ๋ฒ„๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 80๋ฒˆ ํฌํŠธ๋กœ HTTP ํ†ต์‹ ์„ ํ•˜๋„๋ก ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋ฒ„์˜ ํ†ต์‹  ํฌํŠธ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน๋ณ„ํžˆ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด 80๋ฒˆย ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ย 

setup ํ•จ์ˆ˜์˜ ์ฃผ์š” ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

void setup ( void ) {
	......
	WiFi.begin ( ssid, password );
	......
	server.on ( "/", handleRoot );
	server.on ( "/test.svg", drawGraph );
	server.on ( "/inline", []() {
		server.send ( 200, "text/plain", "this works as well" );
	} );
	server.onNotFound ( handleNotFound );
	......
	server.begin();
	......
}

WiFi.begin() ํ•จ์ˆ˜๋กœ ๊ณต์œ ๊ธฐ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๊ณต์œ ๊ธฐ ์ ‘์†์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ํ• ๋‹น๋ฐ›์€ IP ์ฃผ์†Œ๋ฅผ Serial ํ†ต์‹ ์œผ๋กœ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

sever.on() ํ•จ์ˆ˜๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์ธ ์„œ๋ฒ„์„ค์ • ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ๋Š” 3๊ฐœ์˜ URL์— ๋Œ€ํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ด ์คฌ์Šต๋‹ˆ๋‹ค.

  • http://192.168.x.x/ : ์„œ๋ฒ„์˜ ๋ฃจํŠธ[/] ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์€ handleRoot() ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ
  • http://192.168.x.x/inline : [/inline] ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ โ€“ [this works as well] ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ
  • http://192.168.x.x/test.svg : [/test.svg] ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ drawGraph ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ

๋งŒ์•ฝ ์œ„ ๊ฒฝ๋กœ์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ์š”์ฒญ์ด ์˜ฌ ๊ฒฝ์šฐ๋Š” handleNotFound() ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ ์„œ๋ฒ„ ์„ค์ •์ด ๋๋‚˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • server.begin();

ย 

loop() ํ•จ์ˆ˜์—์„œ๋Š” ์™ธ๋ถ€์—์„œ ์ ‘์† ์š”์ฒญ์ด ์˜ค๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

void loop ( void ) {
	server.handleClient();
}

ย 

์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย handleRoot() ํ•จ์ˆ˜๋ฅผ ๋ณด์‹œ๋ฉด HTML ๋ฌธ์ž์—ด์„ client์—๊ฒŒ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ํŠน์ดํ•œ๊ฒŒ drawGraph() ์ฝœ๋ฐฑํ•จ์ˆ˜์ธ๋ฐ,ย [/test.svg] ํŒŒ์ผ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์˜ค๋ฉด ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. svg ๋Š” ๋ฒกํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. svg ํŒŒ์ผ์€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ๋ฒกํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ XML ํ…์ŠคํŠธ๋กœ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ›์œผ๋ฉด ํ•ด๋‹น ์ •๋ณด๋Œ€๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ ค ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์น˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ drawGraph() ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ผ๋ จ์˜ XML ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด ์ „์†กํ•ด์ค๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œย [http://x.x.x.x/test.svg] ๊ฒฝ๋กœ์— ์ ‘์†ํ•ด๋ณด๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์ผ๊ป๋‹ˆ๋‹ค.

์•ž์„œ handleRoot() ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑํ•˜๋Š” HTML ์ฝ”๋“œ์—๋„ย [/test.svg] ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ธŒ๋ผ์šฐ์ €๋Š”ย [/test.svg] ์— ๋Œ€ํ•œ ์š”์ฒญ๋„ ์ถ”๊ฐ€๋กœ ํ•ด์„œ ๋ฒกํ„ฐ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ํ™”๋ฉด์„ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.

ย 

ย 

Web Socket (server)

ย 

์•ž์„  ์˜ˆ์ œ์ฒ˜๋Ÿผ ์›น ์„œ๋ฒ„๋Š” ์™ธ๋ถ€์—์„œ์˜ ์š”์ฒญ์ด ์žˆ์„๋•Œ๋งˆ๋‹ค HTML ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ํŽ˜์ด์ง€๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ค๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ „ํ†ต์ ์ธ ์›น์˜ ๋™์ž‘ ๋ฐฉ์‹์ด์ง€๋งŒ ํ™”๋ฉด ํ˜น์€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์›น ์„œ๋ฒ„์— (๊ฐ™์€ URL ์ฃผ์†Œ์—) ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด๊ณ  ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ HTTP ์š”์ฒญ์„ ์—†์• ๊ณ  ํ™”๋ฉด ์ผ๋ถ€๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Web Socket ์ด ์ด๋Ÿฐ ์ž์œ ๋กœ์šด ํ†ต์‹  ๋ฐฉ์‹์„ ์ œ๊ณตํ•ด์ค๋‹ˆ๋‹ค. HTML5์— ํฌํ•จ๋œ Web Socket์€ ์›น ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €์˜ JavaScript) ๊ฐ„ TCP/IP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ฒŒ ํ•ด ์คŒ์œผ๋กœ์จ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ์œ„ํ•ด ๊ณ„์† ์„œ๋ฒ„๋ฅผ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ์•Œ๋ฆผ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋Š” push๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„๊ต์  ์ตœ์‹ ์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.ย ๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํžˆ ์„œ๋ฒ„์—๋Š” WebSocket ํ†ต์‹ ์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ESP8266 ๋ชจ๋“ˆ์— ์›น ์„œ๋ฒ„ + ์›น ์†Œ์ผ“ ๊ธฐ๋Šฅ์„ ์‹ฌ์„๊ฒ๋‹ˆ๋‹ค.

ย 

์›น ์†Œ์ผ“ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถˆํ–‰ํžˆ๋„, ํ˜„์žฌ(2016, 01 ๊ธฐ์ค€) ์•„๋‘์ด๋…ธ IDE โ€“ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ๋ฐฐํฌ๋˜๋Š” ESP8266 core ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์— ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์ผ๋ถ€ ๋น ์ ธ์žˆ์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ์˜ˆ์ œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์‹  ESP8266 core for Arduino ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„ ์ˆ˜๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

์›น ์†Œ์ผ“ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ๋Š” ์•„๋ž˜ ๋งํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

ino ์Šค์ผ€์น˜ ํŒŒ์ผ์˜ ์ƒ๋‹จ์— ๋ณด๋ฉด ์›น ์„œ๋ฒ„, ์›น ์†Œ์ผ“์„ ์œ„ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•„์‹ค ์ˆ˜ ์žˆ๋“ฏ ์›น ์„œ๋ฒ„์™€ ์›น์†Œ์ผ“์€ ๊ฐ๊ฐ 80๋ฒˆ, 81๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ESP8266WebServer server = ESP8266WebServer(80);
WebSocketsServer webSocket = WebSocketsServer(81);

setup() ํ•จ์ˆ˜๋ถ€ํ„ฐ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

void setup() {
    ......
    WiFiMulti.addAP("your_ssid", "your_pass");
    ......
    webSocket.begin();
    webSocket.onEvent(webSocketEvent);
    ......
    // handle index
    server.on("/", []() {
        // send index.html
        server.send(200, "text/html", html_string);
    });
    server.begin();
    ......
}

์•ž์„  ์˜ˆ์ œ์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ WiFiMulti.addAP() ํ•จ์ˆ˜๋กœ ๊ณต์œ ๊ธฐ์—” ์—ฐ๊ฒฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„ ์ฐจ์ด ์—†์Šต๋‹ˆ๋‹ค๋งŒ, ์—ฌ๋Ÿฌ๊ฐœ์˜ AP๋ฅผ ๋“ฑ๋กํ•ด์„œ ์ž๋™ ์—ฐ๊ฒฐ๋˜๋„๋ก ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด์–ด์„œ ์›น ์†Œ์ผ“์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์›น ์†Œ์ผ“ ๊ด€๋ จ ์ด๋ฒคํŠธ(์—ฐ๊ฒฐ, ๋ฐ์ดํ„ฐ์ˆ˜์‹ , ์ข…๋ฃŒ)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฒ˜๋ž˜ํ•ด ์ค„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ webSocketEvent()๋ฅผ ๋“ฑ๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„๋Š” [http://192.168.x.x] ์ฒ˜๋Ÿผ ๋ฃจํŠธ[/] ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์˜ฌ ๋•Œ html_string ํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ํ•ด๋’€์Šต๋‹ˆ๋‹ค. html_string์€ html.h ํŒŒ์ผ์— ๋“ค์–ด์žˆ๋Š” HTML ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

HTML ์ฝ”๋“œ์—๋Š” ๊ฐ™์€ ์„œ๋ฒ„์˜ 81๋ฒˆ ํฌํŠธ์— ์›น ์†Œ์ผ“์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋„๋ก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น ์†Œ์ผ“์œผ๋กœย RGB LED ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๋กœ ESP8266 ๋ชจ๋“ˆ์—ย [http://192.168.x.x] ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜๋ฉด HTML ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์›น ์†Œ์ผ“์„ย ESP8266 ๋ชจ๋“ˆ๊ณผ ์—ฐ๊ฒฐํ•ด๋‘ก๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์—๋Š” 3๊ฐœ์˜ ์Šฌ๋ผ์ด๋“œ ๋ฐ”๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋ฅผ ์›€์ง์ด๋ฉด ์›น ์†Œ์ผ“์œผ๋กœย ESP8266 ๋ชจ๋“ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผย ESP8266 ๋ชจ๋“ˆ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ RGB LED ์ƒ‰์ƒ์„ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ESP8266 ๋ชจ๋“ˆ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ์•ž์„œ ๋“ฑ๋กํ•œย webSocketEvent() ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) {
    switch(type) {
        case WStype_DISCONNECTED:
            break;
        case WStype_CONNECTED: {
            ......
            webSocket.sendTXT(num, "Connected");
        }
            break;
        case WStype_TEXT:
            USE_SERIAL.printf("[%u] get Text: %s\n", num, payload);
            if(payload[0] == '#') {
                // decode rgb data
                uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16);
                analogWrite(LED_RED,    ((rgb >> 16) & 0xFF));
                analogWrite(LED_GREEN,  ((rgb >> 8) & 0xFF));
                analogWrite(LED_BLUE,   ((rgb >> 0) & 0xFF));
            }
            break;
    }
}

์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ ์š”์ฒญ์ด ์™€์„œ ์—ฐ๊ฒฐ๋˜๋ฉดย case WStype_CONNECTED: ๋ถ€๋ถ„์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์›น ์†Œ์ผ“์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ๋Œ€๋ฐฉ(๋ธŒ๋ผ์šฐ์ €)์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • webSocket.sendTXT(num, โ€œConnectedโ€œ);

์œ„ ํ•จ์ˆ˜๋Š” ํŠน์ • ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์žฅ์น˜๋“ค ๋ชจ๋‘์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • webSocket.broadcastTXT(โ€œMessage from ESP8266!!โ€œ);

case WStype_CONNECTED: ์—ฌ๊ธฐ์— ์ ํžŒ ์ฝ”๋“œ๋“ค์€ ์›น ์†Œ์ผ“์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด์„œ RGB ์ƒ‰์ƒ๊ฐ’์„ ์–ป์€ ๋’ค, RGB LED ์ƒ‰์„ ์กฐ์ ˆํ•˜๊ฒ ์ฃ .

ย 

์ด ์™ธ์—๋„ 2๋Œ€์˜ ESP8266 ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด ์žฌ๋ฐŒ๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ESP8266 ๋ชจ๋“ˆ์€ ์›น ์†Œ์ผ“ ์„œ๋ฒ„๋กœ ๋งŒ๋“ค๊ณ , ๋‹ค๋ฅธ ํ•œ ๋Œ€๋Š” ์›น ์†Œ์ผ“ ํด๋ผ์ด์–ธํŠธ๋กœ ๋งŒ๋“ค์–ด์„œ ๋‘ ๋Œ€์˜ย ESP8266 ๋ชจ๋“ˆ์ด ์›น ์†Œ์ผ“ ํ†ต์‹ ์„ ํ•˜๋„๋ก ํ•˜๋Š”๊ฒ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์˜ ๋‘ ์˜ˆ์ œ ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•ด์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ย 

HTTP ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํ™œ์šฉํ•˜๋Š” ์•„๋ž˜ ์˜ˆ์ œ๋„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • https://github.com/amiravni/ESP8266-Water-Heater-Control/blob/master/TheDude.ino

ย 

ย 

PS.

  • ESP8266 Arduino IDE ์•ˆ์—๋Š” WiFi ํ†ต์‹  ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๊ฐ€ ๋งˆ๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. [File โ€“ Example] ๋ฉ”๋‰ด์—์„œ ์˜ˆ์ œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์‹  ESP8266 core ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ ์ดํ›„, ๋งŽ์€ ์˜ˆ์ œ๋“ค์ด ์˜ค๋™์ž‘ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ œ๋“ค์˜ ๋™์ž‘์ด ํ™•์ธ ๋˜๋ฉด ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋ณด๋‹ค ํŒŒ์›Œํ’€ํ•œ WiFi ํ†ต์‹  ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Sming framework ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์ถ•๊ณผ์ •์ด ์กฐ๊ธˆ ๋ณต์žกํ•ด๋„ ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ๋ณด๋‹ค ๋” ์•ˆ์ •์ ์ด๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Sming framework ๊ตฌ์ถ•๋ฐฉ๋ฒ•, Sming ์„ ์ด์šฉํ•œ ์˜ˆ์ œ๋“ค

ย 

ย 

โ†ง
โ†ง

Home-Assistant ์„ค์น˜์™€ ํ™œ์šฉ

$
0
0

ย 

ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜์ธ Home_Assistant(์ดํ•˜ HA) ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

ย 

ย 

ํŒŒ์ด์ฌ 3.4.x ์„ค์น˜

ย 

HA ์„ค์น˜๋ฅผ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ด์ฌ 3.4 ๋ฒ„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ํ•ด๋‹น ๋ฒ„์ „์ด ๊ธฐ๋ณธ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ๋‚ด์šฉ์„ ๊ฑด๋„ˆ ๋›ฐ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์ด ๊ธฐ๋ณธ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ์–ด๋„ ๋ฒ„์ „์ด 2.x ์ธ ๊ฒฝ์šฐ๋Š” ์„ค์น˜๋ฅผ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๋ฒ„์ „ ํ™•์ธํ•˜์„ธ์š”.

  • python -V
  • python3 -V

Python 3 ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ•ํ•ด์ œ

  • wget https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz
  • tar xvzf Python-3.4.4.tgz

๋นŒ๋“œ, ์ธ์Šคํ†จ

  • cd Python-3.4.4
  • ./configure
  • make
  • sudo make install

PIP3 ์—…๊ทธ๋ ˆ์ด๋“œ

  • sudo pip3 install โ€“upgrade pip

ย 

ย 

Home Assistant ์„ค์น˜

ย 

ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์„ค์น˜

  • sudo pip3 install homeassistant

ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์‹คํ–‰

  • hass โ€“open-ui

์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์›น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ 8123 ํฌํŠธ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค. http://x.x.x.x:8123 ์ฃผ์†Œ๋กœ ๋ธŒ๋ผ์šฐ์ € ์ ‘์†ํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

Home Assistant ์„ค์ •

ย 

OpenHAB, Home Assistant ๊ฐ™์€ ๋ฒ”์šฉ ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜ ์†”๋ฃจ์…˜๋“ค์€ ์„ค์ •๊ณผ์ •์ด ๊ฝค๋‚˜ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹œ๋„๋ฅผ ํ•ด๋ณด๊ณ  ๊ด€๋ จ๋œ ์ž๋ฃŒ๋“ค๋„ ๋ณด๊ณ  ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ ์ œ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์„ค์ •๋งŒ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž์‹ ์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋ž˜ [~/.homeassistant] ๊ฒฝ๋กœ์— ์žˆ๋Š” configuration.yaml ํŒŒ์ผ์„ ์ด์šฉํ•ด ์„ค์ •์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • cd ~/.homeassistant
  • nano configuration.yaml

๊ธฐ๋ณธ์ด ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ถ€ํ„ฐ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

homeassistant:
  # Name of the location where Home Assistant is running
  name: your_home_name
  # Location required to calculate the time the sun rises and sets
  latitude: 37.5345
  longitude: 127.1324
  # C for Celcius, F for Fahrenheit
  temperature_unit: C
  # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  time_zone: Asia/Seoul

name, latitude, longitude ๋“ฑ์˜ ๊ฐ’์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์„œ ์›น ์ธํ„ฐํŽ˜์ด์Šค ์ ‘๊ทผ์‹œ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

http:
ย  api_password: YOUR_PASSWORD

์•”ํ˜ธ ์ž…๋ ฅ ํ›„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์žฌ์‹คํ–‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • hass โ€“open-ui

์›น์— ๋‹ค์‹œ ์ ‘์†ํ•ด๋ณด๋ฉด ์•„์ง ํ™”๋ฉด์ด ํ—ˆ์ „ํ• ๊ฒ๋‹ˆ๋‹ค. ๋‚ ์”จ ์ •๋ณด๋ฅผ ์ƒ๋‹จ ๋™๊ทธ๋ผ๋ฏธ ์•„์ด์ฝ˜์œผ๋กœ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

# Need to register on Forecast.io for your PRIVATE API
sensor 1:
  platform: forecast
  name: "Weather Seoul"
  api_key: your_api_key
  monitored_conditions:
    - summary
    - temperature
    - humidity
    - ozone
    - wind_speed

์œ„ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๋ฉด ์„ผ์„œ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‚ ์”จ ์ •๋ณด๋Š” forecast.io ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์—ย forecast.io ์— ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•ด์„œ ํšŒ์›๊ฐ€์ž…-API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์œผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  API ํ‚ค๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์žฌ์‹คํ–‰ ํ›„ ๋‹ค์‹œ ์ ‘์†ํ•ด๋ณด๋ฉด ์ƒ๋‹จ์— ๋‚ ์”จ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ ๊ฒ๋‹ˆ๋‹ค.

์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ HA ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ•˜๋“œ์›จ์–ด ์ •๋ณด๋„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ์ž…๋ ฅ ํ›„

sensor 2:
  platform: systemmonitor
  resources:
    - type: 'disk_use'
      arg: '/home'
    - type: 'memory_use_percent'
    - type: 'processor_use'

์žฌ์‹คํ–‰ ํ•˜๋ฉด ์ƒ๋‹จ ์ •๋ณด์ฐฝ์ด ํ’์„ฑํ•ด์ง‘๋‹ˆ๋‹ค.

ha_upper_deck

ย 

ย 

MQTT ๋ฅผ ์ด์šฉํ•œ ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

ย 

MQTT ๋ธŒ๋กœ์ปค์™€ ์„ผ์„œ ์žฅ์น˜๋ฅผ ์—ฐ๋™ํ•ด์„œ HA ์—์„œ ์„ผ์„œ๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.ย MQTT ๋ธŒ๋กœ์ปค ์„ค์น˜ ๋ฐฉ๋ฒ•๊ณผ ์„ผ์„œ ์žฅ์น˜ ์ œ์ž‘ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. (์ผ๋‹จ์€ HA ์„ค์ •๋ถ€ํ„ฐ ํ•˜์‹œ๊ณ  ์•„๋ž˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”)

ย 

HA ์—์„œ MQTT ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” MQTT ๋ธŒ๋กœ์ปค์™€์˜ ์—ฐ๊ฒฐ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ์„ค์ • ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

mqtt:
  broker: localhost
  port: 1883
  client_id: home-assistant-1
  keepalive: 60
  username:
  password:
  certificate:
  protocol: 3.1

์ œ ๊ฒฝ์šฐ๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์— HA, MQTT ๋ธŒ๋กœ์ปค๊ฐ€ ๋ชจ๋‘ ์„ค์น˜๋˜์–ด ์žˆ์–ด์„œ localhost๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€์˜ MQTT ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ IP ๋˜๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

์ด์ œ HA ์„ค์ • ํŒŒ์ผ์—์„œ ํŠน์ • ํ† ํ”ฝ์„ ๊ตฌ๋…(subscribe)ํ•˜๊ณ  ์ง€์ •๋œ ํ˜•์‹์˜ ๊ฐ’์ด ๋„์ฐฉํ•˜๋ฉด ํ™”๋ฉด์— ํ‘œ์‹œํ•ด์ฃผ๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

sensor 3:
  platform: mqtt
  state_topic: "home/thirdroom/temp_humi"
  name: "Thirdroom Humidity"
  qos: 0
  unit_of_measurement: "%"
  value_template: '{{ value_json.humi }}'

sensor 4:
  platform: mqtt
  state_topic: "home/thirdroom/temp_humi"
  name: "Thirdroom Temperature"
  qos: 0
  unit_of_measurement: "ยฐC"
  value_template: '{{ value_json.temp }}'

์—ฌ๊ธฐ๊นŒ์ง€ ์„ค์ •ํ•˜๋ฉด ์•ž์„  ๋‚ ์”จ, ์‹œ์Šคํ…œ ์ •๋ณด์ฒ˜๋Ÿผ ์ƒ๋‹จ ๋™๊ทธ๋ผ๋ฏธ ์•„์ด์ฝ˜์œผ๋กœ ์˜จ์Šต๋„๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ํ•˜๋‹จ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋ฃน์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

group:
  Third Room:
    - sensor.thirdroom_temperature
    - sensor.thirdroom_humidity

ย 

ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์„œ๋ฒ„ ์„ค์ •์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด์ œ MQTT ๋ธŒ๋กœ์ปค๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ผ์„œ์žฅ์น˜๋ฅผ ์ œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ ํ•˜๋‹จ๋ถ€์— ํ•ด๋‹น ๋‚ด์šฉ์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

MQTT ๋ธŒ๋กœ์ปค์™€ ์„ผ์„œ ์žฅ์น˜๊ฐ€ ์ค€๋น„๋˜๋ฉด ์„ผ์„œ ์žฅ์น˜์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ์˜จ๋„, ์Šต๋„ ๋ฐ์ดํ„ฐ๋ฅผ MQTT ๋ธŒ๋กœ์ปค์— ์ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐ์ดํ„ฐ๋Š” ์ •ํ•ด์ง„ ํ† ํ”ฝ์— JSON ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์ด์ฃผ๋„๋ก ๋งŒ๋“ค์–ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์˜จ์Šต๋„ ๋ฐ์ดํ„ฐ
    • ํ† ํ”ฝ :ย home/thirdroom/temp_humi
    • JSON ๋ฐ์ดํ„ฐ ํ˜•์‹ : {โ€œtempโ€: 26.14, โ€œhumiโ€: 68.71}

ย 

์—ฌ๊ธฐ๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋„์ฐฉํ•˜๋Š” MQTT ๋ฉ”์‹œ์ง€์—์„œ temp, humi ๊ฐ’์„ ์ถ”์ถœํ•ด ํ™”๋ฉด์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. HA๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  ์›น์œผ๋กœ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์„ผ์„œ๊ฐ’์„ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ha_mqtt_device

ย 

์ด ์™ธ์—๋„ MPD ์˜ค๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ ์ œ์–ด, Plex ๋ฏธ๋””์–ด ์„ผํ„ฐ, ๋งคํฌ๋กœ, ์Šคํฌ๋ฆฝํŠธ ๋“ฑ๋“ฑ ์ˆ˜ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด ๋ณด์‹œ๊ธธโ€ฆ

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

ย 

ย 

โ†ง

์žฅ๊ณ (DJANGO) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ ์„ค์ •

$
0
0

ย 

์žฅ๊ณ ๊ฑธ ๊ฐ€์ด๋“œ ํŽ˜์ด์ง€์—์„œ๋Š” virtualenv ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ด์šฉํ•ด์„œ ์žฅ๊ณ ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ถŒํ•˜๋Š”๋ฐ.. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜ ๊ณผ์ •์„ ํ•ด๋‘์–ด์•ผํ•จ.. ๊ท€์ฐฎ์œผ๋ฉด virtualenv ์„ค์ • ๊ณผ์ •์€ย ์•ˆํ•ด๋„ ๋จ.

ย 

ย 

virtualenv ์„ค์น˜

ย 

virtualenv๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ด์œ 

  • ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์•„๋‹ˆ๋ผ ์œ ์ € ๊ถŒํ•œ์œผ๋กœ ์„ค์น˜
  • ํŒŒ์ด์ฌ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ฆฌ๋ˆ…์Šค์˜ ๊ฒƒ๊ณผ ์˜จ์ „ํžˆ ๊ตฌ๋ถ„ โ€“ย ๋””๋ ‰ํ„ฐ๋ฆฌ, ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋ถ„๋ฆฌํ•ด ๋‘ 
  • python3 ์„ ์‚ฌ์šฉํ•  ๋•Œ python ๋ช…๋ น์œผ๋กœย ์‹คํ–‰
  • ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ์‹ค์„œ๋ฒ„ํ™˜๊ฒฝ์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถค

virtualenvwrapper ์„ค์น˜

  • sudo pip install virtualenv
  • sudo pip install virtualenvwrapper

virtualenv ํ™˜๊ฒฝ ์„ค์ •

๋””ํดํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ (.virtualenv)

  • mkdir ~/.virtualenvs

WORKON_HOME ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋””ํดํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋“ฑ๋ก

  • export WORKON_HOME=~/.virtualenvs

.profile(์šฐ๋ถ„ํˆฌ ๊ธฐ์ค€ ์œ ์ € ๋กœ๊ทธ์ธ์‹œ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ) ์— virtualenvwrapper๋ฅผ ์ž„ํฌํŠธ ํ•˜๋„๋กย ์œ„ ํŒŒ์ผ์˜ ๊ฐ€์žฅ ํ•˜๋‹จ์— ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

. /usr/local/bin/virtualenvwrapper.sh

์ ์šฉ

  • source /usr/local/bin/virtualenvwrapper.sh

ย 

ย 

๊ฐ€์ƒํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ

ย 

์œ„์˜ ๊ณผ์ •์„ ์ž˜ ๋”ฐ๋ผํ–ˆ๋‹ค๋ฉด virtualenvwrapper.sh ๋‚ด์— ์žˆ๋Š” ํ•จ์ˆ˜์ธ mkvirtualenv ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • mkvirtualenv {{๊ฐ€์ƒํ™˜๊ฒฝ-์ด๋ฆ„}}

์‚ฌ์šฉ๋ฒ•

  • mkvirtualenv py2

์š”๋ ‡๊ฒŒํ•˜๋ฉด py2๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ€์ƒํ™˜๊ฒฝ์ด ์„ค์น˜๋˜๊ณ  ๊ทธ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ(workon) ๋œ๋‹ค.

  • which python

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋‚˜์˜ค๋ฉด ์ œ๋Œ€๋กœ ๋œ๊ฒƒ์ด๋‹ค.

  • /home/user_name/.virtualenvs/py2/bin/python

๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ๋‚˜๊ฐ€๋ ค๋ฉด

  • $ deactivate

๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋ ค๋ฉด

  • $ workon py2

ย 

ย 

์žฅ๊ณ (Django) ์„ค์น˜

ย 

์žฅ๊ณ  ์„ค์น˜:

  • sudo pip install django

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

  • cd ~/pyBook
  • python manage.py startapp homepack

ํ…Œ์ŠคํŠธ

  • cd homepack
  • python manage.py migrate
  • python manage.py runserver

http://rpi_IP_address:8000/ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•ด์„œ ํ™•์ธ

ย 

ย 

์žฅ๊ณ  ์ž…๋ฌธ ๊ฐ•์ขŒ

ย 

ย 

ย 

โ†ง

์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ด์šฉํ•œ ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท ๊ฐ•์ขŒ โ€“๋ชฉ์ฐจ

$
0
0

ย 

1.ย ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท ๊ฐœ๋ก 

ย 

2. ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ด์šฉํ•œ ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท ๊ตฌํ˜„

ย 

3.ย ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ โ€“ ์•„๋‘์ด๋…ธ

ย 

4.ย ๋‹จ์ผ ๋ณด๋“œ ์ปดํ“จํ„ฐ(SBC) โ€“ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด

ย 

5.ย ์‹œ๋ฆฌ์–ผ ํ†ต์‹ 

ย 

6.ย ์ด๋”๋„ท ํ†ต์‹ 

ย 

7.ย ๋ธ”๋ฃจํˆฌ์Šค

ย 

8.ย RF ํ†ต์‹ 

ย 

9.ย WiFi

ย 

10.ย MQTT ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ๊ณผ HA(Home Automation)

ย 

11. ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜ ์†”๋ฃจ์…˜ ์ œ์ž‘

  • ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜ ์†”๋ฃจ์…˜ ์ œ์ž‘์„ ์œ„ํ•œ ์ค€๋น„
  • ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ (์Šค๋ ˆ๋“œ์™€ ํ ๊ตฌ์กฐ)
  • ํŒŒ์ด์ฌ๊ณผ MQTT ๋ธŒ๋กœ์ปค ์—ฐ๋™
  • ์„ผ์„œ ์žฅ์น˜ ์ œ์ž‘
  • Django ๋ฅผ ์ด์šฉํ•œ ์›น ์„œ๋น„์Šค ๊ตฌ์ถ•

ย 

ย 

ย 

โ†ง
โ†ง

์Œ์„ฑ์ธ์‹ ์ปจํŠธ๋กค๋Ÿฌ MQTT VoiceCon ์•ฑ

$
0
0

ย 

MQTT VoiceCon ์€ ์›๊ฒฉ์—์„œ ์Œ์„ฑ์ธ์‹์œผ๋กœ ์žฅ์น˜๋ฅผ ์ œ์–ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์ž…๋‹ˆ๋‹ค.

VoiceCon ์•ฑ์€ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ์œ„ํ•ด MQTT ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๊ฐ™์€ ์„œ๋ฒ„์— MQTT broker(server) ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ MQTT broker ๋งŒ ์ค€๋น„๋œ๋‹ค๋ฉด ๋‹ค์–‘ํ•œ ์žฅ์น˜๋ฅผ MQTT broker์— ์—ฐ๊ฒฐํ•˜๊ณ  VoiceCon ์•ฑ์œผ๋กœ ์Œ์„ฑ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MQTT ํ”„๋กœํ† ์ฝœ๊ณผ ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

MQTT VoiceCon ์•ฑ์€ Paho MQTT android service library ๋ฅผ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Paho ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ƒ์„ธ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

MQTT VoiceCon ์•ฑ์€ ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ๊ณต๊ฐœ๋˜์–ด ์žˆ์œผ๋‹ˆ ๋ฌธ์„œ ํ•˜๋‹จ์˜ GitHub ๋งํฌ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

ย 

ย 

ํ™”๋ฉด ๊ตฌ์„ฑ

ย 

01_drawer์•ฑ ์‹คํ–‰ ํ›„ ์™ผ์ชฝ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ฉด Drawer ๋ฉ”๋‰ด๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ณด๋ฉด 4๊ฐœ์˜ ํƒญ๊ณผ 1๊ฐœ์˜ ์„ค์ • ํ™”๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. 4๊ฐœ์˜ ํƒญ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ํƒญ์œผ๋กœ ์ด๋™ํ•˜๊ณ , ์„ค์ •์„ ์„ ํƒํ•˜๋ฉด ๋‹ค์ด์–ผ๋กœ๊ทธ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

4๊ฐœ์˜ ํƒญ์€ ๊ฐ ํ™”๋ฉด์—์„œ ์ขŒ-์šฐ๋กœ ๋“œ๋ž˜๊ทธ ๋™์ž‘์„ ํ•ด๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ํƒญ์ด ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Controller :
    ๊ฐ์ข… ์ปจํŠธ๋กค ๋ฒ„ํŠผ, ์œ„์ ฏ์„ ์ œ๊ณต. ๋งˆ์ดํฌ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์Œ์„ฑ์ธ์‹์„ ์‹œ์ž‘. ๋งˆ์ดํฌ ์•„๋ž˜์—์„œ [Switch/Slide/Keypad/Text/Color picker] ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ์œ„์ ฏ ํ™”๋ฉด์ด ๋ณด์—ฌ์ง. ์ธ์‹๋œ ์Œ์„ฑ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ปจํŠธ๋กค ๊ฒฐ๊ณผ๊ฐ€ ์›๊ฒฉ ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” MQTT broker(server) ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผํ•˜๊ณ , ๋ช…๋ น์–ด๊ฐ€ ์ „์†ก๋  topic์„ ์ƒ๋‹จ์— ์ ์–ด์ค˜์•ผ ํ•จ. ์ „์†ก๋˜๋Š” ๋ฉ”์‹œ์ง€์˜ ํ˜•์‹์€ Settings(์„ค์ •) ๋‹ค์ด์–ผ๋กœ๊ทธ์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • MQTT History :
    MQTT broker ์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋‚˜ ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹  ๋‚ด์—ญ์ด ํ‘œ์‹œ๋˜๋Š” ํ™”๋ฉด. ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก(publish) ํ•˜๊ฑฐ๋‚˜ ํŠน์ • topic์„ ๊ตฌ๋…(subscribe) ํ•  ์ˆ˜ ์žˆ์Œ. ๋ฉ”๋‰ดํ‚ค๋‚˜ ์šฐ์ธก ์ƒ๋‹จ์˜ ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด publish/subscribe ์ž…๋ ฅ์ฐฝ์ด ํ‘œ์‹œ๋จ.
  • MQTT Broker list :
    ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ MQTT broker ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œ์‹œํ•จ. ๊ฐ ์•„์ดํ…œ์„ ํด๋ฆญํ•˜๋ฉด [์—ฐ๊ฒฐ/์—ฐ๊ฒฐ์ค‘๋‹จ/์‚ญ์ œ] ๋“ฑ์˜ ๋ฉ”๋‰ด๋ฅผ ์„ ํƒ๊ฐ€๋Šฅ. ํŠน์ • MQTT ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์•„์ดํ…œ์˜ ๋ฐฐ๊ฒฝ์€ ํ‘ธ๋ฅธ์ƒ‰์œผ๋กœ ํ•˜์ด๋ผ์ดํŠธ ๋˜์–ด ํ‘œ์‹œ๋จ. ๋ณต์ˆ˜๊ฐœ์˜ MQTT broker์— ๋™์‹œ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†ก(public) ํ•  ๋•Œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  broker๋กœ ์ „์†ก๋จ.
  • Add MQTT Broker :
    ์„œ๋ฒ„ ID, URL, Port ๋ฅผ ์ง€์ •ํ•ด์„œ MQTT broker ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ. ์ €์žฅ๋œ ์ •๋ณด๋Š” MQTT Broker list์— ์•„์ดํ…œ์œผ๋กœ ํ‘œ์‹œ๋จ. [์„œ๋ฒ„ ID, URL, Port] ๋Š” ํ•„์ˆ˜์ด๋ฉฐ ๊ทธ ์™ธ์˜ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.
  • Settings ๋‹ค์ด์–ผ๋กœ๊ทธ :
    ์Œ์„ฑ์ธ์‹ ์‹œ์ž‘์„ ์œ„ํ•œ floating icon ์„ show/hide ํ•  ์ˆ˜ ์žˆ์Œ. Slide bar์™€ ๊ฐ™์ด ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปจํŠธ๋กค์˜ ๊ฒฝ์šฐ sending interval์„ ์ด์šฉํ•ด์„œ ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Œ. ๋ฉ”์‹œ์ง€ ์ „์†ก ํ˜•์‹์„ [๊ฐ’๋งŒ/๊ฐ„๋‹จํ•œ ํ˜•์‹/JSON] ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ.

ย 

ํ™”๋ฉด ํ•˜๋‹จ์—๋Š” ์Œ์„ฑ์ธ์‹์„ ์œ„ํ•œ Floating ๋ฒ„ํŠผ์ด ์žˆ์œผ๋ฉฐ, ์ƒํƒœ๋ฐ”์— ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

02_controllerย 03_historyย 04_broker_list 05_add_broker 06_settings

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

Google Play Store ์•ฑ ๋‹ค์šด๋กœ๋“œ (v4.0.3 ์ด์ƒ ์ง€์›)

์†Œ์Šค์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ (GitHub)

ย 

ย 

โ†ง

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด MQTT โ€“ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

$
0
0

ย 

์ƒ์„ธํ•œ ์„ค์น˜ ๋ฐฉ๋ฒ•์ด ์•„๋ž˜ Paho ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์ดํŠธ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์œผ๋‹ˆ ํ•„์š”ํ•˜์‹  ๋ถ„์€ ์ฐธ๊ณ ํ•˜์‹œ๊ณ โ€ฆ

ย 

์„ค์น˜๋Š” pip ํˆด์„ ์ด์šฉํ•ด์„œ ํ•ฉ๋‹ˆ๋‹ค.

  • pip install paho-mqtt

ย 

๋งŒ์•ฝ ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•ด์„œ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์•„๋ž˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ํ•˜์„ธ์š”.

  • git clone https://github.com/eclipse/paho.mqtt.python.git
  • cd org.eclipse.paho.mqtt.python.git
  • sudo python setup.py install

ย 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import paho.mqtt.client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
    print("Connected with result code "+str(rc))
	# Subscribing in on_connect() means that if we lose the connection and
	# reconnect then subscriptions will be renewed.
	client.subscribe("$SYS/#")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
	print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("iot.eclipse.org", 1883, 60)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()

ย 

on_connect() ํ•จ์ˆ˜์™€ ย on_message() ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด ๋‘” ๋’ค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด callback ํ•จ์ˆ˜๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ MQTT์— ์—ฐ๊ฒฐ๋˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ ์ž๋™์œผ๋กœ callback ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

์ด ์™ธ์—๋„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” callback ํ•จ์ˆ˜๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์— ์žˆ๋Š” ์˜ˆ์ œ ํŒŒ์ผ๋“ค์„ ์ฝ์–ด๋ณด์‹œ๋ฉด ๊ธˆ๋ฐฉ ์‚ฌ์šฉ๋ฒ•์„ ํ„ฐ๋“ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์ „ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ MQTT broker URL์„ ์ž์‹ ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

client.connect("iot.eclipse.org", 1883, 60)

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

ย 

โ†ง

์Œ์„ฑ์ธ์‹ ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ โ€“ Voice Controller

$
0
0

ย 

์ด์ „๋ถ€ํ„ฐ ์จ์˜ค๋˜ NAS (Network Attached Storage) ์„œ๋ฒ„๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ 3๋…„ ๋ฐ˜ ์ฏค ์ง€๋‚˜๋‹ˆ๊นŒ ๋ง›์ด ๊ฐ€๋ฒ„๋ฆฐโ€ฆ ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ ํ•œ ๋Œ€ ๋งž์ถ”๋Š” ๊น€์— ์ €์ „๋ ฅ ์ผ์ฒดํ˜• PC๋ฅผ ์‚ฌ์„œ ์šฐ๋ถ„ํˆฌ ๋ฆฌ๋ˆ…์Šค๋ฅผ ๊น”๊ณ  ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. 2ํ…Œ๋ผ ํ•˜๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ™์€ NAS, ๋ฏธ๋””์–ด ์„œ๋ฒ„, ํด๋ผ์šฐ๋“œ, ํ† ๋ ŒํŠธ, ๋ฎค์ง ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ๋“ฑโ€ฆ ํ™œ์šฉ ๋ฐฉ๋ฒ•์ด ๋งŽ์•„์„œ ๊ฝค๋‚˜ ๋งŒ์กฑ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ํ—Œ๋ฐ ๊ฐ€๋” ๊ฐ„๋‹จํ•œ ์„ค์ •์„ ์œ„ํ•ด Telnet ์ ‘์†ํ•ด์„œ ์ž‘์—…ํ•˜๋Š”๊ฒŒ ๊ท€์ฐฎ๊ธฐ๋„ ํ•˜๊ณ .. ์ข€๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž‘์—…๋“ค์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์Œ์„ฑ์ธ์‹์œผ๋กœ ํ™ˆ ์„œ๋ฒ„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

ย 

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์Œ์„ฑ์ธ์‹ ๊ตฌํ˜„ํ•˜๋Š”๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ์Œ์„ฑ์ธ์‹ API๊ฐ€ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ๋ช‡ ์ค„์ด๋ฉด ์Œ์„ฑ์ธ์‹ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์Œ์„ฑ์ธ์‹ ๋ณด๋‹ค๋Š” ์ธ์‹๋œ ์Œ์„ฑ ๋ช…๋ น์„ ์„œ๋ฒ„, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ๋“ค๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด MQTT ํ”„๋กœํ† ์ฝœ ์ž…๋‹ˆ๋‹ค.

MQTT ํ”„๋กœํ† ์ฝœ์€ ๋ณดํ†ต ๊ธฐ๊ณ„๋ฅผ ์œ„ํ•œ ํŠธ์œ„ํ„ฐ ์‹œ์Šคํ…œ์œผ๋กœ ์†Œ๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํŠธ์œ„ํ„ฐ์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œ(publish)ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฒŒ์‹œ๋œ ๋ฉ”์‹œ์ง€๋Š” ์ž๋™์œผ๋กœ ํŒ”๋กœ์›Œ์—๊ฒŒ ์ „์†ก๋˜์ฃ . MQTT ์—์„œ๋Š” ํŒ”๋กœ์šฐ ๋Œ€์‹  subscribe ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค๋งŒ ๊ธฐ๋Šฅ์€ ๋ญ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์•”ํŠผ MQTT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ๋“ค์ด ์„œ๋กœ ์›ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ย 

์ „์ฒด์ ์ธ ๋™์ž‘ ํ๋ฆ„๋„๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

VoiceCon_overview

๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๊ฐ™์€ ์„œ๋ฒ„์— MQTT ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ (broker๋ผ ๋ถ€๋ฆ„)์„ ์„ค์น˜ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์žฅ์น˜๋“ค์ด broker์— ๋ถ™์–ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฐ์—์„œ ์ธ์‹ํ•œ ์Œ์„ฑ์ด ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด MQTT broker๋กœ ๋‚ ๋ผ๊ฐ€๋ฉด ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์—์„œ ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ๊ตฌ์š”, ๋˜๋Š” ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ๋ช…๋ น์–ด์— ๋งž๋Š” ๋™์ž‘์„ ํ•˜๋„๋ก ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ย 

๊ตฌํ˜„ ๊ณผ์ •

ย 

MQTT broker๋Š” ์ œ๊ฐ€ ๊ฐ€์ง„ ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„์— ์ด๋ฏธ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—ฌ์„œ ํŠน๋ณ„ํžˆ ๊ฑด๋“ค๊ฑด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด์— ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์€ ์•„๋ž˜ ๋งํฌ์— ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ย 

์Œ์„ฑ์ธ์‹ ๊ธฐ๋Šฅ๊ณผ MQTT client ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ๋งŒ ๋งŒ๋“ค๋ฉด ๊ธˆ๋ฐฉ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐโ€ฆ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋„ค์š”. ์Œ์„ฑ์ธ์‹์€ ๊ธˆ๋ฐฉ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ MQTT client ์†Œ์Šค ๊ณต์œ ๋œ๊ฒŒ ๊ฑฐ์˜ ์—†๋”๊ตฐ์š”. ๋Œ€๋ถ€๋ถ„ Paho ์•ˆ๋“œ๋กœ์ด๋“œ์šฉ MQTT ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ €๋„ Paho ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐ›์•„์„œ ์ด๋ฆฌ์ €๋ฆฌ ์ˆ˜์ •์„ ํ•ด์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์Œ์„ฑ์ธ์‹ ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“œ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์€ MQTT ๊ธฐ๋Šฅ ๋„ฃ๋Š”๋ฐ ๋“ค์–ด๊ฐ„โ€ฆ

๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“  ์•ฑ์ด MQTT VoiceCon ์•ฑ์ž…๋‹ˆ๋‹ค.

01_drawerย 02_controllerย 04_broker_list

๋จผ์ € MQTT broker (server) ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์—ฐ๊ฒฐํ•œ ๋’ค, ํŠน์ • topic(์ฑ„๋„)์„ ์ ์–ด๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  [๋งˆ์ดํฌ] ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๊ณ  ์Œ์„ฑ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋˜์–ด MQTT broker ์˜ topic(์ฑ„๋„)์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.(publish ๊ณผ์ •)

ํ•ด๋‹น topic์„ ๊ตฌ๋…(subscribe)ํ•˜๋Š” ์žฅ์น˜๋“ค์€ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋œ ์Œ์„ฑ ๋ช…๋ น์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด ๋˜๋Š” ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋“ค์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฒ ์ฃ .

MQTT VoiceCon ์•ฑ์˜ ์ƒ์„ธ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ์— ์žˆ์œผ๋ฉฐ ์†Œ์Šค์ฝ”๋“œ๋ฅผ GitHub์— ์˜ฌ๋ ค๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

Google Play Store ์•ฑ ๋‹ค์šด๋กœ๋“œ (v4.0.3 ์ด์ƒ ์ง€์›)

์†Œ์Šค์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ (GitHub)

ย 

ย 

๋™์ž‘ ํ…Œ์ŠคํŠธ

ย 

์Œ์„ฑ ๋ฉ”์‹œ์ง€๊ฐ€ ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„์— ์žˆ๋Š” MQTT Broker ๊นŒ์ง€ ์ „๋‹ฌ์€ ๋˜์ง€๋งŒ ์ด ๋ช…๋ น์–ด๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ์žฅ์น˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ์ฃ . ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ESP8266 wifi ๋ชจ๋“ˆ์— LED๋ฅผ ๋‹ฌ์•„์„œ ์Œ์„ฑ ๋ช…๋ น์œผ๋กœ LED๋ฅผ on/off ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

20160301_204219

ESP8266 ๋ชจ๋“ˆ์€ ๋ถ€ํŒ…์ดํ›„ ๊ณต์œ ๊ธฐ์— ์—ฐ๊ฒฐ๋˜๊ณ , MQTT broker์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน์ • topic(์ฑ„๋„) ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์—์„œ๋„ ์Œ์„ฑ ๋ช…๋ น์ด ๊ฐ™์€ topic์œผ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ์„ค์ •ํ•˜๊ณ  ์Œ์„ฑ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ๋˜๊ฒ ์ฃ . ESP8266 ๋ชจ๋“ˆ์€ [LED on], [LED off] ๋ช…๋ น์— ๋ฐ˜์‘ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ๋’€์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ํ•ด๋ณด๋‹ˆ ๋™์ž‘ ์ž˜ ๋ฉ๋‹ˆ๋‹ค!! ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋œ ESP8266 ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ปดํŒŒ์ผ์„ ์œ„ํ•ด์„œ๋Š” ESP8266 โ€“ Sming ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ญ LED ์ผœ๊ณ  ๋„๋Š” ๊ฒƒ๋งŒ ์ œ๋Œ€๋กœ ๋˜๋ฉด ๋‹ค๋ฅธ ๋™์ž‘๋„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

ย 

์ข€ ๋” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•˜๋Š” ์˜ˆ์ œ๋„ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค.ย ์šฐ๋ถ„ํˆฌ ๋ฆฌ๋ˆ…์Šค๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ํ™ˆ ์„œ๋ฒ„์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋“ค๋„ ์Œ์„ฑ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

20160301_204257

์ด ์„œ๋ฒ„์—๋Š”ย MPD (Music Player Daemon) ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. MPD๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋œ ์Šคํ”ผ์ปค๋กœ ์Œ์•…์„ ์žฌ์ƒํ•˜๊ธฐ๋„ํ•˜๊ณ , ์˜จ๋ผ์ธ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ•ด์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ ์Œ์„ฑ ๋ช…๋ น์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

20160301_204245

์š”๊ฑธ ์œ„ํ•ด์„œ ํŒŒ์ด์ฌ์œผ๋กœ ์ง  ํ”„๋กœ๊ทธ๋žจ์„ ์šฐ๋ถ„ํˆฌ์—์„œ ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์€ MQTT broker์— ์—ฐ๊ฒฐํ•ด์„œ ํŠน์ • topic์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์Œ์„ฑ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ํ•ด๋‹น ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค.ย [์Œ์•… ์žฌ์ƒ], [์Œ์•… ์ •์ง€] ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ์Œ์•…์ด ์žฌ์ƒ/์ •์ง€ ๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋‹ˆ ์ž˜ ๋˜๋„ค์š”. ๊ฝค๋‚˜ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค ใ…Žใ…Žโ€ฆ TV ๋„ ์ด๊ฑธ๋กœ ์กฐ์ข…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ํ…๋ฐโ€ฆ

ย 

ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด Paho MQTT Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๋ฐฉ๋ฒ•๊ณผ ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด์‹œ๊ธธโ€ฆ

ย 

์ „ ์ผ์ „์— ํŒŒ์ด์ฌ์œผ๋กœ ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋‘” ๊ฒƒ์ด ์žˆ์–ด์„œ ์žฌํ™œ์šฉ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์Œ์•… ์žฌ์ƒ/์ •์ง€, ์‚ฌ์ง„ ์ดฌ์˜ ํ›„ ๋ฉ”์‹ ์ €๋กœ ์ „์†ก, CCTV on/off ๋“ฑ์˜ ๋™์ž‘์„ ์Œ์„ฑ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋ณ„๋ฃจ ๋„ฃ์–ด๋‘”๊ฒŒ ์—†๋Š”๋ฐโ€ฆ ์‹œ๊ฐ„๋‚˜๋ฉด ์žฌ๋ฐŒ๋Š” ๊ธฐ๋Šฅ๋“ค ์ถ”๊ฐ€ํ•ด์„œ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ย 

์ฆ๊ฑฐ์šด DIY ํ•˜์‹œ๊ธธโ€ฆ

ย 

โ†ง

ํŒŒ์ด์ฌ์œผ๋กœ Google Cloud Vision API ์ด์šฉํ•˜๊ธฐ (์–ผ๊ตด, ํ…์ŠคํŠธ, ์‚ฌ๋ฌผ ์ธ์‹)

$
0
0

ย 

ย 

์–ผ๊ตด์ธ์‹๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€ ํ”„๋กœ์„ธ์‹ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š”๊ฒŒ OpenCV ์ผ๊ป๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ OpenCV ๋Š” ์„ค์น˜๋„ ์‰ฝ์ง€ ์•Š๊ณ  ์ด๊ฑธ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•ด์„œ ์›ํ•˜๋Š” ์ธ์‹ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ๋ž€ ๋”๋”์šฑ ์–ด๋ ค์šด ์ž‘์—…์ด์ฃ . ์‹ค์‹œ๊ฐ„์œผ๋กœ ์˜์ƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ๋Š” ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋„๊ตฌ์ž„์—๋Š” ๋ถ„๋ช… ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ ์–ด๋„ ๋น ๋ฅธ ์†๋„๊ฐ€ ์š”๊ตฌ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ โ€“ ์ •์ ์ธ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ๋ฉด ํ›จ์”ฌ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Google Cloud Vision API(์ดํ•˜ ๊ตฌ๊ธ€ ๋น„์ „ API) ์ž…๋‹ˆ๋‹ค.

๊ตฌ๊ธ€ ๋น„์ „ API ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฏธ์ง€์™€ ๋ช‡ ๊ฐ€์ง€ ์„ค์ •์„ ๊ตฌ๊ธ€ ์„œ๋ฒ„์— ๋˜์ ธ์ฃผ๋ฉด ์•Œ์•„์„œ ์ด๋ฏธ์ง€ ์ธ์‹์„ ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ๋งŒ ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ”„๋กœ์„ธ์‹ฑ ํŒŒ์›Œ๊ฐ€ ๋‚ฎ์€ ๊ธฐ๊ธฐ์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉ๋ฐฉ๋ฒ•๋„ ์‰ฌ์šด๊ฒŒ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋ฐ”, ํŒŒ์ด์ฌ ๋“ฑ ์ฃผ์š” ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ๋ช‡ ์ค„๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.ย ๋Œ€์‹  ์„œ๋ฒ„์— ์ด๋ฏธ์ง€ ๋ณด๋‚ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ๊นŒ์ง€ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ํ”„๋ ˆ์ž„์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ๋Š” ์ ํ•ฉ์น˜ ์•Š์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๊ฐœ๋ฐœํ™˜๊ฒฝ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ๋น„์ „ API ๊ฐœ๋ฐœํ™˜๊ฒฝ ์…‹์—…

ย 

๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ๋น„์ „ API ์˜ ๊ฐ€์žฅ ์ข‹์€ ์ฐธ๊ณ ์ž๋ฃŒ๋Š” ๊ณต์‹ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋„ ์•„๋ž˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ย 

๊ณ„์ • ์„ธํŒ…

๊ตฌ๊ธ€ ๋น„์ „ API ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ํด๋ผ์šฐ๋“œ ๋น„์ „ API ์‚ฌ์šฉ ์š”์ฒญ์„ ํ•˜๊ณ  ์ธ์ฆ ๋ฐฉ์‹์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์—์„œ [View my console] ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด .

google_vision_1

[cloud vision api] ๊ฒ€์ƒ‰ํ•ด์„œ ํ•ด๋‹น API๋ฅผ ํ™œ์„ฑํ™” ํ•ด์ค๋‹ˆ๋‹ค.

google_vision_2

ย 

ํ™œ์„ฑํ™”๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ์ธ์ฆ ๋ฐฉ์‹์„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ฐฉ์‹์€ API key, OAuth, Service account key ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์–ด๋–ค๊ฑธ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ์ด ๋ฌธ์„œ์—์„œ๋Š” Service account key ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ๊ฒ๋‹ˆ๋‹ค.

ํ™”๋ฉด ์™ผ์ชฝ ๋ฉ”๋‰ด๋ฅผ ๋ณด๋ฉด ์—ด์‡ ๋ชจ์–‘(์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด) ๋ฉ”๋‰ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญ. ์—ฌ๊ธฐ์„œ [์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ โ€“ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค]๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

credentials-service-account.png

์ƒˆ๋กœ์šด ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„๊ณผ ID๋ฅผ ์ž…๋ ฅํ•˜๊ณ 

new-service-account.png

Key type ์€ JSON ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๋ฉด downloaded-filename.json ๋งํฌ ๋ˆŒ๋Ÿฌ์„œ JSON ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋‘ก๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๊ตฌ๊ธ€์ด ์ œ๊ณตํ•˜๋Š” API์—์„œ ์‚ฌ์šฉํ•  ์ธ์ฆ ํŒŒ์ผ์ด๋ฏ€๋กœ ์ž์‹ ์˜ ์„œ๋ฒ„์— ์˜ฌ๋ ค๋‘๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

downloaded-json.png

์ด์ œ JSON ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์›ํ•˜๋Š”๋Œ€๋กœ ๋ฐ”๊พธ๊ณ  ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—” ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด ์•„๋ž˜ ๊ฒฝ๋กœ์— ์˜ฌ๋ ค๋’€๋Š”๋ฐ ์›ํ•˜์‹œ๋Š” ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • /home/pi/temp/vision/gac.json

๊ตฌ๊ธ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ย GOOGLE_APPLICATION_CREDENTIALS ๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์ฆ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ console ์ฐฝ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ธ์‹์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

  • export GOOGLE_APPLICATION_CREDENTIALS=/home/pi/temp/vision/gac.json

๋กœ๊ทธ์ธ์„ ๋‹ค์‹œํ•˜๋ฉด ์œ„ ์ž‘์—…์„ ๋˜ ํ•ด์ค˜์•ผ ํ•˜๋‹ˆ๊นŒ .bashrc ํŒŒ์ผ ๋งˆ์ง€๋ง‰์— ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ย 

ํŒŒ์ด์ฌ ์„ค์น˜

๊ตฌ๊ธ€ ๋น„์ „ API๋Š” ํŒŒ์ด์ฌ 2.x, 3.x ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฏ€๋กœ ์ž์‹ ์ด ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๊ฐ€ ๊ฐ€์ง„ ํŒŒ์ด์ฌ ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ๋น„์ „ API ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

๊ตฌ๊ธ€์—์„œ ๋ฐฐํฌํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๋น„์ „ API โ€“ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์ด ์ œ๊ณตํ•˜๋Š” ๋น„์ „ API ์˜ˆ์ œ ํŒŒ์ผ์„ ๋จผ์ € ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋‘์„ธ์š”.

์œ„ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ์˜ฌ๋ ค๋„ ๋˜๊ณ , ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

  • git clone https://github.com/GoogleCloudPlatform/cloud-vision.git

๊ทธ๋ฆฌ๊ณ  label ํด๋”์— ๋“ค์–ด๊ฐ€ ๋ณด์„ธ์š”.ย requirements.txt ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๊ธฐ์žฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • cd cloud-vision/python/label
  • sudo pip install -r requirements.txt

๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ ์˜ˆ์ œ๋“ค์€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ํ‹€๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์ œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ ์ „์— ์œ„ ๋ช…๋ น์–ด๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์ž‘์—…์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ค€๋น„๊ฐ€ ๋ชจ๋‘ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์ด๋ฏธ์ง€ ์ธ์‹ ์˜ˆ์ œ

ย 

๊ตฌ๊ธ€ ๋น„์ „ API๋Š” ์ธ์‹ํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ์— ๋”ฐ๋ผ ์นดํ…Œ๊ณ ๋ฆฌ(Feature)๊ฐ€ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ธ์‹ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • LABEL_DETECTION : ์ด๋ฏธ์ง€์— ํฌํ•จ๋œ ์‚ฌ๋ฌผ ์ธ์‹
  • FACE_DETECTION : ์–ผ๊ตด ์ธ์‹
  • TEXT_DETECTION : ๋ฌธ์ž ์ธ์‹ (OCR, Optical Character Recognition)
  • LANDMARK_DETECTION : ์ง€ํ˜•, ์ง€๋ฌผ ์ธ์‹
  • LOGO_DETECTION : ํšŒ์‚ฌ ๋กœ๊ณ  ์ธ์‹
  • SAFE_SEARCH_DETECTION : 19๊ธˆ ์ด๋ฏธ์ง€ ์ธ์‹?
  • IMAGE_PROPERTIES : ์ด๋ฏธ์ง€์˜ ์ฃผ์š” ํŠน์„ฑ ์ธ์‹ (์ฃผ์š” ์ƒ‰์ƒ ๋“ฑ)

์ด ๊ฐ’๋“ค์„ ์ค‘๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ๋น„์ „ API ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ์ด๋ฏธ์ง€ ์ธ์‹ ์š”์ฒญ(request)์„ ๋ณด๋‚ผ ๋•Œ base64 ์ธ์ฝ”๋”ฉ ๋œ ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ JSON ํ˜•์‹์˜ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ request๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

{
  "requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9zaG9...image contents...fXNWzvDEeYxxxzj/Coa6Bax//Z"
      },
      "features":[
        {
          "type":"FACE_DETECTION",
          "maxResults":10
        },
        {
          "type":"LABEL_DETECTION",
          "maxResults":10
        }
      ]
    }
  ]
}

image ํ•ญ๋ชฉ ๋’ค์— base64 ์ธ์ฝ”๋”ฉ ๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ™๊ณ  features ํ•ญ๋ชฉ์—๋Š” ์›ํ•˜๋Š” ์ธ์‹ ๋ฐฉ๋ฒ•์„ ๊ธฐ์žฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์‹ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์— ๋”ฐ๋ผ features ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ์ ์ ˆํžˆ ์กฐ์ ˆํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ์ „์†ก๋˜๋ฉด ์ž ์‹œ ํ›„ ๊ฒฐ๊ณผ(response) ๊ฐ’์ด JSON ํ˜•ํƒœ๋กœ ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ์œ ์‚ฌํ•œ ํ˜•์‹์œผ๋กœ ์˜ต๋‹ˆ๋‹ค.

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/0bt9lr",
          "description": "dog",
          "score": 0.89208293
        }
      ]
    }
  ]
}

์œ„ ๊ฐ’์€ ์–ด๋–ค ์ธ์‹์„ ํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋ฉฐ, ํ›จ์”ฌ ๋ณต์žกํ•œ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•œ ์˜ˆ์ œ๋“ค์„ ์‹คํ–‰ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ’์ด ์˜ค๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

Label ์ธ์‹

Label ์ธ์‹ ์˜ˆ์ œ๋Š” label ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ธ์‹ํ•  ์ด๋ฏธ์ง€๊ฐ€ ํ•˜๋‚˜ ํ•„์š”ํ•˜๋‹ˆ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์Šคํ•‘ํฌ์Šค ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ์ด๋ฆ„์„ sphinx.jpg ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์‹ํ•  ์ด๋ฏธ์ง€๋Š” 500KB ์ด๋‚ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

224163_9213_4430

  • wget http://schools.academytravel.com.au/media/Image/cache/Cc730385-Ancient_Egypt_OneLine_Itineraries_AI_Egypt.jpg
  • mv Cc730385-Ancient_Egypt_OneLine_Itineraries_AI_Egypt.jpg sphinx.jpg

์ธ์‹์„ ํ•˜๊ธฐ ์ „์— ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด ์ค๋‹ˆ๋‹ค. ์ธ์‹ํ•œ ๊ฒฐ๊ณผ(response JSON)๋ฅผ console ์ฐฝ์— ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

  • nano label.py

์—ด์–ด๋ณธ ๊น€์— ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณด๋ฉดโ€ฆ ๋ชจ๋“  ์ž‘์—…์ด ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋‹ค ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

with open(photo_file, 'rb') as image:
        image_content = base64.b64encode(image.read())
        service_request = service.images().annotate(body={
            'requests': [{
                'image': {
                    'content': image_content.decode('UTF-8')
                },
                'features': [{
                    'type': 'LABEL_DETECTION',
                    'maxResults': 1
                }]
            }]
        })
        # [END construct_request]
        # [START parse_response]
        response = service_request.execute()
        label = response['responses'][0]['labelAnnotations'][0]['description']
        print('Found label: %s for %s' % (label, photo_file))
        print response
        return 0
        # [END parse_response]

label.py ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ด๋ฆ„์„ ๋„˜๊ธธ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์—ด์–ด์„œ base64 ์ธ์ฝ”๋”ฉ์„ ํ•ด์ค๋‹ˆ๋‹ค.

  • image_content = base64.b64encode(image.read())

์ด๊ฑธ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ request ์— ๋ถ™์ด๋Š” ๊ฒ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด์–ด์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๊ตฌ๊ธ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ JSON ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ label ์ธ์‹ ์™ธ์— face ์ธ์‹ ๋“ฑ๋“ฑ์„ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด features ํ•ญ๋ชฉ์— ์ฒจ์‚ญ์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์‹ค์ œ ์„œ๋ฒ„์— request๋ฅผ ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.

  • response = service_request.execute()

request๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด response๋ฅผ ๋ฐ›๋Š”๋ฐ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ  ์›ํ•˜๋Š” ์ž‘์—…์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ๋„์ฐฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š”๊ฒŒ ๋ชฉ์ ์ด๋ฏ€๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. return 0 ์ฝ”๋“œ ๋ฐ”๋กœ ์œ— ์ค„์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

  • print response

์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  shell๋กœ ๋น ์ ธ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  label.py ํŒŒ์ด์ฌ ํŒŒ์ผ์„ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด ๋ด…๋‹ˆ๋‹ค.

  • python label.py sphinx.jpg

๋ชจ๋“  ๊ณผ์ •์ด ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ ๊ฒ๋‹ˆ๋‹ค.

{u'responses': [{u'labelAnnotations': [{u'score': 0.97231364, u'mid': u'/m/05xh2', u'description': u'pyramid'}]}]}

๊ตฌ๊ธ€ ์„œ๋ฒ„์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ธ์‹ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด์ค€๊ฒ๋‹ˆ๋‹ค. ์ด๊ฑธ ์ข€ ๋” ๋ณด๊ธฐ ์ข‹๊ฒŒ ํŽผ์น˜๋ฉด

{
    u'responses': [
        {
            u'labelAnnotations': [
                {
                    u'score': 0.97231364, 
                    u'mid': u'/m/05xh2', 
                    u'description': u'pyramid'
                }
            ]
        }
    ]
}

uโ€ ๋ผ๊ณ  ํ‘œ์‹œ๋œ ๊ฑด ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์—†๋‹ค ์ƒ๊ฐํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์€ โ€˜descriptionโ€™ : โ€˜pyramidโ€™ ์ž…๋‹ˆ๋‹ค. ์Šคํ•‘ํฌ์Šค์™€ ํ”ผ๋ผ๋ฏธ๋“œ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ํ”ผ๋ผ๋ฏธ๋“œ๋กœ ์ธ์‹ํ–ˆ๋„ค์š”. ๊ทธ๋ž˜๋„ ๋งŒ์กฑํ• ๋งŒํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ํŒŒ์ด์ฌ์—์„œ ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • response[โ€˜responsesโ€™][0][โ€˜labelAnnotationsโ€™][โ€˜descriptionโ€™]

JSON ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค;;;

ย 

ย 

์–ผ๊ตด ์ธ์‹

์–ผ๊ตด ์ธ์‹๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ ๊ณผ์ •์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.ย face_detection ํด๋”๋กœ ์ด๋™ํ•ด์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋„ฃ์–ด์ค€ ๋’ค, faces.py ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

einstein

detect_face() ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์„œ return response[โ€˜responsesโ€™][0][โ€˜faceAnnotationsโ€™] ์ฝ”๋“œ ์•ž์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.

  • print response

๊ทธ๋ฆฌ๊ณ  ์–ผ๊ตด์ธ์‹์„ ์‹คํ–‰ํ•ด๋ณด๋ฉดโ€ฆ

  • python faces.py xxx.jpg

์•„๋ž˜์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. JSON ๊ฒฐ๊ณผ ํŒŒ์ผ์—์„œย response โ€“ย faceAnnotations ํ•ญ๋ชฉ ๋‚ด๋ถ€์˜ ๋‚ด์šฉ๋“ค๋งŒ ํ‘œ์‹œํ•œ ๊ฒ๋‹ˆ๋‹ค.

{
    'joyLikelihood': 'VERY_UNLIKELY', 
    'sorrowLikelihood': 'VERY_UNLIKELY', 
    'surpriseLikelihood': 'VERY_UNLIKELY', 
    'angerLikelihood': 'VERY_UNLIKELY', 
    
    'headwearLikelihood': 'VERY_UNLIKELY', 
    'underExposedLikelihood': 'VERY_UNLIKELY', 
    'blurredLikelihood': 'VERY_UNLIKELY', 

    'landmarkingConfidence': 0.54563558, 
    'detectionConfidence': 0.71568185, 
	
    'panAngle': 27.359901, 
    'tiltAngle': -2.6616335, 
    'rollAngle': 14.754687, 

    'boundingPoly': {
        'vertices': [
            {'y': 8, 'x': 4}, 
            {'y': 8, 'x': 191}, 
            {'y': 224, 'x': 191}, 
            {'y': 224, 'x': 4}
        ]
    }, 
    'fdBoundingPoly': {
        'vertices': [
            {'y': 69, 'x': 53}, 
            {'y': 69, 'x': 189}, 
            {'y': 204, 'x': 189}, 
            {'y': 204, 'x': 53}
        ]
    },
	
    'landmarks': [
        {
            'position': {'y': 108.6227, 'x': 105.59975, 'z': 0.00067580346}, 
            'type': 'LEFT_EYE'
        }, 
        {
            'position': {'y': 119.75568, 'x': 148.54039, 'z': 23.859083}, 
            'type': 'RIGHT_EYE'
        }, 
        ......
    ]
}

๊ฝค ๊ธด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

joyLikelihood,ย sorrowLikelihood,ย surpriseLikelihood,ย angerLikelihood ์ด ๊ฐ’๋“ค์€ ํ‘œ์ •(๊ธฐ์จ, ์Šฌํ””, ๋†€๋žŒ, ํ™”)์„ ์ธ์‹ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. headwearLikelihood ๋Š” ๋ชจ์ž๋ฅผ ์ผ๋Š”์ง€ ํ‘œ์‹œํ•˜๋Š” ํ•ญ๋ชฉ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”. ๊ฒฐ๊ณผ๊ฐ’์€ ์•„๋ž˜ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • UNKNOWNย : ์ธ์‹ ์‹คํŒจ
  • VERY_UNLIKELY : ๋งค์šฐ ํ•ด๋‹น๋˜์ง€ ์•Š์Œ
  • UNLIKELY : ํ•ด๋‹น๋˜์ง€ ์•Š์Œ
  • POSSIBLE : ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
  • LIKELY : ํ•ด๋‹น๋จ
  • VERY_LIKELY : ๋งค์šฐ ํ•ด๋‹น๋จ

boundingPolyย ์–ผ๊ตด ์ „์ฒด์˜ ์œค๊ณฝ์„ ๋ช‡ ๊ฐœ์˜ ์ ์œผ๋กœ ๊ทผ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋ฉด ์–ผ๊ตด ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋Š” ๋‹ค๊ฐํ˜•์ด ๋ฉ๋‹ˆ๋‹ค.ย fdBoundingPoly ๋Š” ์–ผ๊ตด ์œค๊ณฝ์„ย boundingPoly ๋ณด๋‹ค ๋” ํƒ€์ดํŠธํ•˜๊ฒŒ ํ”ผ๋ถ€ ๊ฒฝ๊ณ„ ๋ถ€๋ถ„์œผ๋กœ ์žก์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ย landmarks ๋Š” ์–ผ๊ตด์˜ ๊ฐ ๋ถ€๋ถ„ โ€“ ๋ˆˆ, ์ฝ”, ์ž…, ๊ท€ ๋“ฑ์˜ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๋žœ๋“œ๋งˆํฌ ์ธ์‹

๋žœ๋“œ๋งˆํฌ ์˜ˆ์ œ๋Š” landmark_detection ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ดํ•˜๊ฒŒ ์ด ์˜ˆ์ œ๋Š” GCS(Google Cloud Store) ์ƒ์˜ ํŒŒ์ผ์„ ์ฝ์–ด์™€์„œ ์ด๋ฏธ์ง€ ์ธ์‹์„ ํ•˜๋„ค์š”. ์•„๋ž˜ ๋งํฌ๋กœ ์ ‘์†ํ•ด์„œ Google Cloud Platform โ€“ Storage ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

  • https://cloud.google.com/storage/

์•„๋ž˜์ฒ˜๋Ÿผ ์ขŒ์ธก ๋ธŒ๋ผ์šฐ์ € ํƒญ์„ ๋ˆ„๋ฅด๊ณ  [๋ฒ„ํ‚ท]์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท ์ด๋ฆ„์„ ๋„ฃ๊ณ  ๊ธฐ์–ตํ•ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

google_cloud_storage

๊ทธ๋ฆฌ๊ณ  ๋žœ๋“œ๋งˆํฌ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ ค๋‘์„ธ์š”. ์ „ ํƒ€์ง€๋งˆํ•  ์ด๋ฏธ์ง€๋ฅผ landmark.jpg ๋กœ ์˜ฌ๋ ค๋’€์Šต๋‹ˆ๋‹ค.

A view of the Taj Mahal on September 30, 2010 in Agra, India.

ย 

์ด์ œ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋กœ ๋Œ์•„์™€์„œย landmark_detection ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.ย detect_landmark.py ํŒŒ์ด์„  ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์ด๊ฑธ ์ˆ˜์ •ํ•ด ์ค๋‹ˆ๋‹ค. identify_landmark() ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์„œ return ๋ฐ”๋กœ ์•ž ์ค„์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

  • print response

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์„ธ์š”.

  • python detect_landmark.py gs://๋ฒ„ํ‚ท์ด๋ฆ„/ํŒŒ์ผ์ด๋ฆ„

์ด๋ฏธ์ง€ ์ธ์‹ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์˜ต๋‹ˆ๋‹ค.

{
    'responses': [
        {
            'landmarkAnnotations': [
                {
                    'locations': [
                        {
                            'latLng': {
                                'latitude': 27.174698469698683, 
                                'longitude': 78.042073
                            }
                        }
                    ], 
                    'score': 0.86202425, 
                    'mid': '/m/0l8cb', 
                    'boundingPoly': {
                        'vertices': [
                            {'y': 103, 'x': 204}, 
                            {'y': 103, 'x': 741}, 
                            {'y': 324, 'x': 741}, 
                            {'y': 324, 'x': 204}
                        ]
                    }, 
                    'description': 'Taj Mahal'
                }, 
                ......
                ......
            ]
        }
    ]
}

landmarkAnnotations ํ•ญ๋ชฉ ์•ˆ์— ์ธ์‹ ๊ฒฐ๊ณผ๊ฐ€ 1๊ฐœ ์ด์ƒ ํฌํ•จ๋˜์–ด ์žˆ์„๊ฒ๋‹ˆ๋‹ค. ์ „ ํƒ€์ง€๋งˆํ•  ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ ธ๋Š”๋ฐ ์˜ˆ์ƒ๋Œ€๋กœย โ€˜descriptionโ€™: โ€˜Taj Mahalโ€™ ์ด๋ผ๋Š” ์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ๋„ค์š”.

ย 

ย 

๊ธฐํƒ€ ์˜ˆ์ œ๋“ค

์ด ์™ธ์—๋„ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋“ค์ด ๋” ์žˆ์œผ๋ฏ€๋กœ ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํŠนํžˆ Text ์ธ์‹์€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ช‡ ๊ฐœ ๋” ์„ค์น˜ํ•ด์•ผ ํ•˜๊ธด ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

ย 

โ†ง
โ†ง

4ร—4 16 ๋ฒ„ํŠผ ํ‚คํŒจ๋“œ ๋ชจ๋“ˆ

$
0
0

ย 

16๊ฐœ์˜ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•  ์ผ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค๋งŒโ€ฆ ์•„๋‘์ด๋…ธ์˜ ๊ธฐ์ดˆ ๊ณผ์ •์ธ digital input, digital output ์„ ์—ฐ์Šตํ•˜๊ธฐ์—๋Š” ๋”ํ• ๋‚˜์œ„ ์—†๋Š” ๋ชจ๋“ˆ์ด ํ‚คํŒจ๋“œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

ย 

ํ‚คํŒจ๋“œ ๋ชจ๋“ˆ์€ 16๊ฐœ์˜ ํ‘ธ์‹œ ๋ฒ„ํŠผ์ด 4ร—4 ํ–‰๋ ฌ๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์€ 8๊ฐœ์˜ ํ•€์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, 1~4 ๊นŒ์ง€ 4๊ฐœ์˜ ํ•€์€ ๋ฒ„ํŠผ์„ ๊ฐ€๋กœ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  5~8๊นŒ์ง€ 4๊ฐœ์˜ ํ•€์€ ๋ฒ„ํŠผ์„ ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (์ด ๋ฐฐ์น˜๋Š” ๋ชจ๋“ˆ์— ๋”ฐ๋ผ ํ‹€๋ฆฝ๋‹ˆ๋‹ค.)

keypad_2

์ฆ‰, 1~4 ๊ฐ€๋กœ๋กœ ์—ฐ๊ฒฐ๋œ ํšŒ๋กœ์™€ 5~8 ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐ๋œ ํšŒ๋กœ๊ฐ€ ๋งŒ๋‚˜๋Š” ์ง€์ , 16๊ฐœ์˜ ๊ต์ฐจ์ ์— ๋ฒ„ํŠผ์ด ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š”๊ฒ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‘ ๊ฐœ์˜ ํšŒ๋กœ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๊ฒ ์ฃ .

hex-keypad-arduino

๋”ฐ๋ผ์„œ ๊ฐ ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์กŒ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 5~8 ํ•€์— ์ˆœ์„œ๋Œ€๋กœ HIGH ๋˜๋Š” LOW ์‹ ํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , 1~4 ํ•€์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์‹ ํ˜ธ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 2ํ–‰, 2์—ด์— ์žˆ๋Š” ๋ฒ„ํŠผ์„ ์ฒดํฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ฃ .

keypad_example

๊ทธ๋Ÿผ ์„ธ๋กœ๋กœ ์—ฐ๊ฒฐ๋œ 6๋ฒˆ ํ•€์„ OUTPUT ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  HIGH ์‹ ํ˜ธ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  2๋ฒˆ ํ•€์„ INPUT ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  HIGH ์‹ ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ค๋Š”์ง€ ์ฝ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ค์–ด์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ ํ•€์— pull-down ์ €ํ•ญ์„ ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์ง€์ง€ ์•Š์•˜์„ ๋•Œ๋Š” LOW ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์˜ˆ์ œ ์†Œ์Šค

ย 

๊ฐ„๋‹จํ•˜๊ฒŒ 1ํ–‰1์—ด ๋ฒ„ํŠผ๊ณผ 2ํ–‰ 2์—ด ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์กŒ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ‚คํŒจ๋“œ ๋ชจ๋“ˆ์„ ๊ตฌํ–ˆ๋Š”๋ฐ 8๊ฐœ์˜ ํ•€์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅผ ๋•Œ ์ด ์ฝ”๋“œ๋ฅผ ์‘์šฉํ•ด ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

void setup() {
    Serial.begin(9600);
    pinMode(2, INPUT_PULLUP);
    pinMode(3, INPUT_PULLUP);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
}


void loop() {
    digitalWrite(6, LOW);
    Serial.print("pos 1, 1 = ");
    Serial.println(digitalRead(2));
    digitalWrite(6, HIGH);
    
    digitalWrite(7, LOW);
    Serial.print("pos 2, 2 = ");
    Serial.println(digitalRead(3));
    digitalWrite(7, HIGH);
    delay(1000);
}

1ํ–‰1์—ด ๋ฒ„ํŠผ๊ณผ 2ํ–‰ 2์—ด ๋ฒ„ํŠผ์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด 4๊ฐœ์˜ ๋””์ง€ํ„ธ ํ•€์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

keypad_example2

์—ฌ๊ธฐ์„œ๋Š” 1ํ–‰๊ณผ 2ํ–‰์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์‹ ํ˜ธ๋ฅผ ์ฝ์„ ๋””์ง€ํ„ธ ํ•€ 2๊ฐœ โ€“ D2, D3 ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 5์—ด๊ณผ 6์—ด๋กœ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ D6, D7 ํ•€์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ‚คํŒจ๋“œ 1 โ€“> ์•„๋‘์ด๋…ธ D2
  • ํ‚คํŒจ๋“œ 2 โ€“> ์•„๋‘์ด๋…ธ D3
  • ํ‚คํŒจ๋“œ 5 โ€“> ์•„๋‘์ด๋…ธ D6
  • ํ‚คํŒจ๋“œ 6 โ€“> ์•„๋‘์ด๋…ธ D7

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ๋Š” ์ €ํ•ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด์„œ ์•„๋‘์ด๋…ธ์˜ ๋‚ด๋ถ€ ํ’€์—…์ €ํ•ญ(internal pull-up) ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํ’€์—…์ €ํ•ญ์„ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด D2, D3 ํ•€์„ INPUT_PULLUP ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค.

pinMode(2, INPUT_PULLUP);
    pinMode(3, INPUT_PULLUP);

์ด์ œ D2, D3 ํ•€์€ ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์ง€์ง€ ์•Š์•˜์„ ๋•Œ ๋‚ด๋ถ€ ํ’€์—…์ €ํ•ญ์— ์˜ํ•ด HIGH ์‹ ํ˜ธ๋ฅผ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์กŒ์„ ๋•Œ๋Š” LOW ์‹ ํ˜ธ๊ฐ€ ์ฝ์–ด์ง€๋„๋ก ํ•ด์•ผ๊ฒ ์ฃ . ๊ทธ๋ž˜์„œ loop() ๋ฐ˜๋ณตํ•จ์ˆ˜ ์•ˆ์—์„œ output ์‹ ํ˜ธ๋ฅผ ์ฃผ๋Š” D6, D7 ํ•€์„ ์ˆœ์„œ๋Œ€๋กœ LOW ์ถœ๋ ฅ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

D6 ํ•€์„ LOW ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ณ  D2, D3 ํ•€์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜์ฃ . ๊ทธ๋ฆฌ๊ณ  D7 ํ•€์„ LOW ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ณ  D2, D3๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฒดํฌํ•˜๋ฉด 1ํ–‰1์—ด ๋ฒ„ํŠผ๋ถ€ํ„ฐ 2ํ–‰2์—ด ๋ฒ„ํŠผ๊นŒ์ง€ ์ด 4๊ฐœ์˜ ๋ฒ„ํŠผ์ด ๋ˆŒ๋Ÿฌ์กŒ๋Š”์ง€ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๊ทธ๋Ÿผ 16๊ฐœ์˜ ๋ฒ„ํŠผ ์ „๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?? 1~4ํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” 4๊ฐœ์˜ ๋””์ง€ํ„ธ ํ•€(INPUT ์ฒดํฌ)๊ณผ 5~8์—ด์„ ๋‹ด๋‹นํ•˜๋Š” 4๊ฐœ์˜ ๋””์ง€ํ„ธ ํ•€(OUTPUT ์ œ์–ด)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ํ‚คํŒจ๋“œ 1~4 โ€“> ์•„๋‘์ด๋…ธ D2~D5ย (INPUT ์ฒดํฌ)
  • ํ‚คํŒจ๋“œ 5~8 โ€“> ์•„๋‘์ด๋…ธ D6~D9ย (OUTPUT ์ œ์–ด)

์•„๋‘์ด๋…ธ D6~D9๋ฒˆ ํ•€์€ digitalWrite() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ˆœ์„œ๋Œ€๋กœ LOW ์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ , ์•„๋‘์ด๋…ธ D2~D5๋ฒˆ ํ•€์€ digitalRead() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์‹ ํ˜ธ๋ฅผ ์ฝ์œผ๋ฉด ๋˜๊ฒ ์ฃ . ์ €ํ•ญ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹ซ์€ ๊ฒฝ์šฐ 1~4๋ฒˆ ํ•€(์•„๋‘์ด๋…ธ D2~D5) ํ•€์€ pinMode() ํ•จ์ˆ˜๋กœ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ INPUT_PULLUP ๋ชจ๋“œ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค๋‹ˆ๋‹ค.

ย 

์•„๋ž˜๋Š” ๊ฐ ํ‚ค ์ž…๋ ฅ์„ ์ฒดํฌํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

setup() ํ•จ์ˆ˜๊นŒ์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

const int numRows= 4;
const int numCols= 4;

int pinRows[numRows] = {2, 3, 4, 5};
int pinCols[numCols] = {6, 7, 8, 9};

void setup() {
    Serial.begin(9600);    // init Serial communication
    
    // initialize row pins as INPUT_PULLUP
    for(int i=0; i<numRows; i++) {
        pinMode(pinRows[i], INPUT_PULLUP);
    }
    
    // initialize column pins as OUTPUT
    for(int j=0; j<numCols; j++) {
        pinMode(pinCols[j], OUTPUT);
        digitalWrite(pinCols[j], HIGH);    // set initial output as HIGH
    }
}

loop() ๋ฐ˜๋ณต ํ•จ์ˆ˜์—์„œ๋Š” for ๋ฐ˜๋ณต๋ฌธ์„ 2์ค‘์œผ๋กœ ๋Œ๋ฉด์„œ ๋ฒ„ํŠผ์ž…๋ ฅ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

void loop() {
    // Check input
    for(int j=0; j<numCols; j++) {
        digitalWrite(pinCols[j], LOW);    // set as LOW to check button press
        for(int i=0; i<numRows; i++) {
            if( digitalRead(pinRows[i]) == LOW ) {    // check input. LOW is pressed
                Serial.print("Pressed row=");
                Serial.print(i);
                Serial.print(", column=");
                Serial.println(j);
            }
        }
        digitalWrite(pinCols[j], HIGH);    // set as default (HIGH)
    }
    delay(500);
}

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ˆŒ๋ ค์ง„ ๋ฒ„ํŠผ์ด ๋ฌด์—‡์ธ์ง€ ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์˜ Serial monitor ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜์…”๋„ ๋˜๊ณ , ์•„๋ž˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

ย 

โ†ง

๋ฒ„์ €, ํ”ผ์—์กฐ ์Šคํ”ผ์ปค๋กœ ์Œ์•… ์—ฐ์ฃผ (์Šˆํผ๋งˆ๋ฆฌ์˜ค ๋ฐฐ๊ฒฝ์Œ์•…)

$
0
0

ย 

์•„๋‘์ด๋…ธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ๊ฐ„๋‹จํ•œ ๋น„ํ”„(beep)์Œ์„ ๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ € ๋˜๋Š” ํ”ผ์—์กฐ ์Šคํ”ผ์ปค๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‹ค๊ฒ๋‹ˆ๋‹ค. ์ด๊ฑธ ์ด์šฉํ•ด์„œ ์Œ์•…์„ ์—ฐ์ฃผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์Šˆํผ๋งˆ๋ฆฌ์˜ค ๋ฐฐ๊ฒฝ์Œ์•…์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๊ณก์„ ์—ฐ์ฃผํ•ด ๋ณผ๊ฒ๋‹ˆ๋‹ค.

images

ย 

๋ฒ„์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋‘์ด๋…ธ ๋””์ง€ํ„ธ ํ•€์— ์—ฐ๊ฒฐํ•ด์„œ digitalWrite() ํ•จ์ˆ˜๋กœ 5V ์ „์••์„ on/off ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ฐ„๋‹จํ•œ ๋น„ํ”„(beep)์Œ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ์˜ PWM ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ analogWrite()๋ฅผ ํ•ด์ฃผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ analogWrite()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณผ๋ฅจ ์กฐ์ ˆ์˜ ๊ธฐ๋Šฅ์ด ๋  ๋ฟ ์Œ๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์Œ์•…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ์Œ๊ณ„์˜ ์ฃผํŒŒ์ˆ˜์— ๋งž๋Š” ์‚ฌ๊ฐํŒŒ(square wave)๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ์—์„œ tone() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. tone() ํ•จ์ˆ˜๋Š” analogWrite() ์—†์ด ์ž์ฒด์ ์œผ๋กœ square wave ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ๋””์ง€ํ„ธ ํ•€ ์•„๋ฌด๊ฑฐ๋‚˜ ํ•˜๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

tone() ํ•จ์ˆ˜๋Š” ์ฃผํŒŒ์ˆ˜์— ๋งž๋Š”ย square wave ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž์ฒด์ ์œผ๋กœ timer๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.(ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๋กœ ๋™์ž‘) ๋”ฐ๋ผ์„œ ์•„๋‘์ด๋…ธ setup(), loop() ํ•จ์ˆ˜์—์„œ delay()๋ฅผ ์‚ฌ์šฉํ•ด ์•„๋‘์ด๋…ธ๋ฅผ ๋ฉˆ์ถ”๋”๋ผ๋„ tone() ํ•จ์ˆ˜๋Š” ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์Œ์•…์„ ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๊ณ  ์‹ถ๋‹ค๋ฉด noTone() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

tone() ย ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ด๋จธ๋Š” ์•„๋‘์ด๋…ธ ๋””์ง€ํ„ธ 3๋ฒˆ๊ณผ 11๋ฒˆ PWM ํ•€๊ณผ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

ย 

๋ฒ„์ €์˜ ์‚ฌ์šฉ๋ฒ•์€ ์—„์ฒญ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋””์ง€ํ„ธ ํ•€ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณผ๋ฅจ ์กฐ์ ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 333~1K ์˜ด ์ €ํ•ญ์„ ์ถ”๊ฐ€๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

speaker2_fritzing

ย 

ย 

์Šค์ผ€์น˜

ย 

์Œ์•…์ด ์—ฐ์ฃผ๋˜๋„๋ก ์Šค์ผ€์น˜๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € tone() ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๋ฒ• ๋ถ€ํ„ฐ ๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

  • tone(pin, frequency)
  • tone(pin, frequency, duration)

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Œ์„ ์žฌ์ƒํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๊ฐ’์€ [๋””์ง€ํ„ธ ํ•€ ๋ฒˆํ˜ธ], [์ฃผํŒŒ์ˆ˜], [์žฌ์ƒ ์‹œ๊ฐ„] ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Œ์•…์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ์Œ๊ณ„์— ๋งž๋Š” ์ฃผํŒŒ์ˆ˜ ๊ฐ’๊ณผ ์žฌ์ƒ ์‹œ๊ฐ„์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šค์ผ€์น˜์—์„œ๋Š” melody[] ๋ฐฐ์—ด๊ณผ tempo[] ๋ฐฐ์—ด๋กœ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋’€์Šต๋‹ˆ๋‹ค.

melody[] ๋ฐฐ์—ด์„ ๋ณด์‹œ๋ฉด NOTE_E7 ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 7์˜ฅํƒ€๋ธŒ ๋ฏธ(E) ์Œ์„ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ tone() ํ•จ์ˆ˜์—๋Š” ์ฃผํŒŒ์ˆ˜ ๊ฐ’์„ ๋„ฃ์–ด์•ผํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œย NOTE_E7 ์— ํ•ด๋‹นํ•˜๋Š” ์ฃผํŒŒ์ˆ˜ ๊ฐ’์ด ์–ด๋”˜๊ฐ€์— ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผํŒŒ์ˆ˜ ๊ฐ’๋“ค์€ ์•„๋‘์ด๋…ธ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋ฐฐํฌ๋˜๊ณ  ์žˆ์œผ๋‹ˆ ๋งํฌ์—์„œ ํ…์ŠคํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์šฐ์ธก ์ƒ๋‹จ์—์„œ [ํ™”์‚ดํ‘œ ์•„์ด์ฝ˜ โ€“ ์ƒˆ ํƒญ] ์„ ํƒํ•˜์‹  ๋’คย pitches.h ๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์—ฌ๊ธฐ์— ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (Ctrl+Shift+N ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑํ•ด๋„ ๋จ)

New_Tab

pitches.h ํŒŒ์ผ์ด ์ €์žฅ๋˜์—ˆ์œผ๋ฉด ์ค€๋น„๋Š” ๋‹ค ๋์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šค์ผ€์น˜๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์œผ์‹œ๊ณ , ์—…๋กœ๋“œ ํ›„ ์Œ์•…์„ ๊ฐ์ƒํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

#include "pitches.h"

#define melodyPin 6

unsigned long prevPlayTime = 0;
unsigned long playDuration = 0;
int currentMelody = 0;

//Mario main theme melody
int melodySize = 75;
int melody[] = {
  NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0,  0, NOTE_G6, 0, 0, 0, 
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, 
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, 
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0
};
//Mario main them tempo
int tempo[] = {
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
};


void sing() {
    if(millis() < prevPlayTime + playDuration) {
        // music is playing. do nothing
        return;
    }
    // stop the tone playing:
    noTone(8);
    
    if(currentMelody >= melodySize)
        currentMelody = 0;
    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/tempo[currentMelody];

    tone(melodyPin, melody[currentMelody], noteDuration);
    prevPlayTime = millis();
    playDuration = noteDuration * 1.30;
    
    currentMelody++;
}



void setup() {
	pinMode(melodyPin, OUTPUT);
}

void loop() {
	// Do what you want

	// play music
	sing();
}

ย 

์‹ค์ œ ์—ฐ์ฃผ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์€ sing() ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sing() ํ•จ์ˆ˜ ์ฒซ ๋ถ€๋ถ„์—์„œ ํ˜„์žฌ ์‹œ๊ฐ„์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. loop() ํ•จ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ฒŒ ๋ฐ˜๋ณต๋˜๋ฉด์„œ ๊ณ„์† sing() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ์ด๋ฏธ ์Œ์„ ์žฌ์ƒํ•˜๋Š” ์ค‘์ด๋ผ๋ฉด ์Œ ์žฌ์ƒ์ด ๋๋‚  ๋•Œ๊นŒ์ง€๋Š”ย ๋‹ค๋ฅธ ์Œ์„ ์žฌ์ƒํ•ด์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

if(millis() < prevPlayTime + playDuration) {
        // music is playing. do nothing
        return;
    }

์ผ๋‹จ ์Œ ์žฌ์ƒ์ด ๋๋‚ฌ์œผ๋ฉด ๋‹ค์Œ ์Œ์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์Œ ์žฌ์ƒ์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

// stop the tone playing:
    noTone(8);

์Œ์•…์„ ๋๊นŒ์ง€ ์—ฐ์ฃผํ–ˆ์œผ๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ƒํ•˜๋„๋ก ๋ฐฐ์—ด index ๋ฅผ ์ฒดํฌํ•˜๊ณ 

if(currentMelody >= melodySize)
        currentMelody = 0;

์žฌ์ƒํ•  ์Œ์˜ ์žฌ์ƒ ์‹œ๊ฐ„์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. tempo[] ๋ฐฐ์—ด์— ๊ฐ ์Œ์˜ ์žฌ์ƒ ์‹œ๊ฐ„์ด ๊ธฐ๋ก๋˜์–ด ์žˆ๋Š”๋ฐ, 8๋ถ„ ์Œํ‘œ 4๋ถ„ ์Œํ‘œโ€ฆ ์ด๋Ÿฐ ๋‹จ์œ„๋กœ ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 1์ดˆ(1000 ๋ฐ€๋ฆฌ์ดˆ)๋ฅผ tempo ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์žฌ์ƒ ์‹œ๊ฐ„์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

// to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/tempo[currentMelody];

์ด์ œ tone() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์Œ์„ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

tone(melodyPin, melody[currentMelody], noteDuration);
    prevPlayTime = millis();
    playDuration = noteDuration * 1.30;

    currentMelody++;

์Œ ์žฌ์ƒ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ sing() ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก prevPlayTime ๊ฐ’์„ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.ย ๊ทธ๋ฆฌ๊ณ  playDuration ๊ฐ’์„ ์žฌ์ƒ์‹œ๊ฐ„์˜ 1.3 ๋ฐฐ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.ย playDuration ๊ฐ’์€ ์Œ ์žฌ์ƒ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์Œ ์žฌ์ƒ์‹œ๊ฐ„์˜ 1.3๋ฐฐ๊ฐ€ ์ ๋‹นํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ์—ด์˜ index๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์Œ์„ ์žฌ์ƒํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

์ด์ƒ์˜ ์Šค์ผ€์น˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์Šˆํผ ๋งˆ๋ฆฌ์˜ค ๋ฐฐ๊ฒฝ์Œ์•…์„ ๋ฒ„์ €๋กœ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์†Œ์Šค์ฝ”๋“œ๋Š” loop() ํ•จ์ˆ˜์•ˆ์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋”๋ผ๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๊ฐ„๋‹จํžˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

์ด ์˜ˆ์ œ์—๋Š” ํ•˜๋‚˜์˜ ์Œ์•…๋งŒ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋ฐฐ๊ฒฝ์Œ์•…์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.

//Underworld melody
int underworld_melody[] = {
  NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
  NOTE_AS3, NOTE_AS4, 0,
  0,
  NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
  NOTE_AS3, NOTE_AS4, 0,
  0,
  NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
  NOTE_DS3, NOTE_DS4, 0,
  0,
  NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
  NOTE_DS3, NOTE_DS4, 0,
  0, NOTE_DS4, NOTE_CS4, NOTE_D4,
  NOTE_CS4, NOTE_DS4,
  NOTE_DS4, NOTE_GS3,
  NOTE_G3, NOTE_CS4,
  NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4,
  NOTE_GS4, NOTE_DS4, NOTE_B3,
  NOTE_AS3, NOTE_A3, NOTE_GS3,
  0, 0, 0
};
//Underwolrd tempo
int underworld_tempo[] = {
  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  3,
  12, 12, 12, 12,
  12, 12, 6,
  6, 18, 18, 18,
  6, 6,
  6, 6,
  6, 6,
  18, 18, 18, 18, 18, 18,
  10, 10, 10,
  10, 10, 10,
  3, 3, 3
};

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

ย 

โ†ง

SPI ํ†ต์‹  ์ƒ์„ธ ๋ถ„์„

$
0
0

ย 

์•„๋‘์ด๋…ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๋ฆฌ์–ผ, I2C, SPI ํ†ต์‹  ๋ถ„์„ ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค. ์‹œ๋ฆฌ์ฆˆ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์œผ์‹œ๊ธธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

ย 

์•„๋ž˜ SPI ๊ด€๋ จ ํŠœํ† ๋ฆฌ์–ผ์˜ ์ž๋ฃŒ๋ฅผ ๋ฒˆ์—ญ/์ˆ˜์ • ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ย 

ย 

๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์˜ ๋ฌธ์ œ์ 

ย 

TX, RX ํ•€์„ ์ด์šฉํ•ด์„œ ๋™์ž‘ํ•˜๋Š” ์‹œ๋ฆฌ์–ผ(Serial) ํ†ต์‹ ์€ ๋น„๋™๊ธฐ์‹(asynchronous) ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‘ ์žฅ์น˜ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์ค‘์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ณ„๋„์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋‘ ์žฅ์น˜๋Š” ๋Š์ž„์—†์ด ์ƒ๋Œ€๋ฐฉ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š”์ง€ ํ™•์ธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜๋“ค์€ 1์ดˆ๋ฅผ ๋ช‡ ๊ฐœ์˜ ๊ฐ„๊ฒฉ๋กœ ๋‚˜๋ˆ ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ์ง€(baud rate) ๋ฏธ๋ฆฌ ์•ฝ์†ํ•ด๋‘ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„๊ฒฉ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ†ต์‹ ์— ์ฐธ์—ฌํ•˜๋Š” ์–‘์ชฝ ์žฅ์น˜๊ฐ€ ๊ฐ™์€ ํด๋Ÿญ(clock)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ๋‘ ์žฅ์น˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํด๋Ÿญ์ด ๋ฏธ์„ธํ•˜๊ฒŒ ํ‹€๋ฆฌ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ !! ์ปดํ“จํ„ฐ์˜ ๋‚ด๋ถ€ ๋™์ž‘์€ ๋ชจ๋‘ ํด๋Ÿญ(clock)์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋Š” ์‹ ํ˜ธ์— ๋™๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿญ์€ ์ปดํ“จํ„ฐ์— ๋ถ€์ฐฉ๋œ main crystal ์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.

ย 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์€ ๋งค 1 byte ์†ก์‹ ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€๋กœ start/stop bit ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ์˜ ์‹œ์ž‘๊ณผ ๋์„ ํ‘œ์‹œํ•  ๋ฟ ์•„๋‹ˆ๋ผ ํด๋Ÿญ์ด ๋‹ฌ๋ผ sync ๊ฐ€ ์–ด๊ธ‹๋‚˜๋”๋ผ๋„ start bit๋ฅผ ๋ณด๊ณ  ๋‹ค์‹œ ๋งž์ถฐ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์€ ์•„๋ž˜์ฒ˜๋Ÿผ 1byte ๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

52ddb2d5ce395f59658b4567

์ด์ œ ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์ด ๋™์ž‘ํ•˜๋Š”๊ฑด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๋งค 1 byte๋ฅผ ์ „์†ก ํ•  ๋•Œ๋งˆ๋‹ค start/stop bit ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  sync๋ฅผ ๋‹ค์‹œ ๋งž์ถฐ์•ผ ํ•˜๋‹ˆ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†ก์ˆ˜์‹ ์„ ์œ„ํ•ด ๋ณต์žกํ•œ ํ•˜๋“œ์›จ์–ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋‹จ์ ์ž…๋‹ˆ๋‹ค.ย ๋ฐ˜๋ฉด์— ๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์€ ์ด๋Ÿฐ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ๊ณผ ์†ก์‹ 

ย 

๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ณ„๋„์˜ ํด๋Ÿญ(clock) ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํด๋Ÿญ ๋ผ์ธ์„ ํ†ต์‹  ์ฐธ์—ฌ์ž๊ฐ€ ๊ณต์œ ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ๋ผ์ธ์œผ๋กœ ์–ธ์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. I2C, SPI(Serial Peripheral Interface) ํ†ต์‹ ์ด ๋Œ€ํ‘œ์ ์ธ ๋™๊ธฐ์‹ ํ†ต์‹  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํด๋Ÿญ ๋ผ์ธ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” rising (low to high) ๋˜๋Š” falling (high to low) ์‹ ํ˜ธ๋ฅผ ์ธ์‹ํ•ด์„œ ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ ๋ผ์ธ์—์„œ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค.

52ddb2d8ce395fad638b4567

๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์ฒ˜๋Ÿผ ํ†ต์‹ ์— ์ฐธ์—ฌํ•˜๋Š” ์žฅ์น˜๋“ค์ด ํ†ต์‹  ์†๋„(baud rate)๋ฅผ ๊ณต์œ ํ•  ํ•„์š”๋„ ์—†๊ณ , ํด๋Ÿญ์„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋“œ์›จ์–ด๋„ ๊ฐ„๋‹จํ•œ shift register ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

๋ฐ์ดํ„ฐ ์ˆ˜์‹ 

ย 

๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜? ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ์ค‘ SPI(Serial Peripheral Interface) ํ†ต์‹ ์˜ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

52ddb2dbce395fae408b4568

SPI ํ†ต์‹ ์€ ์˜ค์ง ํ•œ ์žฅ์น˜๋งŒ ํด๋Ÿญ ๋ผ์ธ์— ์‹ ํ˜ธ(CLK, SCK, ClocK)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์žฅ์น˜๋ฅผ master ๋ผ๊ณ  ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ†ต์‹ ์— ์ฐธ๊ฐ€ํ•œ ์žฅ์น˜๋“ค์€ slave ๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. SPI๋Š” 1:n ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ slave ๋Š” 1๊ฐœ ์ด์ƒ์˜ ์žฅ์น˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ์•„๋‘์ด๋…ธ(๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ)๊ฐ€ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์Šคํ„ฐ์—์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ์ „๋‹ฌ๋  ๋•Œ๋Š” MOSI(Master Out / Slave In) ๋ฐ์ดํ„ฐ ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ ๋งˆ์Šคํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก ๋  ๋•Œ๋Š” ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๋ผ์ธ์ธ MISO(Master In / Slave Out) ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํด๋Ÿญ(SCK), ๋ฐ์ดํ„ฐ ์ „์†ก(MOSI), ๋ฐ์ดํ„ฐ ์ˆ˜์‹ (MISO) ์„ธ ๊ฐœ์˜ ๋ผ์ธ์ด ํ†ต์‹ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๋„(์•„๋‘์ด๋…ธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ) ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋Š” ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ˆ˜์‹ ์šฉ ํด๋Ÿญ ์‹ ํ˜ธ๋„ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. MISO ๋ผ์ธ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ์‹ ํ˜ธ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์ด ์•„๋ฌด๋•Œ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹  ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ๋‹ค๋Š”๊ฑธ ์•„์‹ค ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ๊ฝค ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์„ผ์„ธ์™€ ํ†ต์‹ ํ•  ๋•Œ ๊ทธ๋ฆฌ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ์—์„œ โ€œread dataโ€ ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ „์†กํ•˜๋ฉด ์„ผ์„œ๋Š” ์ž์‹ ์ด ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋„๋ก ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ดํ›„ ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ย 

์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜ ์„ ํƒ (SS, Slave Select)

ย 

์•ž์„œ ์–ธ๊ธ‰ํ•œ CLK, MOSI, MISO ๋ผ์ธ ์™ธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋ผ์ธ์ด ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ SS(Slave Select) ์ž…๋‹ˆ๋‹ค.

SPI ํ†ต์‹ ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ slave ์žฅ์น˜๊ฐ€ ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, SPI ์—์„œ ํด๋Ÿญ(SCK), MOSI, MISO ๋ผ์ธ์€ ๋ชจ๋“  ์žฅ์น˜๊ฐ€ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค„ ๋•Œ ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๋Š” ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. SPI์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•˜๋“œ์›จ์–ด์ ์ธ ์‹ ํ˜ธ์„ (SS) ํ•˜๋‚˜๋ฅผ ๋” ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

52ddb2dcce395fed638b4567

๋™์ž‘์ด ์—†์„ ๋•Œ ์ด ์‹ ํ˜ธ์„ ์€ HIGH ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋‹ค๊ฐ€ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ LOW ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.(active low) ๊ทธ๋ž˜์„œ SS ๋ผ์ธ์ด ์„ผ์„œ์˜ enable/reset ๋ผ์ธ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

๋‹ค์ˆ˜์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜ ์—ฐ๊ฒฐ

ย 

์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ๊ฐ ์žฅ์น˜๋งˆ๋‹ค ํ•˜๋“œ์›จ์–ด์ ์ธ ์‹ ํ˜ธ์„ (SS)์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์žฅ์น˜์™€ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น๋˜๋Š” SS ๋ผ์ธ์„ LOW ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.ย ์ด ๋ฐฉ๋ฒ•์€ ์ง๊ด€์ ์ด๊ณ  ๋‹จ์ˆœํ•œ ํ•ด๊ฒฐ์ฑ…์ด์ง€๋งŒ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜์˜ ์ˆ˜๋งŒํผ ์‹ ํ˜ธ์„ (SS)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

50e5d529ce395f2f7a000000

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ MOSI, MISO ๋ผ์ธ์„ ์ฒด์ธ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•˜๊ณ  SS ๋ผ์ธ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐํ•˜๋ฉด SS ๋ผ์ธ์œผ๋กœ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๋ชจ๋“  ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋“ค์ด ํ†ต์‹ ํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์Šคํ„ฐ์—์„œ ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒด์ธ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ชจ๋“  ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋Š” ์ž์‹ ์—๊ฒŒ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ทจ์‚ฌ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ , ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ ์ ˆํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•ํ•ด ๋‹ค์Œ ์žฅ์น˜๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

50e5d529ce395fd27b000001

์ด๋Ÿฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์€ Daisy-chained ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์ฃผ๋กœ ๋งˆ์Šคํ„ฐ์—์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ๋‹จ ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. RGB LED strip ๊ฐ™์€ ์žฅ์น˜๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์Šคํ„ฐ์—์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ๋‹จ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ํ๋ฅผ ๊ฒฝ์šฐ ๋งˆ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋ผ์ธ์ธ MISO ์—ฐ๊ฒฐ์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

SPI ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ย 

์•„๋‘์ด๋…ธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ shiftIn(), shiftOut() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ง์ ‘ ๋””์ง€ํ„ธ ํ•€์— ๊ฐ„๋‹จํ•œ SPI ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋””์ง€ํ„ธ ํ•€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ SPI ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ์•„๋‘์ด๋…ธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” SPI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋งˆ์ดํฌ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ€์ง„ SPI ํ•˜๋“œ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์ •ํ•ด์ง„ SPI ํ•€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

SPI ์—ฐ๊ฒฐ์€ ์œ„์— ์˜ˆ์‹œํ•œ ํ‘œ์ค€ ๋ฐฉ๋ฒ• ์™ธ์—๋„ ๋ณ€ํ˜•๋œ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ผ์„œ๋‚˜ ๋ชจ๋“ˆ์— ๋”ฐ๋ผ ๊ทธ์— ๋งž๊ฒŒ ํ•€ ์—ฐ๊ฒฐ์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

์ฐธ๊ณ ์ž๋ฃŒ

.

ย 

โ†ง

I2C ํ†ต์‹  ์ƒ์„ธ ๋ถ„์„

$
0
0

ย 

์ด ๋ฌธ์„œ๋Š” ์‹œ๋ฆฌ์–ผ, I2C, SPI ย ๊ฐ๊ฐ์˜ ๋ฌธ์„œ๋กœ ๋‚˜๋‰˜์–ด์ง„ ๋ฌธ์„œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์‹œ๋ฆฌ์ฆˆ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์œผ์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

I2C ํ†ต์‹  ๊ฐœ์š”

ย 

I2C (Inter-Integrated Circuit, ๋˜๋Š” TWI โ€“ Two Wire Interface) ๋Š” ๋ณต์ˆ˜๊ฐœ์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๊ฐ€ ๋ณต์ˆ˜๊ฐœ์˜ ๋งˆ์Šคํ„ฐ ์žฅ์น˜์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ SPI ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•˜๋‚˜์˜ ์™„์„ฑํ’ˆ์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋“ค ๊ฐ„์˜ ๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ ์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์—์„œ ์‚ดํŽด๋ณด์•˜๋‹ค์‹œํ”ผ ๋น„๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ (์ดํ•˜ UART)์€ ํด๋Ÿญ์„ ๋งž์ถฐ์ค˜์•ผ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ผ์ธ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์‹ ํ˜ธ๋ฅผ ํ•ญ์ƒ ์ฃผ์‹œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•˜๋“œ์›จ์–ด๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์ ์œผ๋กœ UART ํ†ต์‹ ์€ 1:1 ํ†ต์‹ ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ๋™๊ธฐ์‹ ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์ธ SPI ๋Š” ํด๋Ÿญ(CLK) ๋ผ์ธ์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ๋ผ์ธ์„ ๋™๊ธฐํ™” ํ•˜๋ฏ€๋กœ ํ•˜๋“œ์›จ์–ด ๊ตฌ์กฐ๋„ ๊ฐ„๋‹จํ•˜๊ณ  1:N ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์†ก์‹ ์šฉ ํ•€๊ณผ ์ˆ˜์‹ ์šฉ ํ•€์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ณ , full-duplex(๋™์‹œ ์†ก์ˆ˜์‹ ) ์—ฐ๊ฒฐ์„ ์ด์šฉํ•ด 10๋งŒ ๋น„ํŠธ์˜ ์ „์†ก ์†๋„๋ฅผ ์ง€์›ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ SPI ํ†ต์‹ ์€ ํ†ต์‹ ์— ํ•„์š”ํ•œ ํ•€์ด ๋งŽ์•„์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์žฅ์น˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ 4๊ฐœ์˜ ๋ผ์ธ (CLK, MOSI, MISO, SS)์ด ํ•„์š”ํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์žฅ์น˜๋ฅผ ๋”ํ•  ๋•Œ๋งˆ๋‹ค ๋ผ์ธ์ด ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  N:N ํ†ต์‹ ์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

50e5d529ce395f2f7a000000

I2C ํ†ต์‹ ์€ SPI ํ†ต์‹ ์˜ ์ด๋Ÿฐ ๋‹จ์ ๋“ค์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋™๊ธฐ์‹(synchronous) ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. UART ํ†ต์‹ ์ฒ˜๋Ÿผ ๋‹จ ๋‘ ๋ผ์ธ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  1008 ๊ฐœ์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ N:N ํ†ต์‹ ๋„ ์ง€์›์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (๋‹จ ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋ผ๋ฆฌ ํ†ต์‹ ์€ ๋ถˆ๊ฐ€) ํ•˜๋“œ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ์ด SPI ๋ณด๋‹ค ๋ณต์žกํ•˜๊ธด ํ•˜์ง€๋งŒ UART ํ†ต์‹ ๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ†ต์‹  ์†๋„๋ฉด์—์„œ๋„ SPI ์™€ UART ํ†ต์‹ ์˜ ์ค‘๊ฐ„์ฏค ๋ฉ๋‹ˆ๋‹ค.(10kHz/40kHz)

51adfda8ce395f151b000000

ย 

ย 

I2C ํ•˜๋“œ์›จ์–ด

ย 

I2C ํ†ต์‹ ์€ ๋‘ ๊ฐœ์˜ ๋ผ์ธ โ€“ SCL, SDA ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

51adfda8ce395f151b000000

SCL ์€ SPI ์˜ CLK ์ฒ˜๋Ÿผ ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  SDA ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ผ์ธ์ž…๋‹ˆ๋‹ค. ํด๋Ÿญ ์‹ ํ˜ธ๋Š” ๋ฐ˜๋“œ์‹œ ๋งˆ์Šคํ„ฐ ์žฅ์น˜๊ฐ€ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ง€์—ฐํ•˜๊ธฐ ์œ„ํ•ด ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ clock stretching ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

I2C ํ†ต์‹ ์€ UART/SPI ํ†ต์‹ ๊ณผ๋Š” ๋‹ฌ๋ฆฌ I2C ํ•˜๋“œ์›จ์–ด(bus driver) ์žฅ์น˜๊ฐ€ โ€œopen drainโ€ ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ง์€ I2C ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜ ํ•˜๋‚˜๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•ด ๋ผ์ธ์— LOW ์‹ ํ˜ธ๋ฅผ ๋„ฃ๊ณ  ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ์žฅ์น˜๋“ค์€ ์ด๊ฑธ ๊ฐ•์ œ๋กœ HIGH๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. I2C ํ†ต์‹ ์˜ ๋‘ ๋ผ์ธ SDA, SCL ์€ ๋ชจ๋‘ ํ’€์—… ์ €ํ•ญ(pull-up resistor)์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ†ต์‹ ๋ผ์ธ์ด ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ HIGH ์ƒํƒœ๋กœ ๋ณต๊ท€๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ’€์—… ์ €ํ•ญ์€ ๋™์ž‘ ์ „์••์ด ๋‹ค๋ฅธ ์žฅ์น˜๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ํ†ต์‹ ํ•˜๋Š”๋ฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ๋“ค์„ ์—†์• ์ค๋‹ˆ๋‹ค. ํ’€์—… ์ €ํ•ญ์ด ๋‘ ์žฅ์น˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ „์••๋ณด๋‹ค ๋‚ฎ์€ ๋ ˆ๋ฒจ๋กœ ์œ ์ง€์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ level-shifting ํšŒ๋กœ๊ฐ€ ํ•„์š”์น˜ ์•Š์Šต๋‹ˆ๋‹ค. (๋‘ ์žฅ์น˜์˜ ์ „์••์ฐจ๊ฐ€ ํฐ ๊ฒฝ์šฐ๋Š” I2C level shifter ๊ฐ€ ํ•„์š”ํ•จ)

ย 

ย 

ํ”„๋กœํ† ์ฝœ

ย 

I2C ํ†ต์‹ ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” UART/SPI ๋ณด๋‹ค ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. UART/SPI ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„๋“ค์„ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ย 

๊ธฐ๋ณธ ๊ตฌ์กฐ

I2C๊ฐ€ ์ „์†กํ•˜๋Š” ๋ฉ”์‹œ์ง€๋Š” 2๊ฐœ์˜ ํ”„๋ ˆ์ž„ โ€“ ์ฃผ์†Œ(address) ํ”„๋ ˆ์ž„๊ณผ ๋ฐ์ดํ„ฐ(data) ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์†Œ ํ”„๋ ˆ์ž„์€ ๋งˆ์Šคํ„ฐ๊ฐ€ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ๊ฐ€๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์€ ์‹ค์ œ ์ „์†กํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.

51ae0000ce395f645d000000

ย 

ํ†ต์‹  ์‹œ์ž‘ ์กฐ๊ฑด

๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ์†Œ ํ”„๋ ˆ์ž„๋ถ€ํ„ฐ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋Š” SCL(ํด๋Ÿญ) ๋ผ์ธ์„ HIGH ์ƒํƒœ๋กœ ๋‘๊ณ , SDA(๋ฐ์ดํ„ฐ) ๋ผ์ธ์„ LOW๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹ ํ˜ธ๋Š” ๋ชจ๋“  ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๋“ค์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํšŒ๋กœ์— ๋งˆ์Šคํ„ฐ ์žฅ์น˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ๋ถ™์–ด ์žˆ๋‹ค๋ฉด ๋จผ์ € SDA ๋ผ์ธ์„ LOW ๋กœ ์žก๋Š” ์ด๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

ย 

์ฃผ์†Œ ํ”„๋ ˆ์ž„(address frame)

์ฃผ์†Œ ํ”„๋ ˆ์ž„์€ ํ•ญ์ƒ ๋ชจ๋“  ํ†ต์‹  ๋ฐ์ดํ„ฐ์˜ ์•ž์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ผ์ธ์œผ๋กœ ์ฒ˜์Œ ์ˆ˜์‹ ๋˜๋Š” 1byte ์ค‘ ์•ž์„  7 bit ๋ฐ์ดํ„ฐ(MSB, most significant bit)๊ฐ€ I2C ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ 1 bit ๋Š” ์ฝ๊ธฐ(read, 1, ๋ฐ์ดํ„ฐ ์š”์ฒญ) ๋˜๋Š” ์“ฐ๊ธฐ(write, 0, ๋ฐ์ดํ„ฐ ์ „์†ก) ๋™์ž‘์ž„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์˜ 9๋ฒˆ์งธ bit ๊ฐ’์€ NACK/ACK ๋น„ํŠธ์ž…๋‹ˆ๋‹ค. ์ด ๋น„ํŠธ๋Š” ๋งˆ์Šคํ„ฐ๊ฐ€ ์ „์†กํ•œ ์ฃผ์†Œ ์ •๋ณด(8bit)์— ํ•ด๋‹นํ•˜๋Š” ์žฅ์น˜๊ฐ€ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.(์ฆ‰, ํ•ด๋‹นํ•˜๋Š” ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ์น˜๊ฐ€ ์ž ์‹œ SDA ๋ผ์ธ์˜ ์ปจํŠธ๋กค ๊ถŒํ•œ์„ ๊ฐ€์ง) ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋Š” ์ด ์‹ ํ˜ธ๋ฅผ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก์ด ์„ฑ๊ณต์ ์ธ์ง€, ์‹คํŒจ๋ผ๋ฉด ์•ž์œผ๋กœ ์–ด๋–ค ๋™์ž‘์„ ํ• ์ง€ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. NACK/ACK ๋น„ํŠธ๋Š” ์ฃผ์†Œ ํ”„๋ ˆ์ž„, ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ๋์— ํ•ญ์ƒ ๋ถ™์Šต๋‹ˆ๋‹ค.

ย 

๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„(data frame)

์ฃผ์†Œ ํ”„๋ ˆ์ž„์˜ ์ „์†ก์ด ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ์ „์†ก์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋Š” SCL ๋ผ์ธ์˜ ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ๊ณ„์† ์ƒ์„ฑํ•˜๋ฉฐ SDA ๋ผ์ธ์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ณ ๊ฐ‘๋‹ˆ๋‹ค. ์ด๋•Œ SDA ๋ผ์ธ์˜ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์€ read, write ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” bit ๊ฐ’์— ๋”ฐ๋ผ ๋งˆ์Šคํ„ฐ ๋˜๋Š” ์Šฌ๋ ˆ์ด๋ธŒ๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ย 

ํ†ต์‹  ์ข…๋ฃŒ ์กฐ๊ฑด

๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์ด ์ „์†ก๋˜๋ฉด ๋งˆ์Šคํ„ฐ ์žฅ์น˜๋Š” ์ข…๋ฃŒ ์‹ ํ˜ธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์‹ ํ˜ธ๋Š” ํด๋Ÿญ ๋ผ์ธ์ธ SCL ์„ 0->1(LOW to HIGH) ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค, SCL ๋ผ์ธ์ด HIGH ์ธ ์ƒํƒœ์—์„œ SDA ๋ผ์ธ์„ 0->1 (LOW to HIGH)๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์žฅ์น˜๋“ค์€ ๋ฐ˜๋“œ์‹œ SCL ๋ผ์ธ์ด HIGH ์ธ ์ƒํƒœ์—์„œ SDA ๋ผ์ธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋™์ž‘์€ ์ž˜๋ชป๋œ ์ข…๋ฃŒ์‹ ํ˜ธ๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ย 

ํ”„๋กœํ† ์ฝœ ์‹ฌํ™”

์•„๋ž˜ ๋งํฌ์—์„œ 10๋น„ํŠธ ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Repeated Start Condition์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Clock stretching ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

.

ย 

ย 

ย 

ย 

ย 

ย 

โ†ง
โ†ง

ESP8266 โ€“ ARDUINO IDE ์˜ˆ์ œ (MQTT)

$
0
0

ย 

๋ณธ ๋ฌธ์„œ๋Š” ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ(IDE)๋ฅผ ์ด์šฉํ•ด์„œ ESP8266 ๋ชจ๋“ˆ์„ ๋‹ค๋ฃจ๋Š” ์˜ˆ์ œ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

IoT ์‹œ์Šคํ…œ ๊ตฌํ˜„์„ ํ•œ๋‹ค๋ฉด ํ•œ๋ฒˆ์ฏค ๊ณ ๋ คํ•˜๊ธฐ ๋งˆ๋ จ์ธ MQTT ํ”„๋กœํ† ์ฝœ์„ ESP8266์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์ด์šฉํ•ด์„œ MQTT ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” MQTT ํ”„๋กœํ† ์ฝœ์˜ ์ƒ์„ธ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ง MQTT ๊ฐ€ ์ต์ˆ™์น˜ ์•Š์œผ์‹  ๋ถ„์€ ์•„๋ž˜ MQTT ๋ฅผ ์ƒ์„ธํžˆ ๋‹ค๋ฃฌ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ย 

ย 

MQTT ํ†ต์‹  ๊ธฐ๋ณธ ์˜ˆ์ œ

ย 

MQTT ํ”„๋กœํ† ์ฝœ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” MQTT ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” Broker ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ MQTT Broker ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ Mosquitto ๋ฅผ PC ๋˜๋Š” ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์— ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ์„ค์น˜ํ•˜์„ธ์š”.

MQTT ๋ธŒ๋กœ์ปค๊ฐ€ ์„ค์น˜๋˜๊ณ  ๋™์ž‘ํ•˜๋Š” ์ƒํƒœ๋ผ๋ฉด ์—ฌ๊ธฐ์— ESP8266 ์„ client ๋กœ ๋ถ™์—ฌ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

ESP8266 ๋ชจ๋“ˆ์— MQTT ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” PubSubClient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•˜๊ณ  ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • Arduino IDE ์‹คํ–‰ (ESP8266 ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋œ v1.6.5 ์ด์ƒ)
  • ๋ฉ”๋‰ด โ€“> sketchย โ€“>ย include libraryย โ€“>ย Manage Libraries
  • PubSubClient ๊ฒ€์ƒ‰
  • ํด๋ฆญ ํ›„ ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜

๊ทธ๋ฆผ1

์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๊ฐ€ ๋˜๋ฉด ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ•˜๋“œ์›จ์–ด ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํŽธ์˜์ƒ ESP8266 โ€“ NodeMCU v1.0 ๋ณด๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. USB ์—ฐ๊ฒฐ๋งŒํ•˜๋ฉด PC์—์„œ ๋ฐ”๋กœ ์†Œ์Šค์ฝ”๋“œ ์—…๋กœ๋“œ ๋ฐ ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ „์†ก/์ˆ˜์‹ ํ•œ MQTT ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก OLED ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. OLED ๊ฐ€ ์—†๋‹ค๋ฉด ์ƒ๋žตํ•˜๊ณ  NodeMCU ๋ณด๋“œ๋งŒ ์‚ฌ์šฉํ•ด๋„ ํ…Œ์ŠคํŠธ ํ•˜๋Š”๋ฐ๋Š” ์ง€์žฅ ์—†์Šต๋‹ˆ๋‹ค.

NodeMCU ๋ณด๋“œ์™€ OLED ๋””์Šคํ”Œ๋ ˆ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • NodeMCU โ€“> OLED
  • VCC โ€“>ย 3V
  • GND โ€“>ย G (GND)
  • SDA โ€“> D2 (GPIO4)
  • SCL โ€“> D1 (GPIO5)

esp8266_oled_bb_small

์†Œ์Šค ์ฝ”๋“œ(์Šค์ผ€์น˜)

์ด ์˜ˆ์ œ๋Š” ESP8266 ๋ถ€ํŒ… ํ›„ AP(๊ณต์œ ๊ธฐ)์— ์ ‘์†ํ•˜๋ฉด MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐ๋˜๋ฉด ํŠน์ • ํ† ํ”ฝ์— ์ฃผ๊ธฐ์ ์œผ๋กœ MQTT ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ํ”ฝ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ด์„œ OLED์— ๋ณด์—ฌ์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์„ธ์š”.

์˜ˆ์ œ ์†Œ์Šค๋Š” AP(๊ณต์œ ๊ธฐ) ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ, MQTT ์„ค์ • ํ•ญ๋ชฉ๋“ค์ด ์ž„์˜๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์€ ์ง์ ‘ ์ž์‹ ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//----- WiFi settings
const char *ssid = "your_ap_id";
const char *password = "your_ap_password";
const char* mqtt_server = "mqtt_url";
const char* mqtt_topic = "topic";
char* mqtt_message = "Hello world #%ld";

๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€์—์„œ #%ld ๋ถ€๋ถ„์€ ์ˆ˜์ •ํ•˜์ง€ ๋ง๊ณ  ๋‚จ๊ฒจ๋‘์„ธ์š”.

์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ 5๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

void setup() {}
void loop() {}
void callback(char* topic, byte* payload, unsigned int length) {}
void reconnect() {}
void drawText(int line, String message) {}

  • setup() ํ•จ์ˆ˜๋Š” ์‹œ๋ฆฌ์–ผ ํ†ต์‹ , OLED ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•˜๊ณ  AP ์ ‘์†๊ณผ MQTT ํ†ต์‹ ์„ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.
  • loop() ํ•จ์ˆ˜๋Š” MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ ‘์†์ด ๋Š์–ด์ง€๋ฉด ์žฌ์ ‘์† ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐ๋˜์—ˆ์„ ๋•Œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • callback() ํ•จ์ˆ˜๋Š” MQTT ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ OLED์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • reconnect() ํ•จ์ˆ˜๋Š” MQTT ๋ธŒ๋กœ์ปค์— ์—ฐ๊ฒฐํ•˜๊ณ  ํŠน์ • ํ† ํ”ฝ subscribe(๊ตฌ๋…) ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. loop() ํ•จ์ˆ˜์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • drawText() ํ•จ์ˆ˜๋Š” OLED์— ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ ๊ธธ์ง€ ์•Š์€ ์†Œ์Šค ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฒœ์ฒœํžˆ ๋ถ„์„ํ•ด ๋ณด์‹œ๋ฉด ์ดํ›„ ๊ฐ„๋‹จํ•œ MQTT ๊ธฐ๋Šฅ๋“ค์€ ์‰ฝ๊ฒŒ ๋งŒ๋“œ์‹ค ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค.

ย 

ํ…Œ์ŠคํŠธ

[๋ฉ”๋‰ด โ€“ ๋„๊ตฌ โ€“ ๋ณด๋“œ] ์—์„œ NodeMCU v1.0 ๋ณด๋“œ๋ฅผ ์„ ํƒํ•œ ๋’ค, ํฌํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ์—…๋กœ๋“œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ์•„๋ž˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • AP ์ ‘์†
  • MQTT ์„œ๋ฒ„ ์ ‘์†
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ง€์ •ํ•œ ํ† ํ”ฝ subscribe(๊ตฌ๋…)
  • ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง€์ •ํ•œ ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€ ์ „์†ก
  • ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ๊ฒฝ์šฐ OLED์— ํ‘œ์‹œ

20160502_153030

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

์—ฌ๊ธฐ์„œ๋Š” ์•„๋‘์ด๋…ธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ์ด์šฉํ•ด์„œ ESP8266 โ€“ MQTT ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ESP8266 โ€“ Sming framework ์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์— ์‚ฌ์šฉ๋œ PubSubClient ์˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ์•„๋ž˜ ๋งํฌ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

โ†ง

MMA7361 3์ถ• ๊ฐ€์†๋„ ์„ผ์„œ (์•„๋‚ ๋กœ๊ทธ ์ถœ๋ ฅ)

$
0
0

ย 

MMA7361L ์€ freescale ์—์„œ ์ œ์ž‘ํ•œ ์•„๋‚ ๋กœ๊ทธ 3์ถ• ๊ฐ€์†๋„ ์„ผ์„œ ์ž…๋‹ˆ๋‹ค. ์ €์ „๋ ฅ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ signal conditioning, 1-pole low pass filter, ์˜จ๋„ ๋ณด์ƒ, self test, 0G(์ž์œ ๋‚™ํ•˜) ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. G-Select ํ•€์œผ๋กœ 2๊ฐœ์˜ ๊ฐ๋„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ 0G offset ๊ณผ ๊ฐ๋„๋Š” ๊ณต์žฅ ์ดˆ๊ธฐํ™” ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. MMA7361L ๋ชจ๋“ˆ์€ ๋ฐฐํ„ฐ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Sleep Mode ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ย 

Features

  • Low Voltage Operation: 2.2 V โ€“ 3.6 V
  • High Sensitivity (800 mV/g @ 1.5g)
  • Selectable Sensitivity (ยฑ1.5g, ยฑ6g)
  • Fast Turn On Time (0.5 ms Enable Response Time)
  • Self Test for Freefall Detect Diagnosis
  • 0g-Detect for Freefall Protection
  • Signal Conditioning with Low Pass Filter
  • Robust Design, High Shocks Survivability
  • RoHS Compliant
  • Environmentally Preferred Product
  • Low Cost

ย 

Document

ย 

์‚ฌ์šฉ๋ฐฉ๋ฒ•

MMA7361 ๋ชจ๋“ˆ์€ ๊ฐ€์†๋„ ์„ผ์„œ์˜ 3์ถ• ์ธก์ •๊ฐ’์„ ์•„๋‚ ๋กœ๊ทธ ์ถœ๋ ฅ์œผ๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋‘์ด๋…ธ์˜ ์•„๋‚ ๋กœ๊ทธ ์ž…๋ ฅ ํ•€(A0~A5)์„ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ์ธก์ •๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
Mma7361 2.jpg

Mma7361 pin.jpg

ย 

Example code

์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋งํฌ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#include <AcceleroMMA7361.h>
AcceleroMMA7361 accelero;
int x;
int y;
int z;

void setup()
{
  Serial.begin(9600);
  accelero.begin(13, 12, 11, 10, A0, A1, A2);
  accelero.setARefVoltage(5); //sets the AREF voltage to 3.3V
  accelero.setSensitivity(LOW); //sets the sensitivity to +/-6G
  accelero.calibrate();
}

void loop()
{
  x = accelero.getXAccel();
  y = accelero.getYAccel();
  z = accelero.getZAccel();
  Serial.print("\nx: ");
  Serial.print(x);
  Serial.print(" \ty: ");
  Serial.print(y);
  Serial.print(" \tz: ");
  Serial.print(z);
  Serial.print("\tG*10^-2");
  delay(500); //make it readable
}

ย 

ํ…Œ์ŠคํŠธ

ย 

MMA7361 ๋ชจ๋“ˆ์„ ํ‰ํ‰ํ•œ ๊ณณ์— ๋†“๊ณ  ์•„๋‘์ด๋…ธ์— ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์—ด๋ฉด MMA7361 ๋ชจ๋“ˆ์€ ๋ณด์ •์ž‘์—…์„ ํ•œ ๋’ค x, y, z ์ถ•์˜ ์ธก์ • ๊ฐ’์„ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์•„๋‚ ๋กœ๊ทธ ํ•€์—์„œ ์ด ๊ฐ’์„ ๋ฐ›์•„ ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ํ‰ํ‰ํ•œ ๊ณณ์— ๋ชจ๋“ˆ์„ ๋†“์•˜์„ ๋•Œ Z์ถ• ์ค‘๋ ฅ๊ฐ€์†๋„๊ฐ€ ์•ฝ 100(1 G)์ธ ๊ฒฝ์šฐ์˜ ์ถœ๋ ฅ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ชจ๋“ˆ์„ ํ‰ํ‰ํ•œ ๊ณณ์— ๋‘๊ณ  ๋ณด์ • ์ž‘์—…์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MMA7361 COM.jpg

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

โ†ง

ํ•˜๋“œ์นดํ”ผ์›”๋“œ ์†Œ๊ฐœ

$
0
0

ย 

ํ•˜๋“œ์นดํ”ผ์›”๋“œ๋Š” ๋ฉ”์ด์ปค๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์ž๋ฃŒ์™€ ๋งค๋‰ด์–ผ, ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ƒํ™œ์†์—์„œ ๋ฒˆ๋œฉ์ด๋Š” ์•„์ด๋””์–ด๋“ค์„ ๊ณต์œ ํ•˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ•˜๋“œ์นดํ”ผ์›”๋“œ์—์„œ ์ž์ฒด ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์˜คํ”ˆ์†Œ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด์„ผ์Šค(GPL, Apache) ๋ผ์ด์„ผ์Šค๋‚ด์—์„œ ์†Œ์Šค์ด์šฉ์— ์ œ์•ฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ™ˆํŽ˜์ด์ง€์— ๊ฒŒ์‹œ๋œ ๊ธ€์„ ํผ๊ฐ€์…”๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ €์ž‘์ž ํ‘œ์‹œ(์›๋ณธ ์ถœ์ฒ˜)๋ฅผ ํ•ด์ฃผ์‹œ๊ณ , ๋น„์ƒ์—…์  ๋ชฉ์ ์œผ๋กœ ํ™œ์šฉ, ๊ฐ™์€ ๋ผ์ด์„ ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ์กฐ๊ฑด ๋‚ด์— ๋ณ€๊ฒฝ, ๊ฒŒ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

# ํ•˜๋“œ์นดํ”ผ์›”๋“œ ํ”„๋กœ์ ํŠธ

  • ํ•˜๋“œ์นดํ”ผ์›”๋“œ ํ”„๋กœ์ ํŠธ ๊ฒŒ์‹œํŒ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๋‡ŒํŒŒ๋กœ ์ œ์–ดํ•˜๋Š” RC ์นด ํ”„๋กœ์ ํŠธ
  • ์•„๋‘์ด๋…ธ ์›จ์–ด๋Ÿฌ๋ธ” DIY ํ”„๋กœ์ ํŠธ (์Šค๋งˆํŠธ ์›Œ์น˜, ์Šค๋งˆํŠธ ๋ฐด๋“œ)
  • ์™€๋‘์ด๋…ธ(WArduino) : ์•„๋‘์ด๋…ธ๋ฅผ ์ด์šฉํ•œ ์›จ์–ด๋Ÿฌ๋ธ”์šฉ ์˜คํ”ˆ ํ•˜๋“œ์›จ์–ด ์ œ์ž‘
  • ๋ชจ๋ชจํ† (MoMoTo) : ๋ธ”๋ฃจํˆฌ์Šค๋ฅผ ์ด์šฉํ•œ ์•„ํŠธํ† ์ด ํ”„๋กœ์ ํŠธ
  • ๊ฒŒ์ž„ ๋ฉ”์ด์ปค : ์•„๋‘์ด๋…ธ DIY ๊ฒŒ์ž„๊ธฐ ์ œ์ž‘ ํ”„๋กœ์ ํŠธ
  • ํ™ˆ์ฑ— : ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ํ™ˆ ์˜คํ† ๋ฉ”์ด์…˜
  • 1ํšŒ์šฉ ์ปต์„ ์žฌํ™œ์šฉํ•œ ์Šค๋งˆํŠธ ํ™”๋ถ„
  • ์Œ์„ฑ์ธ์‹ ํ™ˆ ์ปจํŠธ๋กค๋Ÿฌ
  • ์•„๋‘์ด๋…ธ ์ดˆ๊ธ‰ ๊ฐ•์ขŒ, ์ค‘๊ธ‰ ๊ฐ•์ขŒ, IoT ๊ฐ•์ขŒ
  • ์™ธ ๋‹ค์ˆ˜

ย 

# ํ•˜๋“œ์นดํ”ผ์›”๋“œ ์ธํ„ฐ๋ทฐ ๋ชจ์Œ

ย 

# ๊ด€๋ จ ๊ธฐ์‚ฌ

ย 

# ์ „์‹œํšŒ, ํŽ˜์–ด, ํ•ด์ปคํ†ค

ย 

# ๊ฐ•์—ฐ

  • ์›จ์–ด๋Ÿฌ๋ธ” X ํŽ˜์Šคํ‹ฐ๋ฒŒ : ์•„๋‘์ด๋…ธ ์Šค๋งˆํŠธ ์›Œ์น˜ ๊ฐœ๋ฐœ ์‚ฌ๋ก€
  • 2014 Maker Faire : ์˜คํ”ˆ์†Œ์Šค ์•„๋‘์ด๋…ธ ์›จ์–ด๋Ÿฌ๋ธ” ๊ฐ•์—ฐ
  • ์ž„๋ฒ ๋””๋“œSW&์›จ์–ด๋Ÿฌ๋ธ” ์Šค๋งˆํŠธ ๋””๋ฐ”์ด์Šค ์ปจํผ๋Ÿฐ์Šค :ย ์•„๋‘์ด๋…ธ๋ฅผ ํ™œ์šฉํ•œ ์›จ์–ด๋Ÿฌ๋ธ” ์Šค๋งˆํŠธ์™€์น˜ ๊ฐœ๋ฐœ ์‚ฌ๋ก€
  • 2015 ์ œ3ํšŒ Letโ€™s MAKE ํฌ๋Ÿผ :ย (๋ฉ”์ด์ปค ์šด๋™์ด ๋ฏธ์น˜๋Š” ์‚ฐ์—…์˜ ๋ณ€ํ™”) โ€˜๋””์ง€ํ„ธ ์ œ์ž‘๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•œ ์ฐฝ์—…โ€™
  • 2015 ๋ฒค์ฒ˜๊ธฐ์—…ํ˜‘ํšŒ Yes challenge ๋ฉ”์ด์ปคํ†ค : Maker talk show ๊ฐ•์—ฐ
  • 2016.03 KAIST ์ดˆ์ฒญ ๊ฐ•์—ฐ

ย 

# ์ €์„œ

ย 

# ์˜คํ”„๋ผ์ธย ๊ฐ•์ขŒ

ย 

# ์˜คํ”ˆย ํ•˜๋“œ์›จ์–ด ์ œ์ž‘

ย 

โ†ง

์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ• (Shift Register, 74HC595, 74HC165)

$
0
0

ย 

LED ํ•˜๋‚˜๋ฅผ ์ผœ๊ธฐ ์œ„ํ•ด์„œ ์•„๋‘์ด๋…ธ ๋””์ง€ํ„ธ ํ•€ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ LED๊ฐ€ 8๊ฐœ ๋ผ๋ฉด? ๋””์ง€ํ„ธ ํ•€ 8๊ฐœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 16๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์ด ๋œ๋‹ค๋ฉด? ์ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋””์ง€ํ„ธ ์ถœ๋ ฅ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ โ€œ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ(shift register)โ€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœย Serial to Parallel Converter ๋กœ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์‹œ๋ฆฌ์–ผ(์ง๋ ฌ)๋กœ ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ๋Ÿฌ๋Ÿด(๋ณ‘๋ ฌ)๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค๋Š” ์–˜๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ์ด๋ฏธ์ง€๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BasicShiftRegister

์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ์—๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ํด๋Ÿญ(clock) ์‹ ํ˜ธ์™€ ํ•จ๊ป˜ 8๊ฐœ์˜ ํ•€ ์ถœ๋ ฅ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์‹œ๋ฆฌ์–ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ ฌ๋กœ ๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ•€๋งŒ on ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด [1000 0000] ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๋˜๊ฒ ์ฃ . ๊ทธ๋Ÿฌ๋ฉด ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” 8๊ฐœ์˜ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•„ 8๊ฐœ์˜ ํ•€์„ ์‹ ํ˜ธ์— ๋งž๊ฒŒ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฆผ์ฒ˜๋Ÿผ 2 ๊ฐœ์˜ ํ•€์œผ๋กœ 8๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ํ•€์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์‹ค์ œ๋กœ๋Š” ์ œ์–ด์„  3๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

LED ์ถœ๋ ฅ ๋ฟ ์•„๋‹ˆ๋ผ ์ˆ˜์‹ญ๊ฐœ์˜ ๋ฒ„ํŠผ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ๋„ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ๋Š” ๋™์ž‘์ด ๋ฐ˜๋Œ€๋กœ ๋˜๊ฒ ์ฃ . ๊ทธ๋ž˜์„œ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋‘ ๊ฐœ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. SIPO(Serial In Parallel Out) ๋ฐฉ์‹๊ณผ PISO(Parallel In Serial Out) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ „์ž๋Š”ย LED 8 ๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ์ถœ๋ ฅ์„ ํ•œ ๋ฒˆ์— ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ ย 74HC595 ์นฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

74hc595n-dscn3898

ํ›„์ž๋Š” ๋ฒ„ํŠผ 8 ๊ฐœ ์ด์ƒ์˜ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ ย 74HC165 ์นฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

74HC165-IMG_0690

ย 

๋จผ์ € 74HC595 ์นฉ์„ ์ด์šฉํ•ด์„œ LED 8๊ฐœ๋ฅผ ์ œ์–ดํ•˜๋Š” ์˜ˆ์ œ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ย 

ย 

SIPO โ€“ย 74HC595 ํ•€ ๊ตฌ์กฐ ๋ฐ ๋™์ž‘

ย 

๋จผ์ € 74HC595N ์นฉ์ด ๊ฐ€์ง„ 16๊ฐœ์˜ ํ•€์ด ์–ด๋–ค ํ•€์ธ์ง€๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

74HC595-pinout

  • 1~7, 15 (Q0~Q7)
    ์ถœ๋ ฅ์„ ์ œ์–ดํ•˜๊ณ  ์‹ถ์€ 8๊ฐœ์˜ ํ•€์ž…๋‹ˆ๋‹ค. LED ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Q0~Q7๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 14 (DS, Data pin)
    ํด๋Ÿญ ์‹ ํ˜ธ์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ํ•€์ž…๋‹ˆ๋‹ค.
  • 13 (OE, Output Enable)
    ์ถœ๋ ฅ ํ•€ ์ „์ฒด๋ฅผ ํ•œ๋ฒˆ์— on/off ์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•€์„ PWM ํ•€์— ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  PWM ์‹ ํ˜ธ๋ฅผ ์ฃผ๋ฉด LED ๋ฐ๊ธฐ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•€์€ active low ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์‚ฌ์šฉ์น˜ ์•Š์„ ๋•Œ๋Š” ์•„๋‘์ด๋…ธ GND ํ•€์— ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • 12 (STcp, Storage(Latch) Register Clock pin)
    ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ž˜์น˜ ๋ ˆ์ง€์Šคํ„ฐ(Latch register, ํ•€ ์ œ์–ด๊ฐ’ ์ €์žฅ๊ณต๊ฐ„)์— ์ €์žฅํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์‹ ํ˜ธ์„ 
  • 11 (SHcp, Shift Register Clock pin)
    ์•„๋‘์ด๋…ธ์™€ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ฐ•์ž์— ๋งž์ถฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋Ÿญ ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ํ•€์ž…๋‹ˆ๋‹ค.
  • 10 (MR, Master Re-clear)
    ๋ฆฌ์…‹ํ•€, Active low ์ด๋ฏ€๋กœ ๋ฐ˜๋Œ€๋กœ 5V์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ย 

11(SHcp) ํ•€์— ์˜ํ•ด ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ด ์‹ ํ˜ธ์— ๋งž์ถฐ 14(DS) ํ•€์œผ๋กœ 8๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.ย ์ฆ‰, ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ HIGH ์ƒํƒœ์ผ ๋•Œ DS ํ•€์˜ ์‹ ํ˜ธ๋„ HIGH ๋ผ๋ฉด 1 ์ด ์ „์†ก๋œ ๊ฒƒ์ด๊ณ , ํด๋Ÿญ ์‹ ํ˜ธ๊ฐ€ HIGH ์ผ ๋•Œ DS ํ•€์˜ ์‹ ํ˜ธ๊ฐ€ LOW ๋ผ๋ฉด 0 ์ด ์ „์†ก๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ 8๊ฐœ์˜ ์‹ ํ˜ธ๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ˆ˜์‹ ํ•œ ๊ฐ’์„ Storage(Latch) register ๋ผ๋Š” ์ €์žฅ๊ณต๊ฐ„์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” Storage(Latch) register ์— ์ €์žฅ๋œ ๊ฐ’์— ๋”ฐ๋ผ 8๊ฐœ์˜ Q0~Q7 ์ถœ๋ ฅ์ด ๋ณ€ํ™”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, Storage(Latch) register ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋„ ๋ณด๋‚ด์ค˜์•ผ๋งŒ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด ๋ฐ”๋€๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— 12(STcp) โ€“ latch ํ•€์„ LOW ์ƒํƒœ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋๋‚ฌ์„ ๋•Œ HIGH ์ƒํƒœ๋กœ ๋‹ค์‹œ ๋Œ๋ ค๋‘ก๋‹ˆ๋‹ค.

learn_arduino_shift_register

ย 

ย 

์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

ย 

์กฐ๊ธˆ ๋ณต์žกํ•˜์ง€๋งŒ ์•„๋ž˜ ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์•„๋‘์ด๋…ธ 5V, GND ํ•€์„ ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์— ์—ฐ๊ฒฐํ•œ ๋‹ค์Œย 74HC595 ์นฉ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • 16 (VCC) โ€“> 5V
  • 10 (MR) โ€“> 5V
  • 8 (GND) โ€“> GND
  • 13 (OE) โ€“> GND

์ด์ œ 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ, ํด๋Ÿญ, latch ํด๋Ÿญ ํ•€์„ ์•„๋‘์ด๋…ธ์˜ ๋””์ง€ํ„ธ ํ•€ 3๊ฐœ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

  • 11 (SHcp, clock) โ€“> D12
  • 12 (STcp, latch clock) โ€“> D8
  • 14 (DS, data) โ€“> D11

์—ฌ๊ธฐ์— 8๊ฐœ์˜ ์ €ํ•ญ์„ ์ด์šฉํ•ด์„œ Q0~ Q7 ๊นŒ์ง€ LED๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ShftOutExmp1_3

(์œ„ ๊ทธ๋ฆผ์—์„œ 12(STcp) โ€“ GND ์‚ฌ์ด์˜ย 1uF ์ปคํŒจ์‹œํ„ฐ๋Š” ์ƒ๋žตํ•ด๋„ ๋ ๋“ฏ?)

ย 

ย 

์Šค์ผ€์น˜

ย 

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธโ€ฆ

/*
Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register
*/
 
int latchPin = 8;      //Pin connected to ST_CP of 74HC595
int clockPin = 12;   //Pin connected to SH_CP of 74HC595
int dataPin = 11;    //Pin connected to DS of 74HC595
 
byte leds = 0;
 
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
 
void loop() {
  leds = 0;
  updateShiftRegister();
  delay(500);
  for (int i = 0; i < 8; i++)  {
    bitSet(leds, i);
    updateShiftRegister();
    delay(500);
  }
}
 
void updateShiftRegister() {
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

1 byte ํฌ๊ธฐ์˜ ๋ณ€์ˆ˜์ธ leds ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋น„ํŠธ๋Œ€๋กœ 8๊ฐœ์˜ LED ๋ฅผ on/offย ํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์น˜์—์„œ leds ๊ฐ’์ด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋„๋ก ์‘์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.

์Šค์ผ€์น˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์•„๋ž˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

void updateShiftRegister() {
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, LSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์ „์†กํ•˜๊ธฐ ์ „์— Storage register clock pin (latch pin) ์˜ ์ƒํƒœ๋ฅผ LOW ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋๋‚˜๋ฉด ๋‹ค์‹œ HIGH๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ๋Š” ์•„๋‘์ด๋…ธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” shiftOut() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. shiftOut() ํ•จ์ˆ˜๋Š” 4๊ฐœ์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ์ˆœ์„œ๋Œ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

  • dataPin : DS ํ•€ ๋„˜๋ฒ„
  • clockPin : Clock ํ•€ ๋„˜๋ฒ„
  • LSBFIRST : LSB(Least Significant Bit) ๋น„ํŠธ๋ถ€ํ„ฐ ์ „์†ก. ์ฆ‰, 1byte ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ „์†กํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. MSBFIRSTย (Mostย Significant Bit) ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” LED on/off ๊ฐ€ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๋€Œ๊ฒ ์ฃ 
  • leds : 8๊ฐœ์˜ ๋น„ํŠธ ์ƒํƒœ๊ฐ’์„ ๋‹ด์€ 1byte ๋ฐ์ดํ„ฐ

ย 

์Šค์ผ€์น˜๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

20160524_185523

ย 

ย 

์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ ์—ฐ๊ฒฐ

ย 

2๊ฐœ ์ด์ƒ์˜ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ œ์–ด๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ์˜ ์ˆ˜๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

ShftOutExmp2_3

2 ๋ฒˆ์งธ๋กœ ์ถ”๊ฐ€ํ•œ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ ์นฉ๋„ ์ฒซ ๋ฒˆ์งธ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ ์ „์†ก๊ณผ ๊ด€๋ จ๋œ ์•„๋ž˜ 3 ํ•€์„ ๋‹ค๋ฅด๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • Shift Register 1 โ€“> Shift Register 2
  • 11 (SHcp, clock) โ€“> 11 (SHcp, clock)
  • 12 (STcp, latch clock) โ€“> 12 (STcp, latch clock)
  • 9 (Q7โ€, serialย out) โ€“> 14 (DS, data)

์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐํ•˜๋ฉด ์—ฌ์ „ํžˆ 3๊ฐœ์˜ ํ•€๋งŒ ์•„๋‘์ด๋…ธ์— ์—ฐ๊ฒฐ๋˜์ง€๋งŒ 16๊ฐœ์˜ LED๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 16๊ฐœ์˜ LED๋ฅผ ์ œ์–ดํ•  ๋•Œ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ latch pin ์„ LOW ๋กœ ๋ฐ”๊พผ ํ›„, ๋ฐ์ดํ„ฐ๋ฅผ 1byte ์”ฉ ๋‘ ๋ฒˆ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 255);
    shiftOut(dataPin, clockPin, 255);
    digitalWrite(latchPin, 1);

ย 

ย 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ย 

shiftOut() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ œ์–ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ๊ฒฝ์šฐ ํ˜น์€ 7 segment ๊ฐ™์€ ์žฅ์น˜๋ฅผ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์„ธ์š”.

ย 

ย 

ย 

PISO โ€“ 74HC165 ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ

ย 

SIPO ๋ฐฉ์‹์˜ 74HC595 ์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

ย 

โ†ง
โ†ง

MPR121 ์ •์ „์šฉ๋Ÿ‰ ๋ฐฉ์‹ ํ„ฐ์น˜ ์„ผ์„œ

$
0
0

ย 

ํ„ฐ์น˜ ์„ผ์„œ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•œ ๋ชจ๋“ˆ, MPR121 ํ„ฐ์น˜์„ผ์„œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ํ„ฐ์น˜๋ฅผ ์ด์šฉํ•œ ๊ฐ์ข… ์ธํ„ฐํŽ˜์ด์Šค ์žฅ์น˜๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

hqdefault

MPR121์€ ์ •์ „ ์šฉ๋Ÿ‰ ํ„ฐ์น˜(Capacitive Touch Sensor) ์„ผ์„œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. Capacitive(Capacitance) ๋ž€ ์˜๋ฏธ๋Š” ์ „ํ•˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฌผ์ฒด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์„ผ์„œ๊ฐ€ ์ผ์ •๋Ÿ‰์˜ ์ „ํ•˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์™ธ๋ถ€ ์ ‘์ด‰์— ์˜ํ•ด ์ด ๊ฐ’์ด ๋ฐ”๋€” ๊ฒฝ์šฐ ํ„ฐ์น˜๋ฅผ ์ธ์‹ํ•˜๋Š” ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

MPR121 ํ„ฐ์น˜์„ผ์„œ ๋ชจ๋“ˆ์€ ํ•œ ๋ชจ๋“ˆ ๋‹น ์ตœ๋Œ€ 12๊ฐœ์˜ ํ„ฐ์น˜๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์‹๋œ ๊ฒฐ๊ณผ๋Š” I2C ํ†ต์‹ ์œผ๋กœ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, IRQ ์ธํ„ฐ๋ŸฝํŠธ ํ•€์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ„ฐ์น˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ ์•Œ๋ ค์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ธํ•œ ์ŠคํŽ™์€ ์•„๋ž˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ย 

ย 

์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•

ย 

์•„๋ž˜์ฒ˜๋Ÿผ I2C์˜ ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. IRQ ํ•€์€ ํ„ฐ์น˜์˜ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ ์•Œ๋ ค์ฃผ๋Š” ์ธํ„ฐ๋ŸฝํŠธ ํ•€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ IRQ ๋ฅผ ์•„๋‘์ด๋…ธ ์šฐ๋…ธ ๊ธฐ์ค€ D2 ๋˜๋Š” D3 ์ธํ„ฐ๋ŸฝํŠธ ํ•€์— ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. loop() ๋ฐ˜๋ณตํ•จ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋Œ๋ฉด์„œ ํ„ฐ์น˜ ์ž…๋ ฅ์„ ๊ณ„์† ์ฒดํฌํ•˜๋Š” ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ ํ•€(IRQ)์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

mpr121_wiring

ย 

ย 

์Šค์ผ€์น˜

ย 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ.. ์ฝ”๋“œ๊ฐ€ ์ข€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” MPR121test.ino ํŒŒ์ผ์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค์ผ€์น˜๋ฅผ ์—ด์–ด๋ณด๋ฉด ์‚ฌ์šฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <Wire.h>
#include "Adafruit_MPR121.h"

// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();

// Keeps track of the last pins touched
// so we know when buttons are 'released'
uint16_t lasttouched = 0;
uint16_t currtouched = 0;

void setup() {
  while (!Serial);        // needed to keep leonardo/micro from starting too fast!

  Serial.begin(9600);
  Serial.println("Adafruit MPR121 Capacitive Touch sensor test"); 
  
  // Default address is 0x5A, if tied to 3.3V its 0x5B
  // If tied to SDA its 0x5C and if SCL then 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }
  Serial.println("MPR121 found!");
}

void loop() {
  // Get the currently touched pads
  currtouched = cap.touched();
  
  for (uint8_t i=0; i<12; i++) {
    // it if *is* touched and *wasnt* touched before, alert!
    if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" touched");
    }
    // if it *was* touched and now *isnt*, alert!
    if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" released");
    }
  }

  // reset our state
  lasttouched = currtouched;

  // comment out this line for detailed data from the sensor!
  return;
  
  // debugging info, what
  Serial.print("\t\t\t\t\t\t\t\t\t\t\t\t\t 0x"); Serial.println(cap.touched(), HEX);
  Serial.print("Filt: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.filteredData(i)); Serial.print("\t");
  }
  Serial.println();
  Serial.print("Base: ");
  for (uint8_t i=0; i<12; i++) {
    Serial.print(cap.baselineData(i)); Serial.print("\t");
  }
  Serial.println();
  
  // put a delay so it isn't overwhelming
  delay(100);
}

ย 

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ I2C ํ†ต์‹ ์„ ์ด์šฉํ•ด ํ˜„์žฌ ํ„ฐ์น˜ ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ๋ถ€๋ถ„์ด๊ฒ ์ฃ . ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

currtouched = cap.touched();
  
  for (uint8_t i=0; i<12; i++) {
    // it if *is* touched and *wasnt* touched before, alert!
    if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" touched");
    }
    // if it *was* touched and now *isnt*, alert!
    if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" released");
    }
  }

์—ฌ๊ธฐ์„œ currtouched, lasttouched ๋ณ€์ˆ˜๋Š” 2๋ฐ”์ดํŠธ ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. 2๋ฐ”์ดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— 16๊ฐœ์˜ ๋น„ํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๋ณ€์ˆ˜์— 12๊ฐœ์˜ ํ„ฐ์น˜ ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ 0 ๋˜๋Š” 1๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ 12๊ฐœ์˜ ํ„ฐ์น˜ ๋ชจ๋‘ ์ธ์‹๋œ ์ƒํƒœ๋ผ๋ฉด, ์„ผ์„œ์—์„œ ์ฝ์–ด์˜จ ํ˜„์žฌ ํ„ฐ์น˜๊ฐ’ currtouched ๋ณ€์ˆ˜๋Š” [0000 1111 1111 1111] ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. lasttouched ๋Š” ์ด์ „ ํ„ฐ์น˜๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜ย currtouched, lasttouched ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ„ฐ์น˜ ์ธ์‹ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง์ด ์ข€ ์–ด๋ ค์šด๋ฐโ€ฆ ๊ทธ๋ƒฅ ์œ„ ์ฝ”๋“œ๋ฅผ ์ ๋‹นํžˆ ๋ณ€ํ˜•ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ย 

ย 

์—ฌ๋Ÿฌ๊ฐœ์˜ MPR121 ๋ชจ๋“ˆ ์—ฐ๊ฒฐ

ย 

MPR121 ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ธ์‹ ๊ฐ€๋Šฅํ•œ ํ„ฐ์น˜์˜ ์ˆ˜๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ตœ๋Œ€ 4๊ฐœ ๋ชจ๋“ˆ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ) ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” MPR121 ๋ชจ๋“ˆ์˜ I2C ์ฃผ์†Œ๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.ย MPR121 ๋ชจ๋“ˆ์€ I2C default address ๊ฐ’์ด 0x5A๋กœ ์„ธํŒ…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ADD(์–ด๋“œ๋ ˆ์Šค) ํ•€์„ ย VSS, VDD, SDA, SCL ํ•€๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด I2C address ๊ฐ’์ด 0x5A, 0x5B, 0x5C, 0x5D ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ƒ์„ธํ•œ ๋‚ด์šฉ์„ datasheet์™€ ์•„๋ž˜ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•œ ๋’ค ์‹œ๋„ํ•˜์„ธ์š”.

ย 

ย 

โ†ง

๊ฒŒ์ž„ํšŒ์‚ฌ ์ง์›์ด ๊ฒŒ์ž„๊ธฐ๋ฅผ ๋งŒ๋“ค๋ฉด?

$
0
0

ย 

๊ฒŒ์ž„ํšŒ์‚ฌ(๋„ฅ์Šจ) ์ง์›๋ถ„๋“ค์ด ์•„๋‘์ด๋…ธ๋ฅผ ๊ณต๋ถ€ํ•ด์„œ ๋งŒ๋“  ๊ฒฐ๊ณผ๋ฌผ๋“ค์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋„ฅ์Šจ ์•„๋‘์ด๋…ธ ํฌ๋Ÿผ์˜ ๋งˆ์ง€๋ง‰ ๊ณผ์ œ์˜€๋˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฐ๊ณผ๋ฌผ๋“ค ์ž…๋‹ˆ๋‹ค.ย ์—…๋ฌด๋กœ ๋ฐ”์˜์‹  ์™€์ค‘์—๋„ ํ‹ˆํ‹ˆํžˆ ์‹œ๊ฐ„๋‚ด์–ด ์™„์„ฑํ•ด ์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ํ”„๋กœ์ ํŠธ๋“ค์€ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€๊นŒ์ง€ ์™„๋ฃŒํ•œ ํ”„๋กœํ† ํƒ€์ž… ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง•์„ (์ „ํ˜€;;;) ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด์ง€๋งŒ ํฌ์žฅ๋งŒ ์ž˜ ํ•˜๋ฉด ์–ด๋”” ๋‚ด๋†”๋„ ์†์ƒ‰์ด ์—†์œผ๋ฆฌ๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

ย 

ย 

๋ชฌ์Šคํ„ฐ ๋ณผ

ย 

photo_monster_ball

์•„๋‘์ด๋…ธ ๊ฐ•์ขŒ์— ์‚ฌ์šฉ๋œ ๊ฐ์ข… ๋ชจ๋“ˆ โ€“ ์˜จ์Šต๋„, ๊ฐ€์†๋„/์ž์ด๋กœ, ์˜จ์Šต๋„, GPS, ๋ธ”๋ฃจํˆฌ์Šค, ์ง„๋™๋ชจํ„ฐ ๋“ฑ์ด ์ด๋™์›๋œ, ์ง„์ •ํ•œ ๊ฐ•์ขŒ ๋ณต์Šต์šฉ ํ”„๋กœ์ ํŠธ(??) ๋ชฌ์Šคํ„ฐ ๋ณผ์ž…๋‹ˆ๋‹ค.

์•„์ง ํ”„๋กœํ† ํƒ€์ž…์ด๋ผ ํ˜•ํƒœ๋Š” ๋ณผ์ด ์•„๋‹ˆ์ง€๋งŒ;;; ์ตœ์ข… ํŒจํ‚ค์ง• ํ›„์—๋Š” ์ฃผ๋ณ€ ํ™˜๊ฒฝ(์œ„์น˜, ์˜จ์Šต๋„, ์‚ฌ์šฉ์ž ๋™์ž‘)์„ ์ธก์ •ํ•ด์„œ ์ƒํ™ฉ์— ๋งž๋Š” ๋ชฌ์Šคํ„ฐ๋ฅผ ์†Œํ™˜ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œํ™˜๋œ ๋ชฌ์Šคํ„ฐ์™€ ๊ฐ„๋‹จํ•œ (๊ฐ€์œ„๋ฐ”์œ„๋ณด) ๊ฒŒ์ž„์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณธ๊ฒฉ ์˜จ์˜คํ”„ ๋ฏน์Šค ํ”„๋กœ์ ํŠธ. ํœด๋Œ€ํฐ ์•ฑ๊ณผ ์—ฐ๋™๋˜์–ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

์ถ”์–ต์˜ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„๊ธฐ

ย 

์˜›๋‚  ๋ฌธ๋ฐฉ๊ตฌ ์•ž์˜ ํ•œ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋˜ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„๊ธฐ๋ฅผ ์•„๋‘์ด๋…ธ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. โ€œ์‘๋‹ตํ•˜๋ผ 19xxโ€ ์Šคํƒ€์ผ์˜ ๋ณธ๊ฒฉ ํ‚ฌ๋งํƒ€์ž„์šฉ ๊ฒŒ์ž„๊ธฐ DIY ํ”„๋กœ์ ํŠธ. ์•„์ง 8ร—8 LED ๋งคํŠธ๋ฆญ์Šค๊ฐ€ ํ•˜๋‚˜ ๋„์ฐฉ์„ ์•ˆํ•ด์„œ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ์‚ฌ์ง„์€ ๋ชป์ฐ์—ˆ๋„ค์š”;;

photo_rsp

ย 

ย 

ํ•‘์ฟ ํ•‘์ฟ 

ย 

๋‹จ์ˆœํ•˜์ง€๋งŒ ๊ฝค๋‚˜ ์–ด๋ ต๊ณ  ์ค‘๋…์„ฑ ์žˆ๋Š” ๊ฒŒ์ž„๊ธฐ.ย ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•‘ํฌ์ƒ‰ LED ๊ณต์„ ์•ž์œผ๋กœ ๋ฐ€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์ด ๋์— ๋‹ฟ์ง€ ์•Š๊ฒŒ ํƒ€์ด๋ฐ ๋งž์ถฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ทธ ์ž๋ฆฌ์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ํ•‘ํฌ์ƒ‰ ๊ณต์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์Œ“๋Š” ๊ฒŒ์ž„. ํ•‘ํฌ์ƒ‰์„ ์ข‹์•„ํ•˜๋Š” ์ œ์ž‘์ž์˜ ๋”ฐ๋‹˜๊ป˜ ํ—Œ์ •ํ•˜๋Š” ๊ฒŒ์ž„๊ธฐ๋ผ โ€œํ•‘์ฟ ํ•‘์ฟ โ€๋ผ๊ณ โ€ฆ

photo_pinkupinku

ย 

ย 

์Šค๋งˆํŠธ ๋ฏธ๋Ÿฌ + ํƒ€์ด๋จธ

ย 

์‹ค์ƒํ™œ์— ์œ ์šฉํ•œ ์žฅ์น˜ ํ•˜๋‚˜. ์š”์ฆ˜ ํ•ซํ•œ DIY ์ฃผ์ œ ์ค‘ ํ•˜๋‚˜์ธ ์Šค๋งˆํŠธ ๋ฏธ๋Ÿฌ์™€ ํƒ€์ด๋จธ. ํ‰์†Œ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ๊ฐ„๋‹จํ•œ ๋ฒ„ํŠผ ์กฐ์ž‘์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์–‘์น˜ํ•  ๋•Œ ์ข‹์„ ๋“ฏ. 3๋ถ„์ด ์–ผ๋งŒํผ์ธ์ง€ ๋Œ€์ฒด ๊ฐ์ด ์•ˆ์™€์„œโ€ฆ ๋””์Šคํ”Œ๋ ˆ์ด๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋ฐ์€๊ฑธ ์‚ฌ์šฉํ•ด์•ผ ์ž˜๋ณด์ด๋”๊ตฐ์š”. ๊ทธ๋ž˜์„œ ๋””์Šคํ”Œ๋ ˆ์ด ๋ถ€๋ถ„์€ ๊ต์ฒด ์˜ˆ์ •.

photo_smart_mirror

ย 

ย 

๋šœ๋ฃจ๋šœ ๋ฃฐ๋ ›

ย 

์›ํ˜• RGB LED Strip์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“  ๋””์ง€ํ„ธ ๋ฃฐ๋ › ๊ฒŒ์ž„๊ธฐ ์ž…๋‹ˆ๋‹ค. ์•„๋‚ ๋กœ๊ทธ ๋ฃฐ๋ ›์˜ ์‚ฌ์šด๋“œ์— ๋งž์ถฐ ๋™์ž‘ํ•˜๋Š” LED์™€ ํฅ์„ ๋‹์šฐ๋Š” ๋ฐฐ๊ฒฝ์Œ์•…์ด ์••๊ถŒ. ์™œ ๋šœ๋ฃจ๋šœ ๋ฃฐ๋ ›์ธ์ง€๋Š” ์˜์ƒ์„ ๋ณด์‹œ๋ฉด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

photo_roulette

ย 

ย 

์†Œ๋งฅ ์ œ์กฐ๊ธฐ

ย 

์ตœ์ ์˜ ์†Œ๋งฅ ๋น„์œจ์— ๋งž์ถฐ ์ œ์กฐํ•ด์ฃผ๋Š” ์†Œ๋งฅ ์ œ์กฐ๊ธฐ. ํญํƒ„์ฃผ. ์ด์ œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฆ๊ธฐ์„ธ์š”?? ๋ณธ๊ฒฉ ์„ฑ์ธ์ธ์ฆ ํ•„์ˆ˜ย 19๊ธˆ DIY. (์ œ์กฐ ํ›„ ํšŒ์˜ค๋ฆฌ ๊ธฐ๋Šฅ์ด ์ ˆ์‹คํ•ฉ๋‹ˆ๋‹ค??)

photo_cocktail

ย 

.

๋ฐ”์œ ์—…๋ฌด ์™€์ค‘์—๋„ ์‹œ๊ฐ„๋‚ด์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•ด์ฃผ์‹  ์ง์›๋ถ„๋“ค๊ป˜ ์ด ์ž๋ฆฌ๋ฅผ ๋นŒ์–ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ย 

โ†ง

VR ๊ฒŒ์ž„, ๊ทธ๊นŒ์ง“๊ฑฐ DIY

$
0
0

ย 

์š”์ฆ˜ VR ํ•ซํ•˜์ฃ . ์˜คํ˜๋Ÿฌ์Šค, ๊ธฐ์–ด VR, ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ VR ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ์ข… ์ปจํ…์ธ ๊นŒ์ง€โ€ฆ VR์˜ ์ „์„ฑ์‹œ๋Œ€๊ฐ€ ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฉ€๋ฏธ๋‚˜ VR ๊ธฐ๊ธฐ์˜ ๊ฑฐ์ถ”์žฅ์Šค๋Ÿฌ์›€์ด ๋ถ€๋‹ด์Šค๋Ÿฝ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์ ์–ด๋„ VR์ด ์‚ฌ๋žŒ๋“ค์˜ ์ด๋ชฉ์„ ์ง‘์ค‘์‹œํ‚ค๋Š”๋ฐ๋Š” ์„ฑ๊ณตํ•œ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ VR์„ ์‹ค์ œ ์ฒดํ—˜ํ•ด๋ณด๋ฉด ์•„์ง๋„ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ข€ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ์‹œ์„ ์˜ ๋ฐฉํ–ฅ์„ ์ธ์‹ํ•˜๊ณ  NFC ๋˜๋Š” ๋งˆ๊ทธ๋„คํ‹ฑ์„ ๋ฒ„ํŠผ์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜๋Š”๋ฐ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ปจํ…์ธ ๋‚ด์—์„œ ๋‹ค์–‘ํ•œ ์•ก์…˜์„ ํ•˜๊ธฐ์—” ์ข€ ๋ชจ์ž๋ž๋‹ˆ๋‹ค.ย ๊ทธ๋ž˜์„œ ๋ณ„๋„์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํŒ”๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ฐ€๊ฒฉ๋„ ์žˆ๊ณ , ์ปจํ…์ธ ์— ๋”ฐ๋ผ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง€์›ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด์ฐธ์— (์‹œ๋ฅ˜์—๋„ ํŽธ์Šนํ•  ๊ฒธ) VR ๊ฒŒ์ž„์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒŒ์ž„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ์ปจํŠธ๋กค๋Ÿฌ๋„ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด ๊ฒŒ์ž„๊ณผ ์—ฐ๋™๋˜๋„๋ก ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ œ๋ชฉ์€ โ€œVR Defense Game โ€“ destroyer in the darkโ€ ์ž…๋‹ˆ๋‹ค.ย ์ด ๊ฒŒ์ž„์€ ์šฐ์ฃผ ๊ณต๊ฐ„์„ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ชจํ•จ์„ ๊ณต๊ฒฉํ•ด์˜ค๋Š” ์  ์šฐ์ฃผ์„ ์„ ์ตœ๋Œ€ํ•œ ๊ฒฉ์ถ”์‹œํ‚ค๋Š” ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

ย 

์ด ๊ฒŒ์ž„์€ ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ VR์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ์ฒœ์›์ด๋ฉด ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ VR ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ๋งคํ•ด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์„ ์ด์šฉํ•ด ์ฒดํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์•„๋‘์ด๋…ธ์™€ ๋ฒ„ํŠผ, ๋ธ”๋ฃจํˆฌ์Šค ๋ชจ๋“ˆ(HC-06)์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํžˆ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย ๊ฒŒ์ž„ ์ œ์ž‘์— ์‚ฌ์šฉ๋œ ์†Œ์Šค๋Š” ๋ชจ๋‘ GitHub์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ VR ์ปจํ…์ธ ๋ฅผ ์ œ์ž‘ํ•ด๋ณด๊ณ  ์‹ถ์œผ์‹  ๋ถ„, ๋ธ”๋ฃจํˆฌ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด VR์˜ ์‚ฌ์šฉ์ž ์ฒดํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์œผ์‹  ๋ถ„์€ ์ฐธ๊ณ ํ• ๋งŒ ํ• ๊ฒ๋‹ˆ๋‹ค.

ย 

ย 

๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ VR

ย 

๊ฐœ์ธ์ ์œผ๋กœ VR ์—…๊ณ„์˜ ๊ฐ€์žฅ ํฐ ํ˜์‹ ์€ ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ VR์ด๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. 3์ฒœ์›~5์ฒœ์› ์ •๋„๋ฉด ํ’€ ํŒจํ‚ค์ง€ ๊ตฌ๋งคํ•ด์„œ ์ง์ ‘ ์กฐ๋ฆฝ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณธ์ธ์ด ๊ฐ€์ง„ ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์„ ์ด์šฉํ•ด์„œ VR์„ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”. ๊ณจํŒ์ง€์˜ ์—‰์„ฑํ•จ๋„ ๋‚˜๋ฆ„ ๋งค๋ ฅ์ด๋ผ๋ฉด ๋งค๋ ฅ์ž…๋‹ˆ๋‹ค(?)

google_cardboard

๊ทธ๋ž˜์„œ ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ๋…€์„ ์ „์šฉ์œผ๋กœ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์€ ์ด๋ฅผ ์œ„ํ•ด Google VR SDK for Android ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.ย Google VR SDK ์—์„œ๋Š” ๋ Œ์ฆˆ ์™œ๊ณก ๋ณด์ •, 3D ์˜ค๋””์˜ค, ํ—ค๋“œ ํŠธ๋ž™ํ‚น, ์–‘์•ˆ ๋ Œ๋”๋ง, ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ๋“ฑ๋“ฑ VR์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ž‘์—…๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒย Google VR SDK ์—์„œ๋Š” VR์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ž‘์—…๋“ค์„ ํ•ด์ค„ ๋ฟ, ์‹ค์ œ 3D ๋ชจ๋ธ์„ ๊ฒŒ์ž„๋‚ด์— ๊ตฌ์„ฑํ•˜๊ณ  ์›€์ง์ด๋Š” ์ž‘์—…์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ž„๋ฒ ๋””๋“œ ์žฅ์น˜์šฉ 3D ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ OpenGL ES๋ฅผ ์ƒ๋‹น ์ˆ˜์ค€์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” 3D ์ปจํ…์ธ  ์ œ์ž‘ ํ”Œ๋žซํผ์ธย Unity๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.ย Google VR SDK for Unity ๋„ ๊ตฌ๊ธ€์—์„œ ๋ฐฐํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋„ ์–ด๋ ต๊ธฐ๋Š” ๋งค ํ•œ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. ๊ดœํžˆ ์‚ฌ๋žŒ๋“ค์ด OpenGL ๊ณผ Unity ๋กœ ๋ฐฅ๋ฒŒ์–ด ๋จน๊ณ  ์‚ฌ๋Š”๊ฒŒ ์•„๋‹™๋‹ˆ๋‹คโ€ฆ

ย 

ย 

Rajawali 3D engine

ย 

์ƒ์—…์šฉ ์ปจํ…์ธ ๋ฅผ ์ œ์ž‘ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ตณ์ด OpenGL์ด๋‚˜ Unity๋ฅผ ๋ฐฐ์šธ ํ•„์š”๊นŒ์ง€๋Š” ์—†๋‹ค ์‹ถ์–ด์„œ ์„ ํƒํ•œ ๊ฒƒ์ด Rajawali 3D engine ์ž…๋‹ˆ๋‹ค. OpenGL ES ๋ฅผ ๋” ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“  3D ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. Rajawali๋ฅผย ์ด์šฉํ•˜๋ฉด ๊ณจ์น˜์•„ํ”ˆ 3D ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

687474703a2f2f7777772e726f7a656e6761696e2e636f6d2f66696c65732f72616a6177616c692d6c6f676f2e6a7067

๋ญ, Rajawali ๋ผ๊ณ ํ•ด์„œ ๊ทธ๋ฆฌ ์‰ฌ์šด๊ฑด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋А์ •๋„ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ฒฝํ—˜์ด ์žˆ์–ด์•ผ ์จ๋ณผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ Scene, Camera ๋ฐ 3D object, Texture ๋“ค์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ณ  ๊ฐ์ข… ์• ๋‹ˆ๋งค์ด์…˜, ์›€์ง์ž„์„ ์ปจํŠธ๋กคํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ฐฐ๋ คํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์— 3D ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ์šฉ์œผ๋กœ ์ ์ ˆํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

GitHub๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ๋˜๋Š” Rajawali ์†Œ์Šค์—๋Š” ๋‹ค์–‘ํ•œ ์˜ˆ์ œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ด์ค‘์—๋Š” VR ์˜ˆ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์— ๋งŒ๋“  ๊ฒŒ์ž„๋„ VR ์˜ˆ์ œ๋ฅผ ์ž…๋ง›์— ๋งž๊ฒŒ ๋Œ€ํญ ์ˆ˜์ •ํ•ด์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ ์ œ์ž‘

ย 

์š”์ฆ˜์€ ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋„ ํœด๋Œ€ํฐ์„ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ VR ๊ธฐ๊ธฐ๊ฐ€ ํŒ๋งค๋˜๋ฏ€๋กœ ์ ๋‹นํ•œ ๊ฒƒ์„ ์„ ํƒํ•ด์„œ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ „ ๊ตฌ๊ธ€ ์นด๋“œ๋ณด๋“œ 2.0 ์œผ๋กœ ํŒ๋งค๋˜๋Š” ์•ฝ 4์ฒœ์› ์ •๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

cardboard_parts

๋ถ€ํ’ˆ์ด ๋Œ€์ถฉ ์œ„ ์ด๋ฏธ์ง€ ์ƒํƒœ๋กœ ์˜ค๋Š”๋ฐ ์กฐ๋ฆฝ ๋‚œ์ด๋„๋Š” ์—„์ฒญ ์‰ฌ์›€. ์ด๋งˆ์ €๋„ ๊ท€์ฐฎ์€ ๋ถ„์„ ์œ„ํ•ด ์•„์˜ˆ ์™„์„ฑ๋œ ์นด๋“œ๋ณด๋“œ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๊ณณ๋„ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ. ์ด ์ •๋„๋Š” ์ง์ ‘ ํ•˜์„ธ์š”.

ย 

ย 

VR ์ปจํŠธ๋กค๋Ÿฌ ์ œ์ž‘

ย 

๊ฒŒ์ž„ ๋‚ด์—์„œ ์  ๋น„ํ–‰์„ ์„ ๊ฒฉ์ถ”ํ•˜๊ธฐ์œ„ํ•ด ๋ฏธ์‚ฌ์ผ ๋ฐœ์‚ฌ ๋ฒ„ํŠผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ํœด๋Œ€ํฐ์„ ์ด์šฉํ•œ VR ๊ธฐ๊ธฐ๋“ค์€ ์ด๋ฅผ ์œ„ํ•ด NFC ํƒœ๊ทธ๋‚˜ ์ž์„์„ ์ด์šฉํ•ด์„œ ํœด๋Œ€ํฐ์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†์„ ํ•ญ์ƒ ํœด๋Œ€ํฐ ๊ทผ์ฒ˜์— ๋‘ฌ์•ผํ•ด์„œ ๋ถˆํŽธํ•˜๊ธฐ๋„ ํ•˜๊ณ  ๋น ๋ฅธ ์ธ์‹์ด ์ž˜ ์•ˆ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋‘์ด๋…ธ๋ฅผ ์ด์šฉํ•ด์„œ VR ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง์ ‘ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

vr_controller2

์—„์ฒญ ๋‹จ์ดํ•˜์ฃ . ์•„๋‘์ด๋…ธ Nano, ๋ฒ„ํŠผ 2๊ฐœ, ๋ธ”๋ฃจํˆฌ์Šค(HC-06)๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ ๊ฒ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ1์€ ๋ฏธ์‚ฌ์ผ ๋ฐœ์‚ฌ์šฉ, ๋ฒ„ํŠผ 2๋Š” back ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

vr_controller_bb

์•„๋‘์ด๋…ธ ==> ๋ธ”๋ฃจํˆฌ์Šค (HC-06)

  • 5V โ€“> VCC
  • GND โ€“> GND
  • D2 โ€“> TX
  • D3 โ€“> RX

์•„๋‘์ด๋…ธ ==> ๋ฒ„ํŠผ 1 (fire)

  • D6 โ€“> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 1
  • GND โ€“> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 2

์•„๋‘์ด๋…ธ ==> ๋ฒ„ํŠผ 2 (cancel)

  • D7 โ€“> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 1
  • GND โ€“> ๋ฒ„ํŠผ ๋‹ค๋ฆฌ 2

ย 

๊ตฌ์„ฑ์€ ๋‹จ์ดํ•˜์ง€๋งŒ ๋ณธ์—ฐ์˜ ์—ญํ• ์„ ์ถฉ์‹คํžˆ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. fire ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•„์Šคํ‚ค ์ฝ”๋“œ โ€˜bโ€™ ๋ฅผ ์ „์†กํ•˜๊ณ , cancel ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•„์Šคํ‚ค ์ฝ”๋“œ โ€˜cโ€™๋ฅผ ์ „์†กํ•˜๋Š”๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋‘์ด๋…ธ ์ฝ”๋“œ๋„ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ๋ฒ„ํŠผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋„๋ก 200ms ๊ฐ„๊ฒฉ์œผ๋กœ ์‹œ๊ฐ„์„ ์ฒดํฌํ•˜๋Š” ์ฝ”๋“œ๋งŒ ๋”ํ•ด์คฌ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3);  // Bluetooth's TX, RX

int firePin = 6;
int cancelPin = 7;

int lastB1 = HIGH;
int lastB2 = HIGH;

unsigned long lastSendTime = 0;
unsigned long RESEND_THRESHOLD = 200;

void setup() {
  pinMode(firePin, INPUT_PULLUP);
  pinMode(cancelPin, INPUT_PULLUP);
  BTSerial.begin(9600);
}

void loop() {
  int curB1 = digitalRead(firePin);
  int curB2 = digitalRead(cancelPin);
  
  unsigned long curTime = millis();
  if(curTime > lastSendTime + RESEND_THRESHOLD) {
    if(curB1 == LOW) {
      BTSerial.write('b');
      lastSendTime = curTime;      
    } else if(curB2 == LOW) {
      BTSerial.write('c');
      lastSendTime = curTime;      
    }
  }
  
  lastB1 = curB1;
  lastB2 = curB2;
}

๋‹จ์ˆœํ•œ ์ปจํŠธ๋กค๋Ÿฌ์ง€๋งŒ ์ด๊ฑธ ํ™•์žฅํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์„ผ์„œ๋‚˜ ๋ชจํ„ฐ, ๋ชจ๋“ˆ์„ VR๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ย 

์นด๋“œ๋ณด๋“œ ์กฐ๋ฆฝํ•˜๊ณ  ์•„๋‘์ด๋…ธ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์•ผ ์žฌ๋ฃŒ๋งŒ ์ค€๋น„๋˜๋ฉด ๊ธˆ๋ฐฉ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ VR ๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ฐจ์›์ด ๋‹ค๋ฅด๋„ค์š”;;; ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์„ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฒ„ํŠผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„๋„ ๊ฝค ์†์ด ๊ฐ€๊ณ โ€ฆ ์–ด์จŒ๋“  Rajawali 3D engine ์—์„œ ์ œ๊ณตํ•˜๋Š” example ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•ด์„œ ์™„์„ฑ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

banner

Rajawali 3D engine ์„ ์ด์šฉํ•ด VR ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•ด์„œ๋Š” ์•„๋ž˜ ๋งํฌ์— ์—ฐ์žฌ๊ธ€์„ ์˜ฌ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ Rajawali ์‚ฌ์šฉ๋ฒ•๊ณผ, 3D ๋ฌผ์ฒด๋“ค์˜ ์›€์ง์ž„ ์ œ์–ด๋ฐฉ๋ฒ•, ์นด๋ฉ”๋ผ ์ด๋™ ๋ฐ ์‹œ์  ์ œ์–ด๋ฐฉ๋ฒ•, ๋ธ”๋ฃจํˆฌ์Šค ํ†ต์‹ ์„ ์ด์šฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ ์—ฐ๋™ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฐ๊ฒ๋‹ˆ๋‹ค. ์–‘์ด ์ข€ ๋ผ์„œ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆด๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค๋งŒโ€ฆ

ย 

ย 

๊ฒŒ์ž„ ์ง„ํ–‰

ย 

๊ฒŒ์ž„์€ ๊ตฌ๊ธ€ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œVR Defense Gameโ€์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ic_launcher_256x256

ย 

๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฉ”์ธ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

Screenshot_2016-06-09-23-21-06

๋จผ์ € SETUP BLUETOOTH ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์•ž์„œ ์ œ์ž‘ํ•œ ๋ธ”๋ฃจํˆฌ์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ ํŽ˜์–ด๋ง์„ ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ํŽ˜์–ด๋ง์ด ์™„๋ฃŒ๋˜๋ฉด ์šฐ์ธก์— connected ๋ผ๊ณ  ๋œฐ๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  START GAME ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉดโ€ฆ

title_original

์ฃผ์œ„๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด ์œ„ ์ด๋ฏธ์ง€์˜ ์šฐ์ฃผ์„ ์ด ๋ณด์ผ๊ฒ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ณดํ˜ธํ•ด์•ผํ•  ๋ชจํ•จ์ž…๋‹ˆ๋‹ค. ๊ณง ์ฃผ์œ„์—์„œ ์  ์šฐ์ฃผ์„ ๋“ค์ด ๋ชฐ๋ ค์˜ค๋Š”๋ฐ ๋ฏธ์‚ฌ์ผ์„ ๋ฐœ์‚ฌํ•ด์„œ ์šฐ์ฃผ์„ ๋“ค์„ ๊ฒฉ์ถ”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ์‚ฌ์ผ์ด ๋ชจํ•จ์— ๋งž์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•˜์„ธ์š”. (์Šค์ฝ”์–ด ์ฐจ๊ฐ๋˜๊ณ  ๋ชจํ•จ ์ฒด๋ ฅ์ด ๋น ์ง‘๋‹ˆ๋‹ค.)

aaaaa

์ฃผ์œ„๋ฅผ ๋‹ค์‹œ ๋‘˜๋Ÿฌ๋ณด๋ฉด ์  ๋ชจํ•จ(์Šคํƒ€์›Œ์ฆˆ์˜ destroyer)๋„ ๋ณด์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๊ต‰์žฅํžˆ ํฌ๊ฒŒ ๋ Œ๋”๋ง ๋˜์–ด ์žˆ๋Š”๋ฐ ๋ฉ€๋ฆฌ ์žˆ์–ด์„œ ๊ทธ๋ฆฌ ํฌ๊ฒŒ ์•ˆ๋ณด์ž…๋‹ˆ๋‹ค.

abbb

์•„๊ตฐ๊ณผ ์  ๋ชจํ•จ์€ ์„œ๋กœ ๋ฏธ์‚ฌ์ผ์„ ์ฃผ๊ณ  ๋ฐ›๊ธฐ๋„ ํ•˜๋Š”๋ฐ.. ์‹ค์ œ ๊ฒŒ์ž„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š๊ณ .. ๊ทธ๋ƒฅ ์‹œ๊ฐ์  ํšจ๊ณผ์ž…๋‹ˆ๋‹ค;;; ์  ๋ชจํ•จ์—๊ฒŒ ๋ฏธ์‚ฌ์ผ ์ด๋„ ๊ฟˆ์ฉ๋„ ์•Š์Šต๋‹ˆ๋‹ค.

addd

์•„๊ตฐ ๋ชจํ•จ์˜ ์ฒด๋ ฅ์ด ๊ณ ๊ฐˆ๋˜๊ฑฐ๋‚˜ cancel ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์ž„์ด ์ค‘๋‹จ๋˜๊ณ  ๋ฉ”์ธ ํ™”๋ฉด์œผ๋กœ ๋‚˜๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์‹ค๊ฐ๊ณผ ์†๋„๊ฐ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์  ์šฐ์ฃผ์„ ์ด ๊ฝค ๋น ๋ฅด๊ฒŒ ์›€์ง์ด๋„๋ก ์„ค์ •ํ•ด๋‘ฌ์„œ ๊ฒŒ์ž„์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์  ์šฐ์ฃผ์„  ์ซ“์•„๋‹ค๋‹ˆ๋ฉด ๋ฉ€๋ฏธ๋‚ฉ๋‹ˆ๋‹ค. ์—ฌ์œ ๋ฅผ ๊ฐ–๊ณ  ์˜ˆ์ธก์ƒท์œผ๋กœ ๋–จ๊ตฌ์‹œ๊ธธโ€ฆ

ย 

ย 

ย 

์ฐธ๊ณ ์ž๋ฃŒ

  • ๊ฒŒ์ž„์— ์‚ฌ์šฉ๋œ ์˜ค๋ธŒ์ ํŠธ ๋ Œ๋”๋ง ์ถœ์ฒ˜๋Š” ์•ฑ์˜ credit ํ™”๋ฉด์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ์†Œ์Šค๋Š” GitHub์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • VR ํ”„๋กœ๊ทธ๋ž˜๋ฐ, 3D ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ด€๋ จ๋œ ์ž๋ฃŒ๋Š” ์•„๋ž˜ ๋งํฌ์— ๋ชจ์•„๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

โ†ง
Viewing all 99 articles
Browse latest View live