You are on page 1of 16

Tema: Sistem digital de achizitie a datelor cu transmiterea la

distanta. Radiocomanda pentru quadrocopter in baza modulelor nrf24l01


1. Studiul materialelor stiintifice
Proiectul va fi construit din 2 module aparte: unul in calitate de transmitator, si altul in calitate de receptor. Transmitatorul va consta dintr-un modul de achizitie a datelor cu utilizarea unui convertor analognumeric, si modulul radio. Receptorul va avea la intrare acelasi modul radio, iar partea soft va primi datele de la receptor, va verifica validitatea acestora, si corectia daca este necesara, mai apoi acestea vor fi transmise la iesire ca semnale modulate in pozitie (PPM). In calitate de unitate de procesare, atit pentru transmitator, cat si pentru receptor a fost luat mictrocontrollerul Atmel Atmega16. ATmega 16 este un microcontroler CMOS de 8 bii de mic putere bazat pe arhitectura RISC AVR imbunataita. Dispune de un set de 131 instruciuni i 32 de regitri de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logica Aritmetica (ALU), permind accesarea a doua registre independente intr-o singura instruciune. Se obine astfel o eficiena sporita in execuie (de pana la zece ori mai rapide decat microcontrorelerele convenionale CISC). ATmega16 este un microcontroler RISC pe 8 bii realizat de firma Atmel. Caracteristicile principale ale acestuia sunt: -16KB de memorie Flash reinscriptibil pentru stocarea programelor -1KB de memorie RAM -512B de memorie EEPROM -dou numrtoare/temporizatoare de 8 bii -un numrtor/temporizator de 16 bii -conine un convertor analog digital de 10 biti, cu intrri multiple -conine un comparator analogic -conine un modul USART pentru comunicaie serial (port serial) -dispune de un cronometru cu oscilator intern -ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD). Structura intern general a controlerului este prezentat n Figura 1. Se poate observa c exist o magistral general de date la care sunt conectate mai multe module: -unitatea aritmetic i logic (ALU) -registrele generale -memoria RAM i memoria EEPROM -liniile de intrare (porturile I/O Lines) i celelalte blocuri de intrare/ieire. Aceste ultime module sunt controlate de un set special de registre, fiecare modul avnd asociat un numr de registre specifice. Structura interna a microprocesorului poate se poate vedea in fig.1. Port A (PA7 .. PA0) Port-ul A servete drept port de intrri analogice pentru Convertorul A/D. Port-ul A serveste de asemenea i ca un port bidirecional I/O de 8 bii,n cazul n care Convertorul A/D nu este folosit. Pinii de port pot fi conectai opional la VCC prin rezistori interni, (selectai pentru fiecare bit). Buffer-ele de ieire ale Portului A au caracteristici de amplificare . Port B (PB7.. PB0) Portul B este un port I/O de 8 bii bidirecional cu rezistori interni (opionali). Buffer-ele de ieire ale Port-ului B au caracteristici de amplificare. Port-ul B indeplinete de asemenea funcii speciale ale microcontrolerului ATmega 16

Port C (PC7PC0) Portul C este un port I/O de 8 bti bidirecional cu rezistori interni (opionali). Buffer-ele de ieire ale Port-ului C au caracteristici de amplificare. Daca interfaa JTAG (de depanare) este activat, rezistorii pinilor PC5(TDI), PC3(TMS) si PC2(TCK) vor fi activai, chiar daca are loc o resetare. Port-ul C indeplinete de asemenea funcii ale interfeei JTAG i alte funcii speciale ale ATmega 16.

Fig. 1: Structura interna a microprocesorului ATmega16

Port D (PD7PD0) Portul D este un port I/O de 8 bii bidirecional cu rezistori interni conectai optional la VCC (selectai pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de amplificare. Port-ul D indeplinete de asemenea funcii speciale ale ATmega 16. Reset Un nivel sczut la acest pin mai mare ca durat decat o valoare prestabilit, va genera o iniializare. XTAL 1: Intrare pentru amplificatorul inversor al Oscilatorului; XTAL 2: Ieire pentru amplificatorul inversor al Oscilatorului. AVCC: AVCC este pin de alimentare pentru Port-ul A si Convertorului A/D. Trebuie conectat extern la Vcc, chiar dac ADC nu este folosit. Daca ADC este folosit , ar trebui conectat la Vcc printr -un filtru trece -jos. AREF :AREF este pinul de referina analogica pentru Convertorul A/D Figura 2 ne prezint n paralel o instruciune provocat i instruciunea de execuie permis de arhitectura Harward i accesul rapid la regitrele fiier. Acesta este conceptul de baz pentru a obine mai mult de 1 MIPS /MHz i cele mai bune rezultate din punct de vedere funciuni/cost , funciuni/timp i funciuni/unitate.

Fig.2: Instruciuni paralele de executie Figura 3 ne arat timpul de registriu. ntr-un singur ciclu de ceas o operaie ALU folosete 2 registre pentru a executa calculul respectiv. Iar rezultatul este stocat napoi n registrul de destinaie .

Fig.3: Operaii ALU ntr-un singur ciclu de ceas Toate porturile AVR , utilizate ca porturi digitale I/O ndeplinesc funciile de citire/scriere i pot fi modificate.Cu instruciunile SBI i CBS direcia unui port-pin poate fi schimbat fr ca acest lucru s afecteze ceilali pini. Aceste caracteristici se pstreaz i n cazul modificrii valorii de driver(dac este configurat ca o ieire) sau de activare/dezactivare dac rezistorii sunt dezactivai(dac este configurat ca o intrare). Fiecare buffer de ieire are caracteristici de drive simetrice cu ambele capaciti ale sursei. Pinul driver-ului are suficient putere pentru o afiare direct.Toi pinii porturilor au fiecare rezistori de pull-up selectabili cu rezerve de putere. Toi pinii I/O au diode de protecie la ambele surse de curent digitale si mpmntare.

Fig.4: Schema echivalent a pinilor I/O Proiectarea sistemului de achizitie a datelor Microprocesorul ATmega16 are incorporat 8 convertoare analog-digitale (ADC) cu rezolutia de 10 biti. Schema bloc a convertorului este aratata in figura 6, iar diagrama temporala a convertorului este prezentata in figura 5.

Fig.5: Diagrama temporala a convertorului analog-numeric Pentru ca convertorul sa poate functiona este necesar sa alimental pin-ul AREF, sau AVCC cu o tensiune de referinta, aceasta poate fi efectuata de la o sursa stabilizata de tensiune si eventual filtrate cu ajutorulul unui filtru trece-jos LC.

Valoare adc-ului este calculata conforma urmatoarei formule: Din formula de mai sus putem deduce o formula pentru calculul tensiunii de intrare VIN. Adc-ul are o eroare de neliniaritate de 0.5 LSB, iar acuratetea medie este de 2 LSB. Limita tensiunii de intrare este data de tensiunea de alimentare a microcontrollerului, adica maxim 5v.

Fig.6: Schema bloc a modulului de conversie ADC


Proiectarea sistemului de transmisiune a datelor Sistemele de calcul pot s comunice n dou moduri: paralel i serial. n modul paralel, de obicei se utilizeaz 8 sau mai multe linii (cabluri). Exemple de utilizare acomunicaiei paralele sunt imprimanta sau hard discul. Comunicaia paralel seutilizeaz doar pentru distane foarte scurte (civa metri). Motivul este de fapt c pentru cablurile lungi, semnalele sunt atenuate i pot apare distorsiuni. n plus nu este deloc de neglijat costul cablurilor i problemele ce pot apare la conexiuni. Avantajul comunicaiei paralele este viteza mare de transmisie. Comunicaia serial este utilizat pentru sisteme aflate la mare distan intre ele. Comunicaia serial utilizeaz un numr redus de cabluri. n comunicaia serial, datele transmise trebuie serializate la transmisie i deserializate la recepie. Pentru aceasta, la transmisie se utilizeaz un registru paralelserie iar la recepie un registru serie-paralel. Registrul paralel-serie este utilizat pentru transformarea

unei date de 8 bii intr-un ir de bii. Registrul serie-paralel este utilizat pentru transformarea unui ir de 8 bii intr-unoctet. Pentru distane lungi, comunicaia paralel poate utiliza linia telefonic. n acest caz semnalele logice 0 i 1 trebuie transformate n semnale sinusoidale. Aceast conversie este realizat de un dispozitiv numit modem (MODulator/DEModulator). Pentru distane scurte aceast conversie nu este necesar. De exemplu, tastatura i mouse-ul comunic serial informaia ctre unitatea centrala a PC. Comunicaia serial utilizeaz dou metode: - sincron: se transfer blocuri de octei (caractere) - asincron : se transfer cte un octet. Se pot realiza programe pentru realizarea comunicaiei seriale ns acestea pot fi lungi. Este indicat ca programatorul s se concentreze asupra problemelor specifice aplicaiei i nu asupra unei probleme extrem de generale precum comunicaia serial. Aici intervin i aspectele economice legate de productivitatea muncii. Din acest motiv productorii de circuite au realizat circuite ce rezolv problemele legate decomunicaia serial. Aceste circuite se numesc UART (Universal Asyncronus Receiver Transmitter).

Microcontrolerul ATMega8 conine un asemenea modul (UART) nglobat. Dinacest motiv n cele ce urmeaz ne vom referi doar la comunicaia asincron. Dacdatele pot fi transmise i recepionate simultan, se spune ca avem comunicaie fullduplex. Dac datele nu pot fi trimise i recepionate simultan, se spune ca avem comunicaie half duplex . Aici termenul simultan se refera la faptul ca ambele sisteme pot transmite date nacelai moment de timp. O alt situaie este cazul n care unul din sisteme este doar un transmitor celalalt este doar un receptor (comunicaie simplex ). Pentru comunicaia fullduplex sunt necesare dou fire (plus firul de mas). a) Comunicaia asincron. Cele dou sisteme, pentru a putea comunica intre ele, trebuie sa respecte o serie de reguli. Trebuie stabilite convenii referitoare la: - modul de mpachetare al datelor; - numrul de bii ai unui caracter; - cum se identifica nceputul unei date; - cum se identifica sfritul unei date; - care este durata unui bit. b) Formatul datelor. Comunicaia asincron este frecvent utilizata pentru transmisia orientat pe caracter; comunicaia sincron este utilizata pentru transmisia orientat pe blocuri de date. n

comunicaia asincron fiecare caracter este ncadrat intre bii de start i bii de stop. De fapt totdeauna se folosete un bit de start (0 logic) i de obicei un bit de stop(1 logic). c) Rata de transfer. Rata de transfer reprezint numrul maxim de bii ce pot fi transmii intr-o secund. Este dat n bps (bii per second). Alt termen des utilizat pentru bps este baudrate. Cei doi termeni nu sunt identici. Termenul baud rate este preluat din terminologia modemurilor unde este definit ca numrul de schimbri pe secund ale unui semnal. Sunt situaii cnd o singur modificare a semnalului conduce la transferul mai multor bii de date. Totui i dac nu se utilizeaz modemul se pot utiliza ambii termeni. Ratade transfer depinde de portul de comunicaie al sistemului. De exemplu, pentru PC-urile mai vechi rata de transfer de date este 100 9600 bps. Noile PC -uri suporta orata maxim de transfer de 115.2 Kbps. Interfata SPI Interfaa serie SPI (serial peripheral interface) este o interfa sincron, de mare vitez, pentru transferul datelor ntre un microcontroler AVR i un dispozitiv periferic sau ntre dou microcontrolere AVR. Transferul pe interfaa SPI se face cu urmtoarele caracteristici: transfer fullduplex (pe trei fire), operare master slave, transfer cu primul bit LSB sau MSB, patru viteze de transfer, semnalizare sfrit de transmisie i activare din modul de consum redus. Scrierea datelor n registrul de date al dispozitivului master va genera activarea generatorului de ceas i data va fi transferata bit cu bit pe linia MOSI, prin intermediul registrului de deplasare. In figura nr 7 este prezentata diagrama temporala a interfetei SPI.

Fig.7: Diagrama temporala pentru interfata SPI In calitate de modul de comunicare a fost ales modulul nRF24l01. Transmitatorul este poate fi alimentat de o tensiune de la 1.9v pina la 3.6v. Acesta poate comunica cu o viteza de pina la 2 Mb/s. Modulul comunica pe o frecventa de 2.4GHz, iar tipul modulatiei este GFSK In figura 8 este afisat transmitatorul, acesta comunica cu microcontrollerul ATmega16 prin interfata SPI.

Fig.8: Aspectul exterior al transmitatorului

2. Metode de proiectare
Transmitatorul Joystic-ul care reprezinta sistemul care ofera datele pentru achizitie are 4 axe, care reprezinta niste potentiometre si 6 butoane. Fiecare axa(potentiometru) va fi conectat in schema ca un divizor de tensiune, astfel ca valoarea tensiunii va reprezenta pozitia axei. Butoanele insa pot fi citite ca valor logice, adica 0 sau 1. Pentru indicarea starii transmitatorului vom monta pe placa si 3 leduri. Fiecare din acestea reprezentind o stare distincta.

RN1
10k

U1
9 RESET XTAL1 XTAL2 PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK ATMEGA16

RV1 RV2
50% 51%

13 12 40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8

1k

PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2

22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21

RV3 RV4
50% 50%

1k

1k

1k

AREF AVCC

32 30

VCC GND

SCN MOSI MISO SCK IRQ CE

Fig.2.1: Schema electrica de principiu a transmitatorului In figura 2.1 este prezentata schema electrica de principiu a transmitatorului. In aceasta schema elementele RV1-RV4 reprezinta axele sistemei de achizitie. In partea dreapta a schemei vedem 6 butoane functionale conectate. RN1 este o retea de rezistente pull-up, aceste rezistene mentin nivelul logic 1 cand butoanele sant deconectate, astfel ridicand fiabilitatea circuitului. Mai jos de butoane sant prezentate diodele led impreuna cu rezistentele ce limiteaza curentul prin acestea. In partea stanga este aratat modulul de transmisie care este interconectat cu microprocesorul prin interfata SPI

8 7 6 5 4 3 2

Fig.2.2: Cablajul transmitatorului In figura 2.2 este prezentat cablajul transmitatorului trasat in programul Diptrace. Mentionez ca toate piesele utilizate sant ca form-factor in SMD (surface-mount device), de ex in centrul imaginii este amplasat microprocesorul, iar in partea stanga a placii sant amplasate gaurile in care ulterior vor fi pinii modulului de transmisie nRF24l01. Partea software a transmitatorului este scrisa in limbajul c++ cu utilizarea utilitariului Arduino, codul sursa al acestuia este amplasat in Anexa nr 1. Receptorul Receptorul este constituit din modulul de receptionare, micotrontrollerul ATmega16 si portul de iesire a semnalelor modulate in pozitie (PPM)

U1
9 13 12 40 39 38 37 36 35 34 33 1 2 3 4 5 6 7 8 RESET XTAL1 XTAL2 PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK ATMEGA16 PC0/SCL PC1/SDA PC2/TCK PC3/TMS PC4/TDO PC5/TDI PC6/TOSC1 PC7/TOSC2 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2 22 23 24 25 26 27 28 29 14 15 16 17 18 19 20 21 1 2 3 4 5 6 7 8 9 10

J1

51441-1093

VCC GND

SCN MOSI MISO SCK IRQ CE

AREF AVCC

32 30

Fig.2.3: Schema electrica de principiu a receptorului Schema receptorului este aproape echivalenta cu cea a transmitatorului, insa acesta nu are modul de achizitie a datelor. In partea dreapta a schemei putem vedea conectorul J1. Prin acest conector se vor transmite datele la iesirea receptorului. Aceste date trebuie sa fie modulate PPM. Diagrama temporala a unui astfel de semnal este prezentata in figura 2.4

Fig.2.4: Diagrama temporala a unui semnal digital modulat in pozitie

Fig.2.5: Cablajul placii receptorului Cablajul receptorului are dimensiunile exact proiectate pentru quadrocopter, iar pentru reducerea influientei undelor radio asupra schemei, precum si galagia magnetica produsa de elementele schemei sa nu influientele modulul receptorului in acest scop plata a fost ecranata cu un poligon conectat cu borna 0 a sursei de alimentare. Codul sursa al programului receptorului de asemenea poate fi gasit in Anexa nr 2

3. Rezultate
Rezultatele executiei le puteti vedea in figurile

Concluzii In rezultatul efectuarii lucrarii putem formula urmatoarele concluzii: 1) Alegerea microcontrollerului ATmega 16 s-a dovedit o alegere reusita, deoarece acesta are o viteza de procesare destul de mare, are integrate in el modulul ADC, precum si interfata seriala, SPI s.a 2) Placa a fost trasata in programul Diptrace, acesta fiind gratuit, insa este o alternativa la proiectele comerciale mari ca Altium Designer. Comoditatea programului s-a dovedit a fi foarte buna, lucrul cu acesta este unul familiar cu alte produse din categoria CAD 3) Transceiverele nRF24l01 pot transmite date pana la distante de cateva sute de metri. Acestea au un sistem de verificare si corectare a erorilor, ceea ce le face foarte comode in utilizare si dezvoltare rapida. Bibliografie:
1. Pulse-position modulation [Resursa electronica]: Regim de access: http://en.wikipedia.org/wiki/Pulseposition_modulation , accesat la data 21.11.12. 2. . NRF24L01+ DS18B20 [Resursa electronica]: Regim de access: http://avrproject.ru/publ/peredacha_izmerennoj_temperatury_po_radiokanalu_svjazka_nrf24l01_i_ds1 8b20/1-1-0-106 , accesat la data 22.11.12. 3. Proiectarea interfeelor de comunicare [Resursa electronica]: Regim de access: http://ru.scribd.com/doc/53247522/24/Proiectarea-interfe%C5%A3elor-de-comunicare , accesat la data 20.11.12. 4. ATmega16 [Resursa electronica]: Regim de access: http://www.atmel.com/Images/doc2466.pdf , accesat la data 22.11.12.

Anexa nr 1
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" const uint8_t adc[]= {A0,A1,A2,A3}; const int bp[] = {2,3,4,5,6,7}; // the number of the pushbutton pin

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 RF24 radio(8,10); // Single radio pipe address for the 2 nodes to communicate. const uint64_t pipe = 0xE8E8F0F0E1LL; char led1 = 0; char led2 = 1; int count=49; int adc1=0, adc2=0, adc3=0, adc4=0; unsigned char data[5]; int adcread=0; char u=0; int ADCsingleREAD(uint8_t adctouse) { int ADCval; ADMUX = adctouse; ADMUX |= (1 << REFS0); ADMUX &= ~(1 << ADLAR); // use #1 ADC // use AVcc as the reference // clear for 10 bit resolution // 128 prescale for

ADCSRA|= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); 8Mhz ADCSRA |= (1 << ADEN); // Enable the ADC ADCSRA |= (1 << ADSC); // Start the ADC conversion

while(ADCSRA & (1 << ADSC)); finish

// Thanks T, this line waits for the ADC to

ADCval = ADCL; ADCval = (ADCH << 8) + ADCval; return ADCval; }

// ADCH is read so ADC can be updated again

void setup(void) { // // Setup and configure rf radio analogReference(EXTERNAL); radio.begin(); // // Open pipes to other nodes for communication // radio.openWritingPipe(pipe); for(uint8_t i=0;i<6;i++)

{ pinMode(bp[i], INPUT); } pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); for(int j=0; j<5; j++) {data[j]=0;} } void loop(void) { count++; if(count>=999) count=100;

adc1=ADCsingleREAD(0)/10; delay(3); adc2=ADCsingleREAD(1)/10; delay(1); adc3=ADCsingleREAD(2)/10; delay(1); adc4=ADCsingleREAD(3)/10; delay(1); data[0]=adc1+30; data[1]=adc2+30; data[2]=adc3+30; data[3]=adc4+30; // date[0]=analogRead(A3)/10+30; for(int i=0; i<6; i++) { if(digitalRead(bp[i])==0) { data[4]=30+i*21; digitalWrite(led1, HIGH); count=1; } }

if(count==20) { digitalWrite(led1, LOW); } digitalWrite(led2, HIGH); radio.write( data, sizeof(data) ); digitalWrite(led2, LOW); // Try again in a short while delay(20); }

Anexa nr 2
#include #include #include #include Servo Servo Servo Servo Servo int 140 int int int int <SPI.h> <Servo.h> "nRF24L01.h" "RF24.h"

motor1; motor2; motor3; motor4; motor5; // variable to store the speed of the motor min 30---max

speed1 = 30; speed2 speed3 speed4 speed5 = = = = 30; 30; 30; 30;

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 RF24 radio(9,10); // Single radio pipe address for the 2 nodes to communicate. const uint64_t pipe = 0xE8E8F0F0E1LL; unsigned long lastTime=0; void setup(void) { Serial.begin(4800); // // Setup and configure rf radio // radio.begin(); // // Open pipes to other nodes for communication // radio.openReadingPipe(1,pipe); radio.startListening(); motor1.attach(14); motor2.attach(15); motor3.attach(16); motor4.attach(17); motor5.attach(18); } void loop(void) { motor1.write(speed1); motor2.write(speed2); motor3.write(speed3); motor4.write(speed4); motor5.write(speed5); handleSerial(); timeout();

Serial.write(" "); Serial.write(speed1); Serial.write(" "); Serial.write(speed2); Serial.write(" "); Serial.write(speed3); Serial.write(" "); Serial.write(speed4); Serial.write(" "); Serial.write(speed5); Serial.write(" "); Serial.write("\n\r"); } void handleSerial() { char CHANNELS=5; unsigned char date[6]; // Handle Serial Data if (radio.available()) { bool done = false; while (!done) { done=radio.read( date, CHANNELS ); delay(3); } //radio.flush(); speed1=date[0]; speed2=date[1]; speed3=date[2]; speed4=date[3]; speed5=date[4]; lastTime=millis(); } } void timeout() { if(millis()-lastTime >2000) { speed1=30; } }

You might also like