Мазмуну:

Arduino Serial Байланыш: 5 кадам
Arduino Serial Байланыш: 5 кадам

Video: Arduino Serial Байланыш: 5 кадам

Video: Arduino Serial Байланыш: 5 кадам
Video: Lesson 05: Introduction to Serial Monitor | Robojax Arduino Step By Step Course 2024, Ноябрь
Anonim
Arduino Serial Байланыш
Arduino Serial Байланыш

Көптөгөн Arduino долбоорлору бир нече Arduino ортосунда маалыматтарды берүүгө таянат.

Сиз RC машинасын, RC учагын куруп жаткан же хобби болосузбу же алыскы дисплейи бар аба ырайынын станциясынын долбоорун түзөсүзбү, бир Ардуинодон экинчисине сериялык маалыматтарды кантип ишенимдүү өткөрүүнү билишиңиз керек болот. Тилекке каршы, хоббистердин өз долбоорлорунда сериялык маалымат алышын алуу кыйын, себеби, сериялык маалыматтар байт агымы катары жөнөтүлөт.

Байт агымында эч кандай контекст болбосо, маалыматтарды чечмелөө дээрлик мүмкүн эмес. Берилмелерди чечмелей албай туруп, сиздин Arduinos ишенимдүү баарлаша албайт. Эң негизгиси, бул контексттик маалыматтарды стандарттык сериялык пакет дизайнын колдонуу менен байт агымына кошуу.

Сериялык пакеттердин дизайны, пакеттерди толтуруу жана пакеттерди талдоо татаал жана жетүү кыйын. Бактыга жараша, Arduino колдонуучулары үчүн, бул татаал логиканын бардыгын жасай ала турган китепканалар бар, андыктан сиз долбооруңузду кошумча баштыксыз иштөөгө багыттоого болот. Бул Instructable сериялык пакеттерди иштетүү үчүн SerialTransfer.h китепканасын колдонот.

Кыскача айтканда, бул Нускамада SerialTransfer.h китепканасын колдонуп, кандай гана долбоордо болбосун күчтүү сериялык маалыматтарды оңой эле ишке ашырууга болот. Эгерде сиз сериялык байланыштын төмөнкү деңгээлдеги теориясы жөнүндө көбүрөөк билгиңиз келсе, бул окуу куралын караңыз.

Жабдуулар

  • 2 Arduinos

    Бир нече аппараттык UART'ге ээ болгон Arduino колдонууну сунуштайбыз (б.а. Arduino Mega)

  • Кошуу зымы
  • SerialTransfer.h орнотуу

    Arduino IDEнин китепканалар менеджери аркылуу жеткиликтүү

1 -кадам: Физикалык байланыштар

Физикалык байланыштар
Физикалык байланыштар

Сериялык байланышты колдонууда бир нече зым түйүндөрүн эстен чыгарбоо керек:

  • Бардык негиздер туташкандыгын текшериңиз!
  • Arduino TX (Transmit) пин башка Arduino RX (Receive) пинине туташуусу керек

2 -кадам: Китепкананы кантип колдонуу керек

Китепкананы кантип колдонуу керек
Китепкананы кантип колдонуу керек

SerialTransfer.h сизге ыңгайлаштырылган пакет протоколун колдонуп, чоң көлөмдөгү маалыматтарды оңой жөнөтүүгө мүмкүндүк берет. Төмөндө китепкананын бардык өзгөчөлүктөрүнүн сүрөттөмөсү келтирилген - алардын көбүн биз кийинчерээк бул окуу куралында колдонобуз:

SerialTransfer.txBuff

Бул байт массиви, анда бардык жүктөө маалыматтары сериал аркылуу жөнөтүлө электе буферленген. Сиз бул буферди башка Arduinoго жөнөтүү үчүн маалыматтын байтына толтура аласыз.

SerialTransfer.rxBuff

Бул башка Arduinoдон алынган бардык пайдалуу маалыматтар буферленген байт массиви.

SerialTransfer.bytesRead

Башка Arduino тарабынан кабыл алынган жана SerialTransfer.rxBuffте сакталган байттардын саны

SerialTransfer.begin (Stream & _port)

Китепкананын классынын мисалын баштайт. Сиз каалаган "Сериялык" класстын объектин параметр катары өткөрө аласыз - ал тургай "SoftwareSerial" класстын объекттерин!

SerialTransfer.sendData (const uint16_t & messageLen)

Бул сиздин Arduino башка Arduinoго берүү буфериндеги байттардын "messageLen" санын жөнөтөт. Мисалы, эгер "messageLen" 4 болсо, SerialTransfer.txBuffтун биринчи 4 байты башка Arduinoго сериялуу түрдө жөнөтүлөт.

SerialTransfer.available ()

Бул сиздин Arduino башка Arduino алынган сериялык маалыматтарды талдоо кылат. Эгерде бул функция логикалык "чындыкты" кайтарса, бул жаңы пакет ийгиликтүү талданганын жана жаңы алынган пакеттин маалыматтары SerialTransfer.rxBuffте сакталганын/жеткиликтүү экенин билдирет.

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

"Индекс" аргументи көрсөткөндөй, индекстен башталган берүү буферине каалаган нерселердин "бай" саны (байт, int, калкып жүрүү, кош, структура ж. Б.).

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

"Индекс" аргументи көрсөткөндөй индекстен баштап, кабыл алуу буферинен (rxBuff) байттардын "len" санын каалаган объектиге (байт, int, float, double, struct ж.б.…) окуйт.

ЭСКЕРТҮҮ:

Маалыматты өткөрүүнүн эң оңой жолу - бул сиз жөнөткүңүз келген бардык маалыматтарды камтыган структураны аныктоо. Кабыл алуучу Arduino бирдей структурага ээ болушу керек.

3 -кадам: Негизги маалыматтарды берүү

Төмөндөгү эскиз analogReadдин ADC маанисин (0) жана analogReadтин маанисин (0) Arduino #2ге чыңалууга өткөрөт.

Төмөнкү эскизди Arduino #1ге жүктөңүз:

#"SerialTransfer.h" кошуу

SerialTransfer myTransfer; STRUCT {uint16_t adcVal; сүзүүчү чыңалуу; } маалыматтар; void setup () {Serial.begin (115200); Serial1.begin (115200); myTransfer.begin (Serial1); } void loop () {data.adcVal = analogRead (0); data.voltage = (data.adcVal * 5.0) / 1023.0; myTransfer.txObj (маалыматтар, өлчөмдөр (маалыматтар)); myTransfer.sendData (sizeof (data)); кечиктирүү (100); }

4 -кадам: Негизги маалыматтарды алуу

Төмөнкү код Arduino #1ден алынган ADC жана чыңалуу маанилерин басып чыгарат.

Төмөнкү кодду Arduino #2ге жүктөңүз:

#"SerialTransfer.h" кошуу

SerialTransfer myTransfer; STRUCT {uint16_t adcVal; сүзүүчү чыңалуу; } маалыматтар; void setup () {Serial.begin (115200); Serial1.begin (115200); myTransfer.begin (Serial1); } void loop () {if (myTransfer.available ()) {myTransfer.rxObj (data, sizeof (data)); Serial.print (data.adcVal); Serial.print (''); Serial.println (data.voltage); Serial.println (); } else if (myTransfer.status <0) {Serial.print ("ERROR:"); if (myTransfer.status == -1) Serial.println (F ("CRC_ERROR")); else if (myTransfer.status == -2) Serial.println (F ("PAYLOAD_ERROR")); else if (myTransfer.status == -3) Serial.println (F ("STOP_BYTE_ERROR")); }}

5 -кадам: Тестирлөө

Эки эскиз тең тиешелүү Arduinosко жүктөлгөндөн кийин, Arduino #2ден Serial Monitorду колдонуп, Arduino #1ден маалымат алып жатканыңызды ырастаңыз!

Сунушталууда: