Arduino adatkapcsolati lehetőségek

Kategória: Arduino.

Soros adatkapcsolat kábellel

Ebben az esetben a két Arduino-t kábellel közvetlenül összekötjük, és úgy történik az adatátvitel. A soros kapcsolat két lába a TX (transmitter, küldő) és az RX (receiver, fogadó). Az egyik Arduino TX-ét a másik RX-ére kell kötni és fordítva. Valamint közös GND-re kell kötni őket. Létezik beépített soros adatkapcsolat, ahol a TX az 1-es láb, az RX a 0-s, ezen keresztül is ki fogjuk próbálni, de mi magunk is használhatunk saját lábat.

A beépített soros adatkapcsolat használata

Bekötés:

  • Arduino A 0 <-> Arduino B 1
  • Arduino A 1 <-> Arduino B 0
  • Arduino A GND <-> Arduino B GND

Kód:

A küldőé:

void setup() {
  Serial.begin(9600);
}
 
void loop() {
  Serial.write("a", 1);
  delay(500);
  Serial.write("b", 1);
  delay(500);
}

A fogadóé:

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}
 
void loop() {
  char command[1];
  Serial.readBytes(command, 1);
  if (command[0] == 'a') {
    digitalWrite(LED_BUILTIN, HIGH);
  } else if (command[0] == 'b') {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Itt valójában feltöltéskor ki kell kötni a TX és RX adatkapcsolatot, különben nem sikerül a feltöltés, ugyanis a számítógép COM portjával is ezek keresztül csatlakozik. A kódban a küldőt és a fogadót is 9600 bps-re állítjuk. A küldő fél másodpercenként küld egy egykarakteres parancsot, a fogadó pedig folyamatosan figyeli, és ennek alapján kapcsolgatja ki-be a panelen található LED-et.

Saját soros adatkapcsolat kialakítása

Kényelmetlen lehet a beépített soros adatkapcsolat használata, mivel egyrészt ha be van kötve, akkor nem működik a feltöltés, másrészt elveszi a lehetőséget a számítógéppel való kommunikációra (pl. hibakeresésnél), harmadrészt ha csak ez a lehetőség lenne, akkor egyetlen másik Arduino-val tudnánk csak soros adatkapcsolatot létrehozni. A SoftwareSerial.h beépített könyvtár segítségével más lábakat is ki tudunk alakítani soros kommunikációs célra. A lenti példában a 10-es és 11-es lábakat alapítjuk ki.

Bekötés:

  • Arduino A 10 <-> Arduino B 11
  • Arduino A 11 <-> Arduino B 10
  • Arduino A GND <-> Arduino B GND

Kód:

A küldőé:

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(10, 11); // RX, TX
 
void setup() {
  mySerial.begin(9600);
}
 
void loop() {
  mySerial.write("a", 1);
  delay(500);
  mySerial.write("b", 1);
  delay(500);
}

A fogadóé:

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(10, 11); // RX, TX
 
void setup() {
  mySerial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}
 
void loop() {
  char command[1];
  mySerial.readBytes(command, 1);
  if (command[0] == 'a') {
    digitalWrite(LED_BUILTIN, HIGH);
  } else if (command[0] == 'b') {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Itt már nyugodtan be lehet kötve feltöltéskor is, sőt, a számítógépes összeköttetéshez az USB-t is használhatnánk, mint pl. az ezen az oldalon található példa is teszi: https://www.arduino.cc/en/Tutorial/SoftwareSerialExample.

Rádió

A 433 MHz-es RF rádiós adó és vevő meglepően olcsón megvásárolható, bár általában nem része sem az alapkészletnek, sem a 37 részes szenzor csomagnak sem. A küldő (transmitter) négyzet alakú, és van rajta egy kör alakú, R433S feliratú egység, a fogadó (receiver) pedig hosszúkás téglalap alakú, rajta LM358 feliratú chip-pel.

Bekötés:

  • Küldő
    • GND -> Arduino K GND
    • középső -> Arduino K 12
    • VCC -> Arduino K VCC
  • Fogadó
    • GND -> Arduino F GND
    • 2 -> nem kell bekötni
    • 3 -> Arduino F 11
    • VCC -> Arduino F VCC

Kód: a kód fordításához először fel kell telepíteni a VirtualWire könyvtárt, ami nem is olyan egyszerű, mint amennyire fontos:

A fogadó kódja az alábbi:

#include <VirtualWire.h>
 
byte message[VW_MAX_MESSAGE_LEN];
byte messageLength = VW_MAX_MESSAGE_LEN;
 
void setup() {
  Serial.begin(9600);
  vw_set_rx_pin(11); // default
  vw_setup(2000); // bits per sec
  vw_rx_start();
}
 
void loop() {
  messageLength = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(message, &messageLength)) { // non-blocking
    for (int i = 0; i < messageLength; i++) {
      Serial.write(message[i]);
    }
    Serial.println();
  }
}

Ezt az Arduino F-re kell feltölteni. A vw_get_message() nem blokkoló függvény, az azonnal visszatér, akár talált valamit, akár nem. Itt is az alapértelmezett, jelen esetben 11-es lábra kötöttük az eszközt, tehát az azt beállító sorra valójában nincs szükség, de ahhoz, hogy tudjuk, hogyan kell átállítani, benne maradt a példaprogramban.

A küldő kódja az alábbi, melyet a fenti Arduino K-ra kell rátölteni:

#include <VirtualWire.h>
 
void setup() {
  vw_set_tx_pin(12); // default
  vw_setup(2000);  // bits per sec
}
 
int counter = 0;
 
void loop() {
  String msgToSend = "Counter: ";
  msgToSend += counter++;
  sendMessage(msgToSend.c_str());
  delay(1000);
}
 
void sendMessage(char *message) {
  vw_send((uint8_t *)message, strlen(message));
  vw_wait_tx();
}

Az alapértelmezett port a 12-es, de a fenti példa segítségével ezt át tudjuk állítani. A program egy számláló értékét növeli másodpercenként egyszer és küldi rádión keresztül a fogadónak. A küldőnél és a fogadónál is ugyanazt az átviteli sebességet kell beállítani, ami jelen esetben 2000 bit másodpercenként.

Teszt: töltsük fel előbb a fogadót, és indítsuk el a Serial Monitor-t a megfelelő porton (pl. COM3), majd a küldőt, a neki megfelelő porton (pl. COM4). Figyeljük a Serial Monitort. Játsszunk el velük, pl. helyezzünk akadályt a küldő és a fogadó közé, csomagoljuk be teljesen a küldőt (akár pl. a marunkba), és közben figyeljük a fogadót a soros monitoron.

Megjegyzés: ugyanez a kód működik akkor is, ha a küldőt és a fogadót közvetlenül összekötjük kábellel, tehát: Arduino K 12 -> Arduino F 11.

Infravörös kapcsolat

A fogadót (pl. a 37 részes szenzor csomagból) az infravörös érzékelő távirányítóval alfejezetben leírtak szerint indítsuk el, de most távirányítóra csak annyiban van szükség, hogy ellenőrizzük, a fogadó tényleg jól működik.

A küldőt (mely szintén része a 37 részes szenzor csomagnak) ráköthetjük egy másik USB portra, így más COM-ot kap. Bekötés: az S a 3-as lábra kerüljön (kérdés: miért?), a mínusz a GND-re a középső pedig az 5V-re. A következő kód 0-tól 9-ig sorban, másodpercenkét egy számjegyet küld a fogadónak:

#include <IRremote.h>
 
IRsend irsend;
 
void setup() {}
 
long codes[] = {0XFF6897, 0XFF30CF, 0XFF18E7, 0XFF7A85, 0XFF10EF, 0XFF38C7, 0XFF5AA5, 0XFF42BD, 0XFF4AB5, 0XFF52AD};
 
void loop() {
  for (int i = 0; i < 10; i++) {
    irsend.sendNEC(codes[i], 32);
    delay(1000);
  }
}

Itt tehát kihasználtuk azt, hogy NEC protokollt fogad a fogadó (ez a kódoláshoz fontos), a kódokat pedig az igazi távirányítóból kell lesni.

Wifi

Wifire az ESP8266 oldalon bemutatott chip segítségével tudunk csatlakozni. Mivel ez képes szerver és kliens módban is működni, technikailag lehetséges az, hogy két Arduino UNO wifi-n keresztül kommunikáljon egymással. Erre a hivatkozott oldalon látunk példát.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License