สารบัญ:

ESP8266 การสื่อสารข้อมูลโดยตรง: 3 ขั้นตอน
ESP8266 การสื่อสารข้อมูลโดยตรง: 3 ขั้นตอน

วีดีโอ: ESP8266 การสื่อสารข้อมูลโดยตรง: 3 ขั้นตอน

วีดีโอ: ESP8266 การสื่อสารข้อมูลโดยตรง: 3 ขั้นตอน
วีดีโอ: EP.26 ESP32 Server vs 4x ESP8266 Client Communication สื่อสารข้อมูลในเครือข่าย esp32 server 2024, กรกฎาคม
Anonim
ESP8266 การสื่อสารข้อมูลโดยตรง
ESP8266 การสื่อสารข้อมูลโดยตรง

บทนำ

ในขณะที่ทำบางโครงการกับ Arduinos และโมดูล nRF24l01 ฉันสงสัยว่าฉันจะประหยัดความพยายามโดยใช้โมดูล ESP8266 แทนได้หรือไม่ ข้อดีของโมดูล ESP8266 คือมีไมโครคอนโทรลเลอร์บนบอร์ด ดังนั้นจึงไม่จำเป็นต้องมีบอร์ด Arduino เพิ่มเติม นอกจากนี้ ขนาดหน่วยความจำของ ESP8266 นั้นใหญ่กว่ามากและในแง่ของความเร็ว ESP8266 จะทำงานที่สูงสุด 160MHz แทนที่จะเป็น 16MHz ของ Arduino แน่นอนว่ามีด้านลบอยู่บ้าง

ESP8266 ทำงานบน 3.3V เท่านั้น มีพินน้อยกว่าและไม่มีอินพุตอะนาล็อกที่ดีที่ Arduino มี (มีหนึ่งอัน แต่สำหรับ 1.0V เท่านั้นไม่ใช่ 3.3V) นอกจากนี้ยังมีตัวอย่างโค้ดอีกมากมายสำหรับ Arduino + nRF24l01 จากนั้นมีสำหรับ ESP8266 โดยเฉพาะเมื่อต้องถ่ายโอนข้อมูลโดยตรง

ดังนั้น เมื่อคำนึงถึงโปรเจ็กต์แล้ว ฉันจึงมองหาหัวข้อของการถ่ายโอนข้อมูลที่รวดเร็วและน้ำหนักเบาระหว่าง ESP8266 สองตัวโดยไม่ต้องใช้ WWW และ HTTP ทั้งหมด

ขณะค้นหาตัวอย่างทางอินเทอร์เน็ต (รหัสด้านล่างส่วนใหญ่ถูกเลือกจากเน็ตในที่ต่างๆ) ฉันพบคำถามมากมายเกี่ยวกับวิธีการใช้การถ่ายโอนข้อมูลโดยตรงโดยไม่มีตัวอย่าง "ทำเช่นนั้น" ที่ดี มีโค้ดตัวอย่างอยู่บ้าง แต่ส่วนใหญ่มีคำถามว่าเหตุใดจึงใช้งานไม่ได้

ดังนั้น หลังจากที่ได้อ่านและพยายามทำความเข้าใจแล้ว ฉันได้สร้างตัวอย่างด้านล่าง ซึ่งช่วยให้สามารถถ่ายโอนข้อมูลระหว่าง ESP8266 สองเครื่องได้อย่างรวดเร็วและง่ายดาย

ขั้นตอนที่ 1: ขอบเขตและภูมิหลัง (TCP กับ UDP)

ในการไปถึงจุดนั้น ขอบเขตบางส่วนต้องได้รับการชี้แจงเมื่อเปรียบเทียบกับ nRF24l01

ในการใช้ ESP8266 ภายในสภาพแวดล้อม Arduino ไลบรารีพื้นฐานที่ใช้คือ ESP8266WiFi.h อาจแตกต่างกัน แต่ตัวอย่างส่วนใหญ่ใช้ที่กล่าวถึง เมื่อใช้สิ่งนี้ คุณต้องทำให้การสื่อสารของคุณมีระดับ WiFi

ดังนั้นในการสื่อสารอย่างน้อยต้องมีจุดเชื่อมต่อ (AP) / เซิร์ฟเวอร์และไคลเอนต์ AP ระบุชื่อเครือข่ายและที่อยู่ IP และไคลเอ็นต์จะเชื่อมต่อกับเซิร์ฟเวอร์นี้

ดังนั้นเมื่อเปรียบเทียบ nRF24l01 โดยที่รหัสที่ปลายทั้งสองข้างจะเหมือนกันมากหรือน้อย (ยกเว้นช่องสัญญาณการส่งสัญญาณ) รหัสของ ESP8266 นั้นแตกต่างกันโดยพื้นฐาน เนื่องจากตัวหนึ่งถูกกำหนดค่าเป็น AP และอีกตัวหนึ่งเป็นไคลเอนต์

หัวข้อต่อไปคือ แทนที่จะเพียงแค่ส่งบางไบต์ไปยัง nRF24l01 สำหรับโปรโตคอลการถ่ายโอน ESP8266 จำเป็นต้องได้รับการสังเกต

มีสองโปรโตคอลที่ใช้กันทั่วไป: TCP และ UDP

TCP (Transmission Control Protocol) เป็นโปรโตคอลที่อนุญาตการส่งข้อมูลระหว่างเซิร์ฟเวอร์และไคลเอนต์โดยไม่สูญเสีย โปรโตคอลนี้รวม "การจับมือ" (แฟล็กและการยอมรับจำนวนมากที่ส่งระหว่างทั้งสองฝ่าย) และการกำหนดหมายเลขแพ็กเก็ตและการตรวจจับเพื่อระบุและส่งแพ็กเก็ตที่สูญหายอีกครั้ง นอกจากนี้ โดยใช้การจับมือทั้งหมดเหล่านี้ โปรโตคอลจะป้องกันข้อมูลสูญหายเนื่องจากแพ็กเก็ตจำนวนมากส่งพร้อมกันในเครือข่าย แพ็กเก็ตข้อมูลจะรอจนกว่าจะสามารถรับได้

UDP (User Datagram Protocol) ขาดการจับมือ การนับแพ็คเก็ต และการส่งซ้ำ เหนือศีรษะจึงเล็กลงและไม่จำเป็นต้องมีการจับมือกันทั้งหมดเพื่อรักษาการเชื่อมต่อ UDP รวมการตรวจจับข้อผิดพลาดพื้นฐานบางอย่าง แต่ไม่มีการแก้ไข (แพ็คเกจที่เสียหายเพิ่งจะหลุด) ข้อมูลจะถูกส่งโดยไม่ทราบว่าฝ่ายรับมีอิสระในการรับข้อมูลหรือไม่ ในเวลาเดียวกัน หลายแพ็กเก็ตสามารถชนกันได้ เนื่องจากแต่ละฝ่ายส่งข้อมูลเมื่อใดก็ตามที่จำเป็น การละเว้นการจับมือทั้งหมด ทำให้ UDP มีคุณลักษณะที่ดีอีกอย่างหนึ่งที่เรียกว่า “multicast” และ “broadcast” ในกรณี "มัลติคาสต์" แพ็กเก็ตข้อมูลจะถูกส่งไปยังกลุ่มสมาชิกที่กำหนดไว้ล่วงหน้า ในแพ็กเก็ตข้อมูล "ออกอากาศ" จะถูกส่งไปยังสมาชิกที่เชื่อมต่อทั้งหมด ซึ่งจะช่วยลดการถ่ายโอนข้อมูลได้มากในกรณีที่สมาชิกหลายคนรับสตรีม (เช่น โดยการส่งฟีดวิดีโอไปยังผู้รับหลายราย หรือโดยการส่งเวลาปัจจุบันไปยังอุปกรณ์ที่เชื่อมต่อหลายเครื่อง)

มีวิดีโอที่ดีใน Youtube ที่อธิบายได้ดียิ่งขึ้น

ดังนั้นเมื่อส่งข้อมูล สิ่งสำคัญคือต้องทราบความต้องการของคุณ:

  • ข้อมูลที่ไม่เสียหาย การจัดการหลายเพียร์ด้วยการจับมือกัน → TCP
  • ข้อมูลเรียลไทม์ การเชื่อมต่อที่รวดเร็ว → UDP

ฉันเริ่มด้วยการใช้การสื่อสารแบบ TCP (ระหว่างเซิร์ฟเวอร์หนึ่งและไคลเอนต์หนึ่งราย) ขณะทดสอบ ฉันมีปัญหาในการส่งสัญญาณหยุดชะงัก ในช่วงเริ่มต้น ข้อมูลถูกแลกเปลี่ยนอย่างรวดเร็ว หลังจากนั้นไม่นาน ความเร็วก็ลดลงอย่างมาก ฉันสรุปว่านี่เป็นปัญหาทั่วไปของแนวทาง TCP (ซึ่งผิด!) ดังนั้นจึงเปลี่ยนเป็นวิธีแก้ปัญหาตาม UDP ในที่สุดฉันก็ได้ทั้งสองเข้ามาทำงาน ดังนั้นจะมีการแก้ปัญหาทั้งสองอย่าง

ภาพร่างด้านล่างมีสำหรับ TCP และ UDP เหมือนกันที่พวกเขา:

  • เป็นอิสระจากเครือข่าย WiFi ที่มีอยู่ ดังนั้นมันจะทำงานได้ทุกที่ที่อยู่ห่างไกลจากอินเทอร์เน็ตและเราเตอร์ที่เชื่อมต่อ
  • กำลังส่งข้อมูล ASCII เพื่อพิมพ์ผ่านจอภาพอนุกรม
  • กำลังส่งข้อมูลที่ได้รับจากฟังก์ชัน millis() เพื่อวิเคราะห์ความเร็วของการส่ง
  • ไม่ได้รับการทดสอบสำหรับไคลเอนต์หลายตัว (เนื่องจากมีฮาร์ดแวร์ในการตั้งค่าเครือข่ายในขณะนี้)

ขั้นตอนที่ 2: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์
ฮาร์ดแวร์

เพื่อทดสอบการตั้งค่าทั้งหมด ฉันใช้โมดูล ESP8266 สองโมดูล หนึ่งโมดูลคืออะแดปเตอร์ ESP-01 + USB-to-UART อีกโมดูลหนึ่งเป็นโมดูลที่ใช้ ESP-12 ที่รวมการเชื่อมต่อ USB ตัวควบคุมแรงดันไฟฟ้า และสิ่งอื่น ๆ ที่น่าสนใจ เช่น สวิตช์ LDR และ LED หลากสี

โมดูล USB-to-UART สำหรับ ESP-01 จำเป็นต้องได้รับการแก้ไขเล็กน้อยเพื่อให้สามารถใช้เป็นโปรแกรมเมอร์ได้ (อีกครั้งใน Youtube โดย Csongor Varga)

ในการรันสเก็ตช์ คุณต้องติดตั้งไลบรารี ESP8266 (ตามที่อธิบายไว้ในหลาย ๆ ที่ในอินเทอร์เน็ต) ในทั้งสองกรณี (TCP และ UDP) มีเซิร์ฟเวอร์และไคลเอนต์ร่างแต่ละรายการ ร่างใดถูกโหลดไปยังโมดูลใดไม่สำคัญ

รับทราบ

ดังที่ได้กล่าวมาแล้ว ภาพสเก็ตช์จะขึ้นอยู่กับส่วนต่างๆ ที่ผมพบในเว็บ ฉันจำไม่ได้แล้วว่าฉันพบอะไรและรหัสดั้งเดิมคืออะไรหรือสิ่งที่ฉันเปลี่ยนแปลง ดังนั้นฉันจึงอยากจะขอบคุณชุมชนขนาดใหญ่โดยทั่วไปสำหรับการเผยแพร่ตัวอย่างที่ยอดเยี่ยมทั้งหมด

ขั้นตอนที่ 3: ภาพสเก็ตช์

โค้ดประกอบด้วยภาพสเก็ตช์สองแบบ (ตามที่อธิบายไว้) แบบร่างเซิร์ฟเวอร์และแบบร่างไคลเอ็นต์ สำหรับ TCP และ UDP แต่ละรายการ

แนะนำ: