1. 머리말
스마트 스위치 작동 방식은 간단해서, 스마트 폰으로 스위치를 켜고 끌 수 있도록, 손가락 모양의 장치를 무선으로 제어하는 것입니다. 이를 이용해, 스위치를 원격으로 제어하는 것이 이 제품의 핵심 아이디어입니다.
이를 구현하기 위해서는 다음과 같은 몇 가지 기술이 필요합니다.
- 서보 모터 제어 장치
- WiFi 무선 네트워크 송수신 장치
- IoT 연결 및 데이터 송수신
- 제품 외양 패키지 디자인
각 내용을 처음부터 다 만들려면, 최소 몇 달이 걸리겠지만, 다음과 같은 오픈소스 도구를 이용하면, 몇 일안에 집에서도 개발 가능합니다.
- 1, 2 = ESP NodeMCU + 서보 모터
- 3 = Blynk
- 4 = 3D 프린터 + Thingiverse + Customizable case app
2. 3D 프린팅
3D 프린터는 AliExpress에서 찾아보시면 가성비 좋은 제품들이 쏟아져 나오는 데요, 20~40만원대 평가가 좋은 제품 구입하시면 큰 무리없이 사용 가능합니다.
Thingiverse는 프린팅할 수 있는 수많은 3D 모델을 무료로 다운로드 할 수 있는 사이트입니다. 게다가, 플라스틱 케이스, 기어 등을 디자인하는 앱도 무료로 제공해 줍니다 (최고!). 복잡한 디자인이 아니면, 굳이 123D, Tinker캐드 등을 이용해, 디자인할 필요가 없습니다. 다운로드 받고 프린팅하면 작업 끝납니다.
여기에서는 Customizable case app 을 이용해, 다음과 같이 케이스를 디자인하였습니다. 참고로, Thingiverse에는 캐드를 이용하지 않고 손쉽게 디자인할 수 있는 수많은 앱이 있습니다. Thingiverse App을 이용해 기어, 스틱, 스마트폰 거치대 같은 것은 쉽게 디자인할 수 있죠.
Create Thing버튼을 클릭하면, Thingiverse가 치수를 보고, 알아서 다음 처럼 디자인해 줍니다.ㅎ
자동생성된 케이스
서보모터 케이스 치수는 다음과 같습니다.
lidInsetHeight = 1.2
interiorHeight = 40
interiorFillet = 1
lidInsetOffset = 0.0
sidewallWidth = 1.1
hingeLengthScale = 1.1
hingeWidth = 3
tabSize = 1
coverThickness = 1.0
interiorLength = 52
interiorWidth = 22
rimInset = 0.6
hingeFillet = 3
hingeThickness = 0.3
자동생성된 서보 모터 케이스
이제 프린팅하면 이 케이스를 손에 넣을 수 있습니다.ㅎ 케이스는 각 부품을 고정할 수 있도록, 양면 테이프 혹은 접착재를 이용해, 고정해 줍니다.
스위치를 누르는 손가락도 Thingiverse 에서 검색해 프린팅할 수 있습니다.
손가락은 서보 모터 회전축에 접착재로 붙이면 되겠죠. 저의 경우에는 록타이트 접착재를 이용했습니다.
3. 메이크 재료 준비
우선 다음 재료를 준비합니다.
- ESP NodeMCU (4천원), 서보 모터 SG90 (3천원), 양면 테이프, 전선 와이어, 브래드보드, LED, 저항 10옴, 광센서, 9V 배터리 및 배터리 연결선 (2천원), mini USB 케이블 및 USB 어답터 (스마트폰 전원 어답터 재활용)
몇몇 부분을 재활용하면, 재료비는 대략 만원정도네요.ㅎ
4. 위젯 디자인
Blynk에서 다음과 같이 위젯을 스마트폰에 설치된 Blynk로 디자인해 줍니다(참고 - 이전 Blynk 관련 글).
각 위젯 역할을 다음과 같습니다. 참고로, Virtual Pin에 연결된 것은 V# 이렇게 표시했습니다.
- 스위치 버튼(V7): 서보 모터를 동작시킵니다. 아울러, 동작 표시를 위해 LED를 켜고 끔니다.
- 슬라이더: 첫번째 슬라이더(V8)는 서보 모터 시작 각도, 두번째(V9)는 끝 각도를 지정합니다.
- LED(V1): 동작 상태를 표시합니다.
- 그래프(A0): 시간에 따른 조도값을 표시합니다.
5. 회로 연결
ESP NodeMCU보드와 부품간 회로는 다음과 같이 연결합니다.
- LED = D2, GND
- 서보 모터 = D4, 3V, GND
- 조도 센서 + 저항 = A0, 3V, GND
6. 코딩
ESP NodeMCU, Blynk 코딩은 다음과 같이 합니다. 타이머는 차후 다른 데이터 센싱을 위해, 코딩한 것입니다. 필요 없으면 삭제해도 동작합니다.
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <Servo.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "fd288f0e5e684408b6d91ba97c87b3b2";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "U+Net8080";
char pass[] = "5000005129";
// Widget
SimpleTimer timer;
WidgetLED led(V1);
// Servo
Servo servo;
int minAngle = 15;
int maxAngle = 105;
int ledPin = D2;
void setup()
{
delay(10);
pinMode(ledPin, OUTPUT);
// pinMode(2, INPUT_PULLUP);
servo.attach(D4);
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
servo.write(minAngle);
delay(30);
timer.setInterval(1000L, sensingData);
}
BLYNK_WRITE(V7) // Button Widget is writing to pin V2
{
int pinData = param.asInt();
if(pinData == HIGH)
{
digitalWrite(ledPin, HIGH);
led.on();
servo.write(maxAngle);
delay(30);
}
else if(pinData == LOW)
{
digitalWrite(ledPin, LOW);
led.off();
servo.write(minAngle);
delay(30);
}
}
BLYNK_WRITE(V8)
{
minAngle = param.asInt();
servo.write(minAngle);
delay(30);
}
BLYNK_WRITE(V9)
{
maxAngle = param.asInt();
servo.write(maxAngle);
delay(30);
}
void loop()
{
Blynk.run();
timer.run();
}
void sensingData()
{
int state = analogRead(A0);
// state = digitalRead(2);
}
7. 조립
3D프린팅한 케이스에 앞의 재료들을 잘 배치해 넣습니다. 전선은 떨어지지 않게 글루건을 사용해 잘 붙입니다. 양면테이프를 이용해, 케이스와 스위치가 있는 벽에 부착합니다. 그리고, 전원을 연결해 테스트 해 봅니다.
간단하게, 스마트 스위치를 만들어 보았습니다. 이 정도는 집에서도 3D프린터만 있으면 쉽게 작업할 수 있습니다. 3D프린터가 없어도, 케이스같은 것은 다이소같은 곳에서 적당한 것 사서, 짤라서 사용해도 되죠. 이때는 드라멜같은 다양한 툴셋을 지원하는 만능 전동공구가 있으면 편합니다.
8. 마무리
오늘은 간단히 IoT기반 스마트 스위치를 만들어 보았습니다. 잉여력 돋지 않나요? 다만, 크기가 해외 스타트업체에서 소개한 제품보단 큰게 안습입니다. 만약, 회로 디자인 도구와 디자인 캐드를 잘 사용하실 수 있으면, 작고 귀엽게 최적화된 스마트 스위치를 집에서 생산해 볼 수도 있을 겁니다.
집안 여기 저기에 IoT 스마트 스위치를 붙여 넣고 직장에 있을 때 한번 테스트해보세요. 본인이 만들어도, 직접 집의 가전기기들을 제어해 보면, 신기하고 재미있을 겁니다.^^
레퍼런스
레퍼런스
- https://www.kvaser.com/
- http://oscc.io/
댓글 없음:
댓글 쓰기