본문 바로가기

메이커활동/HW&SW

Arduino+EthernetShield 와 Google Drive & PushingBox 를 사용한 Simple DAQ



(위) 구글드라이브에 수집된 자료로 바로 그린 그래프


(위) 아두이노 메가와 이더넷실드를 연결하고, 센서와 스위치를 연결, 공유기를 통해 인터넷에 연결된 상태

[개요]
설문조사등에 사용되는 구글양식(Form) 을 이용하여 정해진 양식의 데이터를 구글문서 spreadsheet 에 등록할 수 있다. 이것을 이용하면 간단한 DAQ 즉, 데이터를 얻어서 정해진 장소에 저장시키는 기능을 아두이노로 구현할 수 있겠다는 생각이 들었다. 

기본적으로 DAQ 는 센서의 입력을 받아 그것을 저장하는 역할을 한다. 가격이 비쌀수록 더 정밀한 센서값을 읽어들일 수 있고, 저장 간격 즉 sampling rate 를 작게 할수 있다. 그리고 충분히 오랜기간동안 데이터를 누적시킬 수 있어야 한다.

하지만 Arduino 로 그러한 성능의 DAQ를 모방한다는 것은 세발자전거타고 페라리하고 경주하는 것이나 다를바 없으니 그러한 것을 기대하지는 말자. 그저 여기서 한다는 것은 아두이노라는 매우 편리하지만 저렴한 장비를 이용해 개인적인 필요에 의해 아주 저렴하게 DAQ 시스템을 만들어보겠다는 것이다. 직접 테스트한 결과 sampling rate 는 10초에 3회 정도로 약 3~4초 정도의 간격으로 데이터를 받게 된다. 1Hz 도 아니고 0.3Hz 정도다. 이정도면 어디서 DAQ 라는 말은 꺼내지 못한다. 그래도 아두이노와 이더넷실드만 있으면 SD카드도 아니고, PC 서버를 쓰는 것도 아니니 집의 온도를 측정한다든지, 조도센서를 달아서 빛의 양을 측정하든지 등등의 개인적 용도로 사용하는 방법은 각자가 알아서 고민하면 상당히 나올법하다. 

서론이 이쯤하고 이제 제작 방법을 공개한다. 제작은 순수하게 개인의 힘으로 한 것이 아니라 구글을 통한 검색과 이미 이러한 가능성을 먼저 고민하고 나름대로 고민한 많은 이들의 힘으로 이루어진 것이다. 난 거기에 숟가락 하나 더 얹었을뿐...
 
간단하게 아두이노와 주변 회로를 그려보면 다음과 같다. 아두이노는 5개의 센서입력을 받고, 3개의 스위치가 연결되며, 그중 2개는 슬라이드(혹은 토글)스위치이고 하나는 택트스위치(혹은 푸쉬버튼)이다.
아두이노는 Mega2560을 사용하였으며 이더넷실드와 연결되어있다. 우노로는 작은 플래시메모리 때문에 처음부터 시도하지 않았다. 가능할 거라 여겨지지만 혹시나 안되면 굳이 프로그램코드를 줄이려하지 말고 그냥 메가2560 을 구입하길 권한다. 이베이 가격은 국내 판매가격의 절반 이하다. 필자도 거기서 메가2560과 이더넷실드를 구입했다. 

[물리적환경]
서입력 ------>> [아두이노+이더넷실드] --- 공유기
SW1/SW2/SW3--->>
 
[Sensor1]-----+      +-----[A0]----------------+=+------------+
[Sensor2]-----+      +-----[A1]-               |=|            |
[Sensor3]-----+======+-----[A2]-   [ARDUINO]   |=|   Ethernet |
[Sensor4]-----+      +-----[A3]-               |=|   Shield   |
[Sensor5]-----+      +-----[A4]-               +=+------------+
                           [  ]-               |      ||
VCC-----+                  [  ]-               |      || LAN
        +--[SW_TACT1]-+----[03]-               |      ||
        +--[SW_SLDR2]-+    [  ]-               | +-------------+
GND--------[10k]------+   [  ]-               | |             |
GND-----[220ohm]---[LED]---[04]-               | |   Router    |
GND--------[10k]------+----[05]-               | |             |
VCC--------[SW_SLDR3]-+        ----------------+ +-------------+


[사용법]
아두이노 메가 2560 과 이더넷실드를 결합한다.
이더넷실드와 공유기를 LAN 연결한다. 공유기는 IPTIME 을 사용하였다.(다른 것을 사용하여도 문제없을것이다. 단 IP설정과 기타 등등 알아서 해야한다.)
공유기에서 이더넷실드의 mac 주소를 ip 와 연결한다. 


그림처럼 자신의 이더넷실드의 mac 주소와 ip 주소를 연동시킨다. 이렇게 하지 않고도 되기도 하던데, 정확히 어떤때 되고 어떤때 문제가 되는지는 확실하지 않다. 그 부분은 차후에 시간이 되면 구글 검색해가면 공부해 볼 생각이다. 우선 위 그림처럼 처리해두자. 그리고 위 사진에는 없지만 등록한 ip 의 포트 60번을 열고 포트포워딩을 해둔다. [NAT/라우터관리]에 들어가서 처리할 수 있다. [포트포워딩]으로 검색하면 상당히 많은 자료들이 나올것이다.


소스를 컴파일&업로드한다. 이 부분은 이미 아두이노를 사용하고 있는 사람이라면 아무런 문제없을 것이라 생각되어 더 이상의 설명은 생략한다.

--[소스시작]---

--[소스끝]---

스위치는 총 3개이지만 1개는 버튼식으로 누를때만 ON 이 되는 것이고, 두개가 슬라이드 혹은 토글 스위치로 방향(ON/OFF)를 정해두어야 하는 것이다.

** SW_SLDR2 == ON & SW_SLDR3 == ON -->> continuous sampling 
** SW_SLDR2 == OFF & SW_TACT1 -->> discrete sampling when tact switch pushed

2번 3번 스위치를 둘다 ON 시키면 자동으로 계속 센서값을 읽은 후 바로 저장한다.
2번 스위치가 OFF 상태이면 택트스위치가 눌려질때만 한번씩 값을 읽고 저장한다. 

연속 샘플링 저장은 SW_SLDR2 와 SW_SLDR3 를 모두 ON 시키면 되고, 하나씩 저장할 때는 SW_SLDR2 를 OFF 시킨 상태에서 택트스위치 SW_TACT1 를 누르면 된다.


[프로그램 설명 전 알아야 할 내용들]

작동시 미리 구글양식으로 저장할 센서값을 받도록 해 두어야 하며, 구글문서 스프레드시트에서 결과를 볼수 있게 해 두어야 한다.


구글 계정이 없다면 구글 계정을 만든다. 구글 양식을 사용하기 위해서다.


5개의 센서값을 받아서 저장할 것이므로 총 5개의 질문을 만든다. 질문은 [온도], [조도] 처럼 짧게 만들어두는게 보기 편하다. 질문이 완성되었으면 [응답 >> 미리 작성된 URL 생성하기 >>]로 가서 5개의 질문에 대한 기본 답을 적는다. 



위의 링크부분을 복사해 둔다. 여기서 필요한 몇가지 정보를 꺼내야 한다.

https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/viewform?entry.1187211743=1&entry.1887603566=2&entry.545717569=3&entry.740437495=4&entry.802468911=5


[분석순서]

1. 양식의 keyid : docs.google.com/forms/d/ 뒤에 있는 id
1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4
 
2. 입력받는 내용의 번호 : &entry.에 불어있는 번호숫자, 5개의 입력을 받으므로 총 5개 번호
   1187211743
   1887603566
   545717569
   740437495
   802468911

3. url 상태에서 전송하기 위해서 두가지 내용이 수정, 추가됨 
맨끝에 추가될 것 : &submit=Submit
수정될 것 : viewform -> formResponse

4. 결과
https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/formResponse?entry.1187211743=1&entry.1887603566=2&entry.545717569=3&entry.740437495=4&entry.802468911=5
&submit=Submit

5. 센서값 입력할 곳
위에서 '&entry.[숫자]='다음에 오는 텍스트가 입력값이 됨, 즉 위의 경우 5개의 입력값은 각각 1, 2, 3, 4, 5 가 되고, 입력값만 변경해 주면 변경된 값으로 추가됨.

6. http 가 아닌 https 이므로 아두이노에서 직접 사용하기에는 무리임, 별도의 방법을 찾음
www.pushingbox.com 에서 계정을 만듬(구글계정으로 사용)

7. [in PushingBox] MY SERVICES >> Add a service >> CustomURL >> [Name / Root URL / POST 입력]
여기서 Root URL 에 



https://docs.google.com/forms/d/[...이부분은 자신의 google keyid...]/formResponse?
를 입력

https://docs.google.com/forms/d/1Bm0aiZU-5BtFmbkdq43iusDKzkpoNy3ci-XzG8jLrq4/formResponse?


8. MY SCENARIOS >> [자신의 시나리오 이름(ex. GDocs)] Add
DeviceID 를 기록해 둘 것 (ex. v478626023164DCD)
>> Add an action >> Google Driver for Arduino [Add an action with this service] >> Data [아래방식으로 텍스트입력] [Submit]

&entry.(2의 첫번째번호)=$first$&entry.(2의 두번째번호)=$second$&entry.(2의 세번째번호)=$third$&entry.(2의 네번째번호)=$fourth$&entry.(2의 다섯번째번호)=$fifth$&&submit=Submit

번호를 직접 입력하면 다음과 갈다.

&entry.1187211743=$first$&entry.1887603566=$second$&entry.545717569=$third$&entry.740437495=$fourth$
&entry.802468911=$fifth$&&submit=Submit



여기서 $first$ 부터 $fifth$ 까지 다섯개의 변수를 둔다. 
MENU 의 API 를 클릭, 내용을 참고하여 다음과 같이 http 주소창에 써넣어주면 된다.

http://api.pushingbox.com/pushingbox?devid=(8의 DeviceID)&(변수1)=(변수1의값)&(변수2)=(변수2의값)...

이것을 적용하면 다음과 같다.

http://api.pushingbox.com/pushingbox?devid=v478626023164DCD&first=100&second=200&third=300&fourth=400&fifth=500

[기타]
  1. 속도가 매우 늦다. 구글 드라이브에 직접 연결하는 것이 아니라 PushingBox 에서 제공하는 API 를 통해서 연결하는 것이므로 샘플하나를 전송하는데 걸리는 시간이 3~4초 정도 된다.

  2. 구글측에서 자신들의 양식(form)을 이런식으로 사용하는 것에 대해 막을 가능성이 있다. 과거에도 그러했던것처럼. 즉, 구글 드라이브로 DAQ를 만들어 쓰는 것은 지극히 개인적인 것으로 그치는 것이 좋다.

  3. 이더넷실드는 100M 의 속도를 제공하지만 정작 인터넷 연결시 속도가 그보다 못할경우 아예 작동을 안하기도 한다. 공유기와 실드간 상당한 거리를 두고 연결해보려고 하였지만 계속 실패하였다. 성공했다가 실패하기를 반복해서 처음엔 코드를 살폈고, 나중에는 하드웨어가 문제가 있는지도 살폈다. 하지만 원인은 10m 정도 되는 랜선이었다. 공유기를 실드 바로 옆으로 옮기고 짧은 랜선을 사용하자 모든 문제가 해결되었다. 

  4. 구글드라이브 스프레드시트는 40만개 셀, 최대 256개 열, 수식 4만개의 제한이 있다. 최근들어 새로운 스프레드시트는 200만개의 데이터셀을 지원한다고 하지만 Simple DAQ 사용시 약 2만개를 넘었을때 경고문이 뜨는 것을 보았을때 현재 한국에서 사용하는 구글드라이브 스프레드시트는 시트당 40만개가 최대 한계인 듯 하다. 그래서 구글 스프레드시트에서 사용하지 않는 컬럼을 삭제하면 그만큼 사용가능한 셀의 갯수가 늘어난다. 즉, 100개 열이 있다면 5개의 데이터가 10번 들어오면 사용되는 것은 50개의 셀이지만 그 옆에 사용하지 않는 950개의 셀이 낭비된다. 이 낭비를 줄이는 방법은 사용하지 않는 컬럼을 삭제하는 것이다.

  5. 데이터가 누적되는 동안 스프레드시트를 열지 않는 것이 정신 건강에 좋다. 화면에 멈춘듯이 보이고, 때로는 원하지 않는 작동을 하게 된다. 스프레드시트는 DAQ 작동을 멈춘 다음 확인 한다.