หน้าแรก ดูโปรเจกต์ทั้งหมด
Easy

โปรเจกต์ ควบคุม Arduino ของคุณจาก Laptop ผ่าน WiFi ด้วย ESP13

ใช้ ESP 13 Arduino Shield จาก DOIT (ESP8266) เพื่อเชื่อมต่อ Arduino ของคุณเข้ากับ WiFi และควบคุม LED ในขณะที่อ่านค่า input voltage

โปรเจกต์ ควบคุม Arduino ของคุณจาก Laptop ผ่าน WiFi ด้วย ESP13

รายการอุปกรณ์และเครื่องมือ

1x Rotary potentiometer (generic)
🛒 สั่งซื้อ
1x ESP-13 ESP8266 Web Sever Serial WiFi Shield Board Module For Arduino UNO R3
-
}

รายละเอียดและวิธีทำ

ผมกำลังมองหาวิธีง่ายๆ ในการเชื่อมต่อ Arduino เข้ากับเครือข่าย WiFi และสื่อสารข้อมูลไปยังคอมพิวเตอร์หรืออุปกรณ์เครื่องอื่น จากการค้นหาใน Ebay ผมพบ ESP13 shield จาก DOIT และหลังจากสั่งซื้อในราคาประมาณ $10 ตัว shield ก็ส่งมาถึงมือผม

ESP13 shield เชื่อมต่อกับ Arduino Uno

บทนำ

ผมกำลังมองหาวิธีง่ายๆ ในการเชื่อมต่อ Arduino เข้ากับเครือข่าย WiFi และสื่อสารข้อมูลไปยังคอมพิวเตอร์หรืออุปกรณ์เครื่องอื่น จากการค้นหาใน Ebay ผมพบ ESP13 shield จาก DOIT และหลังจากสั่งซื้อในราคาประมาณ $10 ตัว shield ก็ส่งมาถึงมือผม

หลังจากหาข้อมูลในฟอรัมต่างๆ เกี่ยวกับ ESP13 Arduino shield จาก DOIT ดูเหมือนว่าบอร์ดรุ่นนี้จะมีชื่อเสียงที่ไม่ค่อยดีนัก และผมก็สงสัยว่าจะทำให้มันใช้งานได้อย่างไร ผมพบเอกสารประกอบจาก DOIT (ลองค้นหาในเว็บไซต์ของพวกเขาแล้วคุณจะพบเอกสาร) และโพสต์ใน Arduino project hub โดย vectiva ซึ่งให้ข้อมูลพื้นฐานที่เพียงพอสำหรับการทำโปรเจกต์ทั่วไป ชื่อเสียงในแง่ลบนั้นอาจจะถูกกล่าวเกินจริงไปสักหน่อย เพราะผมพบว่า shield นี้ทำงานได้ดีเลยทีเดียว

นี่คือประเด็นสำคัญบางประการที่ผมค้นพบเกี่ยวกับ shield นี้:

  • shield รุ่นนี้และขั้นตอนการใช้งานต่อไปนี้ผลิตโดย DOIT พร้อมเฟิร์มแวร์เฉพาะ และไม่ควรสับสนกับบอร์ดที่คล้ายกันซึ่งผลิตโดย Keyes โดยสามารถระบุได้จากโลโก้ DOIT และเว็บไซต์บนลายสกรีนใกล้กับ dip switches ทั้งสองตัว (ดูในภาพประกอบ)
  • มันเป็น Arduino shield ที่สมบูรณ์และประกอบเข้ากับ Arduino Uno ได้พอดี ในโพสต์อื่นๆ มีการบ่นว่าสาย RX และ TX จาก Arduino ไปยัง shield นั้นสลับกัน แต่เวอร์ชันของผมไม่มีปัญหานี้และใช้งานได้ตั้งแต่ครั้งแรก
  • ESP13 หมายถึงโมเดลเฉพาะของ ESP8266 ที่รวมอยู่ใน shield นี้ คำอธิบายฉบับเต็มคือ ‘ESP13: ESP8266 Remote Serial Wireless WIFI transceiver module AP+STA’ คุณสามารถตรวจสอบสเปกได้ใน ESP8266 community forums
  • shield นี้มีฟีเจอร์ที่มีประโยชน์หลายอย่าง ซึ่งเมื่อทำความเข้าใจแล้วจะทำให้ใช้งานได้ง่ายขึ้น:
  • มีตัว regulator แปลงแรงดัน 5V เป็น 3.3V ในตัว ซึ่งช่วยจัดการความต้องการแรงดันไฟฟ้าที่แตกต่างกันระหว่าง Arduino และ ESP8266
  • Digital pins 2 – 13 และ Analog Pins 0 – 3 ของ Arduino พร้อมใช้งานบน shield ทำให้เชื่อมต่อกับ Input/Output ต่างๆ ได้ง่าย
  • ESP8266 GPIO pins ก็มีให้ใช้งานเช่นกัน หากคุณต้องการเชื่อมต่อโดยตรง
  • dip switches สองตัวช่วยให้สามารถตัดการเชื่อมต่อ Arduino TX, RX ออกจาก shield ได้ เพื่อให้สามารถโปรแกรม Arduino แยกต่างหากในขณะที่เสียบ shield ค้างไว้ได้
  • หากคุณต้องการ flash เฟิร์มแวร์ใหม่ให้กับ ESP8266 ก็มีจุดเชื่อมต่อและปุ่มกดให้พร้อม โดยไม่จำเป็นต้องสร้างวงจรภายนอกเพิ่มเติม

ในระดับการทำงานทั่วไป shield นี้ทำหน้าที่เป็นตัวรับส่งข้อมูลแบบ Serial ผ่านเครือข่าย WiFi เมื่อกำหนดค่าแล้ว Arduino จะส่งและรับข้อมูลโดยใช้ฟังก์ชัน Serial.print() และ Serial.readstring() เพื่อสื่อสารกับ remote host ผ่านเครือข่ายไร้สาย

โปรเจกต์นี้จะแสดงวิธีการเขียนโปรแกรม Python ที่ทำงานบนแล็ปท็อป (หรือเวิร์กสเตชัน) เพื่ออ่านค่า Analog จาก potentiometer และควบคุมความสว่างของ LED ที่เชื่อมต่อกับ Arduino โดยมีขั้นตอนหลักๆ ดังนี้:

  • ประกอบ shield เข้ากับ Arduino และเชื่อมต่อ LED กับ potentiometer
  • กำหนดค่า (Configure) โมดูล ESP13
  • รันโปรแกรม Python บนแล็ปท็อป
  • เชื่อมต่อ ESP13 เข้ากับโปรแกรม Python
  • ใช้ส่วนติดต่อของโปรแกรมบนแล็ปท็อปเพื่อควบคุมความสว่างของ LED และอ่านค่าจาก Analog input

หมายเหตุเกี่ยวกับการเขียนโปรแกรม Socket

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 โปรแกรมจึงต้องทำหน้าที่ในส่วนของฟังก์ชันทั้งหมดที่อยู่เหนือชั้นนั้นขึ้นไป

การกำหนดค่า Arduino

เชื่อมต่อ ESP13 Shield เข้ากับ LED และ Potentiometer

ประกอบ 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);
}
}

การกำหนดค่าโมดูล ESP8266

โมดูล ESP13 ถูกกำหนดค่าผ่านหน้าเว็บที่ให้บริการโดย ESP8266 โดยมีขั้นตอนดังนี้:

  • ก่อนเริ่ม ให้เชื่อมต่อแล็ปท็อปหรือคอมพิวเตอร์เข้ากับเครือข่ายไร้สายที่คุณจะใช้สื่อสารกับ Arduino จากนั้นตรวจสอบ IP address ของคอมพิวเตอร์หรือแล็ปท็อปในเครือข่ายนี้ (เช่น ใช้คำสั่ง ipconfig ใน windows) และจดบันทึกไว้
  • จ่ายไฟให้ Arduino - สิ่งนี้จะจ่ายไฟให้กับ ESP13 shield ด้วย
  • ตัดการเชื่อมต่อแล็ปท็อปหรือคอมพิวเตอร์จากเครือข่ายที่ใช้ในขั้นตอนที่ 1 ค้นหาเครือข่าย WiFi ที่มีอยู่ และคุณควรจะเห็นเครือข่ายที่ชื่อว่า DoitWiFi_Config ให้เชื่อมต่อกับเครือข่ายนี้ โดยปกติจะไม่มีรหัสผ่าน หากต้องการรหัสผ่านจะเป็น 12345678
  • เปิดเบราว์เซอร์และไปที่แอดเดรส http://192.168.4.1 ซึ่งจะปรากฏหน้าการกำหนดค่าของ ESP13
หน้าการกำหนดค่า ESP
  • ตั้งค่า Baud rate เป็น 115200
  • ใช้ปุ่ม Refresh เพื่อค้นหาเครือข่าย WiFi ที่มีอยู่ และเลือกเครือข่าย WiFi ที่คุณต้องการใช้สื่อสารจากรายการดรอปดาวน์ AP List ช่องสีเทาจะถูกเติมข้อมูลโดยอัตโนมัติ
  • ใส่รหัสผ่านของเครือข่าย
  • ภายใต้ NetWork Setting ให้เลือก Client และ TCP จากนั้นตั้งค่า remote port เป็น 9000
หน้าการกำหนดค่า ESP
  • ในส่วน remote IP ให้ใส่ IP address ที่คุณบันทึกไว้ในขั้นตอนที่ 1 ของส่วนนี้ ซึ่งก็คือ IP address ของแล็ปท็อปหรือคอมพิวเตอร์ของคุณในเครือข่าย WiFi ที่ใช้สื่อสาร
  • กด Submit ทาง ESP13 Shield จะขอการยืนยัน (คลิก OK) และตัว shield จะทำการรีบูต
  • ไฟสีน้ำเงินบน shield จะกะพริบสองสามวินาทีแล้วเปลี่ยนเป็นไฟค้าง ซึ่งแสดงว่าเชื่อมต่อกับเครือข่าย WiFi สำเร็จแล้ว ให้เปิดไฟเลี้ยง Arduino ค้างไว้
  • ตอนนี้ให้ตั้งค่า dip switches (1 และ 2) ไปที่ตำแหน่ง ‘ON’ เพื่อเริ่มการสื่อสาร Serial ระหว่าง Arduino และ ESP8266 บน shield (ห้ามลืมขั้นตอนนี้ มิฉะนั้นส่วนที่เหลือจะใช้งานไม่ได้)

โปรแกรม Python

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

จุดสังเกตเล็กน้อยเกี่ยวกับโปรแกรม:

  • ผมไม่ใช่โปรแกรมเมอร์ Python ดังนั้นโปรดอย่าวิจารณ์โค้ดมากนัก คุณสามารถปรับปรุงให้ดีขึ้นได้ตามสบาย
  • คุณต้องใช้ไลบรารี tkinter และ socket เพื่อรันโปรแกรม หากมีข้อผิดพลาดให้ใช้ PIP ในการติดตั้ง
  • โปรแกรมควรทำงานได้ทั้งบน Linux, Windows และ Mac ผมได้ทดสอบบน Ubuntu Linux และ Windows 7 แล้ว
  • โปรแกรมใช้ tkinter เพื่อสร้างส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) หากคุณสนใจที่จะปรับปรุงอินเทอร์เฟซ สามารถศึกษาแหล่งข้อมูลอินเทอร์เน็ตต่างๆ เกี่ยวกับการเขียนโปรแกรม tkinter (เช่น https://realpython.com/python-gui-tkinter/)
  • อ้างอิงจากคำอธิบายในโปรแกรมสำหรับคำแนะนำทั่วไปเกี่ยวกับการทำงานของโปรแกรม

เปิดรันโปรแกรมจากหน้าต่าง terminal ใน Linux หรือใช้ command prompt ใน Windows หากใช้งานไม่ได้ โปรดอ้างอิงจากเอกสารประกอบเกี่ยวกับวิธีการรันโปรแกรม python

รันโปรแกรมจากหน้าต่าง terminal ของ Linux

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

โปรแกรมสื่อสาร

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

  • คลิกปุ่ม “Initialize” และไดอะล็อกแรกจะแสดงข้อความว่า “Socket created Socket bind Complete”
  • คลิกปุ่ม “Connect” และไดอะล็อกที่สองจะแสดงข้อความ “Connected with 192.168.1.XXX:XXXXX” หรือข้อความที่คล้ายกัน ขึ้นอยู่กับช่วง IP address ของเครือข่าย WiFi ของคุณ
  • ยินดีด้วย ตอนนี้ Arduino ของคุณเชื่อมต่อกับแล็ปท็อปหรือเวิร์กสเตชันผ่านเครือข่าย WiFi แล้ว
โปรแกรมสื่อสาร
  • ตอนนี้คุณสามารถสื่อสารกับ Arduino ผ่าน GUI ได้แล้ว พิมพ์ข้อความใดก็ได้ (สูงสุด 63 ตัวอักษร) ในช่อง “Message to send” แล้วกดปุ่ม “Send” ข้อความของคุณจะถูกส่งตอบกลับมา
  • ปรับแถบเลื่อน “LED Brightness” และกดปุ่ม “LED Update” ตัว LED ที่ต่อกับ Arduino จะเปลี่ยนความสว่าง นอกจากนี้ แถบเลื่อน “Analog Input” จะอัปเดตเพื่อสะท้อนค่าที่ตั้งไว้ของ potentiometer (ระหว่าง 0 ถึง 1024)

ฮาร์ดแวร์ที่เสร็จสมบูรณ์

บทสรุป

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

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: control-your-arduino-from-your-laptop-via-wifi-with-esp13-dac785
699 บาท
PromptPay QR Code