December 22, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[66호]AutoSwitch

66 ict_ 오토스위치 (1)

2020 ICT 융합 프로젝트 공모전 장려상

AutoSwitch

글 | 명지대학교 한찬영

1. 심사평
칩센 작품의 외관 디자인 및 모델링이 매우 깔끔하게 된 것이 눈에 띕니다. 기능적으로 보아 하나의 스위치만 컨트롤할 수 있는 구조라서 다른 스위치 조작을 어떻게 할지에 대한 아쉬움이 있습니다. 스위치 컨트롤을 위한 서보 모터 구동하기 위해서 적지 않은 전류 소모가 있는 듯 한데, 이 부분에 대한 개선은 필요할 것으로 보입니다. 기어 등을 적용하는 것도 하나의 방안이 되지 않을까 합니다.

펌테크 독특한 하우징 구현방식과 구글어시스턴트를 사용한 음성명령 처리방식 등의 기술 구현방식이 인상적이었습니다. 아이디어와 창의성, 실용성이 모두 돋보이며 실생활과도 밀접한 작품이라고 판단되며 전체적인 기술 구현방식과 제품완성도 등에서 우수한 작품이라고 생각합니다.

위드로봇 유행하는 기존 IoT 스위치와 차별점을 강조하면 더 좋은 작품이 될 것 같습니다.

2. 작품 개요
누구나 쉽게 핸드폰으로 집안의 전등을 원격 제어 할 수 있는 IoT 기기이다.
서보 모터를 통해 물리적으로 스위치를 작동 시켜 불을 켜거나 끌 수 있다. 단지 집 안 스위치 위아래에 이 제품을 붙이기만 하면 설치를 끝낼 수 있다. 이는 기존 제품들과 다르게 전기공사를 할 필요가 없다는 점에서 편리하다.
Blynk web server service를 이용했기 때문에 어디에서도 제어할 수 있고, 매번 연동할 필요가 없습니다. 또한 Google assistant를 통해 음성제어도 할 수 있다.
NodeMCU 기반으로 제작되어 있기 때문에, WiFi 통신이 가능하다. 또한 오픈소스 하드웨어이기 때문에 다른 IoT 기기와의 확장이 가능하다.
외부전원 12V를 통해 서버 모터와 메인 보드에 전원을 공급한다. 이는 마찰이 강한 스위치에 대해서도 작동성을 확보하기 위함이다. 마찰이 적은 스위치의 경우 5V Micro usb를 통해서도 전원 공급이 가능하다. 제품은 3D 프린팅을 통해 제작가능하며, 나사 한 개로 고정할 수 있게 설계되었다.

3. 작품 설명
3.1. 주요 동작 및 특징
3.1.1. 스위치 작동 부분

66 ict_ 오토스위치 (1)

 

66 ict_ 오토스위치 (2)

그림 1 사진의 경우처럼 스틱이 서보 모터에 의해 움직이며, 일정 각도 이상에서 스위치와 접촉하게끔 설계되어 있다. 접촉각을 넘어서는 경우부터 스위치를 물리적으로 작동시킬 수 있다.
이 제품은 가정집에서 사용되는 스위치 커버를 이용했다. 단순한 접착방식은 서보 모터의 반발력을 충분하게 지탱하지 못한다. 커버의 고정장치 부분을 모델링하여 기존 스위치 커버 대신 고정될 수 있도록 개선되었다. 이런 방식은 추가적인 접착 및 고정을 고려하지 않고 어렵지 않게 고정되게끔 한다.

66 ict_ 오토스위치 (3)

NodeMCU와 브레드보드가 탑재된 지지대가 고정될 수 있는 부분으로, 슬라이드 방식으로 탑재가 가능하도록 고려되었다. 이는 보드를 쉽게 교체할 수 있도록 고안된 것이며 제품이 데이터를 공유하고 저장하는 등 다른 IoT와의 연결성 및 업그레이드를 고려한 것이다. 소비자는 이 모듈을 단순하게 교체하면 업그레이드를 받을 수 있다.

3.1.2. NodeMCU와 Blynk의 통신

66 ict_ 오토스위치 (2)
Blynk는 위 사진처럼 아두이노와 같은 오픈소스 라이브러리로서 이를 이용하면 IoT 프로젝트를 손쉽게 제작할 수 있다. 위 사진은 현재 프로젝트에서 사용된 어플의 위젯 레이아웃이다. 버튼 몇 개와 슬라이더로 구성되어 있으며, 버튼의 작동을 인지하면 신호가 아두이노로 전송된다. 이를 통해 서보를 작동시키는 트리거가 된다.
Blynk는 자체 웹서버를 구축해 놓아서 사용자와 개발자는 웹서버 개발에 대해 비용을 투입할 필요가 없다. LTE를 통한 제어도 가능하다는 이점이 있다.

3.1.3. GoogleAssistance

66 ict_ 오토스위치 (3)

구글에서 제공하는 음성인식 서비스를 IFTTT의 webhook와 연결하여 사용할 수 있다. 위 사진과 같은 형식으로 작동한다.

66 ict_ 오토스위치 (4)

스마트폰이나 구글 홈 미니와 같은 제품에서 ‘Turn on the light’와 ‘Turn off the light’의 제시어를 통해 Virtual pin 2에 신호를 주고 이를 통해 NodeMCU 내의 Flag를 변경토록 하였다. 서보 모터를 제어하도록 설정되어 있다. 설정한 대로 작동되면 답어 ‘Yes, master’와 ‘Good night, master’를 외치게 되어 작동 여부를 확인할 수 있다. 위의 사진처럼 Blynk의 웹서버 설정을 이용할 수 있다.

3.2. 전체 시스템 구성(작동상세)
3.2.1. 스위치 작동 부분

66 ict_ 오토스위치 (4)

스위치의 작동을 위해서는 저항과 마찰을 극복할 수 있는 수준의힘이 필요한데 13g 이상의 서보 모터와 12v 어댑터를 이용한 외부전원이 필요하다.
서보 모터는 5V로도 작동하지만 아두이노에서는 충분한 전류를 제공하지 못해 위 사진과 같은 외부전원 컨버터를 이용했다.
서보 모터가 신호를 받아 작동하면 목표 각도에 대해 이동하게 된다. 이 과정에서 스위치가 방해하면 이를 극복하면서 스위치를 작동하도록 설계된 것이다. 하지만 각도가 특정 값을 넘어서게 되면 물리적 한계에 봉착하게 되고 이는 보드의 전원 차단으로 이어지게 된다.

66 ict_ 오토스위치 (5)

이를 고려하여 어플에서는 각 이동의 최대값을 설정할 수 있게끔 되어 있다.
이는 여러가지 제품과 집 상황에 따라 달라질 수 있는 값이므로 사용자가 커스텀할 수 있게끔 고려되었다.

3.2.2. NodeMCU와 Blynk의 통신
Blynk의 웹서버는 개발자버전과 배포버전으로 나누어지는데, 이중 개발자 버전으로 개발되었다. 이를 구분하는 요소로 특정한 코드를 사용하는데, 이를 통해 기기를 구분한다.

66 ict_ 오토스위치 (6)

Blynk는 아두이노의 GPIO를 직접적으로 제어할 수 있지만, Blynk만의 Virtual pin 제어를 추가적으로 제공한다. 이는 일종의 가상 GPIO로서 사용하는데 큰 제약이 없다는 것이 특징이다. 위 사진에서의 코드는 Virtual pin의 실사용 예이다. Blynk서버로부터 신호가 수신되면 interrupt가 작동되어 해당 함수가 작동되는 방식이다.
위 경우 수신되는 신호의 정보를 Flag로 업데이트 하는 방식이고, 이는 직후 아두이노의 Loop 반복문에서 서보 작동을 위해 사용된다. 또한 이 Virtual pin은 Google assistance에서의 신호수신에도 사용된다.

3.2.3. Code

66 ict_ 오토스위치 (7)

스위치 타격을 위한 서보 작동 코드이다. Loop 문에서 Flag를 지속적으로 확인하며, Blynk의 Virtual pin이 Flag를 변동시켜 작동조건에 해당하게 만들 경우 서보가 작동된다. Turn on/off를 Flag의 True/False로 판단한다.
이 때 서보의 작동각도도 Blynk의 앱에서 수치를 사용한다. 첫 초기화된 각도는 작동범위보다 작게 설정되어 있다. 이는 큰 각에 대해서는 물리적 한계에 직면했을 때 작동오류를 범할 수 있기 때문이다. 이는 사용자가 적정 범위를 설정해야 함을 의미한다.

3.3. 개발 환경(개발 언어, Tool, 사용 시스템 등)
3.3.1. Model
Type : 자체제작 및 디자인
· MainBody Switch Cover type
· Motor Arm
· Controler Module
Design tool : SolideWorks 2018
Material : PLA 15%
Manufature : 3D printer

3.3.2. 구동부
motor : 13g servo motor

3.3.3. MicroProcessor
Chipset : ch340g
Board : NodeMCU
IDE : 아두이노 IDE
언어 : C++

`이름 : Blynk
스위치 및 위젯의 프리셋과 아두이노 라이브러리를 제공하여 쉬운 어플 제작이 가능하며, 웹서버 서비스를 LTE 통신이 가능하게끔 한다.

3.3.5. 음성인식 및 webhook
이름 : Google Assistance
스마트폰 및 AI 스피커를 이용해 육성으로 집안의 전등을 제어할 수 있도록 해준다. 육성으로 내린 명령은 IFTTT의 Webhook을 통해 Blynk 웹서버로 신호를 전송한다.
Blynk는 어플과 더불어 NodeMCU에게 신호를 전송하여 서보를 동작하게끔 한다.

4. 단계별 제작 과정
4.1. Model 및 제작과정
4.1.1. Modeling
해당 제품의 특징인 쉬운설치와 관리를 위해서 구조가 간단할 필요가 있었으며, 젊은 사람을 타겟으로 잡은 만큼 디자인도 고려되어야 했다.
처음 형태는 본드 및 테이프 접합으로 접촉면이 넓게 고려되어 디자인 되었으나, 경우에 따라 스위치의 마찰 및 저항이 클 경우 이로 인한 문제가 발생했다.
더 크고 힘이 쎈 모터의 반발이 본드 및 테이프 접합으로는 충분하지 못했었다. 이에 추가로 고려된 것이 훅 형태로 고정된 스위치 커버의 형태를 본 뜨는 것이다. 이는 테이프 접합이 필요 없이 강력하게 고정할 수 있다.
Modeling 과정 및 Printing 과정에서 가장 어려웠던 부분이 바로 이 훅 부분이다. 조금의 오차를 넘어서게 되면 고정이 어려워 진다. 정밀한 측정 및 모델링이 요구되었다.
모델은 크게 3파트로 구성되었다. MainBody를 제외한 나머지 두 파트의 경우 모델러들의 추가 개조 자유성이 보장된다. Body 후면의 홀더의 경우 사이즈만 맞다면 다양한 형태의 모듈이 장착될 수 있다. 현재는 그리스 신전의 모습을 본 딴 제어모듈이 탑재되어 있지만, 디자인으로 개선된다면 제품을 커버하는 작품을 입힐 여지가 있다.
스위치 타격부 스틱의 경우 이름을 적거나 크기를 키워서 효과를 줄 수 있다.

4.1.2. 3D Printing
3D printer는 디자인의 자유성을 크게 향상시켰고, 디자인에 걸리는 소요시간을 효과적으로 단축시켰다. 현재 모델은 서포트를 크게 만들지 않았기에 인쇄하자마자 바로 사용이 가능한 수준이었다.
스위치 커버형태로 개선된 모델은 커버 하단에 많은 서포트가 만들어졌지만, 넓고 얇게 구성되어 있어 쉽게 제거할 수 있다.
3D Printing의 가장 큰 문제는 불규칙한 수축성이다. 일반적으로 2~3% 수축하지만 환경에 따라서 7%까지도 발생할 수 있다. 이를 예측하는 것은 확률에 의해 고려될 수 있으므로 제작과정 중 사용할 수 없을 정도의 저품질이 발생 하는 경우도 있었다.
Motor Mount 부분의 오차 때문에 재인쇄하는 경우가 많았다. 최대한 알맞게 설계하다 보니, 작아서 장착할 수 없는 경우가 많았다. 하여 제작시 고려된 모터보다 살짝 큰 제품은 장착 할 수 없다. 일반적으로 설계시 0.1mm 여유를 두고 설계했다.
밀도는 15%로 인쇄되었으며 적당한 강도를 제공한다. 하지만 훅 부분의 유연성이 떨어지게 되며 장착과정에서 파괴될 수 있다. 10% 정도의 경우 훅 부분에 유연성이 커져서 적은 오차를 보정해줄 수 있다. 하지만 이경우 Module Holder 부분의 강도가 떨어져서 장착, 해제 과정에서 파괴될 수 있다.

4.1.3. 회로구성 및 부품구성
NodeMCU가 제공하는 MicroUSB 전원공급 방식은 모터에 충분한 전류를 제공하지 못한다. 때문에 12V 어답터를 5v로 강하시키는 장치를 사용했으며 외부전원으로 활용되었다. 이 전원은 NodeMCU에도 공급되었다.
제어 모듈 위 브레드보드에 회로를 간단하게 구성했다. 회로가 간단하기 때문에 PCB 제작 및 크기를 줄일 수 있으며 디자인 개선 여지가 크다고 볼 수 있다.
서보 모터의 경우 13g 7천원 상당의 메탈 기어드 서보 모터를 사용했다. 흔하게 쓰이는 9g와 크기는 크게 차이가 안나지만, 큰 마찰 및 저항을 갖는 스위치에는 사용할 수 없다. 현재 제품에는 4.5kgcm 의 토크를 갖는 모터가 사용되었다.

4.2. NodeMCU Coding
4.2.1. Blynk & nodeMCU 개발환경
NodeMCU를 사용하기 위해선 간단하게 설정할 것이 있다. IDE 상에서 Board manager를 사용하여 관련 드라이버를 설치해야 한다. 이 과정에서 ESP32와 같은 WiFi Module 또한 사용할 수 있게 된다.
Blynk의 경우 관련 라이브러리와 어플을 설치하는 것으로 시작된다. IDE 상에서 Blynk클래스를 실행하고, 디바이스마다 발급받은 AuthToken과 통신환경(현재 프로젝트의 경우 WiFi)의 ID 및 password를 정의하면 된다.
Blynk의 통신을 위한 작업은 더 이상 필요없다. 이후 사용에 대해서는 사용량과 필요 요구 용량에 따라 달라지는 요구비용이 있을 뿐이다. 개발하는 환경에 대해서는 큰 요금이 들지 않는다.

4.2.2. 신호송수신 테스트
송수신을 하는데 가장 유용한 것은 Blynk만의 Virtual Pin을 이용하는 것이다. 어플 내에서의 위젯설정으로 Virtual pin의 원하는 숫자를 결정하고 나서, NodeMCU 코딩 부분에 추가 함수 형태로 정의하면 된다. Virtual Read는 추가 선언해야 하는 부분이 없다. 단지 셋업 및 Loop 밖에서의 다른 함수 형태를 취할 뿐이다.
이 함수는 버튼 클릭시 호출되며 인터럽트와 같은 형태이다. 값의 변경 뿐만 아니라 함수 내용 전체가 발동되니 제한없이 다양하게 할 수 있다.

4.2.3. Flag update을 통한 Servo 작동
Blynk Virtual pin에 의한 함수가 발동되면 수신되는 값에 따라 서보 작동이 판단된다. 1의 경우와 0의 경우 서보 회전각이 달라진다. 이는 Flag 형태가 되며 Loop문 내에서 지속적으로 해당 Flag가 업데이트되는지 확인한다. 업데이트되면 서보 회전을 위한 두가지 조건이 모두 만족되면서 결과적으로 작동하게 되어 불을 끄는 역활을 하게 한다.
두가지 조건이 필요한 것은 비의도적 한 번 초과의 클릭, 동작 중 정지 등 예외상황에 의도치 않은 움직임을 막기 위한 최소한의 조건이다. 이는 또한 Google assistance 작동 중 오류를 방지 하기 위함이다.

4.3. Blynk 및 google assistance 설정
IFTTT는 Google assistance와 Blynk의 연결성을 제공한다. IF this Then do That의 줄임말로 this와 that을 커스텀하여 어플리케이션을 제공한다.
This 항목에 대해 Google assistance를 that 항목에 Webhook을 선택한다. 이는 Google assistance가 트리거가 되고 Webhook가 Blynk 서보에 Body(신호)를 담은 Json이 전송되는 형태를 가지고 있다.
Google assistance 설정에서는 원하는 제시어와 답어를 입력할 수 있다. Webhook 설정에서는 트리거 이후의 작동에서 보낼 url과 언어의 형태 및 방법, Body를 설정할 수 있다. 이 프로젝트에서 사용된 것은 Json이며 작동 시 1, 비 작동시 0으로 하였다. Turn on 및 Turn off의 형태를 각각 지정해 주었고, Virtual pin의 경우 어플의 경우와 다른 pin을 사용토록 했다. 하지만 어플에서의 Flag와 동일하기 때문에 작동이 어플의 경우와 동일하게 된다.

5. 기타(회로도, 소스코드, 참고문헌)
5.1. 회로도
NodeMCU 및 12v to 5v 컨버터의 경우 회로도의 부품 이름과 맞지 않을 수 있다. 기능은 동일하거나 비슷하므로 각각을 대체할 수 있다.

66 ict_ 오토스위치 (8)

5.2. 참고문헌
· 아두이노(https://www.arduino.cc/education)
· googleAssitance-nodeMCU 연동(https://www.youtube.com/watch?v=1WJTkocV2Ik)
· Blynk(https://Blynk.io/)

5.3. 소드코드

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>

#define BLYNK_PRINT Serial

char auth[] = “GnCBNY4yVH2j95PCaNmN1QniKvU1QgfL”;

// Your WiFi credentials.
// Set password to “” for open networks.
char ssid[] = “HanNet”;
char pass[] = “chan0812″;

Servo switchServo;
int oper_angle = 22; // 집마다 설정 다름
int lightServoSwtich = 0; //중립 0, On : 1, Off : 2;
int lightServoFlag = 1; // 지속적 신호에 대한 Flag
int middleAngle = 90 + 3;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);

switchServo.attach(4); //D2
switchServo.write(middleAngle); //Prevent reset move 180 degree
Serial.println(“Start!! nodeMCU_lightSwitch”);
}

BLYNK_WRITE(V0){
int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
if(pinValue == 1){
Serial.println(“Swtich On”);
lightServoSwtich = 1;
} if(pinValue == 0) {
Serial.println(“Swtich Off”);
lightServoSwtich = 2;
}
}

BLYNK_WRITE(V1){
int pinValue = param.asInt();
oper_angle = pinValue;
Serial.print(“Servo Max Angle is Changed : “);
Serial.println(oper_angle);
}
BLYNK_WRITE(V2){
int pinValue = param.asInt();
// Serial.print(“Received Signal from Google to turn on : “);
// Serial.println(pinValue);
if(pinValue == 1){
Serial.println(“Swtich On”);
lightServoSwtich = 1;
} if(pinValue == 0) {
Serial.println(“Swtich Off”);
lightServoSwtich = 2;
}
//Serial.println(“Servo Activated!!!!!”);
}

void loop() {
// put your main code here, to run repeatedly:
Blynk.run();

if (lightServoSwtich == 1 && lightServoFlag == 1){ // light On
Serial.println(“ServoActivate : light On”);
switchServo.write(middleAngle – oper_angle);
delay(2000);
lightServoFlag = 2;
lightServoSwtich = 0;
switchServo.write(middleAngle);
} if(lightServoSwtich == 2 && lightServoFlag == 2){ // light Off
Serial.println(“ServoActivate : light Off”);
switchServo.write(middleAngle + oper_angle);
delay(2000);
lightServoFlag = 1;
lightServoSwtich = 0;
switchServo.write(middleAngle);
}
}

 

 

 

 

Leave A Comment

*