Sunteți pe pagina 1din 16

UNIVERSITATEA TEFAN CEL MARE SUCEAVA

FACULTATEA DE INGINERIE ELECTRIC I TIINA


CALCULATOARELOR

PROIECT
MICROCONTROLERE
DETECTAREA DISTANEI
FOLOSIND UN SENZOR DE
PROXIMITATE ANALOGIC CU
AJUTORUL PLCII STM32F4
DISCOVERY

Profesor ndrumtor: Student:


s.l. dr. ing. Gitan Cristina Nicoleta Iacob Diana Ioana
An universitar: 2016-2017
CUPRINS

REZUMATUL PROIECTULUI ................................................................................................ 1


1.ARM CORTEX M4 ................................................................................................................ 2
2.STM32F4 DISCOVERY ........................................................................................................ 3
3.MEDIUL DE DEZVOLTARE KEIL UVISION 5 ................................................................. 5
4.CODUL FOLOSIT ................................................................................................................. 7
5.CONCLUZII ......................................................................................................................... 10
6.BIBLIOGRAFIE ................................................................................................................... 11
Anexa 1 .................................................................................................................................... 12

Tabel de figuri
Figura 1 Structura nucleului Cortex-ului M4............................................................................. 2
Figura 2 Plcuta STM32F4 Discovery ...................................................................................... 4
Figura 3 Diagrama block a structurii hardware a plcii STM32F4 Discovery .......................... 4
Figura 4 Structura nucleului MDK ............................................................................................ 5
Figura 5 Structura pachetului software ...................................................................................... 5
Figura 6 Componente software pentru o aplicaie tipic ........................................................... 5
Figura 7 Structura funciilor din biblioteca run time I/O ........................................................... 6
Figura 8 Alegerea device-ului folosit ........................................................................................ 7
Figura 9 Setarea frecvenei microcontroler-ului ........................................................................ 7
Figura 10 Declararea led-urilor folosite ..................................................................................... 8
Figura 11 Conversia timpului(s) n distan(cm) ..................................................................... 8
Figura 12 Iniializarea unor funcii ............................................................................................ 9
Figura 13 Codul folosit pentru aprinderea consecutiv a led-urilor........................................................ 9
REZUMATUL PROIECTULUI

Proiectul pe care am ales s l realizez are ca scop detectarea distanei folosind un senzor
de proximitate.

n acest sens am folosit un senzor ultrasonic de tip HC-SR04 iar determinarea distanei
propriu-zise se poate face prin aprinderea unor led-uri de pe placa STM32F4
Discovery,conectarea unui mini lcd sau prin declararea unor pini pentru led-uri externe i
comandarea aprinderii lor ntr-un anumit fel.

Astfel,am declarat 10 pini asociai fiecare pentru cele 10 led-uri i am realizat un cod
care de la distana de 0 cm pn la 50 cm,cu pas de 5 cm, va aprinde led-urile consecutiv,odat
cu atingerea pragului de 50 cm sau mai mare, irul de led-uri va fi n totalitate aprins.

1
1.ARM CORTEX M4

ARM Cortex M4 face parte din familia de cortex-uri M care prezint un consum redus
fa de alte procesoare pe 32 de bii.Acestea sunt uor de utilizat(este folosit limbajul C) i
ofer faciliti de depanare, caracterizeazndu-se prin: portabilitate, reutilizabilitate i
scalabilitate.

Seria de Cortex-uri M4 este construit pe baza arhitecturii ARMv7-M la fel ca i cele


din seria Cortex M3,acestea din urm derivnd din aceeai baz de date.
Cortex M4 conine toate caracteristicile procesorului M3,precum:

set de instruciuni mult mai puternic fa de cele din seria M0 i M0+(Thumb 1


i Thumb 2) iar acesta este executat de ctre nucleu;
gestiune eficient a ntreruperilor;
faciliti pentru gestiunea puterii;
SWD(Serial Debug Wire), breakpoints(puncte de ntrerupere a instruciunii),
watchpoints(puncte de supraveghere), trasarea instruciunilor;
eficien energetic uor mai mic faa de Cortex-urile anterioare.
n plus fa de Cortex M3,M4 prezint opional, unitate n virgul flotant simpl
precizie i instruciuni DSP extinse.

Figura 1 Structura nucleului Cortex-ului M4 (Nicoleta, 2016)

2
2.STM32F4 DISCOVERY

Placa STM32F4 Discovery face parte din primul grup de microcontrolere STM32 F4
bazate pe nucleul ARM Cortex M4F, acestea ncepnd s fie produse odat cu anul 2011.

Cteva caracteristici noi ale acestor plci faa de variantele anterioare sunt: DSP(Digital
Signal Processing) i instruciuni de tip floating point.
Aceste plci sunt compatibile din punct de vedere a pinilor cu plcile din seria F2 i
prezint n plus o vitez mai mare de ceas, 64 KB CCM RAM static, IS full duplex, ceas
mbuntit n timp real i ADC(Analog to Digital Convertor) mai rapid.
Microcontrolerele din seria STM32F4 prezint:

nucleul ARM Cortex M4F la o vitez de ceas maxim de 84/168 la 180 MHz;
memorie RAM static format din pn la 192 KB de uz general, memorie de 64 KB
CCM, 4 KB battery-baked, 80 bii battery-baked cu detecie de tergere;
Flash format din 512/1024/2048 KB de uz general, 30 KB system boot, 512 bii OTP(o
singur data programabili);
fiecare chip are un dispozitiv cu numr unic de identificare de 96 bii.

STM32F4 Discovery este un kit de dezvoltare accesibil ca pre i uor de utilizat,ce are
ncorporate urmtoarele:

Microcontroler-ul STM32F407VGT6 care ofer 32 de bii ARM Cortex M4 cu


miez FPU, 1 Megabit memorie Flash, 192 Kbyte RAM n pachetul LQFP100;
ST-LINK/V2 pe STM32F4Discovery sau ST-LINK/V2-A pe STM32F407G-
DISC1;
ARM mbed activ doar cu ST-LINK/V2-A;
USB ST-LINK cu capacitate de re-enumerare i trei interfee diferite: portul
COM virtual(doar cu ST-LINK/V2-A), stocare n mas(doar cu ST-LINK/V2-
A), port debug;
Alimentarea plcii: prin intermediul magistralei USB i sursele de alimentare
externe(3 V i 5 V);
Accelerometru LIS302DL or LIS3DSH ST MEMS pe 3 axe;
Microfon digital omni-direcional cu audio senzor MP45DT02 ST MEMS;
CS43L22 audio DAC;
8 LED-uri: LD1(rou/verde) pentru comunicaii USB, LD2(rou) pentru
alimentarea de 3.3 V, pentru utilizarea de ctre utilizatori, LD3(portocaliu),
LD4(verde), LD5(rou), LD6(albastru), 2 LED-uri USB OTG, LD7(verde)
VBUS i LD8(rou) supra-curent;
2 push-buttons pentru user i reset;
USB OTG FS cu micro AB conector;

3
Figura 2 Plcuta STM32F4 Discovery (www.wikipedia.org, 2016)

STM32F4DISCOVERY este proiectat n jurul microcontroler-ului


STM32F407VGT6 ntr-un pachet de 100 pini LQFP.Configuraia hardware a
plcii(conexiunile microcontroler-ului cu perifericele sale) arat astfel:

Figura 3 Diagrama block a structurii hardware a plcii STM32F4 Discovery

4
3.MEDIUL DE DEZVOLTARE KEIL UVISION 5

Pentru realizarea acestui proiect am folosit ca mediul de programare Keil uVision 5,care
reprezint ultima versiune dezvoltat din gama larg de dispozitive cu microcotrolere bazate
pe ARM Cortex-M.

Keil MDK Versiunea 5 include Debugger-ul uVision, C/C++ Compiler ARM i


componentele eseniale middleware, mai precis toate componentele de care avem nevoie pentru
a crea, construi i depana o aplicaie de tip embedded pentru dispozitive cu microcontrolere
bazate pe procesorul Cortex M.
Pachetul de instalare includ pachete software care pot fi adugate oricnd nucleului
MDK.

Figura 4 Structura nucleului MDK (ARM, 1997-2015)


Pachetul software conine suport pentru dispozitiv, biblioteci CMSIS, middleware,
suport pentru plac, coduri templates i exemple de proiecte.

Figura 5 Structura pachetului software (ARM, 1997-2015)

Figura 6 Componente software pentru o aplicaie tipic (ARM, 1997-2015)

5
Compilatorul este componenta software care ne permite sa redirecionm funcii I/O
din biblioteca standard C run-time.Acesta utilizeaz n mod frecvent funcii standard de
biblioteca I/O,cum ar fi printf(),scanf() pentru a efectua operaiuni de intrare/ieire.
Strcutura acestor funcii este urmtoarea:

Figura 7 Structura funciilor din biblioteca run time I/O (ARM, 1997-2015)
Funciile high level and low level nu sunt dependente din punct de vedere a destinaiei
i folosesc funciile I/O ale sistemului pentru interfaarea cu hardware-ul.

6
4.CODUL FOLOSIT

n Keil uVision5 am utilizat un cod care are ca scop detectarea distanei cu ajutorul unui
sensor ultrasonic HC-SR04 i am comandat aprinderea a 10 led-uri din 5 n 5 cm,ca odat cu
atingerea sau depirea distanei de 50 cm, irul de led-uri va fi complet aprins.
Am ales microcontrolerul STM32F407VG:

Figura 8 Alegerea device-ului folosit


Am setat frecvena microontroler-ului la 8 Mhz:

Figura 9 Setarea frecvenei microcontroler-ului


Iar pentru depanare am folosit ULINK2/ME Cortex Debugger cu frecvena ceasului de
1 Mhz.

7
Pentru toate cele 10 led-uri am folosit pini neutilizai de pe portul D.Declararea pinilor
pentu led-urile folosite am fcut-o n fiierul tm_stm32f4_disco.h,una din librriile senzorului:

Figura 10 Declararea led-urilor folosite


Distana la int se calculeaz pe baza intervalului de timp ntre emiterea semnalului de
nalt frecven,la intervale regulate de ctre senzor(Trig) i recepionarea ecoului odat cu
ntlnirea unui obastacol(Echo):

Figura 11 Conversia timpului(s) n distan(cm)


nainte de aprinderea propriu-zis a led-urilor ,se iniializeaz sistemul,funciile delay
i led-urile, se aprind led-urile 1 i 2 de pe shield iar apoi se iniializeaz i senzorul(prin
verificare dac pini sunt conectai cum trebuie):

8
Figura 12 Iniializarea unor funcii
Dac toate iniializrile sunt corecte,se trece mai departe la citirea distanei.
Codul folosit pentru aprinderea ledurilor ntr-o anumit ordine arat astfel:

Figura 13 Codul folosit pentru aprinderea consecutiv a led-urilor


Odat cu schimbarea ordinii led-urilor pe shield pentru a putea avea trasee optime am
procedat la schimarea ordinea led-urilor n cod pentru ca aprinderea lor s fie consecutiv.
Sunt apelate dou funcii: LedOn i LedOff pentru aprinderea i stingerea led-urilor.
n anexa 1 am plasat ntreg codul pentru fiierul main.h.
Codul a fost testat pe un shield proiectat special pentru plcua STM32F4 Discovery.

9
5.CONCLUZII

n urma realizrii acestui proiect am devenit familiar cu limbajul Embedded C: am


nvat cum s interfaez un senzor cu microcontrolerul STM32F407VG i cum s controlez
aprinderea unor led-uri n funcie de o anumit distan.

Consider c tema pe care mi-am ales-o poate sta la baza dezvoltrii unor proiecte de
talie mai mare,precum construirea unor sisteme de tipul Smart Home, care se bazeaz pe
conceptul Internet of Things i au posibilitatea de a mbunti calitatea vieii.

10
6.BIBLIOGRAFIE

[1] (2016, 12 31). www.wikipedia.org: https://en.wikipedia.org/wiki/STM32


[2] ARM. (1997-2015). www2.keil.com: http://www2.keil.com/docs/default-source/default-
document-library/mdk5-getting-started.pdf?sfvrsn=2[NC,L]
[3] Nicoleta, G. C. (2016). Microcontrolere. Suceava.
[4] ARM CORTEX M,https://en.wikipedia.org/wiki/ARM_Cortex-M.
[5]. http://stm32f4-discovery.net/2014/08/library-30-measure-distance-hc-sr04-stm32f4xx/.

11
Anexa 1

//Includem modulul core


#include "stm32f4xx.h"
//Includem librariile aici
#include "defines.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_hcsr04.h"
#include <stdio.h>
int main(void) {
// HCSR04 Instance
TM_HCSR04_t HCSR04;
// Initializarea sistemului
SystemInit();
// Initializarea functiilor delay
TM_DELAY_Init();
// Initializarea LED-urilor pe placa
TM_DISCO_LedInit();
// Aprindem ledurile 1 si 2
TM_DISCO_LedOn(LED_1 | LED_2);
// Initializarea senzorului de distanta; ECHO: PD0, TRIGGER: PC1

if (!TM_HCSR04_Init(&HCSR04, GPIOD, GPIO_PIN_0, GPIOC,


GPIO_PIN_1)) {
// Sensor-ul nu e gata
while (1) {
TM_DISCO_LedToggle(LED_3 | LED_4);
Delayms(100);
}
}

12
while (1) {
// Citeste distanta de la senzor
// Distanta e returnata in cm si stocata in structura
TM_HCSR04_Read(&HCSR04);
// Ceva nu e in neregula:poate pini incorecti
if (HCSR04.Distance < 0) {
TM_DISCO_LedOff(LED_1 | LED_2 | LED_3 | LED_4 |
LED_5 | LED_6 | LED_7 | LED_8 | LED_9 | LED_10);
} else if(HCSR04.Distance <= 5 )
{ TM_DISCO_LedOn(LED_1);

TM_DISCO_LedOff(LED_2 | LED_3 | LED_4 | LED_5 |


LED_6 | LED_7 | LED_8 | LED_9 | LED_10);
} else if(HCSR04.Distance <= 10)
{ TM_DISCO_LedOn(LED_1 | LED_2);

TM_DISCO_LedOff(LED_3 | LED_4 | LED_5 | LED_6 | LED_7 | LED_8 |


LED_9 | LED_10);
}else if(HCSR04.Distance <= 15)
{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9);

TM_DISCO_LedOff(LED_4 | LED_5 | LED_6 | LED_7 | LED_8 | LED_3 |


LED_10);
}else if(HCSR04.Distance <= 20)
{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9 | LED_7);
TM_DISCO_LedOff(LED_5 | LED_6 | LED_4 | LED_8 | LED_3 | LED_10);
} else if(HCSR04.Distance <= 25)
{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9 | LED_7 | LED_5);
TM_DISCO_LedOff(LED_6 | LED_4 | LED_8 | LED_3 | LED_10);
}else if(HCSR04.Distance <= 30)
{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9 | LED_7 | LED_5 | LED_3);
TM_DISCO_LedOff(LED_4 | LED_8 | LED_6 | LED_10);
}else if(HCSR04.Distance <= 35)
{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9 | LED_7 | LED_5 | LED_3 | LED_10);
13
TM_DISCO_LedOff(LED_8 | LED_6 | LED_4);
}else if(HCSR04.Distance <= 40)

{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_9 | LED_7 | LED_5 | LED_3 | LED_10


| LED_8);
TM_DISCO_LedOff(LED_6 | LED_4);
}else if(HCSR04.Distance <= 45)

{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_3 | LED_10 | LED_5 | LED_6 | LED_7


| LED_8 | LED_9);
TM_DISCO_LedOff(LED_4);
}else if(HCSR04.Distance <= 50)

{ TM_DISCO_LedOn(LED_1 | LED_2 | LED_3 | LED_4 | LED_5 | LED_6 | LED_7 |


LED_8 | LED_9 | LED_10);
}else if (HCSR04.Distance <= 50 || HCSR04.Distance > 50 ) {

TM_DISCO_LedOn(LED_1 | LED_2 | LED_3 | LED_4 |


LED_5 | LED_6 | LED_7 | LED_8 | LED_9 | LED_10);
}
// Alocam timp senzorului
Delayms(100);
}
}

14