Si PBL
Si PBL
Nota: Rapoartele finale se vor depune in acest spatiu aferent echipei. Fiecare student va depune raport propriu , functie de sarcinile avute in implementarea proiectului, evident mentionind echipa din care face parte. Raportul va contine: 1. Tema +rezumat ( de la sectiune ce voi face/implementa ) 2. Descriere solutie 3. Detalii de implementare 4. Rezultate experimentale, concluzii 5. Bibliografie/web Cadru general proiecte:
Freescale Cup Competition Echipa I Studenti: 1. Gabor Sorin 2. Iacob Marius 3. Sandulean Vlad 1. Tema si rezumatul proiectuluiv
Freescale Cup 2011-2012: Este o competitie studenteasca ce isi propune sa promoveze tehnologiile Freescale. Folosind platforma oferita de Freescale participantii trebuie sa dezovolte o aplicatie pentru ca masina construita sa urmareasca o linie neagra pe un drum alb. Detectarea marcajului de pe traseu se va face cu ajutorul unei careme video liniare. Freescale ne-a oferit urmatoarele resurse materiale: Kit auto : sasiu , doua motoare DC pentru tractiune , 1 servomotor pentru directie ,acumulator 7.2 V , 2400 mA/h Camera video liniara ( echivalentul unei benzi de 128 de fotodiode) PCB cu 2 drivere ( punte H ) pentru controlul motoarelor DC , si regulator de tensiune PCB pentru microcontroller-ul Power PC MPC5604B Limita de timp: Finala este programata pentru martie 2012 , fara etape intermediare.
2. Solutii si implementari alternative pentru problema computer vision and linefollowing Inainte de a prezenta solutiile alternative , vom defini conceptul care sta la baza lor: Computer vision : domeniu ce se axeaza pe captarea si prelucrarea automata a imaginilor in vederea obtinerii unor informatii necesare in luarea unor decizii ulterioare. Automated Machine Vision Inspection: folosita in procesele industriale pentru a imbunatati calitatea produselor, reducerea deseurilor si respectarea standardelor [Link]
Exista si in domeniul agriculturii dorinta de a crea utilaje autonome: [Link] &feature=related Dimensiunea nu conteaza cand vine vorba de masini inteligente: [Link] Computer Vision poate fi folosita si pe cele mai aglomerate strazi: [Link] VIC: Vision-guided Intelligent Car (Artificial Neural Network): [Link] Alternativa la mecanismul de tractiune : un linefollow-er ar putea fi implementat utilizand ca sistem de tractiune un mecanism hidraulic sub forma unor picioare , ca in videclipul urmator. [Link]
3. Obiective propuse - descriere solutie Dupa un prim stagiu de documentare am delimitat mai multe etape pe care le-am impartit intre membrii echipei astfel : Sandulean Vlad - implementarea unui scheduler / portarea unui sistem de operare; - configurarea mediului de lucru pentru optimizarea pltformei ( optimizari ale memoriei flash, activarea branch prediction, configurare clock, optimizari compilator); - interfatarea cu mediul de lucru Matlab; - drivere MCU Gabor Sorin Ioan - realizarea unui amplificator pentru camera video cu rolul de a micsora timpul de integrare - comunicatie wireless cu pc-ul in pentru debug in timp real; - realizarea unui algoritm de monitorizare a parametrilor de functionare a intregului ansamblu (ex: curent consumat de fiecare motor, tensiunea la bornele bateriei, curentul consumat de alte dipozitive periferice adaugate);
- realizarea unor benzi de emitatori / receptori (diode si fototranzistori) pentru a vedea in vecinatatea imediata a masinii; una poate fi plasata in fata masinii si una in spate. Iacob Ioan Marius - masurearea vitezei de rotatie a fiecarui motor de tractiune si a distantei parcurse; se iau in considerare doua variante: folosirea unor senzori Hall sau a unor senzori optici. - realizarea unui sistem de iluminare a pistei daca acest lucru este necesar; - montarea unui accelerometru pentru detectarea derapajelor dar si a denivelarilor (pante sau rampe); - drivere pentru perifericele masinii (camera, motoare)
Aplicatia software va fi structurata ierarhic. Algoritmul de detectie si urmarire va fi realizat de toti membri (propuneri multiple si colaborare).
4. Detalii de implementare Sandulean Vlad Pentru inceput am configurat procesorul si mediul de lucru CodeWarrior. Configurarea procesorului presupune urmatoarele lucruri: setarea frecventei de lucru, si a modului (RUN0) activarea semnalelor de tact pentru periferice activarea branch prediction activarea flash prefetch pentrut core initializarea exceptiilor (intreruperile pe core) lucrul cu intreruperi hardware (default este software). Aceste intreruperi sunt mult mai rapide si configurabile. Mediul de lucru CodeWarrior interprocedural analysis si functii inline peephole optimisation far-to-near optimisation, vle code mergeing s.a.m.d Am realizat un mini scheduler nepreemptiv. Acesta este bun pentru operatia in sine de urmarire a liniei dar cand am dorit sa introduc afisarea datelor pe seriala, au aparut probleme. (Trimiterea datelor de pe camera pe seriala poate dura si 50 ms). Pentru a trece de acest impediment, am portat RTOS-ul Micro C OS - II. Prin taskuri preemptive, acesta usureaza mult lucrul. De exemplul taskul de afisare are cea mai mica prioritate si poate fi oricand intrerupt. Portarea sistemului de operare a fost o sarcina grea. A presupus lucru in limbajul de asamblare, linker configuration file, planificarea intreruperilor, creare de epilog/prolog, etc.
Drivere ce le-am implementat sunt pentru Periodic Interrul Timer, Seriala, Intreruperi, General Purpose Input Output, PWM, ADC, Leduri, Sistem Timer, Crowss Triggerign Unit. Folosind aplicatia Serial Redirector impreuna cu doua porturi virtuale am putut realiza comunicarea cu mediul Matlab. (Aceasta placa are un port serial ce poate fi utilizat doar prin interfata proprietara). In Matlab putem salva o serie de date (rezultatul camerei in timp) si sa testam diferiti algoritmi pe ea. De asemenea putem vedea in timp real ceea ce vede si masina, prin clonarea algoritmului de pe ea.
Iacob Ioan Marius Masurarea vitezei de rotatie a motoarelor de tractiune Motivatie In urma analizei motoarelor electrice de tractiune cu care platforma este dotata am ajuns la concluzia ca acestea au un comportament atipic: cuplul pe care il dezvolta variaza foarte mult odata cu tensiunea de alimentare si, implicit, cu viteza de rotatie. La tensiune de alimentare mai mica cuplul este si el foarte mic, si creste odata cu tensiunea. Din acest motiv nu este suficient sa mentinem tensiunea de alimentare constanta pentru o viteza constanta. Pornind de la aceste considerente am implementat un mecanism de autoreglare a tensinii de alimentare a motoarelor. Aceelasi mecanism este util si in masurarea distantei [Link] este necesara pentru realizarea unei mapari a traseului ( algoritm ce urmeaza sa il implementam ) in prima parcurgere, urmand ca a doua sa se faca la o viteza sporita datorita memorarii traseului, a distantelor intre curbe, si a unghiului curbelor. Implementare Pentru implementare au existat doua optiuni: folosirea unor senzori hall si magneti pe fiecare roata sau folosirea de senzori optici ( LED si fototranzistor ) ce detecteaza fantele atasate de roti. Din mai multe considerente am ales implementarea cu senzori optici si fante atasate pe fiecare roata asa cum se poate vedea in figura urmatoare.
Deoarece folosirea ADC-ului pentru citirea datelor de la senzorii optici ar presupune sa intarzie si mai mult preluarea datelor de la camera, am folosit un comparator, care face comparatie dintre tensiunea provenita de la senzorul optic (200 mV - 4.7 V) si o tensiune de referinta ( 2 V ), obtinuta printr-un divizor de tensiune. Acest comparator genereaza nivele de teniune corespunzatoare cu 1 logic respectiv 0 logic , semnal ce poate fi prelucrat cu modulul periferic eMIOS (Enhanced Modular IO Subsystem) al microcontroller-ului. Rezolutia determinarii: fiecare roata atasata la motoare are lungimea de 17 cm. Pe fiecare dintre acestea exista 8 fante , deci practic pasul de incrementare a distantei este fie de 2.125 cm fie de 4.25 cm dupa cum se incrementeaza doar la detectarea unei fante, respectiv la detectarea unei fante si a golului dintre ele. Acest aspect este configurabil software. Deoarece se doreste ca task-urile sistemului de operare care se ocupa de citirea datelor de la camera video si reglarea directiei masinii sa fie preemtate de cat mai putine intreruperi, s-a convenit ca toate calculele referitoare la calculul vitezei si a distantei sa se realizeze intr-un alt task. Pentru preluarea semnaleleor de la comparator se foloseste modului eMIOS in modul de functionare Modulus Counter (MC). In acest mod de functionare se incrementeaza continutul registrului de numarare avand ca semnal de clock iesirea comparatorului de la senzorii optici. Se poate configura ca trigger-ul sa fie doar frontul crescator al semnalului (corespunzator detectarii unei fante) sau atat frontul crescator cat si cel descrescator (corespunzator golului dintre fante), dupa este necesara detectarea vitezei si a distantei cu o precizie mai buna sau mai putin buna. In task-ul in care se calculeaza parametrii distanta si viteza, se citeste continutul din registrul de numarare, dupa care acesta se reseteaza. Valoarea citita reflecta distanta parcursa. Pentru determinarea vitezei se preia valoare dintr-un timer ce masoara timpul dintre 2 citiri succesive ale valorii distantei din numarator. Pe baza formulei D=V*T se determina viteza cu care se deplaseaza masina.
Gabor Sorin Am inceput prin realizarea unui aplificator pentru camera video cu rolul de a micsora timpul de integrare necesar ca informatiile citite sa poata fi prelucrate intr-un algoritm pentru detectia liniei. Schema amplificatorului este prezentata in figura urmatoare:
Amplificatorul are doua moduri de functionare: un mod in care este folosit un singur amplificator operational iar alt mod in care sunt folosite ambele amplificatoare operationale, selectia intre cele doua moduri facandu-se prin intermediul unui jumper. In primul caz, in care este folosit doar primul amplificator operational, factorul de amplificare este de 1.5, iar in cel de al doilea caz, in care sunt folosite ambele amplificatoare , factorul de amplificare este de 2.2 . Efectul folosirii amplificatorului operational a fost scaderea timpul de integrare a camerei cu 70%. Urmatoare etapa a fost realizarea unui algoritm pentru detectia liniei pe baza esantioanelor primite de la camera. Acest algoritm face mai intai o filtrare si o clasificare a valorilor primite relativ la un prag calculat in functie de valoare maxima si minima esantionata pe camera in acel set de date. Dupa clasificarea esantioanelor, algoritmul incepe cautarea liniei pornind in acelasi timp din ambele capete ale setului de date pentru minimizarea timpului de calcul. Algoritmul furnizeaza ca iesire un index al liniei relativ la capetele setului de date. In program se tine cont si de cazul in care linia iese din raza vizuala a camerei, algoritmul memorand ultima pozitie valida a liniei. Acest index constituie intrarea unui algoritm PID folosit pentru controlul directiei. [Link] obtinute Prin implementarea unui algoritm proportional, masina urmareste cu succes linia de pe traseul din laborator. La momentul de actual, algoritmul functioneaza pentru viteza constanta. Am observat ca lumina ambientala are o importanta foarte mare, motiv pentru care dorim sa-i micsoram influenta prin iluminarea pistei dar si prin evaluarea datelor de la senzorul de lumina. Pentru algoritmul PID dorim sa implementam un mecanism de autocalibrare a parametrilor. Acest mecanism poate fi de tipul machine learning.
Echipa 2 1. Cracana Sorin 2. Feliu Gabriel 3. Panaghiu Gheorghe 4. Isachi George-Florin I. Rezumat: The Freescale Cup : A student competition based on intelligent car racing Student teams of three build a model car that will race around a track following a black line for speed. The car can use a CMOS camera for its vision. Resurse materiale/timp: Intelligent Car Set ( 1/18th Scale chassis, Drive & Steering motors, Battery ) Electronics ( Freescale Control System (16 or 32 bit), Sensors (optional) ) Time limit: The EMEA Finals are scheduled for March 2012 II .Raport de documentare :
Lego NXT Line follower [Link] Line Follower using wireless webcam and matlab [Link] How Google's Self-Driving Car Works [Link] China Smart Car Race [Link] Solutii alternative pentru camera: [Link]
Tari participante :
Alternative de componente specificate de Freescale 1. Pentru detectarea liniei - camera video : Parallax TSL1401-DB [Link] ld/0/Level/a/ProductID/566/[Link] LinkSprite LS-Y201 [Link] Toshiba TCM8240MD RB-Spa-115 [Link] html CM-26N [Link] 2. Pentru controlul motorului Punte H : MC33931 sau MC33932 [Link] code=MC33931&fsrch=1&sr=2 Componente analogice discrete 3. Software CodeWarrior Development Tools Deocamdata am ales camera oferita de cei de la Freescale.
Dupa cum se vede, o implementare a suportului de prindere a camerei este cel prezentat in imaginile de mai jos, insa o imbunatatire ar putea fi montarea unui servor motor astfel incat senzorul va urmari linia mai precis.
Camera ofera o lentila cu distanta focala de 7.9mm la o rezolutie de 128x1 ce permite focalizare.
Trebuie sa adaugam la acest proiect si 2 senzori Hall cate unul pe fiecare roata pentru
a identifica distanta parcursa de masina la un moment de timp. Acestia vor ajuta la crearea unui diferential pe rotile din spate. IV. Descriere solutie Rezumat
In primul rand s-a realizat asamblarea masinii de concurs, respectiv: conexiunile de la Placa de control la perifierice(Camera ,2x DC,servo) calibrarea motorului servo(determinarea pozitiei centrale si maxim stanga, maxim dreapta). In al doilea rand s-a vizualizat cu ajutorul unui osciloscop achizitia de date de pe camera liniara. S-a observat modul in care lumina ambientala influenteaza calitatea semnalului. S-a determinat o pozitie satisfacatoare a camerei raportata la nivelul solului.
Astfel am inceput algoritmul de la o matrice (matrice cu 2 linii si maxim 10 coloane) de benzi/paliere de 0 si 1 determinate in analiza in care este salvat pe prima linie din matrice indexul de inceput al fiecare regiuni, iar pe a doua linie toate regiunile detectate, distincte una fata de urmatoarea. Odata cu numarul de benzi vom cunoaste si ce detectam. Pentru o viteza relativ mare, un consum de curent destul de acceptabil si un zgomot care sa nu creeze interferente motoarele
DC merg pana la 30 % din puterea lor. Datorita driverelor realizate viteza motoarelor DC este inte 0 si 100, iar cand vine vorba de motorul servo, driverul a fost proiectat astfel incat valoarea corespunzatoare mijlocului este 64, valoarea 0 reprezinta maxim stanga si valoarea 128 maxim dreapta ( aceste valori pentru servo au fost alese de comun acord pentru a ne ajuta la algoritmul de control al directiei). Daca avem 3 benzi (ALB-NEGRU-ALB) inseamna ca pozitia Servo-motorului va avea valoarea mediei aritmetice dintre inceputul zonei negru (index din cei 128 de biti) si sfarsitul zonei negru (indexul este corespunzator celei de-a doua zone albe) Astfel daca aceasta medie aritmetica este mai mica de 64 masina ma merge in stanga, iar daca este mai mare aceasta va merge spre dreapta. In conformitate cu valorile motorului servo au trebuit modificate si valorile motoarelor DC. Daca diferenta dintre valoarea curenta si 64 este mai mare de 5, motorul DC dreapta scade din viteza direct proportional cu aceasta diferenta. De asemenea este valabil si daca valoarea curenta este mai mica cu cel putin 5 decat 64 viteza acestuia scade. Aceasta scadere a puterii ne ajuta la scaderea timpului in care masina face o curba. In cazul in care masina ajunge doar la o singura banda am desprins 2 situatii : camera vede doar alb sau, camera vede o intersectie (doar negru). Daca camera detecteaza o intersectie directia masini si puterea motoarelor DC raman cele de la pozitia precedenta, iar in cazul zonei albe masina se opreste. Din punctul de vedere al punctului de start, algoritmul este acelasi ca cel in care camera detecteaza 3 benzi (ALB-NEGRUALB). In acest caz camera detecteaza (NEGRU-ALB-NEGRU-ALBNEGRU) avand astfel 5 benzi, iar pozitia este determinata de a 2-a zona de negru. Am luat in considerare si pozitia camerei fata de sol. Daca aceasta este mai mare pentru aceiasi zona de circuit numarul de benzi creste cu 2 in punctul de start camera vede si zona de alb de la extremitatile zonelor de negru (ex: 1010101). Rezultate experimentale Semnalul de la camera pe osciliscop :
Testarea masinii pe circuitul din laborator : [Link] v=MFtJ7L4jZLg&feature=plcp&context=C32a1190UDOEgsToPDsk LSTDOKGz 9mVOZ9SRpKY 865 Concluzii Acest algoritm poate fi imbunatatit, in primul rand printr-o calibrare continua a servo motorului si prin introducerea inca unui senzor optic ( poate chiar inca o camera de acelasi tip ) pentru a asigura o redundanta si pentru a compara datele oferite de cei 2 sensori optici. Aceasta redundanta poate fi usor introdusa in acest algoritm, ne fiind necesara regandirea acestuia.
Feliu Gabriel Grupa : 1404B Partea electrica din aceasta masina a fost partea pe care m-am axat eu si dupa cum spuneam mai sus , s-a dezvoltat ideea de a pune un amplificator pe camera liniara. Acest amplificator este construit cu ajutorul capsulei TLC277CD ce stocheaza 2 amplificatoare operationale. Schema amplificatorului admite posibilitatea de a conecta pe rand cele 2 amplificatoare operationale oferind astfel posibilitatea alegerii factorului de amplificare. Dupa atasarea amplificatorului se pot vedea urmatoarele imbunatatiri calitative asupra semnalului capturat din camera:
Banda normala
Scopul amplificatorul este de a reduce timpul de integrare al camerei , deci cresterea numarului de capturi pe secunda. Pentru masurarea vitezei am hotarat ca se vor folosi 2 senzori Hall unipolari TLE4905. Pe fiecare roata o sa se lipeasca 5 magneti :
Datorita problemelor cu lumina ambientala vom folosi o bareta de LED-uri comandata cu PWM pentru a eficientiza consumul de energie.
Pe TRK-5604B (placa de dezvoltare oferita de Freescale) exista un sensor de lumina de care ne vom folosi pentru setarea luminii artificiale oferita de bareta de LEDuri. Din principiul de functionare al unui motor de current continuu putem trage urmatoarele concluzii: Cand bobina din interiorul motorului este alimentata, in jurul carcasei se creeaza un camp magnetic. Acest camp magnetic este destul de greu de stapanit. Ca o solutie la aceasta problema am stabilit sa ecranam motoarele si cablurile de date. Motoarele se pot ecrana printr-o cutie de tip cusca faraday si cablurile prin blocuri de ferita ce se comporta ca niste bobine pe cablurile de date. S-a observat ca daca se folosesc cabluri ecranate, efectul nociv al motoarelor asupra datelor s-a diminuat.
Pentru redundanta algoritmului vom folosi o bareta de senzori reflexivi ce vor fi pusi in fata masinii pentru un control mai bun in algoritmul folosit.
In prima faza am contribuit la debug-ul OS-ului realizat de colegul meu Sorin. Am lucrat amandoi la driverele pentru perifericele masinii ceea ce a insemnat in prima faza configurari low-level pentru eMIOS, SIU respectiv ADC, care sa permita o interfatare facila cu driverele de pe nivelul superior si un control cat mai facil. Am realizat si un driver pentru interfata seriala a MCU(LINFlex) pentru testarea corectitudinii diverselor drivere. La nivel low-level am avut de-a face cu lucru cu registri de configurare, setari de pini pentru modulele aferente, interpretarea unui pin ca input/output/PWM, folosirea timerelor si alte probleme asemanatoare. Pentru ADC am realizat o configurare in one-shot mode, ceea ce inseamna ca in momentul activarii modulului vor fi esantionate canalele specificate initial. Pentru masinuta am avut nevoie pana acum de 3 canale: 1 pentru camera lineara, respectiv 2 pentru feedback-ul provenit de la motoarele DC. Faza initiala de testare a acestui driver a presupus trimiterea pe seriala a valorilor de
feedback de pe cele 2 motoare in corelatie cu efortul depus de motor(miscare in gol vs. aderenta). Driverele high-level au fost realizate intr-o maniera asemanatoare, folosind primitivele low-level pentru configurarile initiale, respectiv niste rutine simple pentru controlul motoarelor. Toate motoarele folosesc PWM-uri ca output, servo-ul reprezentand elementul cel mai lent(perioada de 20 ms). Pentru DC-uri functia de control foloseste ca parametru factorul de umplere(simbolic in program acesta reprezinta viteza pentru motoarele din stanga si din dreapta: SPEED_MOTOR_LEFT si SPEED_MOTOR_RIGHT - variabile globale ce sunt actualizate de algoritmul de urmarire al linie). Am pornit initial cu un factor de umplere de 25% pentru motoarele de curent continuu. Driver-ul pentru Servo permite pozitionarea acestuia in functie de variabila ServoPosition in corespondenta cu un interval ce denota limitamaxim stanga, respectiv limita maxim-drepata. Intervalul este scalat ulterior in functie de constantele servo-ului pentru pozitionarea reala a acestuia. Noi am folosit un interval semnificativ de [0,127]( -> 128 de pixeli). Apelul la aceste drivere(DC & Servo) s-a realizat in task-ul de control al masinii. In cadrul driver-ului pentru camera am realizat o functie de achizitie Camera_Scan care folosind ADC-ul actualizeaza valorile analogice ale pixelilor. Avand in vedere sincronizarea necesara dintre SI(activarea camerei) si CLK(clockul camerei) am fost nevoiti sa folosim un timer software pentru preluarea celor 128 de valori. Am transmis valorile pe serial si am realizat o plotarea a acestora pentru a verifica corectitutinea datelor. Operatia urmatoare a presupus o procesare a datelor( Camera_Process ), respectiv transformarea valorilor rezultate in urma esantionarii in valori binare(1 alb, 0 negru) folosind a valoare threshold. Valoarea aleasa pentru prag(threshold) reprezinta in continuare subiect de discutie. In conditiile initiale de zgomot, semnal neamplificat alegerea acestea a fost dificila, intre albul clar, respectiv negrul clar(maximul si minimul din valorile esantionate) ceea ce la trecerea in benzi/paliere a avut ca rezultat si conservarea zgomotului. S-a observat necesitatea unei filtrari, respectiv amplificari pentru semnalul provenit de la camera. Dupa adaugarea amplificatorului , si cresterea preciziei/claritatii
semnalului de la camera valoarea threshold a fost fixata la o treime intre albul si negru. Dupa obtinerea celor 128 de biti si filtrarea acestor am realizat translarea in benzi(limitile benzilor, respectiv culoarea acestora). Am realizat din nou o verificare prin afisarea pe seriala a structurii ce continea benzile. Reprezentarea in benzi a fost folosita in pasul urmator de algoritmul de control a directiei (Camera_Analyze). Cele trei functii au fost incorporate intr-un task distinct aferent camerei(cu prioritatea cea mai mare).
Cracana Sorin Cezar Real Time Operating System Micro C OS / II Urmatorul pas a avut in utilizarea unui RTOS(COS-II). Pentru aceasta a trebuit sa intelegem principiile de functionarea a acestui system de operare si apoi sa realizam un port pentru procesorul nostru, Freescale MPC5604B, plecand de la un port deja existent pentru o alta familie PowerPC de la Freescale. MicroC/OS II este un sistem de operare dedicat produselor embedded din diferite domenii, de la echipamente medicale pana la avionica, cu urmatoarele beneficii : Este gratuit pentru scopuri academice ( codul integral este pus la dispozitie pe site-ul celor de la Micrium) Portabil este scris in mare parte in ANSI C si contine cod specific in asamblare modularizat pentru a putea fi portat cu usurinta catre alte procesoare ( care trebuie sa doar sa aiba Stack Pointer si registrii processor sa poata fi pusi si scosi de pe o stiva Contine semafoare, flag-uri, MUTEX-uri, cozi, cozi de mesaje Scalabil utilizatorul poate dezactiva anumite servicii care nu ii folosesc pentru a reduce dimensiunea OS-ului pentru a se plia cu usurinta dupa diferite constrangeri de memorie Preemptiv MicroC/OS II intodeauna ruleaza task-ul cu prioritatea cea mai mare care este in starea Ready Multi-Tasking se pot folosi pana la 64 de taskuri Servicii : cozi, semafoare, mutex-uri
Arhitectura sistemului de operare este prezentata in figura urmatoare. Pentru a adapta portul la procesorul nostru a fost urmarirea si modificarea urmatoarelor fisiere : OS_CPU.H - pentru definirea tipurilor de date signed, unsigned pe 8, 16, 32 biti - pentru definirea modului in care sistemul intra si iese dintr-o regiune critica - definirea sensului in care creste stiva (OS_STK_GROWTH) OS_CPU_C.C OSTaskStkInit() initializarea stivei pentru taskuri OSTaskCreateHook() OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTimeTickHook() OS_CPU_A.ASM OSStartHighRdy() apelata de OS pentru determinarea urmatorului task gata de executie OSCtxSw() apelata de OS pentru schimbarea de context OSIntCtxSw() apelata de OS in cazul schimbarii contextului intr-o intrerupere OSTickISR() intreruperea de Timer a OS-ului
S-au construit drivere pentru fiecare periferic configuranduse corespunzator pinii si registrii aferenti pentru a permite un control robust asupra resurselor disponibile. Cu ajutorul driverelor am creeat un nou strat de abstractizare asupra perifericelor pentru o mai rapida implementare a algoritmului. Dificultatile intampinate au fost: schimbarea contextului cu salvarea corecta a tuturor registrilor, respectiv refacerea acestuia dupa terminarea unui task. S-a modificat proiectul generat de CodeWarrior pentru maparea intreruperilor hardware (introducerea unor sectiuni noi in LCF (Linker Command File)) si modificarea epilogului si a prologului. Rezultate experimentale Testarea masinii pe circuitul din laborator :
Comandarea la distanta a unui sistem mobil cu ajutorul unei telecomenzi tip touch Resurse materiale/timp - Actuatori: 2 servomotoare capabile de o rotatie de 360 - 2 placute SBC876: una pentru comandarea sistemului mobil si una pentru comunicatii - Sistem mobil - 5 fotodiode de emisie - 5 fotodiode de receptie cate una pentru fiecare deget - tranceiver emisie/ receptie de comunicatie 2. Alternative solutie
Metoda 1: sistem mobil controlat prin Bluetooth Este un robot complet asamblat care este controlat de o placa de dezvoltare care contine atat driver-ul pentru motoare (L293D) cat si microcontroller-ul ATMega328 (pentru programare). Este programabil cu mediul de dezvoltare Arduino ( este inclus un conector FTDI pentru programare). In zona mecanica contine doua motoare tip Pololu(Motor electric cu cutie de viteza cu raport de transmisie 120:1), roti 50 X 30 mm si o platforma taiata la CNC laser. Robotul este alimentat de la 8 baterii( 4 dau curent pentru motoare, si 4 pentru microcontroller), si sa ii adaugi senzori sau alte dispozitive pentru comunicare. Robot comandat prin telefonul mobil (adauga un conector Bluetooth). Acest modem Bluetooth functioneaza excelent cu Arduino. Este foarte simplu de utilizat (pur si simplu datele scrise pe pinii RX/TX sunt disponibili la receptor) - din acest punct de vedere putem considera ca si cum pinii RX/TX sunt conectati prin fire obisnuite intre emitator si receptor. Modemul dispune de un modul de clasa 2 RN-42, simplu de utilizat si cu documentatie excelenta. Modemul are regulatoare de tensiune pe placa, astfel incat poate fi alimentat intre 3.3 si 6 V. Specificatii - modem Bluetooth clasa 2 - atinge 10 metri ca distanta de transmisie - consuma in medie 25 mA - conexiune criptata
- frecventa 2.4~2.524 GHz - tensiune de alimentare 3.3 - 6 V - capabil de rate de transfer intre 2400-115200 bps - temperatura de operare - 40 ~ + 70 C - antena inclusa pe placa Sursa: [Link] Cum sa it conectezi telefonul mobil la Arduino : [Link]
Metoda2: Sistem mobil comandat prin infrarou Sistemul mobil este implementat sub forma unui triciclu la care traciunea este realizat de roile din spate care sunt montate pe un ax comun iar direcia este asigurat de roata din fa. Partea mecanic este format din: -Motor pas cu pas -Sistem de multiplicare a puterii cu roi dinate -Motor de current continuu -Sistem de transmisie prin curea pentru traciune Partea electronic este format din: -SBC 876 -Modul de command motor pas cu pas -Modul de comand motor de current continuu -Modul receptor infrarou ntregul sistem mobil este controlat de microcontroler-ul 16F876 al firmei Microcip. Placa SBC 876 mi asigur interconectarea dintre microcontroler i modulele de comand ale motoarelor. Modulul de comand al motorului pas cu pas este compus din: -patru optocuploare -driver (ULN 2003) Optocuplorul este realizat dintr-un LED infrarou i un receptor infrarou montate cap n cap prin intermediul unui tub opac pentru a minimiza influenele din exterior. Driver-ul ULN2003 comand mai departe cele 4 bobine ale motorului pas cu pas . Microcontroler-ul decodeaz semnalele primite de telecomand i n cazul recunoaterii uneia din cele patru comenzi (nainte, stop, stnga, dreapta) comand motoarele n scopul realizrii micrii dorite a sistemului mobil. Sursa: [Link] 3. Descrierea solutiei Sistemul mobil este implemetat sub forma a doua module complet independente: telecomanda care este formata din: 5 perechi de senzori cu infrarosu : emisie-receptie O placa SBC876 pentru procesarea datelor Un tranceiver de unde radio HM-T care functioneaza pe o frecventa de 868 MHz sistemul mobil care este format din: Un receptor de unde radio HM-R care functioneaza pe o frecventa de 868 MHz
2 servomotoare Hextromnik HXT 900 modificate astfel incat ca faca o rotatie de 360 de grade SBC 876
4.
Detalii de implementare
Mosnegutu Cristina: Resurse folosite pentru pentru telecomanda: -5 diode infrarosu emisie( BPV 10NF 51150 -cod [Link]) -5 diode infrarosu receptie(SFH 415 50253-cod [Link]) -5 rezistente 330 Ohm -4 rezistente de 1 MOhm -5 rezistente de 2 MOhm - modul HM-T 868 MHz - SBC 876 S-a facut calibrarea diodelor de receptie cu ajutorul unui Byte Display astfel incat diferenta intre diferite medii sa difere cat mai mult: -negru: 179 -alb: 0 -deget: 43 Pentru calibrare am citit valoarea data de dioda(0-255) si am trimis valoarea zecimala pe PORTB a placii SBC 876. Pentru diodele 2 si 5 s-au aplicat corecturi: s-au mai implantat cate 2 rezistente de cate 1 MOhm legate in serie cu rezistenta de 2 HOhm existenta si la celelalte diode.
Butnariuc Alexandra: Pentru sistemul mobil s-a folosit: - 2 servomotoare Hextromnik HXT 900 modificate astfel incat ca faca o rotatie de 360 de grade - SBC 876 - 4 baterii de 1,5 V pentru alimentarea motoarelor - o baterie de de 9 V pentru alimentarea placii - o mufa de alimentare mama - o dioda de intrare -un condensator 47nK63 -o rezistenta de 1 KOhm -un led rosu -modul HM-R 868 MHz Actionarea motoarelor se face cu o functie numita puls care primeste ca panametru cuprins intre 0 si 255 pasul unghilui cu care trebuie rotit mototul: - 160: inainte - 170: stop - 180: inapoi
Mosnegutu Cristina si Butnariuc Alexandra : Pentru comunicarea intre telecomanda si sitemul mobil am incercat sa utilizam o pereche de module HM-R 868 MHz si HM-T 868 MHz. Din cauza unor probleme nu am reusit sa realizam comunicarea intre cele doua parti si am incercat sa testam functionalitatea sistemului cu ajutorul unui cablu serial cu doua mufe tata. Datorita dificultatii lucrului cu dispozitivele de tranmit-receive cu unde radio am abandonat idea de a le mai folosi si am recurs la o metoda mai simpla: comunicatie seriala. Sistemul finalalizat: Conexiunea folosita nu este una uzuala: cablurile seriale gasite in comert de obicei au in unul din capete mufa serial mama si celalalt mufa tata. De aceea a trebuit sa construim noi unul. Aceata este schema dupa care s-a construit cablul serial:
5.
Conectand telecomanda la Teminal printr-un cablu serial normal la fiecare 5 secunde de va trimite de pe placa SBC876 cate un caracter: A,B,C,D,E,F astfel corespunzand: - A: stop - B: vireaza la stanga - C: inainte - D: vireaza la dreapta - E:inapoi - F: eroare Conectand sistemul mobil la Terminal asteapa trimiterea uneia din literele descrise anterior : - A: amblele motoare sunt oprite - B: motor stanga stop, motor dreapta inainte - C: ambele motoare inainte - D: motor stanga inainte, motor dreapta stop - E: ambele motoare merg inapoi - F: ambele motoare merg inapoi - nimic: stop Problema: Folosind cablul serial creat pentru conectarea celor 2 placi SBC 876 sistemul preia o singura instructiune imediat dupa reset desi protocolul de preluare a unei instructiuni de pe serial este facut cyclic la infinit. Sistemul preia instructiuni diferite de pe serial doar ca nu face acest lucru continuu. Concluzie: Cablul serial nu este construit bine deoarece acelasi lucru care se face prin conexiunea seriala cu telecomanda se face cu cu ajutorul programului Terminal si de acolo preia intructiuni continuu fara a fi nevoie de reset.
receiver.c int xx; void puls1(char t) { RB0=1; DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); for(xx=1;xx<=t;xx++) DelayUs(1); // avans unghi RB0=0; DelayMs(7); // repetare dupa 7ms } void puls2(char t) { RB1=1; DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); for(xx=1;xx<=t;xx++) DelayUs(1); // avans unghi RB1=0; }
while(1) { data=ReceiveUSART();DelayMs(5); // TransmitUSART(data);DelayMs(5); switch(data) { case 'A': //stop puls1(170);puls2(170);DelayMs(5);break; case 'B': //stanga puls1(160);puls2(170);DelayMs(5);break; case 'C': //inainte puls1(160);puls2(180);DelayMs(5); break; case 'D': //dreapta puls1(170);puls2(160);DelayMs(5);break; case 'E': //inapoi puls1(180);puls2(160);DelayMs(5);break; default:puls1(180);puls2(160); DelayMs(5); break; } } }
transmit.c unsigned char ad[5]={0b01000001,0b01001001,0b10010001,0b10011001,0b10100001}; //ADCON0 char readADC(char c) // Returneaza octet superior convertor -rutina imbunatatita 23.05.2011 { char val; ADCON0=ad[c]; // alimentare modul AD DelayUs(10); // asigurare stabilitate ADCON1=0b00000000; // RA0-RA5 intrari analogice DelayUs(10); ADGO=1; //start conversie while(ADGO==1); //asteapta sfarsitul conversiei val=ADRESH; return val; } void main(void) { unsigned char trans; unsigned char deg1,deg2,deg3,deg4,deg5; //TRISC=0b10000000; //RC7/RX intrare , RC6/TX iesire TRISA=0xFF; //PORTA intrare // TRISB=0x00; // La portul B este ByteDisplay InitUSART(); for(;;) { trans=0b00000000; deg1=readADC(0); deg2=readADC(1); deg3=readADC(2); deg4=readADC(3); deg5=readADC(4); // Achizitie canal 0 // Achizitie canal 1 // Achizitie canal 2 // Achizitie canal 3 // Achizitie canal 4
if((int)deg1>10 && (int)deg1<150) {//trans=0b00000010; trans='A'; } else { if((int)deg2>20 && (int)deg2<200) {// trans=0b00000100; trans='B'; } else
{ if((int)deg3>20 && (int)deg3<200) { //trans=0b00001000; trans='C'; } else { if((int)deg4>10 && (int)deg4<200) {// trans=0b00010000; trans='D'; } else { if((int)deg5>100 && (int)deg5<235) {// trans=0b00100000; trans='E'; } else {// trans=0x00; trans='F'; } }}}} TransmitUSART(trans); DelayMs(5); } }
Echipa 4 : Studenti: 1. Ana Veronica Frunza 2. Alexandru Popovici 3. Stefan Sarbu 4. Bogdan Vasiloaea Rezumat: Sistem de eficientizare a consumului de energie - aprinderea si stingerea becurilor din incaperile unei case, in functie de lumina ambientala. Identic si pentru incalzire. Acelasi sistem va fi atat automat cat si accesibil prin internet. Resurse materiale/timp: - senzori de lumina - senzori de temperatura -modul ethernet -placa de dezvoltare Arduino Resurse de timp: 35 de ore.
Proiectul nostru isi propune eficientizarea consumului de energie electrica folosit pentru incalzirea si iluminatul unei [Link] ca ineficienta sistemelor actuale se datoreaza in primul rand faptului ca este necesara prezenta elementului uman pentru a le [Link]
controlul de la distanta este imposibil si tot odata automatizarea nu este prezenta, factorul uman avand principala putere de decizie in pornirea si oprirea a acestor sisteme. In urma documentarii am ajuns la concluzia ca exista mai multe abordarii pentru rezolvarea acestui tip de proiect dar toate graviteaza in jurul ideii de automatizare. [Link] de control automatizat folosind telefonul mobil [Link] Acest system este impartit in 3 sectiuni [Link] sunt: Fisierele PHP aflate pe server acestea manevreaza interfata cu browsere (HTML) si telefoane WAP care trimit comenzile catre pc-ul de acasa. Aplicatie Java pe pc-ul de acasa care primeste message de la server si le trimite prin intermediul portului serial catre sistemul automatizat. Sistemul de control primeste semnalele prin portul serial ce activeaza sistemul de iluminat conectat la 220v care este construit cu PIC16F84. 2. Masurarea temperaturii si controlul acesteia prin intermediul internetului [Link] [Link] In aceasta abordare sunt folositi 2 sezori digitali de temperatura conectati prin intermediul unei placi de Ethernet folosim pentru a vedea temperatura curenta cat si istoricul temperaturilor pe 5 [Link] metoda este realizata cu un web server embedded ruleaza pe un modul Ethernet impreuna cu driverele pentru senzori. Un releu atasat placii web serverului poate fi folosi pentru a activa de la distanta incalzirea incaperii sau a aerului [Link] acestea sunt realizate cu o placa web server avand un microcontroler de tipul atmega168 sau atmega328.
3. Procesul de control automatizat folosind instalatia electrica deja existent [Link] Acest sistem isi propune un minim de interventie la nivelul instalatiei electrice din casa, folosindu-se de cablurile din perete si de un modem de codificare/decodificare a semnalului. Acest sistem presupune existenta unei unitati de control si a mai multor decodificatoare de semnal atasate la alimentarea fiecarui corp de iluminat sau incalzire. Unitatea de control codifica semnalele pe care le transmite apoi prin instalatia electrica la toate unitatile de decodificare, urmand ca cele carora le sunt adresate semnalele sa le decodifice si apoi sa le concretizeze prin actiunile ce sunt programate pentru respectivele semnale. Solutia de mai sus foloseste un circuit de tip TDA5051A produs de NXP Semiconductors. Acest circuit este un modem IC (modem ce poate transmite informatia prin liniile de telefon sau de current) ce foloseste transmisia ASK (Amplitude Shift Keying o forma
de modulare a semnalului ce reprezinta informatia digitala ca variatie de amplitudine a unei unde purtator in acest caz, curentul electric). Pentru control codificarii informatiei (inclusiv partea de programare software) este folosit un microcontroller ARM Cortex-M0, urmand ca fiecare unitate de decodificare (atasata instalatiilor de iluminat/incalzire) sa fie controlata de un microcontroller low-cost PIC18xxxx.
Ciorna de solutie (Ce vom implementa) In urma explorarii documentare de mai sus, ne-am decis ca pentru implementarea solutiei noastre sa folosim controlul prin internet a sistemului, iar pentru realizarea acestui sistem ne-am hotarat sa utilizam urmatoarele componente: Placa de dezvoltare Arduino Mega (microcontroller Atmega 1280) 1 modul Arduino Ethernet Shield 1 fototranzistori pentru detectia intensitati luminii 1 senzor de temperatura Dallas DS1820 1 cooler pentru simularea racirii incaperii 1 motor servo pentru simularea controlului jaluzelelor 1 bec conectat la 220v si comandat prin intermediul unui releu O pagina web (HTML) pentru controlul manual de la distanta
Ca si mod de functionare: 1. Manual - sistemul este controlat de catre utilizator folosind o interfata web ce poate fi accesata de pe terminale mobile sau statice. Aceasta va fi implementata pe placa de dezvoltare urmand apoi sa fie conectata la internet cu modulul Ethernet 2. Automat - folosind informatiile primite de la senzori si un algoritm de eficientizare (construit in asa fel incat sa se elimine redundantele din sistem - de exemplu, daca e lumina afara si jaluzelele inchise, acestea din urma se vor deschide iar lumina va fi stinsa). Pe baza acestui program, sistemul va lua deciziile potrivite pentru a minimiza consumul de energie.
Ca exemplificare a modului de functionare, am atasat urmatoarea secventa de cod, care se ocupa de citirea temperaturii de la senzor si transformarea valorii in text pentru trimiterea acesteia spre interfata: void getCurrentTemp(char *temp) { int HighByte, LowByte, TReading, Tc_100, sign, whole, fract;
OneWireReset(TEMP_PIN); OneWireOutByte(TEMP_PIN, 0xcc); OneWireOutByte(TEMP_PIN, 0x44); // perform temperature conversion, strong pullup for one sec OneWireReset(TEMP_PIN); OneWireOutByte(TEMP_PIN, 0xcc); OneWireOutByte(TEMP_PIN, 0xbe); LowByte = OneWireInByte(TEMP_PIN); HighByte = OneWireInByte(TEMP_PIN); TReading = (HighByte << 8) + LowByte; sign = TReading & 0x8000; // test most sig bit if (sign) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 whole = Tc_100 / 10; // separate off the whole and fractional portions fract = Tc_100 % 10;
if(sign) temp[0]='-'; else temp[0]='+'; if(whole/100==0) temp[1] =' '; else temp[1]= whole/100+'0'; temp[2]= (whole-(whole/100)*100)/10 +'0' ; temp[3]= whole-(whole/10)*10 +'0'; temp[4]='.'; temp[5]=fract/10 +'0'; temp[6]=fract-(fract/10)*10 +'0'; temp[7] = '\0'; }
Sistemul este controlat prin intermediul unei interfete web(html) care ruleaza direct de pe placa de dezvoltare arduino impreuna cu modulul ethernet in acest fel sistemul nu este
dependent de un alt sistem, acesta putand fi conectat direct la un [Link] momentul de fata aceasta fiind functionala in proportie de 80%. Mai trebuie rezolvata problema afisarii in timp real a informatiilor precum si optimizarea sursei deoarece in momentul actual interfata mai are tendinta de a se bloca dupa un numar de utilizari.
Lucruri ce mai trebuie finalizate: controlul automat al sistemului in functie de praguri de temperatura si lumina. ########################################################################
Raport Final
Ne-am propus eficientizarea consumului de energie electrica folosit pentru incalzirea si iluminatul unei [Link] ca ineficienta sistemelor actuale se datoreaza in primul rand faptului ca este necesar prezenta elementului uman pentru a le actiona astfel controlul de la distanta este imposibil si tot odata automatizarea nu este prezenta, factorul uman avand principala putere de decizie in pornirea si oprirea sistemelor. In urma explorarii documentare facuta in saptamana 6, ne-am propus ca pentru implementarea solutie noastre sa folosim controlul prin internet a sistemului, iar pentru realizarea acestui sistem ne-am hotarat sa utilizam urmatoarele componente: Placa de dezvoltare arduino mega (microcontroller atmega 1280) 1 modul arduino ethernet shield 1 fototranzistor pentru detectia intensitatii luminii 1 senzor de temperatura dallas ds18s20 1 cooler pentru simularea racirii incaperii 1 motor servo pentru simularea controlului jaluzelelor 1 bec conectat la 220v si comandata prin intermediul unui releu
Am reusit doar sa implementam o parte din aceste componente din cauza unor dificultati pe care le-am intalnit la configurarea modului ethernet . In final la realizarea proiectului nostru am reusit sa implementam modul arduino ethernet conectat la placa de dezvolatarea arduino mega, 1 senzor de temperatura dallas ds18s20 care indica temperatura curenta din incapere, 1 fototranzistor care l-am folosit pentru detectia intensitatii luminii si in functie de aceasta intensitate (daca este lumina sau nu) sistemul ia singur decizii daca sa aprinda lumina sau nu in incapere dupa anumite praguri date de [Link] simularea bec-ului am utilizat un [Link] poate fi controlat si manual de pe o pagina web scrisa in html. In figura de mai jos se poate vedea cum arata varianta finala a paginii web :
Site-ul se actualizeaza singur la fiecare 10 secunde, in functie daca este lumina sau nu in incapere totul este actualizat pe site [Link] este aratat si valoarea senzorului de lumina si pragrurile dupa care acesta ia deciziile daca se poate aprinde lumina daca nu este lumina si daca acesta stinge lumina din incapere in functie de intensitate. Datorita modului ethernet pe care il utilizam acest sistem poate fi conectat la orice retea sau un router si ruleaza fara sa fie dependent de un alt sistem deoarece tot codul pentru interfata web este compilat pe placa de dezvoltare. Vasiloaea Bogdan (ECHIPA 4) configurare modul ethernet Pentru realizarea web-serverului am utilzat un modul ENC28J60 Ethernet Shield pentru Arduino care este construit pe un chip Microchip ENC28J60 SPI Ethernet .Pentru ca nu este un modul original pentru placile de dezvoltare Arduino, este doar o alta alternativa mai ieftina si din
aceasta cauza pentru acest modul inca nu exista librarii bine puse la punct si din acest punct de vedere am intalnit multe probleme in realizarea web serverului. Chipul WIZnet W5100 este versiunea oficiala suportata de librariile standard pentru Arduino. Librariile pentru modulul enc28j60 le putem gasi aici [Link] . Configurare modul ethernet: static uint8_t mac[6] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; static uint8_t ip[4] = { 192, 168, 1, 15}; static uint16_t port = 80;
#define BUFFER_SIZE 5000 #define STR_BUFFER_SIZE 32 static uint8_t buf[BUFFER_SIZE+1]; static char strbuf[STR_BUFFER_SIZE+1]; EtherShield es=EtherShield(); uint16_t plen; void ETHER_28J60::setup(uint8_t macAddress[], uint8_t ipAddress[], uint16_t port) { _port = port; es.ES_enc28j60Init(macAddress); es.ES_enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz delay(10); es.ES_enc28j60PhyWrite(PHLCON,0x880); delay(500); es.ES_enc28j60PhyWrite(PHLCON,0x990); delay(500); es.ES_enc28j60PhyWrite(PHLCON,0x880); delay(500); es.ES_enc28j60PhyWrite(PHLCON,0x990); delay(500); es.ES_enc28j60PhyWrite(PHLCON,0x476); delay(100); es.ES_init_ip_arp_udp_tcp(macAddress, ipAddress, _port); } char* ETHER_28J60::serviceRequest() { uint16_t dat_p; int8_t cmd; plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will ne unequal to zero if there is a valid packet (without crc error) */ if(plen!=0) { // arp is broadcast if unknown but a host may also verify the mac address by sending it to a unicast address. if (es.ES_eth_type_is_arp_and_my_ip(buf, plen)) { es.ES_make_arp_answer_from_request(buf); return 0; }
// check if ip packets are for us: if (es.ES_eth_type_is_ip_and_my_ip(buf, plen) == 0) { return 0; } if (buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V) { es.ES_make_echo_reply_from_request(buf, plen); return 0; } // tcp port www start, compare only the lower byte if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L _P] == _port) { if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V) { es.ES_make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack return 0; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V) { es.ES_init_len_info(buf); // init some data structures dat_p=es.ES_get_tcp_data_pointer(); if (dat_p==0) { // we can possibly have no data, just ack: if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V) { es.ES_make_tcp_ack_from_any(buf); } return 0; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0) { // head, post and other methods for possible status codes see: // [Link] plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>")); plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); return (char*)strbuf; } } } } } void ETHER_28J60::print(char* text) { int j = 0; while (text[j]) {
buf[TCP_CHECKSUM_L_P+3+plen]=text[j++]; plen++; } } void ETHER_28J60::print(int number) { char tempString[9]; itoa(number, tempString, 10); print(tempString); } void ETHER_28J60::respond() { es.ES_make_tcp_ack_from_any(buf); // send ack for http get es.ES_make_tcp_ack_with_data(buf,plen); // send data }
Sarbu Stefan (ECHIPA 4) pagina web (HTML) In realizarea paginii web am folosit limbajul html deoarece placa dezvoltare arduino mega 1280 impreuna cu modulul ethernet ENC28J60 recunosc acest limbaj si impreuna cu functiile de print din libraria ethernet am reusit sa trimit prin intermediul retelei valorile senzorilor si afisarea paginii web in browser.
void ETHER_28J60::print(char* text) { int j = 0; while (text[j]) { buf[TCP_CHECKSUM_L_P+3+plen]=text[j++]; plen++; } } void ETHER_28J60::print(int number) { char tempString[9]; itoa(number, tempString, 10); print(tempString); } void ETHER_28J60::respond() { es.ES_make_tcp_ack_from_any(buf); // send ack for http get es.ES_make_tcp_ack_with_data(buf,plen); // send data } [Link]("<HEAD>"); [Link]("<meta http-equiv=\"refresh\" content=\"10\">"); [Link]("<TITLE />Proiect SI 2011-2012</title>"); [Link]("</head>"); [Link]("<body bgcolor=#FDD017>"); [Link]("page refresh number "); [Link](x); [Link]("<br> <INPUT TYPE=\"button\" onClick=\"[Link](0)\" VALUE=\"Refresh Page\">");
[Link]("<center><p><font color=\"#2554C7\"><h1>PROIECT SISTEME INCORPORATE<br>"); [Link]("2011-2012</h1></p></font><br><br>"); [Link]("<hr>"); [Link]("<H2>Temperatura curenta din incapere este:</H2<br><br><br>"); [Link]("<table bgcolor=red width=200 border=5><tr>"); [Link]("<td><H1><center><font color=black> +"); [Link]([Link](0)); [Link](" ° C </center></font></H1>"); [Link]("</tr></table></td>"); [Link]("<hr>"); if(analogRead(senzor)>=1000) { [Link]("<table bgcolor=#ff0000 border=1><tr>"); [Link]("<td><H2><font color=yellow>"); [Link]("NU ESTE LUMINA IN CAMERA"); [Link]("</font></H2></td>"); [Link]("</tr></table>"); // delay(1); } else { [Link]("<table bgcolor=#ff0000 border=1><tr>"); [Link]("<td><H2><font color=\"#FFD700\">"); [Link]("ESTE LUMINA IN CAMERA"); // digitalWrite(outputPin, HIGH); [Link]("</font></H2></td>"); [Link]("</tr></table>"); //delay(1); } [Link]("<H2>Ledul din incapere este:</H2>"); if (strcmp(params, "?cmd=on") == 0 && analogRead(senzor)>=1000) [Link]("<H2><font color=\"#00FF00\">APRINS</font></H2>"); digitalWrite(outputPin, LOW); [Link]("<a href='?cmd=off'><button style=width:100;height:30>TURN OFF</button></a>"); // [Link]("<h1><A HREF='?cmd=off'>Turn off</A></h1>"); // delay(1); } else { [Link]("<h2><font color=\"#FF0000\">STINS</font></h2>"); digitalWrite(outputPin, HIGH); // [Link]("<h1><A HREF='?cmd=on'>Turn on</A></h1>"); [Link]("<a href='?cmd=on'><button style=width:100;height:30>TURN ON</button></a>"); } [Link]("</center>"); [Link]("<h4>VALOARE SENZOR LUMINA: "); [Link](analogRead(senzor)); [Link]("<table bgcolor=#00FF00 border=1><tr>"); [Link]("<td>SENZOR LUMINA > 1000 : NU ESTE LUMINA<br></td></tr>"); [Link]("<tr><td>SENZOR LUMINA < 1000 : ESTE LUMINA</td>"); [Link]("</h4></table>"); {
[Link]("</body><hr>"); [Link](); }
Popovici Alexandru (ECHIPA 4) configurarea senzor temperatura DS18S20 Modul de conectare a senzorului de temperatura DS18S20
Membrii familiei DS18x20 sunt senzorii digitali de temperatura relativ precisi. Ei folosesc 1-wire protocol, care necesit doar 1 fir pentru primirea si transmiterea de .Pentru aceasta exista librarie standard pentru placile de dezvoltare arduino. [Link] Pentru ca primele functii care le-am realizat pentru citirea si conversia temperaturii nu functionau bine(aratau o valoarea mai mare fata de temperatura care era in in capere am folosit o librarie DallasTemperature care apeleaza libraria anterioara one wire. [Link] #include <OneWire.h> #include <DallasTemperature.h> #define TEMP_PIN 3 OneWire oneWire(TEMP_PIN); #define senzor 0 DallasTemperature sensor(&oneWire);
void setup() { digitalWrite(TEMP_PIN, LOW); pinMode(TEMP_PIN, INPUT); // sets the digital pin as input (logic 1) } Void loop { char temp_string[100]; level = analogRead(senzor); // getCurrentTemp(temp_string); [Link](); }
#include <OneWire.h> #include <DallasTemperature.h> #include "etherShield.h" #include "ETHER_28J60.h" #define TEMP_PIN 3 OneWire oneWire(TEMP_PIN); int outputPin = 8; int level;
int x=0; #define senzor 0 DallasTemperature sensor(&oneWire); static uint8_t mac[6] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; // this just needs to be unique for your network, // so unless you have more than one of these boards // connected, you should be fine with this value. static uint8_t ip[4] = { 192, 168, 1, 15}; // the IP address for your board. Check your home hub // to find an IP address not in use and pick that // this or [Link] are likely formats for an address // that will work. static uint16_t port = 80; 80 - the standard for HTTP //EtherShield ed=EtherShield(); ETHER_28J60 e; // Use port
void setup() { // [Link](9600); [Link](mac, ip, port); pinMode(outputPin, OUTPUT); digitalWrite(TEMP_PIN, LOW); pinMode(TEMP_PIN, INPUT); // sets the digital pin as input (logic 1) pinMode(senzor, INPUT); [Link](); } //void(* resetFunc) (void) = 0; void loop() { char temp_string[100]; char *params; level = analogRead(senzor); // getCurrentTemp(temp_string); [Link](); delayMicroseconds(500); //resetFunc(); if (params = [Link]()) { x=x+1; [Link]("<HEAD>"); [Link]("<meta http-equiv=\"refresh\" content=\"10\">"); [Link]("<TITLE />Proiect SI 2011-2012</title>"); [Link]("</head>"); [Link]("<body bgcolor=#FDD017>"); [Link]("page refresh number "); [Link](x); [Link]("<br> <INPUT TYPE=\"button\" onClick=\"[Link](0)\" VALUE=\"Refresh Page\">");
[Link]("<center><p><font color=\"#2554C7\"><h1>PROIECT SISTEME INCORPORATE<br>"); [Link]("2011-2012</h1></p></font><br><br>"); [Link]("<hr>"); [Link]("<H2>Temperatura curenta din incapere este:</H2<br><br><br>"); [Link]("<table bgcolor=red width=200 border=5><tr>"); [Link]("<td><H1><center><font color=black> +"); [Link]([Link](0)); [Link](" ° C </center></font></H1>"); [Link]("</tr></table></td>"); [Link]("<hr>"); if(analogRead(senzor)>=1000) { [Link]("<table bgcolor=#ff0000 border=1><tr>"); [Link]("<td><H2><font color=yellow>"); [Link]("NU ESTE LUMINA IN CAMERA"); [Link]("</font></H2></td>"); [Link]("</tr></table>"); // delay(1); } else { [Link]("<table bgcolor=#ff0000 border=1><tr>"); [Link]("<td><H2><font color=\"#FFD700\">"); [Link]("ESTE LUMINA IN CAMERA"); // digitalWrite(outputPin, HIGH); [Link]("</font></H2></td>"); [Link]("</tr></table>"); //delay(1); } [Link]("<H2>Ledul din incapere este:</H2>"); { if (strcmp(params, "?cmd=on") == 0 && analogRead(senzor)>=1000)
[Link]("<H2><font color=\"#00FF00\">APRINS</font></H2>"); digitalWrite(outputPin, LOW); [Link]("<a href='?cmd=off'><button style=width:100;height:30>TURN OFF</button></a>"); // [Link]("<h1><A HREF='?cmd=off'>Turn off</A></h1>"); // delay(1); } else { [Link]("<h2><font color=\"#FF0000\">STINS</font></h2>"); digitalWrite(outputPin, HIGH); // [Link]("<h1><A HREF='?cmd=on'>Turn on</A></h1>"); [Link]("<a href='?cmd=on'><button style=width:100;height:30>TURN ON</button></a>"); } [Link]("</center>"); [Link]("<h4>VALOARE SENZOR LUMINA: "); [Link](analogRead(senzor)); [Link]("<table bgcolor=#00FF00 border=1><tr>"); [Link]("<td>SENZOR LUMINA > 1000 : NU ESTE LUMINA<br></td></tr>"); [Link]("<tr><td>SENZOR LUMINA < 1000 : ESTE LUMINA</td>"); [Link]("</h4></table>"); [Link]("</body><hr>");
} }
[Link]();
##############################################################################
Echipa 5 : Studenti: 1. Corchez Victor 2. Musat Dragos 3. Dorobantu Razvan 4. Cojocaru Daniel Rezumat: Transmisii de date intre un PC si un SBC 876 cu ajutorul unui sistem transmiter/receiver RF Resurse materiale/timp: SBC 876, transmiter RF, receiver RF, USB(?) Aplicatia pe care vom incerca s-o implementam are la baza transmisia de date wireless intre doua sisteme. Pentru realizarea acestei idei sunt mai multe variante de implementare: WLAN, Bluetooth, GSM, GPS etc. Totusi aceste variante necesita un cost prea mare atat financiar cat si ca timp de implementare. Una din variantele de implementare ar fi cea care are la baza un router wireless la care se conecteaza dispozitivul de control pentru a da comenzi unui microcontroller.
Acesta putea la randul sau controla niste prize RF pentru a porni sau opri dispozitivele alimentate de la acestea. Desi un exemplu bun de automatizare a propriei locuinte este destul de costisitor si greu de implementat. exemplu: [Link]
O alta varianta ar fi aceea de a folosi semnale DTMF utilizate de telefoanele mobile. Decodificarea acestor semnale se realizeaza cu un circuit specializat MT8870, urmand ca acestea sa fie interpretate si trimise mai departe de catre microcontroller. Cel mai simplu mod de a realiza transmisia si receptia ar fi cu ajutorul unuia sau a mai multor telefoane mobile ca in cazul acestui proiect: [Link]
Totusi pentru o aplicatie finala ca cea de automatizare a locuintei utilizarea unui telefon mobil pentru fiecare dispozitiv de controlat ar fi imposibila. Ar exista desigur varianta utilizarii unui modul GSM specializat de interfatare cu microcontrollerul dar deobicei acestea au un cost foarte ridicat.
Din aceasta cauza am ales transmisia RF(radio frecventa) ca mod de punere in practica. Pentru a nu complica foarte mult proiectul am ales ca transmisia sa aiba loc doar intr-un singur sens intre un modul transmitator si un receptor. Modulul transmitator va fi legat la un PC(laptop) de la care va primi informatia ce trebuie transmisa.
RF Receiver Transmitter
RF
Pentru a face aplicatia cat mai versatila vom incerca o conexiune prin USB deoarce majoritatea calculatoarelor personale din ultima perioada au renuntat la clasica comunicatie prin interfata RS232. Acest lucru va fi facut de un convertor USB-RS232 (IC TUSB3410 sau FT232BL).
Informatia ajunsa astfel va fi transmisa mai departe de transmitator la un modul receptor. Acesta va prelua semnalul si il va pasa mai departe unui microcontroller (SBC876) care va intelege informatia si va afisa un mesaj pe un LCD sau va aprinde un LED.
Acest gen de aplicatie se poate extinde mai departe pentru orice fel de actuatori, senzori. Ca extensie aplicatia finala ar putea consta in realizarea unui sistem complet de automatizare a locuintei folosind un singur transmitator si mai multi receptori pentru fiecare obiect casnic ce poate fi controlat (aprinderea/stingerea luminii intr-o camera, pornirea/oprirea aerului conditionat, etc.) Corchez Victor : M-am ocupat de partea hard a transmisiei . Resurse folosite: 1 placuta MBED LPC 1768, transmitator RF HM-T 868S, 2 Micro Switch, 1 Bread-Board, fire de legatura. Pinul de data al modulului transmitator este legat la pinul 28 al placutei MBED care este pin de data seriala [Link] este legat la pinul VOUT(3.3V) al placutei MBED. Pinul ENABLE este legat la pinul 21 care este pinul de DIGITAL OUT. Transmisia: cele 2 butoane sunt legate la 2 pini de intrare DIGITAL IN, acestia fiind pinii 19 si 20.
La apasarea primului buton transmitatorul va trimite mesajul stanga. La apasarea celui de-al doilea buton se va trimite mesajul dreapta. Musat Dragos : M-am ocupat de partea de cod pentru transmisie : #include "mbed.h" #include "string.h" Serial pc(USBTX, USBRX); Serial rec(p28, p27); DigitalIn x(p20); DigitalIn y(p19); int main() { [Link](4800); char text1[7]={'s','t','a','n','g','a',' '}; char text2[7]={'d','r','e','a','p','t','a'}; while (1) { [Link]('x'); if (x==1) { for (int i=0; i<strlen(text1); i++) { [Link](text1[i]); wait_ms(10); } } if (y==1) { for (int i=0; i<strlen(text2); i++) { [Link](text2[i]); wait_ms(10); } } } } Cojocaru Daniel : M-am ocupat de partea hard a receptiei Resurse folosite: 1 placuta MBED LPC 1768, receptor RF HM-R 868S, LCD RC 1602D, 2 Micro Switch, 1 Bread-Board, fire de legatura. Pinul data al modulului receptor este legat la pinul 27 al celeilalte placute MBED. Pinul ENABLE este legat la pinul 21 care este pinul de DIGITAL OUT. Receptia: LCD-ul este legat la: pinul 10 RESET, pinul 12 ENABLE, iar pinii 17,18,19,20 reprezinta transmisia pe 4 biti DATA0-DATA3. VCC este legat la pinul VV(5V), pinul GND legat la masa, pinul Vo este legat printr-ul rezistor pull-down la masa, iar pinul Read-Write (R/W) la masa. Placuta receptoare va primi unul din cele 2 mesaje si il va afisa pe LCD. Dorobantu Razvan :
#include "mbed.h" #include "string.h" #include "TextLCD.h" TextLCD lcd(p10, p12, p17, p18, p19, p20); // rs, e, d0-d3 DigitalOut en(p21); Serial pc(USBTX, USBRX); Serial rec(p28, p27); int main() { [Link](4800); char x; en=1; int i=0; while (1) { while(i!=7){ x=[Link](); if((x!='x')&&(x=='s'||x=='t'||x=='a'||x=='n'||x=='g'||x=='d'||x=='r'||x=='e'||x=='p'||x==' ')) { [Link](i,0); [Link](x); i++; }} i=0; } }
Raport final
Resurse folosite: 2 placute MBED LPC 1768, transmitator RF HM-T 868S, receptor RF HM-R 868S, LCD RC 1602D, 2 Micro Switch, 2 Bread-Board, fire de legatura. Pinul de data al modulului transmitator este legat la pinul 28 al placutei MBED care este pin de data seriala TX. VCC este legat la pinul VOUT(3.3V) al placutei MBED. Pinul data al
modulului receptor este legat la pinul 27 al celeilalte placute MBED. Pinul ENABLE este legat la pinul 21 care este pinul de DIGITAL OUT.
Transmisia: cele 2 butoane sunt legate la 2 pini de intrare DIGITAL IN, acestia fiind pinii 19 si 20. Receptia: LCD-ul este legat la: pinul 10 RESET, pinul 12 ENABLE, iar pinii 17,18,19,20 reprezinta transmisia pe 4 biti DATA0-DATA3. VCC este legat la pinul VV(5V), pinul GND legat la masa, pinul Vo este legat printr-ul rezistor pull-down la masa, iar pinul Read-Write (R/W) la masa. La apasarea primului buton transmitatorul va trimite mesajul stanga. La apasarea celui de-al doilea buton se va trimite mesajul dreapta. Placuta receptoare va primi unul din cele 2 mesaje si il va afisa pe LCD.
Echipa 6 : Studenti: 1. Alexandru Gherghesanu 2. Radu-Victor Vadana 3. George-Adrian Ciolacu 4. Bogdan-George Tutu
Resurse materiale/timp: SBC876, MPLAB, C#, ASP, Serial Port Monitor Rezumat: Echipamentele din ziua de azi sunt mult prea complexe si oricat de mult s-ar stradui producatorii sa lanseze produse perfecte se pare ca nu prea reusesc. Toate aceste neajunsuri sunt remediate pe parcurs sub forma de update-uri. Aceste modificari sunt denumite in diverse moduri: service pack, update, firmware, etc. Camerele foto, camerele video, scannerele, imprimantele, mp3 playere, etc functioneaza pe baza unui mic program intern denumit firmware. Versiunea de firmware este de obicei specificata in meniul echipamentului sau in manualul de utilizare. Pe site-ul producatorului, in sectiunea Support sau Downloads se poate verifica daca a fost lansata vre-o versiunea mai recenta si daca versiunea recenta aduce un plus de calitate dorit de utilizator. Acum, majoritatea update-urilor de firmware se realizeaza on-line. Noi ne propunem sa realizam un proiect ce priveste reprogramarea sistemelor embedded remote, pe web, asemanator procedurii de firmware update. Proiectul va consta in o pagina web (server) ce va oferi fiecarui utilizator (client) posibilitatea de a rescrie memoria de program
(flash) a unui SBC876, conectat prin RS232 la server, cu propriile sale programe, ce au fost compilate in prealabil cu MPLAB. Un exemplu pentru aplicatia noastra, ca solutie alternativa, ar putea fi implementa pe platformele de dezvoltare de la Freescale RACE CHALLENGE dand posibilitatea participantilor sa programeze microcontrollerele de pe masini de acasa, prin internet cu conditia sa se inlocuiasca conexiunea USB cu PC-ul cu una wireless.
Explorare documentara asupra temei/raport sintetic solutii alternative n tehnologia informaiei, un server este un program de aplicaie care furnizeaz servicii altor aplicaii (numite aplicaii client), aflate pe acelai calculator sau pe calculatoare diferite. De obicei, aplicaia server ateapt conexiuni din partea aplicaiilor client. Se mai numete server i calculatorul pe care ruleaz una sau mai multe asemenea aplicaii. Deseori soluia pentru mari aplicaii cu muli utilizatori se bazeaz tocmai pe arhitectura client-server, care const din cel puin 2 aplicaii (i deseori cel puin 2 computere). Modelul client-server este o structur sau arhitectur aplicaie distribuit care partajeaz procesarea ntre furnizorii de servicii numii servere i elementele care solicit servicii, numite clieni. Clienii i serverele comunic printr-o reea de calculatoare, de obicei prin Internet, avnd suporturi hardware diferite, dar pot rula i pe acelai sistem fizic. Un server (fizic) ruleaz unul sau mai multe programe server, care partajeaz resursele existente cu clienii. Clientul nu partajeaz niciuna dintre resursele proprii, ci apeleaz la resursele serverului prin funciile server. Clienii iniiaz comunicaia cu serverele i ateapt mesajele acestora. Pentru meninerea legturii ntre cei doi, indiferent de pauzele care intervin, se folosete conceptul de sesiune, care de obicei este limitat n timp. O solutie ar putea fi implementarea pe o masina Linux a unui server web Apache cu o interfata web PHP dar aceasta varianta necesita cunostinte si experienta de care nu am avut parte pana acum iar PHP nu include suport nativ pentru comunicatii RS232 necesitand scrierea de la zero a bibliotecilor de comunicatii fapt ce nu este convenabil ca timp si nu garanteaza fiabilitatea aplicatiei. O alta solutie reprezinta platforma ASP de la Microsoft. [Link] este o tehnologie Microsoft pentru crearea de aplicaii si servicii web ce beneficiaz de puterea platformei de dezvoltare .NET si de setul de instrumente oferite de mediul de dezvoltarea al aplicatiei Visual Studio .NET. Cateva dintre avantajele ASP .NET sunt: - ASP .NET are un set larg de componente, bazate pe XML, oferind astfel un model de programare orientat obiect (OOP). - ASP .NET ruleaza cod compilat, ceea ce creste performantele aplictiei web. Codul sursa poate fi separat n dou fisiere, unul pentru codul executabil, iar un altul pentru continutul paginii (codul HTML si textul din pagina) . - .NET este compatibil cu peste 20 de limbaje diferite, cele mai utilizate fiind C# si Visual Basic
Alte motive pentru care vom opta pentru aceasta platforma sunt fiabilitatea, functionalitatea ridicata si suportul oferit de Microsoft, dovada fiind numeroasele companii multinationale care folosesc aceasta platforma pentru site-urile lor web, cum ar fi: Microchip, Atmel, etc. De asemnea, ASP fiind in acelasi framework cu C#, care in ultimele versiuni include suport nativ de comunicatii RS232 ne va permite scrierea aplicatiei in C# si integrarea ei intr-o pagina web server ASP mult mai facil decat in cazul folosirii combinatiei PHP-Apache din solutia anterioara.
Descrierea rezolvarii
O aplicatie ASP este formata din 2 parti: prima este partea de webservice -care va contine o metoda web(Webmethod) prin care se va realiza transmiterea HEX-ului pe seriala. A doua parte consta intr-un web application, care contine o referinta web catre webservice; aici se va incarca fisierul HEX. C# fiind un limbaj de nivel inalt, orientat obiect, permite instantierea in web application a clasei din webservice si implicit apelarea metodei web care realizeaza transmiterea HEX-ului pe seriala. Se poate face o analogie cu modelul client-server, aici webapplication-ul avand rolul clientului, iar webservice-ul fiind serverul. Pentru ca aplicatia sa functioneze ca intreg, webservice-ul trebuie sa fie pornit, deci sa se gaseasca la o anumita adresa, pe un anumit port.
Pagina ASP client va incarca cu FileUpload fisierul HEX trimitandu-l prin la server, serverul salvandu-l local intr-o zona temporara pe HDD. Serverul, la terminarea receptiei fisierului HEX va incep citirea lui cu StreamReader pentru a extrage datele ce urmeaza a fi transformate si trimise pe RS232 la PIC. Serverul va deschide un port serial cu un baud rate de 38400, 8 biti de date, 1 bit de stop si fara biti de paritate pe care se va realiza atat transmisia de date cat si hand-shaking-ul de confirmare sau validare a datelor. O bucla while va scrie in continuu cuvantul 0xEA la port, ascultand in acelasi timp portul cu un event handler ce verifica bufferul portului serial si initiaza citirea din el in momentul in care sunt date in el, asteptand de la PIC ca raspuns cuvantul 0xEB ce reprezinta o confirmare catre aplicatie ca poate incepe trimiterea datelor pe serial catre PIC. Datele din fisierul HEX sunt citite linie cu linie si transformate conform exemplului de pe pagina urmatoare apoi trimise pe portul serial, dupa fiecare linie aplicatia asteptand ca raspuns de la PIC cuvintele 0xE7 si 0xE4 ce reprezinta DATA_OK respectiv WRITE_OK ce confirma ca CRC-ul valideaza datele trimise si ca scrierea lor s-a efectuat cu success in memoria flash a microcontroller-ului. Numai la citirea lor aplicatia trimite o noua linie de date pe seriala, in caz contrar, aplicatia emite un mesaj de eroare atentionand utilizatorul. Cand aplicatia ajunge la sfarsitul fisierului trimite cuvantul 0xED anuntand PICul ca transmisia a luat sfarsit si asteapta primirea cuvantului 0xE4, PICul confirmand ca scrierea a fost facuta cu succes, aplicatia inchizand apoi portul si afisand un mesaj de succes sau de eroare in caz contrar.
Resetul remote a microcontroller-ului se va realiza printr-un buton aflat pe interfata grafica de pe pagina web client. Acest buton va manipula starea liniei de handshaking RTS (request to send) reprezentata prin pinul 7 de pe interfata RS232.
Hardware RESET
Pentru hardware reset am decis sa ne folosim de semnalul DTR sau RTS deoarece, pentru a transmite fisierul hex in memoria PIC-ului, sunt folosite doar semnalele RXD si TXD, restul fiind libere. Dupa cum puteti observa, exista in datasheet-ul circuitului integrat MAX232 mai multe posibilitati de a utiliza semnalele DTR(Data Terminal Ready) si RTS(Request To Send). Schemele de mai sus descriu utilizarea semnalului RTS. Deoarece am intalnit anumite probleme in functionarea integratului MAX232, am hotarat sa eliminam complet utilizarea acestuia pentru hardware reset si sa apelam la un simplu tranzistor npn care sa functioneze ca un intrerupator.
[Link]
Detalii de implementare
Conceptual, proiectarea functiei C# a urmarit urmatoarele aspecte: Conversia textului din fisierul HEX in date hex de tip byte Operatii pe byte de conversie a datelor din formatul Intel in formatul acceptat de bootloader Transformarea adreselor in adrese noi shiftate la stanga cu o pozitie Transformarea datelor din BIG ENDIAN in LITTLE ENDIAN Recalcularea CRC-ului Reordonarea campurilor Data, Address, Record Type, CRC, Data Byte Count
Serverul va deschide un port serial cu un baud rate de 38400, 8 biti de date, 1 bit de stop si fara biti de paritate pe care se va realiza atat transmisia de date cat si hand-shaking-ul de confirmare sau validare a datelor. O bucla while va scrie in continuu cuvantul 0xEA la port, ascultand in acelasi timp portul cu un event handler ce verifica bufferul portului serial si initiaza citirea din el in momentul in care sunt date in el, asteptand de la PIC ca raspuns cuvantul 0xEB ce reprezinta o confirmare catre aplicatie ca poate incepe trimiterea datelor pe serial catre PIC. Datele din fisierul HEX sunt citite linie cu linie si transformate conform exemplului de pe pagina urmatoare apoi trimise pe portul serial, dupa fiecare linie aplicatia asteptand ca raspuns de la PIC cuvintele 0xE7 si 0xE4 ce reprezinta DATA_OK respectiv WRITE_OK ce confirma ca CRC-ul valideaza datele trimise si ca scrierea lor s-a efectuat cu success in memoria flash a microcontroller-ului. Numai la citirea lor aplicatia trimite o noua linie de date pe seriala, in caz contrar, aplicatia emite un mesaj de eroare atentionand utilizatorul. Cand aplicatia ajunge la sfarsitul fisierului trimite cuvantul 0xED anuntand PICul ca transmisia a luat sfarsit si asteapta primirea cuvantului 0xE4, PICul confirmand ca scrierea a fost facuta cu succes, aplicatia inchizand apoi portul si afisand un mesaj de succes sau de eroare in caz contrar.
{ string str = [Link](); byte[] bytesToWrite = new byte[[Link] / 2]; byte[] strHex = HexStringToByteArray(str); if (strHex[3] != 0x01) { bytesToWrite[0] = 0xE3; byte addrH = strHex[1]; int addressH = addrH; byte addrL = strHex[2]; int addressL = addrL; int address = (addressH * 256 + addressL) / 2; addressH = address / 256; addressL = (address - (bytesToWrite[1] * 256)); bytesToWrite[1] = (byte)addressH; bytesToWrite[2] = (byte)addressL; bytesToWrite[3] = strHex[0]; int nrOfData = strHex[0]; byte CRC = 0x00; for (int i = 1; i < nrOfData; i = i + 2) { bytesToWrite[i + 4] = strHex[i + 4]; CRC += strHex[i + 4]; bytesToWrite[i + 5] = strHex[i + 3]; CRC += strHex[i + 3]; } bytesToWrite[4] = CRC; byte[] recHex2 = new byte[2]; [Link](bytesToWrite, 0, [Link]); [Link](); [Link](50); [Link](recHex2, 0, 2); while (recHex2[0] != 0xE7 || recHex2[1] != 0xE4) { [Link](bytesToWrite, 0, [Link]); [Link](50); [Link](recHex2, 0, 2); [Link] = "E7 E4 problem again!"; }
if (flag) { [Link](sendED, 0, 1); [Link](50); [Link](recHex, 0, 1); if (recGlobal[0] == 0xE4) { [Link](); [Link] = "WRITE OK!"; return; } else { [Link] = "final E4 problem"; return; } }
Rezultate experimentale
Dupa cum se poate vedea in aceasta captura a comunicatiei seriale dintre aplicatia noastra si bootloader-ul de pe pic, aplicatia functioneaza perfect. Funcionarea proiectului a fost demonstrat n cursul din sptmna 12, cnd s-a prezentat soluia implementat, cu secve de test.
public void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (![Link]) return; int bytes = [Link]; byte[] buff = new byte[bytes]; [Link](buff, 0, bytes); recGlobal = buff; }
Concluzii Am realizat un proiect destul de unic ce poate fi util atat in mediul academic cat si in mediul profesional/comercial intrucat operatiile de update de firmware pe platforme embedded sunt folosite de la telefoane mobile la automobile. Bibliografie
Rezultat:
(site-ul web de programare a PIC-ului ruland in browserul Opera)
Radu-Victor Vadana ASP Developer Descrierea solu iei Scopul final a fost realizarea unei aplicaii [Link] care s permit clientului programarea unui microcontroller, n acest caz folosindu-se PIC16F876 de pe o plac de dezvoltare SBC876, conectat la maina pe care ruleaz server-ul. Pentru a realiza aceasta, am folosit mediul de dezvoltare Visual Studio 2008, n care au fost dezvoltate programele pentru aplicaia web i service-ul web. Acestea sunt cele 2 componente ale unei aplicaii ASP. Folosind un limbaj orientatobiect(C#), s-a definit o clas pentru aplicaia web(client), ct i pentru service-ul web, fiecare cu funciile(metodele) i cmpurile necesare.
Detalii de implementare Conceptual, proiectarea aplicaiei ASP a urmrit aceste aspecte: Dezvoltarea programului pentru server Dezvoltarea programului pentru client Referenierea serverului n programul client n vederea efecturii Programul pentru server, n ASP, este cunoscut sub numele de service web(webservice). Acesta este implementat printr-o clas care conine toate funciile(metodele) pentru programarea microcontroller-ului, precum i resetarea acestuia.
Metodele care pot fi vizibile(apelabile) din exteriorul clasei au naintea definiiei atributul
[WebMethod]. [WebMethod] public void Reset()... [WebMethod] public string write()...
Service-ul web ruleaz la o anumit adres, pe un anumit port, folosind protocolul HTTP. Pentru testare, s-a folosit adresa localhost([Link]) i un port oarecare.
Odat pornit service-ul web, s-a afiat n browser-ul web la adresa specificat(:port) un mesaj de succes dac serviciul a fost pornit cu succes, sau eroare n caz contrar. Legat de aplicaia web, aceasta furnizeaz interfaa cu utilizatorul, precum i ncrcarea fiierului .hex pe server i este capabil s apeleze funciile(metodele) vizibile din exterior ale service-ul web. Pentru a realiza comunicarea cu aplicaia server, s-a introdus o referin web ctre aceasta, folosindu-se adresa, respectiv portul la care aceasta ruleaza. Dup ce am fcut acest pas, se poate spune c exist legtur ntre aplicaie i serviciul web.
WebApplication(Client)
public partial class _Default : [Link] { //Instanta clasei din programul server PIC_WebApplication.localhost.Service1 service; protected void Page_Load(object sender, EventArgs e) { service = new localhost.Service1(); } //Functia pentru incarcarea fisierului .hex pe server protected void btt_Upload_Click(object sender, EventArgs e) { String savePath = @"c:\temp\"; if ([Link]) { String fileName = [Link]; savePath += fileName; [Link](savePath); lbl_Status.Text =fileName+" was saved"; } else { lbl_Status.Text = "You did not specify a file to upload."; } } protected void btt_Write_Click(object sender, EventArgs e) { lbl_Status.Text = "Please press Reset in max 10s"; lbl_Status.Text=[Link](); } protected void btt_Reset_Click(object sender, EventArgs e) { [Link](); } }
Rezultate experimentale Lansarea n execuie a programului server pornete serviciul web la o anumit adres i un anumit port:
Lansarea n execuie a programului client va deschide o pagin web la adresa i portul serviciului web n care se va afla interfaa grafic a aplicaiei. Funcionarea proiectului a fost demonstrat n cursul din sptmna 12, cnd s-a prezentat soluia implementat, cu secve de test. Dificult i ntmpinate pe parcursul implementrii Dificulti la integrarea n aplicaie a funciilor pentru reset i scriere pe serial. ASP nu se comport ntocmai unei aplicaii care ruleaz pe o singur main, fapt care a necesitat o perioad suplimentar de studiu i unele compromisuri(ex. Sincronizare) Dificulti la pornirea programelor att pentru server, ct i pentru client datorit firewall-ului i antivirusului. S-a rezolvat prin reconfigurare i crearea unor reguli care s le permit accesul att server-ului, ct i client-ului.
Concluzii Abordarea problemei cu ASP a dus la ndeplinirea sarcinii propuse, adic realizarea unei aplicaii care s permit clientului programarea unui microcontroller. Pe parcursul etapei de implementare s-au ntmpinat cteva dificulti, dar care au fost depite n timp util, ajungndu-se la situaii de compromis Proiectul realizat, n ansamblu, poate fi adaptat pentru o gam larg de microcontrollere, considerndu-se o unealt util pentru mediul academic. Bibliografie 1. [Link] 2. Biblioteca MSDN [Link] aspx 3. Ioan Jurca- Programarea reelelor de calculatoare,Editura de Vest, 2001 4. Programarea retelelor de calculatoare 5. [Link]
George-Adrian Ciolacu - Electronics developer 1. In aplicatia noastra, userul trebuie sa aiba posibilitatea de a comanda reset hardware remote pentru ca hexul generat si trimis la server sa programeze PIC-ul. Acest lucru este necesar deoarece folosim utilitatea bootloader-ului prezent in microprocessor care, dupa reset hardware, incarca in memoria PIC-ului programul nou creat de utilizator.
2. Pentru hardware reset am decis sa ne folosim de semnalul RTS deoarece, pentru a transmite fisierul hex in memoria PIC-ului, sunt folosite doar semnalele RXD si TXD, restul fiind libere. Dupa cum se poate observa in schemele de mai sus, exista in datasheet-ul circuitului integrat MAX232 mai multe posibilitati de a utiliza semnalul RTS(Request To Send). Deoarece am intalnit anumite probleme in functionarea integratului MAX232, am hotarat sa eliminam complet utilizarea acestuia pentru hardware reset si sa apelam la un simplu tranzistor npn care sa functioneze ca un intrerupator.
Reducand dependentele de circuitele integrate care au o anumita rata de defectare si utilizand componente electronice discrete, crestem fiabilitatea sistemului si scadem probabilitatea de a avea glitch-uri hardware in modul de functionare a resetului. Trebuie avut in vedere ca imposibilitatea de a apela la reset remote, face aplicatia noastra sa fie inutilizabila. Hardware Handshaking 3. Aceast metod utilizeaz linii hardware. La fel ca liniile Tx si Rx, liniile RTS / CTS i DTR / DSR lucreaza impreuna. RTS/DTR sunt de ieire, iar celelalte (CTS/ DSR) sunt de intrare. Primul set de linii sunt RTS (Request To Send) i CTS (Clear To Send). Cnd un receptor este gata pentru date, el activeaza linia RTS indicnd c este gata s primeasc date. Acest lucru este citit de ctre expeditor la intrarea CTS, artnd c este liber pentru transmiterea datelor. Urmtorul set de linii sunt DTR (Data Terminal Ready) i DSR (Data Set Ready). Aceste linii sunt utilizate n principal pentru comunicatie modem. Acestea permit portului serial i modem sa comunice starea lor. De exemplu, atunci cnd modemul este pregtit pentru ca datele s fie trimise de pe PC, se va afirma la linia DTR care indic faptul c o conexiune a fost fcut n ntreaga linie de telefon. Acest lucru este citit n prin linia DSR i PC-ul poate ncepe trimiterea [Link] general de este ca liniile DTR / DSR sunt folosite pentru a indica faptul ca sistemul este pregtit pentru comunicare i liniile RTS / CTS sunt utilizate pentru pachete individuale de date.
Studiind nivelele tensiunilor de pe linia RTS am creat un grafic care explica modificarea valorilor in momentul activarii semnalului
Dupa cum se poate observa din figura, cand RTS nu este activat, ramane la un nivel de -12V reprezentand 0 logic, iar in momentul activarii semnalului Request To Send, acesta devine 1 logic avand o tensiune de +12V. Am decis sa utilizez tensiunea pozitiva, care evidentiaza activarea semnalului, pentru a deschide un tranzistor bipolar npn. In momentul deschiderii tranzistorului, colectorul sau, care este conectat la pinul 1(Master Reset) al PIC-ului intra in conductie directa cu emitorul tranzistorului care este conectat la masa sistemului. Semnalul RTS este colectat, prin doua diode inseriate, in baza tranzistorului. Au fost folosite doua diode inseriate pentru a forta tranzistorul sa functioneze in regim saturat-blocat, astfel simulandu-se functionarea sa ca un intrerupator comandat de semnalul de Handshake. Cum resetul microprocesorului este activ pe 0 logic, atunci cand este activ semnalul RTS se produce hardware reset.
[Link] experimentale, concluzii La finalizarea executiei montajului, am masurat nivelul tensiunii dupa prima dioda, rezultand, conform multimetrului, un voltaj de +6V, cand era setat 0 logic pe semnalul RTS. Deoarece am observat acest detaliu am decis sa adaug inca o dioda pentru a asigura functionarea tranzistorului in regim blocat-saturat. Astfel se explica de ce in schema sunt doua diode inseriate. Dupa montarea celei de a doua diode am masurat din nou nivelul tensiunii la nivelul 0 logic al liniei RTS si am constatat ca sunt 1,3V in baza tranzistorului, tensiune ce nu deschide jonctiunea Colector-Emitor. La nivelul 1 logic al semnalului RTS sunt aproximativ 12V in baza tranzistorului din care scadem de doua ori 0,7V, caracteristica specifica diodei. Concluzie: tranzistorul opereaza in regimul dorit iar functionarea resetului hardware este conforma cerintei proiectului. [Link]: [Link] [Link] - pagina 6 [Link]
Bogdan - George Tutu - Html developer 1. Descrierea problemei Scopul final a fost realizarea unei pagi web care sa aiba rolul de interfata cu utilizatorul. Acesta se conecteaza pe pagina si foloseste functiile implementate pentru a putea incarca fisierul .hex si a-l scrie pe placa de dezvoltare folosind butoanele de pe pagina.
3. Concluzii Pagina rezultata este una sugestiva, care poate fi folosita usor de utilizator cu succes pentru a efectua operatiile dorite. Bibliografie [Link] [Link] [Link]
Echipa 7: Studenti: 1. Adrian Gorgu 2. Marius Burdun 3. Valentin Grigorovici 4. Eduard Teodorescu 5. Luca Adi Rezumat: The Freescale Cup este o competitie in care participa echipe din mai multe tari: University of Technology of Brno; Brno, Czech Republic Czech Technical University; Prague, Czech Republic ENSEEIHT; Toulouse, France ESEO; Angers, France ESIEE; Paris, France University of Iasi; Iasi, Romania University of Applied Sciences; Deggendorf, Germany University of Applied Sciences; Landshut, Germany Politehica Bucharest; Bucharest, Romania Silesian University of Technology; Gliwice, Poland Slovak University of Technology: Bratislava, Slovak Republic Technical University of Ostrava; Ostrava, Czech Rebublic University of West Bohemia; Plzen, Czech Republic University of Technology; Wroclaw, Poland Zinela University; Zilena, Slovak Republic Fiecare echipa va trebuie sa contruiasca si sa programareze o masina cu care va concura pe un circuit. Cursa se va desfasura contra cronometru, prin urmare cea mai rapida masina care nu va iesi de pe pista, va castiga. Resurse materiale: Sasiul masinii O camera TSL1401RLF 1 128 linear sensor array Placa de dezvoltare care contine microcontrolerul MPC5604B (TRKMPC5604B) Placa pentru controlul motoarelor (MC33931) Un servo O baterie 7.2v Nicad Cablurile de conectare Perioada de predare: Finalele EMEA care sunt programate in Martie 2012. Ce vom implementa: Constructia masinii: Kitul pentru constructia masinii este aproximativ la fel pentru toate tarile participante, putand aparea minime diferente. Montarea placii de dezvoltare TRK- MPC5604B si a placii pentru controlul motoarelor MC33931 se face ca in figura:
Conectarea motoarelor pe placa MC33932 se poate realiza in 3 moduri: a) folosind ambele motoare, ele fiind actionate independent:
Dupa terminarea constructiei kitului urmeaza partea de programare a masinii. Alternative de componente specificate de Freescale : 1. Pentru detectarea liniei - camera video : Parallax TSL1401-DB [Link] vel/a/ProductID/566/[Link]
LinkSprite LS-Y201 [Link] Toshiba TCM8240MD RB-Spa-115 [Link] html CM-26N [Link] 2. Pentru controlul motorului Punte H : MC33931 sau MC33932 [Link] Alternativa de proiect in care se face procesarea video: O abordare asemanatoare celor de la Freescale, pe care se bazeaza proiectul meu de licenta, au facut-o un grup de stundeti pasionati de la MIT. Este vorba despre o sera intretinuta de un numar de sisteme mobile autonome. Mai multe detalii sunt oferite in aricolul urmator: [Link] Ce am realizat pana in prezent: Am atasat cateva poze cu stadiul in care se afla masina:
Detalii de Implementare Marius Burdun Asamblarea tuturor driverelor si functilor in cadrul proiectului respectiv initializarea clockului, a modului de operare a MCU (RUN0), initializarea semnalului de tact pentru periferice(modulul de timere EMIOS_0, ADC, LinFlex UART, etc), driverul de transmitere seriala a datelor, driverul pentru motorul servo, driverul pentru motoarele DC, driverul pentru achitia curentilor de feedback de la motoarele DC. Interpretarea datelor de pe camera - Functia de achizitie a datelor de la Camera necesita trimiterea unui tren de impulsuri catre camera si achizitia raspunsului camerei - cele 128 de valori analogice corespunzatoare celor 128 de fotodiode dispuse liniar. - Algoritmul de detectie a linie si controlul directiei pe baza datelor esantioanete de la camera. Ideea ce sta in spatele acestui algoritm e urmatoarea: in prima instanta datele sunt procesate si mapate pe baza mediei tuturor esantionelor primite de la camera, in a doua instanta se determina indecsii caracteristici liniei negre, iar in ultima instanta se calculeaza valorea aferenta pozitiei servo-motorului corespunzatoare pozitiei reale a liniei negre. Valentin Grigorovici Driverul de transmitere pe seriala a datelor Trebuie mentionat faptul ca a necesitat un update de firmware pentru placa TRK MPC5604B pentru compatibilitatea driverelor. De asemenea instalarea driverelor si a aplicatiilor Serial Virtual Ports pentru maparea porturilor seriale virtuale, Serial Redirector pentru redirectarea traficului serial catre porturile virtuale si Terminal Utility pentru preluarea in ultima instanta a datelor de pe portul serial virtual.
La nivelul aplicatiei ce ruleaza pe MCU driverul de transmitere serial include configurarea modului LinFlex UART, functiile de conversie ASCI HEX - Uint8 si Uint8 ASCI HEX si functiile de transmisie a datelor pe UART. Adrian Gorgu Configurarea compilatorului si a mediului de lucru CodeWarrior lucrul cu memoria Flash si memoria RAM si driverele necesare debug-ului si flash-urii placii TRK MPC5604B Driverul pentru motorul Servo functiile de configurarea a portului si a pinilor de control a servo-motorului, functia de calibrare (pozitia centrala, stanga, dreapta) Partea Tehnica Asamblarea sasiului si conectatea tuturor componentelor fizice Edi Teodorescu Driverul pentru motoarele DC functile de configurarea a portului si a pinilor de control a motoarelor DC, functiile de control a motoarelor MOTORS_Enable, MOTORS_Disable si MOTORS_UPDATE. Adi Luca Driverul pentru curentii de feedback de la motoarele DC functiile de configurarea a modulului ADC si a pinilor de achizitie, functile de achizitie a curentilor de feedback LEFT_MOTOR si RIGHT_MOTOR.
Un sample din cod: void initADC(void) { //[Link].R = 0x20020000; [Link].R = 0x00000000; [Link][0].R = 0x00000007; [Link][0].R = 0x00008606; } void initEMIOS_0(void) { EMIOS_0.[Link]= 63; 1MHz eMIOS clk*/ EMIOS_0.[Link] = 1; EMIOS_0.[Link] = 1; EMIOS_0.[Link] = 1; mode */ } /*Init function - PWM SERVO MOTOR*/ void initEMIOS_0ch13(void) { Modulation*/
/* Initialize ADC scan mode*/ /* Initialize ADC one shot mode*/ /* Select ANP1:2 inputs for normal conversion */ /* Conversion times for 32MHz ADClock */
/* Divide 64 MHz sysclk by 63+1 = 64 for /* Enable eMIOS clock */ /* Enable global time base */ /* Enable stopping channels when in debug
EMIOS_0.CH[13].CADR.R = 0; /* Leading edge when channel counter bus=0*/ EMIOS_0.CH[13].CBDR.R = 1500; /* Trailing edge when channel counter bus=1400 Middle, 1650 Right Max, 1150 Left Max*/ EMIOS_0.CH[13].[Link] = 0x01; /* Use counter bus C */ EMIOS_0.CH[13].[Link] = 1; /* Polarity-leading edge sets output */ EMIOS_0.CH[13].[Link] = 0x60; /* Mode is OPWM Buffered */ [Link][45].R = 0x0600; /* MPC56xxS: Assign EMIOS_0 ch 13 to pad */ }
/*Init function - PWM for MOTOR LEFT*/ void initEMIOS_0ch6(void) { Modulation*/ EMIOS_0.CH[6].CADR.R = 500; EMIOS_0.CH[6].CBDR.R = 850; EMIOS_0.CH[6].[Link] = 0x0; EMIOS_0.CH[6].[Link] = 1; EMIOS_0.CH[6].[Link] = 0x60; [Link][30].R = 0x0600; } /*Init function - PWM for MOTOR RIGHT*/ void initEMIOS_0ch7(void) { Modulation*/ EMIOS_0.CH[7].CADR.R = 0; EMIOS_0.CH[7].CBDR.R = 350; EMIOS_0.CH[7].[Link] = 0x0; EMIOS_0.CH[7].[Link] = 1; EMIOS_0.CH[7].[Link] = 0x60; [Link][31].R = 0x0600; }
/* EMIOS 0 CH 6: Output Pulse Width /* Leading edge when channel counter bus=0*/ /* Trailing edge when channel counter bus=500*/ /* Use counter bus A (default) */ /* Polarity-leading edge sets output */ /* Mode is OPWM Buffered */ /* MPC56xxS: Assign EMIOS_0 ch 6 to pad */
/* EMIOS 0 CH 7: Output Pulse Width /* Leading edge when channel counter bus=0*/ /* Trailing edge when channel's counter bus=999*/ /* Use counter bus A (default) */ /* Polarity-leading edge sets output*/ /* Mode is OPWM Buffered */ /* MPC56xxS: Assign EMIOS_0 ch 7 to pad */
void CAMERA(void) { uint8_t i; uint8_t j; [Link][27].R = 0x0200; output*/ [Link][29].R = 0x0200; [Link][27].R = 0x0200; output*/
/* Program the Sensor read start pin as /* Program the Sensor Clock pin as output*/ /* Program the Sensor read start pin as
[Link][29].R = 0x0200; /* Program the Sensor Clock pin as output*/ [Link][0].R &= ~0x00000014; /* All port line low */ [Link][0].R |= 0x00000010; /* Sensor read start High */ Delay(); [Link][0].R |= 0x00000004; /* Sensor Clock High */ Delay(); [Link][0].R &= ~0x00000010; /* Sensor read start Low */ Delay(); [Link][0].R &= ~0x00000004; /* Sensor Clock Low */ Delay(); for (i=0;i<128;i++) { Delay(); [Link][0].R |= 0x00000004; /* Sensor Clock High */ [Link]=1; /* Trigger normal conversions for ADC0 */ while ([Link] == 1) {}; adcdata = [Link][0].[Link]; Delay(); [Link][0].R &= ~0x00000004; /* Sensor Clock Low */ Result[i] = (uint8_t)(adcdata >> 2); /*Delay();*/ if(i>0 && i<127) { STATE_MACHINE(Result[i-1],Result[i],i-1,i); } } Delaycamera(); } printSerialUint8All(); }
void SERVO_UPDATE(uint32_t val) { [Link][2].R &= 0x0b000000; EMIOS_0.CH[13].CBDR.R = val; [Link][2].R |= 0x04000000; }
Rezultatele obtinute Prin implementarea algoritmului de interpretare a datelor achizionate de la camera, masina urmareste cu succes linia neagra de pe traseul din laborator. In acest algoritmul functioneaza pentru viteza mica si constanta, asta datorita interferentelor care apar datorita motoarelor DC, fapt care bruiaza semnalul ce se doreste a se achizitiona de la camera. De asemenea am observat ca lumina ambientala are o importanta foarte mare,prin urmare ne gandim sa-i micsoram influenta prin amplasarea unor leduri care sa ilumineze pista dar si prin evaluarea datelor de la senzorul de lumina ambientala amplasat pe placa. Video: [Link] [Link]
[Link] 8: 1. Fascian Artiom 2. Andronache Alexandru [Link]: Comunicatia intre Pc si un system embedded prin conexiunea USB, unde sistemul embedded va indeplini functia unui mouse, acest lucru realizat prin intermediul protocolului HID. Resurse materiale: system embedded STM32f407VGT6 cablu mini-USB pentru alimentare cablu micro-USB pentru comunicatii I/O [Link] de solutie: La diferite nivele, gasim diferite solutii. Alternative pentru soluia de comunicare la nivel fizic ar putea fi renumitul RS232 n loc de USB. Dintre plusuri putem remarca simplitatea cu care acesta lucreaza i resursele implicate. Din pri negative se evideniaz viteza redus de transfer, consumul, lungimea traseului. Alt tip de comunicare se poate face prin portul parallel. De i acesta nu este standartizat, fiecare productor implementnd standartele sale, poate fi enumerat ca alternativ. Dezavantajele lui fiind aceleai ca i la serial adugnduse numrul mare de pini i cu diferena de transfer al vitezei, care ajunge de pn la 25 ori mai mare de ct cea serial. Pe nivel logic, ca alternativ
HID-ului nu poate fi o soluie total. Parial poate fi implementat alternative pentru mouse i keyboard portul PS/2 cu logica sa care sun similar cu logica din USB. Resurse folosite: STM32F407VGT6 microcontroler ,32-bit ARM Cortex-M4F core,1MB Flash, 192 KBRAM, LQFP100 package; ST-LINK/V2 incorporat cu selectie a modului de lucru(are optiunea de a fi folosit doar ST-LINK/V2);
4. Descriere: Dezvolatea proiectului sa pornit de la niste idei despre o comunicatie prin USB cum ar fi HID. Initial, a fost gindit ca prin acest protocol sa transmitem orice date folosindune de acest protocol. Adincindune in tematica, am inceput a intelege ca lucrurile nu stau chiar asa. HID se descifreaza ca Human Interface Device adica un dispozitiv de interactiune cu omul, ceea ce si sa observat citind literaturile la tematica asta ca orice comunicatie isi are clasa sa. Transmiterea de date, asa cum a fost gindit initial, prin HID nu se putea. Aceasta procedura era mai mult aferenta comunicatiei USB de cit comunicatiei prin HID. Pentru a transmite o data generica, se foloseste o clasa generica, adica in cazul acesta ideea originala decadea. Destinatia HIDului era de interactiune, mai concret vorbind de implementare a comunicatii cu PC-ul a mousului, tastaturii. Pentru aceste 2 dispozitive avem dedicate descriptori in clasa HID. Avind la dispozitie o placa de dezvolatare care are pe ea posibilitatea de a conecta USB-ul, a fost o simpla
alegere: ce facem, tastatura sau mouse? Tastatura implica foarte multe periferice pe cind mousul putea fi controlat prin accelerometru de pe placa. De aici sa si pornit ideea de implementare a unui mouse. Aceasta va acoperea comunicatia pe care am dorit-o si ne va da si un pic de experienta referitor la comunicatia prin USB. Obiectivele care leam urmarit au fost urmatoarele: Implementarea citirii de pe accelerometru Implementarea a unui feedback pentru a intelege daca lucreaza sau nu accelerometrul Conexiunea cu PC-ul prin USB Comunicarea dintre placa si PC schimbit descriptorii de mesaj in special implementarea descriptorilor pentru HID Legatura dintre accelerometru-hid-pc Placa cu care ne-am pornit sa dezvoltam aplicatia, ne punea la indemana biblioteci gata implementate pentru conexiunea USB si initializarea Accelerometrului. CMSIS este biblioteca pentru conexiunele low-level de la ARM. Cei de la STMictroelectronics au o serie de exemple si aplicatii pentru microcontrollerul STM32, cum ar fi USB-ul. Protocolul USB pentru comunicatie transmite niste descriptori: 1. Device descriptor 2. Configuration descriptor 3. Interface descriptor 4. HID descriptor 5. End point descriptor 6. Interface HID report descriptor Pentru noi partea complicate a fost constructia acestor descriptori. Fiecare descriptor este compus din citeva campuri. Spre exemplu: bLength, bDescriptorType, bDeviceClass, bDeviceSubClass, bDeviceProtocol, bMaxPacketSize0 etc. Acesti descriptori ne comunica despre lungimea paketului care va veni, Classa, Subclasa si multe alte detalii. [Link] de test :
int main(void) { RCC_ClocksTypeDef RCC_Clocks; STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); /* SysTick end of count event each 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); TIM4_Config(); /* USB configuration */ USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, /* MEMS (accelerometer) configuration */ &USR_desc, &USBD_HID_cb, &USR_cb);
LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_XYZ_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate= 3/100 = 30ms */ Delay(30); EnterCondition = 0x01; /* MEMS High Pass Filter configuration */ LIS302DL_FilterStruct.HighPassFilter_Data_Selection = LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER; LIS302DL_FilterStruct.HighPassFilter_CutOff_Frequency = LIS302DL_HIGHPASSFILTER_LEVEL_1; LIS302DL_FilterStruct.HighPassFilter_Interrupt = LIS302DL_HIGHPASSFILTERINTERRUPT_1_2; LIS302DL_FilterConfig(&LIS302DL_FilterStruct); while(1) { LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); X_Offset = Buffer[0]; Y_Offset = Buffer[2]; Z_Offset = Buffer[4];
} }
Secventa de test din exemplul dat, configureaza perifericele si citeste datele accelerometrului in continuu, aceste date vor fi folosite pentru a schimba pozitia mouse-ului pe ecran. Buttonul albastru de pe placa este configurat ca fiind Left Click al unui mouse. Un lucru interesant este initializarea accelerometrului care mai contine si o initializare a unui filtru pentru a curata semnalul de frecvente parazite. Partea importanta, care face legatura sunt intreruperile. Intreruperele se folosesc pentru a creea PWM pentru afisarea LED-urilor pe placa. LED-urile se aprind in dependenta de ce valori arata accelerometru. Daca, spre exemplu, dreapta este o valoare ridicata, frecventa PWM-ului creste, astfel ajungind la valori inalte o frecventa imposibil de detectat cu ochiul liber. Alta intrerupere se utilizeaza pentru transmiterea datelor prin HID, care sunt descrie in descriptorul END POINT transmis de acesta la initializarea conexiunii. Aceasta este o intrerupere la 10 uS ce transmite un mesaj de forma: primul octet contine informatia despre click dreapta,stinga,mijloc(mousuri antice) urmatorii 2 octeti transmit pozitia cu care cursorul trebuie sa se miste(offsetul) care este situate intre -127 si 127 pe X si Y. ultimul, al 4-lea octet raspunde pentru scroll. Acesta isi are valorile situate ca si la pozitionare intre -127 si 127. Mai jos este prezentat o rutina de intrerupere pentru partea de test: Intreruperea la fiecare 10uS
void SysTick_Handler(void) { uint8_t *buf;
uint8_t temp1, temp2 = 0x00; if (EnterCondition == 0x00) { TimingDelay_Decrement(); } else { buf = USBD_HID_GetPos(); if((buf[1] != 0) ||(buf[2] != 0)) { USBD_HID_SendReport (&USB_OTG_dev, buf, 4); } Counter ++; if (Counter == 10) { Buffer[2] = 0; /* Disable All TIM4 Capture Compare Channels */ TIM_CCxCmd(TIM4, TIM_Channel_1, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_2, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_3, DISABLE); TIM_CCxCmd(TIM4, TIM_Channel_4, DISABLE); LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); /* Remove the offsets values from data */ Buffer[0] -= X_Offset; Buffer[2] -= Y_Offset; /* Update autoreload and capture compare registers value*/ temp1 = ABS((int8_t)(Buffer[0])); temp2 = ABS((int8_t)(Buffer[2])); TempAcceleration = MAX(temp1, temp2); if(TempAcceleration != 0) { if ((int8_t)Buffer[0] < -2) { /* Enable TIM4 Capture Compare Channel 4 */ TIM_CCxCmd(TIM4, TIM_Channel_4, ENABLE); /* Sets the TIM4 Capture Compare4 Register value */ TIM_SetCompare4(TIM4, TIM_CCR/TempAcceleration); } if ((int8_t)Buffer[0] > 2) { /* Enable TIM4 Capture Compare Channel 2 */ TIM_CCxCmd(TIM4, TIM_Channel_2, ENABLE); /* Sets the TIM4 Capture Compare2 Register value */ TIM_SetCompare2(TIM4, TIM_CCR/TempAcceleration); } if ((int8_t)Buffer[2] > 2) { /* Enable TIM4 Capture Compare Channel 1 */
TIM_CCxCmd(TIM4, TIM_Channel_1, ENABLE); /* Sets the TIM4 Capture Compare1 Register value */ TIM_SetCompare1(TIM4, TIM_CCR/TempAcceleration); } if ((int8_t)Buffer[2] < -2) { /* Enable TIM4 Capture Compare Channel 3 */ TIM_CCxCmd(TIM4, TIM_Channel_3, ENABLE); /* Sets the TIM4 Capture Compare3 Register value */ TIM_SetCompare3(TIM4, TIM_CCR/TempAcceleration); } /* Time base configuration */ TIM_SetAutoreload(TIM4, TIM_ARR/TempAcceleration); } Counter = 0x00; } } }
/* LEFT Direction */ if(((int8_t)Buffer[2]) < -2) { HID_Buffer[1] += TempAcceleration;//CURSOR_STEP; } /* RIGHT Direction */ if(((int8_t)Buffer[2]) > 2) { HID_Buffer[1] -= TempAcceleration;//CURSOR_STEP; } /* UP Direction */ if(((int8_t)Buffer[0]) < -2) { HID_Buffer[2] += TempAcceleration;//CURSOR_STEP; } /* DOWN Direction */ if(((int8_t)Buffer[0]) > 2) { HID_Buffer[2] -= TempAcceleration;//CURSOR_STEP; }
return HID_Buffer; }
[Link] independente Fascian Artiom Taskurile care mi-au revenit mie: Lucru cu bibliotecile USB si HID; Configurarea pentru lucrul cu PC-ul. Placa folosita in proiectul nostru - STM32 Discovery, cu un mcu tip STM32F4, contine implementat la nivel hardware support USB. Un mare avantaj care mia permis sa pot face lucrul meu a fost librariile gata implementate de catre cei de la STMicroelectronics. Librarii precum USB2GO device. Partea complicata a fost intelegerea cum face conexiunea un USB host si un USB device, cine initializeaza si cine ce transmite. Un USB device la initializare, pentru a fi inteles, comunica prin descriptori. Descriptorii ne dau informatia de baza, cine e cel care sa conectat, ce data se asteapta de la el, etc. Eu mam ocupat de scrierea si testarea acestor configurari. Utilitarul care lam folosit pentru a creea aceste configuratii este un sniffer USBlyzer. Cu acest utilitar am observat ce device-uri deja existente, transmit catre PC. Apoi a urmat partea de implementare a clasei HID, care este o extensie a protocolului USB. Hid-ul are la rindul sau are un descriptor important - Interface Report Descriptor, care este o explicatie a datelor care vor veni. Acest descriptor a fost creeat cu un utilitar de pe [Link]. El contine majoritatea device-urilor din clasa hid si poate genera pentru ele descriptorii de interfata. Legatura dintre HID si USB mi-a fost inteleasa dupa vizitarea forumurilor cu aceasta tematica. Este un lucru destul de complicat - implica folosirea functiilor tip callback care trebuie sa aiba un standart anumit si des poti omite vre un detaliu. Mult timp a fost alocat testarii. De multe ori omiteam vreun camp din descriptori care ducea direct la errori. Debugul pentru HID era simplu pentru ca se observa unde este erroarea. Utilitarul USBlyzer are descrise toate campurile si intelege cam cum ar trebui sa arate un USB device. O alta facilitate a fost prezenta portului MicroUSB pe placa. Acest proiect mia placut pentru a stimulat studentul cu unelte reale sa implementeze idei. Partea teoretica trecuta in relitate este cea mai buna experienta pe care o poti capata. Lucrul in echipa a fost si asta o experienta, sa poti lucra cu altcineva. Partea care nu nea reusit a fost desincronizarea ideilor de la inceput si rezultatul. Urma colegul sa se apuce de partea de USB si HID si am ajuns eu sa o configurez. Din cauza unor necunoasteri am propus la inceput o ideie pe cind a iesit cu totul alta. Andronache Alexandru Petru Taskurile care mi-au revenit mie: setarea si interfatarea accelerometrului; setarea LED-urilor folosind semnal PWM; functia de testare(main) Placa care o avem dispune de o serie de biblioteci care le putem folosi pentru setarea diferitelor periferice. Folosid biblioteca stm32f4_discovery_lis302dl.h dedicata petru configurarea accelormetrului l-am setat pe mod activ cu output la 100ms pentru toate cele 3 axe, care va fi
stocat intr-un [Link] alte exemple care folosesc accelerometru am observat ca este necesar de 10ms pentru ca fiecare axa sa se initializeze. Pentru a evita date eronate am introdus si un filtru de output astfel incat sa nu fie offseturi. Configurarea LED-urilor am realizat-o folosind biblioteca stm32f4xx_gpio.h, prin intermediul careia am conectat sursa celor patru LED-uri la un PWM generat de un timer. PWM generat depinde de valorile citete de la accelerometru ceea ce va determina aprinderea ledurilor in conformitate cu directia in care este miscata placa, cu cat este inclinata placa mai tare cu atat frecventa cu care se aprind ledurile vafi mai mare. La scrierea functiei main a trebuit sa introduc o intrerupere la fiecare 100ms din clock-ul sistemului pentru a face posibila comunicatia prin USB. Concluzie:In final noi am reusit sa facem un device plug and play folosind protocolul hid, chiar daca fiecare a avut partea lui de munca, am avut totusi in vedere ca odata ce punem totul cap la cap aplicatia sa mearga. 7. Bibliografie - [Link]
- [Link]
Echipa 9: Studenti: 1. Gaina Raluca(comunicatia usart) 2. Nastuta Sorina( controlul motoarelor) 3. Tanasa Irina (comunicatia client-server) Rezumat: Comandarea unui SBC876 prin internet (PC) folosind transmiterea si receptia datelor prin wireless. Resurse materiale/timp: doua sisteme de dezvoltare SBC867, seriala RS232, tramsmitator si reciver pentru comunicatia wireless Faza initiala
Pentru parte hardware a robotului mobil am optat pentru platforma SBC876 (PIC 16f876) deoarece in primul rand detinem aceasta platforma iar costurile pentru a construi alta placa folosind microcontollere prezentate ca alternative s-ar ridica destul de mult. In al doilea rand pentru usurinta programarii pentru ca am mai lucrat cu el iar intelegerea unui microcontroller inseamna sa o iei de la baza iar timpul pentru realizarea acestui proiect nu ne permite. Schema robotului mobil se afla in fig.1 :
Fig. 1 Ca alternative pentru aceasta parte putem folosi alte microcontrollere cum ar fi: ATmega128 [Link] ATmega328 : [Link] dsPIC33 : [Link] SI/Lab/Lab9/[Link] Tot in acesta parte am decis sa folosim pentru mobilitatea robotului motoare in curent continuu avand ca alternative motoarele pas cu pas si servomotoarele din aceleasi motive pentru care am ales platform SBC 876. In standardul RS232 datele sunt transmise sub forma de pachete pe 11 biti din care 8 biti sunt folositi pentru date. Deoarece pentru proiectul nostru avem nevoie doar de 2 biti de date vom folosi 2 biti din cei mai semnificativi biti. (exemplu prezentat in fig. 2)
Fig.2 O alternativa ar fi folosirea comunicatiilor fara fir: undele radio, microundele si undele infrarosii. Pentru a alege cea mai bun alternativa trebuie stiut faptul ca frecventa semnalului transmis trebuie sa fie cat mai mica pentru ca semnalul sa nu fie distorsionat la receptie. De asemenea frecventa latimii de banda (bandwidth ) trebuie sa fie mare pentru ca semnalul receptionat sa aiba o forma cat mai apropiata de cel care a fost transmis. Cea mai mica frecventa a semnalului transmis o au undele radio (104 - 108) ,urmata de cea a microundelor (108 1011) si a undelor infrarosii (1011 1014) => cea mai buna comunicatie fara fir ar fi prin intermediul undelor radio.( vezi Fig. 3) si aceasta ar fi solutia noastra pentru comunicatia wireless
Fig. 3 Pentru comandarea prin internet a robotului mobil vom implementa o aplicatie client server. Acest tip de aplicatie clientul este orice sistem sau proces care poate cere i primi date, servicii sau acces la alte sisteme prevzute de server, iar serverul este orice sistem sau proces cere prevede date, servicii sau acces la alte sisteme pentru client, n cele mai multe cazuri la mai muli clieni simultan (ca resurse partajate). Simpla definiie a tehnologiei client / server este
c aplicaia server accept cererile la date de la client i i le returneaz. Clientul manipuleaz datele i prezint rezultatele la utilizator sau, acioneaz ca un server (sau agent), trimite rezultatele la client (server) care le-a cerut. Tehnologia client / server se bazeaz pe faptul c ea folosete un calculator desktop programabil pentru a efectua cea mai mare parte a procesrii aplicaiei. n tehnologia client / server, desktop-ul obine informaia de la alt calculator n configuraia master/slave. Chiar dac partea hardware n client/server e important, trebuie s ne focusm asupra tehnologiei ce d posibilitatea existenei ei, i anume a prii software.
Comunicatia intre client si server se va face prin intermediul unui site web(web service) ce va putea fi accesata de pe orice dispozitiv cu acces la un serviciu de internet. Pentru a dezvolta acest site putem folosi unul din urmatoarele limbaje de programare: [Link] [Link] PHP [Link] JAVASCRIPT [Link] Desi limbajul de programare PHP este atat stabil cat si un software open source si poate rula pe mai multe platforme, [Link] inglobeaza avantajele tehnologiei .NET, printre care si clasele gata implementate pentru porturi din biblioteca [Link] , faptul ca isi revine automat dupa erori astfel incat web site-ul ramane mereu accesibil, pentru implementarea aplicatiei am ales sa il folosim pe acesta din urma.
Comunicarea intre client si robotul mobil se face prin intermediul unui server. Acesta din urma simuleaza de fapt un terminal de comunicatie. Pentru crearea clientului si a serverului am folosit tehnologia [Link] deoarece are multe avantaje, atat pentru programator cat si pentru utilizatorul final. Doua aspecte fac [Link] mai rapid: codul compilat si cacheing-ul. Caching-ul presupune stocarea informatiei care va fi refolosita intr-o locatie a memoriei pentru un acces mai rapid mai tarziu. [Link] permite programatorilor sa seteze pagini sau doar zone din pagini care sunt de obicei refolosite sa fie pastrate in memoria tampon (cache) o perioada de timp pentru a imbunatati performanta aplicatiilor web. [Link] a fost testat si a reiesit ca este de 10 ori mai rapid decat tehnologia competitoare de la JAVA, J2EE. Un alt avantaj important al ASP-ul este acela ca isi revine automat dupa erori astfel incat web site-ul ramane mereu accesibil. De asemenea trebuie mentionat faptul ca .NET-ul este compatibil cu peste 20 de limbaje diferite, inclusiv cu cel folosit de noi, adica C#. Conexiunea intre server si client se face cu ajutorul socketurilor pentru transmiterea pachetelor de date. In Fig. 4 am prezentat aplicatia server, care poate executa orica tip de prelucrare asupra portului,cum ar fi: verificarea daca au mai fost adaugate porturi sau au fost dezactivate porturile existente, updatarea numelor porturilor, setarea portului in functie de optiunile dorite pentru baud rate, paritate, numarul de biti care vor fi transmisi, numarul de biti de stop si desigur deschiderea si inchiderea portului respectiv. Pentru a efectua aceste operatii am folosit functii si obiecte din biblioteca [Link] . Fig.4 Aplicatia Server Aplicatia Client este prezentata in Fig. 5 si consta in transmiterea unui numar in functie de directia aleasa: 1 inainte, 2-stanga, 3 dreapta, 4 stop. Fig. 5 Aplicatia Client Dupa ce a fost transmisa miscarea pe care robotul sa o indeplineasca, microcontrollerul va comanda motoarele astfel incat sa coincida cu alegerea facuta de client. Mai jos am prezentat pseudocodul pentru realizarea sincronizarii intre miscarea aleasa de client si robotul mobil. if ( optiune= =1){//optiunea aleasa de client Motor_s=0; //motoarele sunt comandate cu 0 logic Motor_d=0; //Motor_s, Motor_d motor stanga, motor dreapta } else if (optiune= =2){//stanga Motor_s=1; Motor_d=0 ; } else if (optiune= =3){//dreapta Motor_s=0; Motor_d=1; } else if (optiune==4){//stop Motor_s=1; Motor_d=1; }
1. Rezumat: Sistem de tip text-to-speech (text transformat in vorbire) comandat prin internet. Prin intermediul unui client web, utilizatorul se poate conecta la un server web (embedded sau PC) care la randul sau comunica prin interfata seriala cu placa de dezvoltare bazata pe microcontroller cu arhitectura ARM CortexM4. In clientul web, se tasteaza o serie de cuvinte (va exista un set de cuvinte prestabilite ce vor putea fi introduse), iar aceste cuvinte vor fi rostite de aplicatia embedded, la un difuzor. (cuvintele vorbite sunt inregistrate in format .wav pe un card SD, de unde sunt citite de aplicatie). Se va utiliza in acest scop convertorul digital-analogic pe 12 biti incorporat al microcontrollerului. Resurse materiale/timp: placa de dezvoltare STM32F DISCOVERY difuzor conexiune seriala RS232 card Flash SD pentru stocarea cuvintelor server Web PC pentru comunicatia cu placa de dezvoltare Resurse de timp: 35-40 ore Text to speech - project [Link] generala a aplicatiei: Scopul proiectului este realizarea unei aplicatii care permite transformarea unor cuvinte scrise la un terminal, in sunete. Acest lucru este util in primul rand in ajutorarea persoanelor cu dizabilitati in vorbire, pentru a se integra mai usor in societate, cat si in inregistrarea mesajelor vorbite de catre persoane care nu doresc sa-si dezvaluie identitatea. de asemenea, persoanele nevazatoare pot beneficia de aplicatia "text-to-speech" prin aceea ca textul unor carti poate fi incarcat intr-un fisier, care, ulterior, este convertit in vorbire. Alta aplicatie se regaseste in domeniul automotive (automobile care comunica cu utilizatorul), cat si in telefonia mobila (rostirea mesajelor text). Alternative implementare solutie: In prezentarea solutiilor alternative, pentru claritate, vom privi aplicatia din doua perspective: - comunicatia (server si card de date) - transmiterea semnalului audio pe difuzor
1. COMUNICATIA 1.1 Comunicatia cu clientul, prin intermediul serverului a). Server - embedded, Client - web-browser O posibilitate de interfatare a sistemului incorporat care comanda aplicatia audio este folosirea unui server web embedded. Acesta ar putea fi realizat cu microcontroller AVR ([Link] sau PIC ([Link] . Serverul web ar comunica prin interfata seriala (RS-232) cu sistemul incorporat, si prin Ethernet, cu clientul. Clientul introduce cuvintele intr-un browser web, iar browserul comunica serverului aceste date. b). Server si client PC, aplicatii JAVA sau C# Pot fi realizate doua aplicatii intr-unul din limbajele de programare (JAVA sau C#) care sa ruleze, una sub forma de client, cealalta sub forma de server, pe PC-uri diferite. Avantajul acestor limbaje consta in faptul ca implementeaza biblioteci specializate in comunicatia seriala (RS232) cat si in servicii web. 1.2 Interfatarea cu mediul de stocare a informatiilor Datele (fisierele .wav sau .mp3 din care vor fi ulterior redate sunetele) trebuie sa se gaseasca pe medii nevolatile. a). Memorii FLASH b). Memorii EEPROM: "electrically erasable programmable read-only memory". Spre deosebire de memoria flash, este tears i programat la nivel de bit, ceea ce o face mai lent. Ca interfatare, cele mai des folosite protocoale sunt cele seriale (SPI, I2C). Memoriile ne permit sa stocam fisierele ce contin datele audio. Intrucat folosim fisiere, avem nevoie sa operam cu un sistem de fisiere (FAT16 sau FAT32) implementat pe cardul de memorie, iar microcontrollerul trebuie sa utilizeze metode de scriere si citire intr-un anume sistem de fisiere. Ca urmare, acesta va implementa o biblioteca open-source pentru sistemul de fisiere FAT. Biblioteca open-source se interfateaza cu nivelul hardware prin functii de nivel scazut de acces la blocurile de memorie ale cardului (SPI_read_byte, SPI_read_sector, SPI_write_byte, SPI_write_sector), functii ce vor fi furnizate de noi. 2. AUDIO Exista 3 variante de realizare a playback-ului audio:
In aceasta solutie, toate componentele hardware necesare, cu exceptia difuzorului si a circuitului analogic de amplificare, se gasesc in microcontroller.
Perifericul PWM al microcontrollerului este folosit pentru a furniza semnal difuzorului. Semnalul este filtrat inainte de a fi amplificat, pentru a taia frecventele inalte (frecventa PWM). 2.3 Folosirea unui codec audio, conectat la microcontroller prin SPI
Aceasta abordare presupune un element hardware aditional, codecul audio, care ia semnalul digital din fisierul audio, si il converteste in semnal analogic ce urmeaza a fi transmis difuzorului, in urma amplificarii. Este o abordare mai complexa, atat din cauza faptului ca implica costuri mai mari, cat si din perspectiva unui cod mai amplu si al imposibilitatii de realizare a unui circuit hardware (lipsa codecurilor audio cu interfata DIP a pinilor).
LINKURI: Modul care realizeaza automat playbackul fisierelor .wav sau .mp3 de pe cardul SD [Link] Un player audio (.wav) de pe card SD (site-ul e in limba rusa...) [Link] Player audio folosind PWM [Link] Introducere in formatul fisierelor .wav [Link] Interfatarea microcontrollerelor cu carduri SD prin SPI [Link] Informatii despre sistemul de fisiere FAT [Link]
1. Arhitectura aplicatie client-server web. Vom crea doua aplicatii in limbajul C#. Una va fi aplicatia client, care va rula pe un anumit calculator din reteaua locala. Aceasta va beneficia de o interfata grafica cu utilizatorul, constand dintr-o fereastra cu butoane pentru comenzi simple si un text-box pentru introducerea cuvintelor de procesat.
La apasarea butonului "Conectare", ulterior completarii campurilor "Adresa IP" si "Port", se va incerca conectarea cu aplicatia server ce va rula pe un PC stabilit dinainte (unic). La apasarea butonului "Trimite msg", continutul textboxului va fi trimis catre server, acesta din urma fiind responsabil cu impartirea mesajului in cuvinte si transmiterea lor in cod ASCII catre placa STM32, prin interfata USART. Serverul foloseste in acest sens pachetul de clase "[Link]" care contin metode ce permit aplicatiei sa comunice prin portul serial cu alte dispozitive. OBS. Aplicatia server nu beneficiaza de interfata grafica, ci va rula pe PC ca o consola, ce va afisa informatii importante precum cele legate de conectarea unui client sau de primirea unui set de cuvinte. Aplicatia server realizeaza in prealabil o verificare a corectitudinii mesajului primit de la client (cuvant inexistent in baza de date). In cazul detectiei unui cuvand incorect, severul cere clientului reintroducerea mesajului. Pana cand pe server nu se primeste un mesaj corect, nu exista comunicatie server-STM32. La receptia unui mesaj corect, clientul este instiintat ca mesajul urmeaza sa fie trimis aplciatiei audio. Cuvintele vor fi primite de catre placa STM32 prin rutine USART_Receive(), asincrone, folosind intreruperi. 2. Transferul intre aplicatia audio si mediul de stocare nevolatil (card SD) Standardul de stocare "Secure Disk" este cel mai utilizat pentru dispozitivele mobile incorporate. Cardul SD contine un microcontroller. Controlul accesului la memorie (stergere, citire, scriere, controlul erorilor) se realizeaza in interiorul cardului. Datele sunt transferate intre dispozitivul HOST si card sub forma de blocuri cu dimensiunea (tipica) de 512 octet. Datorita acestui fapt, layerele superioare de programe (de ex, un sistem de fisiere), poate privi cardul la
Cardul SD contine 9 pini de interfatare. Rolul acestora este prezentat in tabelul de mai sus. Noi ii vom folosi in modul SPI. Tensiunea de alimentare poate varia intre 2.7-3.6V, pentru majoritatea dispozitivelor SD. Curentul maxim consumat pe operatii de scriere poate atinge valori de 100mA, deci circuitul nostru va trebui sa suporte intensitati de aceasta marime. Modul SPI este un mod de lucru alternativ al unui card SD, pentru a permite folosirea acestor dispozitive de stocare fara interfata host nativa (cu un PC de exemplu). Din aceasta cauza, se bazeaza si pe un protocol mai simplu. Interfatarea cu microcontrollerele se poate face fie pe liniile SPI, fie pe porturi de uz general (GPIO). Cum microcontrollerul folosit de noi beneficiaza de interfata SPI, o vom utiliza.
MCU si cardul SD comunica serial, in baza unui protocol de tip comanda-raspuns. Pe o singura linie, datele circula intr-un singur sens, iar dimensiunea vehiculata este octetul. Atat comenzile, cat si raspunsurile, sunt interpretate ca "FRAME"-uri de dimensiune fixa (6 octeti). Cand MCU trimite cardului o comanda, un raspuns la comanda respectiva este trimis de la card. Raspunsul este de dimensiune variabila (0-8 octeti). Semnalul SS (Slave Select) trebuie "tinut pe 0" in timpul comunicatiei.
Mai jos, prezentam o serie de comenzi importante pentru comunicatii SPI cu cardul SD:
Pentru a avea acces la fisierele audio .wav stocate pe cardul SD, trebuie ca microcontrollerul sa poata lucra cu un sistem de fisiere FAT16. In implementarea noastra folosim un modul FAT16 open-source, denumit FatFs. Acesta este creat special pentru proiecte incorporate. Scris in C, modulul acesta este complet separat de layerul de acces low-level la disk, si astfel, e independent de arhitectura hardware folosita. Poate fi incorporat in majoritatea microcontrollerelor (PIC,ARM,AVR s.a.m.d.).
Volumele formatate dupa standardul FAT sunt accesate pe baza unor functii puse la dispozitie de FatFs, cum ar fi : -f_open : deschide/creaza un fisier -f_close : inchide un fisier -f_read : citeste dintr-un fisier -f_write : scrie intr-un fisier Din moment ce FatFs este independent de platforma hardware, necesita o serie de functii puse la dispozitie de utilizator, pentru accesul la mediul fizic. Aceste functii vor fi implementate de noi: -disk_initialize : initializeaza cardul SD
-disk_status -disk_read : citeste un sector de pe disk -disk_write : scrie un sector pe disk Functiile prezentate mai sus vor apela la randul lor functii de scriere/citire octeti pentru modulul SPI al microcontrollerului STM32F. II. Audio
Formatul .wav este folosit pentru stocarea fisierelor multimedia. Acesta incepe cu un header, urmat de o secventa de calupuri de date. [Link] (detalierea formatului wav) Datele audio pe 8 biti sunt incarcate in registrul convertorului digital-analogic al microcontrollerului. Acesta realizeaza conversia si trimite semnalul analogic catre circuitul de amplificare incorporat pe placa de dezvoltare (CS43L22). Boxele vor fi conectate la jack-ul de pe placa de dezvoltare. 4. RAPORT FINAL (CE AM REUSIT SA IMPLEMENTAM) In final, am reusit intr-o proportie satisfacatoare sa ne atingem scopul initial, cu unele modificari in ceea ce priveste eleganta produsului finit. Am creat 3 aplicatii: Doua care ruleaza, alternativ, pe placa de dezvoltare, si una care ruleaza pe PC.
a. Aplicatia C# (PC): Permite scrierea pe cardul SD a unor fisiere text, cu date in format HEX. Aceste date sunt de forma unor siruri de caractere: Ex. A7E542C892BAC6... . Daca rescriem aceste date, in felul urmator: A7 E5 42 C8 92 BA... putem considera fiecare grup de 4 caractere HEX o reprezentare binara, pe 16 biti, a unui numar. Fiecare din acest numar pe 16 biti, constituie un sample (esantion) audio. Reprezentarea tipica a datelor intr-un fisier wav respecta formatul asa-numit LITTLE-ENDIAN. Cu alte cuvinte, la adresa cea mai mica, se afla octetul cel mai putin semnificativ. Pentru a obtine o reprezentare corecta pe 16 biti a unui esantion, trebuie sa reordonam datele. Vom numi aceasta operatiune AdjustBuffer. Astfel, A7 E5 42 C8 devine E5 A7 C8 42. Aduna cate 24000 de astfel de esantioane in intervale de o secunda, si trimitele unui convertor numeric-analogic pe 16 biti. Vei obtine sunete. Aplicatia noastra PC, dupa cum am mentionat anterior, deschide un fisier text cu esantioane audio pe rezolutie de 16 biti, se conecteaza prin interfata seriala USART la microcontroller si, alternativ, citeste din fisier 512 octeti, aplica operatiunea AdjustBuffer si ii trimite microcontrollerului, care scrie cei 512 octeti pe cardul SD, incepand cu blocul specificat de aplicatia c#, pana cand se intalneste sfarsitul fisierului. Este important de retinut ca primul bloc trimis microcontrollerului este un bloc de control, care contine adresa de start la care MCU va trebui sa inceapa scrierea, precum si numele sub care MCU va eticheta melodia, pe card. La finalul transmisiei, PC-ul mai trimite spre a fi scrisi pe card 512 octeti caractere Z, pentru a marca sfarsitul fisierului. Dupa cum se poate deduce acum, am renuntat la ideea de sistem de fisiere FAT16, intrucat nu am fi reusit sa ne incadram in timpul alocat proiectului. In consecinta, am optat pentru un sistem de fisiere propriu. Datele audio sunt scrise pe card incepand cu adrese de bloc (un bloc = 512 octeti) multiplu de 10000. La inceputul fiecarui fisier, (adica, la adresele 10000, 20000, 30000 s.a.m.d.) se gaseste un antet, de dimensiune 512 octeti, care ajuta la identificarea fisierului (contine numele sau). Deoarece fisierele au o dimensiune maxima de 10000*512 octeti ~5MB, iar marea majoritate a fisierelor audio utilizate de aplicatia noastra nu se apropie niciodata de aceasta limita, am considerat absolut necesat marcarea printr-un sir de 512 octeti % a sfarsitului fisierului. Este o solutie simpla, eleganta cat si eficienta (sansele ca un fisier audio sa contina 128 de esantioane care, codificate Ascii Hex sa formeze un sir de 512 caractere % sunt neglijabile!). Mai consideram important de mentionat ca formatul binar al unui fisier .wav l-am obtinut utilizand un soft free-ware, care poate fi downloadat la adresa: [Link] .
b. Aplicatia 1 MCU: (populare card sd cu fisierele audio) Aceasta aplicatie ruleaza concomitent cu aplicatia C# de pe PC. Dispune de un buffer de 512 octeti care salveaza continutul primit pe seriala, si apoi trimite acest continut cardului sd, la o adresa bine stabilita. Printre cele mai importante biblioteci create, amintim: - biblioteca de comunicatie low-level si de initializare a cardului SD utilizand protocolul SPI. - biblioteca de initializare a modulului de USART. Comunicatia low-level cu cardul SD se realizeaza in urma initializarii modulului SPI al microcontrollerului (SPI_Initialize() ) si al initializarii cardului SD (SD_Init() ) prin trimiterea unor
comenzi specifice (CMD0, CMD1, CMD16) si asteptarea unor raspunsuri. In urma acestei initializari, se pot utiliza metodele de scriere (SD_Write_block(uint32_t block_number) ), respectiv citire (SD_Read_block(uint32_t block_number) ) a unui bloc de 512 octeti la blocul cu numarul block_number. A doua cea mai importanta componenta a aplicatiei o constituie functia de tratare a intreruperii de USART Receive. Aici se intampla practic toate operatiile de primire a datelor audio de la PC si stocare a acestora pe cardul SD. Aplicatia porneste din starea STATE_READ_CTRL, in care asteapta sa receptioneze bufferul de control. Dupa ce il receptioneaza si il prelucreaza (PrelucreazaBufferControl()) pentru a obtine adresa de la care urmeaza sa scrie continutul fisierului, trece in starea STATE_READ_DATA, in care citeste buffere de 512 octeti cu date audio, si le scrie pe card, pana intalneste bufferul cu continut uniform in caractere Z. In acest moment, fisierul a fost scris pe card. Aplicatia inscrie cei 512 octeti Z si apoi, trece in starea STATE_READ_CTRL, asteptand sa reinceapa comunicatia cu aplicatia C#, pentru uploadul unui nou fisier.
void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { RxBuffer[RxCounter] = (USART_ReceiveData(USART2) & 0xFF); RxCounter++; if(RxCounter == RX_BUFFERSIZE) { RxCounter = 0; //verificam daca am primit mesaj de finalizare {ZZZZZZZZ...Z} finish = 1; for(k=0;k<RX_BUFFERSIZE;k++) { if(RxBuffer[k] != 'Z') finish = 0; } if(finish == 0) { //continua sa scrii date audio (urmatorul bloc) if(OwnState == STATE_READ_CTRL) { //prelucreaza buffer control si trimite pe card numele fisierului PrelucreazaBufferControl(); //trimite raspuns WRITE_OK (pe seriala) USART_SendString("WRITE_OK"); OwnState = STATE_READ_DATA; } else { //trimite pe card la adresa block corespunzatoare ScrieDataAudio(); //trimite raspuns WRITE_OK (pe seriala)
USART_SendString("WRITE_OK"); } } else { //scrie pe card marcator de final de fisier audio {ZZZZZ...Z} MarcheazaFinal(); //asteapta primirea unui nou fisier finish = 0; OwnState = STATE_READ_CTRL; } } } }
Functia main() nu face altceva decat sa initializeze modulele SD_Card si USART, apoi sa astepte intr-o bucla while(), timp in care intreruperile pe usart realizeaza intreg procesul de comunicatie intre card si PC.
int main() { USART_Initialize(); SD_Initialize(); while(1) { } }
c. Aplicatia 2 MCU: (redare fisiere audio) Microcontrollerul pe care am optat sa il folosim in cadrul proiectului dispune de un convertor Digital-Analogic pe 12 biti. Esantioanele noastre audio sunt pe o rezolutie de 16 biti. Ceea ce ne-a fortat sa renuntam la 4 biti de date (cei mai nesemnificativi). Conversia analogica este declansata (engl. triggered) de timerul 2 al microcontrollerului. Ceea ce inseamna ca timerul 2 trebuie configurat sa intrerupa DAC-ul la intervale de timp de 1/24000 s. La fiecare intrerupere primita de DAC de la timer, convertorul esantioneaza urmatoarea data disponibila in registrul sau. Pentru a optimiza performantele procesorului, ne-am decis sa utilizam modulul DMA (Direct Memory Access), ceea ce ne permite sa vehiculam datele direct, intre memorie si perifericul DAC, procesorul putand efectua alte calcule in acest timp, in mod independent.
La fel ca in aplicatia prezentata anterior, este necesara configurarea cardului SD si a interfetei USART. Apoi, Timerul2 este configurat astfel incat sa genereze intreruperi pe DAC la fiecare 1/24000 secunde (frecventa de esantionare a fisierelor noastre .wav este de 24kHz).
TIM_TimeBaseStructure.TIM_Period = 35; // 42Mhz/ (35*50) = 24.000 samples/sec TIM_TimeBaseStructure.TIM_Prescaler = 50;
Tinand cont ca timerul are ca intrare un semnal de clock cu frecventa de 42 Mhz, efectuand calcule simple deducem ca pentru ca acesta sa se reseteze cu o frecventa de 24kHz avem nevoie de o prescalare de 50 si o perioada de 35. (42000000/(50*35) = 24000). Modulul DMA este programat astfel:
DMA_DeInit(DMA1_Stream5); DMA_InitStructure.DMA_Channel = DMA_Channel_7; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DAC_DHR12R1_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&AudioBuff1; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = 128; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //16 biti DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream5, &DMA_InitStructure);
Se seteaza mai intai un canal de comunicatie a datelor cu DAC (canalul 7, fluxul 5), apoi i se face cunoscuta modulului DMA atat adresa destinatie (adresa perifericului DAC) de transport a datelor, cat si adresa sursa (unul din cele doua buffere cu 128 esantioane audio pe 16 biti). Observam ca functia main, in afara de aceste configurari, nu mai contine nimicl. Aceasta, deoarece restul procesarii se realizeaza in cele doua intreruperi (una pe modulul de USART, la primirea numelui melodiei de rulat, cealalta, pe modulul DMA, care verifica daca mai sunt date de citit din fisier, si schimba intre cele doua buffere (cel gol, din care tocmai a citit 128 de esantioane, il schimba cu cel plin, apoi, in timp ce DMA-ul comunica cu DAC-ul, procesorul reumple bufferul golit cu noi esantioane, de pe cardul SD). Intreruperea USART asteapta primirea pe seriala a numelui melodiei urmatoare. Numele este in format XXXXXX*, unde X reprezinta un caracter din nume, iar *, sfarsitul numelui. Cand acest lucru se intampla, intreruperea apeleaza functia PlayTrack(). In acel moment, orice melodie ar fi rulat inainte, este intrerupta (modulul DAC si cel DMA sunt oprite). Procesorul incepe sa caute melodia dupa nume, la adrese consecutive din 10000 in 10000 de blocuri de 512 octeti. In cazul cel mai defavorabil, are de efectuat 100 de cautari (aplicatia noastra suporta 100 de fisiere audio maxim), ceea ce inseamna extrem de rapid (de ordinul milisecundelor). Cand gaseste melodia, seteaza variabila block_addr, adica adresa de inceput a fisierului, si porneste modulele DAC si DMA, dar nu inainte de a popula cele doua buffere audio cu primele esantioane.
void PlayTrack(void)
{ int i,j,ok; /* Disable DMA1_Stream5 */ DMA_Cmd(DMA1_Stream5, DISABLE); /* Disable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, DISABLE); //numele melodiei este in RxBuffer[], RxCounter caractere block_addr_start = 0; /*parcurgem fisierele, in cautarea celui corect*/ for(i=0;i<NMAX_FILES;i++) { ok=1; block_addr_start = i+FILE_SIZE; SD_Read_block(block_addr_start); for(j=0;j<RxCounter;j++) { if(RxBuffer[j] != SD_RDData[10+j]) { ok=0; } } if(ok) //daca am gasit fisierul cautat { break; } } block_addr = block_addr_start + 1; Initializeaza_BuffereAudio(); //populeaza bufferele audio cu primele 2 "bucati" a cate 512 octeti //porneste playerul audio... /* Enable DMA1_Stream5 */ DMA_Cmd(DMA1_Stream5, DISABLE); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, DISABLE); }
Acum, controlul este preluat de modulul DMA, care trimite convertorului digital-analogic esantioane audio, incepand sa epuizeze bufferul 1. Cand il goleste, genereaza intrerupere (DMA_IT_TCIF5 - Transmission Complete Interrupt). Procesorul este trezit din starea Idle. verifica daca bufferul care tocmai a fost golit contine numai delimitatori de final de fisier (Z). Daca da (stop == 1), opreste modulul DAC, si asteapta o noua intrerupere USART, cu un nou titlu de melodie. Daca nu, intrerupe pentru o perioada extrem de scurta modulul DMA pentru a-l
reconfigura. Asadar, schimba bufferele (1 cu 2, sau 2 cu 1, in functie de bufferul care e gol la momentul respectiv). DMA e instruit sa citeasca din celelalt buffer disponibil
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&AudioBuff1;
respectiv
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&AudioBuff2;
Dupa aceasta scurta pauza, reporneste modulul DMA, care incepe sa alimenteze convertorul digital-analogic cu esantioane. Intre timp, pentru o perioada scurta, CPU se ocupa de reumplerea bufferului gol, cu date din cardul SD de la urmatoarea adresa block_addr. Cu mult inainte ca modulul DMA sa termine transferul, un nou buffer este pregatit de procesor, iar procesorul intra din nou in stare Idle.
In continuare, prezentam o serie de imagini cu diverse componente hardware ale aplicatiei noastre: 1. Interfata RS-232 (convertorul de semnal RS-232 ( 12v <------> 3.3v) )
Intrucat microcontrollerul nostru functioneaza pe baza de semnale ale caror tensiuni sunt in plaja 1.8V - 3.6V, nu am putut utiliza driverul MAX232 ca atare, ci a trebuit sa ii adaugam un convertor de nivel de tensiune bidirectional, 5V - 3.3V, ca in figura, utilizand 2 transiztoare MOSFET de tip N.
2. Stabilizatorul de tensiune (3.3V si 5V) Pentru stabilizator de tensiune dual, am folosit un regulator de tensiune LM7805 (5V), iar iesirii acestuia i-am aplicat un divizor de tensiune (obtinand si 3.3V, necesara alimentarii convertorului RS232 si cardului SD).
Cu rosu: 5V Cu portocaliu: 3.3V Cu negru: GND 3. Am construit un circuit simplu, din 2 barete duble de pini, care se alimenteaza de la stabilizatorul de tensiune, si furnizeaza mai multe iesiri a 3.3V si 5V.
Aportul membrilor: CURCAN IONUT-BOGDAN: - Driver RS-232 si convertor nivel bidirectional 3.3V-5V - Aplicatie C# - Biblioteca USART (intreruperi, configurare) - configurare Timer pentru conversia analogica, DMA - prelucrarea bufferului serial de catre microcontroller - regulator de tensiune dual - populare card SD cu fisiere audio - documentare USART, DAC, DMA, formatul wav URSAN MIHAI-ALEXANDRU: - interfata hardware card SD si audio jack - regulator de tensiune dual - Biblioteca card SD - configurare DAC - obtinerea datelor binare din fisierele .wav, utilizand [Link] - configurare module DMA si DAC - intrerupere DMA - documentare CONVERTOR NIVEL 3.3V-5V, SPI, SD CARD, DAC
BIBLIOGRAFIE: Un player audio (.wav) de pe card SD (site-ul e in limba rusa...) [Link] Player audio folosind PWM [Link] Introducere in formatul fisierelor .wav [Link] Interfatarea microcontrollerelor cu carduri SD prin SPI [Link] Audio and waveform generation using the DAC in STM32 microcontroller families [Link] /APPLI CATION _NOTE/CD00259245. pdf Bi-directional level shifter [Link] Secure Digital Card Interface [Link] Solutions for Applications requiring Audio & Speech Playback [Link] IdcService=SS_GET_PAGE&nodeId=2660& param=en535129
Echipa 11: Studenti: 1. Marian Antonache (programare module zigbee) 2. Stefan Baciu (protocol de comunicatie) 3. Petrica Patache (control motoare servo) Rezumat: Comandarea wireless a unei platforme mobile. Platforma mobila va fi controlata pe cele 2 axe, X si Y, prin intremediul a 2 servo-motoare. Comunicatia wireless se va face prin intermediul unor module de tip Zigbee. Resurse materiale: - 2 placute 13192 EVB Freescale cu module Zigbee pentru a comanda cele 2 motoare - 2 servo-motoare - o platforma de referinta
Solutii Alternative 1. Solutii alternative pentru comunicatie: Utilizarea unui Ipod pentru comunicatia wireless. Comunicatia wireless se va realiza de la Ipod catre placa de dezvoltare SBC876 cu un modul de receptie. Aceasta alternativa presupune, in primul rand, un Ipod. Pentru a programa acest Ipod este nevoie de o licenta de developer. Ipod-ul foloseste standardul de comunicare 802.11 la o frecventa de 2.4Ghz.
Comunicatia realizata prin Bluetooth. In acest sens, putem folosi mai multe tipuri de module Bluetooth. Ipodu-l mentionat mai sus include un modul Bluetooth 2.1 +EDR ([Link] modul ce functioneaza implicit la o viteza de 2.1 Mbit/s, putand, totodata, sa functioneze intr-un mod low power. De asemenea in locul Ipod-ului putem folosi 1 modul BTM-112 ([Link] care foloseste standardul 2.0 + EDR si care este low current consumption.
BTM-112
2. Solutii alternative pentru nivelul fizic Folosirea a doua placi de dezvoltare SBC876 cu unul din urmatoarele module de comunicatie: wireless RFM70-D. BTM-112 Bluetooth. ([Link] [Link]) Ce vom implementa. Vom implementa o comunicatie de tip Zigbee pentru a trimite comenzile de la utilizator catre platforma mobila. Pentru acest tip de comunicatie vom folosi 2 placi de dezvoltare de la Freescale 13192 EVB care cuprind module Zigbee. Pentru platforma mobila folosim 2 servomotoare. Resurse software CodeWarrior - mediu de dezvoltare pentru sisteme embeded bazat pe un compilator C folosit pentru procesoarele Motorola. ([Link] .jsp?code=CW_HOME) Beekit Wireless Connectivity Toolkit - permite crearea, modificarea si update la implementari wireless variate. ([Link] .jsp?code=802-154_HOME) Resurse hardware 2 placute Freescale 13192 EVB cu procesor HCS08 40-MHz ce suporta background debuging ([Link] f).La acest procesor vom configura 4 intreruperi pentru fiecare comanda ce va fi declansata de apasarea unui buton de pe placa de dezvoltare. Comenzile sunt: sus,jos,stanga si dreapta. De asemenea vom implementa un mod de low power pentru a reduce consumul in momentul in care utilizatorul nu mai trimite comenzi un anumit timp. Aceste doua placi de dezvoltare au incorporat fiecare cate un modul wireless ce va fi configurat cu ajutorul programatorului USB
HCS08/HCS12 Multilink.
2 motoare servo deoarece au reductor inclus, sunt usor de montat si usor de interfatat. programator USB HCS08/HCS12 Multilink - cu ajutorul acestui dispozitiv putem avea acces la modul Background Debug pentru procesorul Freescale HCS08. Trebuie conectat la un port USB la o masina pe care ruleaza Windows, iar la celalalt capat are un conector Berg ce se conecteaza pe placa. In acest mod putem controla executia microprocesorului, putem citi/scrie registri si variabile de memorie si programa procesorul. ([Link] product_id=33&CFID=7789703&CFTOKEN =c9cc8eff43fd1f46-A362FD2C-AA02064D-CC1E7DBEB1885A36)
Detalii de implementare
Pentru realizarea comunicatiei wireless am folosit programul Beekit cu ajutorul caruia am realizat o aplicatie ce transmite prin Zigbee datele primite prin Uart avand implementat si trimiterea unui mesaj inapoi pentru confirmare primire date. Pentru a adapta aplicatia pentru proiect am folosit CodeWarrior in care am modificat aplicatia creata in Beekit. Pentru proiect folosim doua aplicatii: Master si Slave. Aplicatia Master transmite in continuu 2 bytes de date cate un byte pentru fiecare motor prin care i se comunica starea urmatoare(FRONT, REAR, NUL) . Fiecarui motor ii corespund 2 taste de comanda: una pentru FRONT si una pentru REAR. Pentru fiecare comanda executata este aprins un led corespunzator.
Aplicatia Slave asteapta date de la Master iar in momentul primirii unui pachet se actualizeaza starea motoarelor. La fel ca si la Master se aprinde un led corespunzator fiecarei comenzi pentru confirmarea vizuala a comunicatiei. Cele doua motoare sunt comandate de aplicatia Slave prin intermediul a doi pini. De asemenea pentru controlul celor doua servo-motoare a fost nevoie de o operatie de calibrare. Drept suport am folosit o platforma de anul trecut ce folosea o placuta SBC 876.
Cele 2 placute 13192 EVB au fost proiectate pentru distante mici pentru a creste distanta de comunicare este nevoie de un amplificator de semnal jos MBC13900(LNA). Aplicatia merge pana la 245m fara amplificator, iar cu amplificator merge pana la 1350m.
LNA Schematic
Amplificatorul de semnal jos este implementat hardware dar este dezactivat. Pentru a activa acest modul este nevoie de doua modificari pentru fiecare placa de dezvoltare.
Cele doua placute comunica real pana la o distanta de 3m. Pentru a creste distanta de comunicare am adaugat o antena artizanala si am reusit sa realizam transmisie de date pe o distanta de pana la 10m. Antonache Marian Implementarea si testarea unei aplicatii Wireless to Uart pentru placa de dezvoltare 13192 -EVB. Acesta aplicatie a fost necesara pentru testa cum putem comunica date utilizand modulul Zigbee. Pentru construirea aplicatiei am utilizat programul Beekit de la Freescale. In acest program am folosit baza de date "smac"(simple media access controller) pentru a crea o aplicatie standard care primeste de pe UART date si le trimite wireless la cealalta placa. Aplicatia are implementat un state machine care asteapta date de la cealalta placuta sau de pe UART. Aplicatia cuprinde trimiterea un acknowladge in momentul primirii unui set de date. Aplicatia creata in Beekit am exportat-o intr-un xml pentru a o putea importa in CodeWorrior.
In momentul testari aplicatia trimite si receptioneaza cu succes date la o distanta de maxim 3m. SMAC database Baciu Stefan Pornind de la o comunicare simpla intre cele doua placi de dezvoltare freescale, am dezvoltat un protocol de comunicare pentru a defini transmiterea de comenzi de la transmitator catre receptor. A fost nevoie de scrierea a doua aplicatii separate, una pentru placa transmitatoare si
una pentru cea receptoare, simplificand astfel comunicarea, avand in vedere faptul ca nu aveam nevoie de date de la receptor. Astfel la fiecare apasare de tasta pe placa transmitatoare, aceasta va transmite un cod spre cea receptoare. Tastele pot fi actionate independent dar si simultan oferind astfel libertate de control asupra receptorului. In aplicatiaplacutei receptor am implementat un pwm software pentru controlul servomotoarelor. De asemenea am implementat si un algoritm care interpreteaza datele primite de la transmitator si transformarea lor in date care pot fi folosite la controlul celor doua motoare. Astfel pentru fiecare motor exista trei stari, de rotire trigonometrica, in sensul acelor de ceasornic si starea de repaos in care motorul nu se roteste.
Patache Petrica Folosind un pwm-ul software dezvoltat de echipa, am determinat frecventele optime de lucru pentru cele doua servomotoare astfel incat sa se poata folosi cu usurinta cele doua motoare. Am construit si alimentarea cu tensiune a mobilului folosind baterii separate pentru motoare si alimentarea placii de dezvoltare dar am folosit masa comuna pentru functionarea corecta a sistemului. Initial am observat ca nu reuseam o comunicatie corecta intre cele doua placi de dezvoltare decat pana la aproximativ trei metri asa ca am incercat sa maresc aceasta distanta prin adaugarea unei antene artizanale atat la emitator cat si la receptor, reusind astfel o transmitere corecta la peste zece metri. Generare PWM
Echipa 12: Studenti : 1. Gabor Vlad 2. Paulin Burca 3. Magdici Silvia 4. Strachinescu Tudor Rezumat: Sistem de supraveghere prin internet. Resurse materiale/timp: - Motor stepper - SBC876 - Webcam - TA7774P - driver pentru motorul stepper - MBED Alternative solutii: Controlul unui motor DC prin Internet Proiectul foloseste un microcontroler TINI (dezvoltat de Dallas Semiconductor). Tiny Internet Interface este un microcontroler care include facilitati necesare conectarii la Internet. Aceasta platforma de dezvoltare are implementata stiva TCP/IP.
Clientul este reprezentat de un computer remote care comunica cu serverul pentru a realiza interactiunea cu motorul la distanta. Astfel, prin Internet, clientul poate ncrca i executa programe pe microcontrolerul-server. Folosind protocolul TCP / IP, microcontrolerul-
Clientul se conecteaz la server folosind un applet Java care permite interactiunea remote cu motorul prin intermediul unui GUI.
In plus aplicatia prevede un afiaj vizual al poziiei curente a motorului, utilizand n timp real date primite de la senzorul de microcontroler.
[Link] Automatizarea sistemului de declansare al unei custi Proiectul are ca scop automatizarea sistemului de declansare al unei custi utilizate pentru prinderea randunelelor. Acesta are la baza un Atmel Mega644 ce provoaca inchiderea custii cand este detectata o pasare inauntru, si semnaluzeaza acest lucru printr-un modul wireless unui server de unde utilizatorii pot vizualiza starea custilor. [Link] FinalProjects/s2011/jdl226_qh33_yz258/jdl2 26_qh33_yz258/[Link] Monitorizarea si controlul prin Internet a temperaturii dintr-o camera Un proiect realizat cu Atmel AT90s8535 pentru monitorizarea prin internet a temperaturii dintr-o camera si controlul acesteia asemenea unui termostat in sensul racirii prin utilizarea unui ventilator. Microcontrolerul preia valoarea data de un senzor de temperatura si o afiseaza pe un display pentru vizualizare la fata locului, iar pentru monitorizare, cu ajutorul Matlab se posteaza pe un server, impreuna cu starea ventilatorului. Prin internet este posibila setarea unei valori de prag pentru temperatura, peste care daca se trece sa fie pornit ventilatorul in mod automat. [Link] FinalProjects/s2000/ larry/
mbed ca si clinet 1.1 Componente : - mbed - mufa RJ45 - Camera web USB - PC conectat la internet - 2 x Motoare pas cu pas - Server de live streaming - Server http + pagina HTML/PHP
1.2 Descrierea solutiilor : Proiectul are ca scop controlul unei camere web prin intermediul internetului. Camera web se va putea controla pe doua axe ( orizontal/vertical ) prin intermediul a doua motoare de tip stepper comandate de tool-ul mbed. Mbed-ul conectat prin intermediul unei mufe RJ45 la internet, va face request-uri la un server HTTP, pentru a prelucra ultima comanda ceruta de clientul care detine controlul camerei
la momentul respectiv (un singur client va putea comanda camera la un anumit moment de timp). Camera web va fi conectata la un PC prin intermediul unei conexiuni USB, iar PC-ul va trimite imaginile prin intermediul internetului unui server specializat pentru live streaming (ex : [Link] ). Serverul HTTP va gazdui pagina HTML care va contine fereastra embedded de live streaming si controalele pentru [Link] va prelucra cererile mbed-ului si ale clientului ce detine controlul camerei.
mbed ca si server In paralel cu implementarea solutiei mbed ca si client vom incerca sa realizam si mbed ca si server. Avantajul acestei solutii este renuntarea la serverul HTTP, implementarea acestuia fiind facuta pe mbed. Din pacate partea de HTTP Server a mbed-ului este inca in dezvoltare, avand multe bug-uri si comportamente neasteptate ( ex. dupa un anumit timp cedeaza/se blocheaza ).De aceea am decis ca solutia mbed ca si client sa o prioritizam, iar mbed ca si server sa ramana optionala in functie de timpul ramas liber pentru implementarea ei. 1.3 Descriere hardware a solutiilor
Partea de hardware este compusa din microcontrolerul MBED, motorul de tip stepper, un controller pentru motor (vom folosi un circuit integrat de tip driver - TA7774P) si o camera web. Schema bloc TA7774P:
Deasupra axului motorului pas cu pas se va afla o platforma ce va sustine webcam-ul. Asadar, efectuarea unei rotiri in stanga sau dreapta va permite utilizatorului sa modifice pozitia webcam-ului in vederea schimbarii razei de vizualizare. Practic, sistemul de supraveghere va consta dintr-un webcam care poate fi controlat din interfata realizata in [Link]. Supravegherea va consta in controlul motoarelor de tip stepper cu ajutorul microcontrolerului MBED.
MBED este un tool folosit pentru dezvoltarea rapida de prototipe cu microcontrolere. Acesta vine impreuna cu o biblioteca bogata si un compilator de tip cloud, facilitand dezvoltarea aplicatiilor. Un alt plus este site-ul dedicat acestui tool, unde se pot gasi informatii despre bibliotecile existente, se pot creea biblioteci noi sau se pot vizualiza proiecte dezvoltate de alti utilizatori.
Datorita acestor facilitati, am ales sa folosim acest tool in defavoarea SBC876 dezvoltat in anul precedent. Implementare solutie. Secventa de test. Serverul este de tipul EasyApache, cu interfata [Link] gazduieste script-urile PHP , pagina pentru accesarea camerei si fisierul [Link] necesar clientului MBED. Pagina principala contine link-ul de embed al livestreaming-ului si cele 2 butoane stanga/[Link] apeleaza prin intermediul AJAX scriptul [Link] care actualizeaza valoarea din fisierul [Link], in functie de butonul apasat : dreapta = incrementarea valorii pana se ajunge la valoarea 44 si stanga = decrementarea valorii pana se ajunge la 20. Clientul este reprezentat de MBED . Acesta acceseaza prin intermediul unei comenzi HTTP Get fisierul [Link] Initial, acest fisier va avea ca si continut valoarea 32. Aceasta valoare va corespunde pozitionarii centrale a motorului, respectiv a camerei web. Valorile din acest fisier vor varia in intervalul [20 : 44] 20 reprezentand pozitia maxim stanga, iar 44 pozitia maxim dreapta. La intervale de 1 secunda, MBED-ul va cere din nou continutul fisierului [Link] si va muta camera, daca este necesar, cu | pozitia_curenta pozitia_urmatoare | pasi. Camera web este conectata la un PC prin intermediul unei conexiuni USB, iar PC-ul va trimite imaginile pe pagina [Link] server specializat in live streaming.
Schema proiectului:
Rotirea camerei video este realizata prin intermediul unui motor pas cu pas alimentat cu tensiunea de 6 V, iar controlul acestuia este facut cu ajutorul unui driver de motor de tip L293D. Motorul functioneaza dupa urmatoarea serventa de pasi: Pas 1 2 3 4 5 6 7 8 A 1 1 1 0 0 0 0 0 A\ 0 0 0 0 1 1 1 0 B 1 0 0 0 0 0 1 1 B\ 0 0 1 1 1 0 0 0
La fiecare secventa motorul executa o rotatie de 7,2 . Pentru conexiunea la internet s-a folosit un conector RJ45 conectat la MBED prin intermediul pinilor 33,34,35,36 (TD+,TD-,RD+,RD-).
2. Descriere solutie Proiectul are ca scop controlul unei camere web prin intermediul [Link] web se va putea controla pe doua axe ( orizontal/vertical ) prin intermediul a doua motoare de tip stepper comandate de tool-ul mbed. Mbed-ul conectat prin intermediul unei mufe RJ45 la internet, va face request-uri la un server HTTP, pentru a prelucra ultima comanda ceruta de clientul care detine controlul camerei la momentul respectiv (un singur client va putea comanda camera la un anumit moment de timp). Camera web va fi conectata la un PC prin intermediul unei conexiuni USB, iar PC-ul va trimite imaginile prin intermediul internetului unui server specializat pentru live streaming (ex : [Link] ).
Serverul HTTP va gazdui pagina HTML care va contine fereastra embedded de live streaming si controalele pentru [Link] va prelucra cererile mbed-ului si ale clientului ce detine controlul camerei. In paralel cu implementarea solutiei mbed ca si client am incercat sa realizam si mbed ca si server. Avantajul acestei solutii ar fi fost renuntarea la serverul HTTP, implementarea acestuia fiind facuta pe mbed. Din pacate partea de HTTP Server a mbed-ului este inca in dezvoltare, avand multe bug-uri si comportamente neasteptate ( ex. dupa un anumit timp cedeaza/se blocheaza ). In conformitate cu documentarea initiala, asa cum ne-am asteptat, implementarea server-ului cu mbed nu a reusit, aparand diverse probleme in timpul dezvoltarii. Astfel, am renuntat la implementarea serverului cu mbed si am continuat cu un server HTTP. Descriere hardware a solutiilor
Partea de hardware este compusa din microcontrollerul MBED, motorul de tip stepper, un controller pentru motor (vom folosi un circuit integrat de tip driver - TA7774P) si o camera web. Schema bloc TA7774P
Deasupra axului motorului pas cu pas se va afla o platforma ce va sustine webcam-ul. Asadar, efectuarea unei rotiri in stanga sau dreapta va permite utilizatorului sa modifice pozitia webcamului in vederea schimbarii razei de vizualizare. Practic, sistemul de supraveghere va consta dintr-un webcam care poate fi controlat din interfata realizata in [Link]. Supravegherea va consta in controlul motorului de tip stepper, acesta fiind comandat cu ajutorul microcontrollerului MBED.
Schema mbed
MBED este un tool folosit pentru dezvoltarea rapida de prototipe cu microcontrollere. Acesta vine impreuna cu o biblioteca bogata si un compilator de tip cloud, facilitand dezvoltarea [Link] alt plus este site-ul dedicat acestui tool, unde se pot gasi informatii despre bibliotecile existente, se pot creea biblioteci noi sau se pot vizualiza proiecte dezvoltate de alti utilizatori. Datorita acestor facilitati, am ales sa folosim acest tool in defavoarea SBC876 dezvoltat in anul precedent. 3. Detalii de implementare 3.1. Implementare software - Magdici Silvia, Gabor Vlad Serverul este de tipul EasyApache, cu interfata [Link] gazduieste script-urile PHP , pagina pentru accesarea camerei si fisierul [Link] necesar clientului MBED. Pagina principala contine link-ul de embed al livestreaming-ului si cele 4 butoane stanga/dreapta, sus/jos. [Link] <script type="text/javascript"> $(document).ready(function(){ $("#upButton").click(function(){ $.ajax({ data: "direction=up", url: "[Link]" }) }); $("#downButton").click(function(){ $.ajax({
data: "direction=down", url: "[Link]" }) }); $("#leftButton").click(function(){ $.ajax({ data: "direction=left", url: "[Link]" }) }); $("#rightButton").click(function(){ $.ajax({ data: "direction=right", url: "[Link]" }) }); }) </script> Butoanele apeleaza prin intermediul AJAX scriptul [Link] care actualizeaza valoarea din fisierul [Link] (pentru miscarea stanga-dreapta) si commandsUp (pentru miscarea sus-jos), in functie de butonul apasat : dreapta = incrementarea valorii pana se ajunge la valoarea 44 si stanga = decrementarea valorii pana se ajunge la 20, respectiv si pentru miscarea sus-jos. [Link] $handle = fopen("[Link]", "r+"); if ($handle) { if (isset($_GET['direction']) && $_GET['direction'] == "left") { $data = fgets($handle, 4096); var_dump($data); $num = (int)$data; if($num > 20) { $num = $num-1; var_dump($num); fseek($handle,0); fwrite($handle, $num); } } else if (isset($_GET['direction']) && $_GET['direction'] == "right") { $data = fgets($handle, 4096); var_dump($data);
$num = (int)$data; if($num < 44) { $num = $num + 1; var_dump($num); fseek($handle,0); fwrite($handle, $num); } } } Clientul este reprezentat de MBED . Acesta acceseaza prin intermediul unei comenzi HTTP Get fisierul [Link] respectiv [Link]. Initial, acest fisier va avea ca si continut valoarea 32. Aceasta valoare va corespunde pozitionarii centrale a motorului, respectiv a camerei web. Valorile din acest fisier vor varia in intervalul [20 : 44] 20 reprezentand pozitia maxim stanga, iar 44 pozitia maxim dreapta, respectiv sus-jos.
La intervale de 1 secunda, MBED-ul va cere din nou continutul fisierului [Link] si va muta camera, daca este necesar, cu | pozitia_curenta pozitia_urmatoare | pasi. main.c #include "mbed.h" #include "EthernetNetIf.h" #include "HTTPClient.h" #include "motor.h" #ifdef dhcpenable EthernetNetIf eth; #else EthernetNetIf eth( IpAddr(192,168,2,120), //IP Address IpAddr(255,255,255,0), //Network Mask IpAddr(192,168,2,1), //Gateway IpAddr(192,168,2,1) //DNS ); #endif HTTPClient http; Serial pc(USBTX, USBRX); // tx, rx int main() {
char a,b; int prev_pos,next_pos; [Link](115200); [Link]("[Link]"); //set proxy if needed HTTPText txt; HTTPResult r = [Link]("[Link] &txt); if(r==HTTP_OK) { string forParse = [Link](); a = forParse[0]; b = forParse[1]; prev_pos = 0; prev_pos = (a - '0') * 10 + (b - '0'); printf("Result prev_pos :\"%d\"\n", prev_pos); } else { printf("Error %d\r\n", r); } while(1) { r = [Link]("[Link] &txt); if(r==HTTP_OK) { string forParse = [Link](); a = forParse[0]; b = forParse[1]; next_pos = 0; next_pos = (a - '0') * 10 + (b - '0'); printf("Result next_pos :\"%d\"\n", next_pos); move(prev_pos,next_pos); prev_pos = next_pos; } else { printf("Error %d\r\n", r); }
[Link]() wait(0.2); } } Practic, daca valoarea curenta este mai mare decat cea care este citita din fisier, se va face miscarea catre dreapta; altfel daca valoarea curenta este mai mica decat cea care este cititta din fisier, se va face miscarea catre stanga.
Camera web este conectata la un PC prin intermediul unei conexiuni USB, iar PC-ul va trimite imaginile pe pagina [Link] server specializat in live streaming.
Rotirea camerei video este realizata prin intermediul unui motor pas cu pas alimentat cu tensiunea de 6 V, iar controlul acestuia este facut cu ajutorul unui driver de motor de tip L293D. Motorul functioneaza dupa urmatoarea secventa de pasi:
#include "mbed.h" #include "motor.h" DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut DigitalOut Enable(p21); IN1(p25); IN2(p24); IN3(p23); IN4(p22); Enable2(p26); IN1_1(p30); IN2_2(p29); IN3_3(p28); IN4_4(p27);
double t=0.05; void go_right(){ IN4=1; IN3=0; wait(t); IN4=1; IN3=0; wait(t); IN4=1; IN3=0; wait(t); IN4=0; IN3=0; wait(t);
IN4=0; IN3=1; wait(t); IN4=0; IN3=1; wait(t); IN4=0; IN3=1; wait(t); IN4=0; IN3=0; wait(t);
} void move(int in_pos,int next_pos){ int steps; if(in_pos!=next_pos) { if(next_pos>in_pos){ steps=next_pos-in_pos; Enable=1; for(int i=0;i<steps;i++){ go_right(); } Enable=0; }else{ steps=in_pos-next_pos; Enable=1; for(int i=0;i<steps;i++){ go_left(); } Enable=0; } } }
La fiecare secventa motorul executa o rotatie de 7,2 . Pentru conexiunea la internet s-a folosit un conector RJ45 conectat la MBED prin intermediul pinilor 33,34,35,36 (TD+,TD-,RD+,RD-). 4. Rezultate experimentale. Concluzii Rezultatul proiectului dezvoltat de echipa noastra este unul pozitiv, reusind sa realizam ceea ce ne-am propus.
Pagina din care vom controla sistemul de supraveghere prin Internet arata ca in figura de mai sus, controlul putandu-se face pe ambele directii: stanga-dreapta, respectiv sus-jos. Un demo al aplicatiei realizate de echipa noastra poate fi accesat la adresa: [Link] Ca si observatii, vom adauga faptul ca, nu am putut sa folosim mbed-ul ca si server din cauza problemelor intampinate la folosirea bibliotecilor pentru utilizarea mbedului ca si server, lucru pe care l-am aflat pe parcursul documentarii (cei care au dorit sa dezvolte o aplicatie in care sa foloseasca mbed-ul ca server, au ajuns la concluzia ca sunt multe bug-uri in bibliotecile aferente). In consecinta, am folosit un server HTTP. Un alt neajuns al aplicatiei ar fi acela ca din cauza faptului ca folosim un site de streaming specializat free, delay-ul este de cateva secunde, intre pozitia reala a camerei web, si imaginile care sunt oferite pe pagina de Internet.
5. Bibliografie
[Link]
2. Dumitriu Andrei Rezumat: Control robot mobil prin internet . Resurse materiale/timp: 2 x SBC 876, transmiter RF, receiver RF Alternativa 1: Proiectul va avea ca rezultat final realizarea unui robot care poate fi controlat prin internet. Componente: router Linksys WRT54GL
Microcontroller: 3 posibilitati
a) b) c)
PIC16F628A Arduino (ATmega 168) Freeduino MaxSerial AVR Butterfly (ATmega 169)
Pro & Cons: Pro: a) Pret, nivelul de control software b) Foarte usor de programat (limbaj C cu multe librarii gata implementate), nu este nevoie de multe componente aditionale c) Mai usor de programat decat PIC(C), nu este nevoie de multe componente aditionale Cons: a)Greu de programat (ASM), cablajul trebuie realizat manual b)pretul c)pretul, perifericele pot avea la iesire voltaje eronate
Mbed
Descriere : Utilizatorul se va conecta pe un site al carui server va fi tinut pe mbed. In momentul in care utilizatorul va incerca sa controleze masina, transmiterul RF de pe mbed va trimite un semnal catre receiverul RF de pe SBC876A. Semnalul va fi prelucrat de catre PIC16F876A care prin driverul L293D va controla cele 2 motoare.
Ciorna solutie Resurse software: a) b) Pentru SBC876A: MPLAB,HI-TECH C, PIC downloader Pentru mbed: compilator online
Resurse hardware: Placa de dezvoltare SBC876A pic 16f876A driver motor L293D 2 motoare DC Cablu serial Microcontroller mbed *Optional* - router wireless Descriere solutie: Putem considera proiectul ca fiind alcatuit din 3 parti mari: 1) partea de control a robotului 2) partea de server si conectare la internet 3) partea de conectare intre modulele de mai sus
1) In ceea ce priveste partea de control a robotului am decis sa folosim 2 motoare DC ce vor fi controlate de microcontrollerul pic16f876a aflat pe placa SBC876A prin intermediul driverului L293D. 2) In ceea ce priveste partea de server si conectare la internet am decis ca serverul se va afla pe microcontrollerul mbed. Acesta din urma se va conecta la internet cu ajutorul unui extensii ce va contine o mufa RJ45. 3) In prima faza conexiunea intre cele 2 module de mai sus o vom realiza printr-un cablu serial, urmand mai apoi sa incercam o implementare cu ajutorul unui router wireless.
Schema implementare Raport final: Detalii de implementare: 1. Pricope Tudor - realizare parte hardware si receptie pe seriala In ceea ce priveste partea hardware am folosit o placa de dezvoltare SBC876a si un driver L293d cu ajutorul carora am reusit sa comandam cele 2 motoare DC. Reductia pentru cele doua motoare am realizat-o cu ajutorul unui ansamblu de roti dintate si curele de transmisie.
Comunicatia seriala am realizat-o folosind intreruperi. In momentul in care este primit un caracter pe seriala, se activeaza o intrerupere, se testeaza caracterul si in functie de acesta se comanda motoarele.
void InitUSART() //rutina de setare si initializare a modulului USART { SPBRG=128; //9600 , pt 19200 baud SPBRG = 64 BRGH=1; //high speed SYNC=0; //modul asincron SPEN=1; //activare port serial TXIE=0; //dezactivare intrerupere USART la transmisie TX9=0; //transmisie pe 8 biti TXEN=1; //activare transmisie RCIE=1; RX9=0; CREN=1; } //primeste char unsigned char ReceiveUSART() //Rutina pt receptia unui octet de la portul serial { unsigned char c; while(!RCIF); //asteapta pana se incheie receptia c=RCREG; //octetul receptionat este preluat din RCREG return c; } // Activare intrerupere void interrupt ISR( void ) { if (RCIF == 1 && RCIE == 1) { char ch; ch=RCREG; if(ch=='R'){ right(); } if(ch=='L'){ left(); } if(ch=='F'){ forward(); } if(ch == 'S'){ PORTB = 0x00; } } } //dezactivare intrerupere USART la receptie //receptie pe 8 biti //activare receptie
2. Dumitriu Andrei realizare server, client si transmisie pe seriala Initial, am incercat sa implementam un server pe mbed, dar datorita bug-urilor intalnite am renuntat la ideea controlului prin Internet. In schimb am reusit sa controlam prin LAN. Astfel am realizat in C# 2 aplicatii, una pentru server UDP si alta pentru client. Dupa ce serverul este pornit, clientul se conecteaza, iar cu ajutorul interfetei din aplicatia pentru client, utilizatorul poate controla masina. In momentul in care este apasat unul din butoane, clientul trimite serverului un mesaj de forma F, L, R, S :
Rezultatul proiectului dezvoltat este in mare parte pozitiv, reusind in cele din urma sa controlam robotul de la distanta.
Ca si observatii, precizam faptul ca nu am putut folosi mbed-ul pe post de server din cauza problemelor intampinate la folosirea bibliotecilor, prin urmare am realizat cotrolul prin intermediul unui server local UDP.
Echipa 14: Studenti: [Link] Mihai [Link] Radu-Daniel [Link] Andronic Rezumat: Sistem de masurare a temperaturii si transmiterii de mesaj cu valoarea acesteia prin SMS, folosind un modem GSM de pe un telefon mobil(temperature measurement over gsm mobile). Resurse materiale: - placa de dezvoltare cu PIC876A sau ATmega83,ATmega161 sau ATmega603; - modem GSM(de la un telefon vechi-Nokia6610i) sau realizat; -senzor temperatura LM35 sau senzor temperatura Dallas DS1820 -LCD pentru afisarea temperaturii; -interfata seriala RS232; -telefon mobil pentru afisare mesaj temperatura. Resurse de timp: 35-40 de ore
Explorare documentara asupra temei: Sistem de masurare a temperaturii si transmiterii valorii acesteia prin SMS si realizare raport sintetic alternative solutie Sistemul de masurare a temperaturii poate fi utilizat in mediile industriale sau in meteorologie pentru a comunica in mod remote(de la distanta) valoarea temperaturii dintr-un anumit mediu. Acesta este alcatuit in principiu dintr-un senzor de temperatura, a carui valoare a temperaturii este citita de catre un microcontroler, care in mod general este de obicei pe 8 biti,apoi prin intermediul modemului GSM a unui telefon mobil va comunica valoarea afisata pe un ecran LCD unui alt telefon mobil cu ajutorul SMS-ului. Solutiile alternative sunt in functie de modul de comunicare cele referitoare la folosirea modulelor RF(Radio Frequency), a celor Bluetooth si a celor bazate pe modelul clientserver. Descrierea sistemului: Temperatura este un parametru fizic care este convertit intr-un parametru electric cu un dispozitiv numit traductor de [Link] mai comun traductor produce o tensiune,un curent, o capacitate sai [Link] aceste semnale trebuiesc convertite in tensiune pentru a trimite valoarea la convertorului AD. Aceasta modificare este numita semnal [Link] conditionat poate insemna poate insemna o conversie din curent in tensiune sau amplificare de [Link]-urile sunt cele mai utilizate dispozitive pentru achizitia de [Link] folosit un LCD pentru afisarea temperaturii si starea sistemului de masurare a tempera
Pentru un sistem de masurare a temperaturii exista mai multe solutii alternative, una dintre acestea este reprezentata de multitudinea de senzori destinati masurarii temperaturii. Astfel exista cel putin patru categorii de senzori destinati masurarii temperaturii: 1. Senzori analogici semiconductori; -diode; -tranzistoare; -circuite integrate specializate(termorezistente integrate sau diode cu panta imbunatatita); [Link] pasivi(necesita polarizare externa): -termistori PTC si NTC; -termorezistente; [Link] activi(nu necesita polarizare): -termocupluri; -senzori indicatori cu bimetal; [Link] inteligenti cu iesire digitala pe bus cu unu, doua sau trei fire. De asemena exista doua mari clase de metode de masurare: -masurarea temperaturii prin contact direct al senzorului cu mediul de masurat; -masurarea temperaturii fara contact cu mediul prin metode radiative. Una dintre solutiile alternative de realizare a unui sistem de masurare a temperaturii(temperature measurement over gsm mobile) este cea a implementarii cu ajutorul circuitelor integrate destinate masurarii temperaturii, cu iesire analogica. Astfel acestea corecteaza dezavantajul jonctiunilor semiconductoare..Aspectul acestor circuite integrate este identic cu al tranzistoarelor, avand impachetarea in diverse capsule de la cele subminiatura pana la capsulele standard TO_xx.Spre deosebire de diode a caror panta de variatie cu temperatura a tensiunii termice este variabila de la dispozitiv la dispozitiv, circuitele integrate au o variatie fixa de 10mV/ grad Celsius sau 25mV/grad Celsius, asigurand o tensiune de iesire proportionala cu diverse sisteme de masura a temperaturii(Celsius,Kelvin,Fahrenheit), astfel incat tensiunea de iesire este egala(cu un factor e corectie) cu temperatura masurata, pentru sistemul de masura [Link] de circuite integrate sunt:LM35 pentru iesire in sistem Kelvin, LM34(Fahrenheit),LM45(Celsius), LM50(Celsius).Si aceste circuite integrate au limitari, cea mai deranjanta este necesitatea amplificarii semnalului analogic utilizand amplificatoare operationale, pentru compatibilizarea nivelului de semnal cu intrarea convertorului AD(analog digital) al microcontrolerului.
GSM Sistemele de comunicatii mobile de tip cellular se bazeaza pe utilizarea fecventelor radio ca suport primar de comunicatii intre statiile mobile si statiile de baza. Standardul GSM (Global System for Mobile communication ) este una din normele internationale ce reglementeaza comunicatiile radio cu statiile aflate in miscare. Un sistem bazat pe standardul GSM este un sistem celular si digital. Printre avantajele utilizarii tehnologiei digitale se numara pe langa calitatea superioara asemnalului vocal, apacitatea maririi numarului de abonati cu ajutorul tehnologiilor de multiplexare in timp (cum ar fi TDMA si FDMA) siaparitia unor noi servicii: transmisii de date binare, fax, text, imagine dar si confidentialitatea transmiterilor prin codare, limitarea accesului persoanelor neautorizate prin autentificare, controlul automat al puterii emise, coduri corectoare de erori si multe altele.
[Link]
Conceptul de retea celulara a introdus doua noi concepte: acela de schimbare dinamica a frecventei de emisie a unui punct abonat mobil in timpul unei comunicatii in functie de deplasarea in retea si acela de reutilizare a frecventelor din celulele adiacente, dar care se afla la o distanta minima pentru a evita interferentele. GSM este standardul de telefonie mobil cel mai rspndit din lume, promoterul acestuia, GSM Association, estimnd c 82% din piaa mondial de comunicaii mobile folosete acest standard. Mai este cunoscut i sub denumirea de 2G (generaia a 2-a/ NMT este 1G, iar UMTS i standardele similare sunt 3G). A aprut comercial la nceputul anilor 1990 lund un mare avnt la sfritul deceniului. Este sistemul dominant n Europa. Infrastructura retelei GSM este formata din subsitemul radio, transmisiuni si OMC ( gestiune retea ).
unde: MS mobile station terminal BTS Base Transceiver Station BSC Base Station Controller OMC Operation and Maintenance MSC Mobile Switching Center HLR Home Location Register VLR Visitor Location Register PSTN Public Switched Telephone Network Echipamentele retelei GSM: BTS asigura acoperirea radioelectrica a unei celule din retea (unitate de baza pt acoperirea radio a unui teritoriu). BSC administreaza unul sau mai multe BTS (maxim 8) MSC asigura conexiunea dintre reteau de radiotelefonie si cea de telefonie publica. HLR este un registru ce contine evidenta tuturor abonatilor mobili locali
Versiunea 1 [Link]
Se foloseste un PIC 12F629. Picul 12F629 este un microcontroler de 8-Pin flash-based 8-Bit CMOS cu un oscilator +/- 1% intern de 4 MHz. Tensiunea este intre 2,0 V si 5,5 V cu un curent de100 A la frecventa de 1 MHz.. Pentru o implementare a tuturor caracteristicilor ale transmitatorului SMS picul PIC 12F629 nu are destul RAM. Un alt dezavantaj este ca programarea este in assembler si nu in C. Daca este nevoie de mai multi pini de input si output se va folosi picul PIC 16F876 . Diagrama circuitului Hardwareul pentru SMST4PIC este chiar simplu. Partea principala este un singur pic PIC 12F629 si un MAX 232 cip pentru semnalele RS232. Sunt prezente 2 leduri unul este folosit pentru alimentare si al doilea este controlat software de pic. Mai este conectat un buton pentru activare manuala si un senzor de miscare pentru acitvare automata. Circuitul are nevoie de 11,5 mA la 4,8 V.
Versiunea 2 SMST4PIC merge pe un PIC 16F876 frecventa de20 MHz ,28 pins cu 3 [Link] langa detectorul de miscare exista mult mai multe posibilitati pentru a conecta cperifericele ca in exemplul precedent. Conexiunea seriala RS232 este produsa de is PIC USART cu o rata de transmisie de date mult mai mare decat vechea solutie with. Un senzor de temperatura conectat (DS 1620) poate fi folosit ca sa obtinem temperatura . A 2 * 16 caracter LCD display (HD44780 compatibil) ofera o interfata improvizata. Picul poate fi activat si dezactivat prin sms si poate receptiona si trimite smsuri. Versiuni alternative Trimiterea temperaturii de pe o placa arduido pe un server de internet [Link]
Trimiterea temperaturii prin modulul Zigbee [Link] Termometru Bluetooth [Link] Realizare ciorna solutie Familia de senzori inteligeni de temperatur produi de Dalas Semiconductors este extrem de bogat. Am ales sa lucram cu senzorul de temperatura: DS18S20 cu ieire pe bus cu un singur fir Parametrii DS18S20 -temperatura -55C+125C -rezoluie/precizie: 9bii/0.5C sau 0.1C -trigger alarm: da
-comunicaie 1 fir: data bidirecionala -autonclzire: nu -cod serial unic: da 64 bii -alimentare 3V5.5V -capsula TO92, SOIC Senzorul de temperatura DS18S20 are un trigger de alarmare cu dou nivele (HI i LO) pentru valori prestabilite de utilizator. Senzorul trebuie s fie conectat n permanen cu microcontrolerul. Precizia de msur cu calibrare iniial este de 0.5C ns poate fi crescut la 0.1C cu nite artificii destul de complexe. DS18S20 msoar temperatura numrnd impulsurile de tact generate de un oscilator cu un coeficient de temperatur cobort, care trec printr-o poart logic comandat de un oscilator avnd un coeficient de stabilitate termic ridicat. Numrtorul corespunztor oscilatorului a crui frecven este variabil cu temperatura, este presetat cu o valoare ce corespunde unei temperaturi de 55C. Dac numrtorul atinge valoarea 0 nainte de terminarea perioadei n care poarta las s treac impulsurile, registrul de temperatur (presetat i el la 55C) este incrementat, indicnd creterea temperaturii. Acelai numrtor este ncrcat cu valoarea determinat de registrul acumulator al amplificrii, care compenseaz neliniaritatea de tip parabolic a dependenei frecvenei oscilatorului cu temperatura prin schimbarea numrului de impulsuri necesar pentru ca numrtorul s fie incrementat cu un grad (coninutul numrtorului fiind n uniti de temperatur). Pentru a obine rezoluia dorit este nevoie ca ambele valori ale numrtorului i ale acumulatorului s fie cunoscute pentru o temperatur dat. Astfel registrul accumulator conine o informaie de nalt rezoluie a temperaturii msurate, care poate fi citit i utilizat la compensarea prin metode numerice a rezoluiei de ieire, de la 0.5C la 0.1C. Pentru rezoluia de 0.5C acest calcul este fcut automat n interiorul senzorului. Temperatura rezultat este extras n format complement fa de 2, pe doi octei pentru DS18S20: DS18S20 Temperatura +125C +25C +0.5C +0C -0.5C -25C -55C ieire binar 0000_0000_1111_1010 0000_0000_0011_0010 0000_0000_0000_0001 0000_0000_0000_0000 1111_1111_1111_1111 1111_1111_1100_1110 1111_1111_1001_0010 ieire hexa 00Fah 0032h 0001h 0000h FFFFh FFCEh FF92h
Pentru DS18S20 data poate fi citit sau scris ca dou cuvinte de 8 bii pentru care primii 7 bii ai octetului de semn sunt ignorai. Ecuaia ce permite obinerea rezoluiei nalte de msur, aplicabil senzorului este: temperature= temp_read - 0.25+ count_per_c_count_remain/count_per_c Unde: temp_read este valoarea de temperatur ce apare n tabelul de mai sus dar care este trunchiat la 0.5C (se pierde un LSB), count_remain este valoarea numrtorului dup blocarea porii logice i poate fi citit cu comanda READ COUNTER, count_per_c este valoarea existent n acumulator i poate fi citit cu comanda READ SLOPE. Formatul acestei ecuaii nu este cel mai fericit pentru algoritmul matematic ce se poate implementa cu PIC, motiv pentru care trebuie puin rearanjat ntr-o form care poate fi mult mai folositoare: temperature = temp_read + 1/2LSB - count_remain/count_per_c.
Figura 1- Principul de msur a temperaturii utilizat n DS18S20 Arhitectura intern a lui DS18S20 este ascuns n spatele unui scratchpad (fig. 2) (matrice de memorie reinscriptibil ) fiind identic cu cea descris n fig. 1.
Fig. 2- Schema bloc a senzorului de temperatur DS18S20 Blocul de alimentare cu tensiune parazit, fur energie de alimentare din semnalul ce se vehiculeaz pe intrarea/ieirea de date DQ cnd aceasta se gsete n stare logic high. Condensatorul intern Cpp se ncarc n acest moment i menine tensiunea de alimentare cnd DQ este low. Desigur c opiunea de alimentare de la o surs exterioar rmne valabil, ns sunt situaii cnd alimentarea cu doar dou fire este benefic, n detrimentul utilizrii unui software mai complicat.
Deoarece nscrierea datelor din scratchpad n eeprom consum cca. 1.5mA, este necesar utilizarea unei rezistene de pull_up suficient de mici pentru a asigura acest curent cnd au loc operaii interne de conversie sau scriere n eeprom. Pentru a putea conecta mai multe dispozitive pe acelai bus este nevoie de un mijloc de identificare a senzorului a crui temperatur se citete. Codul ROM de 64 de bii realizeaz acest lucru. El se compune din: |(MSB) 8 bit CRC |48 bit numr de serie |8bit codul familiei[10h] (LSB)| Microcontrolerul trebuie s recalculeze CRC-ul i s-l compare cu valoarea memorat n senzor utiliznd generatorul polinomial din figura urmtoare, algoritmul fiind implementat n funcia d1w_read_byte_with_CRC:
Fig. 3-Generatorul polinomial de refacere al CRC Memoria scratchpad are 8 octei (fig. 5).
Fig. 4- Iniializarea DS18S20 Iniializare: secven de pulsuri transmis pe bus de master urmat de prezena pulsurilor transmise de slave (fig. 4) Comenzi ROM, opereaz cu codul unic de 64 bii: Search ROM [F0h] identific numrul de sclavi conectai la bus i tipul acestora Read ROM [33h] citete codul de 64 bii pentru un singur senzor existent pe bus Match ROM [55h] comanda, urmat de 64 bii (adresa sclavului)permite masterului s adreseze un sclav specific
Skip ROM [CCh] n urma acestei comenzi, masterul adreseaz toi senzorii conectai pe bus. Pentru un singur senzor prezent pe bus, urmtoarea comand trebuie s fie Read Scratchpad. Alarm Search [ECh] comand similar cu Search ROM, va rspunde doar sclavul cu bitul de alarm setat.
Fig. 5 - Coninutul memoriei scratchpad; LSB conine valoarea temperaturii iar MSB semnul acesteia Comenzi funcionale (comenzi de citire-scriere i iniiere a conversiei): Convert T [44h] iniiaz o singur conversie de temperatur. Rezultatul este scris n cei doi regitrii: temperature LSB i tempearature MSB. Dac senzorul se gsete n modul cu alimentare parazit, PIC-ul trebuie s asigure o rezisten de pull-up suficient de sczut, cel puin 10uS dup primirea comenzii. In modul de alimentare cu surs extern, DS18S20 va rspunde trimind 0 pentru o conversie de temperatur aflat n progres, respectiv 1pentru o conversie terminat. Write scratchpad [4Eh] doi bii sunt scrii n scratchpad, primul n TH i al doilea n TL, LSB este trimis primul. Read scratchpad [BEh] Masterul citete coninutul scratchpad-ului pornind cu octetul 0 LSB i terminnd cu octetul 9. Copy scratchpad [48h] regitrii TH i TL sunt copiai n eeprom, necesit cel puin 10uS de pull-up suficient de redus. Recall [E2h] citete TH i TL din eeprom i i rescrie n scratchpad, DS18S20 transmite 0 ct timp aciunea este n desfurare i 1 dup terminarea acesteia. Read power supply [B4h] comand utilizat pentru detectarea senzorilor de pe bus ce folosesc modul de alimentare parazit. Pe durata read time slots bus-ul va fi, fie n stare low (stare generat de senzorii alimentai parazit) fie high (stare generat de senzorii cu alimentare independent) conform fig. 6. Este important lungimea bus-ului i valoarea rezistenei de pull-up care poate fi modificat n limite largi (1k54k7). Productorul recomand creterea curentului de pull-up prin scderea rezistenei n timpul conversiei sau al scrierii n eepromul intern al senzorului.. Testarea bus-ului, citirea i scrierea pe bus, trebuie fcute conform cu marjele de timp impuse de time slot. Orice pin al portului B al PIC-ului, cu setarea corespunztoare din registrul OPTION poate reduce valoarea rezistenei externe prin conectarea n paralel cu aceasta a rezistenei de pull-up interne PIC-ului.
Fig. 6 - Intervalele de timp obligatorii pentru citire i scriere n DS18S20 (read-write) Graficul din fig.4-35 poate fi completat cu doar cteva cuvinte: 1. Timpul este diferit la scrierea unui 1 logic de ctre PIC sau sau a unui 0 logic de ctre DS18S20 pe bus; Pic-ul iniiaz ambele tipuri de scriere/citire prin trecerea bus-ului n 0 logic pentru cel puin 1uS: Write 1 = iniializarea scrierii i eliberarea bus-ului (bus-ul n 1 logic) timp de 15uS Write 0 = iniializarea scrierii i meninerea bus-ului n stare 0 logic timp de 60uS Read 0 sau read 1 = iniializarea citirii i eliberarea bus-ului. DS18S20 va ncepe transmisia unui 1 (las bus-ul liber) sau 0 (trage bus-ul la mas). Datele scrise pe bus sunt valide doar 15uS dup frontul cztor al semnalului de iniializare, de aceea PIC-ul trebuie s elibereze bus-ul i s citesc starea acestuia n primele 15uS de la generarea time slot-ului. 2. Fereastra de scriere n DS18S20 are loc dup 15uS de la iniierea scrierii i poate dura pn la 60 uS [Link] minim la scriere/citire este pentru orice situaie minimum 60uS, cu o durat de revenire ntre dou scrieri de minim 1uS.
Fig. 10 Interfatarea unui microcontroler cu mai multi senzori de temperatura folosind protocolul 1- Wire
Fig. 11- Circuitul modului de folosire in mod parazitar a protocolului serial 1-Wire de interfatare
Fig. 12 Schema de conectare a microcontroller-ului PIC16F628 cu doi senzori de temperatura DS18S20 Pentru comunicatie vom folosi modulul GSM de la un telefon Nokia 6610i. Pentru conectarea acestuia la placa de dezvoltare vom folosi modulul de comunicatie RS232.
Acest port contine semnale pentru handsfree, microphone, boxe stereo, FBus Rx/Tx sau semnale USB, powet output pentru a alimenta accesoriile ce nu au baterii proprii conform tabelei de mai jos.
Valorile senzorului de temperatura sunt citite folosind convertorul ADC disponibil pe placa de dezvoltare, comunicare cu modemul GSM se face prin interfata seriala, folosind comenzi specifice (comenzi AT). [Link]
Raport final
[Link]+rezumat: Sistem de masurare a temperaturii si transmiterii de mesaj cu valoarea acesteia prin SMS, folosind un modem GSM de pe un telefon mobil(temperature measurement over gsm mobile). [Link] solutie:Am ales sa realizam acest sistem de masurare a temperaturii si transmiterii a unui mesaj prin SMS, la un telefon mobil, folosind un modem GSM, cu ajutorul microcontrolerului PIC16F876A si a placutei utilizate anul trecut la disciplina Proiectare cu [Link] realizarea placutei am urmat urmatoarea schema electronica pentru conectarea microcontrolerului PIC16F876A:
Drept senzor de temperatura am folosit unul de la Microchip, TC1047A, un senzor liniar de temperatura, a carui tensiune este direct proportional cu temperatura si care are gama de masurare cuprinsa intre -40 si +125 grade Celsius si care are tensiunea de iesire la temperatura de 0 grade Celsius, de 500mV si la temperatura de +25 grade Celsius, de 750mV. Conectarea senzorului de temperatura la microcontroler am facut-o ca in figura urmatoare:
Ca modem GSM am folosit unul produs de compania Siemens, pentru modelul de telefon Siemens MC 55i, ca acesta din imaginile urmatoare:
[Link] de implementare: Pentru conectarea acestuia la placa de dezvoltare vom folosi modulul de comunicatie RS232.
Acest port semnale handsfree, boxe stereo, sau semnale output pentru accesoriile ce proprii tabelei de mai
contine pentru microphone, FBus Rx/Tx USB, powet a alimenta nu au baterii conform jos.
[Link] sarcinilor a. Studiul GSMului cu terminalul Trandafir Andronic //trimite msg conectat la pc prin terminal cu baudrate 19200 AT OK//returneaza AT+CMGF=1 OK//returneaza AT+CMGW="+85291234567" > Mesaj ctrl+z +CMGW: 1//returneaza //respinge apelul ATH OK//returneaza //reseteaza la instructiunile din fabrica AT&F OK//returneaza Codul: #include<htc.h> #define WaitFor1Us asm("nop"); asm("nop") #define Jumpback asm("goto $ - 3")
#define RS RB4 #define EN RB5 #define LCD PORTB #define VALIDARE ((EN=1),(EN=0)) unsigned char c[5]; unsigned char i=0; unsigned char nrTelefon[11]="40753933926"; unsigned char length; unsigned char delayus_variable; #define DelayUs(x) { \ delayus_variable=(unsigned char)x; \ WaitFor1Us; } \ asm("decfsz _delayus_variable,f"); \ Jumpback; void DelayMs(unsigned char cnt) { unsigned char i; do { i = 4; do { DelayUs(250); } while(--i); } while(--cnt); }
//Mihalceanu Daniel void InitAdc() { TRISA=0X07; ADCON0=0X81; ADCON1=0XC0; } unsigned int ReadAdc() { volatile unsigned int v; GO=1; while(!GO); v=ADRESL; v+=(ADRESH<<8);
return }
v;
void Temp() { int temp,val; val=ReadAdc();//receptioneaza valoarea citita de pe ADC temp=((val*4.9)-500)/10;//calculeaza temperatura c[0]=temp/10;//pune intr-un char prima cifra a temperaturii temp=temp%10; c[1]=temp;//pune intr-un char a doua cifra a temperaturii for(i=0;i<2;i++) { TransmiteSerial(c[i]+48);//transmite gsmului valorea temperaturii transformata in codul ascii } TransmiteSerial(0x1A);//transmite ctrl+z }
//Trandafir Andronic void InitializareSerial() { SPBRG=64; //19200 baud BRGH=1; //high speed SYNC=0; //modul asincron SPEN=1; //activare port serial TXIE=0; TX9=0; TXEN=1; RCIE=0; RX9=0; CREN=1; } unsigned char ReceptieSerial()//receptioneaza un char pe seriala { unsigned char x; //dezactivare intrerupere USART la transmisie //transmisei pe 8 biti //activare transmisie //dezactivare intrerupere USART la receptie //receptie pe 8 biti //activare receptie
while(!RCIF);//asteapta pana cand se receptioneaza un caracter x=RCREG;//se memoreaza valoarea acelui caracter return x; } void TransmiteSerial(unsigned char chr)//transmite un char pe seriala { while(!TXIF); TXREG=chr; } void ScrieS(const char *sir)//scrie un sir char pe seriala { while(*sir) TransmiteSerial(*sir++); } //Lupuleasa Mihai void mesaj(char flag)//transmiterea instructiunilor gsmului { switch(flag) { case 1: { char text[]="AT+CMGF=1";//memoreaza mesajul in text const char *sir=&text;//pune pointerul sir la adresa lui text ScrieS(sir);//transmite sir TransmiteSerial(13);//transmite carriege return DelayMs(200); break; } case 2://transmite numarul de telefon { unsigned char k=0; char text[]="AT+CMGS=+"; const char *sir=&text; ScrieS(sir); for(k=0;k<11;k++) { TransmiteSerial(nrTelefon[k]); } TransmiteSerial(13); DelayMs(200);
break; } case 3://transmite mesajul { char text[]="Temperatura camerei este: "; const char *sir=&text; ScrieS(sir); break; } case 4://transmite comanda ath { char text[]="ath"; const char *sir=&text; ScrieS(sir); TransmiteSerial(13); DelayMs(200); break; } } } void ReceptieGsm() { unsigned char ch; ch=ReceptieSerial();//asteapta pana cand suna un numar de telefon mesaj(4);//transmite instructiunile mesaj(1); mesaj(2); mesaj(3); Temp();//transmite temperatura DelayMs(200); DelayMs(200); DelayMs(250); DelayMs(250); } void main (void) {
Echipa 15: Studenti: 1. Harja Adrian 2. Dumitrescu Bogdan 3. Strat Andrei 4. Pavel Bogdan Rezumat: Masurarea temperaturii dintr-o incapere folosind 2 microcontrolere. Metoda 1: Termometru cu alerta email prin modem Prin aceasta metoda se verifica temperatura si se trimite situatia prin email sau sms. La o anumita perioada de timp acesta trimite o notificare cu informatiile preluate folosind email sau sms prin reteaua GSM (in caz ca accesul la internet nu functioneaza). Senzorul masoara
semnalul din mediu, un semnal analog, iar microcontrolerul va trebui sa converteasca acest semnal analog in semnal digital, pentru a-l transmite mai departe prin modem. Transmiterea informatiilor prin modem Scopul este de a construi un modem simplu pentru a transmite informatiile preluate de la senzorul de temperatura. Suplimentar: Se poate programa sa se trimita un email automat atunci cand anumite conditii sunt indeplinite. Folosind modulul GSM se transmite informatia la un anumit numar printr-un SMS standard. Mesajul SMS poate fi convertit intr-un email si trimis mai departe. Sistemul poate trimite si SMS si email. Sistemul evita problemele TCP/IP . Valorile primite de la senzorul de caldura vor fi transmise pseudo asincron printr-un puls de sincronizare primul bit este cel de paritate, apoi urmand cei 8 biti. Astfel avem o toleranta mai mare la erorile de transmitere. Cand un bit este primit de la senzorul de temperatura, transmitatorul incepe sa trimita secventa.
Metoda 2: O alta metoda ce ar putea fi aplicata in cazul de fata ar incorporarea tehnologiei wirlesess in locul celei cu fir. Exista in acest sens mai multe tehnologii disponibile: infrarosu, bluethooth, ZigBee. Comunicatia in infrarosu este totusi neavantajoasa deoarece ea se bazeaza pe cel mai simplu tip de legatura wireless: punct-la-punct, adica transmitatorul cat si receptorul trebuie sa se vada reciproc, deci sa existe o cale neopturata. [Link]
Comunicatia cu bluethooth - este un standard ce se aplica pe distante mai mari decat in cazul comunicatiilor in infrarosu. Acest sistem este cel mai bun atunci cand distanta dintre emitator/receptor este scurta, rata de transfer mare, iar puterea consumata cat mai mica. Raza
poate varia de la 1m la 100 m. Bluetooth reprezinta o tehnologie pentru distante scurte cu costuri reduse, vizand crearea unor retele personale PAN.
ZigBee se aseamana destul de mult cu tehnologia Bluetooth amandoua fiind incadrate in standardul IEEE 802.15 wireless PAN. Amandoua ruleaza la frecventa de 2,5 GHz si amandoua folosesc putere redusa.
Metoda 4 Comunicatie client server: Implementare in Java [Link] [Link]/~epopescu/teaching/DNAD/[Link] Implementare in C# [Link]
Metoda 5 Implementarea termometrului folosind comunicatia seriala cu PIC 16F Metoda aleasa este a 5- a datorita simplitatii implementarii si a unor resurse deja existente. Solutia este avantajoasa deoarece poate fi implementata oriunde exista internet deci cele 2 microcontrolere pot se pot afla la distante foarte mari. Metodele 1 si 2 desi sunt portabile sunt mai greu de implementat si costurile mai mari.
Partea a doua - Solutia Resurse: - senzor temperatura - display - 2 placi de dezvoltare SBC cu PIC16F - cablu serial - conexiune internet Resursa timp: 40 ore Metoda aleasa - constructia termometrului folosind comunicatia prin seriala cu PIC16F. Masurarea temperaturii din camera folosind comunicatia prin seriala. Vom folosi 2 placi de dezvoltare SBC cu Pic16F. Pe una din placi se monteaza senzorul de temperatura Dallas DS1820(-55C , +125C) iar pe cealalta placa se monteaza un display pe 2 digiti. Placa se conecteaza prin seriala RS232 la un calculator. La o anumita perioada de timp acesta trimite o notificare cu informatiile preluate. Mai precis senzorul masoara semnalul din mediu, un semnal analog, iar microcontrolerul va trebui sa converteasca acest semnal analog in semnal digital, pentru a-l transmite mai departe catre un calculator. Acesta, folosind program clinetserver, va transmite informatiile catre alt calculator. Informatia primita de celalalt calculator va fi trimisa celeilalte placi ce contine display-ul pe care se va afisa temperatura.
Acest termometru ar putea fi folosit pe post de alarma, impunand un interval de temperatura si daca se depaseste acest interval, atunci se va trimite o notificare pentru a se lua masuri. Pentru a masura temperatura negativa vom avea nevoie de o sursa de voltaj negativa. Exemplu: Sa presupunem ca temperatura din mediu este 26.4 grade Celsius. Senzorul va prelua valoarea 264 mV (0.264 V). ADC va trimite 0.264/0.001168=226. Astfel putem afla temperatura folosind factorul de scalare al senzorului(10 mV/grad C) si valoarea de la ADC: Temperatura = 226*0.001168/0.01=26.4 grade C. Comunicatia client server se face cu ajutorul programului Hercules SETUP utility care ia informatia de pe seriala si cu ajutorul unui server client si trimite la celalalt calculator care preia informatia in acelasi mod si o trimite pe seriala la cealalta placuta SBC876 care trimite semnalul catre Bytedisplay. [Link] Senzorul de temperatura se conecteaza la placa SBC876 cu PIC16 ca in figura de mai jos.
Detalii implementare senzor de temperatura (parte hardware si software): Harja Adrian, Strat Andrei Implementare hardware: Pentru implementarea acestei etape am folosit un sezor de temperatura Dallas DS1820. Acesta masoara temperatura intre -55 si +125 C avand o acuratete de +-0.5C in intervalul [-10,+85]. Senzorul contine 3 pini (Ground, VCC si pinul Data I/O). Mai jos este afisata descrierea integrala a pinilor:
Senzorul contine in total 8 pini dar numai cei 3 mentionati anterior sunt folositi. Am folosit de asemenea o rezistenta intre Data I/O si alimentare. Pinul Data I/O a fost conectat la pinul 5 de la PortC al placii SBC 876A.
Senzorul ia datele din exterior si le afiseaza in format ASCII, date ce vor fi transmise mai departe prin internet pentru a fi afisate pe byte dispaly-ul continut de cealalta placa SBC 876A. Acest lucru se realizeaza cu ajutorul programului Client-Server Hercules. Senzorul trimite la modulul TCP Server al programului datele ce vor fi incarcate intr-un fisier folosind o aplicatie a programului numita Log File. Mai jos este afisat un tabel in care sunt afisate relatii dintre temperatura si date:
Implementare software- Functia principala este descrisa mai jos: void main(void) { const char* senzor="DS1820"; // int temperatura=0; OPTION=0xFF; CLRWDT(); Initializare_USART(); while(1) { temperatura=ReadTemp(); if (temperatura==-1) { putstr("Eroare de comunicatie sau senzor defect"); putcar(10); } else { // } } } Detalii implementare ByteDisplay (soft si hard): Pavel Bogdan si Dumitrescu Bogdan: ByteDisplay-ul este format din 2 digiti, fiecare digit contine 10 conexiuni pentru activarea ledurilor de la A la G cu care se realizeaza combinatiile cifrelor. Pentru afisarea pe ByteDisplay il putint(temperatura); DelayS(10);
conectam la o placuta SBC876 cu un procesor PIC16F. Pentru receptia datelor se foloseste PortB al placii care trimite datele catre ByteDisplay. Fiecare digit este activat cu pinii RC0 si RC1 de la PortC. Afisarea temperaturii pe ByteDisplay se face in modul urmator: for(;;) { ch=ReceiveUSART();//receptionez caracterul bun=ch-'0'; ch1=ReceiveUSART(); bun=bun*10+ch1-'0'; afisare(bun,500); } Functia ReceiveUSART() preia datele de pe Seriala in modul urmator: unsigned char ReceiveUSART() //Rutina pt receptia unui octet de la portul serial { unsigned char c; while(!RCIF); //asteapta pana se incheie receptia c=RCREG; //octetul receptionat este preluat din RCREG return c; } Functia de afisare pentru ByteDisplay: void afisare(unsigned char nr, int x) { int i=0; for(i=0;i<x;i++) { if(nr<10) PORTB=0xFF; else PORTB=~cifra[nr/10]; dig2=0; dig1=1; DelayMs(2); PORTB=0xFF; dig2=0; dig1=0; DelayUs(20); dig2=1; dig1=0; PORTB=~cifra[nr%10]; DelayMs(2); //executia programului se repeta in continuu
PORTB=0xFF; dig2=0; dig1=0; DelayUs(20); } } Acesta este conectat prin seriala la un calculator cu conexiune internet care primeste datele de la un TCP Client care comunica cu un TCP Server de pe alt calculator. Clientul se conecteaza la Server introducand modul IP al Serverului si Portul la care acesta asculta. Clientul citeste in timp real datele dintr-un fisier cu aplicatia LogFile unde Serverul folosind aceasi aplicatie scrie datele pe care le primeste de la Server.
Echipa 16: Studenti: 1. Macovei Catalin 2. Belciugan Laurentiu Rezumat: Proiectul reprezinta un sistem pentru autovehicule ce detecteaza un accident si face apel automat la 112. In cazul unui accident trimite un SMS cu locatia autovehiculului, numarul de pasageri, locatia GPS, tip autovehicul, stare autovehicul, etc. Din resurse mentionam urmatoarele: accelerometru, modul GPS, modul GSM, MBED sau SBC876. Alternative solutie: BMW Assist Advanced eCall [Link] HeERO - Harmonised eCall European Pilot [Link]
Propuneri solutie: Sistemul este compus din doua parti, un modul ce se afla in interiorul automobilului si un modul receptor. Componente modul autovehicul:
platforma mbed sau SBC876 modul GSM modul GPS accelerometru Componente modul receptor: modul GSM PC Valorile accelerometrului sunt citite folosind convertorul ADC disponibil pe platforma mbed, comunicatia intre modulul GPS si modemul GSM se face prin interfata seriala, folosind comenzi specifice, cum ar fi pentru modemul GSM comenzi AT. In prima figura se prezinta schema bloc a sistemului de pe autovehicul.
In prezent exista un sistem implementat in unele tari din Europa, numit eCall, si de catre unii producatori auto. Se doreste pana in 2015 introducerea unui astfel de sistem in toata Uniunea Europeana.
Transmisia datelor prin SMS Pentru a transmite informatiile si datele dorite prin intermediul unui SMS se foloseste un modem GSM. Unele telefoane mobile de generatie mai veche au aceasta facilitate incorporate. Ca inlocuitor pentru modem GSM am folosit un model de telefon, Siemens C60, ce ofera utilizatorilor posibilitatea de a se conecta la acesta, iar prin intermediul unor comenzi se pot trimite sms-uri, apela numere de telefon, stocare mesaje si alte functii. Conexiunea fizica intre microcontroller si telefon se realizeara prin interfata USART, folosit pinii RX, TX, GND. In figura 1 este prezentata configuratia pinilor telefonului, iar functiile pinilor sunt:
2 GND
3 TX 4 RX
Urmatoare figura prezinta o schema generalizata de conectare intre microcontroler si telefon, precizand doar conexiunile esentiale. Dioda zenner de 3,3V are rolul de a scade nivelul de tensiune de 5V a semnalelor de la microcontroler la valoarea de 3.3V, pentru a fi compatibil cu telefonul, respective montajul cu transistor are rolul invers, de a converti semnalele de 3.3V de la telefon in 5V.
Comenzile folosite sunt urmatoarele cu descrierea lor: ATE0 pentru dezactivarea ecoului AT+CMGS= - comanda ia ca valoare dupa egal lungimea codului PDU, valoare calculate ulterior. Pentru a trimite mesaje text folosind acest tip de telefon, mesajul propriu-zis trebuie convertit in cod PDU, atasand la acesta un header. In ftabelul urmator este explicat modul de codificare, inca re mesajul folosit ca exemplu pentru aceasta descriere este AB, iar intregul cod este 07910447946400F011000A8170751284070000A8024121
07 91 0447946400F0
Lungime informatie centru sms (SMSC), in acest caz 7 octeti Tip numar telefon SMSC, in acest caz international Numarul de telefon centru mesaje Orange , format astfel: se iau grupe de cate 2 cifre si se inverseaza intre ele, numarul real fiind +40744946000 Primul octet al mesajului
11
00 0A 81 7075128407 00 00 A8 02 4121
TP-mesaj referinta Lungimea numarului telefon al destinatarului, in acest caz 10 cifre Tip numaru de telefon al destinatarului, in acest caz local Numar telefon destinatar, format asemanator ca cel al SMSC Indentificator protocol Schema codificare date Validitate mesaj, in acest caz 1 zi Lungimea efectiva a mesajului de trimis, 2 caracter in acest caz Codurile PDU al mesajului AB, 41=A, 21=B.
Pentru a converti un text din format ASCII in cod PDU, se foloseste urmatorul algoritm. Primul septet este convertit in octet adaugand cel mai putin semnificativ bit de la cel de-al doilea septet. Acest bit este eliminate. Pentru al doilea character sunt necesari 2 biti, cei mai putini semnificativi.
Accelerometru folosit este un model cu 2 axe, MMA3201, cu 2 axe ce poate masura acceleratii pana la 40G. Accelerometru furnizeaza o tensiune functie de acceleratia la care este supus, valoare ce poate creste sau scade fata de o valoare de referinta, in acest caz aceasta valoare de referinta este de 2.5V (Vcc/2), reprezentand 0G. Pentru o crestere cu 1G acceleratiei pe una din axe, aceasta valoare creste cu 50mV (aceasta fiind sensibilitatea accelerometrului, 50mV/G). Pentru o decelerare aplicata de -1G, valoare rezultata la iesire este de 2.5V 50mV.
Pentru achizitoinarea datelor s-a folosit convertorul analog-digital, intre aceste doua dispositive intercalandu-se cate un filtru trece-jos pentru fiecare iesire, pentru a filtra semnalele de inalta frecventa ce ar putea veni de la accelerometru. La trecerea valorii de 0G, microcontrolerul incepe sa ia esantioane ale semnalului provenit de la accelerometru pentru o perioada de cateva sute de milisecunde, pentru a preveni declansarea si trimiterea sms-ului la aparitia unui spike a semnalului citit, ce poate sa apara datorita unor perturbatii. Cand a detectat semnalul este stabil, se calculeaza valoarea, se stabileste pe care din axe a avut loc acceleratia/decelerarea, si se trimite un mesaj functie de aceste date.
Echipa 17: Studenti: 1. Agapi Ioana 2. Manole Diana 3. Ariciuc Razvan Rezumat: : Controlarea unui robot folosind un telefon mobil care apeleaza alt telefon conectat la robot. Astfel robotul va putea sa se deplaseze (inainte, stanga, dreapta si inapoi). Resurse:. 1. 1xPlaca de dezvoltare SBC 876A cu 1xPIC 16F876A.(doar pentru programare pic) 2. 1xMasinuta de anul trecut de la PM 3. 2xRezistente 100k 4. 2xRezistente 10k 5. 1xRezistenta 330k 6. 2xCondensatori 0.1 mF 7. 4xCondensatori 22 pF 8. 1xOscilator 3.57 MHz 9. 1xOscilator 12 MHz 10. 1xDecodor CM 8870 11. 1xDriver L7805 CV 12. 3xDioda 4007 13. LED+rezistente (diverse pentru testare in timpul proiectarii si feedback) Resursa timp : 40 ore
Raport de documentare (etapa 2) Variante alternative monitorizare temperatura de la distanta Varianta 1: Controlare robot prin semnale radio (Bluetooth,RF)
Fig 1. Robot controlat prin radio [Link] Varianta 2: Controlare robot prin internet.
Ce voi/m implementa!
(etapa 3)
Vom incerca sa controlam un robot folosind un mobil care apeleaza un alt mobil atasat de robot. In cursul unui apel, daca orice buton este apasat un ton este receptionat la celalalt capat, ton numit Dual Tone Multiple Frequency ( ton DTMF). Robotul primeste aceste tonuri cu ajutorul telefonului atasat de el. Aceste tonuri sunt procesate de un microcontroler ajutat de un decodor DTMF CM8870. Decodorul decodeaza tonurile primite si trimite un echivalent binar al acestuia microcontrolerului. Microcontrolerul este programat pentru a da un raspuns driverului la motorul L293D care va ghida cele 2 motoare servo conectate la el. Deasemeneal este programat sa ia o decizie pentru orice intrare si iesire la driverul motor ca acesta sa conduca motoarele inainte, inapoi, stanga sau dreapta. Mobilul care face apelul joaca rolul unui dispozitiv de la distanta (ex. o telecomanda). In final cele 2 motoare vor actiona in functie de tastele apasate de pe telefon. Robotul folosit este masinuta realizata anul trecut la Proiectare cu Microprocesoare. Vom folosi placa de dezvoltare SBC 876A pentru a putea programa PIC16F876A. Picul astfel programat va fi folosit pe o alta placa de dezvoltare, care va decoda semnalele transmise.
PIC16F874A
Fig 4. Driverul DTMF CM8870 Semnalul DTMF este folosit pentru telefonumicatii peste liniile de telefonie analogice in frecventa benzii de voce intre telefoanele mobile si alte dispozitive de comunicatii si panourile de control. Versiunea de DTMF folosita pentru apelurile tonurilor de telefon este cunoscuta ca si Touch-Tone. Ca o alta metoda de trimitere de semnale, tonurile DTMF erau deasemenea folosite de televiziunile prin cablu pentru a indica timpul de start si stop a punctelor de inserare comerciale locale in timpul pauzelor. Pana sa se dezvolte alte echipamente de transmitere de semnale, semnalele DTMF puteau fi auzite in timpul pauzelor comerciale a canalelor de televiziune.
Event Busy
Low Freq.
High Freq.
480 Hz
620 Hz
350 Hz 440 Hz
Fig 6. Frecventele evenimentelor DTMF
440 Hz 480 Hz
Tastatura telefonului Tastatura telefoanelor contemporane este prevazuta intr-o grila de 3x4, chiar daca tastatura originala a DTMF-ului a avut o coloana aditionala pentru 4 taste care acum sunt bagate in meniu. Cand este folosit pentru a forma un numar de telefon, apasarea unei singure taste va produce 2 tonuri pure de frecvente sinusoidale in mod simultan. Randul in care apare tasta apare determina o frecventa joasa si coloana o frecventa inalta. De exemplu, apasand tasta 1, va rezulta un sunet compus din 697 si 1209 Hz per ton (fig. 5). Tastele originale aveau inauntiu parghii, deci orice buton activeaza 2 contacte. Tonurile multiple sunt motivul apelurilor de sisteme cu multifrecvente. Aceste tonuri sunt decodate de un centru de comutare care determina ce fel de tasta a fost apasata.
Tonurile #, *, A, B, C si D Inginerii si-au imaginat telefoanele fiind folosite pentru a accesa calculatorul, si chestiona un numar de companii pentru a vedea ceea ce ar avea nevoie pentru acest scop. Acest lucru a condus la aditionarea unui numar de semnal (#) si asterisk sau steluta (*) , la fel ca si un grup de taste pentru selectariea meniului: A, B, C si D. In final, literele tastelor au fost inlaturate de la cele mai multe telefoane si multi ani dupa aceasta, aceste taste au devenit larg folosite pentru servicii vericale de coduri ca *67 in US si Canada pentru a suprima ID-ul apelantului. Diagrama circuitului:
Descrierea circuitului: Cele mai importante componente ale robotului sunt decodorul DTMF, microcontrolerul si driverul pentru motor.
Folosim un decodor DTMF din seria CM8870. Toatae tipurile din seria asta foloseste tehnologii de numarare digitale pentru a detecta si decoda toate cele 16 perechi de tonuri DTMF in coduri de output pe 4 biti. Cand semnalele de intrare sunt trimise la pinii 1( IN+ ) si 2( IN- ), un input diferential de configurare este recunoscut ca fiind eficient, semnalul corect de decodare a celor 4-biti al tonurilor DTMF este transferat la iesirile pinilor de la 11 la 14. Pinul 11 pana la pinul 14 a decodorului DTMF sunt conectate la pinii microcontrolerului.
Fig 8. Corespondenta tastelor apasate Fig 8. arata corespondenta tastelor apasate. Iesirile Q1 pana la Q4 de la decodorul DTMF sunt conectate la pinii RC0 pana la RC3 de la PIC16F876A. Pentru a putea controla robotul, avem nevoie sa apelam telefonul atasat de robot (prin hands-free), de la orice alt telefon, care trimite tonuri DTMF in momentul apasarii tastelor. Se raspunde la apel prin apasarea tastei OK a telefonului atasat de robot si se trece in regim hands-free. Dupa ce a inceput convorbirea se poate apasa orice buton de pe mobilul care apeleaza pentru a executa actiunile dorite (Fig 8). Tonurile DTMF produse sunt primite pe telefonul atasat de robot. Aceste tonuri sunt legate de circuit print-o casca de Bluetooth. Decoderul DTMF decodeaza tonurile primite si trimite numarul binar echivalent la microcontroler. In concordanta cu programul pus pe microcontroler, robotul incepe sa se miste.
Fig 9. Actiunile care se realizeaza in momentul apasarii unei taste Cand construim orice robot, o mare problema mecanica o constituie cate motoare folosim. Poti avea fie o masina cu 2 roti, fie cu 4. Cea cu 4 roti este mult mai complexa, decat o masina cu 2 roti si ofera o mai buna stabilitate si un control mai optim. In schimb, o masina cu 2 roti este mai usor de construit. Aplicatii ulterioare: Aceasta masinuta poate fi implementata cum am spus si mai sus pentru 4 roti si poate servi un scop specific. Este necesar de 4 controale pentru a se plimba. Celelalte 8 pot fi configurate pentru a servi la altceva, cu mici modificari in programul sursa a microcontrolarului.
Detalii de implementare
Agapi Ioana - cercetare Cercetarea a fost facuta de mine. Initial am avut o idee in mare asupra a ceea ce vroiam sa facem, dupa care m-am documentat si am gasit o solutie cat mai buna pentru ceea ce ne-am propus. Am hotarat sa folosim decodorul DTMF (Dual Tone Multiple Frequency), deoarece
el ne poate ajuta sa decodam tonurile receptionate pe telefonul atasat de robot. Acesta este in zilele noastre folosit pentru telecomunicatii si pentru televiziune prin cablu.
Proiectul este inspirat dintr-un proiect prezentat in Electronics for You,Iulie 2008. ([Link]) Deoarece am vrut sa ne folosim de materialele de anul trecut am modificat schema hard. Schema initiala:
Schema finala (Descrierea circuitului) este cea prezentata mai sus. Am inlocuit microcontrolerul ATMEGA16 cu PIC16F876A, am pastrat driverul cu motoarele M1 si M2 plus cadrul de anul trecut. Ariciuc Razvan - implementare hard In realizarea proiectul, am luat schema finala facuta de Agapi Ioana, am incercat sa o implementez pe breadboard. Am realizat niste modificari suplimentare. (de exemplu: n-am mai folosit portile N1-N4 (NOT), eventuale inversari putand fi efectuate din cod). Handsfreeul folosit in conectarea mobilului la decodorul DTMF a fost modificat prin conectarea (-handsfree) la TIP care se conecteaza la (+circuit) iar (+handsfree) la RING care se conecteaza la (-circuit). Pe breadboardul prezentat mai apar leduri pentru feedback (leduri pentru feedback-ul transmisieri decodorului, pentru feedback de la PIC,etc), au fost folosite pentru usurarea debugului in timpul testarilor. De asemenea nu am folosit o baterie din considerente economice (dispuneam de un transformator) si nu am mai inclus butonul de reset. Motoarele au fost legate pentru a se putea folosi de puntea H a driverului L293D. M2RB3,RB2 si M1-RB0,RB1, o descriere detalitate se gaseste in Fig.11, Fig.12. Portul C este folosit ca intrare, receptionand semnale de la decodorul DTMF pe pinii RC0,1,2,3, pinii RC4,5,6,7 au fost legati la masa pentru a nu influenta valoarea citita de pe portul C (detalii in cod). Alimentarea trece printr-un divizor de tensiune 7805 pentru a asigura 5V constant catre decodorul DTM si PIC. Manole Diana - implementare soft
Taste 2 4 6 8 5
M1 1 -1 1 -1 0
M2 1 1 -1 -1 0
Fig 11. Motorul 1 Motor M2: RB3 1 0 0 RB2 0 1 0 Stare inainte Inapoi sta
Cand apesi tasta 2 (echivalentul binar 00000010) de pe telefonul mobil, microcontrolerul trimite la iesire echivalentul binar 10001001. Porturile pinilor RB0, RB3 si RB7 sunt pe high. Iesirile inalte la RB7 a driverului microcontrolului conduce driverul motorului (L293D). Pinii RB0 si RB3 conduc motoarele M1 si M2 sa mearga inainte. Similar, motoarele M1 si M2 se misca ca sa faca stanga, dreapta, se misca inapoi si se opresc ca in Fig 6.
Codul este urmatorul: #include "16F876a.h" #use delay(clock=20000000)
#fuses HS, NOWDT, NOPROTECT #define led PIN_A0 #define mov PIN_B0 #define maro PIN_B1 #define verde PIN_B2 #define gri PIN_B3 void main(void) { unsigned int x, old_x; SET_TRIS_C(255); SET_TRIS_B(0); SET_TRIS_A(0); output_b(0); /*sa se asigure ca portul b este setat pe 0*/ /*se aprinde un led pentru a vedea ca am intrat in cod*/
output_high(led);
x=input_c(); /*x primeste tasta apasata*/ old_x=x;//se retine vechea valoare in old_x pentru a se putea compara cu noua valoare la nevoie while(true) { x=input_c(); /*x primeste tasta apasata*/
if (old_x!=x) /*se pune tot portul b pe 0 pentru a nu face scurt*/ { old_x=x; output_low(mov); output_low(maro); output_low(gri); output_low(verde); delay_ms(500); } switch(x) { case 2: //2-inainte { output_low(verde);//motoru 2(RB2-0)
output_high(gri);//motorul 2(RB3-1) output_low(maro);//motorul 1(RB1-0) output_high(mov);//motorul1(RB0-1) } break; case 6: // 6-dreapta { output_low(maro); /*RB1-0*/ output_high(mov); /*RB0-1*/ output_low(gri); /*RB3-0*/ output_low(verde); /*RB2-0*/ } break; case 4: //4-stanga { output_low(mov); output_low(maro); output_low(verde); output_high(gri); } break; case 5: //STOP { output_low(mov); output_low(maro); output_low(gri); output_low(verde); } break; case 8: { output_low(mov); output_low(gri); output_high(verde); output_high(maro); } break; default: { output_toggle(led); /*se face toggle pe ledul conectat la RA0 pentru a oferi feedback din codul sursa*/ delay_ms(200); } }
} }
Secventa demo
Proiectul merge asa cum am vrut sa-l implementam. In momentul cand sunam pe telefonul mobil conectat la robot, trebuie raspuns si robotul va asculta comenzile date de celalalt telefon mobil. Acesta la apasarea tastei 2 transmite un semnal catre decodor; acesta la randul lui transmite la PIC care pune in miscare robotul sa mearga inainte. La apasarea tastei 4 robotul merge spre stanga, 5 se opreste, 6 robotul o ia la dreapta , 8 inapoi.
[Link]
Echipa 18: Studenti: 1. Pintilie Paul 2. Vatamaniuc Claudiu 3. Bozoanca Danut 4. Stogrinca Madalina Rezumat: Controlul unei centrale termica prin intermediul retelei Internet In cadrul acestui proiect ne propunem realizarea unui modul de control al unei centrale termice fara termostat. Acest modul va putea fi controlat prin intermediul unei pagini WEB. Vom implementa functii de afisare a temperaturii din diferite incaperi ale unui apartament precum si controlul centralei in functie de temperatura detectata. Resurse materiale: - SBC876 - senzor temperatura - 8led byte display - LCD display - telecomanda IR - receptor infrarosu Resurse timp: 40 ore
Rezumat sapt. a 6-a Solutii alternative: Monitorizare temperatura 6 senzori LM35 + PIC16F877A + LCD [Link] Monitorizare si control temperatura folosind LPC2210 procesor ARM7TDMIS, embedded server, senzor de temperatura digital DS18B20. [Link] Solutie monitorizare temperatura (Atmel) procesor ATMega169, termistor, display LCD. [Link] Procesor: PIC16F876A Avantaje: Pret scazut, 5 canale A/D, frecventa 20MHz, 2 iesiri PWM; Dezavantaje: Lipsa modul ethernet ==> imposibilitate implementare web server embedded. LPC2210 Avantaje: 32 bit, instructiuni Thumb (dimensiune redusa a codului), 8 canale ADC, 6 canale PWM, suporta RTOS, server web; Dezavantaje: Pret ridicat, necesitatea realizarii unei placi de dezvoltare. ATMega169 Avantaje LCD driver integrat, 4 canale PWM, 8 canale ADC; Dezavantaje: Pret usor ridicat, lipsa modul ethernet, frecventa 4 MHz, necesitatea realizarii unei placi de dezvoltare. Senzor temperatura: LM35 Caracteristici: pret scazut, range temperatura -55 - +150 grade Celsius, crestere liniara cu 10mV/grad Celsius, alimentare 4-30V, consum <60A; DS18B20 Caracteristici: pret ridicat, 1 wire communication, functie alarma, alimentare 3.0 5.5V, temperature range -35 - +125 grade Celsius, 0.5 grade acuratete intre -10 si 85 grade Celsius; Termistor Caracteristici: sensibilitate maxima, crestere neliniara ==> formula de calcul mai complexa, timp mai mare la prelucrarea datelor preluate de pe senzor.
Avand in vedere toate aspectele mentionate mai sus, vom opta pentru implementarea folosind SBC876 si senzori de temperatura LM35 pentru a avea un cost cat mai scazut pentru intregul modul dezvoltat, precum si pentru rapiditatea achizitionarii datelor prin modulul A/D. Partea software: - Server HTTP dezvoltat in Visual Studio 2010, limbaj C#, sub platforma .NET FRAMEWORK 4.0: serverul comunica cu placa SBC876 prin portul serial; el asteapta cereri de la client, apoi trimite ca raspuns temperatura masurata de senzorul de temperatura conectat la placuta SBC. Serverul returneaza o pagina HTML in care sunt afisate temperaturile, diferiti parametri, statusul centralei si controalele aferente acesteia. - Clientul se va conecta la serverul HTTP pe portul 80 de unde va afla informatiile necesare si va putea modifica ce va dori. Partea hardware: Componente necesare: -SBC876 -senzor temperatura LM35 -display LCD SC204A -receptor infrarosu TSOP4138 -telecomanda Winfast (protocol NEC) -cablu serial -telefon Sony Ericsson K300i -motor stepper bipolar Hitachi -driver motor L293D La placa SBC876 vor fi conectate urmatoarele device-uri : 4 senzori de temperatura LM35, afisajul LCD, un receptor infrarosu pentru controlul de la distanta prin intermediul unei telecomenzi, precum si telefonul Sony Ericsson K300i.
Temperatura va fi preluata prin intermediul celor 4 senzori si al modulului A/D prezent in microcontrollerul PIC16F876A, va fi afisata pe un LCD, iar utilizatorul va putea controla centrala prin intermediul telecomenzii sau de pe interfata web. Telefonul va putea trimite SMS utilizatorului in cazul in care apare o eroare in sistem sau este necesara notificarea acestuia cu privire la diversi parametri. Vom folosi 4 senzori analogici pentru a nu creste costul exagerat de mult, ale caror valori le vom citi folosind convertorul analog digital din PIC16F876A, nefiind nevoie de o frecventa mare de esantionare, asadar procesorul fiind foarte putin ocupat. In functie de valoarea unui senzor sau media tuturor celor 4 senzori vom lua o decizie daca este necesara pornirea sau oprirea centralei. Sistemul va fi capabil sa controleze automat incalzirea apartamentului, dar vom lasa si posibilitatea utilizatorului de a porni/opri centrala daca doreste. Vom implementa doua metode de control, una va fi accesibila prin interfata grafica a paginii web pe care acesta o va accesa, cea de-a doua varianta va prin intermediul unei telecomenzi. In acest scop vom utiliza o telecomanda si un receptor infrarosu pentru decodarea pachetului trimis de aceasta. Ne propunem sa implementam functii de pornire/oprire a centralei, precum si modificarea temperaturii la care aceasta sa functioneze. Functia de oprire/pornire o vom simula prin aprinderea unui led, iar pentru modificarea temperaturii vom folosi un motor stepper cu ajutorul carui vom putea regla potentiometrul analogic de pe centrala termica. Schema bloc a modulului:
Rolul meu in cest proiect a fost de a interfata cei 4 senzori de temperatura LM35. Tinand cont ca acest tip de sonzor returneaza un semnal analogic, m-am folosit de modulul ADC de pe placa de dezvoltare SBC876 pentru a converti semnalul si pentru a transmite mai departe temperatura rezultata din citirea senzorilor catre modulul central de comandare a sistemului. Senzorul de temperatura LM35 poate masura temperaturi cuprinse intre -40C si [Link] calibrat in scara Celsius, prezentand o precizie buna : +/- 0.5 grade la 25 grade C temperatura ambianta, iar valorile de iesire au crestere liniara. Cresterea in tensiune relativ la temperatura este de 10mV/*C. ADC(Analog to Digital Convertor)- converteste voltajul primit de la senzori intr-o valoare numerica care poate fi procesata de catre un sistem digital din MCU. Rezolutia ADC-ului este de 10 biti; voltajul masurat fiind intre 0 si 5 V, ADC-ul il va diviza in 1024 bucati: 5:1024=4.8mV.
Sarcina mea a fost de a interfata motorul stepper cu restul circuitului. Motorul stepper folosit a fost conectat la SBC cu ajutorul portului C. Rolul motorului stepper a fost de a simula reglajul centralei termice in functie de datele pe care le primea ( fie de la telecomanda, fie de pe interfata web sau de pe terminal ). Pasul motorului a fost setat la 30 de grade, avand astfel 9 pasi de deplasare ( intre 0 si 270 grade ). Tinand cont ca motorul stepper contine 4 bobine care trebuie actionate pe rand, deplasarea acului care indica gradele s-a facut dupa urmatorul tabel:
Bobina # 1 2 3 4
Pintilie Paul - Layer hardware + protocol comunicatie seriala Sarcina mea a fost de a pune la dispozitia echipei o placa pe care sa putem dezvolta softul necesar. Schema cablajului a fost realizata in Altium Designer, s-a bazat in mare parte pe schematicul SBC876, pe portul A am conectat 4 senzori de temperatura, portul B a fost rezervat display-ului LCD, exceptie facand pinul RB7 destinat receptorului infrarosu, iar pe portul C s-a realizat comanda motorului stepper. Chiar daca am intampinat mici probleme la mai toate modulele, acestea au fost rezolvate si intr-un final proiectul a putut fi realizat folosind procesorul propus si resursele mentionate mai sus.
Pe placa am inclus si driverul pentru motorul stepper, un circuit MAX232 pentru comunicatia seriala precum si stabilizatorul de tensiune necesar alimentarii placii. In ceea ce priveste comunicatia seriala, am incercat sa implementez un protocol cat mai simplu, pentru a putea fi usor de operat cu el, usor de interfatat cu layerul software realizat in C# precum si rapid in ceea ce priveste transferul de date (pachete mici). Practic, pachetul nostru era format din doar un octet. In momentul in care se dorea citirea senzorului 1 de temperatura, programul realizat in C# trimitea pe seriala caracterul 1, iar procesorul il interpreta ca o comanda si ii raspundea cu temperatura preluata prin modulul A/D pe canalul 0 (aferent primului senzor). Similar se proceda si cu caracterele 2,3 si 4, corespunzatoare celorlalti senzori de temperatura. Procesul a fost automatizat astfel incat programul din C# (sau interfata web,dupa caz) citea temperatura senzorilor la fiecare secunda, astfel ca utilizatorul avea afisat in timp real temperatura citita. In momentul in care utilizatorul trimitea caracterul 5, trimiteam comanda motorului stepper sa se miste in sensul acelor de ceasornic cu 30 de grade (4 pasi a cate 7.5 grade), iar la caracterul 6 motorul se misca in sens invers acelor de ceasornic cu 30 de grade. Aceste 30 de grade erau echivalentul unei unitati pe scala aferenta potentiometrului de pe centrala termica. In momentul citirii caracterului 7, se trimitea utilizatorului nivelul la care este setata centrala in acel moment (valoare stocata in EEPROM-ul intern din PIC). Toate aceste informatii erau afisate in acelasi timp si pe display-ul LCD folosit. Comunicatia seriala a fost realizata la o viteza de 19200kbps, intreg protocolul a fost gandit sa lucreze pe intreruperi (atat la receive cat si la transmit) astfel ca procesorul sa nu fie ocupat sa verifice bufferele de transmisie si receptie seriala la intervale regulate. Desi au fost intampinate mici probleme, acestea au fost rezolvate, iar sistemul functioneaza cum ne-am fi asteptat. Demo: [Link]
Echipa 19: Student: Cogianu Daniel Rezumat: Realizarea unui kit de levitatie magnetica si sistem de control al acestuia. Voi construi un kit asemanator cu cel de la url-ul [Link] Resurse: - regulator de voltaj - Bobina - senzor (hall) - kit de dezvoltare cu processor cortex m3 - magneti permanenti - obiect de levitate (o moneda) Resurse timp: 40 ore Kit de levitatie magnetica va montine o moneda intr-o pozitie fixa. Acest kit proiectat de Guy
Marsden nu va prezenta un grad mare de dificultate la, partea provocatoare va fi partea software.
Exista o varietate de solutii alternative pe partea hardware , unele au mai multe bobine, altele folosesc drept obiect de levitatie un magnet permanent dar consider ca solutia de mai sus este cea mai simpla si cea mai ieftina. [Link] /slovak_control_conference_2010/ pdf/46_H ypiusova_Osusky.pdf [Link] [Link] [Link]
Resurse: Microcontroler Atmega 32 Bobina 2x Convertor logic (5 to 3.3v) LM 3940 Modul bluetooth btm 112 Senzor optic LTH 209 01 Mofset irf3205 Transitor npn bc107b Microcontrolerul este controlat de un calculator prin intermediul unui modul bluetooth. Comunicarea se realiseaza prin portul usart. Sensorul optic este legat la ADC. In functie de valorea citita de ADC microcontrolerul decide daca sa alimenteza sau nu bobina. Programul implementeaza urmatorul algoritm:
Calculate the change in output using the derivative of the PID algorithm, then add to the previous output. 7. ErrLastLast=ErrLast 8. ErrLast=Err 9. ELSE 10. InputLast=Input While loop in manual, stay ready for bumpless switch to Auto. 11. ErrLastLast=Err 12. ErrLast=Err 13. ENDIF 14. IF OutP > 100 THEN OutP=100 Limit output to between 15. IF OutP < 0 THEN OutP=0 0 and 100 percent
Detalii despre implementare: (Hardware) Mi-am construit singur un electromagnet dar performantele acestuia s-au dovedit slabe, asa ca am comandat un electromagnet industrial. Electromagnetul industrial functioneaza la 12V cu intesitatea de 300mA, pe cand cel construit de mine pentru a avea aceleasi performante ca trebuie alimentat la 30V si are nevoie de mai mult de 2A. Sensorul optic este un integrat format dintr-o dioda electrolumiscenta si un fototranzistor. Princiul este simplu: ledul emite lumina catre obiectul pe care doresc sa il levitez, lumina se reflecta iar fototransistorul receptioneaza. Acesta este legat la ADC. Initial am vrut sa folosesc un senzor hall. Pe obiectul pe care voiam sa il levitez ar fi trebuit sa lipesc un magnet permanet foarte puternic (din neodimium), al carui camp electomagnetic sa fie mai puternic decat cel al electomagnetului. Motivul pt care am ales un sensor optic este ca as fi vrut ca sa comand sidistanta la care sa leviteze obiectul, pe cand un sensor hall nu poate decat sa detecteze prezenta sau apsenta unui obiect. Pentru comandarea electromagnetului am folosit un transitor mosfet. In functie de datele citite de ADC este comandat transistor. Initial am vrut sa folosesc 2 tranzistori obisnuiti, unul mai mic fiind comandat de placa, iar celalalt mai mare comandat de tranzistorul mai mic. Am optat pentru varianta mofset deoarece nu am folosit niciodata acest tip de tranzistor. Scheletul kitului este facut din niste componete mecanice vechi. Placa de dezvoltare folosita contina un processor Atmega 32. Dispozitivul este comandat printr-un modul bluetooth BTM 112. Functia acestuia este simpla si anume sa porneasca sau sa opreasca dispozitivul, prin comenzi primate prin USART . Interfatarea dintre modulul Bluetooth si placa a fost destul de problematica deoarece acestea lucreaza la nivele logice diferite 3V3 respectiv 5V. Pentru trecerea de la 5V la 3V3 am folosit un circuit LM3940, iar pt trecerea de la 3V3 la 5V am folosit un tranzistor obisnuit (In baza am pus intrarea [3V3], colectorul l-am alimentat la 5V, emitorul la masa). Initial am vrut sa fac trecerea de la 5V la 3V3 printr-un divizor de tensiune. Dispozitivul are nevoie de 2 surse, una de 12V pentru electromagnet si una de 5V pentru placa. Cea de 12V este asigurata de un incarcator vechi, iar cea de 5V este luata de la modulul usb. Dispozitivul are mai multe leduri care rol de martor, ele indicad daca trece curent sau nu prin firul respective. Am folosit o placa devoltare (bradboard) pentru a lega piesele impreuna. (Software) Princial codul ar trebui sa fie foarte simple: distance=x;
read adc; if(calcDist(adc)<distance) releaseObject; else atractObject; Dar cu acest cod obiect de levitate intra in rezonata, motiv pt care este nevoie de un algoritm PID (despre care am invatat la TS) [Link] /slovak_control_conference_2010/ p df/46_Hypiusova_Osusky.pdf Am urmat pasii algoritmului PID si am folosit datele din link dar performatele nu s-au imbunatatit simititor. Nu am mai avut timp sa fac mai multe verificari.
Intrebari: