Sunteți pe pagina 1din 16

UNIVERSITATEA TEHNICĂ „GHEORGHE ASACHI”, IAŞI

FACULTATEA DE AUTOMATICĂ ŞI CALCULATOARE

Proiect
Reţele de Sisteme Încorporate

Proiectarea unei interconexiuni între


reţelele CAN şi ZigBee la nivel de
aplicaţie

Student: Mihai-Claudiu STOICA


Grupa:II 1B

2012
1. Introducere

Sistemele incorporate sunt sisteme de calcul care sunt parti componente a unor dizpozitive
speciale. Functie de caracteristicile in ansamblu a echipamentului sistemele incorporate au un inalt grad
de optimizare functie de particularitatile ansamblului in care sunt integrate. In mod traditional sistemele
incorporate sunt utilizate in cadrul sistemelor de masura si control al proceselor. Ca efect al marii
dezvoltari ale circuitelor integrate in momentul de fata conducerea a numeroase aplicatii complexe isi
gasesc solutiile (pot fi rezolvate) prin utilizarea sistemelor incorporate. Pentru a fi capabile sa sustina
rezolvarea problemelor de conducere sistemele incorporate sunt echipate cu diferite tipuri de cicuite.

2. Reţeaua CAN – implementare hardware folosind MCP2515 CAN


Development Board

CAN este un acronim pentru Controller Area Network. A fost initial introdus de Bosch in 1998
pentru a fi folosit in industria automobilelor, dar ulterior, datorita performantelordeosebite in ce
priveste viteza si siguranta datelor, a fost adoptat pentru retele de comunicatie in automatizari
industriale.

CAN introduce o serie de inovatii, printre care enumeram:


a. Este un protocol de tip “broadcast” – adica in campul de date al mesajelor nu existain mod
explicit o adresa a destinatarului. Toata nodurile retelei receptioneaza mesajul si pot “deduce
din context” daca mesajul le este adresat sau nu.
b. Arbitrarea accesului la bus este de tip “collision avoidance”. Aceasta se faceautomat
asignand fiecarui mesaj o prioritate, codificata intr-un camp special denumit“identificator”.
Fiecare nod care emite pe bus, verifica la nivelul fiecarui bit stareabusului. Daca doua
noduri incearca sa emita simultan pe bus, va castiga accesul labus mesajul care contine mai multi
biti dominanti in campul identificator.

Viteza de transmisie pe un bus CAN depinde mult de lungimea cablurilor. Pe o perecheUTP


(Unshielded Twisted Pair) se poate transmite cu viteza de 1Mb/sec pana la distantede 40m. Daca
lungimea cablurilor creste peste 40m, viteza scade corespunzator,ajungand la doar 10Kb/s pentru
cabluri cu lungimea de 6Km.
Structura generala a unui nod CAN este prezentata in figura 1.
Fig. 1 Structura unui nod CAN

Bus-ul propriu-zis este format (in majoritatea implementarilor) de o pereche rasucita decabluri,
prevazuta obligatoriu cu rezistori de terminare. Valoarea terminatorilor depinde de tipul cablurilor
folosite. Pentru UTP este 120Ohms.

CAN transceiver-ul este de obicei un circuit integrat de tip driver/sensor care asigura
interfatarea directa cu bus-ul fizic.
CAN controller-ul se prezinta fie ca un circuit integrat distinct, fie ca un subsistem inclus in unele
microcontrollere. Acest bloc raspunde de layer-ul data link al protocolului.

La nivel fizic, datele sunt codificate NRZ prin doua nivele de tensiune pe bus. Un nivel, zis
recesiv (1 logic), corespunde starii de repaus a bus-ului si este de aproximativ 2.5V masurat fata de
masa. Celalat nivel, zis dominant (0 logic), este 2.5V+1V pe una din liniile bus-ului (CANH) sau
2.5V-1V pe cealalta linie (CANL).

