Categories
บทความ

การใช้งาน UDP multicast สำหรับ ESP8266 ด้วย Arduino IDE

ก่อนอื่นต้องขออธิบายคำศัพท์ที่เกี่ยวข้องก่อนดังนี้ครับ UDP ย่อมาจาก User Datagram Protocol เป็นโปรโตคอลที่อยู่บน IP อีกทีหนึ่ง การรับส่งข้อมูลต่างๆจะขึ้นอยู่กับผู้ใช้งานว่าจะรับส่งอะไรบ้าง คล้ายๆกับการรับส่งข้อมูลผ่าน UART หรือ RS232 ไม่มีการตรวจสอบว่าข้อมูลที่ส่งไปนั้นถึงผู้รับหรือไม่ โดยผู้ใช้งานต้องเขียนโปรแกรมตรวจสอบความถูกต้องเอง ข้อดีของโปรโตคอล UDP คือใช้งานง่าย เขียนรับส่งข้อมูลโดยผู้ใช้เป็นคนกำหนดเอง
คำศัพท์ต่อไปก็คือ Unicast, Multicast, Broadcast Unicast คือการรับส่งข้อมูลระหว่าง IP ต่อ IP หรือเรียกว่าเครื่องต่อเครื่อง ส่วน Multicast เป็นการรับส่งข้อมูลเป็นกลุ่ม โดยจะกำหนดกลุ่มของ IP สำหรับ Multicast เอาไว้ ส่วน Broadcast เป็นการส่งข้อมูลไปยังทุกๆ IP ในเครือข่าย อุปกรณ์ที่เชื่อมต่อในเครือข่ายทั้งหมดจะได้รับข้อมูลที่ตัวส่ง ส่งออกมา

Jpeg
ESP8266 UDP Multicast

ในบทความนี้จะนำบอร์ด nodemcu 2 บอร์ด มาเขียนโปรแกรมเพื่อรอรับข้อมูลทาง UDP โดยจะรอรับข้อมูลบน IP address ที่เป็น IP สำหรับ Multicast คือ 239.0.0.57 แล้วส่ง IP address ของบอร์ดไปให้กับโปรแกรมบนคอมพิวเตอร์ โดยโปรแกรมบนคอมพิวเตอร์ที่ใช้สำหรับการรับส่งข้อมูลคือโปรแกรม Packet Sender มีทั้งแบบติดตั้งลงเครื่องและแบบ Portable ครับ

ด้านล่างเป็น Source code ที่ใช้เป็นตัวรับส่ง UDP Multicast เขียนบน Arduino IDE

// UDP multicast with ESP8266 by Jirawat Kongkaen
// www.micro.in.th
// 2015-09-22
// hardware use nodemcu v0.9

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

// เปลี่ยน SSID และ password ให้ตรงกับ Access point
char ssid[] = "**********";
char pass[] = "**********";

char packetBuffer[255];
char replyBuffer[255];

// พอร์ทและ IP address สำหรับ UDP multicast
unsigned int localPort = 5555;
byte ipMulti[] = { 239,0,0,57 };

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();

  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Starting UDP");
  Udp.beginMulticast(WiFi.localIP(), ipMulti, localPort);
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());

  pinMode(BUILTIN_LED, OUTPUT);
}

void loop() {
  // ตรวจสอบว่ามี packet UDP เข้ามาหรือยัง
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // อ่านข้อมูลจาก packet UDP แล้วเก็บไว้ที่ buffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len] = 0;
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    if(packetBuffer[0] == 'i' && packetBuffer[1] == 'p' && packetBuffer[2] == '?')
    {
      // ส่ง IP ของบอร์ด ESP8266 กลับไปยังคอมพิวเตอร์
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      IPAddress ip = WiFi.localIP();
      sprintf(replyBuffer, "%d.%d.%d.%d\0", ip[0], ip[1], ip[2], ip[3]);
      Udp.write(replyBuffer);
      Udp.endPacket();
    }
  }
  
  blinkLed();
}

// LED กระพริบโดยไม่ใช้ delay
void blinkLed(void)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis >= 500)
  {
    previousMillis = currentMillis;
    if(digitalRead(BUILTIN_LED))
    {
      digitalWrite(BUILTIN_LED, LOW);
    }
    else
    {
      digitalWrite(BUILTIN_LED, HIGH);
    }
  }
}

รูปจาก Serial port monitor และโปรแกรม Packet Sender ที่ใช้สำหรับรับส่งข้อมูล UDP multicast
esp8266-udp-multicast-1
esp8266-udp-multicast-2 esp8266-udp-multicast-3

Categories
บทความ

การใช้งาน ESP8266 บน Arduino IDE

ESP8266 เป็น IC wifi ราคาประหยัดสำหรับใช้งานเป็น IoT หรือ Internet of Thing โดยทางผู้ผลิต IC ตัวนี้เปิด source code ของตัว IC ให้เป็นแบบ open source ทำให้มีผู้พัฒนาหลายรายนำเอา ESP8266 ไปปรับแก้ไข firmware และหนึ่งในนั้นก็นำเอาไปสร้างเป็น Arduino core for ESP8266 WiFi chip เพื่อให้เราสามารถเขียนโปรแกรมควบคุม ESP8266 ผ่านทาง Arduino IDE ได้เลย class ต่างๆก็จะคล้ายๆกับ class WiFi ของ Arduino เดิม ทำให้เกิดความสะดวกและรวดเร็วในการพัฒนาโปรแกรมครับ

ขั้นตอนการใช้งาน ESP8266 บน Arduino IDE
ติดตั้ง  Arduino core for ESP8266 WiFi chip โดยเข้าไปที่เมนู File -> Preferences ในช่อง Additional Boards Manager URLs ให้ใส่ http://arduino.esp8266.com/stable/package_esp8266com_index.json แล้วกดปุ่ม OK
arduino-esp8266-0
หลังจากนั้นให้เลือกที่เมนู Tools -> Board: “xxxxxxxxxxxx” -> Boards Manager
arduino-esp8266-1
ที่หน้าต่าง Boards Manager ในช่อง Type ให้เลือกเป็น Contributed แล้วเลือก esp8266 by ESP8266 Community แล้วคลิกที่ปุ่ม Install และรอจนกว่าการติดตั้งจะเสร็จ
arduino-esp8266-2
หากติดตั้งไฟล์สำหรับ ESP8266 เสร็จแล้ว ให้เข้าไปที่เมนู Tools -> Board: “xxxxxxxxx” แล้วเลือกบอร์ดที่เราใช้งานอยู่ ตัวอย่างเช่น ผมใช้บอร์ด nodemcu v0.9 อยู่ก็ให้เลือก NodeMCU 0.9 (ESP-12 Module) หรือหากไม่มีบอร์ดให้เลือกก็เลือกที่ Generic ESP8266 Module แล้วตั้งค่า CPU Frequency, และ Flash รวมทั้ง COM Port ให้ตรงกับค่าที่ใช้บนบอร์ดครับ
arduino-esp8266-3
เมื่อเลือกบอร์ดเสร็จแล้วก็ลอง compile และอัพโหลดโปรแกรมลงไปยัง ESP8266 โดยเลือกที่เมนู File -> Examples -> esp8266 -> Blink
arduino-esp8266-4
หลังจากเปิดโปรแกรมตัวอย่างแล้ว ให้กดปุ่ม Flash บนบอร์ด NodeMCU แล้วเสียบสาย USB เข้าไปยังบอร์ด การกดปุ่ม Flash เพื่อให้ ESP8266 เข้าสู่โหมดอัพโหลดข้อมูล เมื่อจ่ายไฟให้กับบอร์ดแล้ว ก็กดปุ่ม Upload แล้วรอจนกว่าจะอัพโหลดเสร็จ
arduino-esp8266-5
หากไม่มีอะไรผิดพลาดก็จะอัพโหลดเสร็จ LED บนบอร์ด NodeMCU ก็จะกระพริบ เป็นอันว่าเราสามารถเขียนโปรแกรม ESP8266 บน Arduino IDE ได้แล้วครับ

Jpeg
Jpeg