โปรเจกต์ ควบคุม Arduino ของคุณจาก Laptop ผ่าน WiFi ด้วย ESP13
ใช้ ESP 13 Arduino Shield จาก DOIT (ESP8266) เพื่อเชื่อมต่อ Arduino ของคุณเข้ากับ WiFi และควบคุม LED ในขณะที่อ่านค่า input voltage
ใช้ ESP 13 Arduino Shield จาก DOIT (ESP8266) เพื่อเชื่อมต่อ Arduino ของคุณเข้ากับ WiFi และควบคุม LED ในขณะที่อ่านค่า input voltage
ผมกำลังมองหาวิธีง่ายๆ ในการเชื่อมต่อ Arduino เข้ากับเครือข่าย WiFi และสื่อสารข้อมูลไปยังคอมพิวเตอร์หรืออุปกรณ์เครื่องอื่น จากการค้นหาใน Ebay ผมพบ ESP13 shield จาก DOIT และหลังจากสั่งซื้อในราคาประมาณ $10 ตัว shield ก็ส่งมาถึงมือผม
ผมกำลังมองหาวิธีง่ายๆ ในการเชื่อมต่อ Arduino เข้ากับเครือข่าย WiFi และสื่อสารข้อมูลไปยังคอมพิวเตอร์หรืออุปกรณ์เครื่องอื่น จากการค้นหาใน Ebay ผมพบ ESP13 shield จาก DOIT และหลังจากสั่งซื้อในราคาประมาณ $10 ตัว shield ก็ส่งมาถึงมือผม
หลังจากหาข้อมูลในฟอรัมต่างๆ เกี่ยวกับ ESP13 Arduino shield จาก DOIT ดูเหมือนว่าบอร์ดรุ่นนี้จะมีชื่อเสียงที่ไม่ค่อยดีนัก และผมก็สงสัยว่าจะทำให้มันใช้งานได้อย่างไร ผมพบเอกสารประกอบจาก DOIT (ลองค้นหาในเว็บไซต์ของพวกเขาแล้วคุณจะพบเอกสาร) และโพสต์ใน Arduino project hub โดย vectiva ซึ่งให้ข้อมูลพื้นฐานที่เพียงพอสำหรับการทำโปรเจกต์ทั่วไป ชื่อเสียงในแง่ลบนั้นอาจจะถูกกล่าวเกินจริงไปสักหน่อย เพราะผมพบว่า shield นี้ทำงานได้ดีเลยทีเดียว
นี่คือประเด็นสำคัญบางประการที่ผมค้นพบเกี่ยวกับ shield นี้:
ในระดับการทำงานทั่วไป shield นี้ทำหน้าที่เป็นตัวรับส่งข้อมูลแบบ Serial ผ่านเครือข่าย WiFi เมื่อกำหนดค่าแล้ว Arduino จะส่งและรับข้อมูลโดยใช้ฟังก์ชัน Serial.print() และ Serial.readstring() เพื่อสื่อสารกับ remote host ผ่านเครือข่ายไร้สาย
โปรเจกต์นี้จะแสดงวิธีการเขียนโปรแกรม Python ที่ทำงานบนแล็ปท็อป (หรือเวิร์กสเตชัน) เพื่ออ่านค่า Analog จาก potentiometer และควบคุมความสว่างของ LED ที่เชื่อมต่อกับ Arduino โดยมีขั้นตอนหลักๆ ดังนี้:
Sockets ถูกใช้ในทุกเครือข่ายเพื่อสื่อสารข้อมูลระหว่างอุปกรณ์ แม้ว่าคุณอาจไม่ทันสังเกต แต่ทุกครั้งที่คุณใช้เบราว์เซอร์ จะมี socket ฝังอยู่ใน stack เพื่อช่วยในการถ่ายโอนข้อมูลเหล่านั้น Sockets อยู่ใน Session Layer ของ OSI network model และภาษาโปรแกรมส่วนใหญ่จะมีไลบรารีที่ช่วยในการสร้างและจัดการ socket โดย ESP13 WiFi shield จะเชื่อมต่อผ่าน socket และคอมพิวเตอร์หรืออุปกรณ์ที่สื่อสารกับ shield จำเป็นต้องสร้างและรักษาการเชื่อมต่อ socket เพื่อแลกเปลี่ยนข้อมูลนี้
ผมใช้โปรแกรม Python 3 และไลบรารี socket ที่เกี่ยวข้องเพื่ออำนวยความสะดวกในการสื่อสารระหว่าง ESP13 และแล็ปท็อป บทเรียนนี้ไม่ได้มีวัตถุประสงค์เพื่อสอนการเขียนโปรแกรม socket โดยเฉพาะ แต่มีแหล่งข้อมูลมากมายบนอินเทอร์เน็ตที่อธิบายวิธีการทำงานและวิธีนำไปใช้ในโปรแกรม
https://realpython.com/python-sockets/
https://docs.python.org/3/howto/sockets.html
อย่างไรก็ตาม สิ่งที่ควรทราบคือเนื่องจาก socket อยู่ที่ Session Layer ของ OSI model โปรแกรมจึงต้องทำหน้าที่ในส่วนของฟังก์ชันทั้งหมดที่อยู่เหนือชั้นนั้นขึ้นไป

ประกอบ shield เข้ากับ Arduino ตามที่แสดงในรูปแรก จากนั้นเชื่อมต่ออุปกรณ์ต่างๆ เข้ากับ shield ตามที่แสดง
potentiometer สามารถใช้ค่าใดก็ได้ตั้งแต่ 5K ขึ้นไป ส่วนตัวต้านทานที่ต่ออนุกรมกับ LED สามารถใช้ 220 ohms หรือ 330 ohms โดยเชื่อมต่อ potentiometer เข้ากับ A0 input และ LED เข้ากับ Digital output 3 ของ Arduino
ตั้งค่า dip switch (1 และ 2) ไปที่ตำแหน่ง ‘OFF’
อัปโหลด sketch ที่รวมอยู่ในบทเรียนนี้ไปยัง Arduino การตั้งค่าสวิตช์เป็น off จะตัดการเชื่อมต่อ Arduino ออกจาก ESP13 shield ทำให้สามารถดาวน์โหลด sketch ได้ โปรดอ่านคำอธิบายใน sketch เพื่อดูว่าโปรแกรมทำงานอย่างไร
/*
Arduino ESP13 Shield Program
เมื่อ ESP13 shield เชื่อมต่อกับเครือข่าย WiFi แล้ว มันจะส่งข้อมูลผ่านเครือข่ายจาก Arduino ที่
เขียนลงในสาย Serial ข้อมูลทั้งหมดที่ Arduino ส่งและรับผ่านเครือข่าย WiFi จะใช้คำสั่ง Serial.read, Serial.write
และ Serial.print
โปรแกรมนี้รับข้อมูลจากโปรแกรมที่รันบนแล็ปท็อปโดยใช้การเชื่อมต่อ socket
เพื่อแยกแยะระหว่างกรณีการรับ/ตอบกลับธรรมดากับการปรับความสว่าง LED จะมีการส่งสตริง "12#$"
เป็นสี่ไบต์แรก หากตรวจพบสิ่งนี้ ความสว่างของ LED จะถูกอัปเดตและอ่านค่า pot จากการตอบกลับ (สตริงนี้กำหนดขึ้นมาลอยๆ)
หากไม่มีสตริงส่วนหัว Arduino จะส่งข้อความที่ได้รับกลับไปตรงๆ (echo)
*/
String incomingString;
String analogValue;
String headerString;
int ledPin = 3;
void setup() {
// ใส่โค้ด setup ที่นี่ เพื่อรันครั้งเดียว
// Baud rate ของ ESP13 shield ถูกตั้งค่าในการกำหนดค่า
Serial.begin(115200);
}
void loop() {
// ตอบกลับเฉพาะเมื่อได้รับข้อมูล:
if (Serial.available() > 0)
{
// อ่านสตริงที่เข้ามาและแยกสี่ไบต์แรกออก:
incomingString = Serial.readString();
headerString = incomingString.substring(0,4);
// หากสตริงส่วนหัวเท่ากับ "12#$" ให้อัปเดตความสว่าง LED และค่า pot
if (headerString.equals("12#$"))
{
// ลบสี่ไบต์แรกออก ฟังก์ชัน analogWrite ต้องการเลขจำนวนเต็ม จึงต้องมีการแปลงค่า
incomingString.remove(0,4);
analogWrite(ledPin,incomingString.toInt());
// อ่านค่า A0 analog input แปลงเป็นสตริงแล้วส่งกลับ
analogValue = String(analogRead(A0),DEC);
Serial.print(analogValue);
}
else
{
// แสดงสิ่งที่ได้รับ:
Serial.print("ESPRecieved: ");
Serial.flush();
Serial.print(incomingString);
}
}
else
{
delay(500);
}
}
โมดูล ESP13 ถูกกำหนดค่าผ่านหน้าเว็บที่ให้บริการโดย ESP8266 โดยมีขั้นตอนดังนี้:


คุณจำเป็นต้องติดตั้ง Python 3 บนแล็ปท็อปหรือคอมพิวเตอร์ของคุณ สามารถอ้างอิงได้จาก https://www.python.org/ สำหรับการดาวน์โหลดและคำแนะนำในการติดตั้ง หากคุณยังไม่ได้ติดตั้ง
จุดสังเกตเล็กน้อยเกี่ยวกับโปรแกรม:
เปิดรันโปรแกรมจากหน้าต่าง terminal ใน Linux หรือใช้ command prompt ใน Windows หากใช้งานไม่ได้ โปรดอ้างอิงจากเอกสารประกอบเกี่ยวกับวิธีการรันโปรแกรม python

เมื่อโปรแกรมเริ่มทำงาน GUI ต่อไปนี้ควรจะปรากฏขึ้น:

ทำตามขั้นตอนต่อไปนี้อย่างระมัดระวัง โปรแกรมนี้ไม่มีระบบดักจับข้อผิดพลาดมากนัก (เพราะผมเขียน Python ไม่ค่อยเก่ง)


อุปกรณ์ที่โปรแกรมและ sketch นี้ควบคุมและอ่านค่าเป็นเพียงอุปกรณ์พื้นฐาน อย่างไรก็ตาม มันสามารถนำไปขยายผล (extrapolate) สู่การกำหนดค่า Input และ Output ที่ซับซ้อนขึ้นได้ง่าย เมื่อข้อมูลจาก Arduino เข้ามาอยู่ในโปรแกรม Python แล้ว คุณสามารถทำอะไรกับค่าเหล่านั้นได้อีกมากมาย (เช่น การบันทึกข้อมูล, การสร้างกราฟ ฯลฯ)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้