Figura 2 prezinta oscilogramele liniilor CANH si CANL ale unui bus CAN, masurate fata
de masa.
Fig. 2 Oscilogramele liniilor CANH si CANL

Deoarece in codificarea NRZ nu exista nici o tranzitie a semnalului in situatiile in care setransmit
secvente lungi de biti 0 sau 1, pentru eliminarea riscului de desincronizare a receptorului in astfel
de cazuri CAN a introdus un artificiu, denumit “bit stuffing”. Prin conventie, in cazul in care se
transmit secvente de biti cu acceasi valoare (0 sau 1) mai lungi de 5 biti, se introduce automat un bit
suplimentar cu valoare opusa (1 intr-o secventa de biti 0 sau invers). Acesti biti suplimentari sunt
filtrati de controllerul CAN al receptorului, iar receptia unei secvente de 6 biti cu aceeasi polaritate
este considerata eroare de receptie.

Exista in prezent mai multe standarde care reglementeaza layer-ul fizic al CAN. Iata cateva dintre
ele:
ISO 11898-2 – zis CAN high speed (1MHz). Este cel mai raspandit
ISO 11898-3 – CAN low-speed (500KHz) Este “fault tolerant” – in sensul ca foloseste
redundanta intrinseca a bus-ului CAN pentru a asigura integritatea comunicatiei pe bus, chiar
in cazul cand unul din fire este intrerupt sau scurtcircuitat la masa sau la Vcc.
ISO 11898-4 – Time Triggered CAN (TTCAN)
ISO 11783-2 – Standard pentru vehicule agricole
ISO 11992-1 – standard pentru camioane si vehicule utilitare
SAE J2411 – SWCAN – single wire CAN (asemanator cu LIN la nivel fizic, dar pastrand regulile
CAN la nivel data link)

Cel mai raspandit CAN transceriver este Philips 82C250. Schema bloc a acestui circuit este
prezentata in figura 3.
Fig. 3 Schema bloc a unui CAN transceiver

Intr-un sistem care comunica dupa protocolul CAN, pachetele de date sunt denumite
“message frames”. Exista doua formate ale mesajelor, corespunzator versiunilor de standard:
Formatul de tip “standard CAN” – versiunea 2.1a
Formatul CAN extins (extended CAN) – versiunea 2.0b

Principala diferenta intre cele doua versiuni consta in lungimea campului “identificator” al
mesajelor. La versiunea 2.0a identificatorul are o lungime de 11 biti, iar la 2.0b lungimea identificatorului
este de 29 biti. Implementarile 2.0a transmit si receptioneaza doar mesaje cu identificator de 11 biti.
Implementarile 2.0b transmit si receptioneaza ambele tipuri de mesaje.

In versiunea CAN standard, mesajele au formatul prezentat in figura 4.

Fig. 4 Formatul mesajelor CAN 2.0a


Structura unui mesaj in format CAN2.0b este prezentata in figura 5.

Fig. 5 Formatul mesajelor CAN 2.0b

3. Reţeaua ZigBee – stiva ZigBee de la Microchip – implementare software


pentru PICDEM Z MRF24J40 Demo Kit

ZigBee reprezintă denumirea unei specificaţii tehnice utilizate în protocoalele de comunicaţii radio
digitale, de mică putere, bazate pe standardul IEEE 802.15.4 pentru reţele wireless personale ( Wireless
Personal Area Networks).
Versiunea ZigBee 1.0 a fost ratificată la 14 decembrie 2004. Operând în benzile radio de 868 MHz
(Europa), 915 MHz (SUA) şi 2,4 GHz în majoritatea ţărilor, un circuit radio
ZigBee produs în serie foarte mare costa în 2005 circa 1,10 dolari SUA, iar preţul unui microcontroler
dedicat este în prezent mai mic de 3 dolari.
Utilizând o tehnologie mult mai simplă şi mai ieftină decât alte reţele wireless, cu dimensiuni ale
software-ului între 2 % şi 10 % din cele pentru un nod Bluetooth tipic, reţelele ZigBee sunt destinate
aplicaţiilor cu consumuri foarte mici de putere (schimbarea bateriilor se poate face în unele cazuri doar o
dată la doi ani) şi care nu necesită rate mari de tranfer al datelor.
O reţea ZigBee poate fi utilizată într-o gamă largă de domenii, de la controlul industrial, reţelele
cu senzori integraţi, achiziţia de date medicale şi sistemele antiincendiu şi antiefracţie până la
automatizările din clădiri şi casele inteligente.

O reţea ZigBee WN este constituit ă dintr-o serie de module hardware ce permit măsurarea sau
comanda unor echipamente cu transmiterea radio digital ă a informaţiei.

Există dou ă categorii principale de module ZigBee WN :


Module coordonatoare,
Module finale (de măsurare sau de comandă).
Un modul coordonator reprezintă nucleul re ţelei ZigBee , el asigurând legătura între aceasta şi
un computer sau o altă reţea. Modulul coordonator stochează informa ţ ia despre modulele finale,
formând împreună o reţea în configuraţie "stea".
Sunt disponibile două tipuri de module coordonatoare:
WN-Ethernet
WN-USB
Modulul WN-Ethernet se conecteaz ă la un port Ethernet , permiţând astfel ca reţeaua de module
finale pe care le coordonează să poată fi accesat ă utilizând un computer conectat la Internet aflat oriunde
în lume.
Modulul WN-USB se conectează la un port USB al computerului, fiind util în situaţiile în care se
doreşte accesarea "locală" a reţelei de module finale.
Un modul coordonator poate dialoga cu până la 65.000 de module finale, asigurând rate de tranfer
de 250 kbps prin radio şi 115,2 kbps prin interfa ţa Ethernet sau USB . Puterea de emisie este de 60 mW
la 18 dBm, iar raza sa de acţiune este de până la 100 m în cl ădiri sau în mediu urban şi de pân ă la 1,6
km în linie direct ă.
Alimentat de la o sursă de 1,8 ... 6,5 Vcc cu minim 300 mA, modulul consumă circa 0,9 W în
perioadele de maximă activitate.

Fig. 6: Reţea ZigBee WN cu modul coordonator USB

Modulele finale îndeplinesc diverse funcţiuni specifice unui sistem de m ăsurare şi automatizare:
WN-AI şi WN-Current: module cu dou ă canale pentru măsurare de semnale analogice (tensiune
în intervalul ± 10 V RSE sau curent în intervalul 4 – 20 mA), utilizând un convertor Delta-Sigma
pe 24 de biţi, cu o rată maximă de eşantionare de 240 S/s, dispunând de o stivă FIFO proprie
pentru 500 de valori;
WN-DIO: modul cu patru linii digitale bidirecţionale, TTL sau CMOS, protejate pân ă la 47 V,
asigurând la ie şire pân ă la 500 mA la utilizarea unui singur canal sau până la 180 mA/canal
atunci când sunt activate toate cele patru canale;
WN-CNT: num ăr ător pe 32 de biţi, TTL sau CMOS, cu frecvenţa maxim ă de 5 MHz;
WN-RLY: modul cu două relee tip C (1 A la 30 Vcc şi 0,5 A la 30 Vca), cu frecvenţă maximă de
60 cpm.
Fiecare tip de modul final este disponibil în dou ă variante constructive, în func ţie de distanţa
maxim ă până la care modulul final se poate afla în raport de modulul coordonator:
modul cu rază scurtă de acţiune, dispunând de o antenă interioară, cu o putere de emisie de 1
mW, capabil de a comunica maxim pân ă la 30 m în incinte şi 100 m în exterior;
modul cu rază lungă de acţiune dispunând de o antenă exterioară, cu o putere de emisie de 60
mW, capabil de a comunica maxim până la 100 m în incinte şi 1,6 km în exterior.

4. Interconectarea CAN-ZigBee folosind MCP2515 CAN Development Board şi


PICDEM Z MRF24J40 Demo Kit

Aplicatia descrisa in acest document isi propune interconectarea unei retele CAN cu una ZigBee si
in cele ce urmeaza se vor prezenta detalii privind implementarea retelelor si interfatarea lor.
Finalitatea proiectului consta in transmiterea bidirectionala cu succes a mesajelor de la PC catre un
controller prin intermediul retelelor CAN si ZigBee interconectate.

4.1 Proiectare hardware:

Platforma hardware folosita include o placa de dezvoltare de la Microchip cu doua noduri CAN
implementate prin doua microcontrollere MCP2515. Fiecare din aceste controllere dispune de un
transceiver CAN MCP2515 care sunt conectate la un bus CAN.
Pentru implementarea comunicatiei wireless ZigBee dispunem de doua placi de dezvoltare dotate cu
cate un controller PIC18F si un transceiver radio MRF24J40. Una din aceste placi va constitui ZigBee
Coordinator-ul iar cealalta va fi End Device-ul.
Diagrama urmatoare ilustreaza conectarea tuturor dispozitivelor si protocoalele dintre ele:
PC
CANKing

Paralel port

CAN Bus
CAN node CAN node
MCP2515 CAN Development Kit MCP2515
w/ MCP2551 w/ MCP2551

SPI

MRF24J40
PIC18F4620
SPI
ZigBee Wireless
ZigBee End Device ZigBee Coordinator

MRF24J40 SPI
PIC18F4620

La nivelul PC-ului utilizatorul are acces asupra aplicatiei CANKing cu care monitorizeaza mesajele
primite de la nodul CAN implementat prin MCP2515 cu transceiverul sau. De asemeni utilizatorul poate
genera mesaje pentru nodul CAN care le va transmite pe bus. Comunicatia intre primul nod CAN si PC se
realizeaza prin portul paralel.
La nivelul comunicatiei CAN avem doua noduri identice materializate prin cele doua controllere
MCP2515 si transceiverele lor. Unul este conectat asa cum am mentionat, la PC iar celalalt prin SPI
comunica cu ZigBee coordinatorul implementat cu PIC18F.
Comunicatia wireless este realizata de cele doua emitatoare/receptoare MRF24J40 conectate cu cate
un PIC18F prin SPI. Asadar ZigBee coordinatorul are nevoie de doua interfete SPI, una spre modulul
radio iar cealalta spre nodul CAN iar ZigBee End Device-ul este (alaturi de PC) al doilea dispozitiv la
care utilizatorul va avea acces prin intermediul unor butoane si LED-uri
Pin Configuration MCP2515

Pin Configuration PIC18F4620

Pinii corespunzatori pentru implementarea comunicatiei SPI intre aceste 2 dispozitive sunt:

PIC18F4620 MCP2515
PIN number Signal PIN number Signal
23 MISO(SDO) 15 SO
24 MOSI(SDI) 14 SI
25 CK 13 SCK
22 RD3 16 CS

