สารบัญ:

Arduino Serial Communication: 5 ขั้นตอน
Arduino Serial Communication: 5 ขั้นตอน

วีดีโอ: Arduino Serial Communication: 5 ขั้นตอน

วีดีโอ: Arduino Serial Communication: 5 ขั้นตอน
วีดีโอ: EP.5 สอนการใช้งาน Serial Port ส่งข้อมูลระหว่าง Arduino 2024, กรกฎาคม
Anonim
Arduino Serial Communication
Arduino Serial Communication

โครงการ Arduino จำนวนมากอาศัยการส่งข้อมูลระหว่าง Arduinos หลายตัว

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

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

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

กล่าวโดยย่อ: คำแนะนำนี้จะอธิบายวิธีที่คุณสามารถใช้ข้อมูลอนุกรมที่มีประสิทธิภาพได้อย่างง่ายดายในโครงการใด ๆ โดยใช้ไลบรารี SerialTransfer.h หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับทฤษฎีระดับต่ำเกี่ยวกับการสื่อสารแบบอนุกรมที่มีประสิทธิภาพ โปรดดูบทช่วยสอนนี้

เสบียง

  • 2 Arduinos

    ขอแนะนำอย่างยิ่งให้คุณใช้ Arduinos ที่มีฮาร์ดแวร์ UART หลายตัว (เช่น Arduino Mega)

  • สายเชื่อมต่อ
  • ติดตั้ง SerialTransfer.h

    พร้อมใช้งานผ่าน Libraries Manager ของ Arduino IDE

ขั้นตอนที่ 1: การเชื่อมต่อทางกายภาพ

การเชื่อมต่อทางกายภาพ
การเชื่อมต่อทางกายภาพ

เมื่อใช้การสื่อสารแบบอนุกรม ต้องคำนึงถึงจุดเดินสายสองสามจุด:

  • ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อบริเวณทั้งหมดแล้ว!
  • พิน Arduino TX (ส่ง) ต้องเชื่อมต่อกับพิน RX (รับ) ของ Arduino อื่น

ขั้นตอนที่ 2: วิธีใช้ห้องสมุด

วิธีใช้ห้องสมุด
วิธีใช้ห้องสมุด

SerialTransfer.h ช่วยให้คุณส่งข้อมูลจำนวนมากได้อย่างง่ายดายโดยใช้โปรโตคอลแพ็คเก็ตที่กำหนดเอง ด้านล่างนี้คือคำอธิบายคุณลักษณะทั้งหมดของห้องสมุด ซึ่งเราจะนำไปใช้ในบทช่วยสอนนี้ในภายหลัง:

SerialTransfer.txBuff

นี่คืออาร์เรย์ไบต์ที่ข้อมูลเพย์โหลดทั้งหมดที่จะส่งผ่านซีเรียลจะถูกบัฟเฟอร์ก่อนส่ง คุณสามารถยัดบัฟเฟอร์นี้ด้วยไบต์ของข้อมูลเพื่อส่งไปยัง Arduino อื่น

SerialTransfer.rxBuff

นี่คืออาร์เรย์ไบต์ที่ข้อมูลเพย์โหลดทั้งหมดที่ได้รับจาก Arduino อื่นถูกบัฟเฟอร์

SerialTransfer.bytesRead

จำนวนเพย์โหลดไบต์ที่ Arduino อื่นได้รับและจัดเก็บไว้ใน SerialTransfer.rxBuff

SerialTransfer.begin (สตรีม &_port)

เริ่มต้นอินสแตนซ์ของคลาสของไลบรารี คุณสามารถส่งผ่านอ็อบเจ็กต์คลาส "Serial" เป็นพารามิเตอร์ - แม้กระทั่งอ็อบเจ็กต์คลาส "SoftwareSerial"!

SerialTransfer.sendData (const uint16_t &messageLen)

สิ่งนี้ทำให้ Arduino ของคุณส่งจำนวนไบต์ "messageLen" ในบัฟเฟอร์ส่งไปยัง Arduino อื่น ตัวอย่างเช่น หาก "messageLen" เป็น 4 ไบต์ 4 ไบต์แรกของ SerialTransfer.txBuff จะถูกส่งผ่านซีเรียลไปยัง Arduino ตัวอื่น

SerialTransfer. พร้อมใช้งาน ()

สิ่งนี้ทำให้ Arduino ของคุณแยกวิเคราะห์ข้อมูลอนุกรมที่ได้รับจาก Arduino อื่น หากฟังก์ชันนี้คืนค่าบูลีนเป็น "จริง" แสดงว่าแพ็กเก็ตใหม่ได้รับการแยกวิเคราะห์เรียบร้อยแล้ว และข้อมูลของแพ็กเก็ตที่ได้รับใหม่จะถูกจัดเก็บ/พร้อมใช้งานใน SerialTransfer.rxBuff

SerialTransfer.txObj (const T &val, const uint16_t &len, const uint16_t &index=0)

ใส่จำนวนไบต์ "len" ของอ็อบเจ็กต์ที่กำหนดเอง (ไบต์, int, float, double, struct, ฯลฯ…) ลงในบัฟเฟอร์การส่งข้อมูลโดยเริ่มต้นที่ดัชนีตามที่ระบุโดยอาร์กิวเมนต์ "index"

SerialTransfer.rxObj (const T &val, const uint16_t &len, const uint16_t &index=0)

อ่านจำนวนไบต์ "len" จากบัฟเฟอร์การรับ (rxBuff) โดยเริ่มต้นที่ดัชนีตามที่ระบุโดยอาร์กิวเมนต์ "index" ลงในอ็อบเจ็กต์ตามอำเภอใจ (ไบต์, int, float, double, struct, ฯลฯ…)

บันทึก:

วิธีที่ง่ายที่สุดในการส่งข้อมูลคือการกำหนดโครงสร้างที่มีข้อมูลทั้งหมดที่คุณต้องการส่งก่อน Arduino ที่ส่วนรับควรมีการกำหนดโครงสร้างที่เหมือนกัน

ขั้นตอนที่ 3: ส่งข้อมูลพื้นฐาน

ภาพร่างต่อไปนี้จะส่งทั้งค่า ADC ของ analogRead(0) และค่าของ analogRead(0) ที่แปลงเป็นแรงดันไฟฟ้าเป็น Arduino #2

อัปโหลดภาพร่างต่อไปนี้ไปยัง Arduino #1:

#include "SerialTransfer.h"

SerialTransfer myTransfer; โครงสร้าง STRUCT { uint16_t adcVal; แรงดันลอย; } ข้อมูล; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); Serial1.begin(115200); myTransfer.begin(Serial1); } วงเป็นโมฆะ () { data.adcVal = analogRead (0); data.voltage = (data.adcVal * 5.0) / 1023.0; myTransfer.txObj (ข้อมูล, ขนาด (ข้อมูล)); myTransfer.sendData(ขนาดของ(ข้อมูล)); ล่าช้า (100); }

ขั้นตอนที่ 4: รับข้อมูลพื้นฐาน

รหัสต่อไปนี้พิมพ์ค่า ADC และแรงดันไฟฟ้าที่ได้รับจาก Arduino #1

อัปโหลดรหัสต่อไปนี้ไปยัง Arduino #2:

#include "SerialTransfer.h"

SerialTransfer myTransfer; โครงสร้าง STRUCT { uint16_t adcVal; แรงดันลอย; } ข้อมูล; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); Serial1.begin(115200); myTransfer.begin(Serial1); } วงเป็นโมฆะ () { ถ้า (myTransfer.available ()) { myTransfer.rxObj (ข้อมูล ขนาด (ข้อมูล)); Serial.print (data.adcVal); Serial.print(' '); Serial.println (data.voltage); Serial.println(); } else if(myTransfer.status < 0) { Serial.print("ข้อผิดพลาด: "); if(myTransfer.status == -1) Serial.println(F("CRC_ERROR")); อื่น if(myTransfer.status == -2) Serial.println(F("PAYLOAD_ERROR")); อื่น if(myTransfer.status == -3) Serial.println(F("STOP_BYTE_ERROR")); } }

ขั้นตอนที่ 5: การทดสอบ

เมื่ออัปโหลดภาพร่างทั้งสองไปยัง Arduinos แล้ว คุณสามารถใช้ Serial Monitor บน Arduino #2 เพื่อตรวจสอบว่าคุณได้รับข้อมูลจาก Arduino #1!

แนะนำ: