Laboratorul 03: Rețele de senzori wireless - Protocoale de comunicație radio

Sparrow Micro

Sparrow Micro este o placă de dezvoltare similară cu Sparrow, doar că îi lipsesc senzorii on-board. Cu toate acestea, este similară ca dimensiuni și format cu Arduino Micro și permite conectarea de diverse module și periferice pe pinii de expansiune.

În rest, placa este complet compatibilă și poate fi programată în același mod cu o placă Sparrow normală (nu schimbați nimic la Board din Arduino IDE).

Pentru acest laborator vom folosi atât placa Sparrow, cât și placa Sparrow Micro într-o configurație în care placa Sparrow citește date de la senzori, apoi le trimite prin interfața radio la placa Sparrow Micro ce are rol de Gateway. Sparrow Micro va primi datele și le va trimite mai departe prin interfața serială calculatorului de pe care lucrați.

Transmisia radio

Fiecare placă Sparrow sau Sparrow Micro are încorporat un emițător-receptor radio. El este un periferic al microcontrolerului Atmega128RFA1 și este compatibil cu standardul IEEE 802.15.4. Acest periferic folosește banda de frecvență de 2.4GHz și, teoretic, poate comunica cu orice dispozitiv IoT ce implementează protocolul Zigbee.

Câteva exemple pentru astfel de dispozitive ar fi sistemul de iluminat inteligent PhilipsHue, sau senzorii IoT Samsung SmartThings.

Pentru lucrarea curentă de laborator veți folosi biblioteca SparrowRadio pentru transmisia radio. Clasa SparrowTransfer implementează un protocol peste functiile de transmisie și recepție obișnuite și poate fi descărcată de aici.

Instalarea bibliotecii este foarte facilă, dar trebuie făcută manual. Pentru asta, descărcați arhiva .zip apoi mergeți în IDE-ul Arduino la Sketch - Include Library - Add .ZIP Library și dați calea către arhivă.

Mai jos aveți un exemplu care vă permite să trimiteți și să recepționați pachete de date de pe interfața radio. Pentru aceasta aveți nevoie de două noduri: primul rulează codul care transmite (Tx) și al doilea recepționează (Rx).

Încărcați codul de mai jos pentru Transmitter pe placa Sparrow. Vom folosi mai departe placa pentru a trimite date către placa Sparrow Micro.

Cod transmițător

Cod transmițător

#include "SparrowTransfer.h"
 
//create object
SparrowTransfer ST; 
 
struct SEND_DATA_STRUCTURE{
  //put your variable definitions here for the data you want to send
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  uint16_t data;
};
 
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
 
void blinkLED() //blinks the LED
{
  digitalWrite(8,LOW);
  delay(20);
  digitalWrite(8,HIGH);  
}
 
void setup(){
 Serial.begin(9600);
 
 //start the library, pass in the data details
 ST.begin(details(mydata));
 
 pinMode(8, OUTPUT);
 digitalWrite(8, LOW);
 
 mydata.data = 0;
 
}
 
void loop(){
 
  mydata.data++;
 
  //send the data
  ST.sendData();
  blinkLED();
 
  delay(1000);
}

Codul pentru Receiver este similar, doar că preia biții recepționați pe interfața radio și îi copiază în noua structură de date. Din această cauză, structurile de date de la Transmițător și de la Receptor trebuie să fie identice, altfel octeții nu se vor alinia corect.

Încărcați codul de mai jos pe placa Sparrow Micro, ce are rol de Receptor.

Cod receptor

Cod receptor

#include "SparrowTransfer.h"
 
//create object
SparrowTransfer ST; 
 
struct RECEIVE_DATA_STRUCTURE{
  //put your variable definitions here for the data you want to send
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO!
  uint16_t data;
 
};
//give a name to the group of data
RECEIVE_DATA_STRUCTURE mydata;
 
uint16_t old_index, received_index, lost;
 
void setup(){
  Serial.begin(9600);
 
  //start the library, pass in the data details  
  ST.begin(details(mydata));
 
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH); 
 
}
 
void blinkLED()
{
  digitalWrite(11, LOW);
  delay(20);
  digitalWrite(11, HIGH);  
}
 
void loop(){
  //check and see if a data packet has come in. 
  if(ST.receiveData() == SUCCESS){
 
    blinkLED();
 
    received_index++;
 
    if(old_index != 0)
      lost += mydata.data - old_index - 1;
 
    Serial.print("Frame arrived: ");
    Serial.print(mydata.data);
    Serial.print(" ");
    Serial.print(", lost: ");
    Serial.print(lost);
    Serial.print(", loss: ");
    Serial.print(lost*100.0/(lost+received_index), 3);
    Serial.println("%");
 
    old_index = mydata.data;
  }
 
  //optional delay, to disable flooding serial interface
  //delay(250);
}

Task 0: Rulați exemplele de mai sus. Deschideți o fereastră Serial Terminal pe portul serial la care este conectată placa Sparrow Micro și observați dacă recepționați pachete. Dacă încercați asta când trimit și alți colegi date de pe plăcile lor, veți vedea și mesajele lor!

Task 1: Trebuie să implementăm un mecanism prin care să identificăm mesajele care vin de la un nod anume. O simplă schemă de adresare ar trebui să funcționeze bine. Modificați structura de date pentru a conține urmatoarele câmpuri: adresa nodului care face transmisia (un octet), sequence number care se va incrementa la fiecare transmisie (doi octeți) și payload (32 octeți). Trimiteți mesaje și afișati-le pe serială.

Task 2: Folosind codul dezvoltat în laboratorul precedent, construiți un setup în care placa Sparrow trimite datele de la senzori, iar placa Sparrow Micro le preia și le trimite pe interfața serială. Placa Sparrow Micro trebuie să trimită pe serială doar mesajele de la placa voastră Sparrow, neglijând mesajele de la celelalte plăci.

Bonus Task: Modificați biblioteca pentru a permite transmisia bidirecțională de date și folosiți placa Sparrow Micro pentru a trimite mesaje radio care să aprindă sau să stingă led-ul de pe placa Sparrow, în timp ce aceasta trimite către Sparrow Micro datele de la senzori.

priot/laboratoare/03.txt · Last modified: 2024/10/09 22:18 by dan.tudose
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0