Dupa cum a fost mentionat, PIC18F comunica prin SPI si cu transceiverul ZigBee. Conexiunile sunt
realizate prin intermediul unui J2 connector. Configuratia pinilor transceiverului este prezentata mai jos:
Deoarece ZigBee coodinatorul are nevoie de comunicatie seriala dubla, atat cu transceiverul
MRF24j40 cat si cu nodul CAN exista pini comuni pentru aceasta si va fi nevoie de un arbitraj pentru
accesul la interfata SPI. ZigBee coordinatorul trebuie programat in asa fel incat sa gestioneze situatia
descrisa anterior. Aplicatia incarcata pe PIC18F4620 va initializa porturile si comunicatia pe SPI dupa
care la aparitia unui mesaj pe CAN (semnalat de portul RD3(CS pentru SPI)) va dezactiva intreruperile,
va despacheta informatia din mesaj si va pregati mesajul ZigBee pentru transceiver. La aparitia unui
mesaj pe ZigBee semnalat de o intrerupere, controllerul va construi mesajul CAN corespunzator si va
initia comunicatia SPI cu MC2515.
Deasemeni interconectarea intre nodul CAN si PIC18F4620 ridica probleme din doua puncte de
vedere. Alimentarea pentru MC2515 este la 5V iar pentru ZigBee coordinator la 3.3V. Trebuie dezolvat
un circuit aditional care sa interfateze electric semnalele dintre aceste doua controllere. Cea de-a doua
problema este legata de clock-ul pentru interfata SPI care trebuie sa aiba un fir ecranat si de lungime cat
mai scurta.
Pentru schimbul de mesaje pe bus-ul CAN trebuie stabilite doua ID-uri pentru cele doua noduri.
Evenimentele semnalate prin mesajele CAN (de la PC spre End Device si invers) trebuiesc deosebite prin
informatia codificata in mesaje.
Utilizatorul poate genera evenimente atat la PC prin generarea de mesaje cu ajutorul aplicatiei
CANKing cat si la nivelul EndDevice-ului prin actionarea butoanelor.
De asemeni, utilizatorul este anuntat de aparitia unui eveniment de catre CANKing la PC (aparitia
unui mesaj cu datele utile corespunzatoare evenimentului) cat si la EndDevice prin intermediul LED-
urilor.
4.2. Proiectare software:

Pentru resetarea dispozitivului se foloseste functia ResetMCP2515. Mai intai activat CS-ul, apoi
se activeaza pinul de reset, se asteapta un timp, dupa care se dezactiveaza CS-ul.

#define RD3 CS
void ResetMCP2515(void)
{
CS=0; // se selecteaza dispozitivul
MCP2515_RESET_PIN = 0;
delay_us(10);
MCP2515_RESET_PIN = 1;
CS=1; // se deselecteaza
dispozitivul}

Pentru initializare se va folosi functia InitMCP2515. Se reseteaza dispozitivul dupa care se scrie
prin SPI registrul RXB0CTRL astfel incat sa fie acceptate toate mesajele. De asemenea, pentru a putea fi
configurat modulul CAN, acesta trebuie trecut in modul de configurare. Dupa ce se configureaza se trece
in modul normal.

unsigned char InitMCP2515(void)


{
unsigned char mask = 0xFF;
unsigned char data = 0xFF;
unsigned char mode_set = 1;
CS=0;
ResetMCP2515();
mode_set = MCP2515_SET_MODE(CAN_CONFIGMODE);
if (1 == mode_set)
{
MCP2515_Mod(RXB0CTRL, mask, data, MCP_BITMOD);
mode_set= MCP2515_SET_MODE(CAN_NORMALMODE);
}
CS=1;
return mode_set;
}
Pentru setarea modului de functionare a controlului CAN se foloseste functia
MCP2515_SET_MODE. Se configureaza primii 3 cei mai semnificativi biti ai registrului CANCTRL
(care seteaza modul de functionare CAN), dupa care se face o verificare. Daca s-a scris corect in registru
se returneaza 1, altfel 0.
unsigned char MCP2515_SET_MODE(unsigned char mode)
{
unsigned char value;
MCP2515_write(CANCTRL, MOD_MASK, mode);
value = MCP2515_read(CANCTRL);
if(mode == (value>>5))
return 1;
else return 0;
}
Pentru a citi datele din registrii CAN se foloseste functia MCP2515_read. Pentru inceput se
activeaza dispozitivul (CS=0). Se trimite pe SPI adresa registrului din care se doreste sa se faca citirea si
se primeste inapoi valoarea aflata la adresa respectiva.

unsigned char MCP2515_read(unsigned char


register)
{
unsigned char value;
CS=0;
SPI_Write(READCMD);
SPI_Write(register);
value = SPI_Read(0x00);
CS=1;
return value;
}

Pentru a modifica valorile unor registri este necesar sa se treaca in modul de configurare. Se
trimite prin SPI comanda de BitModify, apoi adresa unde se doreste sa se faca modificare, masca (vor fi
modificati doar bitii corespunzator valorilor de 1), si data ce se doreste a fi scrisa in registrul respectiv.

void MCP2515_Mod(unsigned char address, unsigned char mask, unsigned


char data, unsigned char mode)
{
CS=0;
SPI_Write(mode);
SPI_Write(address);
SPI_Write(mask);
SPI_Write(data);
CS=1;
}
Pentru reprezentarea unui data frame CAN se va folosi structura CANMSG

typedef struct {
unsigned int ID;
unsigned char data[8];
unsigned char dlc;
unsigned char rtr;
} CANMSG;

Pentru transmisie pe CAN se va folosi urmatoarea functie:

int CAN_Transmit_Message(CANMSG *mesaj)


{
unsigned char semafor = 1;
unsigned char free_buf;
unsigned char register[3]={
MCP_TXB0CTRL,
MCP_TXB1CTRL,
MCP_TXB2CTRL
};
while(semafor)//se cauta buffer liber
{
for (int i=0; i<3 ; i++)
{
if((MCP2515_read(register[i])&0x08)==0)
{
*free_buf=register[i]+1;//SIDH address
semafor=0;
}
}
}

Write_Message_CAN(free_buff,mesaj);
MCP2515_Mod(free_buff-1, 0x08, 0xFF, MCP_BITMOD);
/* se modifica in TXBnCTRL-ul corespunzator bufferului in care s-a
scris mesajul valoarea TXREQ, transmisia incepand la eliberarea bus-
ului */

return 1;
}
Pentru scrierea mesajelor se foloseste functia:
void Write_Message_CAN(unsigned char free_buff,CANMSG *mesaj)
{
for(int i=0;i < mesaj->dlc;i++)
{
MCP2515_Mod(free_buff+5+i,0xFF,&(mesaj->data[i], MCP_WRITE);
}
MCP2515_Mod(free_buff,0xFF,((mesaj-
>ID)>>3)&0xFF,MCP_WRITE); MCP2515_Mod(free_buff+1,0xFF,
((mesaj->ID)<<5)&0xFF,MCP_WRITE);
MCP2515_Mod(free_buff+4,0xFF,mesaj->dlc,MCP_WRITE);
}

Pentru receptia mesajelor de pe CAN se foloseste functia:

unsigned char Read_Message_CAN(unsigned char free_buff,CANMSG


*mesaj){
if(MCP2515_read(CANSTAT) & 0x0F)==0x0C )
{
//buffer 0
mesaj->ID=(MCP2515_Read(RX_BUF_0)<<3)|
(MPS2515_Read(RX_BUF_0)>>5);
mesaj->dlc=MCP2515_Read(RX_BUF_0+4);
for(int i=0;i<8;i++)
mesaj->data[i]=MCP2515_Read(RX_BUF_0+5);
return 1;
}
else if(MCP2515_read(CANSTAT) & 0x0F)==0x0E )
{
//buffer 1
mesaj->ID=(MCP2515_Read(RX_BUF_1)<<3)|
(MPS2515_Read(RX_BUF_1)>>5);
mesaj->dlc=MCP2515_Read(RX_BUF_1+4);
for(int i=0;i<8;i++)
mesaj->data[i]=MCP2515_Read(RX_BUF_1+5);
return 1;

}
else return 0;
}
Functiile pentru SPI:
void SPI_Write(unsigned char v)
{
SSPIF = 0;
SSPBUF = v;
while( SSPIF == 0 );
}

unsigned char SPI_Read(void)


{
SPI_Write(0x00);
return SSPBUF;
}

Pentru initializarea microcontrolerului se vor folosi urmatoarele valori pentru registri:


SSPEN=0;
TRISC = 0x10;
TRISD = 0x08;
//RD3 configurat ca IO Digital
RD3 = 0;
SSPCON = 0x32;
SSPIF = 0;
//SSPCON<5>=SSPEN
//SSPCON<4>=CKP

S-ar putea să vă placă și