LAKI PINGVINI<>
022017<><>

Arduino: Bežično vezivanje

Komunikacija preko radio signala

Avanturu po prostranstvima bežičnih komunikacija započinjemo od najjednostavnijeg (i najjeftinijeg) načina koji se u prenosu informacija oslanja na poznatu tehniku amplitudne modulacije (AM). Tačnije, koristi se srodna tehnika pod nazivom ASK (Amplitude Shift Keying) koja, za razliku od obične modulacije, omogućava manipulaciju digitalnim signalom.

MX-05V/XD-RF-5V

Ovo su najčešći nazivi kompleta prijemnika i predajnika koji se mogu kupiti već za 50 centi. Razlog tako niskoj ceni je jednostavna konstrukcija tih uređaja.

Na tržištu je moguće naći dve vrste skoro jednakih modela, koji se razlikuju po frekvenciji na kojoj obavljaju prenos podataka. U pitanju su 315 i 433,92 megaherca. Dok je Amerikancima potpuno svejedno koji će od ova dva modela da izaberu, evropski zakoni o radio difuziji (CE R&TTE) striktno predviđaju korišćenje drugog.

Postoje još neke razlike u konstrukciji i nazivima radio modula, ali u suštini svi dolaze sa karakteristikama u tabeli dole.

Moduli ove vrste najčešće imaju nejasne oznake na štampanoj pločici. Posebno je zanimljiv natpis ATAD koji predstavlja palindrom reči „data”. Sledeće tabele daju raspored pinova na modulima kada ih posmatramo sa prednje strane:

Da bi se povećala daljina prenosa podataka, na module treba zalemiti antenu, čija preporučena dužina za frekvenciju od 433 megaherca iznosi 17 centimetara (lambda/4). Dok je za predajnik najpraktičnija omnidirekciona antena, što podrazumeva lemljenje ispravljenog komada žice, za prijemnik se preporučuje spiralna antena (može se formirati namotavanjem žice na valjkasti predmet).

S obzirom na primenjenu tehnologiju, ovi moduli imaju veći broj nedostataka. Prvi se odnosi na korišćeni frekventni opseg koji je namenjen slobodnoj upotrebi, pa će signal biti slabiji zbog funkcionisanja drugih uređaja iz okoline. Sledeći problem je taj da je u pitanju jednosmerni prenos, kod koga je nemoguće proveriti da li je poslata informacija primljena. Zatim, u pitanju su uređaji koji su veoma osetljivi na šum iz okoline. Ukoliko je na Arduino priključen neki deo koji izaziva stalne pulsacije (na primer servo motor ili LE diode), može doći do velikih smetnji u prenosu podataka, što se može ublažiti korišćenjem dva odvojena izvora napajanja ili dodavanjem kondenzatora. Na kraju, brzine prenosa ove vrste radio veze, za današnje standarde daleko su ispod proseka.

Napredniji korisnici se dodatno mogu pozabaviti implementacijom algoritama za filtriranje šuma i šifrovanje podataka. Isto tako, moguće je kreirati sistem jednostavnog paketnog prenosa informacija koji bi omogućio simultani rad sa više različitih prijemnika i predajnika. Moguće je i istovremeno koristiti više prijemnika koji primaju signal od jednog predajnika.

Najčešće praktične primene ovih modula odnose se na daljinsku kontrolu otvaranja i zatvaranja vrata i prozora, kontrolu audio uređaja, hobističkih dronova, robota i tako dalje. Paradoksalno je da, na sajtovima koji prodaju ovu vrstu uređaja, prodavci često ističu visoku osetljivost uređaja kao vrlinu, dok ona zapravo predstavlja manu usled dejstva drugih izvora talasa u datom radio spektru.

Zanimljivo je da se na različitim mestima mogu pročitati drastično različite informacije o daljinama prenosa. Negde ćete videti da moduli bez antena međusobno komuniciraju tek na udaljenosti od par decimetara, dok pojedini izvori na internetu tvrde da je reč i o dometima preko 500 metara. Mi smo u konkretnom slučaju u radu bez antene bili loše sreće, pa smo stabilnu vezu uspeli da ostvarimo tek na razmaku od nekih 30 centimetara. Nakon postavljanja antena, sve je bilo mnogo bolje, pa se signal bez problema hvatao i kroz zidove. Po ovakvoj ceni teško se može naći bolji komplet za ostvarivanje bežične komunikacije za savladavanje gradiva, pošto je ceo princip povezivanja jednostavan i razumljiv, što se ne može reći za neke druge metode.

Postoje dve biblioteke za kontrolu ove vrste modula. Prva se naziva Virtual Wire i na njoj je zasnovan najveći deo projekata, pošto postoji već sedam ili osam godina. Novija, bolja i manje poznata biblioteka, nosi naziv rc-switch.

Slanje teksta bi izgledalo ovako:

#include <VirtualWire.h>

void setup()

{

vw_set_ptt_inverted(true); // postavljanje polariteta

vw_set_tx_pin(7); // Arduino data pin za slanje

vw_setup(2000); // brzina konekcije bps

}

void loop()

{

// pokazivac na tekst za slanje

const char *tekst = "Svet kompjutera";

vw_send((uint8_t *)tekst, strlen(tekst));

vw_wait_tx();

delay(1000);

}

Funkcija vw_set_ptt_inverted() postavlja uređaj u stanje potrebno za realizaciju push to talk modaliteta komunikacije. Još je potrebno odrediti preko kojeg pina će naš modul dobijati informacije i po kojoj brzini, što se postiže funkcijom vw_setup() koja ujedno inicijalizuje veze. Kao i uvek kada su u pitanju radio veze, brzina je u obrnutoj proporciji sa daljinom prenosa.

Unutar petlje, funkcijom vw_send() šaljemo podatke navodeći dva parametra. Prvi je niz bajtova, dok drugi ukazuje na broj karaktera u nizu. Posle toga, funkcija vw_wait_tx() čeka da se završi sa prenosom podataka, iza čega sledi pauza od jedne sekunde. Još da objasnimo značenje tipa uint8_t. U pitanju je nepredznačena celobrojna osmobitna vrednost (unsigned integer) i kao takva je definisana unutar zaglavlja stdint.h. Suštinski je ekvivalentna vrednosti tipa byte (0-255), ali je korišćenje u obliku uint8_t bolji izbor kada se radi o prenošenju na neku drugu platformu koja podržava jezik C. Osim ove varijante moguće je koristiti i standardniji tip podataka unsigned char, ali namerno smo koristili ređi oblik, kako bi početnici lakše shvatili o čemu se radi ukoliko naiđu na takvu formulaciju.

Program za prijem podataka izgleda ovako:

#include <VirtualWire.h>

void setup()

{

Serial.begin(9600); // inicijalizujemo serijski port

vw_set_ptt_inverted(true); // invertovani ’push to talk’

vw_set_rx_pin(8); // pin za prijem podataka

vw_setup(2000); // brzina prijema

vw_rx_start(); // zapocinjemo sa prijemom

}

void loop()

{

uint8_t bafer[VW_MAX_MESSAGE_LEN];

uint8_t baferlen = VW_MAX_MESSAGE_LEN; // duzina podataka u baferu

if (vw_get_message(bafer, &baferlen)) // ima li podataka?

{

for (int x = 0; x < baferlen; x++)

{

Serial.write(bafer[x]); // podatke smestamo u bafer

}

Serial.println(); // i saljemo na ispis

}

}

U bloku Start prvo aktiviramo serijski port preko koga ćemo pratiti informacije u okviru modula Serial Monitor. Sledi deo sličan onome koji smo koristili za inicijalizaciju predajnika, s tim što ovde eksplicitno izdajemo naredbu vw_rx_start za započinjanje prijema podataka.

Na početku petlje Loop prvo definišemo bafer i određujemo kolika je njegova dužina. To se postiže korišćenjem makro izraza VW_MAX_MESSAGE_LEN koji izvorno ima vrednost 80. Sledi For..Next petlja koja preuzima podatke iz bafera i ispisuje ih u prozoru monitorskog modula.

Poglavica Plavi zub

Sledeći način bežične komunikacije kojim ćemo se baviti odnosi se na dobro poznati Bluetooth sa svim svojim vrlinama i manama. Na tržištu postoji nekoliko sličnih vrsta modula, koji kod početnika unose zabunu, pa ćemo taj problem pokušati da demistifikujemo.

Najčešće se sreću moduli koji imaju oznaku HC iza koje sledi neki dvocifren broj od 03 do 09. Modeli HC-03 i HC-04 reklamiraju se kao podesni za rad u industrijskim uslovima, ali je teško reći u čemu se razlikuju od modela HC-05 i HC-06 koji su namenjeni kućnoj upotrebi. Moduli HC-03/HC-05 mogu po potrebi da obavljaju, kako funkciju slejva, tako i funkciju mastera, dok moduli HC-04/HC-06 mogu da rade samo u slejv režimu, jer im je fabrički onemogućeno da rade u režimu mastera, iako imaju isti hardver. Ko ima hakerske krvi, mogao bi da model HC-06 pretvori u HC-05 kopiranjem programa iz fleš memorije, ali neznatna razlika u ceni obesmišljava tu avanturu. Moduli sa oznakom HC-07 su u potpunosti kompatibilni sa HC-06, samo što koriste čipset CSR 41C6. Pod oznakom HC-08 kriju se noviji (i skuplji) moduli sa čipsetom TI CC2540, koji podržavaju standard Bluetooth 4.0 i troše veoma malo energije, dok je HC-09 (čipset Hanlynn HC1009) najnovija varijanta modula koji bi trebalo da posluži kao zamena za starije modele sa slejv funkcijom.

Mnogi korisnici Arduina će vam potvrditi da je najbolji izbor, kada se uzmu u obzir mogućnosti i cena, model HC-05 (na pločici ZS-040 košta oko dva i po evra), pa ćemo njega razmatrati u našem primeru. Srce modula je čip proizvođača Cambridge Silicon Radio sa oznakom CSR BC417143, koji se ranije često sretao u jeftinijim Bluetooth USB adapterima i čija cena u potpunosti odgovara amaterskim namenama. Pošto je reč o čipsetu koji je na tržištu već desetak godina, podržava nešto stariji Bluetooth standard V2.0+EDR (Enhanced Data Rate) pri brzinama do 3 Mbit/s. Radi u opsegu 2,4-2,48 gigaherca i omogućuje razmenu podataka među uređajima na razdaljini do deset metara. Modul troši najviše struje tokom procesa ostvarivanja veze, do 40 miliampera, dok je tokom rada potrošnja znatno niža i iznosi oko osam miliampera. Treba da napomenemo da su moduli HC-05 (proizvođača Wavesen) i EGBT-045MS (e-Gizmo Mechatronix Central) praktično isti proizvod, samo pod različitim nazivima.

Postoje dva načina upotrebe ovog modula. Prvi je da ga koristimo zalemljenog na podnožje (ZS-040, FC-114, JY-MCU, CZ-HC-05), što je pogodno za postavljanje na prototipsku ploču. Ovo je obavezno prilikom korišćenja Arduino uređaja, koji rade na pet volti, pošto imaju elektroniku koja štiti uređaj od kvara. Drugi način je da potrebne žice zalemimo direktno na modul, što, zbog malog razmaka među izvodima (jedan milimetar), nije jednostavna operacija. Komunikaciju je moguće ostvariti putem USB 1.1 ili 2.0 interfejsa, kao i preko UART konekcije. Najuočljiviji elementi na pločici su dva čipa, od kojih jedan pripada kontroleru, dok je drugi namenjen čuvanju sistemskog programa i ima kapacitet od osam megabita. Kao što se može videti sa slike, modul poseduje sasvim pristojan skup funkcija. Pinovi 1-4 (TX, RX, CTS, RTS) zaduženi su za podršku UART interfejsa, odnosno za ostvarivanje serijske veze. Zatim slede pinovi 5-8, čiji nazivi započinju skraćenicom PCM i obavljaju funkciju serijskog interfejsa za prenos digitalnog zvuka. Pinovi 9 i 10 (AIO0 i AIO1) namenjeni su analognim U/I funkcijama. Na pinovima 15 i 20 (USB D+, USB D-) nalaze se linije diferencijalnih kanala za komunikaciju preko USB interfejsa, dok su pinovi 16-19 (CSB, MOSI, MISO, CLK) zaduženi za SPI interfejs. Na kraju, pinovi 23-34 imaju funkciju programabilnih U/I portova. Na žalost, firmware koji dolazi sa uređajem omogućava upotrebu samo onih pinova čiji su brojevi na ilustraciji označeni crvenom bojom. Ekstremniji korisnici na internetu mogu pronaći materijale koji govore o tome kako je ovaj modul moguće pretvoriti u mnogo moćniji uređaj koji košta desetak puta više.

Pomenuli smo različite tipove pločica na koje je moguće zalemiti naš Bluetooth modul. Da bi se izbegle komplikacije, najbolje je da se naruči kompletan proizvod na kome su svi kontakti zalemljeni za prateću pločicu. Prilikom naručivanja treba obratiti pažnju da postoje dve različite vrste, od kojih jedna ima nožicu izvoda označenu sa KEY, dok je druga označena kao EN.

Pin sa oznakom STATE ima vrednost logičke jedinice kada je modul uključen, i logičku nulu kada je isključen. Njegova funkcija je da nas obavesti da li je modul aktivan ili ne. Pin EN (Enable) uključuje modul dovođenjem napona potrebnog za aktivaciju stanja logičke jedinice i isključuje kada dovodimo logičku nulu. Ova dva pina se, u najvećem broju slučajeva, ne koriste u praksi.

Tabela prikazuje nekoliko vrsta modula koji se najčešće nalaze na tržištu. Problem je u tome što svi oni imaju po više različitih verzija koje mogu da se razlikuju po oznakama i upotrebljenim komponentama. Na primer, pločica sa oznakom JY-MCU ima verzije koje imaju taster za ulazak u AT modus i one koje ga nemaju. Isto tako, postoje verzije sa četiri i šest nožica (sa oznakom „Pro”). Kod modula FC-114 mali taster nema nikakvu funkciju, pošto se uređaj posle uključivanja budi u AT režimu. Sve revizije ZS-040 imaju taster koji prebacuje uređaj u stanje prijema AT komandi.

Nekadašnji korisnici dial-up interneta se verovatno sećaju da su u okviru podešavanja modema morali da navedu kraću sekvencu ovih jednostavnih instrukcija, bez kojih uspostavljanje veze nije bilo moguće. Reč je o standardu za telefonske modeme sa početka osamdesetih, koji je potekao od firme Hayes, pa ćete često čuti i frazu „Hayes set komandi”. Njihov najvažniji deo odnosi se na komande koje započinju slovima AT (Attention) i koje su i danas u upotrebi u raznim telekomunikacionim uređajima. Neke od komandi koje prepoznaje modul HC-05 su:

Treba napomenuti da se uz većinu ovih komandi (tačnije, iza njih) mogu nalaziti i znakovi „?” i „=”, od kojih prvi traži od modula da nam pokaže trenutno stanje parametara, dok se drugim zadaje njihova nova vrednost.

Postoje dva načina da se uđe u AT mod, pritiskom na mali taster u trenutku uključivanja, ili dovođenjem 3,3 volta na 34. pin modula u trenutku uključivanja.

Prvi način je jednostavniji, ali on ne zadržava stanje logičke jedinice na pinu 34 i omogućava pristup samo ograničenom skupu AT komandi. Drugim načinom dobijamo pristup punom setu komandi, sve dok održavamo logičku jedinicu na tom pinu, dok prelazak u stanje logičke nule označava i prelazak u ograničeni skup AT komandi.

Izvorne fabričke vrednosti kod ovih modula podrazumevaju brzinu komunikacije od 38400 bit/s, dok lozinka ima vrednost: „1234”. Ukoliko za komunikaciju sa modulom koristimo standardni serijski monitor iz Arduino razvojnog okruženja, biće potrebno i da postavimo opciju za slanje teksta (polje pored podešavanja brzine) na „Both NL & CR”, pošto bez toga AT komande neće biti ispravno prenesene. Osim njega, moguće je koristiti i bilo koji drugi program koji emulira funkcije starih dobrih terminala (kao što smo mi koristili PuTTY u primeru niže), samo je potrebno voditi računa o ovoj sekvenci kontrolnih karaktera na kraju teksta.

Moduli ne podržavaju mogućnost prenosa AT komandi putem Bluetooth veze, pa je potrebno pribeći nekoj od alternativnih metoda. Prva metoda se ogleda u korišćenju USB to TTL konvertera, koji priključujemo na Bluetooth adapter. Drugi način podrazumeva upotrebu samog Arduina koji priključujemo na naš računar. Potrebno je da žicama povežemo TXD nožicu modula sa softverskim RX pinom, čiji smo broj odredili prvim argumentom funkcije BTveza i analogno tome, RXD nožicu sa softverskim TX pinom.

Sastavni deo „rituala” predstavlja i uvođenje uređaja u režim prijema AT komandi, držeći taster modula za vreme uključivanja. To postižemo tako što prvo izvučemo džamper žicu koja dovodi napon. Kada uključujemo modul, u normalnom režimu rada svetleća dioda trepće ubrzano, dok u slučaju prelaska u AT režim, treptanje biva mnogo sporije. U režimu prenosa podataka, LED trepće po šemi koja oponaša ritam rada srca (heartbeat).

Sledeći skeč ostvaruje prenos AT komandi od serijskog monitora do Bluetooth modula.

#include <SoftwareSerial.h>

SoftwareSerial BTveza(7, 8); // softverski RX i TX pin

char znak = "";

void setup()

{

Serial.begin(9600);

Serial.println("Unesite podrzanu AT komandu");

BTveza.begin(38400); // default brzina za HC-05

}

void loop()

{

if (BTveza.available()) // pratimo podatke na BT

{

znak = BTveza.read(); //citaj tekst sa BT

Serial.write(znak); //ispisi tekst na ser. monitoru

}

if (Serial.available()) // pratimo podatke na ser. monitoru

{

znak = Serial.read(); // citaj sa ser. monitora

BTveza.write(znak); // posalji na BT

}

}

Varijabla znak sadrži karakter koji je prenesen serijskom vezom. U okviru funkcije setup definišemo brzinu serijskog monitora na 9600 bit/s, kao i brzinu prenosa do Bluetooth uređaja koja je fabrički podešena na 38400 bit/s. Tu je još i linija kôda koji nam sugeriše da počnemo sa unošenjem AT komandi. Unutar funkcije loop postoje dve IF naredbe od kojih je jedna zadužena za praćenje stanja na Bluetooth modulu, a druga prati vezu sa serijskim monitorom. Ukoliko se pojavi podatak za slanje, on biva prenesen do drugog uređaja. Nakon zadavanja AT komandi, Bluetooth modul vraća podatke o izvršenom zadatku. Sve vrlo jednostavno i razumljivo.

Vrlo sličan, pa i još jednostavniji mehanizam koristimo kada radimo u režimu prenosa podataka.

#include <SoftwareSerial.h>

SoftwareSerial BTveza(7, 8); // softverski RX i TX pin

void setup()

{

BTveza.begin(9600);

}

void loop()

{

BTveza.println("Pocetak brojanja: ");

for (int broj = 0; broj < 100; broj++) {

BTveza.println(broj);

delay(500);

}

BTveza.println("Brojanje zavrseno!");

delay(5000);

}

Scenario je skoro isti kao u gornjem primeru, samo što sada ne koristimo komunikaciju sa serijskim monitorom, već unilateralno prenosimo podatke sa Arduina na bilo koji uređaj koji poseduje Bluetooth interfejs. Za demonstraciju smo odabrali prostu petlju koja na pola sekunde ispisuje brojeve od 0 do 99. Za ispis tekstualnih podataka u okviru prozora terminala zadužena je naredba println. Kao što možemo da šaljemo podatke sa Arduina na druge uređaje, tako isto možemo da primamo podatke iz spoljašnjeg sveta.

Igor S. RUŽIĆ

 
KaOS 2017.01
PIXEL za PC
Armbian
Intervju: Igor Pečovnik (Armbian)
Arduino: Bežično vezivanje
Šta mislite o ovom tekstu?
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2015. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 2.54
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera