앞선 글에서 여러 마이크로 컨트롤러를 연결할 수 있는 IOT 플랫폼의 하나인 아두이노 IOT 클라우드를 소개하고, 이를 또 다른 이전 글에서 소개했던 또 다른 IOT 플랫폼인 Blynk와 비교하여 설명한 바 있었다.
아두이노 IOT 클라우드에 대해 생소하다면 다음의 글을 미리 참고하기 바라며,
https://blog.naver.com/mythee1/223452721026
Blynk 서비스와, Blynk에 마이크로파이썬을 사용하는 PICO-W나 ESP32 등을 등록하여 IOT를 구현하는 방법에 대해서는 다음 글을 참고하기 바란다.
https://blog.naver.com/mythee1/223443619959
본 글에서는 앞글에서 소개한 아두이노 IOT 클라우드에, 복잡한 C++ 대신 쉽고 사용이 편한 마이크로파이썬을 사용하는 라즈베리파이 PICO-W나, 마이크로파이썬을 사용하는 ESP32 장치를 연결하여 PC나 스마트폰에서 확인 및 제어하는 IOT 구현 방법을 소개한다.
Step 1. PICO-W/ESP32 장치 등록하기
이런 IOT 구현을 위해 가장 먼저 해야 할 일은 계정을 만들고, PICO-W나, ESP32 등의 장치를 아두이노 클라우드에 등록하는 것인데,
다음과 같은 초기 화면에서, “Get started for free”를 선택해 주면
다음과 같은 아두이노 IOT 클라우드의 계정을 만드는 화면이 나타나며, 여기서 생성하면 되는데, 기존의 구글 등의 외부 계정 ID를 그대로 활용할 수도 있다. 개인이 선호하는 대로 계정을 생성하면 된다.
계정이 만들어진 후 처음 로그인하면 다음과 같은 화면이 되는데,
연결할 장치를 등록하기 위해 Device 탭으로 이동해 Add Device를 선택한다.
(참고 : 장치 등록보다 다음에 소개할 변수 등록을 먼저 하기도 하나, 자신이 선호하는 순서대로 진행하면 된다.)
그러면 다음과 같은 화면이 나오는데, 우리는 마이크로파이썬을 사용하는 장치들(PICO-W , ESP32)를 등록할 것이므로, 다음과 같이 “Any Device”를 선택해 준다.
그러면 다음과 같이 이름을 지정할 수 있는 화면이 나오는데, 기본적으로 임의로 할당된 값이 기재된 상태로 화면이 열리게 된다. 자신이 원하는 대로 등록할 기기의 이름을 지정해 주면 된다.
다음으로 진행하면 다음과 같은 화면이 나오는데, 이 화면은 장치를 연결하기 위해, 마이크로파이썬 등의 코드에 포함시켜주어야 하는 접속 정보를 포함하고 있다. 이 정보는 매우 중요하므로, 아두이노 클라우드는 이 페이지를 PDF로 다운로드하도록 요구하는데, 이를 확인해 주고 다음 화면으로 진행하면 장치 등록이 완료된다.
장치 등록이 완료된 상태에서는 다음과 같은 형태의 화면이 되며, 아두이노 클라우드에 등록한 IOT 장치들이 나열된다. 다음 화면에서는 PICO와 ESP32 2개의 보드를 등록한 상태이고, 아직 이 장치를 등록은 했지만, 연결된 동작이나 연결된 변수는 아직 없는 상태인 것을 “Associated Things” 부분이 공란인 것에서 알 수 있다.
각가의 장치를 클릭해 보면 다음과 같이 장치 ID, 등록된 시점, 아두이노 클라우드에 접속되었던 히스토리 정보 등의 세부 정보들을 확인할 수 있다.
Step 2. 등록된 장치에 변수(Things) 할당하기
일단 사용할 장치들을 등록하였다면, 다음으로는 이들 장치들과 신호를 주고받게 될 변수들을 생성하고, 이들 변수들을 이들 등록된 장치들과 연결하는 설정을 해 주어야 한다. 아두이노 클라우드에서는 이러한 변수들을 “Things”라는 메뉴 탭에서 다루는데, 변수를 처음 생성하는 것이라면 다음과 같이 “Create Things”를 선택하고
다시 다음 화면에서 “Add”를 선택해 준다.
그러면 아두이노 클라우드와 외부 장치 간 신호를 주고받을 변수를 생성할 수 있는데, 다음의 표시된 항목들을 지정해 주면 된다.
Variable permission 부분에서는 센서 값처럼 일방적으로 읽기만 하면 되는 경우라면 “Read only”를 선택하고, 스위치 조작이 필요한 경우처럼 신호를 양방향으로 주고받는 경우라면 “Read&Write”를 선택한다.
Update Policy의 경우는 일정 주기로 신호값을 읽는 경우라면, “Periodically”를 선택하고, 스위치 조작처럼 특정 동작이 되어야 값이 변하는 경우라면 “On Change”를 선택해 준다.
중간부 변수의 type에 대해서는 다음과 같이 드롭다운 메뉴에서 선택할 수 있는데, 스위치처럼 on/Off 조작은 Boolean을 선택하고, 센서 측정값 같은 경우라면 floating number 등을 선택하면 된다. 필요에 따라 나열된 메뉴 중 적절히 선택하면 된다.
이렇게 선택을 마치고 위의 화면에서 “Add Variable”을 누르면 다음과 같이 변수(예: led_state)가 생성된 것을 볼 수 있다. 자신이 필요로 하는 신호 입출력의 숫자만큼 필요한 변수들을 만들어준다.
그 다음에는 이렇게 생성한 변수를 클라우드에 등록된 장치들 중 어느 장치와 연계할지를 정해주어야 한다.
연계할 변수들을 클릭해 선택해 주고, 화면 우측의 “Associated Device”부분의 “Select Device”을 선택하면
다음과 같이 등록한 장치들 중 이 변수와 연결해 줄 장치를 지정해 줄 수 있다.
장치 선택을 마치고 나오면 다음처럼 화면 오른쪽에 이 변수에 “pico”라는 이름의 장치가 연계된 것을 확인할 수 있다.
Step 3. 사용자 화면(UI)인 대시보드 만들기
클라우드에 입력되는 신호들을 모니터링하거나, 효율적으로 조작하기 위해서는 사용자 화면이 필요한데, 이러한 사용자 화면을 대시보드라고 한다. 대시보드에는 클라우드에 입력된 센서 신호값들을 숫자나, 그래프, LED 등의 다양한 형태로 표시할 수도 있고, 원격의 장치를 조작하기 위한 스위치 등도 배치하게 된다. 또한, 필요에 따라 여러 장치들의 신호값들을 하나의 대시보드에 모아서 보거나 조작하는 것도 가능하다. 이처럼 IOT 플랫폼의 효율적 사용을 위해서 대시보드 생성은 필수적이다.
대시보드를 만드는 방법은 다음처럼 대시보드 탭에서 Create Dashboard를 선택하면
다음과 같은 빈 상태의 대시보드 화면이 나타나는데,
다음 화면의 눈동자 모양 아이콘이 선택되면 평상시 사용 상태의 화면이며, 펜 모양의 아이콘이 선택되면 편집 상태의 화면이 된다.
이런 빈 상태의 대시보드에 필요한 정보 표시를 위해, 펜 모양 아이콘을 눌러 편집 모드로 들어가고
다음과 같이 Add를 눌러 자신이 정보를 표시하거나 조작에 사용할 도구를 선택해 준다.
본 예제에서는 앞에서 생성된 LED의 점등 상태를 표시하기 위해 다음과 같은 LED를 선택했다.
그러면 다음과 같이 선택한 위젯의 속성을 지정하는 화면이 되는데, 먼저 이름을 지정/변경(필요시) 하고, 중간에 있는 Link variable을 선택해 준다.
그러면 이 위젯을 앞단게에서 생성했던 변수들 중 어느 변수들과 연결되는 것인지를 지정해 줄 수 있다.
다음 표시된 것처럼 순차적으로 장치–>변수의 순서로 선택해 지정해 주면 된다.
그 후, 각각의 위젯 고유의 추가적인 속성들을 설정해 주고 Done을 눌러 확정해 주면 된다.
이 LED(보드에 물리적으로 연결될)를 원격으로 조작하기 위해서는 동일한 방식으로 다음과 같이 스위치 위젯을 선택해 주고
참고로, 이 스위치 위젯과 LED 위젯에 공통으로 연결된 변수는 앞 단계에서 Read & Write로 속성을 지정해 준 상태이다.
모든 속성 지정을 마치고 Done 을 눌러 확정해 주고, 눈동자 모양 아이콘을 눌러 사용 모드로 나오면 다음과 같은 대시보드 생성 및 위젯 설정이 완료된다.
참고사항 – 만일 LED가 아니라, 센서 값을 숫자로 표시하는 경우라면 다음과 같이 Gauge를 선택하면 되고, 센서 값을 시계열 그래프로 표시하는 경우라면 Chart 위젯을 사용하면 된다.
Step 4. PICO-W/ESP32보드와 마이크로파이썬 코드
다음과 같이 PICO-W와 ESP-32보드에 LED를 각기 하나씩 연결하여 이를 아두이노 클라우드에 연결하기로 했다.
마이크로파이썬을 이용하여 아두이노 클라우드에 접속하려면 해당 장치에 lib 폴더를 만들고 다음과 같은 라이브러리 파일들이 미리 저장되어 있어야 한다. 각각의 라이브러리 파일들은 다음의 오픈소스에서 다운로드 가능하다. 그리고 이중 arduino_iot_cloud 라이브러리는 다시 ucloud.py, umqtt.py, ussl.py, __ init __.py의 4개 파일로 구성된다.
arduino_iot_cloud https://github.com/arduino/arduino-iot-cloud-py
cbor2 https://github.com/micropython/micropython-lib/tree/master/python-ecosys/cbor2
senml https://github.com/micropython/micropython-lib/tree/master/micropython/senml
logging.py https://github.com/micropython/micropython-lib/blob/master/python-stdlib/logging/logging.py
다만, 이렇게 복잡한 라이브러리 파일 구성이 복잡하기에 logging.py를 제외한 나머지 라이브러리 파일들은 다음 코드를 실행하는 방법으로 한 번에 설치할 수가 있다. logging.py는 파이썬 표준 라이브러리로 알려져 있으나, 내 경우에는 별도로 추가해 주어야 해서 위의 소스에서 다운로드해 별도로 추가했다.
import network
import mip
SSID= "MySSID" #각자 적절히 변경 필요
PASSWORD = "Mypassword" #각자 적절히 변경 필요
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Connected to ",SSID)
mip.install("github:arduino/arduino-iot-cloud-py") # install the arduino-iot-cloud module
그러면 다음과 같은 간단한 마이크로파이썬 코드를 사용해 해당 보드를 아두이노 대시보드에 접속하고, 아두이노 클라우드의 대시보드에서 LED 상태를 모니터링하고, 또한 대시보드에서 원격으로 켜고 끄는 조작을 하기로 했다.
from machine import Pin
from time import sleep
import network
import logging
from arduino_iot_cloud import ArduinoCloudClient
WIFI_SSID="mySSID" # 변경 필요
WIFI_PASSWORD = "myPASSWORD" # 변경 필요
# picoW
DEVICE_ID="097998f9-f161-XXXXXX8ff-019cb7" # 기기등록시 기록해 둔 값을 사용-변경 필요
CLOUD_PASSWORD="pZ#117eDr#XXXX!L?LAnyL1H3" # 기기등록시 기록해 둔 값을 사용-변경 필요
led_pin = Pin(14,Pin.OUT) #ESP32에서는 Pin2를 사용했음
def wifi_connect():
if not WIFI_SSID or not WIFI_PASSWORD:
raise (Exception("Network not configured."))
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
logging.info("Trying to connect...")
sleep(0.5)
logging.info(f"WiFi Connected {wlan.ifconfig()}")
def onLedChange(client,value):
if value:
led_pin.value(1)
print('LED ON!')
else:
led_pin.value(0)
print('LED OFF!')
if __name__ == "__main__":
logging.basicConfig(datefmt="%H:%M:%S",format="%(asctime)s.%(msecs)03d %(message)s",level=logging.INFO,)
wifi_connect()
client = ArduinoCloudClient(device_id=DEVICE_ID, username=DEVICE_ID, password=CLOUD_PASSWORD)
client.register('led_state1', value=None, on_write=onLedChange, interval=0.05) #참고 - 각 장치별로 신호를 주고받을 변수이름은 달라야 한다.
client.start()
그런데 나는 여기서 한 가지 난관이 있었다. 첫 시도에서는 다음과 같은 접속 오류가 있었다.
여러 가지로 원인을 찾고, 아두이노 포럼에 연락해 확인한 결과 v1.2.0 버전 arduino_iot_clou 라이브러리에 포함된 ussl.py 파일의 오류로 인한 문제로 확인되었고, 일단 이전 버전인 v1.1.0을 사용하길 권고받았다.
(참고 : 당시는 v1.2.0 버전이 업로드된 지 1일 밖에 안된 상황이었고, 현시점에서 1.2.0 버전의 오류 수정이 완료되었는지는 확인이 필요한 상태임)
이 때문에, 나는 해당 오픈 소스에서 다음 부분을 클릭해서
다음과 같이 이전 버전을 찾은 후, 표시된 zip 파일 내에 포함된 라이브러리 파일을 추출해 장치에 다시 업로드해 주었다.
그 후, 다음과 같이 정상적인 접속 성공 메시지를 얻었고,
마이크로파이썬을 사용하는 ESP32와 PICO-W를 이용하여 대시보드에서 모니터링 및 대시보드 상의 스위치를 통해 원격 LED를 켜거나 끌 수 있었다.

참고사항
장치 접속전에 반드시 신호를 주고받을 변수가 클라우드 내에서 선언 및 장치와 연계 설정이 되어 있어야 한다.
위에서처럼 PICO-W와 ESP32를 동시에 접속하려는 경우, 각 장치별로 다른 이름의 변수를 사용해야 한다.(예: led_state1, led_state2 등)