Robot Autonom Pentru Detectia Scurgerilor de Gaze
ROBOT AUTONOM PENTRU DETECȚIA SCURGERILOR DE GAZE
Proiect de diplomă
Cuprins
Introducere
Capitolul 1 Descrierea generală a vehiculului autonom
1.1 Descrierea microcontrolerului folosit : Atmel ATmega328P
1.1.1 Caracteristici generale si parametri cheie
1.1.2 Schema bloc
1.1.2.1 Unitatea centrală de procesare (CPU)
1.1.2.2 Organizarea memoriei
1.1.2.3 Opțiunile de oscilator
1.1.2.4 Surse de reset
1.1.2.5 Porturile I/O
1.1.2.6 Convertorul analog-numeric (ADC)
1.1.2.7 Intreruperile
1.1.2.8 Modulele de tip timer-numărător
1.1.2.9 Interfața SPI
1.1.3 Setul de instrucțiuni
1.1.4 Mediul de dezvoltare integrat Arduino și platforma de dezvoltare
1.2 Modulul de senzori pentru urmărirea traseului
1.2.1 Caracteristici generale și parametri cheie
1.3 Locomoția vehiculului autonom
1.3.1 Punțile H folosite : Infineon TLE5206
1.3.2 Modulația impulsurilor în durată
Capitolul 2 Descrierea funcționării vehiculului autonom
2.1 Citirea și interpretarea poziției liniei traseului. Calibrarea senzorilor
2.2 Controlerul PID
2.3 Controlul motoarelor
2.4 Schema electrică și cablajul imprimat
Capitolul 3 Descrierea generală a modulului de detecție și alarmare
3.1 Senzorul de gaz
3.2 Modulul de comunicație radio folosit : XBee Series 2
3.2.1 Caracteristici și configurația pinilor
3.2.2 Protocolul de comunicație
3.2.2.1 Rețeaua personală
3.2.2.2 Canalul RF
3.2.2.3 Tipuri de dispozitive și topologii de rețea
3.2.2.4 Securitate
3.3 Configurarea modulelor XBee pentru proiectul prezentat
Capitolul 4 Descrierea funcționării modulului de detecție și alarmare
4.1 Schema electrică și cablajul imprimat
Concluzii
Bibliografie
ANEXA 1 Imagini cu realizarea practică
ANEXA 2 Codul sursă al vehiculului autonom
ANEXA 3 Codul sursă al modulului de detecție și alarmare
Listă de figuri
Figura 1.1 Configurația pinilor microcontrolerului pentru capsulele TQFP32 și DIP28 19
Figura 1.2 Schema bloc a microcontrolerului Atmel ATmega328P 20
Figura 1.3 Principiul de funcționare al modulelor de tip timer-numărător 24
Figura 1.4 Mediul integrat de dezvoltare Arduino 26
Figura 1.5 Corespondența pinilor pentru capsula DIP28. 26
Figura 1.6 Schema electrică a modulului de senzori în infraroșu 27
Figura 1.7 Modulul de senzori în infraroșu 28
Figura 1.8 Forma de undă a semnalului de ieșire pentru unul dintre cei opt senzori 28
Figura 1.9 Principiul direcției diferențiale 29
Figura 1.10 Motoarele folosite 30
Figura 1.11 Structura generalizată a unei punți H 30
Figura 1.12 Vedere de ansamblu asupra capsulei P-TO263-7-1 31
Figura 1.13 Configurația pinilor punții H folosite 32
Figura 1.14 Schema bloc a punții H 32
Figura 1.15 Exemplificarea formelor de undă în cazul modulației impulsurilor în durată pentru cinci valori ale factorului de umplere 33
Figura 2.1 Schema bloc a vehiculului autonom 35
Figura 2.2 Organigrama care descrie funcționarea vehiculului autonom 35
Figura 2.3 Principiul controlerului PID 37
Figura 2.4 Poziția de echilibru 37
Figura 2.5 Schema electrică a vehiculului autonom 39
Figura 2.6 Partea superioară a cablajului imprimat 40
Figura 2.7 Partea inferioară a cablajului imprimat 40
Figura 3.1 Senzorul de gaz MQ-4 41
Figura 3.2 Caracteristica de sensibilitate a senzorului de gaz MQ-4 41
Figura 3.3 Modulul care conține senzorul de gaz 42
Figura 3.4 Schema electrică a modulului care conține senzorul de gaz 42
Figura 3.5 Modulul de comunicație radio XBee Series 2 42
Figura 3.6 Configurația pinilor modulului XBee S2 43
Figura 3.7 Exemplu de realizare a unei rețele prin combinarea topologiilor fundamentale 45
Figura 3.8 Adresele necesare realizării rețelei 46
Figura 3.9 Adaptorul XBee-USB 46
Figura 3.10 Verificarea portului USB-serial 47
Figura 3.11 Verificare cu succes 47
Figura 3.12 Inițierea comenzii de citire a parametrilor și afișarea acestora 48
Figura 3.13 Configurarea cu succes a modulului XBee S2 48
Figura 4.1 Convertorul de nivel 49
Figura 4.2 Organigrama care descrie funcționarea modulului de detecție și alarmare 50
Figura 4.3 Schema electrică a modulului de detecție și alarmare 51
Figura 4.4 Partea superioară a cablajului imprimat împreună cu senzorul de gaz 52
Figura 4.5 Partea inferioară a cablajului imprimat 52
Listă de tabele
Tabelul 1.1 Tabela vectorilor de întrerupere ai microcontrolerului 23
Tabelul 1.2 Modurile de funcționare ale punții H generalizată în Figura 1.11 31
Tabelul 1.3 Tabelul de adevăr pentru puntea H folosită 32
Tabelul 1.4 Reprezentarea simbolurilor L și H 33
Listă de acronime
ADC : Analog to Digital Converter (convertor analog-numeric)
BOR : Brownout Reset (resetare la scăderea tensiunii de alimentare sub un anumit nivel)
CTC : Clear Timer on Compare (resetarea timerului la comparare)
DMOS : Double-diffused metal-oxide-semiconductor (semiconductor metal-oxid cu dublă difuzie)
DSSS : Direct-sequence Spread Sprectrum (modulație în secvență directă cu spectru împrăștiat)
EEPROM : Electrically Erasable Programmable Read-Only Memory (memorie read-only programabilă și anulabilă electric)
IDE : Integrated Development Environment (mediu de dezvoltare integrat)
IEEE : Institute of Electrical and Electronics Engineers (Institutul Inginerilor Electrotehniști și Electroniști)
ksps : Kilosamples per second (mii de eșantioane pe secundă)
LSB : Least Significant Byte (octetul cel mai putin semnificativ)
MIPS : Million instructions per second (milioane de instrucțiuni pe secundă)
MSB : Most Significant Byte (octetul cel mai semnificativ)
PAN : Personal Area Network (retea de date personală)
PCB : Printed Circuit Board (placă de cablaj imprimat)
PID : Proportional-integral-derivative (proporțional-integral-derivat)
ppm : parts per million (părți la milion)
POR : Power-On-Reset (resetare la pornire)
PWM : Pulse width modulation (modulația impulsurilor în durată)
RISC : Reduced instruction set computing (arhitectură de calcul cu set redus de instrucțiuni)
SPI : Serial Peripheral Interface (interfață serială pentru periferice)
SRAM : Static Random Access Memory (memorie statică cu acces aleator)
T/C : Timer/Counter (timer/numărător)
TWI : Two Wire Interface (interfață pe două fire)
USART : Universal Synchronous-Asynchronous Receiver/Transmitter (receptor/transmițător sincron-asincron universal)
Introducere
Odată cu adoptarea la nivel global a noțiunii de casă inteligentă (smart home), una dintre direcțiile de cercetare este conceptul de casă inteligentă pentru persoane în vârstă sau cu dizabilități. Aceasta este o ramură a sistemelor de automatizare a locuinței, permițând traiul în locuința proprie în condiții decente de siguranță și confort.
Există două tipuri principale de astfel de sisteme de automatizare a locuinței :
sisteme integrate de sănătate (embedded health systems)
rețele private de sănătate (private health networks).
Sistemele integrate de sănătate, categorie din care face parte și acest proiect, folosesc echipamente bazate pe microprocesoare sau microcontrolere și senzori sau rețele de senzori integrați care colectează date din mediul locuinței. Aceste date sunt analizate și se pot folosi în evaluarea condițiilor de sănătate, siguranță, confort s.a. ale respectivei persoane.
Prezentul proiect vine să sprijine afirmațiile de mai sus prin implementarea unui sistem autonom pentru detecția scurgerilor de gaze în locuință. Cea mai mare parte a sistemelor existente pe piață sunt echipamente portabile sau fixe, de aceea proiectul prezentat în această teză are ca și caracteristici esențiale mobilitatea și posibilitatea controlului unor parametri de la distanță.
Un robot autonom este un sistem care poate îndeplini sarcini cu un nivel înalt de autonomie.
Un astfel de sistem trebuie să aibă următoarele abilități:
obținerea de informații despre mediul înconjurător
operarea pentru lungi perioade de timp, fără intervenție umană
deplasarea autonomă în mediul său de operare, fără asistență umană
evitarea situațiilor dăunătoare pentru oameni, pentru bunuri sau pentru sine
Roboții autonomi sunt utilizați pe scară largă în industrie, aceștia putând lucra în permanență. Costurile unei astfel de implementări devin tot mai accesibile, iar perspectiva pe termen lung este una foarte favorabilă ținând cont de complexitatea sarcinilor îndeplinite. Cei mai avansați roboți autonomi pot analiza și se pot adapta în timp real în cazul apariției unei situații nemaiîntâlnite, putând asocia diverse scenarii cu diverse acțiuni.
Sistemul prezentat are la bază un vehicul care se va deplasa autonom pe un traseu anume, pe podea (sau pe o conductă de gaze în cazul unei dezvoltări ulterioare). Locomoția acestuia se realizează cu ajutorul a două motoare de curent continuu, direcția fiind de tip diferențial, iar controlul acesteia se realizează prin intermediul unei bucle închise de control. Urmărirea traseului se face folosind o bară de senzori în infraroșu. Vehiculul autonom este dotat cu un modul conținând senzorul de gaz și sistemul de transmitere a alarmei de detectare a unei scurgeri. Alarma se transmite folosind un modul de comunicație radio, fiind recepționată pe un calculator folosind o consolă serială, pragul de la care se transmite alarma fiind setabil de la distanță.
Teza este structurată în patru capitole. Capitolele 1 și 2 descriu vehiculul autonom, iar prezentarea modulului de detecție și alarmare este realizată în capitolele 3 și 4. În încheiere, se prezintă concluziile și eventualele direcții de dezvoltare.
Descrierea generală a vehiculului autonom
Descrierea microcontrolerului folosit : Atmel ATmega328P
Vehiculul autonom realizat foloseste microcontrolerul ATmega328P care face parte din familia ATmega, una dintre familiile de microcontrolere pe 8 biți de la Atmel. Această familie conține microcontrolere de uz general, cu putere de calcul mare la preț redus, având și alte beneficii, dintre care amintesc:
memoria de program tip Flash
până la 100 de pini intrare-ieșire
varietate mare de periferice
Figura 1.1 Configurația pinilor microcontrolerului pentru capsulele TQFP32 și DIP28 [1]
Caracteristici generale si parametri cheie
microcontroler performant pe 8 biți, cu un consum redus de energie
arhitectură de tip RISC
set cu 131 de instrucțiuni
32 de registre de uz general a câte 8 biți
execută până la 20 MIPS la 20 MHz
segmente de memorie performante
32 KB memorie programabilă tip Flash
1 KB memorie EEPROM
2 KB memorie SRAM
o gamă largă de periferice
2x timer-numărător(T/C 0,2) pe 8 biți cu prescaler separat și mod de comparare
1x timer-numărător(T/C 1) pe 16 biți cu prescaler separat, mod de comparare și mod de captură
șase canale pentru realizarea modulației impulsurilor în durată (PWM)
convertoare analog-numerice pe 10 biți cu măsurarea temperaturii (ADC 0-7), (6 în capsulă DIP28, 8 în capsulă TQFP32)
interfață serială USART
interfață serială SPI
interfață serială TWI compatibilă I2C
23 de pini programabili de intrare-ieșire
interval de temperatură suportat : -40 – 85°C
interval al tensiunii de alimentare : 1,8 – 5,5 V
Schema bloc
In continuare, se va prezenta schema bloc a microcontrolerului și se vor analiza sumar cele mai importante blocuri funcționale.
Figura 1.2 Schema bloc a microcontrolerului Atmel ATmega328P [1]
Unitatea centrală de procesare (CPU)
Pentru a maximiza performanța și paralelismul, unitatea centrală de procesare folosește o arhitectură de tip Harvard, denumită în continuare AVR, cu memorie și magistrale de memorie separate pentru program și pentru date, permițând accesarea simultană a memoriilor de program și de date.
Instrucțiunile din memoria de program sunt executate pe un singur nivel. In timp ce o instrucțiune este executată, următoarea este pre-încărcată din memoria de program. Acest concept permite executarea de instrucțiuni in fiecare tact de ceas.
Organizarea memoriei
Arhitectura AVR deține două zone principale de memorie : memoria de date și memoria de program. Su
arhitectură de tip RISC
set cu 131 de instrucțiuni
32 de registre de uz general a câte 8 biți
execută până la 20 MIPS la 20 MHz
segmente de memorie performante
32 KB memorie programabilă tip Flash
1 KB memorie EEPROM
2 KB memorie SRAM
o gamă largă de periferice
2x timer-numărător(T/C 0,2) pe 8 biți cu prescaler separat și mod de comparare
1x timer-numărător(T/C 1) pe 16 biți cu prescaler separat, mod de comparare și mod de captură
șase canale pentru realizarea modulației impulsurilor în durată (PWM)
convertoare analog-numerice pe 10 biți cu măsurarea temperaturii (ADC 0-7), (6 în capsulă DIP28, 8 în capsulă TQFP32)
interfață serială USART
interfață serială SPI
interfață serială TWI compatibilă I2C
23 de pini programabili de intrare-ieșire
interval de temperatură suportat : -40 – 85°C
interval al tensiunii de alimentare : 1,8 – 5,5 V
Schema bloc
In continuare, se va prezenta schema bloc a microcontrolerului și se vor analiza sumar cele mai importante blocuri funcționale.
Figura 1.2 Schema bloc a microcontrolerului Atmel ATmega328P [1]
Unitatea centrală de procesare (CPU)
Pentru a maximiza performanța și paralelismul, unitatea centrală de procesare folosește o arhitectură de tip Harvard, denumită în continuare AVR, cu memorie și magistrale de memorie separate pentru program și pentru date, permițând accesarea simultană a memoriilor de program și de date.
Instrucțiunile din memoria de program sunt executate pe un singur nivel. In timp ce o instrucțiune este executată, următoarea este pre-încărcată din memoria de program. Acest concept permite executarea de instrucțiuni in fiecare tact de ceas.
Organizarea memoriei
Arhitectura AVR deține două zone principale de memorie : memoria de date și memoria de program. Suplimentar, microcontrolerul în cauză conține și o memorie nevolatilă EEPROM pentru stocarea datelor ce trebuie păstrate la întreruperea alimentării, cum ar fi tabele de calibrare sau setări de configurare.
Memoria de program de tip flash, în cazul microcontrolerului folosit, are dimensiunea de 32 KB și este o memorie de tip nonvolatil, păstrându-și conținutul la întreruperea alimentării.
Din motive de securitate, este divizată în două spații : boot-loaderul și secțiunea aplicației de program, având o anduranță de cel puțin 10000 cicluri de citire-scriere.
Memoria de date este implementată ca o memorie RAM statică, fiind foarte rapidă la operațiile de citire și de scriere. Aici se stochează variabilele programului în timpul rulării acestuia.
Microcontrolerul Atmel ATmega328P deține 2 KB de memorie de date.
Memoria de tip EEPROM folosește o tehnologie mai veche pentru implementarea unei memorii nonvolatile. In general, se folosește la stocarea unor setări sau a unor parametri între resetări ale microcontrolerului.
In cazul de față, microcontrolerul folosit dispune de 1 KB de memorie EEPROM, aceasta având o anduranță de cel puțin 100000 cicluri citire-scriere.
Opțiunile de oscilator
Microcontrolerul deține mai multe surse de ceas, fapt ce îi permite să fie utilizat într-o mare varietate de aplicații, maximizând performanțele și minimizând consumul de energie electrică.
Sursa de ceas poate fi:
sursă de ceas externă
oscilator intern calibrat de 8MHz
oscilator intern de 128KHz
oscilator cu cristal de quartz extern
rezonator ceramic
circuite RC
Surse de reset
Atmel ATmega328P are patru surse de resetare:
resetare la pornire (POR) : microcontrolerul fiind resetat atunci când tensiunea de alimentare este sub un prag VPOT
resetare externă : microcontrolerul se resetează la apariția unui nivel logic de zero pe pinul RESET
resetare comandată de watchdog : microcontrolerul este resetat la expirarea perioadei timerului de veghe
resetare la scăderea tensiunii de alimentare (BOR) : microcontrolerul fiind resetat atunci când tensiunea de alimentare scade sub un prag VBOT , detectorul de scădere a tensiunii de alimentare fiind activat
Porturile I/O
Microcontrolerul Atmel ATmega328P dispune de 4 porturi (A, B, C, D), dintre care pinii portului A sunt intrările in convertorul analog-numeric. Fiecare din porturile B, C, D este controlat de 3 registre a câte 8 biți, fiecare controlând cate un pin de intrare-ieșire după cum urmează:
registrul de direcție DDRx : definește dacă un pin este intrare (1) sau ieșire (0)
registrul conținând valorea pinului PINx : citirea acestui registru returnează valoarea acestuia
registrul de setare a valorii pinului PORTx : scrierea acestui registru setează pinul la o anumită valoare
Convertorul analog-numeric (ADC)
Microcontrolerul utilizat are în componența sa un convertor analog-numeric cu aproximații succesive, pe 10 biți. ADC-ul este conectat intern la un multiplexor analogic cu 8 canale, permițând existența celor 8 intrări analogice ale portului A. In cazul utilizării microcontrolerului în capsulă DIP28, există doar 6 astfel de intrări.
Convertorul analog-numeric conține un circuit de eșantionare și păstrare (sample and hold) care menține tensiunea de la intrarea convertorului la o valoare constantă pe durata conversiei.
Dintre specificațiile ADC-ului menționez:
rezoluție 10 biți
neliniaritate 0.5 LSB
acuratețe absolută ± 2 LSB
timp de conversie cuprins între 13 și 260 µs
până la 76.9 ksps (până la 15 ksps la rezoluție maximă)
domeniu al tensiunii de intrare : 0 – VCC
generarea unei întreruperi la terminarea conversiei
Intreruperile
Mecanismul de suspendare a firului de execuție la apariția unui anumit fenomen poartă numele de întrerupere. Acestea au fost introduse în scopul eliminării buclelor de program pe care procesorul trebuie sa le facă în asteptarea unui eveniment. Asocierea întrerupere-rutină de program se face cu ajutorul tabelei vectorilor de întrerupere. Adresele întreruperilor sunt ordonate în funcție de prioritatea acestora.
Tabelul 1.1 Tabela vectorilor de întrerupere ai microcontrolerului [1]
După cum se observă în Tabelul 1.1, microcontrolerul folosit are 26 de surse de întrerupere, două dintre acestea fiind de origine externă (INT0 și INT1).
Modulele de tip timer-numărător
După cum le spune și numele, aceste module oferă facilitatea de a măsura intervale fixe de timp și de a genera întreruperi la expirarea intervalului măsurat, permițând eliminarea buclelor de așteptare din program. Principiul de funcționare al unui astefel de modul este evidențiat în Figura 1.3.
Registrul timer-numărător măsoară intervalele de timp și este incrementat automat cu o anumită frecvență, iar prescalerul divide frevența de ceas în funcție de nevoile aplicației. La fiecare incrementare a TCNT, valoarea din acest registru se compară cu cea stocată în registrul de comparare OCR. La egalitate se generează o întrerupere, iar în caz contrar incrementarea continuă.
Microcontrolerul folosit dispune de trei module de timer : două de 8 biți și unul de 16 biți. Aceste module de timer pot funcționa în patru moduri:
modul normal : pornește de la 0 și numără până când își depășește valoarea maximă dată de numărul de biți, iar apoi începe din nou de la 0
modul de resetare a timerului la comparare (CTC) : pornește de la 0 și numără până când se atinge un prag definit de registrul OCR
modul PWM rapid : pornește de la 0 și numără până la valoarea maximă dată de numărul de biți, pragul atingându-se pe parcursul numărătorii
modul PWM cu corecție de fază : numără crescător de la 0 până la valoarea maximă dată de numărul de biți, apoi descrescător până la 0, pragul putând fi atins în cazul incrementării dar și în cazul decrementării
Interfața SPI
Interfața serială pentru periferice permite transfer de date sincron și de mare viteză între microcontroler și periferice sau între mai multe microcontrolere.
Dintre specificațiile SPI amintesc:
transfer de date sincron full-duplex pe trei fire
operează cu un singur dispozitiv master și unul sau mai multe dispozitive slave
transferul de date se face în segmente de câte 8 biți și poate începe cu LSB sau cu MSB pentru valori care depășesc 8 biți
7 rate de bit programabile
generarea unei întreruperi la terminarea transmisiei
Setul de instrucțiuni
Microcontrolerul posedă un set de 131 de instrucțiuni codate pe 16 sau 32 de biți. Pentru adresarea datelor, se folosesc următoarele moduri : adresare implicită, adresare imediată, adresare directă la registru, adresare directă la memorie, adresare indirectă prin registru, adresare indirectă prin registru cu deplasament, adresare indirectă prin registru cu post-incrementare sau pre-decrementare, adresare pe bit.
Microcontrolerul poate executa următoarele tipuri de instrucțiuni:
instrucțiuni de transfer (asigură transferul informației între registre, între registre și memorie și între registre și porturile de intrare-ieșire)
instrucțiuni aritmetice și logice (operații aritmetice și logice cu operanzi)
instrucțiuni de salt în program
instrucțiuni pentru operații pe bit
Mediul de dezvoltare integrat Arduino și platforma de dezvoltare
Un mediu de dezvoltare este o colecție de programe care ajută la scrierea programelor, combinând toți pașii necesari pentru crearea unui program.
Prezentul proiect folosește ca mediu integrat de dezvoltare pachetul software Arduino.
Mediul de dezvoltare integrat Arduino – cunoscut și sub numele de Arduino IDE – este gratis, open source și disponibil pentru sistemele de operare Windows, Mac OS și Linux. Este destinat scrierii programelor ce se pot încărca pe platformele hardware Arduino, fiind o aplicație multiplatformă scrisă în limbajul Java. Conține un editor text pentru scrierea codului, o zonă pentru afișarea mesajelor, o consolă text, o bară cu butoane pentru funcțiile uzuale și o serie de alte meniuri.
Programele Arduino sunt scrise în limbajul C/C++, trebuind definite doar două funcții pentru a realiza un program ciclic rulabil:
setup () : această funcție trebuie sa urmeze după declararea variabilelor la începutul programului, rulează o singură dată și este folosită pentru a seta anumiți pini sau pentru a inițializa comunicația serială
loop () : această funcție urmează după setup() și conține codul care trebuie executat ciclic
Mediul de dezvoltare Arduino utilizează GNU Toolchain și AVR Libc pentru compilarea programelor. Pentru încărcarea programelor se utilizează avrdude.
Platforma Arduino folosește microcontrolere produse de compania Atmel.
Figura 1.4 Mediul integrat de dezvoltare Arduino
Prezentul proiect folosește ca selecție a plăcii de dezvoltare modelul Arduino Uno, însă schemele electrice și plăcuțele de circuit imprimat folosite sunt creație proprie, fiind realizate exact pe criteriile funcționale ale sistemului și vor fi prezentate în capitolele următoare. PCB-urile au fost proiectate folosind programul SprintLayout, iar pentru realizarea practică s-a folosit o folie cu circuitul imprimat suprapusă peste placa cu depunerea de cupru. In urma transferului termic s-a folosit un agent coroziv pentru înlăturarea porțiunilor de cupru nedorite, rezultând cablajul imprimat.
Pentru programarea microcontrolerelor s-a folosit programatorul USBasp, acesta fiind suportat de Arduino IDE.
Trebuie avut în vedere faptul că numerotarea pinilor pe platformele Arduino nu este aceeași cu cea din foaia de catalog a microcontrolerului, existând o corespondență de care trebuie ținut cont la realizarea programului.
Figura 1.5 Corespondența pinilor pentru capsula DIP28.
Capsula TQFP32 prezintă alți patru pini, și anume : VCC, GND, ADC6 și ADC7. Aceștia doi din urmă au ca și corespondență Arduino pinii analog 6 și analog 7.
Modulul de senzori pentru urmărirea traseului
Vehiculul autonom este realizat sub forma unui robot mobil urmăritor de linie (line follower) ce se deplasează pe un traseu bine stabilit, reprezentat de o linie neagră pe un fundal, ideal, alb.
Pe parcursul testelor, linia neagră a fost trasată cu bandă izolatoare pe podea.
Citirea traiectoriei se realizează folosind un set de 8 senzori în infraroșu [2] tip KTIR0711S, dispuși sub forma unui modul compact, și anume Pololu QTR-8A. Acești senzori sunt descriși în următoarele paragrafe.
Caracteristici generale și parametri cheie
Modulul Pololu QTR-8A dispune de 8 senzori în infraroșu, distanțați la 9.5 mm [3].
Diodele LED emițătoare de la câte doi senzori (ex. D2 și D4 în Figura 1.7) sunt legate în serie, minimizând consumul, iar un tranzistor MOSFET (Q9) permite ca acestea să fie oprite de tot în cazul aplicațiilor sensibile din punct de vedere energetic [3].
Fiecare fototranzistor (Q1-Q8) este conectat la un rezistor de ridicare (R1-R8), formând un divizor de tensiune care produce la ieșire o tensiune analogică între 0 V și VCC (tipic 5V) [3].
Consumul fiecărei diode LED, în cazul în care VCC=5 V, este de 20-25 mA, consumul total al modulului nedepășind 100 mA [3].
Figura 1.6 Schema electrică a modulului de senzori în infraroșu
Figura 1.7 Modulul de senzori în infraroșu [3]
Parametri cheie ai modulului QTR-8A [3]:
tensiune de alimentare 3,3–5 V
curent consumat sub 100 mA
8 ieșiri analogice cu plaja 0–VCC reprezentând nivelurile de reflectanță ale senzorilor
distanța optimă de detecție 3mm
distanța maximă de detecție 6mm
Figura 1.8 arată forma de undă a semnalului de ieșire pentru unul dintre cei opt senzori în cazul montării acestuia la distanța de 3,1 mm deasupra unui disc alb conținând o linie neagră, discul efectuând o mișcare de rotație [3].
Figura 1.8 Forma de undă a semnalului de ieșire pentru unul dintre cei opt senzori [3]
Locomoția vehiculului autonom
Locomoția vehiculului autonom este de tip diferențial, fiind realizată cu ajutorul a două motoare de curent continuu tip POLOLU HP Micrometal 30:1.
Un vehicul cu locomoție diferențială este un robot mobil a cărui mișcare este bazată pe două roți motoare plasate de o parte și de cealaltă a șasiului acestuia. Așadar, schimbarea direcției se realizează prin modificarea ratei de rotație relativă între cele două roți, nefiind necesare alte sisteme de virare.
Pentru a echilibra partea frontală a robotului s-a folosit un suport semi-sferă din teflon, cu frecare foarte mică.
Dacă ambele roți motoare se mișcă în aceeași direcție și cu aceeași viteză, robotul va înainta într-o linie dreaptă. Dacă roțile sunt învârtite cu aceeași viteză dar în direcții opuse, robotul se va roti în jurul centrului axei acestora.
Pe baza vitezei de rotație și a direcției, centrul de rotație poate fi in orice punct pe dreapta definită de punctele de contact ale roților cu suprafața de rulare, cum se arată în Figura 1.8.
Așadar, deoarece direcția de deplasare a vehiculului este dependentă de viteza și de sensul de rotație a roților motoare, acești parametri trebuie sesizați și controlați foarte precis.
După cum s-a precizat, motoarele folosite sunt tip POLOLU HP Micrometal 30:1. Aceste motoare miniatură dispun de un reductor cu rația de 30:1, iar axul are diametrul de 3mm și este în formă de “D” [4].
Figura 1.10 Motoarele folosite [4]
Dintre caracteristicile acestor motoare, amintesc următoarele [4]:
viteză în gol 1000 RPM
curent consumat în gol 120 mA
curent la blocare 1,6 A
cuplu la blocare 0,06 Nm
Punțile H folosite : Infineon TLE5206
Controlul celor două motoare de curent continuu se realizează cu ajutorul a două punți H tip Infineon TLE5206.
O punte H este un circuit electronic ce permite alimentarea unei sarcini în orice sens. Aceste circuite sunt folosite în domeniul roboticii dar și în alte aplicații pentru a permite motoarelor de curent continuu să ruleze, comandat de un microprocesor sau de un microcontroler, în orice sens și la orice turație.
Puntea H are numele provenit de la modul obișnuit de reprezentare a circuitului.
Figura 1.11 Structura generalizată a unei punți H
Din figură se poate observa că la închiderea întrerupătoarelor S1, S4 și deschiderea S2, S3 motorul va avea un sens de rotație, iar la închiderea S2, S3 și deschiderea S1, S4 motorul va rula în sens invers.
Deasemenea, se observă interzicerea închiderii simultane a întrerupătoarelor S1 și S2 sau S3 și S4 deoarece acest lucru ar provoca un scurt-circuit al sursei de alimentare.
Chiar dacă punțile H sunt folosite, în general, pentru inversarea sensului de rotație al unui motor, acestea permit și frânarea acestuia sau mersul în gol.
Aceste moduri de funcționare sunt reprezentate în tabelul următor.
Tabelul 1.2 Modurile de funcționare ale punții H generalizată în Figura 1.11
In practică, întrerupătoarele S1, S2, S3, S4 sunt tranzistoare bipolare sau MOSFET.
Infineon TLE5206 este un circuit integrat de putere de tip punte H care folosește etaje de ieșire DMOS pentru a controla motoare de curent continuu [5].
Principalii parametri care caracterizează acestă punte H sunt [5]:
curent de ieșire 5A continuu, 6A la vârfuri
optimizată pentru controlul motoarelor de curent continuu
zensiune de alimentare până la 40V
RDS ON foarte mic:tipic 200 mΩ la 25°C
protecție la scurt-circuit a ieșirilor
protecție la supracurent și supratemperatură
intrări compatibile TTL/CMOS
diode de flyback integrate
gamă largă a temperaturii de funcționare : -40 – 150 °C
Pentru această aplicație, puntile H Infineon TLE5206 sunt în capsulă P-TO263-7-1, numele de catalog fiind TLE5206-2G.
Figura 1.12 Vedere de ansamblu asupra capsulei P-TO263-7-1 [6]
Figura 1.13 Configurația pinilor punții H folosite [5]
Schema bloc este dată în Figura 1.13.
Figura 1.14 Schema bloc a punții H [5]
Circuitele de intrare sunt compuse din triggere Schmitt cu histerezis, compatibile TTL/CMOS [5].
Circuitul de ieșire este o punte H DMOS. Blocuri integrate protejează ieșirile împotriva scurt-circuitelor către VS sau către GND. Fluctuațiile de curent care apar la comutarea sarcinilor inductive sunt limitate de către diodele de flyback integrate. Deasemenea, există câte un circuit de monitorizare pentru fiecare tranzistor de la ieșire care detectează când unul dintre aceștia este în conducție, prevenind deschiderea tranzistorului corespondent, de pe aceeași ramură [5].
Tabelul 1.3 Tabelul de adevăr pentru puntea H folosită [5]
Tabelul 1.4 Reprezentarea simbolurilor L și H [5]
Puntea H Infineon TLE5206 prezintă protecție la scăderea tensiunii de alimentare sub un prag VS ON, cu histerezis.
Cele două blocuri de diagnoză și protecție pot detecta următoarele erori [5]:
ieșire scurt-circuitată la GND
ieșire scurt-circuitată la VS
supracurent prin tranzistorii inferiori
supratemperatură, pragul fiind la 150°C
La detecția unei astfel de erori, etajul de ieșire se oprește și după 50µs se setează fanionul de eroare (EF).
Modulația impulsurilor în durată
Cele două punți H sunt comandate de microcontroler folosind modulația impulsurilor în durată (PWM).
Aceasta este o tehnică de modulare care controlează lățimea impulsurilor pe baza semnalului modulator prin modificarea factorului de umplere. Principala utilizare a acestei tehnici este de a permite controlul puterii furnizate unor dispozitive electrice, cu precădere pentru sarcini inerțiale, cum ar fi motoarele de curent continuu.
Figura 1.15 Exemplificarea formelor de undă în cazul modulației impulsurilor în durată pentru cinci valori ale factorului de umplere
Modulația impulsurilor în durată se folosește pentru a controla puterea furnizată unei sarcini fără a introduce pierderi care ar rezulta dintr-o furnizare liniară a puterii prin mijloace rezistive.
Valorile medii de tensiune și curent pentru alimentarea sarcinii sunt controlate prin comutarea rapidă închis-deschis a unui „comutator” plasat între sursa de alimentare și sarcină. Cu cât durata de deschidere este mai mare decât cea de închidere, cu atât puterea furnizată sarcinii este mai mare [7]. Această frecvență de comutare trebuie să fie mare pentru a nu afecta sarcina. Tipic, pentru motoare de curent continuu, frecvența de comutare pleacă de la câteva sute de Hz și poate ajunge la câteva zeci de kHz.
In sistemele de control a puterii, comutatoarele se pot realiza ușor folosind semiconductori. Cât timp comutatorul este închis puterea disipată pe acesta este nulă, dar acest lucru nu se întâmplă și atunci când comutatorul este deschis. Comutarea rapidă rezolvă acest deziderat, ajungându-se la niveluri foarte mici ale puterii disipate în comutatoare în comparație cu puterea furnizată sarcinii.
Descrierea funcționării vehiculului autonom
În cele ce urmează se va prezenta funcționarea vehiculului autonom pe blocuri funcționale.
Citirea și interpretarea poziției liniei traseului. Calibrarea senzorilor
Pentru citirea traseului se folosește un modul tip POLOLU QTR-8A, ce deține opt senzori analogici în infraroșu. Aceste opt ieșiri intră în cele opt intrări analogice ale microcontrolerului, fiind folosit convertorul analog-numeric. Reamintesc faptul că microcontrolerul în capsula TQFP32 are opt intrări analogice.
Deoarece acest convertor este pe 10 biți, fiecare valoare citită de la senzori va fi cuprinsă între 0 și 1023.
Referindu-ne la software, acest vector de opt elemente cu valori între 0 și 1023 este dat ca parametru de intrare funcției qtra.readLine din librăria QTRSensors.h.
Aceasta returnează o valoare cuprinsă între 0 și (N-1)*1000, unde N este numărul de senzori, în acest caz N=8. La returnarea valorii 0 linia traseului este în afara senzorului 0, iar la returnarea valorii (N-1)*1000 linia traseului este în afara senzorului N-1.
Librăria QTRSensors.h mai permite și calibrarea senzorilor înainte de prima parcurgere a traseului, fiind nevoie de baleierea modulului de senzori peste linia traseului pentru înregistrarea valorilor minimă și maximă de reflectanță pentru fiecare senzor în parte. Acest lucru se face prin apelarea rutinei qtra.calibrate.
Controlerul PID
Controlerul proporțional-integral-derivat este un mecanism de control în buclă închisă folosit pe scară largă în sisteme industriale. Controlerul calculează eroarea unui proces ca fiind diferența dintre o valoare măsurată și poziția de echilibru, încercând minimizarea acestei erori prin ajustarea procesului.
Algoritmul controlerului PID folosește trei parametri : proporțional, integral și derivat, uzual notați P, I și D.
Termenul P depinde de eroarea la momentul prezent, I depinde de acumularea erorilor în timp, iar D este o predicție a erorilor care ar putea apărea în viitor. Pentru ajustarea procesului se folosește o sumă ponderată a acestor trei parametri.
Deoarece parametri controlerului se pot afla în intervale mult mai mari decât cele necesare pentru reglarea procesului respectiv, este necesară operația de acordare a acestora. Aceasta constă în ajustarea termenilor de ponderare pentru cele trei planuri de control.
Din punct de vedere istoric, se consideră că acest tip de controler este cel mai performant. Variind cei trei parametri se poate contola un anume proces respectând întocmai cerințele de proiectare.
Răspunsul controlerului se definește folosind gradul de depășire a poziției de echilibru a procesului și gradul de prezență a oscilațiilor în sistem. Totuși, folosirea unui algoritm PID nu garantează controlul optim sau stabilitatea sistemului.
Figura 2.3 Principiul controlerului PID
Ecuația unui regulator PID este
(2.1)
,cei trei termeni fiind, în ordine, termenul proporțional, termenul integral și termenul derivativ. Constantele , și sunt termenii de ponderare care trebuie reglați. În cazul acestui proiect, reglarea constantelor de ponderare ale controlerului PID s-a realizat prin încercări.
În unele aplicații este posibil să nu fie nevoie de toate cele trei planuri de control, fiind suficientă adoptarea unui controler PI, PD, P sau I. În cazul sistemului prezentat, controlerul este de tip PID, parametrul de intrare fiind poziția măsurată a modulului de senzori peste linia traseului, poziția de echilibru fiind atinsă atunci când traseul este sesizat de senzorii mediani.
Figura 2.4 Poziția de echilibru
Pentru ușurința controlului motoarelor, plaja de valori a parametrului de intrare în controlerul PID este redusă de la intervalul 0-7000 la 0-255 folosind funcția map, iar poziția de echilibru are valoarea 128. Acest lucru este necesar deoarece timerele folosite la producerea modulației impulsurilor în durată sunt pe 8 biți.
Funcția pentru implementarea regulatorului PID este:
void pid_calc()
{
pozitie = qtra.readLine(sensorValues);
pozitie = map(pozitie,0,7000,0,255);
proportional = pozitie – Setpoint;
integral = integral + proportional;
derivative = proportional – last_proportional;
last_proportional = proportional;
error_value = int(proportional * Kp + integral * Ki + derivative * Kd);
}
, unde Setpoint=128 și Kp, Ki, Kd sunt constantele de ponderare.
În urma acordării acestora, au rezultat valorile : Kp=3, Ki=0, Kd=20. O valoare nulă pentru Ki este echivalentă cu folosirea unui controler PD dar s-a preferat implementarea PID pentru versatilitate.
Controlul motoarelor
În urma prelucrărilor interne, pe baza controlerului PID va rezulta o valoare numerică pentru diferența de viteză între cele două roți.
Două dintre canalele PWM ale microcontrolerului vor comanda cele două punți H, acestea fiind conectate la motoare. Funcția care permite realizarea modulației PWM este analogWrite(pin,valoare), parametrul valoare modificând factorul de umplere în intervalul 0-255 (0%-100%).
Pentru a putea limita viteza maximă de deplasare a robotului la o valoare mai mică decât cea maximă a motoarelor, valoarea numerică a diferenței de viteză între cele două roți trebuie, la rândul său, limitată, astfel:
if (error_value < -max_speed)
error_value = -max_speed;
if (error_value > max_speed)
error_value = max_speed;
Controlul vitezei fiecărei roți se realizează astfel:
if (error_value < 0)
{
right_speed = max_speed + error_value;
left_speed = max_speed;
}
if (error_value > 0)
{
right_speed = max_speed;
left_speed = max_speed – error_value;
}
analogWrite(MOTOR1_PIN1, right_speed);
analogWrite(MOTOR2_PIN1, left_speed);
Întreaga parte software se găsește în Anexa 2.
Schema electrică și cablajul imprimat
Figura 2.5 Schema electrică a vehiculului autonom
Figura 2.6 Partea superioară a cablajului imprimat
Figura 2.7 Partea inferioară a cablajului imprimat
Descrierea generală a modulului de detecție și alarmare
Modulul de detecție și alarmare este format în jurul aceluiași microcontroler, Atmel ATmega328P, dar în capsulă DIP28. Acesta citește o tensiune analogică dată de senzorul de gaz, iar dacă este depășit un anumit prag trimite o alarmă folosind modulul de comunicație radio, acesta fiind conectat la microcontroler printr-o interfață serială emulată.
Senzorul de gaz
Detecția scurgerilor de gaze este realizată folosind un senzor de tip MQ-4. Acest tip de senzor poate detecta concentrații de gaz natural și metan în intervalul 200-10000ppm [8].
Figura 3.1 Senzorul de gaz MQ-4 [8]
Figura 3.2 prezintă caracteristica de sensibilitate a senzorului pentru diferite gaze, acestea aflându-se la temperatura de 20°C, iar mediul având o umiditate de 65% și o concentrație de oxigen de 21%. Ro este rezistența senzorului la 1000 ppm de metan în aer curat, iar Rs este rezistența senzorului la diverse concentrații alte altor gaze [8].
Figura 3.2 Caracteristica de sensibilitate a senzorului de gaz MQ-4 [8]
Dintre specificațiile acestuia, menționez [8]:
sensibilitate mare la metan și gaze naturale
sensibilitate redusă la alcool și fum
tensiune de alimentare 5V c.c. sau c.a.
consum pentru elementul de încălzire sub 750mW
Acest proiect foloseste senzorul MQ-4 sub forma unui modul care mai conține un rezistor fix și unul variabil pentru a putea regla sensibilitatea senzorului (Figura 3.3). Schema acestui modul este dată în Figura 3.4.
Figura 3.3 Modulul care conține senzorul de gaz
Figura 3.4 Schema electrică a modulului care conține senzorul de gaz
Modulul de comunicație radio folosit : XBee Series 2
Acest modul radio creat de compania Digi International folosește un cip de la Ember Networks care permite mai multe moduri de a crea rețele plasă bazate pe protocolul 802.15.4.
Figura 3.5 Modulul de comunicație radio XBee Series 2 [9]
Caracteristici și configurația pinilor [10]
tensiune de alimentare 2.1-3.6V
curent consumat 40mA
rată de transfer a datelor până la 250 kbps
putere de emisie 2mW
sensibilitatea receptorului : -96dbm
antenă integrată
banda de frecvență 2.4 GHz, 16 canale
modulație DSSS
topologii de rețea suportate : punct-la-punct, punct-la-multipunct, peer-la-peer, plasă
șase pini analogici de intrare (convertor analog-numeric pe 10 biți)
opt pini digitali de intrare-ieșire
configurare locală sau de la distanță
Protocolul de comunicație
802.15.4 este un protocol pentru comunicații radio elaborat de către IEEE care specifică baza hardware a rețelei și protocolul de comunicare de date în rețele personale de viteză mică și conectivitate simplă [11].
Comunicarea poate avea loc în benzile 868MHz, 902MHz sau 2,4GHz pentru uz industrial, științific și medical.
XBee este un modul care folosește protocolul 802.15.4 ca bază și adaugă rutare și funcționalitate de rețea, fiind proiectat ca să permită adăugarea dispozitivelor în rețea tip punct-la-punct, stea sau plasă care folosesc acest standard [11].
Rețelele tip plasă sunt folosite în cazurile în care distanța dintre două puncte ale rețelei este mai mare decât raza de comunicație a acestora dar există puncte intermediare care ar putea ajuta la retransmiterea datelor.
Rețeaua personală
Rețeaua se numește rețea personală sau PAN, fiecare fiind definită cu un identificator unic PAN ID, acesta fiind comun tuturor dispozitivelor din rețeaua respectivă.
Orice rețea trebuie să conțină cel puțin două noduri: unul trebuie să fie setat ca și coordonator iar celălalt dispozitiv trebuie să fie setat ca router sau ca dispozitiv final. Trebuie reținut faptul că într-o rețea nu pot exista două dispozitive configurate coordonator.
Coordonatorul selectează un PAN ID și un canal pentru a porni rețeaua, după aceea comportându-se ca un router. Coordonatorul și routerele pot permite altor dispozitive să se alăture rețelei personale și pot ajuta la rutarea datelor pe traseu.
După ce un dispozitiv final se alătură rețelei prin intermediul unui router sau unui coordonator, respectivul dispozitiv final trebuie să fie capabil de a transmite sau primi date prin echipamentul care a permis aderarea la rețea. Routerul sau coordonatorul care a permis dispozitivului final să adere la rețea devine “părinte” al acestuia.
Canalul RF
XBee utilizează modulație în secvență directă cu spectru împrăștiat și operează pe un canal fix. Sunt definite 16 canale de operare în intervalul de 2,405-2,480 GHz, spațierea dintre acestea fiind de 5 MHz. Coordonatorul poate selecta independent PAN ID-ul și canalul în vederea utilizării. Dacă un canal se aglomerează, comunicația se poate muta pe altul.
Tipuri de dispozitive și topologii de rețea
Sunt definite trei tipuri de dispozitive de rețea: dispozitiv final, coordonator și router [9]. În continuare amintim câteva dintre caracteristicile fiecăruia:
coordonatorul se ocupă de alegera PAN ID-ului și a canalului, poate permite routerelor sau dispozitivelor finale să adere la rețea și poate ajuta la rutarea datelor
routerul trebuie să adere unei rețele înainte de a putea primi, transmite sau ruta date, poate permite routerelor sau dispozitivelor finale să adere la rețea și poate ajuta la rutarea datelor
dispozitivul final trebuie să adere unei rețele înainte de a putea primi, transmite sau ruta date, nu poate permite altor dispozitive să adere la rețea, întotdeauna transferă date prin dispozivitul “părinte” și nu poate ajuta la rutarea datelor.
Din punct de vedere al topologiilor realizabile, enumerăm:
topologia punct-la-punct (legătură permanentă între oricare două terminații)
topologia stea (fiecare nod din rețea este conectat la un nod central)
topologia plasă (existența legăturilor redundante între noduri/terminații)
Securitate
Standardul folosește chei matematice pentru a cripta datele ce trec prin rețeaua fără fir.
Există două tipuri de modele de securitate bazate pe chei care pot fi utilizate în același timp, dacă se dorește: chei de rețea și chei de legătură [9].
Cheile de rețea protejează pachetele de date, pe măsură ce acestea trec dintr-un nod în altul. Fiecare pachet de date este criptat, trimis la următorul hop în rețea, iar înainte de a fi trimis către următorul nod din rețea este decriptat și apoi recriptat. Cheile de rețea asigură securitatea de la hop la hop și protejează în totalitate transmisia pachetelor dintr-o rețea privată, în care toate modulele wireless sunt sub controlul unei singure entități. Dezavantajul este că prin criptarea și decriptarea pachetului la fiecare hop din rețea se adaugă unele întârzieri de transmisie sau latență. În plus, sunt necesari 18 octeți în plus la fiecare pachet pentru a securiza transferul, dimensiunea pachetului de date reducându-se de la 72 la 54 de octeți. Acest lucru înseamnă ca sunt necesare mai multe pachete pentru a trimite aceeași cantitate de informație.
Cheile de legătură oferă un nivel suplimentar de protecție pentru conexiunile punct-la-punct. Datele sunt criptate de către expeditor și rămân securizate pe măsură ce străbat nodurile rețelei. Fiecare pachet este decriptat numai atunci când ajunge la destinație. Aceste chei de legătură se folosesc în cazul în care nu se dorește ca datele să fie accesibile în nodurile rețelei ci doar la destinație, lucru util în cazul rețelelor partajate unde nodurile intermediare nu pot fi verificate. Și în acest caz, folosind cheile de legătură, creste ușor latența iar dimensiunea pachetului este și ea micșorată.
Configurarea modulelor XBee pentru proiectul prezentat
Pentru a trimite alarma de detecție a unei scurgeri de gaze se folosesc două module XBee S2 pentru a realiza o rețea punct-la-punct.
Având doar două module XBee la îndemână vom proceda la construirea unei rețele cu două noduri (punct-la-punct). Ca orice rețea XBee, va avea nevoie de adresă de rețea, iar modulele odată conectate vor avea nevoie de niște adrese de destinație pentru datele transmise, mai precis destinația unui modul va fi adresa celuilalt modul și vice-versa.
Fiecare dintre cele două module trebuie să se afle în același PAN, având același PAN ID.
Un modul se va configura ca și coordonator, celălalt fiind router.
Pentru a realiza configurarea se foloseste un adaptor XBee-USB care, pe lângă configurare, mai permite și accesul prin USB la pinii interfeței seriale. Acest adaptor este folosit și pentru recepționarea alarmei, afișarea fiind făcută într-o consolă serială.
Figura 3.9 Adaptorul XBee-USB [12]
Pentru configurare se folosește softul X-CTU. Acesta este o aplicație pentru sistemul de operare Windows care permite interacționarea cu modulele RF ale companiei Digi International într-o manieră simplă și intuitivă, având o interfață grafică prietenoasă.
În urma inserției modului XBee în adaptorul USB și a conectării acestuia la calculator, pornim programul X-CTU.
Ca și prim pas, verificăm apariția unui port USB-serial pe primul tab, PC Settings.
După selectarea portului respectiv vom trece la validarea setărilor acestuia și la inițializarea comunicației cu modului XBee. Acest lucru se realizează folosind butonul Test/Query. Setările implicite ale portului serial sunt vizibile în captura de ecran anterioară.
Dacă acest pas este realizat cu succes, va apărea mesajul din Figura 3.11.
Figura 3.11 Verificare cu succes
După apăsarea butonului OK ne mutăm pe tabul Modem Configuration. In cadrul casetei Modem Parameter and Firmware inițiem comanda Read și asteptăm citirea tuturor parametrilor și afișarea acestora.
Figura 3.12 Inițierea comenzii de citire a parametrilor și afișarea acestora
În concluzie, pentru a realiza rețeaua punct-la-punct dorită trebuie setat un număr minim de parametri, și anume:
în cadrul Function Set un modul trebuie să fie ZIGBEE COORDINATOR AT iar celălalt ZIGBEE ROUTER AT
în cadrul Networking trebuie ca ambele module XBee să aibă acelasi PAN ID
în cadrul Adressing câmpurile Destination Address High și Destination Address Low ale unui modul vor avea valorile Serial Number High și Serial Number Low ale celuilalt și viceversa
După setarea acestor parametri inițiem comanda Write din caseta Modem Parameter and Firmware iar după parcurgerea acestor pași pentru ambele module XBee vom avea o rețea punct-la-punct funcțională.
Figura 3.13 Configurarea cu succes a modulului XBee S2
Descrierea funcționării modulului de detecție și alarmare
Acest modul folosește tot microcontrolerul Atmel ATmega328P, dar în capsulă DIP28 deoarece nu au fost constrângeri de spațiu pe placa de circuit imprimat.
Tensiunea analogică de la ieșirea senzorului de gaz este citită de microcontroler pe canalul 0 al convertorului analog-numeric (pinul 23). Deoarece convertorul analog-numeric este pe 10 biți, va rezulta o valoare de la 0 la 1023, în funcție de concentrația de gaz detectată de senzor.
Intern, microcontrolerul compară această valoare cu un prag anume și la depășirea acestuia va trimite un set de caractere pe o interfață serială emulată pe pinii 5 și 6 către modulul XBee. La recepție, al doilea modul XBee este conectat la portul USB al calculatorului și acel șir de caractere este afișat într-o consolă serială. Librăria folosită pentru emularea unei interfețe seriale este SoftwareSerial.h.
Deoarece microcontrolerul funcționează la 5V iar modulul XBee este alimentat la 3.3V, comunicația serială de la microcontroler la modulul radio se realizează printr-un convertor de nivel.
Figura 4.1 Convertorul de nivel
Pentru a realiza conversia 5V-3.3V s-a folosit un simplu divizor de tensiune cu R1=2KΩ și R2=3.9KΩ.
Pragul de la care se inițiază alarma este ajustabil de la distanță tot cu ajutorul consolei seriale.
În program se observă că valoarea de inițializare a acestui prag este 0 și până la modificarea acestuia se va transmite nivelul de tensiune provenit de la senzorul de gaz și citit cu ADC-ul.
După setarea acestui prag de la distanță există două stări:
dacă pragul setat are valoare mai mare decat valoarea citită de convertorul analog-numeric se va transmite în continuare această valoare
dacă pragul setat are valoare mai mică decat valoarea citită de convertorul analog-numeric se va transmite mesajul “AVARIE”, robotul se va opri din urmărirea traseului și va semnaliza acest lucru prin bipuri repetate de audiofrecvență; revenirea la starea anterioară se face atunci când valoarea citită cu ADC-ul devine mai mică decât pragul setat
Programul complet este prezentat în Anexa 3.
Schema electrică și cablajul imprimat
Figura 4.3 Schema electrică a modulului de detecție și alarmare
Figura 4.4 Partea superioară a cablajului imprimat împreună cu senzorul de gaz
Figura 4.5 Partea inferioară a cablajului imprimat
Concluzii
În această teză s-a prezentat un sistem autonom de detecție a scurgerilor de gaze, partea de locomoție fiind realizată cu ajutorul unui vehicul urmăritor de linie. Imagini cu realizarea practică sunt prezentate în Anexa 1.
Acesta este capabil de a urmări traseul cu foarte mici erori deoarece la acordarea regulatorului PID s-a lucrat foarte mult, vehiculul participând la probele de urmărire a liniei la două ediții ale concursului național Robochallenge (locul 4 în 2013 la Ediția Națională și locul 3 în 2014 la Ediția Locală).
Sistemul detectează cu succes gazul și trimite alarma cu ajutorul modulului radio XBee Series 2, pragul fiind setabil de la distanță.
În ceea ce privește modulul de detecție și alarmare se pot aduce numeroase îmbunătățiri având în vedere numărul mare de pini rămași liberi ai microcontrolerului, precum și integrarea senzorului de gaz pe aceeași plăcuță de circuit imprimat.
Se poate lucra și la reducerea dimensiunilor și a masei sistemului prin integrarea tuturor componentelor pe același PCB, folosirea unui singur microcontroler și modificarea șasiului, fiind nevoie de o nouă acordare a constantelor controlerului PID.
Adăugarea unui senzor de distanță ar face posibilă evitarea obstacolelor, iar adăugarea unui sistem de măsurare a numărului de rotații efectuate de fiecare roată ar permite definirea traseului sub orice formă, renunțând la linia neagră trasată pe podea. Acest lucru ar crește gradul de mobilitate al robotului.
Totodată, înlocuirea modulului radio XBee cu unul care folosește comunicație Bluetooth ar putea permite recepționarea alarmei și pe un dispozitiv mobil (smartphone sau tabletă), precum și vizualizarea altor date trimise de robotul autonom (telemetrie).
Bibliografie
[1] Foaie de catalog Atmel ATmega328P (accesat la 14 martie 2014) :
http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
[2] FRADEN, Jacob. Handbook of Modern Sensors, Fourth Edition, Editura Springer, San Diego, 2010
[3] Modul senzori POLOLU QTR-8A (accesat la 29 martie 2014) :
http://www.pololu.com/product/960
[4] Motoare DC POLOLU HP Micrometal 30:1 (accesat la 7 aprilie 2014) :
http://www.pololu.com/product/1093
[5] Foaie de catalog Infineon TLE5206 (accesat la 5 mai 2014) :
http://www.infineon.com/dgdl/TLE5206-2_DS_11%5B1%5D.pdf?folderId=db3a30431b3e89eb011bb632994f065b&fileId=db3a30431f848401011fc753a71779a7&ack=t
[6] Capsula P-TO263-7-1 (accesat la 11 mai 2014)
http://cladlab.com/electronics/circuit-design/component-packages
[7] BRÄUNL, Thomas. Embedded Robotics: Mobile Robot Design and Applications with Embedded Systems, Second Edition, Editura Springer, Perth, 2006
[8] Senzor gaz MQ-4 (accesat la 21 mai 2014) :
https://www.sparkfun.com/products/9404
[9] Modul XBee Series 2 (accesat la 29 mai 2014)
http://entesla.com/xbee
[10] Foaie de catalog XBee Series 2 (accesat la 9 iunie 2014) :
http://ftp1.digi.com/support/documentation/90000976_S.pdf
[11] 802.15.4, Standard for Local and metropolitan area networks, IEEE, Part 15.4: Low-Rate Wireless Personal Area Networks (LR-WPANs), 2011
[12] Adaptor USB-XBee (accesat la 15 iunie 2014)
https://www.sparkfun.com/products/8687
Imagini cu realizarea practică
Codul sursă al vehiculului autonom
#include <QTRSensors.h>
#include <IRremote.h>
#define NUM_SENSORS 8
#define NUM_SAMPLES_PER_SENSOR 4
#define EMITTER_PIN QTR_NO_EMITTER_PIN
QTRSensorsAnalog qtra((unsigned char[]) {7,6,0,1,2,3,4,5} ,NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
int MOTOR1_PIN1 = 6;
int MOTOR2_PIN1 = 5;
int max_speed=100;
volatile int ir=1;
volatile int buton = 0;
volatile int sense=0;
int buttonState = 0;
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
int proportional, Setpoint, integral, derivative, last_proportional, error_value, Kp, Ki, Kd, right_speed, left_speed;
double pozitie;
void button()
{
buttonState = digitalRead(3);
if((buttonState == LOW)&&(buton==0))
{
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(300);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delay(300);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(300);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delay(300);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(1000);
buton=1;
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
}
void rcvd()
{
if (irrecv.decode(&results))
{
switch (results.value)
{
case 0xFFB24D : ir=0; //stop
break;
case 0xFF6897 : ir=1;
break;
}
irrecv.resume(); // Receive the next value
}
}
void setup()
{
// Serial.begin(9600);
pinMode(MOTOR1_PIN1, OUTPUT);
pinMode(MOTOR2_PIN1, OUTPUT);
pinMode(1, INPUT_PULLUP);
pinMode(8, OUTPUT); //led motor stanga
pinMode(7, OUTPUT); //led motor dreapta
pinMode(3, INPUT_PULLUP); //buton start
pinMode(4, INPUT); //ir sensor
digitalWrite(MOTOR1_PIN1, LOW);
digitalWrite(MOTOR2_PIN1, LOW);
delay(1000);
digitalWrite(7, HIGH); // turn on LED to indicate we are in calibration mode
digitalWrite(8, HIGH); // turn on LED to indicate we are in calibration mode
for (int i = 0; i<100; i++) // make the calibration take about 10 seconds
{
qtra.calibrate();
}
digitalWrite(7, LOW); // turn off LED to indicate we are through with calibration
digitalWrite(8, LOW); // turn off LED to indicate we are through with calibration
irrecv.enableIRIn();
delay(1500);
Setpoint = 128;
Kp = 3; //3
Ki = 0; //0
Kd = 20; //20
}
void pid_calc()
{
pozitie = qtra.readLine(sensorValues);
pozitie = map(pozitie,0,7000,0,255);
proportional = pozitie – Setpoint;
integral = integral + proportional;
derivative = proportional – last_proportional;
last_proportional = proportional;
error_value = int(proportional * Kp + integral * Ki + derivative * Kd);
}
void calc_turn(int buton,int ir, int max_speed)
{ //Restricting the error value.
if (error_value < -max_speed)
{
error_value = -max_speed;
}
if (error_value > max_speed)
{
error_value = max_speed;
} // If error_value is less than zero calculate right turn speed values
if (error_value < 0) {
right_speed = max_speed + error_value;
left_speed = max_speed;
if ((ir==0)||(buton==0))
{
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
else
{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
}
if (error_value > 0) {
right_speed = max_speed;
left_speed = max_speed – error_value;
if ((ir==0)||(buton==0))
{
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
else
{
digitalWrite(8, HIGH);
digitalWrite(7, LOW);}
}
}
void motor_drive(int right, int left, int buton, int ir, int sense)
{ // Drive motors according to the calculated values for a turn
if((buton==1)&&(ir==1)&&(sense==LOW))
{ if(right==0) digitalWrite(MOTOR1_PIN1,LOW); else analogWrite(MOTOR1_PIN1, right);
if(left==0) digitalWrite(MOTOR2_PIN1,LOW); else analogWrite(MOTOR2_PIN1, left);
}
else
{
digitalWrite(MOTOR1_PIN1, LOW);
digitalWrite(MOTOR2_PIN1, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
}
void loop()
{
sense=digitalRead(1);
rcvd();
button();
pid_calc();
calc_turn(buton,ir,max_speed);
motor_drive(right_speed, left_speed, buton, ir,sense);
}
Codul sursă al modulului de detecție și alarmare
#include <SoftwareSerial.h>
SoftwareSerial xbee(4, 3); // RX, TX
int nivelgaz=0;
int prag=0;
void setup() {
xbee.begin(9600);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
tone(11,800,100);
delay(300);
tone(11,800,100);
}
void loop() {
if(xbee.available())
{
prag=xbee.parseInt();
xbee.print("Noul prag:");
xbee.println(prag);
}
nivelgaz=analogRead(0);
if((prag==0)||(nivelgaz<=prag))
{
xbee.print("NIVEL GAZ:");
xbee.println(nivelgaz);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
}
if((prag!=0)&&(nivelgaz>=prag))
{
xbee.println("AVARIE");
digitalWrite(12,HIGH);
tone(11,800,100);
delay(300);
tone(11,800,100);
}
delay(1000);
}
Bibliografie
[1] Foaie de catalog Atmel ATmega328P (accesat la 14 martie 2014) :
http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
[2] FRADEN, Jacob. Handbook of Modern Sensors, Fourth Edition, Editura Springer, San Diego, 2010
[3] Modul senzori POLOLU QTR-8A (accesat la 29 martie 2014) :
http://www.pololu.com/product/960
[4] Motoare DC POLOLU HP Micrometal 30:1 (accesat la 7 aprilie 2014) :
http://www.pololu.com/product/1093
[5] Foaie de catalog Infineon TLE5206 (accesat la 5 mai 2014) :
http://www.infineon.com/dgdl/TLE5206-2_DS_11%5B1%5D.pdf?folderId=db3a30431b3e89eb011bb632994f065b&fileId=db3a30431f848401011fc753a71779a7&ack=t
[6] Capsula P-TO263-7-1 (accesat la 11 mai 2014)
http://cladlab.com/electronics/circuit-design/component-packages
[7] BRÄUNL, Thomas. Embedded Robotics: Mobile Robot Design and Applications with Embedded Systems, Second Edition, Editura Springer, Perth, 2006
[8] Senzor gaz MQ-4 (accesat la 21 mai 2014) :
https://www.sparkfun.com/products/9404
[9] Modul XBee Series 2 (accesat la 29 mai 2014)
http://entesla.com/xbee
[10] Foaie de catalog XBee Series 2 (accesat la 9 iunie 2014) :
http://ftp1.digi.com/support/documentation/90000976_S.pdf
[11] 802.15.4, Standard for Local and metropolitan area networks, IEEE, Part 15.4: Low-Rate Wireless Personal Area Networks (LR-WPANs), 2011
[12] Adaptor USB-XBee (accesat la 15 iunie 2014)
https://www.sparkfun.com/products/8687
Imagini cu realizarea practică
Codul sursă al vehiculului autonom
#include <QTRSensors.h>
#include <IRremote.h>
#define NUM_SENSORS 8
#define NUM_SAMPLES_PER_SENSOR 4
#define EMITTER_PIN QTR_NO_EMITTER_PIN
QTRSensorsAnalog qtra((unsigned char[]) {7,6,0,1,2,3,4,5} ,NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
int MOTOR1_PIN1 = 6;
int MOTOR2_PIN1 = 5;
int max_speed=100;
volatile int ir=1;
volatile int buton = 0;
volatile int sense=0;
int buttonState = 0;
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
int proportional, Setpoint, integral, derivative, last_proportional, error_value, Kp, Ki, Kd, right_speed, left_speed;
double pozitie;
void button()
{
buttonState = digitalRead(3);
if((buttonState == LOW)&&(buton==0))
{
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(300);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delay(300);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(300);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
delay(300);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
delay(1000);
buton=1;
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
}
void rcvd()
{
if (irrecv.decode(&results))
{
switch (results.value)
{
case 0xFFB24D : ir=0; //stop
break;
case 0xFF6897 : ir=1;
break;
}
irrecv.resume(); // Receive the next value
}
}
void setup()
{
// Serial.begin(9600);
pinMode(MOTOR1_PIN1, OUTPUT);
pinMode(MOTOR2_PIN1, OUTPUT);
pinMode(1, INPUT_PULLUP);
pinMode(8, OUTPUT); //led motor stanga
pinMode(7, OUTPUT); //led motor dreapta
pinMode(3, INPUT_PULLUP); //buton start
pinMode(4, INPUT); //ir sensor
digitalWrite(MOTOR1_PIN1, LOW);
digitalWrite(MOTOR2_PIN1, LOW);
delay(1000);
digitalWrite(7, HIGH); // turn on LED to indicate we are in calibration mode
digitalWrite(8, HIGH); // turn on LED to indicate we are in calibration mode
for (int i = 0; i<100; i++) // make the calibration take about 10 seconds
{
qtra.calibrate();
}
digitalWrite(7, LOW); // turn off LED to indicate we are through with calibration
digitalWrite(8, LOW); // turn off LED to indicate we are through with calibration
irrecv.enableIRIn();
delay(1500);
Setpoint = 128;
Kp = 3; //3
Ki = 0; //0
Kd = 20; //20
}
void pid_calc()
{
pozitie = qtra.readLine(sensorValues);
pozitie = map(pozitie,0,7000,0,255);
proportional = pozitie – Setpoint;
integral = integral + proportional;
derivative = proportional – last_proportional;
last_proportional = proportional;
error_value = int(proportional * Kp + integral * Ki + derivative * Kd);
}
void calc_turn(int buton,int ir, int max_speed)
{ //Restricting the error value.
if (error_value < -max_speed)
{
error_value = -max_speed;
}
if (error_value > max_speed)
{
error_value = max_speed;
} // If error_value is less than zero calculate right turn speed values
if (error_value < 0) {
right_speed = max_speed + error_value;
left_speed = max_speed;
if ((ir==0)||(buton==0))
{
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
else
{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
}
if (error_value > 0) {
right_speed = max_speed;
left_speed = max_speed – error_value;
if ((ir==0)||(buton==0))
{
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
else
{
digitalWrite(8, HIGH);
digitalWrite(7, LOW);}
}
}
void motor_drive(int right, int left, int buton, int ir, int sense)
{ // Drive motors according to the calculated values for a turn
if((buton==1)&&(ir==1)&&(sense==LOW))
{ if(right==0) digitalWrite(MOTOR1_PIN1,LOW); else analogWrite(MOTOR1_PIN1, right);
if(left==0) digitalWrite(MOTOR2_PIN1,LOW); else analogWrite(MOTOR2_PIN1, left);
}
else
{
digitalWrite(MOTOR1_PIN1, LOW);
digitalWrite(MOTOR2_PIN1, LOW);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
}
void loop()
{
sense=digitalRead(1);
rcvd();
button();
pid_calc();
calc_turn(buton,ir,max_speed);
motor_drive(right_speed, left_speed, buton, ir,sense);
}
Codul sursă al modulului de detecție și alarmare
#include <SoftwareSerial.h>
SoftwareSerial xbee(4, 3); // RX, TX
int nivelgaz=0;
int prag=0;
void setup() {
xbee.begin(9600);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
tone(11,800,100);
delay(300);
tone(11,800,100);
}
void loop() {
if(xbee.available())
{
prag=xbee.parseInt();
xbee.print("Noul prag:");
xbee.println(prag);
}
nivelgaz=analogRead(0);
if((prag==0)||(nivelgaz<=prag))
{
xbee.print("NIVEL GAZ:");
xbee.println(nivelgaz);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
}
if((prag!=0)&&(nivelgaz>=prag))
{
xbee.println("AVARIE");
digitalWrite(12,HIGH);
tone(11,800,100);
delay(300);
tone(11,800,100);
}
delay(1000);
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Robot Autonom Pentru Detectia Scurgerilor de Gaze (ID: 163393)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
