WEMOS D1 Mini를 다수 무선 센서 노드처럼 운용해야 할 필요가 생겼다. 그런데 설치하고자 하는 현장은 그닥 WIFI AP가 있는 것으로 보이지 않는다. 그렇다면 어떻게 해야 할까? Ad-hoc network을 구성하는 방법이 있을 것이다.
그 방법으로 찾다가 찾은 게 mesh network이다.
WIFI mesh를 구성하면 된다고 한다.
WEMOS D1 mini를 보드설치하고 나면 설치되는 예제 중에서 WIFImesh예제가 있어서 해봤는데 도대체 되지가 않았다. 뭐지? 내부가 상당히 복잡해서 좀 공부가 필요한 상태였는데...
열심히 구글링을 한 결과 easymesh 라는 라이브러리를 찾았다. 그런데 이를 설치해도 계속 뭔가 안 맞는지 에러가 난다. 한 구글링 결과에서 이 라이브러리가 더이상 업데이트가 잘 안되는 것이라는 언급을 봤다. 그러면서 자신의 라이브러리를 홍보하시는데 이름하여 painlessmesh 라이브러리이다.
https://gitlab.com/painlessMesh/painlessMesh
이 라이브러리는 gitlab.com에 들어가서 다운을 받으면 된다.
다음과 같이 Download ZIP을 한 다음에 설치를 하면 된다.
설명을 영문으로 되어 있는 부분을 옮겨와본다.
painlessMesh is a library that takes care of the particulars of creating a simple mesh network using esp8266 and esp32 hardware. The goal is to allow the programmer to work with a mesh network without having to worry about how the network is structured or managed.
True ad-hoc networking
painlessMesh is a true ad-hoc network, meaning that no-planning, central controller, or router is required. Any system of 1 or more nodes will self-organize into fully functional mesh. The maximum size of the mesh is limited (we think) by the amount of memory in the heap that can be allocated to the sub-connections buffer and so should be really quite high.
JSON based
painlessMesh uses JSON objects for all its messaging. There are a couple of reasons for this. First, it makes the code and the messages human readable and painless to understand and second, it makes it painless to integrate painlessMesh with javascript front-ends, web applications, and other apps. Some performance is lost, but I haven’t been running into performance issues yet. Converting to binary messaging would be fairly straight forward if someone wants to contribute.
Wifi & Networking
painlessMesh is designed to be used with Arduino, but it does not use the Arduino WiFi libraries, as we were running into performance issues (primarily latency) with them. Rather the networking is all done using the native esp32 and esp8266 SDK libraries, which are available through the Arduino IDE. Hopefully though, which networking libraries are used won’t matter to most users much as you can just include painlessMesh.h, run the init() and then work the library through the API.
painlessMesh is not IP networking
painlessMesh does not create a TCP/IP network of nodes. Rather each of the nodes is uniquely identified by its 32bit chipId which is retrieved from the esp8266/esp32 using the system_get_chip_id() call in the SDK. Every node will have a unique number. Messages can either be broadcast to all of the nodes on the mesh, or sent specifically to an individual node which is identified by its `nodeId.
Limitations and caveats
Try to avoid using delay() in your code. To maintain the mesh we need to perform some tasks in the background. Using delay() will stop these tasks from happening and can cause the mesh to lose stability/fall apart. Instead we recommend using the scheduler included in painlessMesh. That scheduler is a slightly modified version of the TaskScheduler library. Documentation can be found here. For other examples on how to use the scheduler see the example folder.
painlessMesh subscribes to WiFi events (ESP8266 and ESP32). Please be aware that as a result painlessMesh can be incompatible with user programs/other libraries that try to bind to the same events.
Try to be conservative in the number of messages (and especially broadcast messages) you sent per minute. This is to prevent the hardware from overloading. Both esp8266 and esp32 are limited in processing power/memory, making it easy to overload the mesh and destabilise it. And while painlessMesh tries to prevent this from happening, it is not always possible to do so.
Messages can go missing or be dropped due to high traffic and you can not rely on all messages to be delivered. One suggestion to work around is to resend messages every so often. Even if some go missing, most should go through. Another option is to have your nodes send replies when they receive a message. The sending nodes can the resend the message if they haven’t gotten a reply in a certain amount of time.
그런데 잘 보면 아래쪽에 설명이 나오는데 몇 가지의 라이브러리를 추가로 설치가 되어야 한다.
ArduinoJson https://github.com/bblanchon/ArduinoJson
TaskScheduler https://github.com/arkhipenko/TaskScheduler
ESPAsyncTCP (ESP8266) https://github.com/me-no-dev/ESPAsyncTCP
AsyncTCP (ESP32) https://github.com/me-no-dev/AsyncTCP
이 네 가지를 설치하고 나서 painlessmesh를 설치하면 된다. 총 5가지의 라이브러리를 설치
그 다음에 예제가 생성된다.
이 중에서 startHere이라는 녀석을 실행을 시켜본다.
이녀석은 노드가 하나만 있으면 일정 시간 간격마다 LED가 잠깐 켜졌다가 꺼지고 둘이 있으면 둘이 동기화되면서 일정 시간 간격마다 2개의 노드의 LED가 동시에 2번 깜박거리고 세 개가 있으면 동기화 시간을 거친 후에 3개의 노드의 LED가 동시에 3번 깜박거리는 식으로 동작한다.
아주 재미있고 바로 동작을 확인가능하니까 테스트에 좋은 것 같다.
코드는 다음에 확인하기로 하고..
일단 세 개의 WEMOS D1 Mini에 각각 동일한 startHere.ino 프로그램을 컴파일해서 다운로드한다.
그리고 동작을 살펴본다. 잘 되는 것 같다.
여기에 WEMOS D1 보드 (Mini 말고)에도 같이 다운로드해봤다.
보드설정에서 WEMOS D1 R2 & Mini로 되어 있는 것을 선택하였으므로 같은 게 설치된다.
내가 갖고 있는 WEMOS D1 R2 보드가 2개인데 조금 다운로드가 쉽지 않고 자꾸 에러가 나긴 했는데
설치하니 잘 되어 내가 갖고 있는 WEMOS D1 보드 5개가 모두 연동하여 동작하는 것까지는 확인했다.
이제 해야 할일
1) 3개의 노드에 각각 센서를 붙이고 그 데이터를 공유하기
2) WEMOS D1에 LCD 붙이기
3) LCD에서 데이터 모니터링하기
4) 라즈베리파이에서 이 녀석을 모니터링하기 (가장 좋은 방법은 Serial로 데이터를 주는 방법이다. 즉 노드 중 대장노드를 라즈베리파이에 장착한 다음에 그 데이터를 받아오는 방법)