Embedded สัปดาห์ที่ 2 Arduino MQTT and Anto Interface

 Arduino  MQTT and Anto Interface




1. IoT and MQTT
Message Queuing Telemetry Transport (MQTT) เป็นProtocol ที่ออกแบบมาเพื่อการเชื่อมต่อแบบ M2M (machine-to-machine) คืออุปกรณ์กับอุปกรณ์ สนับสนุนเทคโนโลยี iot (Internet of Things) คือเทคโนโลยีที่อินเทอร์เน็ตเชื่อมต่อกับอุปกรณ์ต่าง เช่น โทรศัพท์มือถือ รถยนต์ โทรทัศน์ ตู้เย็น เข้ากับอินเทอร์เน็ตทำให้สามารถเชื่อมโยงสื่อสารกับอุปกรณ์ต่าง ได้ โดยผ่านเครือข่ายอินเทอร์เน็ต ซึ่งจะทำให้มนุษย์สามารถ ควบคุมอุปกรณ์ต่าง จากที่อื่นได้ เช่นการสั่งปิดเปิดไฟในบ้านจากที่อื่น
เนื่องจากโปรโตคอลตัวนี้มีน้ำหนักเบา  ออกแบบมาเพื่อใช้งานกับอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก การรับส่งข้อมูลในเครื่อข่ายที่มีขนาดเล็ก แบนร์วิธต่ำ ใช้หลักการแบบ publisher / subscriber คล้ายกับหลักการที่ใช้ใน Web Service ที่ต้องใช้ Web Server เป็นตัวกลางระหว่างคอมพิวเตอร์ของผู้ใช้ แต่ MQTT จะใช้ตัวกลางที่เรียกว่า Broker เพื่อทำหน้าที่ จัดการคิว รับ - ส่ง ข้อมูลระหว่างอุปกรณ์ และทั้งในส่วนที่เป็น Publisher และ Subscriber  ปัจจุบันเทคโนโลยีที่กำลังมาแรงสำหรับนักพัฒนาด้าน Embedded
IoT มันคืออะไร พอค้นดูมีหลายลิงค์อธิบายไว้มากมาย เช่น Internet of Things เมื่อคอมพิวเตอร์เริ่มคุยกันเองได้ , โลกแห่ง IoT มาถึงแล้ว IoT เทคโนโลยีที่ธุรกิจต้องรู้. ลองนึกภาพดูครับว่าถ้าหากอุปกรณ์สามารถสั่งงานไปมาหากันได้ผ่าน www ไม่ว่าจะเป็น PC, Smart Phone หรือแม้แต่อุปกรณ์ขนาดเล็กพวก Micro-Controller, PLC, HUB, Switch หรืออะไรก็แล้วแต่ที่มันสามารถต่อระบบ Network ไม่ว่ามันจะอยู่ที่บ้าน ที่โรงงาน ไร่ นา ฟาร์มโรงเรือน โรงงานอุตสาหกรรมหรือที่อื่นๆที่มีระบบเน็ตเวอร์ที่เข้าถึง www ได้เราจะสามารถควบคุมมันได้ทั้งหมดที่ไหนก็ได้ในโลกใบนี้
IoT ทำมีวิธีการทำงานอย่างไร องค์ประกอบหลักของ IoT จะมี 3 ส่วนคือ Broker, Publisher และ Subscriber. ซึ่งการรับและส่งข้อมูลนั้นมันจะส่งข้อมูลไปมาหากันนั้นจะส่งผ่านตัวกลางนั้นก็คือ Broker Server โดยตัวส่งนี้จะเรียกว่า Publisher ส่งข้อมูลขึ้นไปยัง Broker พร้อมระบุหัวข้อ (Topic) ที่ต้องการส่งข้อออกไป จากนั้นตัวรับซึ่งเรียกว่า Subscriber ถ้าหากตัวรับต้องการรับข้อมูลจากตัวส่งจะต้องทำการ Subscribe หัวข้อ Topic ของ Publisher นั้นๆ ผ่าน Broker เช่นกัน



IoT
จากรูปภาพด้านบนจะมีตัว Publisher ทำการ Public ข้อความ “Hello” ใน Topic Device1 เมื่อและถ้าหากมีคอมพิวเตอร์ หรืออุปกรณ์อื่นๆทำการ Subscribe หัวข้อ Topic Device1 เมื่อ Publisher ทำการส่งข้อมูลไปยัง Topic อุปกรณ์ Subscribe จะได้ข้อความ “Hello” เช่นเดียวกัน. ก็คล้ายๆกับที่ใช้งานไลน์ที่คุยกันเป็นกลุ่มนั้นเลยครับ. ซึ่งจะเห็นข้อความ “Hello” ในเวลาเดียวกันนั้นหมายความว่าอุปกรณ์ใดๆที่ทำการ Subscribe Topic เดียวกันก็จะได้ข้อความเดียวกันครับ
โปรโตคอลที่ใช้สำหรับรับและส่งข้อมูลนั้นคือ MQTT ปัจจุบันถึง Version 3. 1 ในที่นี้จะมาทำการทดลองส่งข้อมูลกันตัว Server จะมีอยู่ด้วยกันหลายค่ายครับสำหรับที่ลิสมาด้านล่างนี้ครับ
Open Source MQTT Broker Server
·        Mosquitto
·        RSMB
·        ActiveMQ
·        Apollo
·        Moquette
·        Mosca
·        RabbitMQ

MQTT Client
·        Paho
·        Xenqtt
·        mqtt.js
·        node_mqtt_client
·        Ascoltatori
·        Arduino MQTT Client

สำหรับ MQTT Broker Server ฟรีที่ผมพอค้นได้ก็มีดังนี้ครับ
·        test.mosquitto.org
·        broker.mqttdashboard.com




2. Anto

Anto คือสื่อกลางในการสื่อสารและตัวช่วยเหลือที่ช่วยให้คุณสร้างสรรค์นวัตกรรมโดยเฉพาะทางด้าน IoT ได้ง่ายขึ้น โดยที่ไม่ต้องมีปัญหาจุกจิก หรือตั้งค่าอะไรให้วุ่นวาย
Anto เป็นสื่อกลางในการสื่อสาร Anto ตั้งเซิร์ฟเวอร์ให้คุณใช้บริการฟรี เป็นเสมือนตัวกลางในการสื่อสารระหว่างสิ่งต่างๆบนโลกอินเตอร์เน็ตเช่น คุณต้องการสั่งงานบอร์ดไมโครคอลโทรลเลอร์ผ่านอินเตอร์เน็ตโดยใช้โทรศัพท์มือถือของคุณ เป็นต้น ซึ่งปัจจุบันระบบเรารองรับการติดต่อสื่อสารผ่าน HTTP, HTTPS, MQTT, MQTTS, Websocket ทำให้: ทีมของคุณไม่ต้องเสียเวลาในการติดตั้งและตั้งค่าเซิร์ฟเวอร์ รวมถึงคอยมาดูแลรักษาระบบ
Anto สร้าง Library/API ที่ใช้งานง่าย Anto สร้าง Library ในการเขียนโปรแกรมและสร้าง API ให้นักพัฒนาสามารถเข้าถึงใช้งานและพัฒนาต่อยอดได้อย่างง่ายดาย ยกตัวอย่าง คุณสามารถส่งค่าไปยัง server โดยใช้เพียงแค่หนึ่งคำสั่งเช่น Anto.DigitalUpdate(“led”,true); ทั้งนี้เพื่อความง่ายในการเขียนโปรแกรม ซึ่งปัจจุบันเราได้ทำ Library รองรับ ESP8266 (Nodemcu), Arudino แล้ว และกำลังพัฒนาเพื่อให้รองรับ Rasserby Pi และอื่นๆ ทำให้: ทีมของคุณพัฒนาได้อย่างรวดเร็วมากขึ้น ใช้เวลากับส่วนอื่นได้มากขึ้นเช่น การทำฮาร์ดแวร์-กลไก การออกแบบผลิตภัณฑ์ เรื่องติดต่อธุรกิจอื่น เป็นต้นครับ

ขั้นตอนเตรียมพร้อม
1.     ติดตั้ง Arduino IDE ที่รองรับ ESP8266
·        ดาว์โหลด และ ติดตั้ง Arduino IDE v1.6.9+
·        ทำให้ Arduino IDE ของเรารู้จักกับบอร์ด ESP8266 เข้าเมนู File > Preferences จากนั้น        ใส่ข้อความว่า                        http://arduino.esp8266.com/stable/package_esp8266com_index.json ลงไป        ในช่อง Additional Board Manager URLs แล้วกดตกลง
·        Install lib โดยเข้าเมนู Tools > Boards Manager พิมพ์ในช่องค้นหาว่า esp8266
·        จากนั้นกดเลือก Install รอการติดตั้งสักครู่
2.     ติดตั้ง Lib Anto และ สมัครสมาชิก Anto
·        ดาวน์โหลด Lib Anto (Ver. 0.5.2) แล้วแตกไฟล์ที่ดาวน์โหลด เปลี่ยนชื่อโฟลเดอร์เป็น                AntoIO
·        วางโฟลเดอร์ AntoIO ไปไว้ที่ Documents > Arduino > Libraries
·        สมัครสมาชิกเป็นครอบครัว Anto กรอกข้อมูลให้ครบถ้วนแล้วกดยืนยันการสมัคร
·        Login เข้าสู่ระบบ


การทดลอง Test MQTT

        Step1 กำหนดตัว Subscribe   สำหรับเครื่องมีสำหรับทดสอบที่จะทำการส่งข้อมูล(pub) และรับข้อมูล(sub) ก็มีอยู่ด้วยกันหลายตัวครับเช่น แต่ละเลือกมาใช้งานสักตัวหนึ่ง ในที่นี้ผมเลือกเป็น plugin สำหรับ chrome คือ MQTTLens




Mqttlens


mqttlens
เปิด MQTTLens ขึ้นมาจากนั้นป้อนรายละเอียด เมื่อป้อนรายละเอียดครบให้คลิกที่ CREATE CONNECTION
·        Connection Name: test_MQTT           ß อะไรก็ได้    
·        Hostname:            test.mosquitto.org
·        Port:                     1883                     ß default = 1883
·        Client ID:              RXL77Nb            ß ตามที่ MQTTLens ให้มา


mqttlens
        Subscribe: sexysut
                    ในที่นี้ผมจะทำการ Subscriber ที่ Topic ชื่อว่า sexysut

การทดลอง Test Anto

1. เริ่มต้นโปรเจค: ควบคุมหลอดไฟ LED ผ่าน Internet


ในบทนี้เราจะพูดถึงตัวอย่างในการคุม การเปิด/ปิด หลอดไฟ LED ได้ง่ายๆผ่านอินเทอร์เน็ต และแน่นอนว่ามันทำงานผ่านเว็บบราวเซอร์ ดังนั้นคุณจะสามารถควบคุมหลอดไฟของคุณผ่าน smart phone ก็ได้ เพียงเปิดเว็บบราวเซอร์บน smart phone

สิ่งที่ต้องเตรียมพร้อม   จากเตรียมการเบื้องต้นสำหรับ Anto (คุณสามารถดูรายละเอียดได้ ที่นี่)

          - สัญญาณ WiFi ในการเชื่อมต่อ nodeMCU กับ Internet

          - Prototype Board

          - LED 3 ตัว ตัวต้านทาน

          - R 330(หรือ < 10k) 3ตัว

          - สายจัมป์



การสร้าง Thing และ Channels

          -  Thing ก็คือ อุปกรณ์ที่เชื่อมต่อกับ Anto เช่น NodeMCU , ESP8266 เป็นต้น
          -  Channel ก็คือ ช่องเก็บข้อมูลต่างๆ เช่น ข้อมูลของเซนเซอร์วัดอากาศ ข้อมูลการกดปุ่ม  เป็นต้น

                        ตัวอย่างเช่น ในโปรเจคนี้  เราใช้ NodeMCU หนึ่งตัวในการควบคุม LED 3 หลอด            

                            -  เราต้องสร้างก็คือ เรามี NodeMCU (1 Thing) ที่ต้องการเก็บค่าในการควบคุม LED (3 Channel) 

                            -  ซึ่งสุดท้ายแล้วเวลาที่เราจะอ้างอิงถึงข้อมูล ไม่ว่าจะดึงค่าหรือเก็บค่า จะอ้างอิง       ถึง Thing และ Channel

     ขั้นตอนการสร้าง                    
                   -  Login เข้าสู่เว็บไซค์ กรอก Username และ Pasword ให้ถูกต้อง
                   -  กดเข้าไปที่ Thing จากเมนูทางด้านซ้าย
                     -
 กด +Add new thing ตามรูป
                     -  กรอกตามด้านล่าง แล้วกด Add new                                   
                                         NAME : NodeMCU                                     
                                         DESCREIPTION : Example control LED                     
                     -  เมื่อสร้างเสร็จแล้วจะได้ดังภาพ                           

                      -  จากนั้น  กดไปที่เครื่องหมายตามภาพด้านล่างของ Thing NodeMCU
                     -  กด Create new channel ในการสร้าง Channel สำหรับ LED1 โดยกรอกตามที่กำหนด แล้วกด Add new                                        
                                      NAME : LED1DE

                                      SCREIPTION : controlLED1

                                           TYPE : Switch on/off

                      -  เมื่อสร้าง  LED1 เสร็จแล้ว สร้าง Channel LED2 และ LED3 เมื่อสร้างทั้งหมดเสร็จแล้วจะได้ดังภาพ






                           -   เข้ามาที่แถบเมนู Key ทางด้านซ้ายมือเพื่อเข้ามาสร้าง key ในการเชื่อมต่อฮาร์ดแวร์      แล้วกด Create new key ในการสร้าง key แล้วกรอกตามด้านล่างรูปภาพ 

                -   DESCREIPTION : NodeMCUkey
                                             -   แล้วกดเลือก Permission ให้กับ Chanal ทั้ง 3 เป็น Read และ Update 
                                             -   แล้วกด Add new 
            

                      การเขียนโปรแกรม   

                             -  เปิดเข้าโปรแกรม Arduino IDE เลือกบอร์ดที่ใช้เป็น NodeMCU
                             -  เลือก Port ในการลงโปรแกรม
                             -   เปิดโปรแกรม File > Example > Anto-esp8266-arduino > DigitalOutputGPIO
                             -   แก้ไขส่วน Anto
                                  USER Name  , Key ,  Thing Name ,  Name ของแต่ละ Channel 
                            -   แก้ไขส่วน Wifi 
                                              SSID (ชื่ออินเตอร์เน็ต Wifi ของเรา)  ,  Password (รหัสผ่าน Wifi)
                            -   Upload โปรแกรม             
                       Code :
                    
#include <AntoIO.h>

                          /* see NodeMCU v1.0 pinout for more GPIO port details. */
                          #define LED1 5  // D1
                          #define LED2 4  // D2
                          #define LED3 0  // D3

                          // username of anto.io account
                          const char *user = "WHCWHC78";

                         // key of permission, generated on control panel anto.io
                         const char* key = "Y9hHIBjdwPEOZo6c7SafNiz3X0snuJLRTFqgDKrU";
              
                         // your default thing.
                         const char* thing = "weather_station";

                        // create AntoIO object named anto.
                        // using constructor AntoIO(user, key, thing)
                        // or use AntoIO(user, key, thing, clientId)
                        // to generate client_id yourself.
                        AntoIO anto(user, key, thing);

                       int value = 0;
             
                       void setup() {
                           // SSID and Password of your WiFi access point.
                           const char* ssid = "ssid";
                           const char* pwd  = "pwd";

                           Serial.begin(115200);
                           delay(10);

                           Serial.println();
                           Serial.println();
                           Serial.print("Anto library version: ");
                           Serial.println(anto.getVersion());
                           Serial.print("Connecting to ");
                           Serial.println(ssid);

                           // Connect to your WiFi access point
                           if (!anto.begin(ssid, pwd)) {
                                Serial.println("Connection failed!!");

                          // Stop everything.
                         while (1);
                          }

                          Serial.println();
                          Serial.println("WiFi connected");  

                          pinMode(LED0, OUTPUT);
                          pinMode(LED1, OUTPUT);
                          pinMode(LED2, OUTPUT);
                          pinMode(LED3, OUTPUT);
}

                    void loop() {
                          delay(5000);
                          ++value;

                          bool var = LOW;

                          var = anto.digitalGet("smartPlug02");
                          digitalWrite(LED1, var);
                          Serial.print("LED1: ");
                          Serial.println(var);

                          var = anto.digitalGet("smartPlug03");
                          digitalWrite(LED2, var);
                          Serial.print("LED2: ");
                          Serial.println(var);

                         var = anto.digitalGet("smartPlug04");
                         digitalWrite(LED3, var);
                         Serial.print("LED3: ");
                         Serial.println(var);
                         Serial.println(value);
                   }











Comments

Popular posts from this blog

VHDL

Embedded สัปดาห์ที่ 9 NI labview 2014

ทดสอบการใช้งาน Rasberry Pi3 ต่อกับกล้อง WebCam